Mise à jour d'un compteur d'eau incrémental virtuel

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 <\>.
baboun2807
Messages : 40
Inscription : 30 déc. 2015, 23:43

Mise à jour d'un compteur d'eau incrémental virtuel

Message par baboun2807 »

Bonsoir,

Je sollicite votre aide pour résoudre le problème suivant.

Situation
Grâce à un compteur d'eau à impulsion relié à mon ECO DEVICE, je peux suivre ma consommation d'eau via l'ECO DEVICE.

L'ECO DEVICE donne la consommation en L du jour, cette valeur s'actualise en permanence tout au long de la journée en fonction de l'eau consommé; l'ECO DEVICE donne aussi l'index compteur en M3: cela correspond au total consommé depuis le branchement du compteur à impulsions sur l'ECO DEVICE

Souhaitant remonter les informations relatives à ma consommation d'eau dans DOMOTICZ, je me suis mis à la recherche d'un script pouvant faire cela.
L'idée étant de les stocker dans un compteur incrémental:
Compteur incrémental.jpg
Compteur incrémental.jpg (22.64 Kio) Consulté 12257 fois
Après quelques recherches, j'ai adapté le script time ci-dessous. Le script interroge le fichier XML généré par l'ECO DEVICE, enregistre le fichier XML et va récupérer dedans la conso du jour et l'index.

Code : Tout sélectionner

-- this script reads the ecodevice xml file and uploads current data to virtual device


commandArray = {}
--IDX du Compteur EAU dans Domoticz
local idx = 186  -- idx du compteur d'eau incrémental virtuel dans domoticz
-- IP EcoDevice :
os.execute('wget http://192.168.1.30:80/status.xml -O /home/pi/domoticz/scripts/lua/water.xml')

local filename = "/home/pi/domoticz/scripts/lua/water.xml"

local line = ''
local waterdata_l =0
local waterdata_m3 =0


for line in io.lines(filename) do
   if string.find(line,"<c0day>") then
      waterdata_l=line 
	   	 	  
 end

   if string.find(line,"<count0>") then
      waterdata_m3=line
	  	  	   	  
   end
end

print('[ECODEVICE] -- COMPTEUR EAU --')

print("Compteur eau a impulsion: " .. waterdata_l .. " L consommé(s) aujourd'hui." )
commandArray['Variable:water_L'] = tostring(waterdata_l)

print("Index eau a impulsion: " .. waterdata_m3 .. " m3 consommé(s)depuis la pose du compteur." )
commandArray['Variable:water_m3'] = tostring(waterdata_m3)

commandArray['UpdateDevice'] = idx .. "|0|" .. 0 .. ";".. tostring(uservariables['water_m3']) .. ";" .. tostring(uservariables['water_L'])


return commandArray
Le script ne provoque pas d'erreur visible dans les LOG mais mon compteur n'évolue pas..... La dernière ligne du code je la comprends comme cela (suis-je bon?):
conso instantanée=0 (je la mets volontairement à 0)
conso depuis le début en M3
conso du jour en M3

Par ailleurs, j'ai un souci avec waterdata_m3.
Dans le fichier XML, la valeur de l'index (qui se présente sous la forme X,XXX dans l'ECO DEVICE) ne comprend plus la virgule. Pour résoudre cela, je voulais divisier par 1000 en utilisant tonumber(waterdata_m3) mais le sys me renvoit systématiquement "attempt to perform arithmetic on a nil value"

Enfin même élément avec waterdata_l. Il faudrait que je multiplie par 0,001 pour transformer cela en m3 pour "coller" au format du compteur incrémental mais là également, même avec tonumber impossible de réaliser l'opération.

Quelqu'un pourrait-il m'aider?

Par avance je vous remercie.
Domoticz sur Raspberry Pi 2/ ECO DEVICE / compteur d'eau à impulsion / Plusieurs sondes Oregon / Chacon ON/OFF encastrable CH54555 ou CH54755
baboun2807
Messages : 40
Inscription : 30 déc. 2015, 23:43

Re: Mise à jour d'un compteur d'eau incrémental virtuel

Message par baboun2807 »

Je mets ci dessous ce qui apparaît dans les log
log.jpg
log.jpg (22.23 Kio) Consulté 12251 fois
Pour l'index eau à impulsion est affichée 2418; c'est en fait 2,418 qu'il faut mais je n'arrive pas à faire la divsion par mille.

Ce que je ne comprends pas c'est que la valeur 2418 apparaît bien dans les log; donc en faisant tonumber et ensuite en divisant par 1000, cela devrait être bon. Mais ce n'est pas le cas. Quand je fais tonumber, il renvoie nil value. Je ne vois pas où est l'erreur.

Plus largement le script tourne mais le compteur n'évolue pas. Je précise que j'ai redémarré DOMOTICZ mais cela ne change rien.
Domoticz sur Raspberry Pi 2/ ECO DEVICE / compteur d'eau à impulsion / Plusieurs sondes Oregon / Chacon ON/OFF encastrable CH54555 ou CH54755
patrice
Messages : 1720
Inscription : 22 sept. 2014, 21:51

Re: Mise à jour d'un compteur d'eau incrémental virtuel

Message par patrice »

bonsoir

je n'ai pas le temps de tout lire mais n'est ce pas un probleme de litres/m3
https://easydomoticz.com/traduction-fra ... /#compteur
Raspberry pi 3, Dongle RfxCom et Zigate +, plugin de pipiche, Volets Roulants profalux, contrôle d'éclairage, détecteurs de présence, alarme incendie, pilotage livebox ...
Objectif : WAF > 1
baboun2807
Messages : 40
Inscription : 30 déc. 2015, 23:43

Re: Mise à jour d'un compteur d'eau incrémental virtuel

Message par baboun2807 »

Bonjour,

I need some help.....

Personne n'a d'idée? Cela serait mon cadeau de Noel..... ;)
Domoticz sur Raspberry Pi 2/ ECO DEVICE / compteur d'eau à impulsion / Plusieurs sondes Oregon / Chacon ON/OFF encastrable CH54555 ou CH54755
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Mise à jour d'un compteur d'eau incrémental virtuel

Message par vil1driver »

salut,

il faut bien comprendre que les comandArray ne sont exécuté qu'à la toute fin du script

donc passer un nombre dans une variable ne sera effectué qu'à la fin du script, tu ne pouras donc utiliser cette variable (mise à jour) qu'au lancement suivant, dans ton script tu la réutilises aussitôt ce qui n'est pas bon

ps : une variable utilisateur est toujours retournée sous forme de chaîne donc le tostring est inutile.

ton script
lit la variable, utilise cette valeur pour la passer à ton compteur, puis mets à jour cette variable
et ainsi de suite..
ton compteur ne profite jamais de la bonne valeur.
bon ça n'explique pas pourquoi il reste à zero :(

est ce vraiment la bonne commande pour le mettre à jour ??? :?
car ce n'est pas parcequ'il affiche 3 champs que l'on peut lui envoyer 3 infos !
certains sont des calculs internes au compteur..
que donne ceci ?

Code : Tout sélectionner

commandArray['UpdateDevice'] = idx .. "|0|5;10;20"
et ceci ?

Code : Tout sélectionner

commandArray['UpdateDevice'] = idx .. "|0|5"
ton compteur ne devait prendre en compte que la valeur zero de ta commande.. voila pourquoi il restait à zero en affichant pourtant avoir bien pris la mise à jour (cf lastseen)

maintenant méfiance car il s'agit d'un compteur incrémental donc il y à fort à parier qu'il addition toutes les valeurs que tu vas lui soumettre..
est ce un bon choix de compteur ??

sinon je ne comprends pas trop à quoi te servent ces variables ??
on ne les utilise que pour mémoriser une valeur lorsque l'on souhaite y avoir recours au lancement suivant,
mais dans ton cas les valeurs sont dans l'xml donc pas vraiment utile d'avoir la valeur précédente ?
pourquoi ne pas simplement faire ceci

Code : Tout sélectionner

commandArray['UpdateDevice'] = idx .. "|0| ".. tonumber(waterdata_l/1000)

multiplier par 0,001 équivaut à diviser par 1000 hein ;)

ce script devrait donc être suffisant

Code : Tout sélectionner

-- this script reads the ecodevice xml file and uploads current data to virtual device


commandArray = {}
--IDX du Compteur EAU dans Domoticz
local idx = 186  -- idx du compteur d'eau incrémental virtuel dans domoticz
-- IP EcoDevice :
os.execute('wget http://192.168.1.30:80/status.xml -O /home/pi/domoticz/scripts/lua/water.xml')

local filename = "/home/pi/domoticz/scripts/lua/water.xml"

local line = ''
local waterdata_l =0
local waterdata_m3 =0


for line in io.lines(filename) do
   if string.find(line,"<c0day>") then
      waterdata_l=line 
               
 end

   if string.find(line,"<count0>") then
      waterdata_m3=line
                     
   end
end

print('[ECODEVICE] -- COMPTEUR EAU --')

print("Compteur eau a impulsion: " .. waterdata_l .. " L consommé(s) aujourd'hui." )
print("Index eau a impulsion: " .. tonumber(waterdata_m3/100) .. " m3 consommé(s)depuis la pose du compteur." )

commandArray['UpdateDevice'] = idx .. "|0| ".. tonumber(waterdata_l/1000)


return commandArray
j'ai supprimé les tostring car je subodore que tes valeurs sont déjà des chaînes mais ça se vérifie

ajoute cette fonction en début de script

Code : Tout sélectionner

-- get type of variable
function typeof(var)
    local _type = type(var);
    if(_type ~= "table" and _type ~= "userdata") then
        return _type;
    end
    local _meta = getmetatable(var);
    if(_meta ~= nil and _meta._NAME ~= nil) then
        return _meta._NAME;
    else
        return _type;
    end
end
puis teste ainsi

Code : Tout sélectionner

print("waterdata_m3 : "..typeof(waterdata_m3))
bonne digestion et joyeux noël ;)


ps : dans la page de logs de domoticz tu peux surligner le texte et faire un clic droit > copier ;) ne t'embêtes pas à imprimer l'écran
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
baboun2807
Messages : 40
Inscription : 30 déc. 2015, 23:43

Re: Mise à jour d'un compteur d'eau incrémental virtuel

Message par baboun2807 »

Bonjour

Je te remercie pour ces éléments

Je regarde cela dès que possible.

Merci bcp :D
Domoticz sur Raspberry Pi 2/ ECO DEVICE / compteur d'eau à impulsion / Plusieurs sondes Oregon / Chacon ON/OFF encastrable CH54555 ou CH54755
baboun2807
Messages : 40
Inscription : 30 déc. 2015, 23:43

Re: Mise à jour d'un compteur d'eau incrémental virtuel

Message par baboun2807 »

Bonsoir vil1driver

J'ai regardé ce que tu m'as répondu .... mais je n'avance guère.... :(

waterdata_l et waterdata_m3 sont bien des chaînes; néanmoins quand je leur applique tonumber pour les transformer en nombre, le log me renvoie "attempt to perform arithmetic on a nil value"..... je ne comprends pas pourquoi

Ensuite je suis en train de me rendre compte que le script ne va surement pas.....

Ce que je souhaite:

lire la valeur volume d'eau consommé aujourd'hui qui est dans le fichier XML qui se met à jour toutes les minutes, la garder en mémoire; à la lecture suivante, relire le volume d'eau consommé aujourd'hui, faire la soustraction avec la valeur de la minute précédente et envoyer cette valeur au compteur.

Au final je m'y perds, je ne sais pas trop comment procéder (je ne maîtrise pas vraiment la programmation) et je ne sais pas en particulier quel type de compteur prendre.

Si tu as un peu de temps à perdre, je suis preneur.... :) Joyeux Noel!
Domoticz sur Raspberry Pi 2/ ECO DEVICE / compteur d'eau à impulsion / Plusieurs sondes Oregon / Chacon ON/OFF encastrable CH54555 ou CH54755
osa64
Messages : 9
Inscription : 07 sept. 2015, 14:16

Re: Mise à jour d'un compteur d'eau incrémental virtuel

Message par osa64 »

Bonjour,
Tu n'aurais pas un caractère "exotique" (espace, tab, RC, ...) dans ta chaine ? Récupère et affiche dans les log la longueur de ta chaine.
cdt,
PI2
GPIO Module
RFXCom-USB / DIO / Oregon Th
Stick USB ZWave / Fibaro WallPlug / GreenWave 6 sockets
USB300 / PTM210 / Switch Module ... enfin peut-être ...
baboun2807
Messages : 40
Inscription : 30 déc. 2015, 23:43

Re: Mise à jour d'un compteur d'eau incrémental virtuel

Message par baboun2807 »

Bonsoir,

Grace à cette remarque j'ai trouvé le souci; string.len et string.sub m'ont sauvé!

Merci!
Domoticz sur Raspberry Pi 2/ ECO DEVICE / compteur d'eau à impulsion / Plusieurs sondes Oregon / Chacon ON/OFF encastrable CH54555 ou CH54755
jec_44
Messages : 16
Inscription : 09 déc. 2015, 11:29

Re: Mise à jour d'un compteur d'eau incrémental virtuel

Message par jec_44 »

Salut baboun2807

As tu le script en entier, car j'ai le même soucis que toi, je tourne en rond depuis des semaine pour mettre à jour mon device !

Merci pour ton aide
Raspberry PI / Domoticz version stable / Sondes Oregon / Freebox / Harmony Companion / Synology DS215J / Fibaro / Dlink / Di-o / Philips Hue
Répondre