Page 1 sur 1

Ordre d'exécution à l'intérieur d'un script LUA

Publié : 21 nov. 2016, 13:05
par rapinou
Bonjour,

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 :

Image

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 commandArray
Mon problème est qu'avec le code actuel, il faut deux exécutions du script pour que l'interrupteur Fil pilote s'active ou non :
A 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.

Re: Ordre d'exécution à l'intérieur d'un script LUA

Publié : 21 nov. 2016, 17:19
par cedric2975
Salut

L'erreur ne viendrait pas du fait que tu déclares [mode] en local et non global?

Re: Ordre d'exécution à l'intérieur d'un script LUA

Publié : 21 nov. 2016, 18:59
par rapinou
Salut Cedric,
J'ai eu aussi cette idée, mais pas réussi en jouant là-dessus.
J'y suis cependant arrivé en décomposant le tout et en ne récupérant plus la valeur de "mode" dans le sélecteur.

Code : Tout sélectionner

-- Modification du sélecteur de mode
	if (otherdevices[inter] == 'Off') then -- Si l'interrupteur général est coupé
		commandArray[selec_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[selec_mode]='Set Level: '..lvl_eco..''
	elseif (otherdevices[boost] == 'On') then -- Si marche forcée activée
		commandArray[selec_mode]='Set Level: '..lvl_conf..''
	else
		commandArray[selec_mode]='Set Level: '..planning..'' -- Récupération du planning
	end

-- Enregistrement de la variable "mode"
	if (otherdevices[inter] == 'Off') then -- Si l'interrupteur général est coupé
		mode = tonumber(lvl_off)
	elseif (otherdevices[absence] == 'On') or (lastSeen > '00:10') then -- Si mode absence activé ou sonde muette depuis +10 min
		mode = tonumber(lvl_eco)
	elseif (otherdevices[boost] == 'On') then -- Si marche forcée activée
		mode = tonumber(lvl_conf)
	else
		mode = tonumber(planning) -- Récupération du planning
	end
Il y a sûrement moyen de faire plus propre en regroupant les deux dans le même "if" mais je n'ai pas réussi à trouver la bonne syntaxe.
Ceci dit, tout fonctionne, je suis un jeune utilisateur de domoticz heureux :D

Re: Ordre d'exécution à l'intérieur d'un script LUA

Publié : 24 nov. 2016, 12:25
par rapinou
J'ai réussi à faire plus propre en regroupant le tout dans la même boucle :D

Code : Tout sélectionner

-- Modification du sélecteur de mode
	if (otherdevices[inter] == 'Off') then -- Si l'interrupteur général est coupé
		commandArray[selec_mode]='Set Level: '..lvl_off..''
		mode = tonumber(lvl_off)
	elseif (otherdevices[absence] == 'On') or (lastSeen > '00:10') then -- Si mode absence activé ou sonde muette depuis +10 min
		commandArray[selec_mode]='Set Level: '..lvl_eco..''
		mode = tonumber(lvl_eco)
	elseif (otherdevices[boost] == 'On') then -- Si marche forcée activée
		commandArray[selec_mode]='Set Level: '..lvl_conf..''
		mode = tonumber(lvl_conf)
	else
		commandArray[selec_mode]='Set Level: '..planning..'' -- Récupération du planning
		mode = tonumber(planning)
	end