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¶m=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¶m=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¶m=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.