Parser un json avec jq

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
rapinou
Messages : 119
Inscription : 17 nov. 2016, 01:44

Parser un json avec jq

Message par rapinou »

Bonjour,

Afin d'améliorer mon script chauffage pour prendre en compte la température actuelle (les jours froid il faut plus de temps pour la montée en température intérieure), je cherche à récupérer les infos des planning enregistrées dans Domoticz. Mais je bloque sur une partie, au moment de parser le json des timers avec jq.

Avec le script suivant :

Code : Tout sélectionner

#! /bin/bash
planning=$(curl -s "http://192.168.0.38:8080/json.htm?type=schedules" | jq -r '.result[]')
echo $planning
J'obtiens les résultats de tous les timers.

Mais comme j'ai plusieurs interrupteurs avec planning, je voudrais les trier dans un premier temps pour un interrupteur spécifique ("DeviceRowID" : 15).

J'ai beau éplucher le manuel (https://stedolan.github.io/jq/manual/), je ne trouve pas la bonne syntaxe.

Si quelqu'un peut m'aider :D

Merci.
RPI 3 - Raspbian 8 (Jessie) - Domoticz V3.5877
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: Parser un json avec jq

Message par jackslayter »

Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
rapinou
Messages : 119
Inscription : 17 nov. 2016, 01:44

Re: Parser un json avec jq

Message par rapinou »

Merci jackslayter.

J'avais vu le wiki, mais apparemment cette commande sort tous les timers de tous les devices.
J'ai essayé en remplaçant "device" par le nom de mon interrupteur ou par son ID, ça ne fonctionne pas.
RPI 3 - Raspbian 8 (Jessie) - Domoticz V3.5877
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: Parser un json avec jq

Message par jackslayter »

ah merde je croyais que ça marchait comme ça
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
rapinou
Messages : 119
Inscription : 17 nov. 2016, 01:44

Re: Parser un json avec jq

Message par rapinou »

Bon, j'ai trouvé une solution apparemment.

Code : Tout sélectionner

#! /bin/bash
planning=$(curl -s "http://192.168.0.38:8080/json.htm?type=schedules" | jq '.result[] | select(.DeviceRowID | contains(15))')
echo $planning | jq '.ScheduleDate'
Ca me sort :

Code : Tout sélectionner

"2016-12-03 07:00:00"
"2016-12-03 08:00:00"
"2016-12-03 09:00:00"
"2016-12-03 12:00:00"
"2016-12-03 13:00:00"
"2016-12-02 18:15:00"
"2016-12-02 23:00:00"
"2016-12-02 23:00:00"
Maintenant il faut que je trouve comment trier les timers des jours de semaines et ceux du weekend ("days: 256" et "days: 512" dans le json) suivant qu'on est le weekend ou non (en rajoutant une condition avec "and" peut-être ?).
Puis ressortir uniquement l'heure la plus proche de l'heure actuelle. On va y arriver ^^
RPI 3 - Raspbian 8 (Jessie) - Domoticz V3.5877
rapinou
Messages : 119
Inscription : 17 nov. 2016, 01:44

Re: Parser un json avec jq

Message par rapinou »

Je bloque :/

J'arrive bien à sortir les timers voulus avec le script suivant :

Code : Tout sélectionner

#! /bin/bash
timers=$(curl -s "http://192.168.0.38:8080/json.htm?type=schedules" | jq '.result[] | select((.DeviceRowID | contains (15)) and (.Level | contains(10)))' | jq '.ScheduleDate' | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/')
echo -e "Timers:\n$timers"
date_serveur=$(curl -s "http://192.168.0.38:8080/json.htm?type=command&param=getSunRiseSet" | jq -r '.ServerTime')
echo -e "Date serveur:\n$date_serveur"
Réponse :

Code : Tout sélectionner

Timers:
2016-12-04 07:00:00
2016-12-04 09:00:00
2016-12-04 12:00:00
2016-12-03 18:15:00
Date serveur:
2016-12-03 15:31:37
Mais je n'arrive pas à ne garder que le timer le plus proche de la date serveur.

Quelqu'un d'inspiré svp ?
RPI 3 - Raspbian 8 (Jessie) - Domoticz V3.5877
patrice
Messages : 1720
Inscription : 22 sept. 2014, 21:51

Re: Parser un json avec jq

Message par patrice »

Bonjour
Si ça peut aider : jq à une option --sort-keys pour trier , regarde si ça s applique à ton cas
et puis un sort-order [ton id) ou qq chose comme cela.


Envoyé de mon PULP 4G en utilisant Tapatalk
Raspberry pi 3, Dongle RfxCom et Zigate +, plugin de pipiche, Volets Roulants profalux, contrôle d'éclairage, détecteurs de présence, alarme incendie, pilotage livebox ...
Objectif : WAF > 1
rapinou
Messages : 119
Inscription : 17 nov. 2016, 01:44

Re: Parser un json avec jq

Message par rapinou »

Merci Patrice.

Je n'ai pas réussi à comprendre comment fonctionnait exactement --sort-keys, mais j'ai quand même trouvé une solution en convertissant les dates en timestamp et en ne récupérant que le plus petit avec 'min'.
J'avais justement besoin de convertir la date en timestamp pour la suite du script afin de calculer un delta avec la date serveur donc c'est parfait.

J'ai bientôt fini mon script, je le partagerais ici une fois mis au propre si ça peut intéresser quelqu'un.
RPI 3 - Raspbian 8 (Jessie) - Domoticz V3.5877
rapinou
Messages : 119
Inscription : 17 nov. 2016, 01:44

Re: Parser un json avec jq

Message par rapinou »

Script terminé, je l'ai partagé ici : https://easydomoticz.com/forum/viewtopi ... =17&t=2922.

Merci de votre aide ;)
RPI 3 - Raspbian 8 (Jessie) - Domoticz V3.5877
Répondre