Page 1 of 2
Lua 3D array
Posted: Thursday 22 March 2018 17:04
by JustMitchie
Hello, i am trying to assing the value from my p1 meter, which is a json array
Code: Select all
ActTime 1521732455
AstrTwilightEnd "20:48"
AstrTwilightStart "04:37"
CivTwilightEnd "19:26"
CivTwilightStart "05:59"
DayLength "12:19"
NautTwilightEnd "20:06"
NautTwilightStart "05:19"
ServerTime "2018-03-22 16:27:35"
SunAtSouth "12:05"
Sunrise "06:33"
Sunset "18:52"
result
0
AddjMulti 1
AddjMulti2 1
AddjValue 0
AddjValue2 0
BatteryLevel 255
Counter "2323.313"
CounterToday "5.603 m3"
CustomImage 0
Data "2323.313"
Description ""
Favorite 1
HardwareID 9
HardwareName "Power usage"
HardwareType "P1 Smart Meter USB"
HardwareTypeVal 4
HaveTimeout false
ID "1"
LastUpdate "2018-03-22 16:25:45"
Name "Gas"
Notifications "false"
PlanID "0"
PlanIDs
0 0
Protected false
ShowNotifications true
SignalLevel "-"
SubType "Gas"
SwitchTypeVal 1
Timers "false"
Type "P1 Smart Meter"
TypeImg "counter"
Unit 2
Used 0
XOffset "0"
YOffset "0"
idx "20"
status "OK"
title "Devices"
In PHP i would use explode i think, but no clue how to do it in Lua. I want to assign the value of CounterToday to otherdevices[Gas}
Can someone point me in the right direction? Kind regards, Michel
Re: Lua 3D array
Posted: Thursday 22 March 2018 17:26
by freijn
not sure how the values are split?
Just by CR/LF ?
here are a lot of examples
http://lua-users.org/wiki/SplitJoin
Re: Lua 3D array
Posted: Thursday 22 March 2018 17:28
by JustMitchie
Ah ik zag dat je nederlands bent. Die P1 meter geeft dus een mooie array, maar ik wil dus alleen de currentvalue hebben met de GasMeter heet 'ie CounterToday, Als het een php array was zou je gaan zo van $data[result[0][CounterToday] die wil ik in een virtuele gasmeter stoppen. Bij de stroommeter is er nog eentje, de usage. Die is in php $data[result][0][usage]
Maar bij die stroommeter moeten er dus twee values in (sValue voor die tweede?) nogmaals, geen idee hoe lua werkt ;( thanks for the help
Re: Lua 3D array
Posted: Thursday 22 March 2018 18:22
by JustMitchie
print(' test gas')
commandArray = {}
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- For Linux
local config=assert(io.popen('curl "http://username:password:192.168.2.15:8080/json.htm?type=devices&rid=20"')) -- notice double quotes
local data = config:read('*all')
config:close()
local jsonValue = json:decode(data)
value = jsonValue.result.CounterToday
print(value)
return commandArray
This is what i tried in Lua, however i get a Error: EventSystem: in Gas_Update: [string "--..."]:27: attempt to call a nil value
in the log.
Re: Lua 3D array
Posted: Thursday 22 March 2018 18:40
by jvdz
Can you share the actual JSON data as the posted data in not in JSON format?
Jos
Re: Lua 3D array
Posted: Thursday 22 March 2018 19:14
by JustMitchie
http://forum:forum:ip:port/json.htm?type=devices&rid=19
Is the url, it has viewing rights on the utilities page. However, when i try it, it goes straight to google. I am probably looking at a typo here, but the ip is
84.81.105.118:8080 the pass is forum the user is forum and the idx is 19 for the power meter, 20 for the gas meter.
I hope that this is more convenient than uploading a imgurl....
Regards, michel
mag in het nederlands, engels maakt mij niet uit.

Re: Lua 3D array
Posted: Thursday 22 March 2018 19:38
by JustMitchie
https://imgur.com/a/C8h2F <- imgur link with screenshots made from the browser of the kwh meter.
it has both values. CounterToday and Usage.
regards, michel
Re: Lua 3D array
Posted: Thursday 22 March 2018 19:42
by jvdz
English is fine ...no worries.
This should work to decode:
Code: Select all
local jsonData = json:decode(Stringjson)
print(jsonData.result[1].CounterToday)
Jos
Re: Lua 3D array
Posted: Thursday 22 March 2018 20:02
by JustMitchie
jvdz wrote: ↑Thursday 22 March 2018 19:42
English is fine ...no worries.
This should work to decode:
Code: Select all
local jsonData = json:decode(Stringjson)
print(jsonData.result[1].CounterToday)
Jos
This now makes
Code: Select all
print(' test gas')
commandArray = {}
json = (loadfile "/home/michel/domoticz/scripts/lua/JSON.lua") -- For Linux
local config=assert(io.popen('curl "http://forum:forum:192.168.2.15:8080/json.htm?type=devices&rid=20"')) -- notice double quotes
local Stringjson = config:read('*all')
print(Stringjson)
config:close()
local jsonData = json:decode(Stringjson)
print(jsonData.result[1].CounterToday)
return commandArray
and results in
Code: Select all
2018-03-22 20:00:50.557 LUA: test gas
2018-03-22 20:00:50.780 LUA:
2018-03-22 20:00:50.780 Error: EventSystem: in Gas_Update: [string "--..."]:32: attempt to index global 'json' (a function value)
i am getting better at this.
Kind regards,
Michel
Re: Lua 3D array
Posted: Thursday 22 March 2018 20:13
by jvdz
Think the URL needs to be:
Code: Select all
local config=assert(io.popen('curl "http://forum:[email protected]:8080/json.htm?type=devices&rid=20"')) -- notice double quotes
it works for me with:
Code: Select all
local config=assert(io.popen('curl "http://forum:[email protected]:yyyy/json.htm?type=devices&rid=19"')) -- notice double quotes
Jos
Re: Lua 3D array
Posted: Thursday 22 March 2018 20:20
by JustMitchie
jvdz wrote: ↑Thursday 22 March 2018 20:13
Think the URL needs to be:
Code: Select all
local config=assert(io.popen('curl "http://forum:[email protected]:8080/json.htm?type=devices&rid=20"')) -- notice double quotes
it works for me with:
Code: Select all
local config=assert(io.popen('curl "http://forum:[email protected]:8080/json.htm?type=devices&rid=19"')) -- notice double quotes
Jos
Now its breaking at line 8 (i removed the top comments so the script is shorter)
Code: Select all
[string "print(' test gas')..."]:8: attempt to index local 'json' (a function value)
local jsonData = json:decode(Stringjson)
local json = (loadfile "/home/michel/domoticz/scripts/lua/JSON.lua") -- For Linux <-straight from domoticz lua example it there was without local in front of it
i thought i was getting it, im totally lost here....

Re: Lua 3D array
Posted: Thursday 22 March 2018 20:32
by jvdz
I don't know where you have stored the JSON.lua lib but this is what works for me:
Code: Select all
json = (loadfile "/usr/local/share/lua/5.2/JSON.lua") ()
local config=assert(io.popen('curl "http://xx:yy/json.htm?type=devices&rid=19"')) -- notice double quotes
local Stringjson = config:read('*all')
print(Stringjson)
config:close()
local jsonData = json:decode(Stringjson)
print(jsonData.result[1].CounterToday)
Jos
Re: Lua 3D array
Posted: Thursday 22 March 2018 21:36
by JustMitchie
jvdz wrote: ↑Thursday 22 March 2018 20:32
I don't know where you have stored the JSON.lua lib but this is what works for me:
Code: Select all
json = (loadfile "/usr/local/share/lua/5.2/JSON.lua") ()
local config=assert(io.popen('curl "http://forum:[email protected]:8080/json.htm?type=devices&rid=19"')) -- notice double quotes
local Stringjson = config:read('*all')
print(Stringjson)
config:close()
local jsonData = json:decode(Stringjson)
print(jsonData.result[1].CounterToday)
Jos
i dont know why, but changing the string to manually typing the same loadfile works.
now it hangs on
Code: Select all
print(jsonData.result[1].CounterToday)
Error: EventSystem: in Gas_Update: [string "print(' test gas')..."]:9: attempt to index local 'jsonData' (a nil value)
with this as value
so, now its back, to how get the specific value.
Code: Select all
print(' test gas')
commandArray = {}
json = (loadfile "/home/michel/domoticz/scripts/lua/JSON.lua") ()
local config=assert(io.popen('curl "http://forum:forum:192.168.2.15:8080/json.htm?type=devices&rid=20"')) -- notice double quotes
local Stringjson = config:read('*all')
print(Stringjson)
config:close()
local jsonData = json:decode(Stringjson)
print(jsonData)
print(jsonData.result[0].CounterToday)
return commandArray
printing the stringJson gives out a proper whitespace printed
and if i do print(jsonValue) it gets the same attempt to index nill value...
Re: Lua 3D array
Posted: Thursday 22 March 2018 21:44
by jvdz
You still have the wrong url in there. The : after userid:password needs to change to @
So it should look like:
Code: Select all
local config=assert(io.popen('curl "http://forum:forum@xx:yy/json.htm?type=devices&rid=20"')) -- notice double quotes
Jos
Re: Lua 3D array
Posted: Thursday 22 March 2018 21:47
by JustMitchie
DAT WAS HEM
explains the straight to google search when entering the url in the browser...
I tried a different way tho, i base64encoded the username and pass, voilla. It works

which is kinda the same right? thanks for the help Jos! <3
Re: Lua 3D array
Posted: Thursday 22 March 2018 21:52
by jvdz
It's always easy and simple when it makes sense.
Enjoy.
Jos
Re: Lua 3D array
Posted: Thursday 22 March 2018 22:05
by JustMitchie
jvdz wrote: ↑Thursday 22 March 2018 21:52
It's always easy and simple when it makes sense.
Enjoy.
Jos
Was het maar zo'n feest....
Code: Select all
commandArray['Gas'] = jsonData.result[1].CounterToday
does'nt set the Gas meter.... The event fires without errors tho, so i dont have a clue (again

) about whats going wrong this time..
Re: Lua 3D array
Posted: Thursday 22 March 2018 22:15
by jvdz
What about?:
Code: Select all
commandArray['UpdateDevice']=otherdevices_idx['gas']..'|0|'..jsonData.result[1].CounterToday
I think these devices need to SValue.
What I don't understand is why you call it gas while it is a kWh value for electricity. The other thing to consider is that you probably only want the value and not the kWh fed into the device.
Jos
Re: Lua 3D array
Posted: Thursday 22 March 2018 22:26
by jvdz
Check here for the proper format of Electricity devices with JSON but also explains how to code the UpdateDevice:
https://www.domoticz.com/wiki/Domoticz_ ... mart_meter
Re: Lua 3D array
Posted: Thursday 22 March 2018 22:31
by JustMitchie
jvdz wrote: ↑Thursday 22 March 2018 22:15
What about?:
Code: Select all
commandArray['UpdateDevice']=otherdevices_idx['gas']..'|0|'..jsonData.result[1].CounterToday
I think these devices need to SValue.
What I don't understand is why you call it gas while it is a kWh value for electricity. The other thing to consider is that you probably only want the value and not the kWh fed into the device.
Jos
I want to split the values, and i dont want to have to look at the usage of the previous homeowner
