Page 1 sur 1
[RESOLU] emploi de JSON
Publié : 21 nov. 2018, 16:08
par Cissou
Bonjour,
Je suis en train de refaire un script LUA de gestion de chauffage avec des elements que je reutilise en les renommant du coup ca ne passe plus avec le nom des sondes, alors j'ai voulu utiliser json en precisant l'idx de l'element, seulement voila j'utilise ca pour recuperer la consigne
Code : Tout sélectionner
local consigne = os.execute( "curl -s 'http://192.168.1.25:8080/json.htm?type=devices&rid=69' | jq .result[0].Data | sed 's/\"//g' | awk '{ print $1 }' ")
j'ai ensuite cette erreur dans le log
Code : Tout sélectionner
2018-11-21 15:56:00.367 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_ThermostatChJamie.lua: ...i/domoticz/scripts/lua/script_time_ThermostatChJamie.lua:24: attempt to perform arithmetic on local 'consigne' (a boolean value)
vu qu'a un moment je fais un temperature > consigne + hysteresis
si je regarde le json de l'idx 69 j'ai bien
20.0 ca ne peut pas etre un boolean, et si je lance la commande curl, j'ai bien 20.0 comme réponse......
Je m'arrache un peu les cheveux la depuis quelques heures, heureusement il m'en reste pas mal

Re: emploi de JSON
Publié : 21 nov. 2018, 16:36
par oredin
Bonjour,
os.execute renvoie le code de retour de la commande exécutée et non sa sortie standard. A priori, en retour, si la commande s'exécute bien, vous aurez donc plutôt '0' (zéro).
Regardez plutôt du côté de io.popen pour récupérer la valeur souhaitée.
Bon courage !
Re: emploi de JSON
Publié : 21 nov. 2018, 17:11
par Cissou
en utilisant io.popen je n'ai plus d'erreur, mais ca ne marche toujours pas
je vous mets ce que j'ai fait, j'ai pas l'impression d'avoir d'erreur mais bon
Code : Tout sélectionner
local consigne = io.popen( "curl -s 'http://192.168.1.25:8080/json.htm?type=devices&rid=69' | jq .result[0].Data | sed 's/\"//g' | awk '{ print $1 }' ")
local hysteresis1 = 1
local hysteresis2 = 0.1
local thermostat = io.popen( "curl -s 'http://192.168.1.25:8080/json.htm?type=devices&rid=741' | jq .result[0].Data | sed 's/\"//g' | awk '{ print $1 }' ")
local absent = 'Mode ABSENT'
local consigneabsent = tonumber(otherdevices_svalues['Consigne ABSENT'])
--------------------------------
commandArray = {}
local temperature = io.popen("curl -s 'http://192.168.1.25:8080/json.htm?type=devices&rid=711' | jq .result[0].Data | sed 's/\"//g' | awk '{ print $1 }'" )
if (otherdevices[absent]=='On') then
consigne = consigneabsent
end
--On n'agit que si le "Thermostat" est actif
if (thermostat=='On') then
print ('blob')
print('-- Gestion du thermostat pour la Ch Jamie --')
if (temperature < (consigne - hysteresis2) ) then
print('Allumage du chauffage dans la Ch Jamie')
os.execute('/usr/bin/curl -m 15 "http://192.168.1.25:8080/json.htm?type=command¶m=switchlight&idx=75&switchcmd=Off"')
elseif (temperature > (consigne + hysteresis1)) then
print('Extinction du chauffage dans la Ch Jamie')
os.execute('/usr/bin/curl -m 15 "http://192.168.1.25:8080/json.htm?type=command¶m=switchlight&idx=75&switchcmd=On"')
end
elseif (thermostat=='Off') then
print('-- Fin de la régulation de la Ch Jamie --')
os.execute('/usr/bin/curl -m 15 "http://192.168.1.25:8080/json.htm?type=command¶m=switchlight&idx=75&switchcmd=On"')
end
return commandArray
Les IDX et leurs correspondances
69 : setpoint qui est la consigne de temperature
75 : module chacon on/off CH54755
711: sonde de temperature oregon
741: interrupteur virtuel qui active le fonctionnement du chaufage avec thermostat
Re: emploi de JSON
Publié : 21 nov. 2018, 17:25
par oredin
L'utilisation de io.popen diffère un peu, cf. l'exemple ci-dessous.
Code : Tout sélectionner
local handle = io.popen(command)
local result = handle:read("*a")
handle:close()
La variable "result" devrait correspondre à ce que vous souhaitez récupérer dans votre variable "temperature".
Bon courage !
Re: emploi de JSON
Publié : 21 nov. 2018, 17:42
par Cissou
Merci beaucoup cela fonctionne maintenant
voici la solution :
Code : Tout sélectionner
local temp =io.popen("curl -s 'http://192.168.1.25:8080/json.htm?type=devices&rid=711' | jq .result[0].Data | sed 's/\"//g' | awk '{ print $1 }'" )
local temperature = tonumber(temp:read("*a"))
temp.close()