i-magin Posté(e) le 4 janvier 2014 Signaler Posté(e) le 4 janvier 2014 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
lolomail Posté(e) le 4 janvier 2014 Auteur Signaler Posté(e) le 4 janvier 2014 Le script marche nickel, un grand merci!!!
Krikroff Posté(e) le 4 janvier 2014 Signaler Posté(e) le 4 janvier 2014 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 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
lionel Posté(e) le 4 janvier 2014 Signaler Posté(e) le 4 janvier 2014 A qoui sert un ; a la fin d une ligne?
i-magin Posté(e) le 4 janvier 2014 Signaler Posté(e) le 4 janvier 2014 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
Krikroff Posté(e) le 4 janvier 2014 Signaler Posté(e) le 4 janvier 2014 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 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 .
i-magin Posté(e) le 4 janvier 2014 Signaler Posté(e) le 4 janvier 2014 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 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
Messages recommandés