Je débute dans l'écriture de script et je sèche sur une partie.
Pour un script dédié à la gestion de mes radiateurs via fil pilote, j'ai créé deux sélecteurs virtuels :
- Le premier (Planning chauffage RDC), comme son nom l'indique, me sert uniquement à enregistrer le planning des périodes Eco/Confort.
- Le second (Mode chauffage RDC) me sert à faire le point sur l'ensemble des interrupteurs virtuels pour savoir quel ordre donner au fil pilote :
Si l'interrupteur général est OFF, il est OFF. Si l'interrupteur Absence est ON, il se positionne sur ECO. Si Marche forcée est ON, il passe à CONFORT. Si aucune de ces 3 conditions n'est remplie, il récupère l'info du sélecteur Planning.
Selon le mode affiché sur ce second sélecteur (Mode chauffage RDC), il est ensuite déterminé la consigne pour la comparer avec la température renvoyée par la sonde, et activer ou non l'interrupteur Fil pilote.
Voici les interrupteurs et le script en question :

Code : Tout sélectionner
--------------------------------
------ Variables à éditer ------
--------------------------------
local zone = 'RDC' -- Nom de la zone de chauffe
local inter = 'Interrupteur général chauffage' -- Nom de l'interrupteur virtuel général des radiateurs de la maison
local absence = 'Absence chauffage' -- Nom de l'interrupteur virtuel d'absence
local boost = 'Marche forcée 1h chauffage RDC' -- Nom de l'interrupteur virtuel de marche forcée
local planning = 'Planning chauffage RDC' -- Nom du sélecteur virtuel de planning chauffage
local mode = 'Mode chauffage RDC' -- Nom du sélecteur virtuel d'indication de mode de chauffage Off/Confort/Eco
local radiateur = 'Fil pilote RDC' -- Nom de l'interrupteur virtuel d'action fil pilote
local sonde = 'RDC' -- Nom de la sonde de température
local consigne_conf = 'Thermostat RDC' -- Nom de thermostat virtuel de gestion de la température de confort
local diff_eco = 3 -- Différence de température entre les modes Confort et Eco
local lvl_off = 00 -- Niveau des sélecteurs de mode
local lvl_conf = 10
local lvl_eco = 20
--------------------------------
-- Fin des variables à éditer --
--------------------------------
function timedifference(d)
s = otherdevices_lastupdate[d]
year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)
t1 = os.time()
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = os.difftime (t1, t2)
return difference
end
-- Date du dernier relevé de température
local lastSeen = string.sub(os.date("!%X", timedifference(sonde)), 1, 5)
commandArray = {}
-- Relevé de température
local temperature = tonumber(string.sub(otherdevices_svalues[sonde],1,4))
print('temperature: '..temperature..'')
-- Récupération de la valeur du thermostat et du planning
consigne_conf = tonumber(otherdevices_svalues[consigne_conf])
consigne_eco = tonumber(consigne_conf - diff_eco)
planning = (otherdevices_svalues[planning])
-- Mode de chauffage
if (otherdevices[inter] == 'Off') then -- Si l'interrupteur général est coupé
commandArray[mode]='Set Level: '..lvl_off..''
elseif (otherdevices[absence] == 'On') or (lastSeen > '00:10') then -- Si mode absence activé ou sonde muette depuis +10 min
commandArray[mode]='Set Level: '..lvl_eco..''
elseif (otherdevices[boost] == 'On') then -- Si marche forcée activée
commandArray[mode]='Set Level: '..lvl_conf..''
else
commandArray[mode]='Set Level: '..planning..'' -- Récupération du planning
end
-- Récupération de la consigne à appliquer
mode = tonumber(otherdevices_svalues[mode])
print('mode: '..mode..'')
if mode == lvl_conf then
consigne = consigne_conf
else
consigne = consigne_eco
end
print('consigne: '..consigne..'')
-- Comparaison température/consigne et action fil pilote
if (mode == lvl_off or temperature >= consigne) then
commandArray[radiateur]='Off'
print('Chauffage '..zone..' OFF') -- Logs
else
commandArray[radiateur]='On'
print('Chauffage '..zone..' ON') -- Logs
end
return commandArrayA l'exécution du script, le sélecteur Mode chauffage RDC se positionne suivant les conditions énoncées plus haut. Mais l'interrupteur Fil pilote se positionne suivant la position du sélecteur à l'exécution du script précédente.
Comment forcer l'interrupteur Fil pilote à attendre la mise à jour du sélecteur Mode plutôt que récupérer sa valeur au début du script ?
Merci.