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.
Maj 09/2018 : jq est maintenant dans les dépôts : apt install jq
(passez directement au paragraphe utilisation)
Pour l'installer il faut le compiler car il n'est pas présent dans les dépôts (hors backports).
On se connecte sur le Raspberry Pi en utilisateur classique :
1 2 3 4 5 6 7 8 |
<del>cd ~ sudo apt-get install dh-autoreconf -y git clone https://github.com/stedolan/jq.git cd jq autoreconf -i ./configure --disable-maintainer-mode make sudo make install</del> |
J'ai mis jq dans le répertoire courant de mon utilisateur (ligne 1). Tout ça prend un peu de temps car notre framboise aime se la couler douce en période estivale.
Mise à jour 08/2017, voici ce qu'il faut utiliser pour Raspbian 9 :
1 2 3 4 5 |
<del>cd /tmp wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-1.5.tar.gz tar xfvz jq-1.5.tar.gz cd jq-1.5 ./configure && make && sudo make install</del> |
Optez pour la dernière release (1.5 au moment où j'écris ceci).
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 :
1 2 |
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 :
1 |
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 :
1 2 |
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é :
1 2 |
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.
Déjà 3 commentaires
23 septembre 2016 à 9h02
[…] 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é. […]
13 janvier 2019 à 10h30
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
dit :
13 janvier 2019 à 20h51
@Doudy: n'utilise pas la version make mais le paquet des dépôts