Aller au contenu

Messages recommandés

Posté(e)

Bonsoir,

 

Voila j'expose mon problème, j'ai un détecteur d'ouverture et je voudrais que si la porte reste ouverte plus de 30 secondes cela m'envoie une notification. Sur le forum Fibaro j'ai vu un script et j'ai demandé à  Andrew comment faire pour avoir la fonction "si ouvert plus de 30 secondes = notification", Andrew m'a dit d'utiliser une while loop, j'ai regardé le lien mais j'avoue que je ne sais pas comment faire.

 

Voici le script que j'ai mis sur ma HC2 et qui envoi une notif + email quand le détecteur détecte un ouverture de porte:

--[[
%% properties
154 value
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getValue(154, "value")) > 0 )
or
startSource["type"] == "other"
)
then
	fibaro:call(146, "sendDefinedPushNotification", "42");
	fibaro:call(2, "sendDefinedEmailNotification", "42");
end

Si quelqu'un peux m'expliquer comment marche une white loop et comment il faudrait faire pour mon cas de figure cela serait top.

 

Merci :D

Posté(e)

tu peux essayer de rajouter ça, pas vraiment sur ,pour ce coup, mais bon...

--[[
%% properties
154 value
%% globals
--]]
 
local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getValue(154, "value")) > 0 )
fibaro:sleep(30000)--30 secondes en milliseconds
 ( tonumber(fibaro:getValue(154, "value")) > 0 )
or
startSource["type"] == "other"
)
then
	fibaro:call(146, "sendDefinedPushNotification", "42");
	fibaro:call(2, "sendDefinedEmailNotification", "42");
end
Posté(e)

Merci pour ton retour, cela ne marche pas, j'ai le message d'erreur suivant:

[ERROR] 21:28:47: line 10: ')' expected (to close '(' at line 8) near fibaro)

Posté(e)

je m en doutais un peu,désolé

je vais faire un test 

et te fais un retour

mais a mon avis t aura surement aider le temps que je test  ^_^

Posté(e)
--[[
%% properties
154 value
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
if 
 ( tonumber(fibaro:getValue(154, "value")) > 0 )
then
    fibaro:sleep(30000)--30 secondes en milliseconds
 if( tonumber(fibaro:getValue(154, "value")) > 0 )
then
   fibaro:call(146, "sendDefinedPushNotification", "42");
fibaro:call(2, "sendDefinedEmailNotification", "42");
end
end

ça fonctionne chez moi ,mais vérifie des ID ,au cas ou j aurai laisser un des miens

Posté(e)

Super cela marche nickel!!! :60:

 

Je me dis que si je suis la logique et que je colle à  la suite le script ci-dessous:

if
( tonumber(fibaro:getValue(154, "value")) == 0 )
then
fibaro:sleep(10000)--10 secondes en milliseconds
if( tonumber(fibaro:getValue(154, "value")) == 0 )
then
fibaro:call(146, "sendDefinedPushNotification", "43");
fibaro:call(2, "sendDefinedEmailNotification", "43");
end
end

La HC2 devrait m'envoyer la notification 43 quand le detecteur se referme après 10 secondes non?

Posté(e)

Milles merci, le LUA va rentrer dans ma caboche àforce de faire ;) .

Demain je vais chercher a monter les composants pour l'interphone et si cela marche j'ai dans la tête de reprendre le script pour les rubans RGB qu'a posté domadial rédigé par Krikroff :rolleyes:

Posté(e)

Eh eh je vois qu'on a les même idées:

- Script météo pour l'armoire ou sont rangés les vestes avec un contacteur sur la porte pour déclencher la scène lors de l'ouverture de l'armoire

- Script lumineux pour avertir de l'utilisation de l'interphone

 

Va falloir commander des modules B)

 

Merci pour le lien sur le LUA il est sympa et explique des choses, faudrait le mettre en post-it je pense.

Posté(e)

Bon, va falloir que je me mette sérieusement au code LUA (j'ai très peu programmé et ceci il y a bien 25 ans !)

J'enrage de ne pouvoir vous donner la solution, donc juste une précision ....

Pour une durée de 30 secondes, ce code LUA avec la fonction "sleep" fera l'affaire puisque l'on peut supposer que durant l'intervalle de 30 secondes  il n'y aura pas de fermetures et ouvertures successives

La fonction "while... do" (tant que) serait plus appropriée avec une fonction "sleep" plus courte

Je pense que d'autres intervenants sur ce forum pourront donner la réponse

Posté(e)

J ai deja vu cette fonction sur l un des script,mais je dois avouer que je n en suis pas encore la :(

J en suis a mettre des fibaro:debug toute les 2 lignes pour savoir ce que fait le script :P

Lionel

Posté(e)

 

Merci pour le lien sur le LUA il est sympa et explique des choses, faudrait le mettre en post-it je pense.

 

Tu as raison, je pense que ça va aider, je l'épingle.

Posté(e)

Je ne voulais pas me déclarer battu :

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

local startSource = fibaro:getSourceTrigger();
if ( tonumber(fibaro:getValue(19, "value")) > 0 )
then
    while ( tonumber(fibaro:getValue(19, "value")) > 0 ) do
    fibaro:sleep(30*1000)
    fibaro:debug('porte ouverte')
    end
end

Ce script :

- démarre lorsque la porte est ouverte

- envoie un message debug toutes les 30 secondes si la porte est encore ouverte

- et ne s'arrête que si la porte est fermée

 

C'est un début  ;)

Posté(e)

@i-magin,merci pour la fonction "while do"

 

par contre dans le cas de @lolomail cela risque de lui envoyer la notification tout le temps? 

Posté(e)

Exact.... Jusqu'àce qu'il ferme la porte, puisque c'est l'objectif

Mais, si j'ai le temps ce matin, j'apporterai une variante

Posté(e)

@lionelA

Voici une variante de la boucle "tant.. que"

J'ai ajouté une seconde condition de sortie de cette boucle : une variable locale "timer" de 30 secondes

La boucle s'arrêtera donc si la porte est fermée et dans tous les cas au terme de 30 secondes.

Dans ce second cas, on obtient un message.... mais la porte n'est pas fermée  ;)

NB : J'ai réduit à  5 secondes la fonction "sleep"

--[[
%% 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
Posté(e)

La loqique de i-magin est la bonne car sans comparaison avec un timer il est impossible d'arriver à  un script fonctionnel. En revanche le 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 ;). J'utiliserais une comparaison avec un os.time  toujours dans une boucle while avec au bout des 30 secondes une vérification de l'état avec le getValue...

 

Attention à  la méthode sleep qui est bloquante ;), elle ne doit être utilisé que pour retardé l’exécution de la suite du code, le mettre en pause.

Posté(e)

Quelque chose comme çà  @krikroff ?

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

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

 

Posté(e)

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
  • Upvote 1
Posté(e)

C'est super cool de votre part àtous de regarder cela en plus, deuxième effet kiss cool cela permet de commencer a apprendre le LUA :)

Posté(e)

Moi ça me parait bon.

Par contre pour bien comprendre le script il faudrait aussi expliquer àquoi sert la commande "tonumber", pas évident pour un novice :)

×
×
  • Créer...