[RESOLU]récuperer des infos JSON pour transmettre à IDX en LUA

Vous avez des questions concernant les scripts dans Domoticz, posez vos questions ici, quelque soit le langage nous tenterons des réponses pertinentes ...
Enamaryn
Messages : 14
Enregistré le : 20 sept. 2020, 08:35

[RESOLU]récuperer des infos JSON pour transmettre à IDX en LUA

Message par Enamaryn »

Bonjour à tous,

j'ai essayé de faire un raccourci de ma demande via le titre. Pour faire plus clair, j'ai des devices (shelly) qui me donner des informations l'interrogation d'une adresse url. Du genre http://192.168.1.xxx/status

J'ai donc toute l'information du shelly en JSON, sans couleur sans formes.. bref que tu texte.

Après un bout de code que j'ai tenté de comprendre en glanant sur le forum, la doc domoticz et google, j'en suis arrivé à ceci = https://github.com/enamaryn/shellyDomot ... lly1pm.lua

Bien sur j'ai une belle erreur :

Code : Tout sélectionner

2020-11-28 13:40:00.235 Error: EventSystem: in /opt/domoticz/scripts/lua/script_time_shelly1pm.lua: /opt/domoticz/scripts/lua/script_time_shelly1pm.lua:7: unexpected symbol near '<'
2020-11-28 13:41:00.248 Error: EventSystem: in /opt/domoticz/scripts/lua/script_time_shelly1pm.lua: /opt/domoticz/scripts/lua/script_time_shelly1pm.lua:7: unexpected symbol near '<'
2020-11-28 13:42:00.262 Error: EventSystem: in /opt/domoticz/scripts/lua/script_time_shelly1pm.lua: /opt/domoticz/scripts/lua/script_time_shelly1pm.lua:7: unexpected symbol near '<'
pourtant je n'ai pas ce symbole dans mon code..

Quelqu'un aurais une idée ? Merci
Modifié en dernier par Enamaryn le 30 nov. 2020, 05:29, modifié 2 fois.

Chrominator
Messages : 657
Enregistré le : 19 déc. 2015, 07:29
Localisation : France

Re: récuperer des infos JSON pour transmettre à IDX en LUA

Message par Chrominator »

Si tu donnes une trace, donne le source aussi ;

Là tu nous donnes une adresse sur GitHub, on a aucune idée du source qui tourne sur la machine.
Tu as même peut-être téléchargé ta page GitHub en guise de source, et là on trouve bien le "<" en ligne 7.
Si tu veux faire ça, il faut sélectionner le mode RAW (en haut à droite).


Sans titre.png
Sans titre.png (58.72 Kio) Vu 542 fois
Partir, c’est pourrir un pneu.

Ubuntu 20.04 LTS - Domoticz v2020.2
rfxcom RFXtrx433 USB Version: Ext2/1025
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway with LAN interface 48.4

Enamaryn
Messages : 14
Enregistré le : 20 sept. 2020, 08:35

Re: récuperer des infos JSON pour transmettre à IDX en LUA

Message par Enamaryn »

Merci de ton retour, j'ai fais un #git clone
Donc j'ai bien téléchargé mon fichier (dans un dossier).

Je ne comprends pas ta demande. De quoi aurais tu besoin ? Le fichier github a évolué depuis mon post mais je n'arrive toujours pas à afficher la donné "power" avec un print...

Il est dans un "groupe" nommée meters. =

"meters":[{"power":2440.73,"overpower":0.00,"is_valid":true,"timestamp":1606594669,"counters":[2437.459, 2435.573, 2442.301],"total":4092212}]

J'ai essayé :
power=output.meters.power
print (power)

Mais rien dans le log.. Pas d'erreur pas d'affichage..

Keros
Messages : 1224
Enregistré le : 23 juil. 2019, 20:57

Re: récuperer des infos JSON pour transmettre à IDX en LUA

Message par Keros »

Enamaryn a écrit : 28 nov. 2020, 20:21 Je ne comprends pas ta demande. De quoi aurais tu besoin ?
On a besoin de ton programme, celui que ton DomoticZ exécutes.

Enamaryn
Messages : 14
Enregistré le : 20 sept. 2020, 08:35

Re: récuperer des infos JSON pour transmettre à IDX en LUA

Message par Enamaryn »

Keros a écrit :
Enamaryn a écrit : 28 nov. 2020, 20:21 Je ne comprends pas ta demande. De quoi aurais tu besoin ?
On a besoin de ton programme, celui que ton DomoticZ exécutes.

Code : Tout sélectionner

 
json = (loadfile "/opt/domoticz/scripts/lua/JSON.lua")() -- For Linux 
-- API call local config=assert(io.popen('curl "http://192.168.1.24/status"')) 
local result = config:read('*a') config:close() 
output = json:decode(result) 

MyUptime=output.meters.power -- ne veut pas s'afficher.... 
SoftwareCurrent=output.update.old_version
SoftwareNew=output.update.new_version
SwitchHallStatus=output.relays[0].ison print(MyUptime) 
print(SoftwareCurrent) 
print(SoftwareNew) 
print('SwitchHall is '..SwitchHallStatus)


Le voici


Keros
Messages : 1224
Enregistré le : 23 juil. 2019, 20:57

Re: récuperer des infos JSON pour transmettre à IDX en LUA

Message par Keros »

Merci, on va pouvoir avancer.

Si je ne dis pas de bétises, la ligne 7 correspond à celle-ci : MyUptime=output.meters.power SoftwareCurrent=output.update.old_version SoftwareNew=output.update.new_version SwitchHallStatus=output.relays[0].ison print(MyUptime)

Mais pourquoi tout mettre dans une seule ligne ? J'ai mis des couleur pour que l'on voit les différentes commandes :
MyUptime=output.meters.power SoftwareCurrent=output.update.old_version SoftwareNew=output.update.new_version SwitchHallStatus=output.relays[0].ison print(MyUptime)

Mets ces différentes commandes sur des lignes différentes. Calcul par exemple MyUptime et mets le print à la suite. Tu verras ainsi si ton appel Json fonctionne.

Procède étape par étape. J'ai écris quelques conseil à propos du débogage dans ma signature.

Enamaryn
Messages : 14
Enregistré le : 20 sept. 2020, 08:35

Re: récuperer des infos JSON pour transmettre à IDX en LUA

Message par Enamaryn »

Keros a écrit :Merci, on va pouvoir avancer.

Si je ne dis pas de bétises, la ligne 7 correspond à celle-ci : MyUptime=output.meters.power SoftwareCurrent=output.update.old_version SoftwareNew=output.update.new_version SwitchHallStatus=output.relays[0].ison print(MyUptime)

Mais pourquoi tout mettre dans une seule ligne ? J'ai mis des couleur pour que l'on voit les différentes commandes :
MyUptime=output.meters.power SoftwareCurrent=output.update.old_version SoftwareNew=output.update.new_version SwitchHallStatus=output.relays[0].ison print(MyUptime)

Mets ces différentes commandes sur des lignes différentes. Calcul par exemple MyUptime et mets le print à la suite. Tu verras ainsi si ton appel Json fonctionne.

Procède étape par étape. J'ai écris quelques conseil à propos du débogage dans ma signature.
Je viens de réactivée le matériel avec le code comme tu me le conseille. Je n'ai rien qui s'affiche dans le log... Up du script toute les 5 secondes.

En photo. ImageImageImage

Enamaryn
Messages : 14
Enregistré le : 20 sept. 2020, 08:35

Re: récuperer des infos JSON pour transmettre à IDX en LUA

Message par Enamaryn »

J'ai trouver le bon code ! Enfaîte c'est pas très logique.. On commence en programmation généralement à 0 mais la c'est 1.

Donc :
MyUptime=output.meters[1].power

Et ça fonctionne ! J'ai aussi trouvé sur le Web une autre formule qui fonctionne aussi, essayé seulement avec un print. Mais aussi avec un 1 plutôt que 0.

Maintenant je ne trouve le bon code pour envoyer l'information stocker dans une variable vers mon dummy..

Code : Tout sélectionner

-- Recuperation des informations issu de /status des shelly
-- a la fin du fichier vous trouverez un bout de code   
-- ajouter dans le fichier pour chaque shelly que vous avez.
-- n'oubliez pas de cr  er vos Dummy avant de modifier ce script.
-- Nous avons besoin des IDX des dummy.
--
-- 28/11/2020 : Version 1 : Redaction initiale Auteur : enamaryn

json = (loadfile "/opt/domoticz/scripts/lua/JSON.lua")()  -- For Linux    
        --  API call
    local config=assert(io.popen('curl "http://192.168.1.24/status"'))
    local result = config:read('*a')
    config:close()
    output = json:decode(result)

        local idx = 35
        MyUptime=output.meters[1].power
        uptime=output["meters"][1]["power"]

        print(MyUptime)
        print(uptime)

        -- on update le device --

        -- domoticz_updateDevice(id,'',MyUptime) NE FONCTIONNE PAS
commandArray = {}
        commandArray['SetSetPoint:idx']=MyUptime
return commandArray
Une idée ?

Keros
Messages : 1224
Enregistré le : 23 juil. 2019, 20:57

Re: récuperer des infos JSON pour transmettre à IDX en LUA

Message par Keros »

Pour infos, t'es images sont difficilement lisibles. Le mieux est de copier-coller ton code comme tu l'avais fait précédemment.

Oui, en Lua les tableaux commencent à partir de 1.

Je n'ai pas compris le paramétrage dans le device Powercumulus. Cela te sers à quoi de faire un get dans le device et dans le programme ?
Enamaryn a écrit : 29 nov. 2020, 12:54 Maintenant je ne trouve le bon code pour envoyer l'information stocker dans une variable vers mon dummy.. Une idée ?
Il faut que tu sois plus explicite : quel est ce dummy dont tu parles ? Quel type ? Pour y mettre quelle info ? (c'est peut-être dans l'image mais j'arrive pas à lire).

Tu as regardé les exemple de script par défaut proposer par DomoticZ quand tu vas dans Paramètres / Plus d'options / Évènements ?
Sinon, il y a une liste des fonctions lua

Enamaryn
Messages : 14
Enregistré le : 20 sept. 2020, 08:35

Re: récuperer des infos JSON pour transmettre à IDX en LUA

Message par Enamaryn »

Merci de ton retour,
navré pour les images j'utilise en parti tapatalk qui ne me permet pas de mettre la taille originale.

Alors je suis obligé de remplir URL, sinon je ne peux enregistrer. J'ai un beau message sur fond rouge..

Pour expliquer plus clairement, ce bout de code me permet enfin de récupérer une information dans une variable qui est en l’occurrence "MyUptime".

Je souhaite envoyé la donnée enregistrer dans MyUptime pour l'afficher en tant que compteur électrique instantané.

J'ai donc créer un capteur virtuel type éléctrique instantanée + compteur, qui me donner un numéro idx 34.

Maintenant je souhaite mettre à jour ce capteur avec MyUptime.

Je n'y arrive pas...

Répondre