Mes scripts de chauffage finalement

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Mes scripts de chauffage finalement

Message par rimram31 »

C'est la lecture d'un autre post qui m'a poussé a finalement poster mes scripts de chauffage.

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 ;) ça donne ça:

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
Une fonction donc qui accepte en entrée une liste de capteurs de T (sensors), une liste de switchs (radiators) a allumer/éteindre, des switchs actif/présent, la T eco, le delta (marge) de l'hysteresis et l'intervalle en minute de renvoi de la commande. J'ai gardé thermostats pour la fin, c'est en fait un dictionnaire contenant en entrée un thermostat On/off (planifié a priori) avec la température de consigne correspondante. C'est le + souvent un seul thermostat mais dans le cas de ma salle de bains, deux, le premier pour la consigne confort, le second pour l'exception "bain".

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 ;) ;) ;) on compare la T relevée a la T de consigne et on allume ou on éteint l'ensemble des radiateurs indiqués avec renvoi toutes les nn minutes par sécurité de la commande sauf si "disable" alors on éteint dans tous les cas.

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
Ma fonction hysteresis précédente est dans un script lua dans un sous répertoire modules, d'où le require au début qui va faire en fait un "include".

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 :-) bon pas se moquer ...)
'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.
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: Mes scripts de chauffage finalement

Message par rimram31 »

Dernier point pour compléter mes modes confort On/Off sont disponibles sous la forme de gros boutons dans une interface ImperiHome sur mon portable pour forcer le mode au besoin (qui restera donc dans cet etat jusqu'au prochain créneau horaire planifié sauf nouvelle action manuelle).
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
Répondre