Aller au contenu

Script ouverture de porte avec notification si ouvert plus de 30 secondes


lolomail

Messages recommandés

Il existe plusieurs types de variables

Commençons par deux d'entre eux :

- nombres

- chaînes de caractères

On peut changer le "typage" de variables par des fonctions

"Tonumber" permet de passer d'une valeur "caractères" àune valeur "nombre"... et donc de la comparer àune valeur numérique

Lien vers le commentaire
Partager sur d’autres sites

 

Finalement, on peut faire plus court... j'ai bon @krikroff ?

--[[
%% properties
19 value
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
if ( tonumber(fibaro:getValue(19, "value")) > 0 ) then
local timer = os.time()
while ( (os.time() - timer) < 30) do
-- on patiente 30 secondes
end
if ( tonumber(fibaro:getValue(19, "value")) > 0 ) then
fibaro:debug("porte ouverte depuis 30 secondes")
end
end

 

 

Super i-magin :)

 

Pour la comparaison j'utiliserais plus cela par habitude, "os.difftime" retourne la différence en secondes entre deux timer (et arrondi le résultat).

local ElapsedTime = os.difftime(os.time(), timer);

Aussi la ligne suivante n'est pas utilisé par le script ;), fibaro:getSourceTrigger() est utile si vous souhaitez savoir le trigger "source" pour la scène.

local startSource = fibaro:getSourceTrigger();

Bon après réflexion un fibaro:sleep(30000) fait aussi l'affaire :rolleyes: alors:

--[[
%% properties
19 value
%% globals
--]]
 
if ( tonumber(fibaro:getValue(19, "value")) > 0 ) then
  fibaro:sleep(30000);  -- 30 secondes d'attente
  if ( tonumber(fibaro:getValue(19, "value")) > 0 ) then
    fibaro:debug("porte ouverte depuis 30 secondes");
  end
end
Lien vers le commentaire
Partager sur d’autres sites

J'écris vite fait car je dois me sauver...

La fonction "sleep" m'interroge et je n'aurai pas le temps de faire vraiment des tests

Si je paramètre "sleep" à  1 minute par exemple, est-ce que le changement d'état de la porte sera détecté durant cette période d'attente de 1 minute ?

Je veux dire, est-ce qu'une (ou plusieurs) fermeture/ouverture dans l'intervalle sera détectée ?

Si oui, c'est tout bon... sinon, notre test de porte ouverte durant 1minute est faussé

 

@lionelA : pour le ; j'ai bien l'impression qu'il ne sert à  rien

Lien vers le commentaire
Partager sur d’autres sites

Bon alors, un fibaro:sleep() c'est en fait traduit par une boucle while ;) avec comme condition de sortie de boucle le dépassement de la valeur du sleep, d'ou le côté bloquant du sleep car nous ne pouvons pas intervenir dans la boucle ... et la boucle est bouclée :D

 

Pour le ; c'est une convention de nommage et je vous invite à  la respecter (déformation professionnelle), LUA détermine la fin de ligne par retour chariot ou ";" et rien ne garantit que vos codes conserveront le formatage actuel, par expérience en programmation les surprises arrivent vite ! Autant anticiper ;) .

Lien vers le commentaire
Partager sur d’autres sites

Je comprends donc que : fibaro:sleep() = while...do

C'est bien pourquoi, dans l'un de mes scripts (voir ci-après), je proposais une boucle while..do avec une fonction sleep très courte

Je voulais arrêter très rapidement la boucle en cas de changement d'état du détecteur de porte

Mais, comme tu indiques que "getValue dans la boucle While  :huh: si il y a beaucoup de scène comme celle la, la base de donnée du votre HC2 va pas bien aimer" : on va éviter

--[[
%% properties
19 value
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
local timer = 0
if ( tonumber(fibaro:getValue(19, "value")) > 0 )
then
    while ( tonumber(fibaro:getValue(19, "value")) > 0  and timer < 30 ) do
    fibaro:sleep(5*1000)
    timer = (timer + 5)
    fibaro:debug("timer = " ..timer)
    end
  if ( timer == 30 ) then
  fibaro:debug("porte ouverte depuis 30 secondes")
    end
end
  1.  
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...