Incrémenter un compteur virtuel de consommation

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 <\>.
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

Incrémenter un compteur virtuel de consommation

Message par garycooper »

Bonjour, j'avais adapté il y a quelques temps un script que j'avais trouvé ici. Ce script permet de calculer la consommation de mes radiateurs. A cette consommation, je voudrais à présent additionner la consommation de mon chauffe-eau. Je n'arrive pas à trouver comment ajouter cette consommation. La notion de table me perturbe et je n'arrive pas à incrémenter la consommation d'un appareil qui ne commence pas par "radiateur". J'ai donc essayé de déclarer des noms (local CE, local wattCE ...) mais je ne sais pas comment faire calculer la consommation du chauffe-eau et surtout l'additionner à celles des autres radiateurs.

Code : Tout sélectionner

--[[ 

Type:          time
Name:          Consommation chauffage

NOTA : Ce script est volontairement tres verbeux afin d'avoir dans les logs le statut de chaque radiateur
(toutes les minutes !). On peut l eviter en initialisant la variable 'verbose' a false.  
Sinon, il est fortement conseille de commenter l option log de domoticz (dans domoticz.sh) afin de ne pas 
saturer l espace de stockage  par un fichier log trop important
--]]
 
----------------------------------------------
------          Configuration          ------
----------------------------------------------
local piece={}     -- Tableau Rajouter ici les radiateurs 
	piece['0']='chambre enfants'
	piece['1']='chambre parents'
	piece['2']='salon'
	piece['3']='cuisine'
	piece['4']='entree'
	piece['5']='SdB'

local CE='Chauffe eau'  -- Switch chauffe eau

local watt={}     -- Tableau Rajouter ici la puissance en watts du radiateur (L'index doit correspondre a celui de la piece ci-dessus)
	watt['0']='1500'
	watt['1']='1250'
	watt['2']='1000'
	watt['3']='1500'
	watt['4']='500'
	watt['5']='1000'

local wattCE='3000'   -- Puissance chauffe eau

local conso = 'Conso chauffage'         	-- nom du capteur virtuel de consommation électrique (type= instant + counter)
local conso_id = 37                	  	-- idx du capteur virtuel de consommation électrique
local reset = false                     	-- force la mise à zero de la consommation instantanée (laisser à false pour un fonctionnement normal) true/false
local hysteresis = 0.4 				-- Valeur seuil pour éviter que le relais ne cesse de commuter dans les 2 sens
local debugging = false 	                -- true or false pour voir tous les messages debug dans le log
local verbose = false				-- Print ou non des logs


-- domoticz
local url = 'xxxxx:yyyyy@192.168.1.10:8080'         	-- user:pass@ip:port de domoticz, pour la création des variables

local status = 0

local cumul_power = 0   			-- initialisation de la puissance instantanee des radiateurs en fonctionnement
----------------------------------------------
--       Fin de la partie configuration       --
----------------------------------------------

function timedifference(d)
   s = otherdevices_lastupdate[d]
   year = string.sub(s, 1, 4)
   month = string.sub(s, 6, 7)
   day = string.sub(s, 9, 10)
   hour = string.sub(s, 12, 13)
   minutes = string.sub(s, 15, 16)
   seconds = string.sub(s, 18, 19)
   t1 = os.time()
   t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
   difference = os.difftime (t1, t2)
   return difference
end


commandArray = {}

for key, valeur in pairs(piece) do
	-- Maj des variables en fonction de la valeur de la table 
	local le_radiateur_est_sur_ON = false      -- Etat du radiateur false ou true
  	local radiateur = string.format("%s%s", "Radiateur ", valeur)       -- Nom de l'interrupteur de chauffage
	log1 = '***'
	log2 = '***'
	
	local heure = string.sub(os.date("%X"), 1, 5)	-- Recuperation de l'heure du systeme
		
	puissance=tonumber(watt[key])  -- Puissance en watt du radiateur
	puissanceCE=tonumber(wattCE)   -- Puissance en watt du chauffe eau


	if (debugging) then print ('>>>>>>>>>>>>>>>Initialisation '..puissance..' Radiateur>'..valeur) end


----------------------------------------------
--  Inititialisation des Variables d etat  --
----------------------------------------------

	if (otherdevices[radiateur] == 'On') then le_radiateur_est_sur_ON = true end 

----------------------------------------------------
------        Calcul de la consommation       ------
------      de l'ensemble des radiateurs      ------
----------------------------------------------------
   
	if (le_radiateur_est_sur_ON) then
		log1 = '*** IF 1 >                        Le Radiateur est en marche'
		status = 1
	else
		log1 = '*** IF 3 >                 Le Radiateur est arrete'
		status = 0
	end
		
	  -- calcul de la conso (npower = puissance actuelle / energy = puissance cumulee)

		npower, energy = string.match(otherdevices_svalues[conso], "(%d+%.*%d*);(%d+%.*%d*)") -- extraction des valeurs stockees dans le device conso
	
		if (status == 1) then  -- le radiateur est allume
			cumul_power = tonumber(cumul_power + puissance)
			energy = tonumber(energy + (puissance / 60))   -- puissance journaliere cumulee 
		else                   -- Le radiateur est eteint
			energy = tonumber(energy)
		end   
		
			power = tonumber(cumul_power)                  -- puissance instantanee 
			
   -- envoi de la conso dans le capteur virtuel d'énergie

   if (reset) then
	power = 0
	energy = 0
   end   
   	commandArray[#commandArray + 1]={['UpdateDevice'] = conso_id .. '|0|' .. power .. ';' .. energy}

end -- fin de tableau
return commandArray
ogulf
Messages : 445
Inscription : 15 juin 2017, 14:41

Re: Incrémenter un compteur virtuel de consommation

Message par ogulf »

Tu as un switch qui commande le On/Off de ton chauffe-eau ?
Domoticz Stable sur RPi3 + RFPlayer + ZWave+ + RFLink R48 :
- 11 x RF660P
- 1 x FGSD-002
- 10 x F007TH
- 5 x Emcoluxr EV1527 + 4 x NAS-DS01Z
- 4 x NAS-PD02Z
- 1 x Shelly 1PM
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

Re: Incrémenter un compteur virtuel de consommation

Message par garycooper »

Oui, en fait j'ai un relais qui commande le contacteur du chauffe-eau (la puissance consommée par le chauffe-eau ne passe pas par le relais). Du coup j'ai un switch on/off dans Domoticz.
ogulf
Messages : 445
Inscription : 15 juin 2017, 14:41

Re: Incrémenter un compteur virtuel de consommation

Message par ogulf »

Rajoute-le dans les 2 tableaux du débu, MAIS.... il FAUT que ton switch On/Off commence par "Radiateur " puisque le script rajoute ce terme devant la variable piece[key]

Donc :
piece['6']='chauffe-eau'
watt['6']='2400' (la puissance max de ton chauffe-eau)

Et ton switch On/Off doit s'appeler 'Radiateur chauffe-eau'....

Si ça marche, tu modifies légèrement le script pour déporter le 'Radiateur ' dans le tableau piece, et tu supprimes la ligne qui rajoute 'Radiateur ' devant piece[key]
Domoticz Stable sur RPi3 + RFPlayer + ZWave+ + RFLink R48 :
- 11 x RF660P
- 1 x FGSD-002
- 10 x F007TH
- 5 x Emcoluxr EV1527 + 4 x NAS-DS01Z
- 4 x NAS-PD02Z
- 1 x Shelly 1PM
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

Re: Incrémenter un compteur virtuel de consommation

Message par garycooper »

J'ai effectivement tenté cette stratégie hier soir (qui me paraît la plus simple) mais je suis planté à cause de cette ligne :

Code : Tout sélectionner

local radiateur = string.format("%s%s", "Radiateur ", valeur)
J'ai essayé d'enlever " , "Radiateur "" mais sans succès. Il doit falloir le remplacer par quelque chose, mais quoi ?
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Incrémenter un compteur virtuel de consommation

Message par Keros »

En fait, cette ligne génère le nom des dispositifs à partir des variables.

Par exemple, pour la première boucle, il va concaténer "Radiateur " et 'chambre enfants' (la valeur de pièce['0'])

D'où la remarque
ogulf a écrit : 07 déc. 2021, 18:24 Et ton switch On/Off doit s'appeler 'Radiateur chauffe-eau'....
et si tu souhaites que ce soit plus lisible :
ogulf a écrit : 07 déc. 2021, 18:24 Si ça marche, tu modifies légèrement le script pour déporter le 'Radiateur ' dans le tableau piece, et tu supprimes la ligne qui rajoute 'Radiateur ' devant piece[key]
Mais remets-nous ton script (pour qu'on voit où tu en est) et aussi le log d'erreur (pour qu'on puisse analyser).
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
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

Re: Incrémenter un compteur virtuel de consommation

Message par garycooper »

Alors, avec vos conseils, j'ai modifié mon script comme ça (j'ai commenté la ligne de "local radiateur") :

Code : Tout sélectionner

--[[ 

Type:          time
Name:          Consommation chauffage

NOTA : Ce script est volontairement tres verbeux afin d'avoir dans les logs le statut de chaque radiateur
(toutes les minutes !). On peut l eviter en initialisant la variable 'verbose' a false.  
Sinon, il est fortement conseille de commenter l option log de domoticz (dans domoticz.sh) afin de ne pas 
saturer l espace de stockage  par un fichier log trop important
--]]
 
----------------------------------------------
------          Configuration          ------
----------------------------------------------
local piece={}     -- Tableau Rajouter ici les radiateurs 
	piece['0']='Radiateur chambre enfants'
	piece['1']='Radiateur chambre parents'
	piece['2']='Radiateur salon'
	piece['3']='Radiateur cuisine'
	piece['4']='Radiateur entree'
	piece['5']='Radiateur SdB'
	piece['6']='Chauffe eau'


local watt={}     -- Tableau Rajouter ici la puissance en watts du radiateur (L'index doit correspondre a celui de la piece ci-dessus)
	watt['0']='1500'
	watt['1']='1250'
	watt['2']='1000'
	watt['3']='1500'
	watt['4']='500'
	watt['5']='1000'
	watt['6']='3000'

local conso = 'Conso chauffage'         	-- nom du capteur virtuel de consommation électrique (type= instant + counter)
local conso_id = 37                	  	-- idx du capteur virtuel de consommation électrique
local reset = false                     	-- force la mise à zero de la consommation instantanée (laisser à false pour un fonctionnement normal) true/false
local hysteresis = 0.4 				-- Valeur seuil pour éviter que le relais ne cesse de commuter dans les 2 sens
local debugging = true 	                -- true or false pour voir tous les messages debug dans le log
local verbose = true				-- Print ou non des logs


-- domoticz
local url = 'xxxx:yyyyy@192.168.1.1:8080'         	-- user:pass@ip:port de domoticz, pour la création des variables

local status = 0

local cumul_power = 0   			-- initialisation de la puissance instantanee des radiateurs en fonctionnement
----------------------------------------------
--       Fin de la partie configuration       --
----------------------------------------------

function timedifference(d)
   s = otherdevices_lastupdate[d]
   year = string.sub(s, 1, 4)
   month = string.sub(s, 6, 7)
   day = string.sub(s, 9, 10)
   hour = string.sub(s, 12, 13)
   minutes = string.sub(s, 15, 16)
   seconds = string.sub(s, 18, 19)
   t1 = os.time()
   t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
   difference = os.difftime (t1, t2)
   return difference
end


commandArray = {}

for key, valeur in pairs(piece) do
	-- Maj des variables en fonction de la valeur de la table 
	local le_radiateur_est_sur_ON = false      -- Etat du radiateur false ou true
        -- local radiateur = string.format("%s%s", "Radiateur ", valeur)       -- Nom de l'interrupteur de chauffage

	log1 = '***'
	log2 = '***'
	
	local heure = string.sub(os.date("%X"), 1, 5)	-- Recuperation de l'heure du systeme
		
	puissance=tonumber(watt[key])  -- Puissance en watt du radiateur

	if (debugging) then print ('>>>>>>>>>>>>>>>Initialisation '..puissance..' Radiateur>'..valeur) end


----------------------------------------------
--  Inititialisation des Variables d etat  --
----------------------------------------------

	if (otherdevices[radiateur] == 'On') then le_radiateur_est_sur_ON = true end 

----------------------------------------------------
------        Calcul de la consommation       ------
------      de l'ensemble des radiateurs      ------
----------------------------------------------------
   
	if (le_radiateur_est_sur_ON) then
		log1 = '*** IF 1 >                        Le Radiateur est en marche'
		status = 1
	else
		log1 = '*** IF 3 >                 Le Radiateur est arrete'
		status = 0
	end
		
	  -- calcul de la conso (npower = puissance actuelle / energy = puissance cumulee)

		npower, energy = string.match(otherdevices_svalues[conso], "(%d+%.*%d*);(%d+%.*%d*)") -- extraction des valeurs stockees dans le device conso
	
		if (status == 1) then  -- le radiateur est allume
			cumul_power = tonumber(cumul_power + puissance)
			energy = tonumber(energy + (puissance / 60))   -- puissance journaliere cumulee 
		else                   -- Le radiateur est eteint
			energy = tonumber(energy)
		end   
		
			power = tonumber(cumul_power)                  -- puissance instantanee 
			
   -- envoi de la conso dans le capteur virtuel d'énergie

   if (reset) then
	power = 0
	energy = 0
   end   
   	commandArray[#commandArray + 1]={['UpdateDevice'] = conso_id .. '|0|' .. power .. ';' .. energy}

end -- fin de tableau
return commandArray
Je pense que le script fonctionne parce que les logs donnent ça :
2021-12-07 22:12:00.296 Status: LUA: >>>>>>>>>>>>>>>Initialisation 1500 Radiateur>Radiateur cuisine
2021-12-07 22:12:00.296 Status: LUA: >>>>>>>>>>>>>>>Initialisation 500 Radiateur>Radiateur entree
2021-12-07 22:12:00.297 Status: LUA: >>>>>>>>>>>>>>>Initialisation 1000 Radiateur>Radiateur SdB
2021-12-07 22:12:00.297 Status: LUA: >>>>>>>>>>>>>>>Initialisation 3000 Radiateur>Chauffe eau
2021-12-07 22:12:00.297 Status: LUA: >>>>>>>>>>>>>>>Initialisation 1500 Radiateur>Radiateur chambre enfants
2021-12-07 22:12:00.297 Status: LUA: >>>>>>>>>>>>>>>Initialisation 1250 Radiateur>Radiateur chambre parents
2021-12-07 22:12:00.297 Status: LUA: >>>>>>>>>>>>>>>Initialisation 1000 Radiateur>Radiateur salon
Par contre, le compteur n'a pas l'air de s'incrémenter.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Incrémenter un compteur virtuel de consommation

Message par Keros »

Oui, ton script s'exécute, mais pas complètement. Tu as commenté la ligne

Code : Tout sélectionner

-- local radiateur = string.format("%s%s", "Radiateur ", valeur)       -- Nom de l'interrupteur de chauffage
Donc la variable radiateur n'a pas de valeur. Sauf que plus loin :

Code : Tout sélectionner

if (otherdevices[radiateur] == 'On') then le_radiateur_est_sur_ON = true end 
Cette condition est toujours fausse puisse que radiateur n'a pas de valeur. Donc le_radiateur_est_sur_ON reste toujours à false, ce qui explique que tu n'as plus de consommation.

La variable radiateur est utile et doit prendre la valeur du nom de l'objet, mais sans rajouter "Radiateur" ...
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
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

Re: Incrémenter un compteur virtuel de consommation

Message par garycooper »

Je comprends effectivement pourquoi ça plante. J'ai essayé de remplacer Radiateur par piece ou piece[key] mais si je n'ai pas non plus d'erreur dans les logs, le compteur n'est toujours pas incrémenté.

Code : Tout sélectionner

  	local radiateur = string.format("%s%s", piece[key], valeur)       -- Nom de l'interrupteur de chauffage
ogulf
Messages : 445
Inscription : 15 juin 2017, 14:41

Re: Incrémenter un compteur virtuel de consommation

Message par ogulf »

local radiateur = valeur

Et cette ligne ne sert à rien si, plus loin, tu remplaces la variable radiateur par la variable valeur....
D'où la suppression de la ligne :geek:

CQFD 8-)
Domoticz Stable sur RPi3 + RFPlayer + ZWave+ + RFLink R48 :
- 11 x RF660P
- 1 x FGSD-002
- 10 x F007TH
- 5 x Emcoluxr EV1527 + 4 x NAS-DS01Z
- 4 x NAS-PD02Z
- 1 x Shelly 1PM
Répondre