Ayant eu récemment besoin de parcourir un fichier JSON à la recherche de valeurs (parser un json, quoi!), j’ai mis en place l’outil bien connu jq.
Il s’agit d’un programme pour la ligne de commande qui nous dépiaute tout un json et nous renvoie la valeur recherchée.
Site web http://stedolan.github.io/jq/
Euh oui, d’accord mais à quoi ça sert diront les newbies ?
Rappel du fonctionnement Domoticz via l’API JSON.
Domoticz dans son travail quotidien interroge nos périphériques, range les données dans la base de données et met également à notre disposition un moyen de récupérer les valeurs en question.
Cela passe par l’appel d’une URL ou l’on demande l’état d’un dispositif par son idx. (L’idx est consultable dans le menu des dispositifs)
Ainsi l’appel dans un navigateur de :
http://ip:8080/json.htm?type=devices&rid=35
nous renvoie les données concernant le périphérique dont l’idx est 35. Nous recevons quelque chose comme cela :
{ "5MinuteHistoryDays" : 1, "ActTime" : 1432055898, "AllowWidgetOrdering" : true, "DashboardType" : 0, "Latitude" : "44.", "Longitude" : "3.146575", "MobileType" : 0, "ServerTime" : "May 19 2015 19:18:18", "Sunrise" : "06:30:00", "Sunset" : "21:23:00", "TempScale" : 1.0, "TempSign" : "C", "WindScale" : 1.0, "WindSign" : "m/s", "dontcachehtml" : true, result" : { "BatteryLevel" : 255, "CustomImage" : 0, "Data" : "Open, Level: 93 %", "Favorite" : 1, "HardwareID" : 3, "HardwareName" : "Rfxcommusb10", "HaveDimmer" : true, "HaveGroupCmd" : true, "HaveTimeout" : false, "ID" : "0945F16", "Image" : "Light", "IsSubDevice" : false, "LastUpdate" : "2015-05-06 14:06:44", .... "Status" : "Open", "StrParam1" : ""
La partie que j’ai figurée en vert sont sont paramètres globaux Domoticz généralement peu intéressants.
Nous avons besoin plus souvent de récupérer des valeurs dans la partie du bas précédée par « result », comme la valeur de la batterie, le status (Open,On ou Off) , la date de mise à jour…
L’utilitaire jq va nous aider à cette tâche.
Son rôle est de lire une trame JSON à la recherche d’un nom et de nous renvoyer la valeur associée.
Voyons comment installer et utiliser cet outil
Installation
Depuis les sources
git clone https://github.com/stedolan/jq.git
cd jq
autoreconf -i
./configure --disable-maintainer-mode
make
sudo make install
Sinon comme maintenant (10/2015) jq fait partie des packages pour les distributions Linux les plus populaires, utilisez votre apt-get, yum, …. favori pour installer jq
ou sinon pour la version 1.5
wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-1.5.tar.gz tar xfvz jq-1.3.tar.gz cd jq-1.3 ./configure make make install
Utilisation
En ligne de commande
curl -s "http://192.168.1.82:8080/json.htm?type=devices&rid=35"| jq -r .Sunrise
nous renvoie la valeur du champ Sunrise
curl -s "http://192.168.1.82:8080/json.htm?type=devices&rid=35"| jq -r .result[].Status
nous permettra de récupérer la valeur du champ « Status »
Remarquez qu’il est écrit result[].Status
Le result est le nom du bloc (écrit en noir plus haut) dans lequel je recherche le champ Status, cette ligne me renvoie donc « Open ».
ATTENTION : les majuscules/minuscules sont importantes, il faut vraiment se référer à ce que l’on obtient dans le navigateur.
Un exemple de script sous bash
#!/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¶m=switchlight&idx=112&switchcmd=On&level=0' elif [ $result = "Closed" ] then curl 'http://192.168.1.82:8080/json.htm?type=command¶m=switchlight&idx=112&switchcmd=Off&level=0' fi
L’intégration en Lua
Vous trouverez ici un exemple d’intégration dans un script Lua Domoticz