Page 1 sur 1

Affichage de données extraites d'un json

Publié : 03 mai 2020, 01:33
par aldoushx
Bonjour,
Je dispose de données d'un thermostat Qivivo (obtenues via l'API) stockées dans un fichier .json mis à jour toutes les 5 min via crontab, que je souhaiterais récupérer et afficher dans Domoticz.
Mais voilà le problème : je n'ai aucune idée de comment faire !
Y aurait-il une âme charitable pour m'expliquer ?

J'imagine que ça va passer par des dispositifs dummy et du crontab pour leur màJ périodique, mais quel est le script à exécuter permettant de récupérer les données et de les afficher dans les dummy ?

Les données dans le .json sont stockées sous cette forme :

Code : Tout sélectionner

{
    "03.05.2020": {
        "00:00": {
            "current_temperature_order": 18,
            "current_temperature": 20.09,
            "current_humidity": 77.4,
            "presence_detected": 0,
            "exterior_temperature": null
        },
        "00:05": {
            "current_temperature_order": 18,
            "current_temperature": 20.09,
            "current_humidity": 77.2,
            "presence_detected": 0,
            "exterior_temperature": null
        },
        "00:10": {
            "current_temperature_order": 18,
            "current_temperature": 20,
            "current_humidity": 77.1,
            "presence_detected": 0,
            "exterior_temperature": null
        },

[...]
}
D'avance merci pour votre aide !

Re: Affichage de données extraites d'un json

Publié : 03 mai 2020, 07:36
par Chrominator
Je peux te donner une piste ;

Le seul morceau de ton fichier qui soit pertinent est le plus récent.
En le chargeant dans Domoticz, ce dernier va historiser aussi les valeurs que tu pourras analyser dans l'historique du widget, donc inutile de s'occuper des anciennes mesures.

Ensuite au niveau des widgets, il y en aurait plusieurs. Voici comment je ferais :
  • current_temperature_order --> type consigne de thermostat - Setpoint
  • current_temperature et current_humidity --> Type température + Humidité - Temp + Humidity (On peut aussi les séparer en 2 widgets si on veut)
  • presence_detected --> Type interrupteur - Light/Switch
Je verrais bien un script en Lua pour alimenter les widgets, utilisant l'excellent encodeur/décodeur JSON de Jeffrey Friedl
Dans ton exemple, il manque un } pour fermer le json.
Tu peux vérifier la validité de ce qui sort de ton Qivivo avec un décodeur online.

Bon courage, en écrivant ce script tu vas certainement apprendre plein de choses.

Ensuite, dans ta todo list, tu pourras ajouter le script qui va modifier la consigne du Qivivo lorsque tu la changera dans Domoticz grâce au widget ! :lol:

Re: Affichage de données extraites d'un json

Publié : 04 mai 2020, 18:11
par Keros
L'encodeur/décodeur JSON de Jeffrey Friedl est très utilisé : tu trouveras beaucoup d'exemple sur ce forum.

Je l'utilise par exemple dans mon tuto pour récupérer des données météo : https://easydomoticz.com/forum/viewtopi ... 592e1b1352

Tu as aussi des exemples avec des scripts de papoo.

Re: Affichage de données extraites d'un json

Publié : 05 mai 2020, 10:10
par aldoushx
J'avance à pas de fourmis, je découvre le bash et l'api json, et du coup je bloque sur un problème de base :

J'ai inclus dans ma routine php qui relève les info de l'api qivivo une ligne qui extrait uniquement la dernière valeur de température et l'écrit dans un fichier .txt (pour simplifier au max mon problème, on verra plus tard pour s'en passer) toutes les 5 min.

J'ai créé ensuite un petit script .sh pour lire le fichier .txt et envoyer la valeur qui s'y trouve à un capteur de température dummy dans domoticz via la commande json qui convient.

C'est là que je me heurte à mon premier problème : quand je lance le script sans lecture du fichier .txt avec une valeur fixe de température (un entier par ex), ça met bien à jour mon dummy, mais si je remplace la valeur fixe par une variable ($tempqivivo ici), plus rien ne se met à jour.
De plus, quand j'ajoute un echo $tempqivivo, j'ai bien la bonne valeur qui s'affiche dans mon invite de commande, mais le dummy ne se met pas à jour...
Quelle est la subtilité ?

edit : j'ai testé de remplacer dans la commande json l'idx ou l'IP domoticz par une variable, et même résultat, la màJ du dummy ne se fait plus, alors qu'un echo renvoie bien ma valeur dans l'invit de commande => le problème semble venir de la prise en compte des variables dans ma ligne curl, y-a-t'il un argument à ajouter ?

Voila le contenu du (tout petit) script :

Code : Tout sélectionner

#!/bin/bash
tempqivivo="$(tr -d "\r\n" </home/pi/domoticz/scripts/sh/qivivoLog.txt)"
echo $tempqivivo
curl -s "http://192.168.1.42:8080/json.htm?type=command&param=udevice&idx=189&nvalue=0&svalue=$tempqivivo"
Si il y a un expert dans le coin, merci d'avance pour le coup de pouce !

Re: Affichage de données extraites d'un json

Publié : 05 mai 2020, 19:23
par Chrominator
Est-ce que ta valeur issue de Qivivo est un nombre décimal ?
Et si oui, la décimale est-elle un point ?
La marque décimale doit être un point pour mettre à jour ta température via l'API.
Si c'est une virgule, tu pourras la replacer par un point avec sed (éditeur de ligne).

Je ne vois que ça, ton script fonctionne très bien (J'ai écris 14.9 dans le fichier ./qivivoLog.txt).

Le code :

Code : Tout sélectionner

  1 #!/bin/bash
  2 #exec 5> >(logger -t $0)
  3 #BASH_XTRACEFD="5"
  4 PS4='$LINENO: '
  5 set -x
  6
  7 tempqivivo="$(tr -d "\r\n" <./qivivoLog.txt)"
  8 echo $tempqivivo
  9 curl -s "http://192.168.1.9:8080/json.htm?type=command&param=udevice&idx=389&nvalue=0&svalue=$tempqivivo"

L'exec :

Code : Tout sélectionner

pi@phoenix-dev:~$ ./test.sh
./test.sh
+ PS4='$LINENO: '
5: set -x
77: tr -d '\r\n'
7: tempqivivo=14.9
8: echo 14.9
14.9
9: curl -s 'http://192.168.1.9:8080/json.htm?type=command&param=udevice&idx=389&nvalue=0&svalue=14.9'
{
        "status" : "OK",
        "title" : "Update Device"
}

Re: Affichage de données extraites d'un json

Publié : 05 mai 2020, 23:29
par aldoushx
Merci pour ton aide, j'ai pris ton code a la place du mien et ça fonctionne... (je ne comprends pas vraiment pourquoi et ça m'agace mais je peux avancer)