Page 1 sur 3

recupere valeur json et update device via jq

Publié : 11 juin 2018, 17:13
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

Re: recupere valeur json et update device via jq

Publié : 12 juin 2018, 11:00
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..

Re: recupere valeur json et update device via jq

Publié : 12 juin 2018, 16:48
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 ?

Re: recupere valeur json et update device via jq

Publié : 12 juin 2018, 18:25
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

Re: recupere valeur json et update device via jq

Publié : 12 juin 2018, 21:17
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 ...

Re: recupere valeur json et update device via jq

Publié : 14 juin 2018, 11:02
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

Re: recupere valeur json et update device via jq

Publié : 14 juin 2018, 13:13
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.

Re: recupere valeur json et update device via jq

Publié : 14 juin 2018, 13:19
par jackslayter
bien vu, je l'ai fait sur une base de script mais j'ai pas la même config
je modifie

Re: recupere valeur json et update device via jq

Publié : 15 juin 2018, 00:58
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 ?

Re: recupere valeur json et update device via jq

Publié : 15 juin 2018, 07:50
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