Replacing SiteSensor Plugin (Vera) with MSR
-
@cw-kid said in Replacing SiteSensor Plugin (Vera) with MSR:
no data is being returned / stored
Sheesh. I'll admit I'm a little on edge this morning because we had a major storm roll through last night with some nasty lightning (and a tornado very close to us) and it apparently killed my daily-use laptop (cheap, old, no big loss, just a distraction to recover but they were almost two-for-a-dollar on sleezeBay), so forgive me, but...
There have been no fewer than 10 posts since the above quoted post, and despite my admonition in bold text yesterday in this very thread, not one mention of what may lie in
reactor.log
. -
-
Notice the
[
that starts the displayed value... it's an array. The{
that follows tells you there's an object as the first element of the array. So you need to pluck the first element out of the array, then dereference through it to the key you want, likecovidstats[0].critical
. -
Notice the
[
that starts the displayed value... it's an array. The{
that follows tells you there's an object as the first element of the array. So you need to pluck the first element out of the array, then dereference through it to the key you want, likecovidstats[0].critical
.@toggledbits said in Replacing SiteSensor Plugin (Vera) with MSR:
covidstats[0].critical
That works thanks, my global expressions are now being populated with data.
I just added covidstats[0]. to all of them in the rule.
-
Notice the
[
that starts the displayed value... it's an array. The{
that follows tells you there's an object as the first element of the array. So you need to pluck the first element out of the array, then dereference through it to the key you want, likecovidstats[0].critical
.How about this data for Carbon from the National Grid ?
I want to pick out "forecast" and "index" data.
(object) {"data":[{"regionid":3,"dnoregion":"NPG North East","shortname":"North East England","postcode":"YO1","data":[{"from":"2021-03-27T13:00Z","to":"2021-03-27T13:30Z","intensity":{"forecast":34,"index":"very low"},"generationmix":[{"fuel":"biomass","perc":24.6},{"fuel":"coal","perc":0},{"fuel":"imports","perc":2.2},{"fuel":"gas","perc":0.2},{"fuel":"nuclear","perc":35.4},{"fuel":"other","perc":0},{"fuel":"hydro","perc":4.5},{"fuel":"solar","perc":6.3},{"fuel":"wind","perc":26.9}]}]}]}
Thanks
-
You can take not-terribly-human-readable blobs like that over to a JSON Pretty Print website (such as https://jsonformatter.org/json-pretty-print), paste it in and hit the "Outline" button, to see how the data looks in its underlying structure.
This allows you to quickly pinpoint the blob.key.subkey.data item you need to pull from in MSR.
Traversing the tree from upper-left to lower-right, I see the first instance of "forcecast" lives inside an overall object
{}
(I'm namingresponse
), then the first item (i.e. element0
) of an array[]
withindata
, then inside another array within another key calleddata
, then a key calledintensity
, and finally the key you want,forecast
, yielding:
response.data[0].data[0].intensity.forecast
-
Remember that openLuup’s Test Lua window, gives you the pretty() function to do the same...
local x = luup.devices[2] print(pretty(x))
Gives:
{ category_num = 0, description = " openLuup", device_num_parent = 0, device_type = "openLuup", embedded = false, hidden = false, id = "", invisible = false, ip = "", mac = "", pass = "", room_num = 0, subcategory_num = 0, udn = "uuid:0058c0cb-c730-209a-50ab-6c88b470a8fd", user = "" }
-
You can take not-terribly-human-readable blobs like that over to a JSON Pretty Print website (such as https://jsonformatter.org/json-pretty-print), paste it in and hit the "Outline" button, to see how the data looks in its underlying structure.
This allows you to quickly pinpoint the blob.key.subkey.data item you need to pull from in MSR.
Traversing the tree from upper-left to lower-right, I see the first instance of "forcecast" lives inside an overall object
{}
(I'm namingresponse
), then the first item (i.e. element0
) of an array[]
withindata
, then inside another array within another key calleddata
, then a key calledintensity
, and finally the key you want,forecast
, yielding:
response.data[0].data[0].intensity.forecast
They don't make it easy to work all this out do they.
"cointensity" is the name of my expression within the rule that first stores all the data pulled down from the HTTP request etc.
So for my in-line substitution I have tried this, which doesn't work.
${{ cointensity.response.data(0).data(0).intensity.forecast }}
I also tried:
${{ cointensity.data(0).data(0).intensity.forecast }}
and a few other variations as well.
I want to pass the "forecast" data to a Global Expression called "currentcarbonintensity"
-
(Also, I prefer to simply create another variable and set its value to
cointensity.data[0].data[0].intensity.forecast
and then reference THAT variable in my${{ }}
substitution. Why? Because this gives MSR a chance to tell me exactly where my expression is going wrong.)If you follow this scheme in your workflow, you can entirely avoid having to use
[Set Variable]
so often, since the dependent variables will all "set themselves" immediately.For example, a change to
response
will automatically update the values in any variable(s) defined byresponse.stuff
orresponse.stuff.still.more.stuff
(caveat: as long as those variables appear belowresponse
in your list of Expressions!). -
I misled you a bit. MSR uses lexpjs, which references array elements in square brackets
[]
not the parentheses I first wrote (I'll edit my response, above).Go with
cointensity.data[0].data[0].intensity.forecast
-
Think I need a Vera plugin Dev.
I've tried to create a modified GenericIO device with four variables but its not working.
My MSR rule is sending out the data to each variable in Vera OK
But I can't seem to get that data to display on the front of the device in the web GUI.
Also for the Home Remote dashboard app, I'd need the generic sensor device and its data fully exposing to the SDATA stream. As Home Remote uses that for integration in to Vera etc.
So close, but I don't think I'm going to be able to properly create these types of devices in Vera myself.
EDIT:
Got it working now, I was using the wrong ServiceID in my MSR rule to set the variables.
Now I just need to figure out how to get this data in to the Vera SDATA output stream for Home Remote to see.
This is all I am seeing in SDATA currently:
{ "name": "Covid-19 Stats", "altid": "", "id": 703, "category": 0, "subcategory": -1, "room": 8, "parent": 0, "configured": "0", "light": "4325315" },
"light" is showing "4325315" which is the Confirmed number of Covid Cases, so that's a start, I need the other variables exposing to the SDATA stream some how.
EDIT2: I've added more <stateVariable> sections in to the S_GenericSensor2.xml file and now I can see all four variables data in the SDATA output stream, so I should now be able to add this device in to Home Remote and see all the data.
{ "name": "Covid-19 Stats", "altid": "", "id": 703, "category": 0, "subcategory": -1, "room": 8, "parent": 0, "variable2": "3768434", "variable3": "630", "variable4": "126515", "variable1": "4325315", "configured": "0" }
EDIT3: I now have a tile on a dashboard page in the Home Remote app.
So as a proof of concept this works.
Just need an easier way to create these virtual devices in Vera.
Someone on the Vera forum suggested taking a look at the MultiString plugin.
-
Just testing some different online API's see what's possible.
If your in the UK the National Grid have a Carbon Intensity online API here. This is for my region / area.
The data also breaks down by percent the types of generation used, Wind, Solar, Nuclear, Coal etc but not added that as yet.
Vera:
Home Remote:
Need to play about with the tiles and add an icon and reposition some items yet.
-
I've tried the Vera Multi-String plugin, it looks just like the type of plugin I was needing and looking for.
You can have up to five variables on a device.
You can then have your rule in MSR send the data to each variable etc.
The Multi-String plugin devices data is also outputted in the Vera SDATA stream so these device will also work with the Home Remote dashboard app.
{ "name": "Covid-19 Stats", "altid": "", "id": 133, "category": 0, "subcategory": -1, "room": 0, "parent": 0, "variablename1": "Confirmed", "variable1": "4329180", "variablename2": "Recovered", "variable2": "3787312", "variablename3": "Critical", "variable3": "615", "variablename4": "Deaths", "variable4": "126573", "variablename5": "", "variable5": "", "options": "", "configured": "0" },
So I recommend using the Multi-String plugin rather than trying to create your own modified Generic IO devices as I was doing.
-
@cw-kid if one wanted to set all 5 parameter values at the same time, using an HTTP call to Vera, could that be done? (If so, I'd need to see a working example of a GET Request that does this.) Or would I have to issue 5 distinct calls to set those variables?
P.S. I see from this old post that I'm not the first one to wonder.
-
@cw-kid if one wanted to set all 5 parameter values at the same time, using an HTTP call to Vera, could that be done? (If so, I'd need to see a working example of a GET Request that does this.) Or would I have to issue 5 distinct calls to set those variables?
P.S. I see from this old post that I'm not the first one to wonder.