[LUA] YASDC (Yes Another Script De Chauffage) !
Publié : 21 oct. 2016, 16:48
Bonjour,
MAJ du 19/11/2017/2017
Ajout de la vérification de l'état du poêle avant action pour éviter des commutations trop fréquentes
Ajout de variables d'état pour rendre le code plus lisible
sinon fonctionnement identique.
Ce script gère la totalité des radiateurs d'une maison, quelque soit leur nombre avec un minimum de modifications en cas de rajout d'appareil
(Rajout dans les deux tables 'piece' et 'watt' et c'est tout).
================================================================================
Avec les premiers froids de l'hiver, voici mon script de gestion des radiateurs de la maison.
Tout d’abord, merci à VIL1DRIVER, grand contributeur du forum, pour son script qui est à l’origine du mien;
Je l’ai modifié selon mes besoins, mais l’essentiel est de VIL1DRIVER.
Voilà un an qu’il tourne sans problème. Il m’a permis d’économiser 200 € d’électricité sur un hiver.
C’est un script unique qui gère tous les radiateurs de la maison (4 pour mon cas).
On peut aisément ajouter un radiateur sans modifier le reste du code. Il suffit de le rajouter au tableau ‘piece’ et au tableau 'watt'
Pour chaque radiateur, il faut créer 2 interrupteurs virtuels et 1 interrupteur relié au switch du radiateur :
Le calendrier qui permet de gérer les heures de chauffage
- Interrupteur/ Ajout manuel/
o Virtuel/On-Off


Le chauffage On/Off qui permet d’arrêter manuellement le radiateur
- Interrupteur/ Ajout manuel/
o Virtuel/On-Off

Et un interrupteur associé au switch du radiateur qui permet d’allumer ou éteindre l’appareil.
La couleur de l’icône change selon qu’il est en marche (rouge) ou non (grisé)

Ensuite, pour l’ensemble des radiateurs quelque soit leur nombre, 3 thermostats sur lesquels on pourra régler manuellement les consignes de températures (Confort, Eco, EcoPlus).
- Réglages/Matériel
Créer capteurs virtuels
o Type de capteur : Consigne du thermostat

De type thermostat, ce qui permet de régler la température voulue

Et pour finir un compteur qui cumule la quantité d’énergie consommée à partir du « wattage » de chaque radiateur.
- Réglages/Matériel
Créer capteurs virtuels
o Type de capteur : Electrique (Instant + Counter)

Le fonctionnement du programme :
Il s’exécute toutes les minutes selon l’algorithme suivant :
Si calendrier=On et chauffage= ON
Consigne= Thermo_confort
Sinon
Si calendrier = Off et chauffage=ON
Consigne=Thermo_Eco
Sinon
Consigne= Thermo_Ecoplus
Pour chaque pièce, le programme compare la température de la sonde avec celle de la consigne et met en route ou arrête le radiateur.
Attention :
La racine du nom des interrupteurs est toujours identique (Chauffage_calendrier_ , Chauffage_on_off_ , Radiateur_chambre_ ). Ils ne sont distingués dans le programme que par la désignation finale. Ceci permet de ne faire qu’un minimum de modification en cas de rajout d’un radiateur. Il suffira de rajouter un élément aux 2 tableaux.
Idem pour les sondes (°_chambre_ )
La variable debug est à mettre à true pour le débogage puis en false pour la production.
Le programme affiche dans le log le statut des radiateurs à chaque passage :

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
Un mail est envoyé en cas de sonde muette depuis au moins 30’.
Le programme est à installer dans /home/pi/domoticz/scripts/lua sous le nom script_time_XXXXX.lua
Il sera pris en compte automatiquement par Domoticz
MAJ du 19/11/2017/2017
Ajout de la vérification de l'état du poêle avant action pour éviter des commutations trop fréquentes
Ajout de variables d'état pour rendre le code plus lisible
sinon fonctionnement identique.
Ce script gère la totalité des radiateurs d'une maison, quelque soit leur nombre avec un minimum de modifications en cas de rajout d'appareil
(Rajout dans les deux tables 'piece' et 'watt' et c'est tout).
================================================================================
Avec les premiers froids de l'hiver, voici mon script de gestion des radiateurs de la maison.
Tout d’abord, merci à VIL1DRIVER, grand contributeur du forum, pour son script qui est à l’origine du mien;
Je l’ai modifié selon mes besoins, mais l’essentiel est de VIL1DRIVER.
Voilà un an qu’il tourne sans problème. Il m’a permis d’économiser 200 € d’électricité sur un hiver.
C’est un script unique qui gère tous les radiateurs de la maison (4 pour mon cas).
On peut aisément ajouter un radiateur sans modifier le reste du code. Il suffit de le rajouter au tableau ‘piece’ et au tableau 'watt'
Pour chaque radiateur, il faut créer 2 interrupteurs virtuels et 1 interrupteur relié au switch du radiateur :
Le calendrier qui permet de gérer les heures de chauffage
- Interrupteur/ Ajout manuel/
o Virtuel/On-Off
Le chauffage On/Off qui permet d’arrêter manuellement le radiateur
- Interrupteur/ Ajout manuel/
o Virtuel/On-Off
Et un interrupteur associé au switch du radiateur qui permet d’allumer ou éteindre l’appareil.
La couleur de l’icône change selon qu’il est en marche (rouge) ou non (grisé)
Ensuite, pour l’ensemble des radiateurs quelque soit leur nombre, 3 thermostats sur lesquels on pourra régler manuellement les consignes de températures (Confort, Eco, EcoPlus).
- Réglages/Matériel
Créer capteurs virtuels
o Type de capteur : Consigne du thermostat
De type thermostat, ce qui permet de régler la température voulue
Et pour finir un compteur qui cumule la quantité d’énergie consommée à partir du « wattage » de chaque radiateur.
- Réglages/Matériel
Créer capteurs virtuels
o Type de capteur : Electrique (Instant + Counter)
Le fonctionnement du programme :
Il s’exécute toutes les minutes selon l’algorithme suivant :
Si calendrier=On et chauffage= ON
Consigne= Thermo_confort
Sinon
Si calendrier = Off et chauffage=ON
Consigne=Thermo_Eco
Sinon
Consigne= Thermo_Ecoplus
Pour chaque pièce, le programme compare la température de la sonde avec celle de la consigne et met en route ou arrête le radiateur.
Attention :
La racine du nom des interrupteurs est toujours identique (Chauffage_calendrier_ , Chauffage_on_off_ , Radiateur_chambre_ ). Ils ne sont distingués dans le programme que par la désignation finale. Ceci permet de ne faire qu’un minimum de modification en cas de rajout d’un radiateur. Il suffira de rajouter un élément aux 2 tableaux.
Idem pour les sondes (°_chambre_ )
La variable debug est à mettre à true pour le débogage puis en false pour la production.
Le programme affiche dans le log le statut des radiateurs à chaque passage :
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
Un mail est envoyé en cas de sonde muette depuis au moins 30’.
Le programme est à installer dans /home/pi/domoticz/scripts/lua sous le nom script_time_XXXXX.lua
Il sera pris en compte automatiquement par Domoticz
Code : Tout sélectionner
--[[
par Nissa MAJ du 19/11/2017
Ajout de la verification de l'état du poele avant action
Ajout de variables d'état pour rendre le code plus lisible
Type: time
Name: chauffage
Algorythme :
Si Chauffage=ON et Calendrier=ON
Consigne=confort (19)
sinon
Consigne=eco(17)
sinon
Consigne=eco+(15)
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_Jules'
piece['1']='Chambre_AniLou'
piece['2']='Chambre_Marie'
piece['3']='Couloir'
piece['4']='Sejour'
local watt={} -- Tableau Rajouter ici la puissance en watts du radiateur (L'index doit correspondre a celui de la piece ci-dessus)
watt['0']='1000'
watt['1']='1500'
watt['2']='1000'
watt['3']='1250'
watt['4']='2000'
-- consignes de thermostat virtuels
local consigne_confort = 'Thermo_confort'
local consigne_eco = 'Thermo_eco'
local consigne_ecoplus = 'Thermo_ecoplus'
local conso = 'Chauffage_conso' -- nom du capteur virtuel de consommation électrique (type= instant + counter)
local conso_id = 194 -- idx du capteur virtuel de consommation électrique
local reset = false -- force la mise à zero de la consomation instantané (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 debug = false -- true or false pour voir tous les messages debug dans le log
local verbose = true -- Print ou non des logs
-- email
local mail = 'toto@laposte.net' -- pour réception alerte sonde muette (chauffage coupé)
-- domoticz
local url = '192.168.1.xx:8080' -- user:pass@ip:port de domoticz, pour la création des variables
----------------------------------------------
-- 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
cumul_power = 0 -- initialisation de la puissance instantanee des radiateurs en fonctionnement
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 sonde_KO = false -- Sonde de temperature HS
local sonde = string.format("%s%s", "Temperature_", valeur) -- Nom de la sonde de température
local presence = string.format("%s%s", "Chauffage_on_off_", valeur) -- Interrupteur manuel indiquant la presence
local calendrier = string.format("%s%s", "Chauffage_calendrier_", valeur)
local radiateur = string.format("%s%s", "Radiateur_", valeur) -- Nom de l'interrupteur de chauffage
log = '***'
log2 = '***'
local heure = string.sub(os.date("%X"), 1, 5) -- Recuperation de l'heure du systeme
local lastSeen = string.sub(os.date("!%X", timedifference(sonde)), 1, 5) -- Heure de la derniere releve de la sonde de temperature
puissance=tonumber(watt[key]) -- Puissance en watt du radiateur
commandArray = {}
if (debug) then print ('>>>>>>>>>>>>>>>Initialisation '..puissance..' Radiateur>'..valeur) end
----------------------------------------------
------ Alerte mail ------
-- si la sonde est muette depuis 30' --
----------------------------------------------
if (lastSeen >= '00:30' and lastSeen < '00:32') then
commandArray['SendEmail']='Domoticz Alerte#Alerte sonde chambre '..piece..' muette#'..mail
if (debug) then print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Envoi mail probleme de sonde ') end
end
----------------------------------------------
------ Gestion consigne ------
----------------------------------------------
-- récupération de la valeur du thermostat
if (otherdevices[presence] == 'On') then -- si la presence est active (interrupteur manuel 'Chauffage_on_off_XXXX')
if (otherdevices[calendrier] == 'On') then -- ET calendrier ON (Chauffage_calendrier_XXXX)
consigne = tonumber(otherdevices_svalues[consigne_confort])
else
consigne = tonumber(otherdevices_svalues[consigne_eco])
end
else -- presence = OFF
consigne = tonumber(otherdevices_svalues[consigne_ecoplus])
end
if (debug) then print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Initialisation Consigne chambre '..valeur..' > '..consigne) end
-- on récupère la température fournie par la sonde
local temperature = math.floor(10*tonumber(otherdevices_temperature[sonde]))/10
if (debug) then print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Recup valeur sonde chambre '..valeur..' > '..temperature) end
----------------------------------------------
-- Inititialisation des Variables d etat --
----------------------------------------------
if (otherdevices[radiateur] == 'On') then le_radiateur_est_sur_ON = true end
if lastSeen > '00:10' then
local sonde_KO = true
log2 = '*** Sonde muette '
end
----------------------------------------------
------ Gestion du radiateur ------
--- selon temperature relevee et consigne --
----------------------------------------------
if (le_radiateur_est_sur_ON) and not (sonde_KO) then
log = '*** IF 1 > Le Radiateur est en marche'
status = 1
if temperature >= (consigne + hysteresis) then
commandArray[radiateur]='Off'
log = '*** IF 2 > Arret du Radiateur'
status = 0 -- Pour eviter le delai de la Maj du device (variable utilisee dans le if du calcul de conso)
end
else
log = '*** IF 3 > Le Radiateur est arrete'
status = 0
if temperature <= (consigne - hysteresis) and not (sonde_KO) then
commandArray[radiateur]='On'
log = '*** IF 4 > Allumage du Radiateur'
status = 1
end
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[3]={['UpdateDevice'] = conso_id .. '|0|' .. power .. ';' .. energy}
-- logs
if (verbose) then
print ' '
print('********************* Chauffage '..valeur..' *********************')
print('*** Il fait '..temperature..'°C pour une consigne de '..consigne..'°C souhaités')
print(log,log2)
print('********************************************************************')
end
end -- fin de tableau
return commandArray