[LUA] Script chauffage électrique multi sondes

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
AlexElectro
Messages : 55
Inscription : 18 juil. 2015, 22:13

[LUA] Script chauffage électrique multi sondes

Message 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
Domoticz sur RPi - RfxCom - Sondes oregon DIY - Bus one wire - sondes DS18B20 - BMP085 - Home confort
http://electro.bassignyinformatique.fr/
Répondre