Je suis parti au départ d'un hystérésis inspiré d'un script ici, le principe un script time qui compare la température relevée a la température de consigne et "bêtement" allume ou éteint selon, en électrique on ajoute une petite marge pour avoir un peu d'inertie. Autre idée piquée ici, le calcul de la température de consigne qui s'effectue en fonction d'objets thermostat contenant les températures de confort, eco et donc modifiables directement dans le GUI de domoticz + des interrupteurs virtuels On/Off pour la gestion des planning horaires/jours.
Mes petites adaptations:
- En faire une fonction car j'ai 7 zones de chauffage!
- Pouvoir avoir plusieurs sondes de T avec gestion du défaut comm (si pas de refresh pendant ... ignorer sonde, si pas de sonde dispo => Off)
- Avoir aussi potentiellement plusieurs radiateurs/switchs pour une zone (en fait j'ai dans mon salon deux radiateurs).
- Gérer un mode présence = si Off -> eco tout le temps
- Gérer un mode (in)actif = Si Of (inactif) forcer a Off (pensé a l'époque en cas de détection de pb de transmission ordres, je suis en 433)
- Comme je suis en 433, répéter un ordre régulièrement si T toujours pas dans les clous
- Pouvoir avoir des créneaux horaires "d'exception". L'idée, ma salle de bain, la gérer comme une une autre zone confort/éco mais permettre un créneau horaire plus chaud pour les horaires habituels des douches.
Je pense avoir fait le tour
Code : Tout sélectionner
--
-- Hysteresis with multiple confort temperature
--
-- sensors: list, sensors (dz name) to measure temperature, the average is calculated
-- thermostats: array (dict) - the idea is to have a on/off switch for "confort" temperature, having several thermostat
-- with several "confort" temperature allow some exception (I'm using this for bathrooms)
-- radiators: list, radiators (dz name) of switches to set on/off when needed
-- eco: eco temperature
-- hyst: hysteresis margin
--
function hysteresis(sensors, thermostats, radiators, active, present, eco, hyst, resend)
commands = {}
time=os.time()
minutes=tonumber(os.date('%M',time))
hours=tonumber(os.date('%H',time))
local consigne = eco
if (present == nil or (otherdevices[present]=='On')) then
for thermostat,value in pairs(thermostats) do
if (otherdevices[thermostat]=='On') then
if (value > consigne) then
consigne = value
end
end
end
end
-- Sensor list average
local sum = 0
local count = 0
for _, sensor in pairs(sensors) do
-- uptodate ? (15mn)
if (lastupdate(sensor) < 900) then
sum = sum + tonumber(string.sub(otherdevices_svalues[sensor],1,4))
count = count + 1
end
end
local temperature = 0
local disable = true
if (count > 0) then
temperature = (sum / count)
disable = (otherdevices[active]=='Off')
end
if ( (not disable) and (temperature < (consigne - hyst)) ) then
for _, radiator in pairs(radiators) do
if (otherdevices[radiator]=='Off' or (resend == 0 or minutes%resend==0)) then
commands[radiator]='On'
end
end
elseif ((disable) or (temperature >= (consigne + hyst))) then
for _, radiator in pairs(radiators) do
if (otherdevices[radiator]=='On' or (resend == 0 or minutes%resend==0)) then
commands[radiator]='Off'
end
end
end
return commands
end
La fonction commence par balayer les thermostats pour déterminer la T de consigne gérant aussi la présence (si absent T reste a eco). Elle détermine ensuite la moyenne de la T sur l'ensemble des capteurs en excluant ceux qui ne communiquent plus (depuis + de 15mn). Si aucun capteur ok ou si switch actif est a Off, on se met en mode "disable".
Enfin
OUF, enfin on peut utiliser ce "truc", exemple le script_time de ma salle de bain (script_time_sdb_bas.lua):
Code : Tout sélectionner
package.path = package.path..";/home/pi/domoticz/scripts/lua/modules/?.lua"
require 'functions_hysteresis'
local confort = tonumber(otherdevices_svalues['Confort'])
local confort_bains = tonumber(otherdevices_svalues['Consigne Bains'])
local eco = tonumber(otherdevices_svalues['Eco'])
commandArray = hysteresis({ 'Sonde Salle de Bains bas'},
{ ['Mode confort Nuit'] = confort, ['Mode confort Bain'] = confort_bains },
{ 'Radiateur Salle de Bains bas'},
'Actif Salle de Bains bas', 'Presence Salle de Bains bas',
eco, 0.15, 30)
return commandArray
Si vous avez tout suivi, 'Confort', 'Consigne Bains' et 'Eco' sont des thermostats (créer capteur virtuel -> consigne de thermostat). Ca apparait dans l'onglet "Mesures" et on peut régler les consignes de T (en éditant ou en cliquant sur l'icone pour faire +/- facilement, c'est le but!)
'Sonde Salle de Bains bas' c'est mon capteur de T dans la salle de bains en question, je n'en ai qu'un ici (et toujours d'ailleurs
'Mode confort Nuit' est un switch virtuel On/Off de mes zones "mode nuit" (mon salon est géré différemment, en "mode jour") avec planning semaine et we des heures d'allumage/extinction. 'Mode confort Bain' est aussi un switch virtuel avec planning, il contient les créneau horaires a On des périodes pour les douches (semaine et we aussi). En fait la fonction hysteresis va prendre la T de confort la élevée (zut pas d'ordre garanti dans les dictionnaires LUA pour les initiés...).
'Radiateur Salle de Bains bas' c'est le switch a allumer, comme expliqué c'est une liste, il peut y en avoir plusieurs.
'Actif Salle de Bains bas', 'Presence Salle de Bains bas' les switchs actif/présent. Présence prévu pour être actionné "manuellement", utile quand on a un chateau comme moi pour ne pas allumer certaines zones
Enfin le 0.15 est un peu "bidon" pour le delta mais ça oscille autour de 0.3° donc (j'ai en réalité beaucoup d'intertie ... je réfléchis a améliorer ça) et le 30 dernier paramètre renvoie donc les commandes toutes les 30mn.
J'ai autant de script_time que j'ai de zones a piloter, chacune réutilise la même fonction avec évidement les éléments correspondants. Je réutilise par contre les mêmes modes confort jour/nuit et bains.
J'ai récemment encore repris le truc en ajoutant la gestion des périodes jours fériés et vacances où étant a priori a la maison, je suis en mode "présent" comparable aux we. Je décris ça ici: viewtopic.php?f=10&t=1248#p10850
Désolé pour la longueur du post que j'espère pas trop indigeste.