Plotting graphs with plot.ly service with luup scene using REST API
-
I have been searching for the easiest graphing solution to see how sensor data behaves and I think I have found it - at least it looks promising.
After creating plot.ly account create API key in https://plot.ly/settings/api
Then create scene with following luup that makes the REST API request to upload new the value into the plot.
So the example here is that I record time series one data point at a time and trigger the scene with 5 minute interval schedule,Replace <username>, <APIKey>, <nameForGraph> and <graphTitle> below with your (hard coded) values and the datavelue is of course the sensor data that you want to plot (I plot humidity).
LUUP CODE:
local datavalue = luup.variable_get("urn:micasaverde-com:serviceId:HumiditySensor1", "CurrentLevel", 83) local http = require("socket.http") http.TIMEOUT = 5 local ts = os.date("%Y-%m-%d %X") result, status = http.request("https://plot.ly/clientresp",'un=<username>&key=<APIKey>&origin=plot&platform=lisp&args=[{"x":["'..ts..'"],"y":['..datavalue..']}]&kwargs={"filename":"<nameForGraph>","fileopt":"extend","style":{"type":"scatter"},"traces":[0],"layout":{"title":"<graphTitle>"},"world_readable":false}') -
I have been searching for the easiest graphing solution to see how sensor data behaves and I think I have found it - at least it looks promising.
After creating plot.ly account create API key in https://plot.ly/settings/api
Then create scene with following luup that makes the REST API request to upload new the value into the plot.
So the example here is that I record time series one data point at a time and trigger the scene with 5 minute interval schedule,Replace <username>, <APIKey>, <nameForGraph> and <graphTitle> below with your (hard coded) values and the datavelue is of course the sensor data that you want to plot (I plot humidity).
LUUP CODE:
local datavalue = luup.variable_get("urn:micasaverde-com:serviceId:HumiditySensor1", "CurrentLevel", 83) local http = require("socket.http") http.TIMEOUT = 5 local ts = os.date("%Y-%m-%d %X") result, status = http.request("https://plot.ly/clientresp",'un=<username>&key=<APIKey>&origin=plot&platform=lisp&args=[{"x":["'..ts..'"],"y":['..datavalue..']}]&kwargs={"filename":"<nameForGraph>","fileopt":"extend","style":{"type":"scatter"},"traces":[0],"layout":{"title":"<graphTitle>"},"world_readable":false}') -
Excellent, thanks! This is much needed.
For some reason, can't get this to work...LUA error.
I'm trying to send MySensors data to Plotly...
Anyway, does e.g. <username> mean that you write username, or <username> to the script? (Oh yeah, username referring to the actual username :-) ) -
Excellent, thanks! This is much needed.
For some reason, can't get this to work...LUA error.
I'm trying to send MySensors data to Plotly...
Anyway, does e.g. <username> mean that you write username, or <username> to the script? (Oh yeah, username referring to the actual username :-) )@Nuubi
Yes, the username and API key are shown on the plot.ly api settings page.Here is my code that works for 5 lines in one graph and appends data every 5 minutes:
-- Get variables local BRHum = luup.variable_get("urn:micasaverde-com:serviceId:HumiditySensor1", "CurrentLevel", 83) local BRTemp = luup.variable_get("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", 84) local ACBoost = 100 * luup.variable_get("urn:upnp-org:serviceId:SwitchPower1", "Status", 106) local ACMech = 100 * luup.variable_get("urn:upnp-org:serviceId:SwitchPower1", "Status", 107) local ACEff = luup.variable_get("urn:upnp-org:serviceId:Dimming1", "LoadLevelStatus", 88 ) local ts = os.date("%Y-%m-%d %X") -- Send to plot local http = require("socket.http") http.TIMEOUT = 5 result, status = http.request("https://plot.ly/clientresp",'un=<username>&key= <APIKey>&origin=plot&platform=lisp&args=[{"x":["'..ts..'"],"y":['..BRHum..'],"name":"Humidity"},{"x":["'..ts..'"],"y": ['..ACBoost..'],"name":"AC Boost"},{"x":["'..ts..'"],"y":['..BRTemp..'],"name":"Temperature"},{"x":["'..ts..'"],"y":['..ACMech..'],"name":"Mech Sensor"},{"x":["'..ts..'"],"y":['..ACEff..'],"name":"AC Efficiency"}]&kwargs={"filename":"BathroomHumidity","fileopt":"extend","style":{"type":"scatter"},"traces":[0,1,2,3,4],"layout":{"title":"Bathroom Humidity"},"world_readable":false}')
I know the JSON syntax is cryptic in one line without pretty formatting..
-
You should use username and not <username>. The same goes for the API key.
In UI5 you can test your Lua in Vera from APPS -> Develop Apps -> Test Luup code
Here is a few more examples of variable_get:
local InAirHum = luup.variable_get("urn:micasaverde-com:serviceId:HumiditySensor1", "CurrentLevel", 347)
local OutTemp = luup.variable_get("urn:upnp-org:serviceId:TemperatureSensor1","CurrentTemperature", 229)
local InAirTemp = luup.variable_get("urn:upnp-org:serviceId:TemperatureSensor1","CurrentTemperature", 346)
local InAirQ = luup.variable_get("urn:upnp-org:serviceId:VContainer1", "Variable1", 348) -
I'm having trouble with one variable to. I would like to have the status of a qubino switch in the same graph.
I tried this:
local VentOn = 100 luup.variable_get("urn:upnp-org:serviceId:BinaryLight1", "Status", 356)It gives me the value 100 in the graph. Please let me know what this 100 in front of the luup.variable_get does. If I remove it the Luup code fails.
-
I'm having trouble with one variable to. I would like to have the status of a qubino switch in the same graph.
I tried this:
local VentOn = 100 luup.variable_get("urn:upnp-org:serviceId:BinaryLight1", "Status", 356)It gives me the value 100 in the graph. Please let me know what this 100 in front of the luup.variable_get does. If I remove it the Luup code fails.
@korttoma said:
I'm having trouble with one variable to. I would like to have the status of a qubino switch in the same graph.
I tried this:
local VentOn = 100 luup.variable_get("urn:upnp-org:serviceId:BinaryLight1", "Status", 356)It gives me the value 100 in the graph. Please let me know what this 100 in front of the luup.variable_get does. If I remove it the Luup code fails.
Actually there should be asterisk character between 100 and the luup.variable_get and the (forum editor does not show that) since the returned value 1 or 0 is scaled to 100 so try:
local VentOn = 100 * luup.variable_get("urn:upnp-org:serviceId:BinaryLight1", "Status", 356)Then you get 100 if binary light is on. Remove the 100 if you like it to be 1 or 0.
-
Uh...oh...still.. do you need to initialize the graph or what? Still not getting this to work, sorry for being such a dummie :-E
-
@korttoma said:
I'm having trouble with one variable to. I would like to have the status of a qubino switch in the same graph.
I tried this:
local VentOn = 100 luup.variable_get("urn:upnp-org:serviceId:BinaryLight1", "Status", 356)It gives me the value 100 in the graph. Please let me know what this 100 in front of the luup.variable_get does. If I remove it the Luup code fails.
Actually there should be asterisk character between 100 and the luup.variable_get and the (forum editor does not show that) since the returned value 1 or 0 is scaled to 100 so try:
local VentOn = 100 * luup.variable_get("urn:upnp-org:serviceId:BinaryLight1", "Status", 356)Then you get 100 if binary light is on. Remove the 100 if you like it to be 1 or 0.
@samppa said:
Actually there should be asterisk character between 100 and the luup.variable_get and the (forum editor does not show that) since the returned value 1 or 0 is scaled to 100 so try:
local VentOn = 100 * luup.variable_get("urn:upnp-org:serviceId:BinaryLight1", "Status", 356)
Then you get 100 if binary light is on. Remove the 100 if you like it to be 1 or 0.I thought it was a multiplier of some kind. Anyhow the code fails allso if I add the asterisk so I thik it has a problem with:
luup.variable_get("urn:upnp-org:serviceId:BinaryLight1", "Status", 356)Any suggestions what I should try instead? Tried also this but no luck:
luup.variable_get("urn:micasaverde-com:serviceId:BinaryLight1", "Status", 356) -
Had a chat with @BulldogLowell and he taught me that you can hover the mouse on a variable to check the complete variable name so it turned out I had to use the following:
luup.variable_get("urn:micasaverde-com:serviceId:SwitchPower1", "Status", 356) -
@Nuubi said:
Uh...oh...still.. do you need to initialize the graph or what? Still not getting this to work, sorry for being such a dummie :-E
You just send the data and the graph named with "filename":"xxxx" gets created if not yet existing.
-
@samppa Yep, works now, thanks!
The problem turned out to be the actual value I wanted to send. Need to figure out how to read MySensors based values in LUA...have you tried luup.inet.wget( )
local brightness = luup.variable_get("urn:upnp-org:serviceId:Dimming1", "LoadLevelStatus", 118) luup.inet.wget("192.168.1.50//?brightLevel="..brightness.."&", 1) -
Anyone figured out a way to add another variable to an old graph without deleting the file from plot.ly? Seems like it does not include the new variable unless you delete and create a new file.
@korttoma said:
Anyone figured out a way to add another variable to an old graph without deleting the file from plot.ly? Seems like it does not include the new variable unless you delete and create a new file.
I have noticed the same thing; If you want to add a trace you need to delete the file..
So perhaps it is wise to be prepared and add a few extra traces for some future use. -
@korttoma said:
Anyone figured out a way to add another variable to an old graph without deleting the file from plot.ly? Seems like it does not include the new variable unless you delete and create a new file.
I have noticed the same thing; If you want to add a trace you need to delete the file..
So perhaps it is wise to be prepared and add a few extra traces for some future use.@samppa said:
perhaps it is wise to be prepared and add a few extra traces for some future use.
Good suggestion for a workaround but it does not seem to pick up name changes for the trace either. Tried also to edit one of the plots on the website but when I wanted to save I could not save the changes to the file used by "Vera". I had to save the file with a different name so no editing seems to be possible.
-
Since the nightly heal at 2 in the morning no data is transferred to plot.ly any more :( anyone else see this and know how to solv it?
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login