Page 1 of 1
Extract value from http response
Posted: Friday 28 February 2020 23:19
by Neuvidor2307
Dear all,
In order to follow my internet access, I want to get somes values from my internet box "SFR NB6" API and store these data into Domoticz.
The API request is :
Code: Select all
http://192.168.1.1/api/1.0/?method=dsl.getInfo
The API answer is :
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<rsp stat="ok" version="1.0">
<dsl status="up" linemode="ADSL2+" uptime="137177" counter="1" crc="0" noise_down="6.4" noise_up="9.2" attenuation_down="22.0" attenuation_up="12.0" rate_down="23619" rate_up="1023" line_status="No Defect" training="Showtime" />
</rsp>
The data I want to extract :
-
rate_down
-
rate_up
-
attenuation_down
-
attenuation_up
-
noise_down
-
noise_up
-
crc
-
Counter
Could you please help me to write a dzVents script ?
My expectation is to use something similar as my below script used for Json data :
Code: Select all
local idxCloudCover = 112 -- (Integer) Device ID of device holding cloudcoverage
local idxBarometer = 113 -- (Integer) Device ID of device barometric presusure
local idxPrecipIntensity = 131 -- (Integer) Device ID of device barometric presusure
local ApiKey = '79947d33c8097e153533ce959hsjeldi' -- (string) API key for Darksky
local GPSCoordinates = '47.454062,8.846521' -- (string) City GPS coordinates (lat, long)
local Debug = true
return {
on = {
timer = { 'every 4 minutes' },
httpResponses = { 'result' }
},
execute = function(domoticz, item)
if (item.isTimer) then
domoticz.openURL({
--url = "https://api.openweathermap.org/data/2.5/weather?id=".. CityID .."&appid=" .. ApiKey,
url = "https://api.darksky.net/forecast/" .. ApiKey .. "/" .. GPSCoordinates,
method = 'GET',
callback = 'result'
})
elseif (item.isJSON) then
if (item.ok) then -- statusCode == 2xx
-- Read Pressure
--local pressure = item.json.main.pressure
local pressure = item.json.currently.pressure
domoticz.devices(idxBarometer).updateBarometer(domoticz.utils.round(pressure,0))
-- Read Clouds
--local CloudCover = item.json.clouds.all
local CloudCover = item.json.currently.cloudCover
CloudCover = CloudCover * 100
domoticz.devices(idxCloudCover).updatePercentage(domoticz.utils.round(CloudCover,0))
-- Read precipIntensity
local PrecipIntensity = item.json.currently.precipIntensity
PrecipIntensity = PrecipIntensity*100
domoticz.devices(idxPrecipIntensity).updateRain(domoticz.utils.round(PrecipIntensity,0))
--Debug
if (Debug == true) then
domoticz.log("pressure=" .. pressure .. "hPa")
domoticz.log("CloudCover=" .. CloudCover .. "%")
domoticz.log("precipIntensity=" .. PrecipIntensity .. "mm/h * 100")
end
end
end
end
}
Thanks in advance to all of you.
Re: Extract value from http response
Posted: Saturday 29 February 2020 9:05
by waaren
Neuvidor2307 wrote: ↑Friday 28 February 2020 23:19
In order to follow my internet access, I want to get somes values from my internet box "SFR NB6" API and store these data into Domoticz.
You could try this one
Code: Select all
local scriptVar = 'getDSLInfo'
return
{
on =
{
devices =
{
'xmlTrigger' , -- just for test
},
timer =
{
'every 4 minutes',
},
httpResponses =
{
scriptVar,
},
},
logging =
{
level = domoticz.LOG_DEBUG,
marker = scriptVar,
},
execute = function(dz, item)
if item.isTimer or item.isDevice then
dz.openURL(
{
url = "http://192.168.1.1/api/1.0/?method=dsl.getInfo",
method = 'GET',
callback = scriptVar,
})
elseif item.ok then -- statusCode == 2xx
-- convert xml to Table
local rt = dz.utils.fromXML(xml).rsp
local dsl = rt.dsl._attr
-- get one value
dz.log('line-status: ' .. dsl.line_status,dz.LOG_DEBUG)
-- get all values
for key, value in pairs(dsl) do
dz.log(key .. ': '.. value,dz.LOG_DEBUG)
end
else
dz.log('problem retrieving data from modem',dz.LOG_ERROR)
dz.log(item.data,dz.LOG_ERROR) ]]--
end
end
}
Re: Extract value from http response
Posted: Sunday 01 March 2020 0:40
by Neuvidor2307
Thanks for your help.
I tried your script proposal but unfortunately it seems not working, nevertheless I'm progressing.
Indeed, I can log the complete answer of my HTTP request as a string but I can't get each value independantly even is domoticz seems recognize the answer as XML. If I'm trying to filter some value with the xml functions, I'm getting some table but they seems to be empty.
Please help me
My current script :
Code: Select all
return {
on = {
timer = {
'every minute' -- just an example to trigger the request
},
httpResponses = {
'trigger' -- must match with the callback passed to the openURL command
}
},
execute = function(domoticz, item)
if (item.isTimer) then
domoticz.openURL({
url = 'http://192.168.1.1/api/1.0/?method=dsl.getInfo',
method = 'GET',
callback = 'trigger', -- see httpResponses above.
})
end
if (item.isHTTPResponse) then
if (item.statusCode == 200) then
if (item.isXML) then
domoticz.log('The answer is XML')
domoticz.log("HTTP answer1=" .. tostring(item))
domoticz.log("HTTP answer2=" .. tostring(item.data))
local DATA1 = domoticz.utils.fromXML(item.data)
local DATA2 = domoticz.utils.fromXML(item.data).rsp
local DATA3 = domoticz.utils.fromXML(item.data).rsp.dsl
local DATA4 = item.xml.rsp
local DATA5 = item.xml.rsp.dsl
domoticz.log("DATA1=" .. tostring(DATA1))
domoticz.log("DATA2=" .. tostring(DATA2))
domoticz.log("DATA3=" .. tostring(DATA3))
domoticz.log("DATA4=" .. tostring(DATA4))
domoticz.log("DATA5=" .. tostring(DATA5))
domoticz.log("DATA1b=" .. tostring(DATA1.data))
domoticz.log("DATA2b=" .. tostring(DATA2.data))
domoticz.log("DATA3b=" .. tostring(DATA3.data))
domoticz.log("DATA4b=" .. tostring(DATA4.data))
domoticz.log("DATA5b=" .. tostring(DATA5.data))
else
domoticz.log('THE ANSWER IS NOT JSON')
end
else
domoticz.log('ERROR')
end
end
end
}
The corresponding log :
Code: Select all
2020-03-01 00:30:00.233 Status: dzVents: Info: ------ Start internal script: Lecture HTTP:, trigger: every minute
2020-03-01 00:30:00.233 Status: dzVents: Info: ------ Finished Lecture HTTP
2020-03-01 00:30:00.234 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua
2020-03-01 00:30:00.352 Status: dzVents: Info: Handling httpResponse-events for: "trigger"
2020-03-01 00:30:00.352 Status: dzVents: Info: ------ Start internal script: Lecture HTTP: HTTPResponse: "trigger"
2020-03-01 00:30:00.356 Status: dzVents: Info: The answer is XML
2020-03-01 00:30:00.356 Status: dzVents: Info: HTTP answer1=table: 0x6ec2cc10
2020-03-01 00:30:00.356 Status: dzVents: Info: HTTP answer2=<?xml version="1.0" encoding="UTF-8"?>
2020-03-01 00:30:00.356 <rsp stat="ok" version="1.0">
2020-03-01 00:30:00.356 <dsl status="up" linemode="ADSL2+" uptime="139817" counter="1" crc="0" noise_down="6.4" noise_up="9.3" attenuation_down="22.0" attenuation_up="12.0" rate_down="23619" rate_up="1023" line_status="No Defect" training="Showtime" />
2020-03-01 00:30:00.356
2020-03-01 00:30:00.356
2020-03-01 00:30:00.356 </rsp>
2020-03-01 00:30:00.356
2020-03-01 00:30:00.359 Status: dzVents: Info: DATA1=table: 0x6ec0bf18
2020-03-01 00:30:00.359 Status: dzVents: Info: DATA2=table: 0x6ec15210
2020-03-01 00:30:00.359 Status: dzVents: Info: DATA3=table: 0x6ec158a8
2020-03-01 00:30:00.359 Status: dzVents: Info: DATA4=table: 0x6ec15210
2020-03-01 00:30:00.359 Status: dzVents: Info: DATA5=table: 0x6ec158a8
2020-03-01 00:30:00.359 Status: dzVents: Info: DATA1b=nil
2020-03-01 00:30:00.359 Status: dzVents: Info: DATA2b=nil
2020-03-01 00:30:00.359 Status: dzVents: Info: DATA3b=nil
2020-03-01 00:30:00.359 Status: dzVents: Info: DATA4b=nil
2020-03-01 00:30:00.359 Status: dzVents: Info: DATA5b=nil
2020-03-01 00:30:00.359 Status: dzVents: Info: ------ Finished Lecture HTTP
Re: Extract value from http response
Posted: Sunday 01 March 2020 1:23
by waaren
Neuvidor2307 wrote: ↑Sunday 01 March 2020 0:40
I tried your script proposal but unfortunately it seems not working, nevertheless I'm progressing.
I tested my script with the exact string you gave in your initial post and it worked without a problem.
Can you please try the script I posted and show your loglines ?
Re: Extract value from http response
Posted: Sunday 01 March 2020 9:31
by Neuvidor2307
Dear waaren,
Of course I can do it and I really appreciate your help.
Below your script with few modifications :
- I have deleted the both "]]" line 51 because the script was not accepted
- I have replace the timer "every 4 minutes" by "every minute"
Below the script I'm using :
Code: Select all
local scriptVar = 'getDSLInfo'
return
{
on =
{
devices =
{
'xmlTrigger' , -- just for test
},
timer =
{
'every minute',
},
httpResponses =
{
scriptVar,
},
},
logging =
{
level = domoticz.LOG_DEBUG,
marker = scriptVar,
},
execute = function(dz, item)
if item.isTimer or item.isDevice then
dz.openURL(
{
url = "http://192.168.1.1/api/1.0/?method=dsl.getInfo",
method = 'GET',
callback = scriptVar,
})
elseif item.ok then -- statusCode == 2xx
-- convert xml to Table
local rt = dz.utils.fromXML(xml).rsp
local dsl = rt.dsl._attr
-- get one value
dz.log('line-status: ' .. dsl.line_status,dz.LOG_DEBUG)
-- get all values
for key, value in pairs(dsl) do
dz.log(key .. ': '.. value,dz.LOG_DEBUG)
end
else
dz.log('problem retrieving data from modem',dz.LOG_ERROR)
dz.log(item.data,dz.LOG_ERROR) --
end
end
}
Below the log :
Code: Select all
2020-03-01 09:30:00.347 Status: dzVents: Info: getDSLInfo: ------ Start internal script: Lecture HTTP:, trigger: every minute
2020-03-01 09:30:00.347 Status: dzVents: Debug: getDSLInfo: OpenURL: url = http://192.168.1.1/api/1.0/?method=dsl.getInfo
2020-03-01 09:30:00.347 Status: dzVents: Debug: getDSLInfo: OpenURL: method = GET
2020-03-01 09:30:00.347 Status: dzVents: Debug: getDSLInfo: OpenURL: post data = nil
2020-03-01 09:30:00.347 Status: dzVents: Debug: getDSLInfo: OpenURL: headers = nil
2020-03-01 09:30:00.347 Status: dzVents: Debug: getDSLInfo: OpenURL: callback = getDSLInfo
2020-03-01 09:30:00.347 Status: dzVents: Info: getDSLInfo: ------ Finished Lecture HTTP
2020-03-01 09:30:00.348 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua
2020-03-01 09:30:00.492 Status: dzVents: Info: Handling httpResponse-events for: "getDSLInfo"
2020-03-01 09:30:00.492 Status: dzVents: Info: getDSLInfo: ------ Start internal script: Lecture HTTP: HTTPResponse: "getDSLInfo"
2020-03-01 09:30:00.496 Status: dzVents: Info: getDSLInfo: ------ Finished Lecture HTTP
2020-03-01 09:30:00.496 Error: dzVents: Error: (2.5.7) getDSLInfo: An error occurred when calling event handler Lecture HTTP
2020-03-01 09:30:00.496 Error: dzVents: Error: (2.5.7) getDSLInfo: ...oticz/scripts/dzVents/generated_scripts/Lecture HTTP.lua:39: attempt to index a nil value
Re: Extract value from http response
Posted: Sunday 01 March 2020 22:20
by waaren
Neuvidor2307 wrote: ↑Sunday 01 March 2020 9:31
some bugs in the script...
Can you try this one ?
Code: Select all
local scriptVar = 'getDSLInfo'
return
{
on =
{
devices =
{
'xmlTrigger' , -- just for test
},
timer =
{
'every minute',
},
httpResponses =
{
scriptVar,
},
},
logging =
{
level = domoticz.LOG_DEBUG,
marker = scriptVar,
},
execute = function(dz, item)
if item.isTimer or item.isDevice then
dz.openURL(
{
url = "http://192.168.1.1/api/1.0/?method=dsl.getInfo",
method = 'GET',
callback = scriptVar,
})
elseif item.ok then -- statusCode == 2xx
-- convert xml to Table
local rt = dz.utils.fromXML(item.data)
dz.utils.dumpTable(rt)
local dsl = rt.rsp.dsl._attr
-- get one value
dz.log('line-status: ' .. dsl.line_status,dz.LOG_DEBUG)
-- get all values
for key, value in pairs(dsl) do
dz.log(key .. ': '.. value,dz.LOG_DEBUG)
end
else
dz.log('problem retrieving data from modem',dz.LOG_ERROR)
dz.log(item.data,dz.LOG_ERROR) --
end
end
}
Re: Extract value from http response
Posted: Sunday 01 March 2020 23:28
by Neuvidor2307
Dear Waaren,
Thanks a lot for your new script, it seems working well !!!
I need now to try to update a customize sensor with values. I will try to do it this week.
Running code :
Code: Select all
local scriptVar = 'getDSLInfo'
return
{
on =
{
devices =
{
'xmlTrigger' , -- just for test
},
timer =
{
'every minute',
},
httpResponses =
{
scriptVar,
},
},
logging =
{
level = domoticz.LOG_DEBUG,
marker = scriptVar,
},
execute = function(dz, item)
if item.isTimer or item.isDevice then
dz.openURL(
{
url = "http://192.168.1.1/api/1.0/?method=dsl.getInfo",
method = 'GET',
callback = scriptVar,
})
elseif item.ok then -- statusCode == 2xx
-- convert xml to Table
local rt = dz.utils.fromXML(item.data)
dz.utils.dumpTable(rt)
local dsl = rt.rsp.dsl._attr
-- get one value
dz.log('line-status: ' .. dsl.line_status,dz.LOG_DEBUG)
-- get all values
for key, value in pairs(dsl) do
dz.log(key .. ': '.. value,dz.LOG_DEBUG)
end
else
dz.log('problem retrieving data from modem',dz.LOG_ERROR)
dz.log(item.data,dz.LOG_ERROR) --
end
end
}
log :
Code: Select all
2020-03-01 23:25:00.143 Status: dzVents: Info: getDSLInfo: ------ Start internal script: Lecture HTTP:, trigger: every minute
2020-03-01 23:25:00.143 Status: dzVents: Debug: getDSLInfo: OpenURL: url = http://192.168.1.1/api/1.0/?method=dsl.getInfo
2020-03-01 23:25:00.143 Status: dzVents: Debug: getDSLInfo: OpenURL: method = GET
2020-03-01 23:25:00.143 Status: dzVents: Debug: getDSLInfo: OpenURL: post data = nil
2020-03-01 23:25:00.143 Status: dzVents: Debug: getDSLInfo: OpenURL: headers = nil
2020-03-01 23:25:00.143 Status: dzVents: Debug: getDSLInfo: OpenURL: callback = getDSLInfo
2020-03-01 23:25:00.143 Status: dzVents: Info: getDSLInfo: ------ Finished Lecture HTTP
2020-03-01 23:25:00.144 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua
2020-03-01 23:25:00.262 Status: dzVents: Info: Handling httpResponse-events for: "getDSLInfo"
2020-03-01 23:25:00.263 Status: dzVents: Info: getDSLInfo: ------ Start internal script: Lecture HTTP: HTTPResponse: "getDSLInfo"
2020-03-01 23:25:00.268 Status: dzVents: > rsp:
2020-03-01 23:25:00.268 Status: dzVents: > 1:
2020-03-01 23:25:00.268 Status: dzVents: > dsl:
2020-03-01 23:25:00.268 Status: dzVents: > _attr:
2020-03-01 23:25:00.268 Status: dzVents: > training: Showtime
2020-03-01 23:25:00.268 Status: dzVents: > crc: 0
2020-03-01 23:25:00.268 Status: dzVents: > uptime: 222317
2020-03-01 23:25:00.268 Status: dzVents: > line_status: No Defect
2020-03-01 23:25:00.268 Status: dzVents: > counter: 1
2020-03-01 23:25:00.268 Status: dzVents: > rate_up: 1023
2020-03-01 23:25:00.268 Status: dzVents: > status: up
2020-03-01 23:25:00.268 Status: dzVents: > noise_up: 9.3
2020-03-01 23:25:00.268 Status: dzVents: > noise_down: 6.1
2020-03-01 23:25:00.268 Status: dzVents: > linemode: ADSL2+
2020-03-01 23:25:00.268 Status: dzVents: > attenuation_down: 22.0
2020-03-01 23:25:00.268 Status: dzVents: > rate_down: 23619
2020-03-01 23:25:00.268 Status: dzVents: > attenuation_up: 12.0
2020-03-01 23:25:00.268 Status: dzVents: > _attr:
2020-03-01 23:25:00.268 Status: dzVents: > version: 1.0
2020-03-01 23:25:00.268 Status: dzVents: > stat: ok
2020-03-01 23:25:00.268 Status: dzVents: > dsl:
2020-03-01 23:25:00.268 Status: dzVents: > _attr:
2020-03-01 23:25:00.268 Status: dzVents: > training: Showtime
2020-03-01 23:25:00.268 Status: dzVents: > crc: 0
2020-03-01 23:25:00.268 Status: dzVents: > uptime: 222317
2020-03-01 23:25:00.268 Status: dzVents: > line_status: No Defect
2020-03-01 23:25:00.268 Status: dzVents: > counter: 1
2020-03-01 23:25:00.268 Status: dzVents: > rate_up: 1023
2020-03-01 23:25:00.269 Status: dzVents: > status: up
2020-03-01 23:25:00.269 Status: dzVents: > noise_up: 9.3
2020-03-01 23:25:00.269 Status: dzVents: > noise_down: 6.1
2020-03-01 23:25:00.269 Status: dzVents: > linemode: ADSL2+
2020-03-01 23:25:00.269 Status: dzVents: > attenuation_down: 22.0
2020-03-01 23:25:00.269 Status: dzVents: > rate_down: 23619
2020-03-01 23:25:00.269 Status: dzVents: > attenuation_up: 12.0
2020-03-01 23:25:00.269 Status: dzVents: > _attr:
2020-03-01 23:25:00.269 Status: dzVents: > version: 1.0
2020-03-01 23:25:00.269 Status: dzVents: > stat: ok
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: line-status: No Defect
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: training: Showtime
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: crc: 0
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: uptime: 222317
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: line_status: No Defect
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: counter: 1
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: rate_up: 1023
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: status: up
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: noise_up: 9.3
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: noise_down: 6.1
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: linemode: ADSL2+
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: attenuation_down: 22.0
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: rate_down: 23619
2020-03-01 23:25:00.269 Status: dzVents: Debug: getDSLInfo: attenuation_up: 12.0
2020-03-01 23:25:00.269 Status: dzVents: Info: getDSLInfo: ------ Finished Lecture HTTP
Re: Extract value from http response [Solved]
Posted: Monday 02 March 2020 0:14
by Neuvidor2307
Finaly I did it this evening...

Thanks to Waaren for the support.
My code :
Code: Select all
local scriptVar = 'getDSLInfo'
local idxADSLdown = 31 -- (Integer) Device ID
local idxADSLup = 32 -- (Integer) Device ID
local idxADSLatt_down = 33 -- (Integer) Device ID
local idxADSLatt_up = 34 -- (Integer) Device ID
local idxADSLnoise_down = 35 -- (Integer) Device ID
local idxADSLnoise_up = 36 -- (Integer) Device ID
return
{
on =
{
devices =
{
'xmlTrigger' , -- just for test
},
timer =
{
'every minute',
},
httpResponses =
{
scriptVar,
},
},
--logging =
--{
-- level = domoticz.LOG_DEBUG,
-- marker = scriptVar,
--},
execute = function(dz, item)
if item.isTimer or item.isDevice then
dz.openURL(
{
url = "http://192.168.1.1/api/1.0/?method=dsl.getInfo",
method = 'GET',
callback = scriptVar,
})
elseif item.ok then -- statusCode == 2xx
-- convert xml to Table
local rt = dz.utils.fromXML(item.data)
--dz.utils.dumpTable(rt)
local dsl = rt.rsp.dsl._attr
-- get one value
--dz.log('line-status: ' .. dsl.line_status,dz.LOG_DEBUG)
dz.log("#############")
dz.log("Débit ADSL download => " .. dsl.rate_down .. " Kbps")
dz.log("Débit ADSL upload => " .. dsl.rate_up .. " Kbps")
dz.log("#############")
dz.devices(idxADSLdown).updateCustomSensor(dsl.rate_down)
dz.devices(idxADSLup).updateCustomSensor(dsl.rate_up)
dz.devices(idxADSLatt_down).updateSoundLevel(dsl.attenuation_down)
dz.devices(idxADSLatt_up).updateSoundLevel(dsl.attenuation_up)
dz.devices(idxADSLnoise_down).updateSoundLevel(dsl.noise_down)
dz.devices(idxADSLnoise_up).updateSoundLevel(dsl.noise_up)
-- get all values
--for key, value in pairs(dsl) do
-- dz.log(key .. ': '.. value,dz.LOG_DEBUG)
--end
else
dz.log('problem retrieving data from modem',dz.LOG_ERROR)
dz.log(item.data,dz.LOG_ERROR) --
end
end
}
The result :

- Visual.JPG (157.25 KiB) Viewed 4166 times
Re: Extract value from http response
Posted: Saturday 18 February 2023 19:59
by Piacco
I want to read the data off my ventilation unit, can someone help me with a dzvents script to read the dat from a webAPI.
The API request is :
Code: Select all
http://192.168.1.65/api.html?get=ithostatus
The API result is :
Code: Select all
{"requested-fanspeed_perc":-1,"balance_perc":99.7,"supply-fan_rpm":933,"supply-fan-actual_rpm":925,"exhaust-fan_rpm":936,"exhaust-fan-actual_rpm":933,"supply-temp_c":16.88,"exhaust-temp_c":21.16,"status":0,"room-temp_c":16.88,"outdoor-temp_c":21.16,"valve-position":0,"bypass-position":0,"summercounter":300,"summerday_kmin":1,"frost-timer":0,"boiler-timer":177,"frost-block":120,"current-position":0,"vkkswitch":0,"gheswitch":0,"airfilter-counter":1942,"global-fault-code":0,"actual-mode":24,"pir-fan-speed-level":-1,"highest-received-co2-value_ppm":726,"highest-received-rh-value_rh":58,"air-quality_perc":100,"remaining-override-timer_sec":0,"fallback-speed-timer_sec":0,"label-out-of-bound-error":0}
any ideas

Re: Extract value from http response
Posted: Saturday 18 February 2023 21:31
by willemd
Have a look here:
https://www.domoticz.com/wiki/DzVents:_ ... d_handling
That will give you the API result as a response, which then needs to be processed as a json. The json processing in my experience is a lot of trial and error and not very well documented. You can use domoticz.utils.dumpTable to see the structure and take it from there. Examples with json processing can be found in the forum.
Re: Extract value from http response
Posted: Saturday 18 February 2023 21:52
by willemd
or, probably easier, you can set up a http poller to get the data.
Have a look here
https://www.domoticz.com/wiki/HTTP/HTTPS_poller
Re: Extract value from http response
Posted: Saturday 18 February 2023 23:44
by Piacco
I tried the HTTP poller, but no luck.
Error
Code: Select all
2023-02-18 23:53:45.983 Error: CLuaHandler: /home/pi/domoticz/scripts/lua_parsers/itho.lua:4: attempt to index a number value
The device is updating, but the value is still 0, it should be 99.8
lua parser script:
Code: Select all
local idx = 1748
local value = domoticz_applyJsonPath(request['content'], '.balance_perc')
domoticz_updateDevice(idx, '' , value)
Result WebAPI:
Code: Select all
{"requested-fanspeed_perc":-1,"balance_perc":99.8,"supply-fan_rpm":1757,"supply-fan-actual_rpm":1750,"exhaust-fan_rpm":1761,"exhaust-fan-actual_rpm":1772,"supply-temp_c":17.99,"exhaust-temp_c":22.36,"status":0,"room-temp_c":17.99,"outdoor-temp_c":22.36,"valve-position":0,"bypass-position":0,"summercounter":300,"summerday_kmin":1,"frost-timer":0,"boiler-timer":177,"frost-block":120,"current-position":0,"vkkswitch":0,"gheswitch":0,"airfilter-counter":1951,"global-fault-code":0,"actual-mode":24,"pir-fan-speed-level":-1,"highest-received-co2-value_ppm":1082,"highest-received-rh-value_rh":56,"air-quality_perc":100,"remaining-override-timer_sec":0,"fallback-speed-timer_sec":0,"label-out-of-bound-error":0}
Re: Extract value from http response
Posted: Sunday 19 February 2023 10:32
by willemd
I can't see anything obviously wrong. What is the type of device that you are updating? Build in some debug print statements?
Re: Extract value from http response
Posted: Sunday 19 February 2023 21:31
by Piacco
I'am still stuck, when i try the variable ithostatus.balance_perc i get no error, and see the requested value in the domoticz log, but when i try another value by example the highest-received-co2-value_ppm varable i get an error.
Code: Select all
2023-02-19 21:26:06.115 Error: dzVents: Error: (3.1.8) getIthoStatus: ...oticz/scripts/dzVents/generated_scripts/1_IthoStatus.lua:41: attempt to perform arithmetic on a nil value (field 'highest')
Code: Select all
local scriptVar = 'getIthoStatus'
return
{
on =
{
devices =
{'Test' , -- just for test
},
timer =
{
'every minute',
},
httpResponses =
{
scriptVar,
},
},
logging =
{
level = domoticz.LOG_DEBUG,
marker = scriptVar,
},
execute = function(dz, item)
if item.isTimer or item.isDevice then
dz.openURL(
{
url = "http://192.168.1.65/api.html?get=ithostatus",
method = 'GET',
callback = scriptVar,
})
elseif (item.isHTTPResponse) and item.ok then -- statusCode == 2xx
local ithostatus = dz.utils.fromJSON(item.data)
dz.utils.dumpTable(ithostatus)
test1 = ithostatus.balance_perc -- this value is working
test2 = ithostatus.highest-received-co2-value_ppm -- on this value i get an error
local test = ithostatus.balance_perc
dz.log('Balans: ' .. test1,dz.LOG_DEBUG)
dz.log('Actuele Co2 waarde: ' .. test2,dz.LOG_DEBUG)
else
dz.log('problem retrieving data from modem',dz.LOG_ERROR)
dz.log(item.data,dz.LOG_ERROR) --
end
end
}
Re: Extract value from http response
Posted: Sunday 19 February 2023 23:18
by plugge
You declared test1 and test2 as globals. Anything could happen then.
Change it in:
Code: Select all
local test1 = ithostatus.balance_perc -- this value is working
local test2 = ithostatus.highest-received-co2-value_ppm -- on this value i get an error
And try again.
(And check if the dumped table contains your key:value pair.)
Re: Extract value from http response
Posted: Monday 20 February 2023 10:13
by Piacco
The issue is solved with help of topic
https://domoticz.com/forum/viewtopic.php?t=26021.
I have to declare the local co2 on this way, I'don't know exactly why, but it's working now
Code: Select all
local co2 = (ithostatus["highest-received-co2-value_ppm"])
Re: Extract value from http response
Posted: Monday 20 February 2023 10:53
by boum
Because `-` is not authorized in identifier names in lua (so neither in dzVents). The error comes from the parser reads the line as ithostatus.highest - received - ..., not as one table key. So you must use the other syntax for accessing table elements ithostatus["keyname"].