J'utilise la solution libre Domoticz pour orchestrer la domotique à la maison. Domoticz propose une API qui retourne des données au format JSON.
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.
3 commentaires
[…] Je vous laisse le soin d'adapter le script avec vos sondes et commandes. Concernant l'utilisation de jq je vous invite à lire le billet dédié. […]
J'ai un soucis : error 2
pi@RASPBERRYPI:~/jq $ make
make all-recursive
make[1]: Entering directory '/home/pi/jq'
Making all in modules/oniguruma
make[2]: Entering directory '/home/pi/jq/modules/oniguruma'
make[2]: *** No rule to make target 'all'. Arrêt.
make[2]: Leaving directory '/home/pi/jq/modules/oniguruma'
Makefile:1079: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/pi/jq'
Makefile:755: recipe for target 'all' failed
make: *** [all] Error 2
@Doudy: n'utilise pas la version make mais le paquet des dépôts