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 :lol:

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 :D

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.

Code : Tout sélectionner

"Data" : "22916845;24111445;0;0;220;0",

Code : Tout sélectionner

"Data" : "index HP ; index HC;?;?;?;?",
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 :lol: )

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 :mrgreen:

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 :D