(modifié le 6 mai 2020 à 1:12)

J'utilise la solution libre Domoticz pour orchestrer la domotique à la maison. Domoticz propose une API qui retourne des données au format JSON.

jq-domoticz

Voyons comment est-il possible d'extraire facliment une valeur provenant d'un fichier au format JSON.

Pistes écartées

Première idée : mais t'as pas besoin d'un script pour faire ça, à grand coup de grep, awk, sed ou cut et c'est plié !

Alors oui c'est possible, mais après réflexion je préfère parser correctement le contenu JSON car j'aurai probablement d'autres utilisations plus tard. Mais si ça peut pimenter un peu vos vacances (ou l'open space) posez votre code en commentaire je l'ajouterai au billet 🙂

jq

De mes recherches ressortent plusieurs scripts et solutions et c'est jq que j'ai choisi. jq est une sorte de sed qui fonctionne avec du JSON.

Installation

Depuis 2018 jq est disponible dans les dépôts

Pour l'installer sur Raspbian :

 apt install jq

Utilisation

Il faut ensuite récupérer l'identifiant (idx) du capteur/sonde de Domoticz dans Réglages > Dispositifs > Utilisés. Dans mon cas c'est le numéro 456 qui correspond à une sonde de température / humidité.

Depuis le Raspberry :

curl -s "http://localhost:8080/json.htm?type=devices&rid=456" | jq -r .result[]."Data"
25.7 C, 50 %

Si vous utilisez le nom d'hôte de votre Raspberry Pi plutôt que "localhost" vous pourrez avoir une erreur d'accès, car le flux passera par l'interface physique plutôt que la boucle locale (127.0.0.1).

Si vous lancez ce script depuis une autre machine (Synology, serveur gnu/linux...) alors il faut remplacer localhost par l'IP de votre Raspberry et ajouter user/password :

curl -s "http://utilisateur:password@ip-raspberry:8080/json.htm?type=devices&rid=456" | jq -r .result[]."Data"

Si vous préférez bypasser les identifiants c'est possible en précisant les IP sources des machines qui auront un accès libre, dans Réglages > Paramètres > Réseaux locaux. Cela implique d'être en IP fixe ou dhcp static évidemment sur ces machines.

Isoler température et humidité

Ma sonde renvoie la température et l'humidité sous une seule chaine. Pour extraire séparément ces valeurs il faut utiliser cut.

Pour la température :

curl -s "http://localhost:8080/json.htm?type=devices&rid=456" | jq -r .result[]."Data" | cut -d' ' -f1
exemple de retour (en degrés celcius): 30.4

Pour l'humidité :

curl -s "http://localhost:8080/json.htm?type=devices&rid=456" | jq -r .result[]."Data" | cut -d' ' -f3
exemple de retour (en %): 65

En complément

Voici un exemple d'utilisation de jq chez Easydomoticz pour lire les prévisions de pluie. Et une alternative à jq avec jsawk qui est donc le cousin de jq orienté "awk". Pour tester vos filtres vous pouvez utiliser jqplay (découvert chez lecacheur). Attention à bien respecter la casse !

En bref ça fonctionne, c'est simple et évolutif. J'ai pu intégrer les valeurs de mes capteurs directement dans mon bash_profile que je vous partagerai bientôt.

Auteur : Mr Xhark

Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter