extraction de donnée Json

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 <\>.
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

extraction de donnée Json

Message par deennoo »

Pour faire suite a cet article ou je presente la teleinformation en wifi :

viewtopic.php?f=7&t=843

Je souhaite extraire les données JSON de ce module afin de mettre a jour un faux compteur electrique smart p1.


J'en suis au debut de mon script

Code : Tout sélectionner

teleinfo.sh

#!/bin/bash
papp=$(curl -s "http://192.168.0.29/papp")
echo " PAPP = $papp"
HCHC=$(curl -s "http://192.168.0.29/HCHC")
echo " HCHC = $HCHC"
HCHP=$(curl -s "http://192.168.0.29/HCHP")
echo " HCHP = $HCHP"
Les valeurs s'affichent ainsi :

Code : Tout sélectionner

PAPP = {"PAPP":390}
 HCHC = {"HCHC":32077084}
 HCHP = {"HCHP":73864980}
Biensur si ensuite je fais :

Code : Tout sélectionner

curl "http://192.168.0.21:8080/json.htm?type=command&param=udevice&idx=3099&nvalue=0&svalue=0;0;0;0;$papp;0"
J'ai une erreur car j'essaie d'envoyer : {"PAPP":390} alors qu'il me faut que 390.

Mon probleme est une histoire de mise en forme j'imagine, mais je but sur comment juste prendre les chiffres et pas le reste.

Peut etre que le sh n'est pas le bon format, vaut il mieux un Python ?
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: extraction de donnée Json

Message par deennoo »

Je viens d'essayer avec bash et JQ (http://easydomoticz.com/tag/json/) mais l'api json de WifiInfo comporte un petit bug donc impossible de la parser comme il faut.

je me tourne vers nodered comme le conseil Charles le dev de WifiInfo
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
patrice
Messages : 1720
Inscription : 22 sept. 2014, 21:51

Re: extraction de donnée Json

Message par patrice »

Bonsoir

Voici un script qui devrait faire le boulot:
Si chaineZ contient {"PAPP":390} , avec les {} et tout et tout

le truc bourin MAIS qui ne marche qui si tu veux extraire QUE 3 caractères après le deux points : c'est
chaineZ={"PAPP":390}
echo ${chaineZ:6:3}

Si tu as une longueur de caractères variables après le :

u=$(echo $chaineZ | cut -f2 -d:| cut -f1 -d})
echo $u
echo ${#u}

On coupe la chaine apres les 2 pointet on prend le 2eme champ en laissant tomber {"PAPP": on a donc 390} puis on recoupe grace au } et on prend le 1er champ et c'est gagné
le ${#u} affiche la longueur de la chaine u
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
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: extraction de donnée Json

Message par deennoo »

Merci pour ton aide Patrice.

Les infos retourné par le JSON son celles ci :

[code . {"_UPTIME":650,"ADCO":29922105039,"PTEC":"HP..":,"IINST":3,"PAPP":610,"HHPHC":"A":,"MOTDETAT":0,"OPTARIF":"HC..":,"ISOUSC":45,"HCHC":32045363,"HCHP":73847904,"IMAX":43,"OTARIF":"HC..":}[/code]

Ce qui nous interesse :

PAPP : conso immediate
HCHC : index heures creuses
HCHP : index heures pleines
IInstat : intensité consommé immédiate

donc toutes des variables, je vais essayer de regarder l export JSON dans WifiInfo
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: extraction de donnée Json

Message par jackslayter »

Code : Tout sélectionner

#!/bin/sh
json=$(cat gre.txt | sed -e 's/"IINST":/\n/g' | sed -e 's/"PAPP":/\n/g' | sed -e 's/"HHPHC"/\n/g' | sed -e 's/"HCHC":/\n/g' | sed -e 's/"HCHP":/\n/g' | sed -e 's/,"IMAX"/\n/g' | sed -e '1d' | sed -e '3d' | sed -e '$d' | tr -d '\r\n' | sed -e 's/,/ /g')
IINST=`echo "$json" | awk '{print $1}'`
PAPP=`echo "$json" | awk '{print $2}'`
HCHC=`echo "$json" | awk '{print $3}'`
HCHP=`echo "$json" | awk '{print $4}'`
echo "$json"
curl "http://192.168.0.21:8080/json.htm?type=command&param=udevice&idx=3099&nvalue=0&svalue=0;0;0;0;$PAPP;0"
tu peux remplacer le *cat json.txt* par un *curl http://esp01.local/json*
Dernière modification par jackslayter le 06 oct. 2015, 16:04, modifié 4 fois.
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
patrice
Messages : 1720
Inscription : 22 sept. 2014, 21:51

Re: extraction de donnée Json

Message par patrice »

Joli !
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
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: extraction de donnée Json

Message par jackslayter »

un peu lourd mais ça fait le taf
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
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: extraction de donnée Json

Message par deennoo »

Merci Jacky !

Mais je ne comprends pas tout :

Nul part je vois que je vais interroger mon wifidevice.

Dois je comprendre que je mets le tiens a la suite du mieux ? A la suite de celui de patrice ?

A la fin tu mets a jour via curl mais que $PAPP, j'imagine que c'est pour l'exemple, et qu'il faut le faire pour toutes les variables.
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
patrice
Messages : 1720
Inscription : 22 sept. 2014, 21:51

Re: extraction de donnée Json

Message par patrice »

Jack est parti du fait que tu avait tout ton baratin dans un fichier gre.txt, il faut que tu fasse avant une redirection dans un fichier avec >>
qq chose comme

#!/bin/bash
curl -s "http://192.168.0.29/papp" >> gre.txt
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
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: extraction de donnée Json

Message par deennoo »

on avance a grand pas, merci jacky et patrice.

donc j'ai fais ceci

Code : Tout sélectionner

#!/bin/bash

json=$(curl http://192.168.0.29/json | sed -e 's/"IINST":/\n/g' | sed -e 's/"PAPP":/\n/g' | sed -e 's/"HHPHC"/\n/g' | sed -e 's/"HCHC":/\n/g' | sed -e 's/"HCHP":/\n/g' | sed -e 's/,"IMAX"/\n/g' | sed -e '1d' | sed -e '3d' | sed -e '$d' $
IINST=`echo "$json" | awk '{print $1}'`
PAPP=`echo "$json" | awk '{print $2}'`
HCHC=`echo "$json" | awk '{print $3}'`
HCHP=`echo "$json" | awk '{print $4}'`
echo "$json"
echo "$PAPP"
echo "$HCHC"
echo "$HCHP"
curl "http://192.168.0.21:8080/json.htm?type=command&param=udevice&idx=3096&nvalue=0&svalue=$HCHC;$HCHP;0;0;$PAPP;0"
et en fait j'ai ceci en retour

Code : Tout sélectionner

 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   170  100   170    0     0    737      0 --:--:-- --:--:-- --:--:--   845
32088103 73877990 "PTEC":"HP..": :43 480
73877990[b] devrait etre PAPP = 845[/b]
"PTEC":"HP..": [b]Devrait etre HCHC = 32088103[/b]
:43 [b]DEvrait etre HCHP : 73877990[/b]
----
[b]IINST ne devrait pas avoir les ":"[/b]
----
{
   "status" : "OK",
   "title" : "Update Device"
}
Je vais chercher par moi meme ce qui cloche, dans tout les cas je reviens pour vous dire.
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
Répondre