Page 1 sur 1

[LUA] Script chauffage électrique multi sondes

Publié : 05 févr. 2017, 20:32
par AlexElectro
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!

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