Page 1 sur 3

extraction de donnée Json

Publié : 05 oct. 2015, 10:10
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 ?

Re: extraction de donnée Json

Publié : 05 oct. 2015, 14:15
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

Re: extraction de donnée Json

Publié : 05 oct. 2015, 18:10
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

Re: extraction de donnée Json

Publié : 05 oct. 2015, 20:12
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

Re: extraction de donnée Json

Publié : 06 oct. 2015, 15:43
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*

Re: extraction de donnée Json

Publié : 06 oct. 2015, 15:46
par patrice
Joli !

Re: extraction de donnée Json

Publié : 06 oct. 2015, 15:59
par jackslayter
un peu lourd mais ça fait le taf

Re: extraction de donnée Json

Publié : 06 oct. 2015, 18:29
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.

Re: extraction de donnée Json

Publié : 06 oct. 2015, 19:01
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

Re: extraction de donnée Json

Publié : 06 oct. 2015, 23:26
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.