Aller au contenu

Recommended Posts

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.

 

post-1115-0-67106500-1433153276_thumb.jpg

 

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. :D

  • Upvote 13

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui exactement.

 

Un exemple que j'ai utilisé ici http://www.domotique-fibaro.fr/index.php/topic/2226-thermostat-greenmomit-et-hc2/ afin d'attendre la vérification d'une condition sans bloquer l’exécution du script :)

--! async object
async={}
--! wait function
--@ param condition The condition
--@ param callback The callback function
function async:wait(condition, callback)
  --print('wait')
  assert(type(condition)=='function', 'wait(condition*) arg should be a function!')
  if (condition()) then
    if (callback and type(callback)=='function') then
      callback()
    end
    return
  else
    setTimeout(function()
        self:wait(condition, callback)
      end, 300)    
  end
end
 
function GreenMomit:getData()
  async:wait((function(...) return (self.isLogged==true) end), 
    function()
      self:onLogged()
      self:getUserThermostats()   
      self:update()
    end)
end
 
function GreenMomit:lunchConfig()  
  self:connectApi()
  async:wait((function(...) return (self.isConnected==true) end), 
    function()
      self:onConnected()
      self:loginApi()
      self:getData() 
    end)
end
  • Upvote 5

Partager ce message


Lien à poster
Partager sur d’autres sites

Quand je clique sur ton lien j'ai droit à"Vous n’avez pas la permission de voir ce forum."

Partager ce message


Lien à poster
Partager sur d’autres sites

alors la j'ai pas tout bien compris,

 

Le sleep met en pause avant de lire la suite du script et le settimeout met en pause sans empecher de lire la suite du script.

je ne comprends pas ce qui est mis en pause dans ce cas ?

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai mis des commentaires au début et àla fin de la fonction setTimeout.

C'est cette partie qui est mise en attente.

Partager ce message


Lien à poster
Partager sur d’autres sites

le function qui est en attente OK, ca permet d'attendre la verif de tes conditions et de terminer malgre tout le script

 

J'ai bon ? ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci berale24 j'avais déjàvu cette fonction mais je n'avais pas eu le temps de voir ca fonction j'ai ma réponse Merci

Envoyé de mon SM-G900F

Partager ce message


Lien à poster
Partager sur d’autres sites

Voilà  en fait ce que je voulais faire.

 

Les Mamies c'est bien, mais ça se lève la nuit pour satisfaire un besoin bien naturel.

Seulement les Mamies ça ne veut pas déranger, alors ça n'allume pas la lumière.

Résultat, ça se casse la gueule dans les meubles et ça réveille toute la maison.

 

J'ai donc mis un détecteur FGMS001 dans le couloir. Dès que Mamie sort de sa chambre, une lampe du salon s'allume et donne assez de lumière pour rejoindre les toilettes. Tant que Mamies baguenaude entre sa chambre, les toilettes ou la salle de bain, la lumière reste allumée.

Après 2 mn ça s’éteint.

--[[
%% properties
52 value
52 armed
%% globals
--]]

-- c'est le jour alors stop

if (fibaro:getGlobalValue("Day_Night") == "DAY") then
  fibaro:abort();
end

fibaro:debug("Start");

local val = fibaro:getValue(52, "value");
local arm = fibaro:getValue(52, "armed");
local scenenum = fibaro:countScenes();

fibaro:debug("Etat "..val.."  "..arm);
fibaro:debug("scene n "..scenenum);

-- premier déclanchement du détecteur
-- on allume et stop

if (val == "1" and scenenum == 1) then
  fibaro:call(163, "turnOn");
  fibaro:abort();
end

-- déclanchements suivants on attend 120s
-- pour éteindre

setTimeout(function()
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)

fibaro:debug("End");
  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Mais pourquoi ne pas avoir mis cela dans GEA du coup ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Parce tout le monde n'utilise pas GEA certains préfère faire leurs propres codes lua

Envoyé de mon SM-G900F

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu as raison Nico, mais si j'installe GEA je n'apprends pas LUA.... CQFD !!! ;)

 

PS: Si Fibaro avait de la jujotte, ils achèteraient les droits de GEA, écriraient une interface graphique avec plein de zolis widgets, ça génèrerait les commandes GEA automatiquement et hop!!!ils auraient un outils extraordinaire.

Oui, heu !!! ils ont du boulot avec la V4....

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

une solution tu remplaces la mamie de 40ans par 2 jeunes de 20 ans mais je suis pas sur que tu dormes mieux :2:

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Non,non, je parle de mamies de 80, alors ça fait 4 de 20 et là, je ne crois pas pouvoir suivre la cadence ..... :(

Partager ce message


Lien à poster
Partager sur d’autres sites

Berale24 : Oui bien sûr pour l'apprentissage du lua, sorry :)

En fait je suis partisans de la simplification maximum, donc j'essaie d'avoir le minimum de chose qui tourne en même temps.

Partager ce message


Lien à poster
Partager sur d’autres sites

 @mprinfo,

Des mamies de 40 ans, ça va pas mieux, toi? ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

@nico a trop vouloir simplifier on complique tout...... :P

Partager ce message


Lien à poster
Partager sur d’autres sites

@Nico: Moi aussi. la grande majorité de mes scènes est actionnée par des triggers. Tout ce qui dépend d'un timer est géré par le petit scheduler que j'ai publié quelque part sur le forum. Il ne reste que la filtration de la piscine et de la PaC qui méritent un traitement à  part.

 

Avec la HCL j'avais plein de scène, maintenant en LUA et en rationalisant c'est de désert ! :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Moi j'en suis à4, et encore je pourrai en supprimer une en la GEATISANT, mais pas eu le temps encore :)

Partager ce message


Lien à poster
Partager sur d’autres sites

@Nico: Quand j'ai lu "moi j'en 4" ça m'a foutu un coup !!! :93:

Non,non, je parle de mamies de 80, alors ça fait 4 de 20 et là, je ne crois pas pouvoir suivre la cadence ..... :(

Partager ce message


Lien à poster
Partager sur d’autres sites

4 ben il est bien plus speed que je ne le pensé mon voisin GEATISANT c'est une marque de pilules bleue?

Envoyé de mon SM-G900F

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

:) :) :)

De 20 ans en plus, mes nuits seraient chaudes mouarf :) Maintenant j'en ai déjà3 des femmes àla maison lol

Partager ce message


Lien à poster
Partager sur d’autres sites

la Home center 2 ne compte pas :D

Partager ce message


Lien à poster
Partager sur d’autres sites

moi je veux bien les adopter si sont majeurs hein ^^

 

Toujours dis a ma femme, si elle veut un 3ieme (fille) j'adopte mais majeur direct :D

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Berale pour ce script,

Ca donne une bonne base pour tricoter autour.  :P

Partager ce message


Lien à poster
Partager sur d’autres sites

×