Demande aide script capteur 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 <\>.
mulot35
Messages : 200
Inscription : 20 déc. 2014, 00:27

Demande aide script capteur virtuel

Message par mulot35 »

Salut,
J'essaye de finalisé mon tuto sur le rfx meter pour les compteurs d'eau a base d'info récupéré a droite a gauche ( viewtopic.php?f=7&t=692&p=5284#p5284 ).
je bute sur la finalité:
il me manque l'affichage sur un capteur virtuel de la conso des 30 dernière secondes (j'ai la conso cumulé)

pour faire simple:
- mon rfx me donne le nombre d'impulsion en 30secondes sur mon rfxcom.
- je recupére la valeur et incrémente un uservariable

Code : Tout sélectionner

--Real energy counter
energyCounter = 'Impulsion_eau'
--ID dummy energy meter
dummyEnergyMeterid = 161

--variables conso journee
userVariableLastCount = 'LastEnergyCount'

commandArray = {}
if devicechanged[energyCounter] then
        --calculate new actual value
        cumul = ((tonumber(otherdevices_svalues[energyCounter]) + tonumber(uservariables[userVariableLastCount])))

        --update dummy energy meter
        commandArray[1] = {['UpdateDevice'] = dummyEnergyMeterid .. "|0|" .. cumul .. ";" .. otherdevices_svalues[energyCounter]}

        --update user variables
        commandArray[2] = {['Variable:'..userVariableLastCount] = tostring((tonumber(otherdevices_svalues[energyCounter]) + tonumber(uservariables[userVariableLastCoun$

        print("Compteur eau: " .. cumul .. " L,dont " .. otherdevices_svalues[energyCounter] .. " L les dernieres 30sec")
end

return commandArray

Le log me donne:
2015-07-21 23:38:04.466 LUA: Compteur eau: 13 L,dont 4 L les dernieres 30sec
2015-07-21 23:38:04.475 EventSystem: Script event triggered: /home/pi/domoticz/scripts/lua/script_device_ActualEnergy.lua
et le compteur virtuel:
Image
qui devrai me dire la meme chose que le log

Edit:
C'est encore pire que ce que je pensé:
le lendemain la valeur du haut sur le capteur virtuel revient a 0 et celle du bas continu de s'incrémenté....

A votre bon coeur...
Dernière modification par mulot35 le 25 juil. 2015, 19:03, modifié 1 fois.
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Demande aide script capteur virtuel

Message par vil1driver »

Salut,

A tout hasard, essai d'ajouter un tonumber comme ceci...

Code : Tout sélectionner

commandArray[1] = {['UpdateDevice'] = dummyEnergyMeterid .. "|0|" .. cumul .. ";" .. tonumber(otherdevices_svalues[energyCounter])}
 
Sinon je te conseil le couple winscp notepad++ pour éditer le script car il me semble que tu fais tout dans un terminal,
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
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Demande aide script capteur virtuel

Message par vil1driver »

Tu n'aurais pas inversé cumule et instantané dans le commandArray ?
en tout cas pour ma conso de chauffage le cumule se trouve en dernier dans la commande..

Essai comme ça

Code : Tout sélectionner

commandArray[1] = {['UpdateDevice'] = dummyEnergyMeterid .. "|0|" .. tonumber(otherdevices_svalues[energyCounter]) .. ";" .. cumul}
 
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
mulot35
Messages : 200
Inscription : 20 déc. 2014, 00:27

Re: Demande aide script capteur virtuel

Message par mulot35 »

Merci j'essaye ca ce soir et je regarde comment il passe les 00h00.
Sinon je ne sais pas trop quel compteur virtuel mettre:
-P1 smart meter
-RFXmeter
-Incremental counter

Merci du coup de mains.
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Demande aide script capteur virtuel

Message par vil1driver »

je trouve bisard également la façon dont tu récupères la valeur de cumule mais bon c'est peut être moi...

Code : Tout sélectionner

otherdevices_svalues[energyCounter]
à croire que ton compteur ne contient qu'une info.
du coups la méthode pour y envoyer les infos ne doit pas être bonne..

pour mon chauffage je suis obligé de faire comme ceci pour récupérer l'instantané et le cumule du compteur virtuel

Code : Tout sélectionner

instant, cumule = string.match(otherdevices_svalues[conso], "(%d+%.*%d*);(%d+%.*%d*)")
j'ai choisi un compteur instant+compteur de type CM119 / CM160
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
mulot35
Messages : 200
Inscription : 20 déc. 2014, 00:27

Re: Demande aide script capteur virtuel

Message par mulot35 »

Salut,
Suite a tes conseils je suis reparti de t'on script de chauffage pour pondre le script ci dessous(notpad++ que du bonheur).
Mais franchement n'ayant jamais fait de programme du style il y a de subtilités qui m'échappe:
log

Code : Tout sélectionner

Error: EventSystem: ...i/domoticz/scripts/lua/script_device_virtual_CPT_eau.lua:37: attempt to compare number with nil
donc je pense qu'il faut que je convertisse ma valeur récupéré dans le capteur réel en chiffre lisible par la commande if.
le capteur

Code : Tout sélectionner

--Capteur physique
local Capt_impulsion = 'Compteur_impulsion'   -- nom du capteur physique de consommation d'eau
soit convertir

Code : Tout sélectionner

impulsionreel, poubellereel = string.match(otherdevices_svalues[Capt_impulsion], "(%d+%.*%d*);(%d+%.*%d*)")
pour que ce soit lisible par

Code : Tout sélectionner

 if ((impulsionreel > 0) and (impulsionreel < 7)) then

Code : Tout sélectionner

--Passer du rfxmeter arduino au capteur virtuel pour suivie conso
----------------
--Zone a editer
----------------
--Capteur physique
local Capt_impulsion = 'Compteur_impulsion'   -- nom du capteur physique de consommation d'eau
local Capt_impulsion_id = 157  -- idx du capteur physique de consommation d'eau
--Capteur virtuel
local Compt_virtuel_eau = 'Compteur_eau'   -- nom du compteur de consommation d'eau virtuel
local Compt_virtuel_eau_id = 160  -- idx du compteur de consommation d'eau virtuel
-----------------
--fin de la zone a editer
-----------------

commandArray = {}

-----------------
--Récuperer le nombre d'impulsion des 30 dernières secondes
-----------------

--Pour le capteur physique:
impulsionreel, poubellereel = string.match(otherdevices_svalues[Capt_impulsion], "(%d+%.*%d*);(%d+%.*%d*)")
--Pour le capteur virtuel:
impulsionvirt, cumulvirt = string.match(otherdevices_svalues[Compt_virtuel_eau], "(%d+%.*%d*);(%d+%.*%d*)")

-----------------
--Programme
-----------------

--Si le compteur impulsion est mis a jour
if devicechanged[Capt_impulsion] then
else

-----------------

--Si le capteur reel indique un nombre d'impulsion supérieur a 0 et inferieur a 7 (1,2,3,4,5,6)
     if ((impulsionreel > 0) and (impulsionreel < 7)) then --ligne37
--Addition l'impulsion recu au cumul actuel
     newcumul = tonumber(impulsionreel) + tonumber(cumulvirt)
--ecrit dans le capteur virtuel la conso instantanee du capteur a impulsion et aussi le cumulé
     commandArray['UpdateDevice'] = Compt_virtuel_eau_id .. '|0|' .. tonumber(impulsionreel) .. ';' .. newcumul

-----------------

--Si le capteur reel indique 0 impulsion--
     elseif (impulsionreel == 0) then
--ecrit dans le capteur virtuel une conso instantanee de 0 et le dernier cumul en memoire du capteur virtuel
     commandArray['UpdateDevice'] = Compt_virtuel_eau_id .. '|0|' .. 0 .. ';' .. cumulvirt

-----------------

--Si le compteur a impuslion indique plus de 6 impulsions-- (30sec(temps entre deux communications)/5sec(temps entre deux impulsions)=6 maxi) (7,8,9,...)
     elseif (impulsionreel > 6) then
--ecrit dans le capteur virtuel une conso instantanee de 0 et le dernier cumul en memoire du capteur virtuel
     commandArray['UpdateDevice'] = Compt_virtuel_eau_id .. '|0|' .. 0 .. ';' .. cumulvirt

-----------------
    end
end
-----------------

return commandArray	  
Le code me parait pas mal sinon je pense que ca devrai limité ou supprimé tout beug...
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.
mulot35
Messages : 200
Inscription : 20 déc. 2014, 00:27

Re: Demande aide script capteur virtuel

Message par mulot35 »

ca avance
Mr domoticz me dit

Code : Tout sélectionner

 Error: EventSystem: ...i/domoticz/scripts/lua/script_device_virtual_CPT_eau.lua:36: attempt to compare number with string
La 36 et marqué

Code : Tout sélectionner

--Passer du rfxmeter arduino au capteur virtuel pour suivie conso
----------------
--Zone a editer
----------------
--Capteur physique
local Capt_impulsion = 'Compteur_impulsion'   -- nom du capteur physique de consommation d'eau
local Capt_impulsion_id = 157  -- idx du capteur physique de consommation d'eau
--Capteur virtuel
local Compt_virtuel_eau = 'Compteur_eau'   -- nom du compteur de consommation d'eau virtuel
local Compt_virtuel_eau_id = 160  -- idx du compteur de consommation d'eau virtuel
-----------------
--fin de la zone a editer
-----------------

commandArray = {}

-----------------
--Récuperer le nombre d'impulsion des 30 dernières secondes
-----------------

--Pour le capteur physique:
impulsionreel, poubellereel = string.match(otherdevices_svalues[Capt_impulsion], "(%d+%.*%d*);(%d+%.*%d*)")
--Pour le capteur virtuel:
impulsionvirt, cumulvirt = string.match(otherdevices_svalues[Compt_virtuel_eau], "(%d+%.*%d*);(%d+%.*%d*)")

-----------------
--Programme
-----------------

--Si le compteur impulsion est mis a jour
if devicechanged[Capt_impulsion] then

-----------------

--Si le capteur reel indique un nombre d'impulsion supérieur a 0 et inferieur a 7 (1,2,3,4,5,6)
     if (((tostring(impulsionreel)) > 0) and (tostring(impulsionreel)) < 7) then    -->>>>>36
--Addition l'impulsion recu au cumul actuel
     newcumul = tonumber(impulsionreel) + tonumber(cumulvirt)
--ecrit dans le capteur virtuel la conso instantanee du capteur a impulsion et aussi le cumulé
     commandArray['UpdateDevice'] = Compt_virtuel_eau_id .. '|0|' .. tonumber(impulsionreel) .. ';' .. newcumul

-----------------

--Si le capteur reel indique 0 impulsion--
     elseif ((tostring(impulsionreel)) == 0) then
--ecrit dans le capteur virtuel une conso instantanee de 0 et le dernier cumul en memoire du capteur virtuel
     commandArray['UpdateDevice'] = Compt_virtuel_eau_id .. '|0|' .. 0 .. ';' .. cumulvirt

-----------------

--Si le compteur a impuslion indique plus de 6 impulsions-- (30sec(temps entre deux communications)/5sec(temps entre deux impulsions)=6 maxi) (7,8,9,...)
     elseif ((tostring(impulsionreel)) > 6) then
--ecrit dans le capteur virtuel une conso instantanee de 0 et le dernier cumul en memoire du capteur virtuel
     commandArray['UpdateDevice'] = Compt_virtuel_eau_id .. '|0|' .. 0 .. ';' .. cumulvirt

-----------------
end
end
-----------------

return commandArray	  
Il aime vraiment pas la comparaison entre la valeur du capteur et les chiffres.
Une idée?
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Demande aide script capteur virtuel

Message par vil1driver »

tonumber() permet de transformer une valeur récupérée sous forme de chaîne en nombre,
nombre que tu pourras en suite comparer à un autre..

Exemple

local test = "5"
test = tonumber(test)

Reviens à

local test = 5

La fonction inverse est tostring()
Indispensable par exemple pour mettre à jour une variable utilisateur..

Donc dans ta ligne 36, remplaces les tostring par tonumber
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
mulot35
Messages : 200
Inscription : 20 déc. 2014, 00:27

Re: Demande aide script capteur virtuel

Message par mulot35 »

Je te remercie pour ton aide les capteurs gaz / eau etc son vraiment différent des capteurs elect
J'ai suivie t'es consignes pour passé du capteur a impulsion a un capteur energy cm119 ca donne vraiment bien les unité ne sont pas correct (kwh watt) et l'instantané graphique doit prendre en compte le temps je pense mais ce qui est ecrit sur le widget est parfait.
pour le fun si ca peut aider quelqu'un *

Code : Tout sélectionner

--Passer du rfxmeter arduino au capteur virtuel pour suivie conso
----------------
--Zone a editer
----------------
--Capteur physique
local Capt_impulsion = 'Compteur_impulsion'   -- nom du capteur physique de consommation d'eau
local Capt_impulsion_id = 157  -- idx du capteur physique de consommation d'eau
--Capteur virtuel
local Compt_virtuel_eau = 'Compteur_eau_en_m3'   -- nom du compteur de consommation d'eau virtuel
local Compt_virtuel_eau_id = 159  -- idx du compteur de consommation d'eau virtuel
--Uservariable trop de comptage
userVariableerreurcompteurdeau = 'Erreur_de_comptage_compteur_d_eau'
--comptage maximum sur 30sec (voir script arduino)
local cptmaxi = 5

-----------------
--fin de la zone a editer
-----------------

commandArray = {}

-----------------
--Programme
-----------------


--Si le compteur impulsion est mis a jour
if devicechanged[Capt_impulsion] then

-----------------

--Si le capteur reel indique un nombre d'impulsion supérieur a 0 et inferieur a 7 (1,2,3,4,5,6)
     if (((tonumber(otherdevices_svalues[Capt_impulsion])) > 0) and ((tonumber(otherdevices_svalues[Capt_impulsion])) < (tonumber((30 / cptmaxi)) + 1))) then
	 --Division du comptage pour avoir de mètre 3
	 local impulsionmill = (tonumber(otherdevices_svalues[Capt_impulsion]))
	 --On recupère la valeur du cumul virtuel
	  impulsionvirt, cumulvirt = string.match(otherdevices_svalues[Compt_virtuel_eau], "(%d+%.*%d*);(%d+%.*%d*)")
--Addition l'impulsion recu au cumul actuel
     newcumul = tonumber(impulsionmill) + tonumber(cumulvirt)
--ecrit dans le capteur virtuel la conso instantanee du capteur a impulsion et aussi le cumulé
     commandArray['UpdateDevice'] = Compt_virtuel_eau_id .. '|0|' .. tonumber(impulsionmill) .. ';' .. newcumul
	 print("Compteur eau entre 0 et 6 impulsions: " .. newcumul .. " L consommé(s) aujourd'hui,dont " .. tonumber(impulsionmill) .. " L les dernieres 30sec" )

-----------------

--Si le capteur reel indique 0 impulsion--
     elseif ((tonumber(otherdevices_svalues[Capt_impulsion])) == 0) then
	 --On recupère la valeur du cumul du capteur virtuel
	 impulsionvirt, cumulvirt = string.match(otherdevices_svalues[Compt_virtuel_eau], "(%d+%.*%d*);(%d+%.*%d*)")
--ecrit dans le capteur virtuel une conso instantanee de 0 et le dernier cumul en memoire du capteur virtuel
     commandArray['UpdateDevice'] = Compt_virtuel_eau_id .. '|0|' .. 0 .. ';' .. cumulvirt
	print("Compteur eau a 0 impulsion: " .. cumulvirt .. " L consommé(s) aujourd'hui." )
	
-----------------

--Si le compteur a impuslion indique plus de 6 impulsions-- (30sec(temps entre deux communications)/5sec(temps entre deux impulsions)=6 maxi) (7,8,9,...)
     elseif ((tonumber(otherdevices_svalues[Capt_impulsion])) > (tonumber(30 / cptmaxi ))) then
	 --On recupère la valeur du cumul du capteur virtuel
	 impulsionvirt, cumulvirt = string.match(otherdevices_svalues[Compt_virtuel_eau], "(%d+%.*%d*);(%d+%.*%d*)")
--ecrit dans le capteur virtuel une conso instantanee de 0 et le dernier cumul en memoire du capteur virtuel
     commandArray['UpdateDevice'] = Compt_virtuel_eau_id .. '|0|' .. 0 .. ';' .. cumulvirt
	 commandArray['Variable:'..userVariableerreurcompteurdeau] = (tonumber(uservariables[userVariableerreurcompteurdeau]) + 1)
     print("superieur a 6 impulsions = erreur de comptage uservariable actualisé")
	 
-----------------
    end
end
-----------------

return commandArray	  
Malgrès que je vais essayer de passer sur un graphique type téléinfo le script définitif pour alimenter le rfxmeter virtuel est dispo dans le tuto:
viewtopic.php?f=7&t=692&p=5284#p5284
(j'été loin du compte.....)
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.
Répondre