Page 1 sur 1

Demande aide script capteur virtuel

Publié : 21 juil. 2015, 23:52
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...

Re: Demande aide script capteur virtuel

Publié : 22 juil. 2015, 01:40
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,

Re: Demande aide script capteur virtuel

Publié : 22 juil. 2015, 18:47
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}
 

Re: Demande aide script capteur virtuel

Publié : 22 juil. 2015, 21:38
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.

Re: Demande aide script capteur virtuel

Publié : 22 juil. 2015, 21:45
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

Re: Demande aide script capteur virtuel

Publié : 23 juil. 2015, 22:09
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...

Re: Demande aide script capteur virtuel

Publié : 23 juil. 2015, 22:52
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?

Re: Demande aide script capteur virtuel

Publié : 24 juil. 2015, 00:51
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

Re: Demande aide script capteur virtuel

Publié : 25 juil. 2015, 14:09
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.....)