Impossible de mettre à jour une variable utilisateur

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
Aile
Messages : 157
Inscription : 27 janv. 2022, 12:18

Impossible de mettre à jour une variable utilisateur

Message par Aile »

Bonjour à tous,

Je mets au point un script lua pour un Ecocompteur Legrand.
Pour cela, j'utilise un HTTP/HTTPS Poller qui interroge l'Ecocompteur à intervalles réguliers. Le script est donc dans scripts\lua_parsers.
Pour les besoins du script, j'ai créé une variable utilisateur "ConsommationConsole" de type décimal:
Variables Domoticz.PNG
Variables Domoticz.PNG (152.33 Kio) Consulté 1424 fois
Voici le script ultra-simplifié pour isoler le problème :

Code : Tout sélectionner

commandArray = {}

	local ConsoConsole = commandArray['Variable:ConsommationConsole']
	print(tostring(ConsoConsole))

return commandArray
Et voici le log :
Log Domoticz.PNG
Log Domoticz.PNG (10.74 Kio) Consulté 1424 fois
Pourquoi la variable est-elle de type "nil", alors qu'elle est initialisée à Décimal dans les variables utilisateur ?
Ne devrais-je pas avoir ConsoConsole = 0 ?

Si je teste avec

Code : Tout sélectionner

	ConsoConsole = uservariables['ConsommationConsole']
Le log donne "attempt to index a nil value (global 'uservariables')"

Quelqu'un pourrait m'aider ;) ?
NUC Celeron 1037U / Win 10 Pro
  • EcoCompteur Legrand
  • RFLink Nodo : capteurs T° Alecto / capteurs présence EV1527
  • Clef Sonoff Zigbee 3.0 : capteurs T° Sonoff / capteurs présence Lidl / Détecteurs fumée Heiman
  • BroadLink : pilotage clim
  • Shelly 1
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Impossible de mettre à jour une variable utilisateur

Message par Keros »

La syntaxe commandArray['Variable:ConsommationConsole'] permet de mettre à jour une uservariable, pas d'en récupérer la valeur.
Normalement la syntaxe est celle que tu donnes en dessous : ConsoConsole = uservariables['ConsommationConsole']

Tu as essayé uservariables['ma_variable'] dans un script séparé ? Mets nous les lignes de log complètes avec un copier coller stp.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Aile
Messages : 157
Inscription : 27 janv. 2022, 12:18

Re: Impossible de mettre à jour une variable utilisateur

Message par Aile »

Merci de t'intéresser à mon problème, Keros.

J'ai testé avec la fonction uservariables sans succès.

Mon script se résume à trois lignes :

Code : Tout sélectionner

commandArray = {}
	print(uservariables['ConsommationConsole'])
return commandArray
Le log :
Log Domoticz 2.PNG
Log Domoticz 2.PNG (83.13 Kio) Consulté 1399 fois
NUC Celeron 1037U / Win 10 Pro
  • EcoCompteur Legrand
  • RFLink Nodo : capteurs T° Alecto / capteurs présence EV1527
  • Clef Sonoff Zigbee 3.0 : capteurs T° Sonoff / capteurs présence Lidl / Détecteurs fumée Heiman
  • BroadLink : pilotage clim
  • Shelly 1
boum
Messages : 233
Inscription : 18 janv. 2019, 11:34
Localisation : France

Re: Impossible de mettre à jour une variable utilisateur

Message par boum »

Aile a écrit : Pour cela, j'utilise un HTTP/HTTPS Poller qui interroge l'Ecocompteur à intervalles réguliers. Le script est donc dans scripts\lua_parsers.
Alors c'est ballot, pasque dans les scripes lua_parsers, les tables globales ne sont pas disponibles (uservariables mais aussi otherdevices, otherdevices_svalue…)

La seule possibilité est de modifier un dispositif virtuel.

Plusieurs solutions :
  1. Tout passer en dzVents, un script avec déclencheurs timer et httpResponses. Périodiquement utiliser domoticz.openURL pour interroger le compteur, puis traiter dans l'autre partie du script et changer la variable utilisateur.
    :!: Attention, sans tricher, on ne peut déclencher un script que toutes les minutes au plus rapide.
  2. Changer un dispositif virtuel avec le poller, et utiliser un script "device" en Lua ou dzVents pour mettre à jour la variable utilisateur.
  3. Quelle est la raison d'utiliser une variable utilisateur pour stocker la valeur ? Utiliser le poller pour modifier directement un "Custom sensor". Bonus: historique (à moins que ce soit la raison de zapper le dispositif)
Domoticz v2022.2 sur linux-mint / Z-Wave-JS / RFXCom / Zigbee2MQTT
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Impossible de mettre à jour une variable utilisateur

Message par Keros »

Oh la subtilité :o Bien vu boum !!
boum a écrit : 18 mai 2022, 15:44 Attention, sans tricher, on ne peut déclencher un script que toutes les minutes au plus rapide.
J'ai triché :mrgreen: en LUA puis en DzVents pour faire des exécutions toutes les 10 secondes et c'est vrai qu'en DzVents c'est plus propre avec les customEvents.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Aile
Messages : 157
Inscription : 27 janv. 2022, 12:18

Re: Impossible de mettre à jour une variable utilisateur

Message par Aile »

boum a écrit : 18 mai 2022, 15:44 Alors c'est ballot, pasque dans les scripes lua_parsers, les tables globales ne sont pas disponibles (uservariables mais aussi otherdevices, otherdevices_svalue…)
Ah d'accord !... Je ne risquais pas d'y arriver...
boum a écrit : 18 mai 2022, 15:44 Plusieurs solutions :
  1. Tout passer en dzVents, un script avec déclencheurs timer et httpResponses. Périodiquement utiliser domoticz.openURL pour interroger le compteur, puis traiter dans l'autre partie du script et changer la variable utilisateur.
    :!: Attention, sans tricher, on ne peut déclencher un script que toutes les minutes au plus rapide.
J'élimine cette solution, car j'ai besoin d'une mise à jour toutes les cinq secondes, voire moins.
boum a écrit : 18 mai 2022, 15:44 [*]Changer un dispositif virtuel avec le poller, et utiliser un script "device" en Lua ou dzVents pour mettre à jour la variable utilisateur.
Tu peux détailler ?
boum a écrit : 18 mai 2022, 15:44 [*]Quelle est la raison d'utiliser une variable utilisateur pour stocker la valeur ? Utiliser le poller pour modifier directement un "Custom sensor". Bonus: historique (à moins que ce soit la raison de zapper le dispositif)
L'objectif est de tracer le plus précisément possible la consommation de différents postes à l'aide d'un Ecocompteur Legrand, qui a un bug d'enregistrement des consommations au delà d'environ deux mois.
Ce bug est dû à la capacité trop faible des compteurs en float32 (voir la discussion ici :https://easydomoticz.com/forum/viewtopic.php?t=1942)

J'utilise donc uniquement les consommations instantanées (qui ne sont pas affectées par le bug), et je les stocke dans un capteur virtuel de type "Electrique (instantané + Compteur)".
Sur ce capteur, j'utilisais l'option "Energy read : computed". La consommation en kWh était calculée par Domoticz.

Problème : pour de faibles consommations, l'énergie n'était pas comptabilisée, et le compteur de kWh restait à zéro.
J'ai donc modifié le capteur en "Energy read : from device".
Dans ce cas, je dois enregistrer la consommation en comptabilisant les kWh en fonction de la temporisation de lecture des Watts instantanés.

Par exemple, pour une temporisation d'une seconde :
Consommation en kWh = [Consommation en kWh de la seconde précédente] + [consommation instantanée x 1/3600]
Voila pourquoi j'ai besoin d'une variable qui contient la consommation en kWh de la seconde précédente.

J'ai toutefois réussi à conserver le mécanisme du script lua_parser en utilisant la commande

Code : Tout sélectionner

"http://127.0.0.1:8080/json.htm?type=command&param=updateuservariable&vname=ConsommationConsole&vtype=1&vvalue=" .. EnergiePrec + output.Puissance_Console * 1/3600
L'appel de la commande http est certainement plus lente qu'une mise à jour directe, mais ça marche :)...

A moins que tu aies une idée plus élégante ;) ?
NUC Celeron 1037U / Win 10 Pro
  • EcoCompteur Legrand
  • RFLink Nodo : capteurs T° Alecto / capteurs présence EV1527
  • Clef Sonoff Zigbee 3.0 : capteurs T° Sonoff / capteurs présence Lidl / Détecteurs fumée Heiman
  • BroadLink : pilotage clim
  • Shelly 1
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Impossible de mettre à jour une variable utilisateur

Message par Keros »

Tu pourrais arriver à le faire en LUA mais il te faut une uservariable, ton script et un widget virtuel que tu pourrais déclencher toutes les secondes via un deuxième script. C'est un peu lourd.

En DzVents, tu peux tout avoir dans un seul script : la fonction "historique", l'auto-lancement toutes les secondes, l'envoi des données dans ton widget. C'est un peu plus complexe.

Par contre, tu as un bon matériel ? Car si tu fais des appels toutes les secondes, ça risque de te manger pas mal de ressources PC et réseau.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
boum
Messages : 233
Inscription : 18 janv. 2019, 11:34
Localisation : France

Re: Impossible de mettre à jour une variable utilisateur

Message par boum »

@Aile,

Ok. Le truc que je ne comprends pas est comment tu récupères "EnergiePrec" dans ton script. Une deuxième requète json?

La méthode que je préconisais est si tu n'as qu'une seule valeur en sortie, sinon ça complique. Tu mets à jour un Custom Sensor virtuel (ou texte pour ne pas avoir d'historique).
Avec cette consommation instantanée, tu peux déclencher un script devices dzVent quelque soit la fréquence de changement.
Ce script peut récupérer facilement la consommation précédente, soit dans une variable utilisateur, soit dans un autre capteur et calculer la nouvelle consommation et appeler updateElectricity.
Dernière modification par Keros le 19 mai 2022, 12:45, modifié 1 fois.
Raison : Suppression de la citation
Domoticz v2022.2 sur linux-mint / Z-Wave-JS / RFXCom / Zigbee2MQTT
Aile
Messages : 157
Inscription : 27 janv. 2022, 12:18

Re: Impossible de mettre à jour une variable utilisateur

Message par Aile »

Alors, voici un script dans lua_parsers qui semble fonctionner.
Il faut que je patiente jusqu'à demain pour valider le bon enregistrement des kWh.

Code : Tout sélectionner

commandArray = {}

-- On appelle JSON pour décoder le texte donné par l'écocompteur à cette adresse http://ip.ecocompteur/Totaux.json --
	json = (loadfile "C:\\Program Files (x86)\\Domoticz\\scripts\\lua\\JSON.lua")()  -- Pour Windows
--  API call
	local config=assert(io.popen('curl "http://10.0.0.150/Totaux.json"')) -- ip de l'écocompteur
	local result = config:read('*a')
	config:close()
	output = json:decode(result)

function MajCompteur(Puissance,Variable,IndexVariable,IndexDevice)
	CommandeLecture = "http://127.0.0.1:8080/json.htm?type=command&param=getuservariable&idx=" .. IndexVariable
	local config=assert(io.popen('curl "' .. CommandeLecture .. '"'))
	local result = config:read('*a')
	config:close()
	Lecture = json:decode(result)
	EnergiePrec = Lecture.result[1].Value

	CommandeMAJ = "http://127.0.0.1:8080/json.htm?type=command&param=updateuservariable&vname=" .. Variable .. "&vtype=1&vvalue=" .. EnergiePrec + Puissance * 1/3600
	local config=assert(io.popen('curl "' .. CommandeMAJ .. '"'))
	local result = config:read('*a')
	config:close()
	MAJ = json:decode(result)

	Energie=EnergiePrec + Puissance * 1/3600
	domoticz_updateDevice(IndexDevice,'',Puissance .. ";" .. Energie)
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------

	MajCompteur(output.Puissance_Maison,"ConsommationMaison",1,1)
	MajCompteur(output.Puissance_PAC,"ConsommationPAC",2,2)
	MajCompteur(output.Puissance_Console,"ConsommationConsole",3,3)
	MajCompteur(output.Puissance_Cuisine,"ConsommationCuisine",4,4)
	MajCompteur(output.Puissance_Buanderie,"ConsommationBuanderie",5,5)

return commandArray
Pour ce qui est des performances, je suis sous Windows avec un nano-PC bien plus puissant qu'un Raspberry. Le service Domoticz utilise environ 3% des ressources du processeur.

Je ne sais pas manipuler les DzVents. Je débute :oops:...
NUC Celeron 1037U / Win 10 Pro
  • EcoCompteur Legrand
  • RFLink Nodo : capteurs T° Alecto / capteurs présence EV1527
  • Clef Sonoff Zigbee 3.0 : capteurs T° Sonoff / capteurs présence Lidl / Détecteurs fumée Heiman
  • BroadLink : pilotage clim
  • Shelly 1
Aile
Messages : 157
Inscription : 27 janv. 2022, 12:18

Re: Impossible de mettre à jour une variable utilisateur

Message par Aile »

boum a écrit : 18 mai 2022, 22:52 Ok. Le truc que je ne comprends pas est comment tu récupères "EnergiePrec" dans ton script. Une deuxième requète json?
Eh oui, pas moyen de faire autrement (voir mon script complet ci-dessus).
boum a écrit : 18 mai 2022, 22:52 La méthode que je préconisais est si tu n'as qu'une seule valeur en sortie, sinon ça complique. Tu mets à jour un Custom Sensor virtuel (ou texte pour ne pas avoir d'historique).
Avec cette consommation instantanée, tu peux déclencher un script devices dzVent quelque soit la fréquence de changement.
Ce script peut récupérer facilement la consommation précédente, soit dans une variable utilisateur, soit dans un autre capteur et calculer la nouvelle consommation et appeler updateElectricity.
Oui, il faudrait que je me penche sur cette méthode. Elle procurerait de meilleures performances ?
NUC Celeron 1037U / Win 10 Pro
  • EcoCompteur Legrand
  • RFLink Nodo : capteurs T° Alecto / capteurs présence EV1527
  • Clef Sonoff Zigbee 3.0 : capteurs T° Sonoff / capteurs présence Lidl / Détecteurs fumée Heiman
  • BroadLink : pilotage clim
  • Shelly 1
Répondre