Page 1 sur 2

Impossible de mettre à jour une variable utilisateur

Publié : 18 mai 2022, 11:16
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é 1427 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é 1427 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 ;) ?

Re: Impossible de mettre à jour une variable utilisateur

Publié : 18 mai 2022, 12:41
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.

Re: Impossible de mettre à jour une variable utilisateur

Publié : 18 mai 2022, 14:57
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é 1402 fois

Re: Impossible de mettre à jour une variable utilisateur

Publié : 18 mai 2022, 15:44
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)

Re: Impossible de mettre à jour une variable utilisateur

Publié : 18 mai 2022, 21:14
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.

Re: Impossible de mettre à jour une variable utilisateur

Publié : 18 mai 2022, 21:21
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 ;) ?

Re: Impossible de mettre à jour une variable utilisateur

Publié : 18 mai 2022, 21:46
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.

Re: Impossible de mettre à jour une variable utilisateur

Publié : 18 mai 2022, 22:52
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.

Re: Impossible de mettre à jour une variable utilisateur

Publié : 18 mai 2022, 22:57
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:...

Re: Impossible de mettre à jour une variable utilisateur

Publié : 18 mai 2022, 23:04
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 ?