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

Code : Tout sélectionner

"Data" : "20.0",
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 :D

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&param=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&param=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&param=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()