recupere valeur json et update device via jq

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
QcVictor
Messages : 79
Inscription : 17 janv. 2015, 14:52

recupere valeur json et update device via jq

Message par QcVictor »

Je tente de mettre a jour un virtual device via un url qui me génère un json qui ressemble a cela :

Code : Tout sélectionner

{"attributes": {"friendly_name": "HydroQuebec Period mean daily consumption", "icon": "mdi:flash", "unit_of_measurement": "kWh"}, "entity_id": "sensor.hydroquebec_period_mean_daily_consumption", "last_changed": "2018-06-11T09:24:30.261177+00:00", "last_updated": "2018-06-11T09:24:30.261177+00:00", "state": "89.3"}

La valeur que je veut attraper est 89.3 en suivant le tuto jq j'arrive bien a la récupéré la valeur

Code : Tout sélectionner

pi@DomoticzTest:~$ curl -s "http://10.0.0.14:8123/api/states/sensor.hydroquebec_period_mean_daily_consumption"| jq -r .state
89.3
Maintenant je patauge un peu entre utilisé http poller, un fichier bash/lua/python, bref comme vous l'aurez deviné suis pas top top dans les scripts, les exemples que je trouve sont souvent pour un on/off... bref any help :D
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Re: recupere valeur json et update device via jq

Message par landaisbenj »

En lua tu peux parser le json facilement.

Indiquer que tu veux récupérer la donnée en exécutant ton curl, et ensuite traiter la donnée via json..
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
QcVictor
Messages : 79
Inscription : 17 janv. 2015, 14:52

Re: recupere valeur json et update device via jq

Message par QcVictor »

landaisbenj a écrit :En lua tu peux parser le json facilement.

Indiquer que tu veux récupérer la donnée en exécutant ton curl, et ensuite traiter la donnée via json..

Code : Tout sélectionner

#!/bin/bash
 
result=$(curl -s "http://192.168.1.82:8080/json.htm?type=devices&rid=35"| jq -r .result[].Status)
 
 
echo $result
 
if [ $result = "Open" ]
    then
     curl 'http://192.168.1.82:8080/json.htm?type=command&param=switchlight&idx=112&switchcmd=On&level=0'
 
elif [ $result = "Closed" ]
    then 
          curl 'http://192.168.1.82:8080/json.htm?type=command&param=switchlight&idx=112&switchcmd=Off&level=0'
 
fi
En suivant cette exemple, quel est la syntaxe pour envoyer le résultat obtenu plutôt que le open/close ?
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Re: recupere valeur json et update device via jq

Message par landaisbenj »

QcVictor a écrit :
landaisbenj a écrit :En lua tu peux parser le json facilement.

Indiquer que tu veux récupérer la donnée en exécutant ton curl, et ensuite traiter la donnée via json..

Code : Tout sélectionner

#!/bin/bash
 
result=$(curl -s "http://192.168.1.82:8080/json.htm?type=devices&rid=35"| jq -r .result[].Status)
 
 
echo $result
 
if [ $result = "Open" ]
    then
     curl 'http://192.168.1.82:8080/json.htm?type=command&param=switchlight&idx=112&switchcmd=On&level=0'
 
elif [ $result = "Closed" ]
    then 
          curl 'http://192.168.1.82:8080/json.htm?type=command&param=switchlight&idx=112&switchcmd=Off&level=0'
 
fi
En suivant cette exemple, quel est la syntaxe pour envoyer le résultat obtenu plutôt que le open/close ?
Si tu recuperes ta valeur avec jq alors tu peux simplement modifier ton device avec cette valeur.
Si on reste sur le OPEN/CLOSE, il est contenu dans $result, qui se voit avec echo $result.
Du coup il suffit d'envoyer $result avec l'api JSON de domoticz.

Donc:
/json.htm?type=command&param=udevice&idx=IDX&nvalue=HUM&svalue=$result
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
QcVictor
Messages : 79
Inscription : 17 janv. 2015, 14:52

Re: recupere valeur json et update device via jq

Message par QcVictor »

Ok voila le script

Code : Tout sélectionner

#!/bin/bash
result=$(curl -s "http://10.0.0.14:8123/api/states/sensor.hydroquebec_period_mean_daily_consumption"| jq -r .state)
 
 
echo $result
if [ $result = "Open" ]
    then
     curl 'http://10.0.0.18:8080/json.htm?type=command&param=udevice&idx=101&nvalue=0&svalue=$result;$result'
fi
mon virtual device est un electric
lorsque je l’exécute ça passe sans erreur
mais cela n'update pas la valeur dans le device, mais ça s'explique parce qu'il s'attend a voir open et vue que c'est un chiffre ...
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: recupere valeur json et update device via jq

Message par jackslayter »

dans un script lua :

Code : Tout sélectionner

commandArray = {}
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()
local config=assert(io.popen('/usr/bin/curl -m 5 http://10.0.0.14:8123/api/states/sensor.hydroquebec_period_mean_daily_consumption'))
local blocjson = config:read('*all')
config:close()
-- print (blocjson)
local jsonValeur = json:decode(blocjson)
stateS = jsonValeur.state
print (stateS)

return commandArray
Dernière modification par jackslayter le 14 juin 2018, 13:20, modifié 1 fois.
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Re: recupere valeur json et update device via jq

Message par landaisbenj »

QcVictor a écrit :mais cela n'update pas la valeur dans le device, mais ça s'explique parce qu'il s'attend a voir open et vue que c'est un chiffre ...
Ton script indique que si le result = open alors envoyer la valeur de $result;$result.

Vu que result est une valeur numérique elle ne sera jamais égale a open... Voila pourquoi elle n'enverra jamais les données...
Cette partie la ne sert a rien:
QcVictor a écrit :if [ $result = "Open" ]
    then
fi
Et pourquoi tu met $result;$result ?
jackslayter a écrit :pour stateS = jsonValeur.state[] essai avec [0] ou [1] si ça ne marche pas ou sans les []
pour naviguer dans ton json tu fait jsonValeur.state[].xxx.xxx suivant si il a un sous paragraphe (tu peux te servir du print (blocjson))
Mettre des crochets c'est quand il s'agit de liste. Dans son exemple "state" n'est pas une liste mais un objet. Pour traiter l'objet tu n'as pas besoin de crochet.
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: recupere valeur json et update device via jq

Message par jackslayter »

bien vu, je l'ai fait sur une base de script mais j'ai pas la même config
je modifie
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
QcVictor
Messages : 79
Inscription : 17 janv. 2015, 14:52

Re: recupere valeur json et update device via jq

Message par QcVictor »

Code : Tout sélectionner

Error: EventSystem: in watt: [string "commandArray = {}..."]:8: attempt to index local 'jsonValeur' (a nil value)
Ça ne passe pas ! et comment fait ton après pour envoyer mettre a jour le virtual device ?
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: recupere valeur json et update device via jq

Message par jackslayter »

enlève les -- de la ligne -- print (blocjson)
si il y a rien ou une erreur regarde si tu as bien le fichier JSON.lua dans /home/pi/domoticz/scripts/lua/ sinon mets le bon chemin
sinon colle le résultat ici
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
Répondre