jq: Manipuler les données JSON de Domoticz en shell

 

jq

 

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)

idx_domoticz

 

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&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

L’intégration en Lua
Vous trouverez ici un exemple d’intégration dans un script Lua Domoticz

http://www.domoticz.com/wiki/Battery_level_check#Dependencies_-_hardware_.2F_software_.2F_operating_system

Pour toute question technique concernant cet article, veuillez utiliser les forum situés à https://easydomoticz.com/forum/