Re: Lua script - Thermostat with planning & localisation
Posted: Saturday 19 March 2022 16:04
by Alain59720
Hello people,
Voici ma version fonctionnelle basée sur le projet de Froggy ! Merci Froggy
Thermostat de chauffage virtuel avec planning hebdomadaire et fonction absent et Boost.
Création des virtual devices :
ThermostatChauffage_Cycle
Interrupteur/sélecteur virtuel pour définir le cycle de chauffage, MANUEL(0)/PLANNING(10)/ABSENT(20)/BOOST(30).
IDX = 119
'MANUEL' : Arrêt total du thermostat virtuel et commande manuelle extérieure.
'PLANNING' : Utilisation de la planification hebdomadaire (Température Confort/Réduite).
'ABSENT' : Force la température réduite.
'BOOST' : Booste la température de confort pour une période limitée et définie dans « Boost_duree_retour_defaut ».
Consigne_ABSENT
C’est un Thermostat - Setpoint. > Permet de modifier la valeur directement dans Domoticz.
Il définit la température réduite. « 15°C »
Consigne_PRESENT
C’est un Thermostat - Setpoint. Permet de modifier la valeur directement dans Domoticz.
Il définit la température de confort. « 19°C »
Temperature_consigne
C’est un Thermostat - Setpoint. Permet de définir/lire la température de fonctionnement dans le script Lua.
IDX = 121
Configuration :
Consigne_PRESENT
Nom du Thermostat - SetPoint pour la température de confort.
Consigne_ABSENT
Nom du Thermostat - SetPoint pour la température réduite.
Temperature_consigne_idx
Idx dans Domoticx du virtual device « Temperature_consigne »
Hysteresis
Hysteresis de temperature.
Sonde
Nom de la sonde de température « CapTempTFA1_SALON_°C ».
ThermostatChauffage_Cycle
Nom de l'interrupteur/sélecteur virtuel ThermostatChauffage_Cycle.
ThermostatChauffage_Cycle_idx
IDX dans Domoticz de ThermostatChauffage_Cycle.
Boost_duree_retour_planning
Durée de retour de forçage/BOOST de température de confort vers température PLANNING.
Liste_radiateur
Liste des radiateurs à commander.
Url
Url du serveur Domoticz.
Planning
Plannification horaire hebdomadaire :
0 = Chauffage réduit/nuit.
1 = Chauffage pendant les heures de présence/Confort.
Lua script : (ThermostatVirtuel_Chauffage) (Trigger = Device)
-- Thermostat de chauffage virtuel avec planning hebdomadaire et fonction BOOST.
-- Lua script > ThermostatVirtuel_Chauffage > Trigger = Device >> Le script agit a chaque changement d'etat de la sonde.
-- Virtual devices :
-- 'ThermostatChauffage_Cycle' -Light/Switch-Selector/Switch MANUEL/PLANNING/ABSENT/BOOST.
-- 'Consigne_ABSENT' - Thermostat - SetPoint - 15C.
-- 'Consigne_PRESENT' - Thermostat - SetPoint - 19C.
-- 'Temperature_consigne' - Thermostat – Setpoint - Température de fonctionnement/Script.
-------------------------------------------------------------------
-- Definition des variables :
local Consigne_PRESENT = otherdevices_svalues['Consigne_PRESENT'] -- Temperature de fonctionnement si present, valeur definie dans le set point.
local Consigne_ABSENT = otherdevices_svalues['Consigne_ABSENT'] -- Temperature de fonctionnement si absent, valeur definie dans le set point.
local Temperature_consigne_idx = 121 -- Idx pour affichage temperature de fonctionnement.
local Hysteresis = 0.1 -- Valeur hysteresis.
local Sonde = 'CapTempTFA1_SALON_°C' -- Nom de la sonde de temperature.
local ThermostatChauffage_Cycle = 'ThermostatChauffage_Cycle' -- Nom de l'interrupteur virtuel du ThermostatChauffage_Cycle.
local ThermostatChauffage_Cycle_idx = 119 -- IDX de ThermostatChauffage_Cycle.
local Boost_duree_retour_planning = 2 -- Nb heures avant retour en mode PLANNING apres un forcage BOOST.
local Liste_radiateur =
{-- Liste des radiateurs
'SONOFF03_Chaudière_On/30sOff'
}
local Url = 'h-t-t-p://192.168.80.128:8080' -- Url du serveur Domoticz.
local Planning =
{
-- 0 = Chauffage réduit/nuit.
-- 1 = Chauffage pendant les heures de presence/confort.
-- Heure >> 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 << (Durant cette heure).
Monday = { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
Tuesday = { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
Wednesday= { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
Thursday = { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
Friday = { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
Saturday = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
Sunday = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0}
}
-- Fin de definition des variables
---------------------------------------------------------------
local Consigne = 0 -- Definition variable Consigne et init à 0.
local log = os.date('%A') .. ' ' .. os.date('%H') .. ':' .. os.date('%M') .. ' '
local Presence = true -- Si true, on chauffe, sinon test d'exclusion/planning.
local Planning_etat = Planning[os.date('%A')][tonumber(os.date('%H'))+1]
-- Definition de la fonction qui arrondi a 2 decimales.
function round(num, dec)
local mult = 10^(dec or 2)
return math.floor(num * mult + 0.5) / mult
end
-- Definition de la fonction Commande_radiateur.
function Commande_radiateur(radiateur, commande)
for key,value in pairs(radiateur) do
commandArray[value]=commande
end
end
commandArray = {}
-- La sonde « CapTempTFA1_SALON_°C » defini l appel. Nota ~= is not equals.
if (devicechanged[Sonde]) and (otherdevices[ThermostatChauffage_Cycle]~='MANUEL') then
local Temperature = devicechanged[string.format('%s_Temperature', Sonde)] --Temperature relevee sur la sonde du salon.
-- On est absent, Consigne_ABSENT.
if (otherdevices[ThermostatChauffage_Cycle]=='ABSENT') then
log = log .. '< < < < < < < Thermostat chauffage sur ABSENT > > > > > > > - '
Presence = false
end
-- On est present, Consigne_BOOST, on regule via le script de forcage BOOST.
if (otherdevices[ThermostatChauffage_Cycle]=='BOOST') then
log = log .. '< < < < < < < Thermostat chauffage sur BOOST > > > > > > > - '
Presence = true
end
-- On est en programmation 'PLANNING' hebdomadaire.
if (otherdevices[ThermostatChauffage_Cycle]=='PLANNING') then
log = log .. '< < < < < < < Thermostat chauffage sur PLANNING HEBDOMADAIRE > > > > > > > - '
if (Planning_etat == 0) then -- Chauffage en heures réduit.
log = log .. 'Température REDUITE - '
Presence = false
elseif (Planning_etat == 1) then -- Chauffage en heures presence/confort.
log = log .. 'Température CONFORT - '
Presence = true
end
end
-- On definit la temperature de fonctionnement dans le dispositif virtuel « Temperature_consigne ».
if (Presence == true) then
Consigne = Consigne_PRESENT
else
Consigne = Consigne_ABSENT
end
commandArray['OpenURL']= Url .. '/json.htm?type=command¶m=udevice&idx=' .. Temperature_consigne_idx .. '&svalue=' .. Consigne
-- On gere l'allumage du chauffage/radiaturs
if (Temperature < (Consigne - Hysteresis) ) then
log = log .. 'Allumage du chauffage - '
Commande_radiateur(Liste_radiateur, 'On')
elseif (Temperature > (Consigne + Hysteresis)) then
log = log .. 'Extinction du chauffage - '
Commande_radiateur(Liste_radiateur, 'Off')
elseif (Temperature >= (Consigne - Hysteresis)) and (Temperature <= (Consigne + Hysteresis)) then
log = log .. 'Température en zone hystérésis - '
end
-- On verifie si on est en heure de boost.
if (otherdevices[ThermostatChauffage_Cycle] == 'BOOST') then
local Last_update = otherdevices_lastupdate[ThermostatChauffage_Cycle]
local Heure_lastupdate = string.sub(Last_update, 12, 13)
local Minute_lastupdate = string.sub(Last_update, 15, 16)
local Heure = os.date('%H')
local Minute = os.date('%M')
if (Heure_lastupdate * 60 + Minute_lastupdate + Boost_duree_retour_planning * 60 < Heure * 60 + Minute) then
commandArray['OpenURL']= Url .. '/json.htm?type=command¶m=udevice&idx=' .. ThermostatChauffage_Cycle_idx .. '&svalue=10'
log = log .. 'Thermostat sur PLANNING HEBDOMADAIRE - '
end
end
-- On ecrit une ligne de log unique.
print (log .. 'Consigne Chauffage °C ' .. round(Consigne) .. ' - Température du salon °C ' .. round(Temperature))
end
return commandArray