[LUA] YASDC (Yes Another Script De Chauffage) !

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.
Répondre
Nissa
Messages : 96
Inscription : 21 déc. 2015, 23:38
Localisation : Bordeaux

[LUA] YASDC (Yes Another Script De Chauffage) !

Message par Nissa »

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
Image
Image

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

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é)
Image

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
Image

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

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)
Image

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 :
Image

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
Dernière modification par Nissa le 19 nov. 2017, 10:17, modifié 9 fois.
Domoticz sur RPI4 / Rflink / Rftrxcom / Sondes thermo sur 1Wire / Volets Somfy rts / Divers modules 433 mhz pas chers / Poele à pellets Ravelli domotisé / Volets Bubendorf / SonOff / Arrosage enterré sur SonOff 4 / Robot piscine domotisé
Nissa
Messages : 96
Inscription : 21 déc. 2015, 23:38
Localisation : Bordeaux

Re: YASDC (Yes Another Script De Chauffage) !

Message par Nissa »

Les images ne passent pas, j'ai pourtant utilisé les balises img avec un lien partagé pointant sur mon drive google.
Quelqu'un peut-il me dire comment faire ?
Domoticz sur RPI4 / Rflink / Rftrxcom / Sondes thermo sur 1Wire / Volets Somfy rts / Divers modules 433 mhz pas chers / Poele à pellets Ravelli domotisé / Volets Bubendorf / SonOff / Arrosage enterré sur SonOff 4 / Robot piscine domotisé
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: YASDC (Yes Another Script De Chauffage) !

Message par vil1driver »

Salut,

Au lieu de mettre ce lien dans ta balise
https://drive.google.com/file/d/0BwEsnkGZcHZhanYybXJqZVZFZmc/view
Mets ceci
https://drive.google.com/uc?id=0BwEsnkGZcHZhanYybXJqZVZFZmc
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Nissa
Messages : 96
Inscription : 21 déc. 2015, 23:38
Localisation : Bordeaux

Re: YASDC (Yes Another Script De Chauffage) !

Message par Nissa »

vil1driver a écrit :Salut,

Au lieu de mettre ce lien dans ta balise
https://drive.google.com/file/d/0BwEsnkGZcHZhanYybXJqZVZFZmc/view
Mets ceci
https://drive.google.com/uc?id=0BwEsnkGZcHZhanYybXJqZVZFZmc
Merci Vil1driver, sans toi ma domotique ne serait pas ce qu'elle est ! :)
Domoticz sur RPI4 / Rflink / Rftrxcom / Sondes thermo sur 1Wire / Volets Somfy rts / Divers modules 433 mhz pas chers / Poele à pellets Ravelli domotisé / Volets Bubendorf / SonOff / Arrosage enterré sur SonOff 4 / Robot piscine domotisé
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: YASDC (Yes Another Script De Chauffage) !

Message par vil1driver »

Merci :oops:
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Gaz
Messages : 224
Inscription : 17 oct. 2015, 10:30

Re: YASDC (Yes Another Script De Chauffage) !

Message par Gaz »

Merci pour ce TUTO
Snorky
Messages : 79
Inscription : 02 oct. 2016, 22:13

Re: YASDC (Yes Another Script De Chauffage) !

Message par Snorky »

Tuto conservé quand j'aurais acheté les modules rail din pour mes radiateurs.

Petite question : mon chauffage est électrique, j'ai un thermostat qui contrôle tous mes radiateurs (mode confort, mode éco, mode auto).

Sur chaque radiateur, je modifie la température.

Sur quel mode vous mettez votre thermostat général ?

Merci
DomoticzVersion: V3.8153, CustomPage, GoogleHome
Pi3 Modèle B + RFXCom + Razberry
RFX: Sonde OREGON THGR122, Capteur ouverture Trust AMST-606, Compteur conso OWL Micro+ CM180
ZWave: FGMS001
Nissa
Messages : 96
Inscription : 21 déc. 2015, 23:38
Localisation : Bordeaux

Re: YASDC (Yes Another Script De Chauffage) !

Message par Nissa »

Snorky a écrit :Tuto conservé quand j'aurais acheté les modules rail din pour mes radiateurs.

Petite question : mon chauffage est électrique, j'ai un thermostat qui contrôle tous mes radiateurs (mode confort, mode éco, mode auto).

Sur chaque radiateur, je modifie la température.

Sur quel mode vous mettez votre thermostat général ?

Merci
Chaque radiateur est controlé par Domoticz qui selon la température de la pièce allume ou éteint le radiateur. Donc le thermostat du radiateur n'est pas utilisé. Pour ma part je laisse le thermostat de chaque radiateur en mode confort, sachant que de toute façon c'est Domoticz qui prime sauf en cas de défaillance du module radio (ce qui ne m'est jamais arrivé).
Domoticz sur RPI4 / Rflink / Rftrxcom / Sondes thermo sur 1Wire / Volets Somfy rts / Divers modules 433 mhz pas chers / Poele à pellets Ravelli domotisé / Volets Bubendorf / SonOff / Arrosage enterré sur SonOff 4 / Robot piscine domotisé
Stef3376
Messages : 9
Inscription : 06 nov. 2016, 19:25

Re: YASDC (Yes Another Script De Chauffage) !

Message par Stef3376 »

Ton script est interressant il serait pas mal de le modifier pour faire un tableau de puissance pour les radiateurs au lieu d'enchainer des if si chaque radiateur à une puissance differente.
Nissa
Messages : 96
Inscription : 21 déc. 2015, 23:38
Localisation : Bordeaux

Re: YASDC (Yes Another Script De Chauffage) !

Message par Nissa »

Stef3376 a écrit :Ton script est interressant il serait pas mal de le modifier pour faire un tableau de puissance pour les radiateurs au lieu d'enchainer des if si chaque radiateur à une puissance differente.
Yapuka !
Pour mon cas je n'ai qu'un seul radiateur différent des autres, j'ai donc choisi la facilité, mais ton idée est intéressante. Il faudra synchroniser les deux tableaux, pas si simple.
Domoticz sur RPI4 / Rflink / Rftrxcom / Sondes thermo sur 1Wire / Volets Somfy rts / Divers modules 433 mhz pas chers / Poele à pellets Ravelli domotisé / Volets Bubendorf / SonOff / Arrosage enterré sur SonOff 4 / Robot piscine domotisé
Répondre