En convertissant une scène en mode block je suis tombé sur la fonction setTimeout.
Cette fonction retarde d'un delay défini l'exécution d'une séquence lua.
Si la fonction sleep suspend le déroulement d'une scène, la fonction setTimeout met en arrière plan les instructions de la fonction, mais la scène lua poursuit son cours.
--[[
%% properties
52 value
52 armed
%% globals
--]]
fibaro:debug("Start");
fibaro:debug("scene n "..fibaro:countScenes());
local val = fibaro:getValue(52, "value");
local arm = fibaro:getValue(52, "armed");
fibaro:debug("Etat "..val.." "..arm);
setTimeout(function() ------ début de la fonction
local delayedCheck0 = false;
local tempDeviceState0, deviceLastModification0 = fibaro:get(52, "value");
fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0);
if (( (tonumber(val) == 0 and tonumber(arm) == 0) ) and (os.time() - deviceLastModification0) >= 120) then
delayedCheck0 = true;
end
if ( delayedCheck0 == true ) then
fibaro:call(163, "turnOff");
end
end, 120000) ------- fin de lafonction avec delai de 120 secondes
fibaro:debug("End");
Le but de ce script est d'éteindre une lampe si plus d'activité (52 = détecteur de mouvement) pendant 2 mn.
Analyse du debug.
On voit que la scène s'exécute de Start à End en mettant la fonction timeout en attente.
A chaque passage, il y a deux scènes qui démarrent. Val = 1 activation du détecteur, val = 0 retour au repos après 20 secondes.
Quand le délai arrive à 120 secondes et pas de modification de l'état du détecteur, les instructions sont exécutées. Ici, éteindre la lumière.
Il me semble que cette fonction peut ouvrir des horizons pour nos petit bidouillages.