[LUA] Script chauffage électrique multi sondes
Publié : 05 févr. 2017, 20:32
Bonjour
Je partage avec vous la dernière évolution de mon script de chauffage que j'avais publié dans cette article : viewtopic.php?f=17&t=1489&p=12774#p12774
J'ai une grande pièce qui fait salon/salle à manger et cuisine. J'y ai installé 3 radiateurs électriques à accumulation. J'ai aaussi deux sondes de températures, une dans le salon l'autre dans la cuisine. Je voulais donc que mon script puisse prendre en compte les deux températures pour commander simultanément les 3 radiateurs.
J'ai conservé un système de contrôle des sondes et un envoi d'alerte par mail.
Le code est documenté mais n'hésitez pas si il y a des questions!
Je partage avec vous la dernière évolution de mon script de chauffage que j'avais publié dans cette article : viewtopic.php?f=17&t=1489&p=12774#p12774
J'ai une grande pièce qui fait salon/salle à manger et cuisine. J'y ai installé 3 radiateurs électriques à accumulation. J'ai aaussi deux sondes de températures, une dans le salon l'autre dans la cuisine. Je voulais donc que mon script puisse prendre en compte les deux températures pour commander simultanément les 3 radiateurs.
J'ai conservé un système de contrôle des sondes et un envoi d'alerte par mail.
Le code est documenté mais n'hésitez pas si il y a des questions!
Code : Tout sélectionner
---------------------------------
------ variables à adapter ------
---------------------------------
local consigne = 'Thermostat Salon' -- nom du thermostat de température de consigne
local hysteresis = 0.4 --Valeur seuil pour éviter que le relai ne cesse de commuter dans les 2 sens
local sonde1 = 'Salon' --Nom de la première sonde de température
local typeSonde1 = 'humid' -- type de sonde: 'temp': uniquement température / 'humid' : temp+humidité
local sonde2 = 'Cuisine' --Nom de la seconde sonde de température
local typeSonde2 = 'temp' -- type de sonde: 'temp': uniquement température / 'humid' : temp+humidité
local thermostat = 'Chauffage Salon' --Nom de l'interrupteur virtuel du chauffage
local radiateur1 = 'Radiateur Salon' --Nom du radiateur à allumer/éteindre
local radiateur2 = 'Radiateur Cuisine' --Nom du radiateur à allumer/éteindre
local radiateur3 = 'Radiateur Entree' --Nom du radiateur à allumer/éteindre
local EmailTo = 'alex.belair@gmail.com' -- adresse mail où seront envoyées les notifications, si plusieurs séparer par ;
local envoiMail1 = 'mail_sonde_Salon' -- nom de la variable utilisateur gérant l'envoi des alertes de la sonde 1
local envoiMail2 = 'mail_sonde_Cuisine' -- nom de la variable utilisateur gérant l'envoi des alertes de la sonde 2
local debug = 'oui' -- oui ou non pour voir tous les messages debug dans le log
local modeAlarme = 'sondeBis' -- action à effectuer si il y a une alarme sonde:
-- choisir 'on' pour que le chauffage reste allumé, ou 'off' pour qu'il soit éteint
-- ou choisir 'sondeBis' pour utiliser une autre sonde de température (par ex une située dans une autre pièce)
local sondeBis = 'Parents' -- nom de la sonde de remplacement pour le mode sondeBis
local typeSondeBis = 'humid' -- type de sonde: 'temp': uniquement température / 'humid' : temp+humidité
--------------------------------
-- Fin des variables à éditer --
--------------------------------
commandArray = {}
if debug == 'oui' then print('######## script time Salon 2 sondes ########') end
------------------------------------
--- Gestion de l'alarme de sonde ---
------------------------------------
time = os.date("*t")
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
-- ***********************************
-- Détection d'un problème sur sonde 1
-- ***********************************
local lastSeen1 = timedifference(sonde1)
if debug == 'oui' then print ('lastseen sonde '..sonde1..' = '..lastSeen1) end
if (lastSeen1 > 6000 ) then
alarmeSonde1 = 1
else
alarmeSonde1 = 0
commandArray['Variable:'..envoiMail1] = tostring (0)
end
if debug == 'oui' then print ('alarme sonde '..sonde1..'= '..alarmeSonde1) end
-- on récupère la valeur de envoiMail1
mailEnvoye1 = tonumber(uservariables[envoiMail1])
if debug == 'oui' then print ('envoiMail1 = '..mailEnvoye1) end
if (mailEnvoye1==0) and (alarmeSonde1 == 1) then envoyerAlerte1 = 1 end
if (mailEnvoye1==1) and (alarmeSonde1 == 1) then envoyerAlerte1 = 0 end
if (mailEnvoye1==0) and (alarmeSonde1 == 0) then envoyerAlerte1 = 0 end
if (mailEnvoye1==1) and (alarmeSonde1 == 0) then envoyerAlerte1 = 0 end
if debug == 'oui' then print ('envoyerAlerte sonde 1 = '..envoyerAlerte1) end
-- on envoi un mail si ce n'est pas déjà fait
if envoyerAlerte1 == 1 then
print ('Alerte sonde '..sonde1..', envoi d\'un mail')
objet = 'Alerte chauffage '..thermostat
message = 'Problème avec la sonde '..sonde1
commandArray['SendEmail']= objet..'#'.. message .. '#' .. EmailTo
commandArray['Variable:'..envoiMail1] = tostring (1)
--else
--print ('Alerte sonde, mail déjà envoyé')
end
-- ***********************************
-- Détection d'un problème sur sonde 2
-- ***********************************
local lastSeen2 = timedifference(sonde2)
if debug == 'oui' then print ('lastseen sonde '..sonde2..' = '..lastSeen2) end
if (lastSeen2 > 6000 ) then
alarmeSonde2 = 1
else
alarmeSonde2 = 0
commandArray['Variable:'..envoiMail2] = tostring (0)
end
if debug == 'oui' then print ('alarme sonde '..sonde2..'= '..alarmeSonde2) end
-- on récupère la valeur de envoiMail2
mailEnvoye2 = tonumber(uservariables[envoiMail2])
if debug == 'oui' then print ('envoiMail2 = '..mailEnvoye2) end
if (mailEnvoye2==0) and (alarmeSonde2 == 1) then envoyerAlerte2 = 1 end
if (mailEnvoye2==1) and (alarmeSonde2 == 1) then envoyerAlerte2 = 0 end
if (mailEnvoye2==0) and (alarmeSonde2 == 0) then envoyerAlerte2 = 0 end
if (mailEnvoye2==1) and (alarmeSonde2 == 0) then envoyerAlerte2 = 0 end
if debug == 'oui' then print ('envoyerAlerte sonde 2 = '..envoyerAlerte2) end
-- on envoi un mail si ce n'est pas déjà fait
if envoyerAlerte2 == 1 then
print ('Alerte sonde '..sonde2..', envoi d\'un mail')
objet = 'Alerte chauffage '..thermostat
message = 'Problème avec la sonde '..sonde2
commandArray['SendEmail']= objet..'#'.. message .. '#' .. EmailTo
commandArray['Variable:'..envoiMail2] = tostring (1)
--else
--print ('Alerte sonde2, mail déjà envoyé')
end
-- *******************
-- Analyse des alarmes
-- *******************
-- en mode normal, on utilise la valeur la moyenne entre sonde1 et Sonde2 ==> mode 1
-- en cas de défaillance d'une des deux sondes, on utilise celle qui est fonctionnelle ==> mode 2
-- au cas ou les deux sondes sont hs, on utilise le paramètre modeAlarme ==> mode 3
if (alarmeSonde1==0) and (alarmeSonde2==0) then mode = 1 end
if ((alarmeSonde1==1) and (alarmeSonde2==0)) or ((alarmeSonde1==0) and (alarmeSonde2==1)) then mode = 2 end
if (alarmeSonde1==1) and (alarmeSonde2==1) then mode = 3 end
----------------------------------
--- Gestion de la température ----
----------------------------------
-- on récupère la consigne du thermostat
local consigne = tonumber(otherdevices_svalues[consigne])
if debug == 'oui' then print ('consigne = '..consigne) end
-- on récupère la température relevée par la sonde1
if (typeSonde1 == 'temp') then
temperature1 = tonumber(otherdevices_svalues[sonde1])
elseif (typeSonde1 == 'humid') then
temp, sHumid = otherdevices_svalues[sonde1]:match("([^;]+);([^;]+)")
temperature1 = tonumber(temp)
end
if debug == 'oui' then print ('température '..sonde1..' = '..temperature1) end
-- on récupère la température relevée par la sonde2
if (typeSonde2 == 'temp') then
temperature2 = tonumber(otherdevices_svalues[sonde2])
elseif (typeSonde2 == 'humid') then
temp, sHumid = otherdevices_svalues[sonde2]:match("([^;]+);([^;]+)")
temperature2 = tonumber(temp)
end
if debug == 'oui' then print ('température '..sonde2..' = '..temperature2) end
-- on choisi la température de référence en fonction du mode
if (mode == 1) then
tempRef = ((temperature1 + temperature2) / 2)
if debug == 'oui' then print ('mode 1 ==> température moyenne ') end
elseif (mode == 2) then
if (alarmeSonde1 == 1) then
tempRef = temperature2
if debug == 'oui' then print ('mode 2==> température de la sonde '..sonde2) end
end
if (alarmeSonde2 == 1) then
tempRef = temperature1
if debug == 'oui' then print ('mode 2==> température de la sonde '..sonde1) end
end
elseif (mode == 3) and (modeAlarme == 'sondeBis') then
-- on récupère la température relevée par la sondeBis
if (typeSondeBis == 'temp') then
temperatureBis = tonumber(otherdevices_svalues[sondeBis])
elseif (typeSondeBis == 'humid') then
temp, sHumid = otherdevices_svalues[sondeBis]:match("([^;]+);([^;]+)")
temperatureBis = tonumber(temp)
end
tempRef = temperatureBis
print ('mode 3==> température de la sonde Bis : '..sondeBis)
end
if debug == 'oui' then print ('température de référence = '..tempRef) end
-- ********************************
-- Gestion des scénarios d'allumage
-- ********************************
if (otherdevices[thermostat]=='On') then
if debug == 'oui' then print(thermostat..' : ON') end
if (mode == 1) or (mode == 2) then
if (tempRef <= consigne) then
if debug == 'oui' then print(thermostat..' : tempRef <= consigne => il faut allumer') end
action = 1
elseif (tempRef >= (consigne+hysteresis) ) then
if debug == 'oui' then print(thermostat..' : tempRef >= consigne => il faut éteindre') end
action = 0
elseif (tempRef > consigne) and (tempRef < (consigne + hysteresis)) then
if debug == 'oui' then print(thermostat..' : tempRef dans l\'hystérésis => On laisse comme c\'est ') end
action = 3
end
elseif (mode == 3) then
if modeAlarme == 'on' then
action = 1
if debug == 'oui' then print(thermostat..' : modeAlarm "on" => il faut allumer') end
elseif modeAlarme == 'off' then
action = 0
if debug == 'oui' then print(thermostat..' : modeAlarm "off" => il faut éteindre') end
elseif modeAlarme == 'sondeBis' then
if (tempRef <= consigne) then
if debug == 'oui' then print(thermostat..' : modeAlarm "sondeBis" tempRef < consigne => il faut allumer') end
action = 1
elseif (tempRef >= (consigne+hysteresis) ) then
if debug == 'oui' then print(thermostat..' : modeAlarm "sondeBis" tempRef >= consigne => il faut éteindre') end
action = 0
elseif (tempRef > consigne) and (tempRef < (consigne + hysteresis)) then
if debug == 'oui' then print(thermostat..' : modeAlarme "sondeBis" tempRef dans l\'hystérésis => On laisse comme c\'est ') end
action = 3
end
end
end
if debug == 'oui' then print ('Action = '..action) end
elseif (otherdevices[thermostat]=='Off') then
action = 0
if debug == 'oui' then print(' Thermostat OFF : il faut éteindre / action = 0') end
end
-- ************************
-- Commande des radiateurs
-- ************************
if action == 1 then
print('Allumage du chauffage :'..radiateur1)
commandArray[radiateur1]='On'
print('Allumage du chauffage :'..radiateur2)
commandArray[radiateur2]='On'
print('Allumage du chauffage :'..radiateur3)
commandArray[radiateur3]='On'
elseif action == 0 then
print('Extinction du chauffage:'..radiateur1)
commandArray[radiateur1]='Off'
print('Extinction du chauffage:'..radiateur2)
commandArray[radiateur2]='Off'
print('Extinction du chauffage:'..radiateur3)
commandArray[radiateur3]='Off'
elseif action == 3 then
print ('On laisse les radiateurs en l\'état')
end
return commandArray