Aller au contenu

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


lolomail

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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
Lien vers le commentaire
Partager sur d’autres sites

--[[
%% 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

Lien vers le commentaire
Partager sur d’autres sites

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?

Lien vers le commentaire
Partager sur d’autres sites

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:

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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  ;)

Lien vers le commentaire
Partager sur d’autres sites

@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
Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

 

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
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...