Page 5 sur 7
Re: interrogations sur PiTInfo
Publié : 16 avr. 2023, 14:19
par Keros
Je pense que le plus compliqué à comprendre était la partie pour aller trouver la donnée dans le Json. Tu l'as trouvé avec jsonValeur.result.[1].Counter. Tu as fait le plus dur !!
Tu reprends le code de l'exemple, tu remplaces le lien de l'appel API après config=assert(io.popen('/usr/bin/curl, tu gardes une variable avec le jsonValeur.result.[1].Counter, tu modifies la ligne de log pour afficher la variable et tu es bon.
Ne te décourage pas maintenant, tu es au bout du tunnel

Re: interrogations sur PiTInfo
Publié : 16 avr. 2023, 15:27
par Bibi49
je dirais que pour localiser Json et transcrire "Counter" j'ai compris la logique, donc assez simple maintenant.
Pour la suite, je vais faire "betement" ce que tu me dit (sans rien comprendre de la logique de programmation)
Code : Tout sélectionner
commandArray = {}
config=assert(io.popen('/usr/bin/curl "http://192.168.0.25:8080/json.htm?type=devices&rid=161"'))
blocjson = config:read('jsonValeur.result.[1].Counter')
config:close()
jsonValeur = json:decode(blocjson)
Counter = jsonValeur.result.[1].Counter
msg = 'Index EDF '..Counter..
print(msg)
return commandArray
Sans aucune surprise, le log en rouge Error: EventSystem: in Script #2: [string "commandArray = {} ..."]:6: <name> expected near '['
Re: interrogations sur PiTInfo
Publié : 16 avr. 2023, 16:59
par Keros
L'erreur indiquait la ligne 6 où il ne faut pas de point entre result et [1].
Une autre erreur était sur la ligne 3 que tu avais modifiée > Pas besoin.
Il manque la ligne qui permet de charger les fonctions d'analyse du Json.
Essaye ceci :
Code : Tout sélectionner
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- for PI
commandArray = {}
config=assert(io.popen('/usr/bin/curl "http://127.0.0.1:8080/json.htm?type=devices&rid=161"'))
blocjson = config:read('*all')
config:close()
jsonValeur = json:decode(blocjson)
Counter = jsonValeur.result[1].Counter
msg = 'Index EDF '..Counter
print(msg)
return commandArray
La première ligne est celle pour un PI : le chemin est à ajuster pour ton système.
Il vaut mieux préférer l'adresse
http://127.0.0.1:8080 à
http://192.168.0.25:8080 : si DomoticZ change d'IP, tu n'auras pas besoin de modifier ton script.
Re: interrogations sur PiTInfo
Publié : 16 avr. 2023, 17:57
par Bibi49
Je n'avais jamais réussi a utiliser 127.0.0.1:8080 mais ça fonctionne. (perso, l'IP est fixer sur le raspberry et sur la box internet)
j'aimerais comprendre chaque ligne :
Code : Tout sélectionner
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- charger les fonctions d'analyse du Json (logiciel de décodage json)
commandArray = {}-- les commandes a exécuter
config=assert(io.popen('/usr/bin/curl "http://127.0.0.1:8080/json.htm?type=devices&rid=161"'))--ouvrir la page json du widget desiré
blocjson = config:read('*all')--lecture du json ?
config:close()--fermer la page internet
jsonValeur = json:decode(blocjson)--"décryptage" du json???
Counter = jsonValeur.result[1].Counter--récupérer la valeur qui nous intéresse
msg = 'Index EDF '..Counter--mise en page du message a afficher
print(msg)-- écrire le message dans le log
return commandArray--fin de la commande a exécuter, recommence depuis le début
c'est a peu près ça?
Re: interrogations sur PiTInfo
Publié : 16 avr. 2023, 18:19
par Keros
Le 127.0.0.1 c'est l'IP interne du serveur. Si tu mets cette adresse dans un script de DomoticZ ou le navigateur de Pi, ça fonctionnera. Si tu le mets sur le navigateur de ton Pc, là ça ne marchera pas puisque cela va chercher l'IP interne de ton PC.
Code : Tout sélectionner
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- charger les fonctions d'analyse du Json (logiciel de décodage json)
commandArray = {}-- les commandes a exécuter
config=assert(io.popen('/usr/bin/curl "http://127.0.0.1:8080/json.htm?type=devices&rid=161"'))--lance l'appel API pour lire les infos du widget desiré (json brut)
blocjson = config:read('*all')--Enregistre les données Json brut dans une variable
config:close()--ferme l'appel API
jsonValeur = json:decode(blocjson)--Décode le format brut du json pour qu'on puisse récupérer les données via un tableau
Counter = jsonValeur.result[1].Counter--récupérer la valeur qui nous intéresse
msg = 'Index EDF '..Counter--mise en page du message a afficher
print(msg)-- écrire le message dans le log
return commandArray--fin de la commande a exécuter
Tu as un index maintenant ?
Étape suivante : Tu modifies le script pour mettre les deux index dans les logs ?
Re: interrogations sur PiTInfo
Publié : 16 avr. 2023, 18:53
par Bibi49
Je comprend mieux pour le 127
Pas trop vite.
avec le tuto de Joebuz (
viewtopic.php?p=82679#p82679), -> tranfert de la valeur dans le widget
Code : Tout sélectionner
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() --
commandArray = {}-- les commandes a executer
-- if (time.min % 20)==0 then -- pour exécuter le script toutes les 20 minutes
local CounterDeviceIdx = 175 --- idx dummy crée en compteur
config=assert(io.popen('/usr/bin/curl "http://127.0.0.1:8080/json.htm?type=devices&rid=161"'))--
blocjson = config:read('*all')--
config:close()--
jsonValeur = json:decode(blocjson)--
Counter = jsonValeur.result[1].Counter--
msg = 'Index EDF '..Counter--
print(msg)--
commandArray[CounterDeviceIdx] = { ['UpdateDevice'] = CounterDeviceIdx..'|0|'..Counter }-- envoi de la valeur dans le compteur
return commandArray--
ligne 3, 4 et 12 ajouté
ça fonctionne
Edit Je pense que je vais faire 2 compteurs (1 HP et 1 HC), le chiffres seront écrit plus gros et plus simple pour mon père
Re: interrogations sur PiTInfo
Publié : 16 avr. 2023, 20:50
par Keros
Content que t'y sois arriver
Si le Widget se met à jour avec la bonne valeur, tu peux désactiver le print() : il n'est pas nécessaire de surcharger les logs.
Re: interrogations sur PiTInfo
Publié : 17 avr. 2023, 18:23
par Bibi49
Un grand MERCI Keros, je n'y serais jamais arrivé sans toi
J'ai encore une question :
le json de mon père est "atypique" dans le sens ou il y a plusieurs valeurs sur une meme ligne séparé par un point virgule.
avec Data = jsonValeur.result[1].Data je recupere bien mon index HP.
Comment faire pour récupérer la seconde valeur (celle après le ; )?
J'aurais bien essayé Data = jsonValeur.result[1].Data; mais la connection internet est coupé chez mon père (vive la campagne

)
Re: interrogations sur PiTInfo
Publié : 17 avr. 2023, 21:44
par Keros
J'ai mis un peu de temps, mais j'y suis arrivé… enfin plutôt : j'ai retrouvé un exemple de papoo
En haut de ton script, il faut que tu rajoutes la fonction :
Code : Tout sélectionner
function split(inputstr, sep)
if sep == nil then
sep = "%s"
end
local t={} ; i=1
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
t[i] = str
i = i + 1
end
return t
end -- usage : valeurs = split(variable,";")
Et pour y faire appel :
Code : Tout sélectionner
valeurs = split(jsonValeur.result[1].data,";")
print(valeurs[2])
Et tu devrais avoir la deuxième valeur dans les logs.
Re: interrogations sur PiTInfo
Publié : 18 avr. 2023, 19:17
par Bibi49
Merci beaucoup Keros.
Je testerais sur place (pb de connexion internet avec Domoticz de mon père)
Je ne manquerais pas de confirmé le bon fonctionnement du code
