Voici mon script concernant un thermostat d'ambiance programmable qui tient compte de la température extérieure :
- les horaires de programmation sont des variables domoticz nommées lundi,mardi ... dimanche. c'est une chaîne de caractère gérant 3 horaires de chauffe : 06:00-08:00 | 11h00-13h00 | 17:00-22:00 . les délimiteurs sont les ":" pour trouver chaque horaires de fonctionnement.
Pendant les heures, le thermostat tient compte de sa consigne de base mais aussi de la température extérieur
Lorsque nous sommes en dehors des heures, le chauffage est réglé a une température de 18°C (variable domoticz aussi)
Un bouton présence permet d'activé la consigne si l'on souhaite chauffé en dehors des heures programmées. (bouton repasse automatiquement à OFF en fin de journée pour ne pas "polluer" la journée suivante)
- la température extérieure apparaît donc dans le calcul de la consigne de chauffe : consigne = arrondir((consignebase + (tonumber(otherdevices_svalues[ext])/-15) +1),1) = la température est divisé par -15 et on rajoute 1, cela signifie que pour une température de 0°C on ajoute (0/-15 + 1) = 1°C a la consigne de base et pour une température extérieure au delà de 15°C la consigne commence à diminuer.
Ce réglage ne concerne que mon ressentit personnel et chacun est libre de l'adapter à son habitat.
- il y'a également un compteur de temps de chauffe afin de voir combien de temps fonctionne ma chaudière et si cela peut être optimisé par la suite.
PS : ceci est mon premier script ...
Code : Tout sélectionner
-------------------------------- Variable à parametrer------------------------------------------------
local consignebase = tonumber(otherdevices_svalues['consigne thermostat']) --Température de consigne
local consignenuit = tonumber(uservariables['Temperature nuit/absence']) --Température de consigne nuit/absence
local hysteresis = uservariables['Hysterisis'] --Valeur seuil pour éviter que le relai ne cesse de commuter dans les 2 sens
local sonde,ext = 'Salon','Exterieur' --Nom des sonde de température
local thermostat = 'Thermostat' --Nom de l'interrupteur virtuel du thermostat
local radiateur = 'Chauffage' --Nom du radiateur à allumer/éteindre
local tempschauffage = tonumber(uservariables['Compteur chauffe']) --Temps d'activitée du chauffage
local delai = 50 --Temps d'actualisation du thermostat
local t17 = '22:00' --Heure reset bouton présence
--------------------------------
commandArray = {}
----------------------------Temps entre 2 actualisation-------------------------------------------
heure_actuelle=os.time()
heure_precedente2=uservariables['heure_precedente2'] +delai
if (heure_actuelle > heure_precedente2) then
commandArray['Variable:heure_precedente2']=tostring(heure_actuelle)
------------- Lecture numéro du jour de la semaine et heure actuelle----------------------------
t0 = tonumber(os.date("%u"))
t1 = os.date("%H:%M")
------------- horaires du jours actuel------------------------------------------------------------
if t0 == 1 then
t10 = uservariables['Lundi']
elseif t0 == 2 then
t10 = uservariables['Mardi']
elseif t0 == 3 then
t10 = uservariables['Mercredi']
elseif t0 == 4 then
t10 = uservariables['Jeudi']
elseif t0 == 5 then
t10 = uservariables['Vendredi']
elseif t0 == 6 then
t10 = uservariables['Samedi']
elseif t0 == 7 then
t10 = uservariables['Dimanche']
end
l1 = string.len(t10)
-------------- On recherche les horaires saisies ------------------------------------------------
t11 = string.sub (t10, string.find(t10, ":")-2,string.find(t10, ":")+2)
t12 = string.sub (t10, string.find(t10, ":",5)-2,string.find(t10, ":",5)+2)
if l1 > 15 then
t13 = string.sub (t10, string.find(t10, ":",14)-2,string.find(t10, ":",14)+2)
t14 = string.sub (t10, string.find(t10, ":",21)-2,string.find(t10, ":",21)+2)
else
t13 = '23:00'
t14 = '23:00'
end
if l1 > 30 then
t15 = string.sub (t10, string.find(t10, ":",28)-2,string.find(t10, ":",28)+2)
t16 = string.sub (t10, string.find(t10, ":",33)-2,string.find(t10, ":",33)+2)
else
t15 = '23:00'
t16 = '23:00'
end
------------- Reset présence dans appartement en fin de journée (du lundi au vendredi) ------------
if (t0 >= 1 and t0 <= 5) and (t1 > t17) then
commandArray['Presence']='Off'
end
------------- Fonction arrondir --------------------------------------------------------------------
function arrondir(num, dec)
if num==0 then
return 0
else
local mult = 10^(dec or 0)
return math.floor(num * mult + 0.5)/mult
end
end
------------- Calcul de la consigne en fonction des horaires et température extérieure -------------
local temperature = tonumber(string.sub(otherdevices_svalues[sonde], 0, string.find(otherdevices_svalues[sonde], ";")-1))
if (otherdevices[thermostat]=='On') then
if ((t11 <= t1 and t1 <= t12) or (t13 <= t1 and t1 <= t14) or (t15 <= t1 and t1 <= t16) or (otherdevices['Presence']=='On'))then
consigne = arrondir((consignebase + (tonumber(otherdevices_svalues[ext])/-15) +1),1)
else
consigne = consignenuit
end
commandArray['Variable:Consigne']= tostring(consigne)
----------------------------- Compteur temps de chauffe--------------------------------------------
if (otherdevices[radiateur]=='On') then
tempschauffage = tempschauffage +1
else
tempschauffage=0
end
commandArray['Variable:Compteur chauffe']= tostring(tempschauffage)
--------------Régulation de la température avec mémorisation de l'état en variable texte------------------------
if (temperature < (consigne - hysteresis)) and (otherdevices[radiateur]=='Off') then
commandArray[radiateur]='On'
commandArray['UpdateDevice']= 21 ..'|0|'.. ('Chauffage allumé : consigne de '..consigne..' pour une température de '..temperature..'°C')
elseif (temperature > (consigne + hysteresis) and (otherdevices[radiateur]=='On')) then
commandArray[radiateur]='Off'
commandArray['UpdateDevice']= 21 ..'|0|'.. ('Chauffage éteint : consigne de '..consigne..'°C pour une température de '..temperature..'°C')
end
else
commandArray[radiateur]='Off'
end
end
return commandArray