Si comme moi vous avez un capteur de consommation électrique et que vous êtes en heures creuses / pleines, vous voulez peut être savoir votre conso dans les heures creuses et celle dans les heures pleines. Donc voici le script que j'ai mis en place sur mon Domoticz.
But
Le but est donc d'avoir des capteur comme ci-dessous dans Domoticz
Donc voici les étaptes pour arriver à ça.
Etape 1: les capteurs
Nous avons un déjà capteur électrique qui cumule tout ("Compteur Electrique Global"). Il faut maintenant créer 2 capteurs virtuels de type "Electrique (Instant + Compteur)". Dans mon cas, il s'agit de "Compteur Electrique HC" et "Compteur Electrique HP" comme vous pouvez le voir ci-dessus.
Etape 2 : Interrupteurs HC / HP
Ensuite, il faut que Domoticz puisse savoir quand nous sommes en HC ou HP. Donc pour cela, on crée 2 switchs virtuels (ici "EDF Heures Creuses" et "EDF Heures Pleines").
Vous pouvez gérer les passages HC/HP via le planning de chaque bouton. Mais il suffit d'une erreur sur l'un pour se retrouver avec les 2 allumer ou eteint. Donc dans mon cas, j'ai préféré gérer ça de façon "centralisée" dans un blocky comme celui ci :
Comme vous pouvez le voir, j'ai 3 périodes d'heures creuses. A vous d'ajouter ou supprimer des blocs en fonction...
Etape 3 : Sous le capot
Maintenant que tout le "visible" est en place, il faut s'attaque à la mécanique, avec le script ci-dessous. Donc pour expliquer rapidement son fonctionnement :
- A chaque réception d'une valeur du capteur "réél", le script regarde si on se trouve en HC ou HP
- Il calcule la consommation depuis le dernier envoi du capteur, et l'ajoute à la consommation global du compteur HC ou HP
- Il récupère également la conso instantanée pour la mettre sur le compteur HC ou HP
- Et important, il remet à 0 la conso instantanée de l'autre compteur. Sans cela, elle reste à la dernière valeur reçu, et ça va fausser les stats de vos compteurs HC/HP.
Code : Tout sélectionner
- script domoticz/scripts/lua/script_device_compteurHC-HP.lua
-- Initialisation des variables locales
local capteurGlobal = uservariables['CapteurGlobal']
local capteurCptHP = uservariables['CapteurCptHP']
local capteurCptHC = uservariables['CapteurCptHC']
local idxCptHP = uservariables['IdxCptHP']
local idxCptHC = uservariables['IdxCptHC']
local flagHC = uservariables['FlagHC']
local flagHP = uservariables['FlagHP']
local lastValueCptElecGlobal = uservariables['LastValueCptElecGlobal']
-- Mode debug Oui / Non
local debug = uservariables['debug']
-- Fonction de mise à jour
function update(device, id, power, energy, index)
commandArray[index] = {['UpdateDevice'] = id .. "|0|" .. power .. ";" .. energy}
return
end
commandArray = {}
-- On prend en compte a chaque changement de valeur du compteur global
if (devicechanged[capteurGlobal]) then
if (debug == 'OUI') then
print('-- Calcul Compteurs HC / HP --')
print('CapteurGlobal = '..capteurGlobal)
print('CapteurCptHP = '..capteurCptHP)
print('CapteurCptHC = '..capteurCptHC)
print('idxCptHP = '..tostring(idxCptHP))
print('idxCptHC = '..tostring(idxCptHC))
print('flagHP = '..tostring(flagHP))
print('flagHC = '..tostring(flagHC))
print('LastValueCptElecGlobal = '..tostring(lastValueCptElecGlobal))
end
-- Recuperation des valeurs du compteur global
local consoCumule
local consoInstant
consoInstant, consoCumule = otherdevices_svalues[capteurGlobal]:match("([^;]+);([^;]+)")
consoInstant = tonumber(consoInstant)
consoCumule = tonumber(consoCumule)
if (debug == 'OUI') then
print('Conso Instant = '..tostring(consoInstant)..' / Conso Cumule = '..tostring(consoCumule)..' ')
end
-- Calcul de l'ecart avec le dernier envoi de donnees
lastValueCptElecGlobal = tonumber(lastValueCptElecGlobal)
local consoDelta = consoCumule - lastValueCptElecGlobal
if (debug == 'OUI') then
print('Delta conso = '..tostring(consoDelta))
end
local consoCumuleCible
local consoInstantCible
if (otherdevices[flagHC] == 'On') then
-- Periode heures creuse
-- Recuperation des valeurs du compteur global
consoInstantCible, consoCumuleCible = otherdevices_svalues[capteurCptHC]:match("([^;]+);([^;]+)")
-- Seul le cumule du compteur nous interesse pour calculer la nouvelle valeur
consoCumuleCible = tonumber(consoCumuleCible)
if (debug == 'OUI') then
print('Compteur cible = HC')
print('Valeur precedente = '..tostring(consoCumuleCible))
print('Valeur ajustee = '..tostring(consoCumuleCible + consoDelta))
end
consoCumuleCible = consoCumuleCible + consoDelta
-- Mise à jour du compteur
update(capteurCptHC, idxCptHC, consoInstant, consoCumuleCible, 1)
-- Mise à 0 de la conso intantanee du compteur HP
consoInstantHP, consoCumuleHP = otherdevices_svalues[capteurCptHP]:match("([^;]+);([^;]+)")
consoInstantHP = 0
update(capteurCptHP, idxCptHP, consoInstantHP, consoCumuleHP, 2)
else
-- Periode heures pleines
-- Recuperation des valeurs du compteur global
consoInstantCible, consoCumuleCible = otherdevices_svalues[capteurCptHP]:match("([^;]+);([^;]+)")
-- Seul le cumule du compteur nous interesse pour calculer la nouvelle valeur
consoCumuleCible = tonumber(consoCumuleCible)
if (debug == 'OUI') then
print('Compteur cible = HP')
print('Valeur precedente = '..tostring(consoCumuleCible))
print('Valeur ajustee = '..tostring(consoCumuleCible + consoDelta))
end
consoCumuleCible = consoCumuleCible + consoDelta
-- Mise à jour du compteur
update(capteurCptHP, idxCptHP, consoInstant, consoCumuleCible, 3)
-- Mise à 0 de la conso intantanee du compteur HC
consoInstantHC, consoCumuleHC = otherdevices_svalues[capteurCptHC]:match("([^;]+);([^;]+)")
consoInstantHC = 0
update(capteurCptHC, idxCptHC, consoInstantHC, consoCumuleHC, 4)
end
-- Sauvegarde de la valeur du compteur global pour prochain calcul
commandArray['Variable:LastValueCptElecGlobal'] = tostring(consoCumule)
if (debug == 'OUI') then
print('-- Fin Calcul Compteur HC / HP --')
end
end
return commandArray
Explication pour les variables :
- CapteurGlobal : Nom du capteur physique
- CapteurCptHP : nom du capteur virtuelle HP
- CapteurCptHC : nom du capteur virtuelle HC
- idxCptHP : IDX du capteur virtuelle HP
- idxCptHC : IDX du capteur virtuelle HC
- flagHP : Nom du switch HP
- flagHC : Nom du switch HC
- LastValueCptElecGlobal : valeur du compteur cumulé pour calculer l'écart par rapport au dernier relevé
Et merci à jackslayter qui m'a donné un coup de main pour fusionner mes 3 scripts initiaux en 1 seul !
Voilà, j'espère que ça pourra vous être utile !

N'hésitez pas si vous avec des questions ou des remarques.