Lua script - Thermostat with planning & localisation

Moderator: leecollings

Post Reply
Froggy
Posts: 4
Joined: Sunday 26 November 2017 17:12
Target OS: -
Domoticz version:
Contact:

Lua script - Thermostat with planning & localisation

Post by Froggy »

Hello people,

I create a new wiki page about the thermostat i'm using at home. Feel free to comment.
https://www.domoticz.com/wiki/Thermostat_planning

I will try to work and another version maybe more readable.
asetsko
Posts: 1
Joined: Monday 02 December 2019 19:47
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Lua script - Thermostat with planning & localisation

Post by asetsko »

Hi, thank you for the script!

Is the script device triggered? Meaning does it trigger only when device changed? What do I do if I want to update it every X minutes, e.g. when I set up schedule and it reaches a moment when you need to switch into another temperature will it react if temperature is stable but differs from the set value by thermostat set point?

Thanks in advance for your help!
Alain59720
Posts: 1
Joined: Saturday 05 March 2022 21:17
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Lua script - Thermostat with planning & localisation

Post 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&param=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&param=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
Post Reply

Who is online

Users browsing this forum: No registered users and 0 guests