[LUA] Script de chauffage.... un autre :-p

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 de chauffage.... un autre :-p

Message par AlexElectro »

Salut à tous
il y a plusieurs scripts de chauffages disponibles sur le forum, et ils sont tous très bien fait. Comme je suis un peu pénible, aucun ne correspondait entièrement à ce que je voulais. J'ai donc pris à droite et à gauche ce qui m'intéressait. Au final, les fonctions de mon script sont les suivante:

Gestion des températures et des horaires depuis l'interface graphique

Pour être très WAF, je voulais que tout ce gère grâce à un bouton et un thermostat.

Je m'articule donc sur un thermostat .
image1.png
image1.png (46.79 Kio) Consulté 4316 fois
On peut régler la température voulue en direct, ou bien programmer des changement par le bouton 'planning'.


Pour la mise en marche, j'ai créé un interrupteur virtuel qui actionne la mise en marche du chauffage, et qui peut donc se programmer encore une fois grâce au bouton 'planning'.
image2.png
image2.png (17.21 Kio) Consulté 4316 fois

Envoi de la consommation

Là, il y a plusieurs écoles. On aime ou on aime pas. Le script permet donc de choisir si on veut utiliser ou non cette fonction. Pour ma part, je ne l'utilise plus car pour que ça fonctionne, il faut que le chauffage chauffe à fond lors de chaque allumage. C'est à dire qu'on envoi du courant dans la résistance électrique en permanence. Il consommera alors environs sa puissance en Watt. Ca suppose donc que le thermostat interne du radiateur soit shunté ou alors à fond. Perso ça me gène pour des raisons de sécurité: en cas de panne de domoticz alors que l'inter de chauffage est 'on'.... ca va chauffer en permanence.
Sinon, pas de soucis pour l'utiliser dans le script, ça fontionne. A condition bien sur d'avoir créé un compteur virtuel...
image3.png
image3.png (15 Kio) Consulté 4316 fois
Gestion des alarmes de sonde

La sonde qui n'émet plus??? chez moi (j'ai pas de chance) c'est fréquent! Faut dire que je n'utilise que des sondes DIY réalisées par moi-même.
Si la sonde n'émet plus durant 10 minutes, j'ai donc programmé 3 modes d'alarme
- 'On' : on allume le chauffage en permanence. Utile pour ne pas que le bébé qui dort tranquillement dans la chambre soit retrouvé congelé au petit matin (ça m'est presque arrivé, j'ai failli me retrouvé célibataire :oops: )
- 'off' : on éteint le chauffage
- 'sondeBis' : on utilise alors la température relevée par une autre sonde. Perso, j'ai deux chambres côte à côte dont la température varie de ma nière similaire. Je choisi donc d'utiliser la sonde de cette autre chambre.

En cas d'alarme, un mail d'alerte est envoyé pour prévenir l'utilisateur.

Pour fonctionner, cette partie du script nécessite la création d'une variable utilisateur . A renseigner ensuite dans 'envoiMail = '

Mode débug

Gestion d'un mode 'debug', permettant d'afficher ou non des info dans le log


Le script :

Code : Tout sélectionner

 
 ---------------------------------
 ------ variables à adapter ------
 ---------------------------------
local consigne = 'Thermostat Garance'  -- 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 sonde = 'Garance' --Nom de la sonde de température
local thermostat = 'Chauffage Garance' --Nom de l'interrupteur virtuel du chauffage
local radiateur = 'Radiateur Garance' --Nom du radiateur à allumer/éteindre
local EmailTo = 'email@gmail.com' -- adresse mail où seront envoyées les botifications, si plusieurs séparer par ;

local envoiMail = 'mail_sonde_Garance' -- nom de la variable utilisateur gérant l'envoi des alertes

local compteur = 'oui' 		-- oui ou non si gestion de la consommation
-- si oui:
	local puissance1 = 1000        -- puissance du chauffage en watt
	local conso1 = 'Conso Garance' -- nom du capteur virtuel de consommation électrique (type= instant + counter)
	local conso_id1 = 61 		   -- Id du capteur virtuel de consommation électrique
	
local debug = 'non'   -- 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 = 'Evrard' -- nom de la sonde de remplacement pour le mode sondeBis
 --------------------------------
 -- Fin des variables à éditer --
 --------------------------------
 
 commandArray = {}
 if debug == 'oui' then print('######## debug script time chauffage ########') 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
 

local lastSeen = timedifference(sonde)
if debug == 'oui' then print ('lastseen = '..lastSeen) end

if (lastSeen > 6000 )  then
    alarmeSonde = 1
	else
	alarmeSonde = 0
	commandArray['Variable:'..envoiMail] = tostring (0)
end

if debug == 'oui' then print ('alarme sonde = '..alarmeSonde) end

-- on récupère la valeur de envoiMail
mailEnvoye = tonumber(uservariables[envoiMail])
if debug == 'oui' then print ('envoiMail = '..mailEnvoye) end

if (mailEnvoye==0) and (alarmeSonde == 1) then envoyerAlerte = 1 end
if (mailEnvoye==1) and (alarmeSonde == 1) then envoyerAlerte = 0 end
if (mailEnvoye==0) and (alarmeSonde == 0) then envoyerAlerte = 0 end
if (mailEnvoye==1) and (alarmeSonde == 0) then envoyerAlerte = 0 end
if debug == 'oui' then print ('envoyerAlerte = '..envoyerAlerte) end
	

----------------------------------
--- Gestion de la consommation ---
----------------------------------

if (compteur == 'oui') then
	
	if (otherdevices[radiateur] == 'On') then 
		-- envoie de la conso dans le capteur virtuel d'énergie
		npower1, energy1 = string.match(otherdevices_svalues[conso1], "(%d+%.*%d*);(%d+%.*%d*)")
		energy1 = tonumber(energy1) + (puissance1 / 60)    
		npower1 = tonumber(npower1)
		commandArray[1]={['UpdateDevice'] = conso_id1 .. '|0|' .. puissance1 .. ';' .. energy1} 
		print('Conso '..radiateur..' envoyée:'..energy1..' kw')
		end
		
	if (otherdevices[radiateur] == 'Off') then 
		-- envoie de la conso dans le capteur virtuel d'énergie
		npower1, energy1 = string.match(otherdevices_svalues[conso1], "(%d+%.*%d*);(%d+%.*%d*)")
		energy1 = tonumber(energy1)
		npower1 = tonumber(npower1)
		commandArray[2]={['UpdateDevice'] = conso_id1 .. '|0|' .. 0 .. ';' .. energy1} 
		print('Conso '..radiateur..' nulle')
		end
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
   
-- récupère la température relevée par la sonde
local temperature = tonumber(otherdevices_svalues[sonde])
if debug == 'oui' then print ('température = '..temperature) end

--Thermostat est actif et il n'y a pas d'alarme 

if (otherdevices[thermostat]=='On') and (alarmeSonde == 0) then
    if debug == 'oui' then print(thermostat..' : thermostat On / alarme 0') end
	
	
        if (temperature < (consigne - hysteresis) ) then
             print('Allumage du chauffage :'..radiateur)
             commandArray[radiateur]='On'
						
				
        elseif (temperature > (consigne + hysteresis)) then
            print('Extinction du chauffage:'..radiateur)
			commandArray[radiateur]='Off'
			
		elseif (temperature <= (consigne + temperature)) and (temperature >= (consigne - temperature)) then
			if debug == 'oui' then print('On laisse comme c\'est : '..radiateur) end
			
		end
			 
	end

-- Thermostat est actif mais il y a une alarme sonde
	
if (otherdevices[thermostat]=='On') and (alarmeSonde == 1) then
		
		if debug == 'oui' then print(thermostat..' : thermostat On / alarme 1') end
		if modeAlarme == 'off' then
			print ('Extinction du chauffage :'..radiateur)
			commandArray[radiateur]='Off'
			-- on envoi un mail sauf si c'est déjà fait
			if envoyerAlerte == 1 then
				print ('Alerte sonde, envoi d\'un mail')
				objet = 'Alerte chauffage '..thermostat
				message = 'Impossible d\'allumer le chauffage'..thermostat..' - Problème avec la sonde '..sonde
				commandArray['SendEmail']= objet..'#'.. message .. '#' .. EmailTo
				commandArray['Variable:'..envoiMail] = tostring (1)
						
			else 
				print ('Alerte sonde, mail déjà envoyé')
			end
		elseif modeAlarme == 'sondeBis' then 
			print ('Alerte sonde, mode sonde bis')
			if envoyerAlerte == 1 then
				print ('Alerte sonde, envoi d\'un mail')
				objet = 'Alerte chauffage '..thermostat
				message = 'Problème avec la sonde '..sonde..' - Passage du chauffage '..thermostat..' en mode sonde bis - la sonde utilisée est : '..sondeBis
				commandArray['SendEmail']= objet..'#'.. message .. '#' .. EmailTo
				commandArray['Variable:'..envoiMail] = tostring (1)
						
			else 
				print ('Alerte sonde, mail déjà envoyé')
			end
			local temperature = tonumber(otherdevices_svalues[sondeBis])
			if (temperature < (consigne - hysteresis) ) then
             print('Allumage du chauffage :'..radiateur)
             commandArray[radiateur]='On'
								
			elseif (temperature > (consigne + hysteresis)) then
            print('Extinction du chauffage:'..radiateur)
			commandArray[radiateur]='Off'
			end
				
		elseif modeAlarme == 'on' then
			print ('Alerte sonde, mode ON')
			print ('Allumage du chauffage :'..radiateur)
			commandArray[radiateur]='On'
			-- on envoi un mail sauf si c'est déjà fait
			if envoyerAlerte == 1 then
				print ('Alerte sonde, envoi d\'un mail')
				objet = 'Alerte chauffage '..thermostat
				message = 'Allumage permanent du chauffage'..thermostat..' - Problème avec la sonde '..sonde
				commandArray['SendEmail']= objet..'#'.. message .. '#' .. EmailTo
				commandArray['Variable:'..envoiMail] = tostring (1)
						
			else 
				print ('Alerte sonde, mail déjà envoyé')
			end
		end
		
		
end
		
-- Thermostat est off et il n'y a pas d'alerte sonde		
	 	
if (otherdevices[thermostat]=='Off') and (alarmeSonde == 0) then
		
		 if debug == 'oui' then print(thermostat..' : thermostat Off / alarme 0') end
         print('Extinction du chauffage :'..radiateur)
		 commandArray[radiateur]='Off'
		 		 
    end
	
-- Thermostat est off et il y a une alerte sonde	
	
if (otherdevices[thermostat]=='Off') and (alarmeSonde == 1) then
		
		
		if debug == 'oui' then print(thermostat..' : thermostat Off / alarme 1') end
		print ('Extinction du chauffage :'..radiateur)
		commandArray[radiateur]='Off'
		-- on envoi un mail sauf si c'est déjà fait
		if envoyerAlerte == 1 then
			print ('Alerte sonde, envoi d\'un mail')
			objet = 'Alerte chauffage '..thermostat
			message = 'Problème avec la sonde '..sonde..', inactive depuis plus de 10 minutes.'
			commandArray['SendEmail']= objet..'#'.. message .. '#' .. EmailTo
			commandArray['Variable:'..envoiMail] = tostring (1)
						
		else 
			print ('Alerte sonde, mail déjà envoyé')
		end
		
    end
	
	 
if debug == 'oui' then print('######## fin du debug script time chauffage ########') end
 
 return commandArray
Encore une fois, je précise que je n'ai rien inventé, j'ai surtout pompé les bonnes idées chez les autres :D :D Alors merci 'les autres' :lol: :lol:
Domoticz sur RPi - RfxCom - Sondes oregon DIY - Bus one wire - sondes DS18B20 - BMP085 - Home confort
http://electro.bassignyinformatique.fr/
Répondre