lolomail Posté(e) le 3 janvier 2014 Signaler Posté(e) le 3 janvier 2014 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
lionel Posté(e) le 3 janvier 2014 Signaler Posté(e) le 3 janvier 2014 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
lolomail Posté(e) le 3 janvier 2014 Auteur Signaler Posté(e) le 3 janvier 2014 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)
lionel Posté(e) le 3 janvier 2014 Signaler Posté(e) le 3 janvier 2014 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
lolomail Posté(e) le 3 janvier 2014 Auteur Signaler Posté(e) le 3 janvier 2014 Un gros merci, en plus cela aidera a comprendre le LUA car je pense que c'est une logique a apprendre en plus du codage
lionel Posté(e) le 3 janvier 2014 Signaler Posté(e) le 3 janvier 2014 --[[ %% 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
lolomail Posté(e) le 3 janvier 2014 Auteur Signaler Posté(e) le 3 janvier 2014 Super cela marche nickel!!! 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?
lionel Posté(e) le 3 janvier 2014 Signaler Posté(e) le 3 janvier 2014 oui c est ça ces petits tuto m ont aider a un peu comprendre http://tutoriels.domotique-store.fr/content/5/72/fr/programmation-en-lua-sur-home-center-2.html
lolomail Posté(e) le 3 janvier 2014 Auteur Signaler Posté(e) le 3 janvier 2014 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
lionel Posté(e) le 3 janvier 2014 Signaler Posté(e) le 3 janvier 2014 oui,avec les RGB ,il y a plein de possibilité,pour ma part j ai opté sur un script "meteo" de Olivier Male a voir ici: http://www.domotique-fibaro.fr/index.php/topic/193-armoire-météo-avec-rgb/
lolomail Posté(e) le 3 janvier 2014 Auteur Signaler Posté(e) le 3 janvier 2014 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 Merci pour le lien sur le LUA il est sympa et explique des choses, faudrait le mettre en post-it je pense.
i-magin Posté(e) le 3 janvier 2014 Signaler Posté(e) le 3 janvier 2014 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
lionel Posté(e) le 3 janvier 2014 Signaler Posté(e) le 3 janvier 2014 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 Lionel
Moicphil Posté(e) le 3 janvier 2014 Signaler Posté(e) le 3 janvier 2014 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.
i-magin Posté(e) le 3 janvier 2014 Signaler Posté(e) le 3 janvier 2014 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
lolomail Posté(e) le 3 janvier 2014 Auteur Signaler Posté(e) le 3 janvier 2014 Cool merci de votre persévérance a tous! Je teste ce script demain
lionel Posté(e) le 4 janvier 2014 Signaler Posté(e) le 4 janvier 2014 @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?
i-magin Posté(e) le 4 janvier 2014 Signaler Posté(e) le 4 janvier 2014 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
i-magin Posté(e) le 4 janvier 2014 Signaler Posté(e) le 4 janvier 2014 @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
lionel Posté(e) le 4 janvier 2014 Signaler Posté(e) le 4 janvier 2014 Du grand art chapeau bas Pas tout compris pour le timer,je vais faire des test Lionel
Krikroff Posté(e) le 4 janvier 2014 Signaler Posté(e) le 4 janvier 2014 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 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.
i-magin Posté(e) le 4 janvier 2014 Signaler Posté(e) le 4 janvier 2014 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
i-magin 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 1
lolomail Posté(e) le 4 janvier 2014 Auteur Signaler Posté(e) le 4 janvier 2014 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
BenjyNet Posté(e) le 4 janvier 2014 Signaler Posté(e) le 4 janvier 2014 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
Messages recommandés