flamalex Posté(e) le 13 octobre 2015 Signaler Posté(e) le 13 octobre 2015 Bonjour, après avoir écumé les sujets et en essayant de faire un "mix", je n'arrive pas à atteindre mon but. en effet, je souhaite une scène en LUA permettant de: si entre 20h et 21h et luminosité < à 1 Lux ID92 (FGMS001 Motion Sensor) et détection de mouvement ID90 (FGMS001 Motion Sensor) alors allumer la lumière de l'escalier ID88 (FGD211 Dimmer) à 10% si absence de mouvement pendant 5 secondes alors Éteindre cette lumière ID88 je vous remercie par avance pour votre aide 2
Berale64 Posté(e) le 13 octobre 2015 Signaler Posté(e) le 13 octobre 2015 Dans les tutos il y a un sujet sur settimeout qui devrait t'aider.
flamalex Posté(e) le 13 octobre 2015 Auteur Signaler Posté(e) le 13 octobre 2015 merci, je viens de chercher "settimeout" mais rien sur le site. alors je cherche peut etre mal mais franchement, apres plus d un mois de recherche avec des bouts de codes àdroite àgauche j apprécierais un code complet qui correspond àmon scenario
chrispec Posté(e) le 14 octobre 2015 Signaler Posté(e) le 14 octobre 2015 http://www.domotique-fibaro.fr/index.php/topic/4933-settimeout/?hl=settimeout
flamalex Posté(e) le 14 octobre 2015 Auteur Signaler Posté(e) le 14 octobre 2015 http://www.domotique-fibaro.fr/index.php/topic/4933-settimeout/?hl=settimeout merci je teste ce soir
Berale64 Posté(e) le 14 octobre 2015 Signaler Posté(e) le 14 octobre 2015 j apprécierais un code complet qui correspond à mon scenario C'est pas vraiment le but du forum. Tu peux faire une scène en mode block de ton problème, puis tu fais un passage en LUA et tu essayes de comprendre. J'ai beaucoup appris en faisant cela.
flamalex Posté(e) le 14 octobre 2015 Auteur Signaler Posté(e) le 14 octobre 2015 C'est pas vraiment le but du forum. Tu peux faire une scène en mode block de ton problème, puis tu fais un passage en LUA et tu essayes de comprendre. J'ai beaucoup appris en faisant cela. c est en effet ce que j ai faiten mode bloc impossible avec mon scenario ....5 sec.... dites moi comment vous faites je ne vois pas l interet d un forum si a un moment on ne peut pas mettre les choses a plat. pour d autres sujets je suis le premier a donner la solution a qqun qui cherche depuis plusieurs mois domage qu on ne puisse pas le faire pour moi j y penserai la fois prochaine (a l inverse)
Berale64 Posté(e) le 14 octobre 2015 Signaler Posté(e) le 14 octobre 2015 Demander de l'aide c'est une chose, décrire son problème en disant faites moi le script en est une autre. Voilà comment en mode bloc on éteint une lampe avec un délai. 5s me semble un peu court. Va voir les paramètres de ton détecteur.
chrispec Posté(e) le 14 octobre 2015 Signaler Posté(e) le 14 octobre 2015 merci, je viens de chercher "settimeout" mais rien sur le site. alors je cherche peut etre mal mais franchement, apres plus d un mois de recherche avec des bouts de codes à droite à gauche j apprécierais un code complet qui correspond à mon scenario @flamalex Je rejoins Berale24... Je pense que dans ta formulation "j'apprécierais un code' : ... tu as manqué un peu de tact ...
pepite Posté(e) le 14 octobre 2015 Signaler Posté(e) le 14 octobre 2015 Salut, Je rejoins Berale et chrispec, tu aurias mis un ptit debut de code ;-) en reprenant vite fait le code de Berale24, j'aurais tenté ca, non testé !!! Amuse toi bien --[[ %% properties 90 value %% globals --]] -- Si scene deja en cours, arret if fibaro:countScenes()>1 then fibaro:debug("Scene déjà en cours, arrêt") fibaro:abort() end local luminosite = tonumber(fibaro:getValue(92, "value")) local mouvement = tonumber(fibaro:getValue(90, "value")) local now = tonumber((os.date("%H"))) fibaro:debug("Heure actuelle" : ..now) if ((now >= "20" and now <= "21") and (luminosite < "1") and (mouvement = "1")) then fibaro:call(88, "setvalue", "10") end setTimeout(function() local delayedCheck0 = false; local tempDeviceState0, deviceLastModification0 = fibaro:get(90, "value") fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0) if (mouvement = "0" and (os.time() - deviceLastModification0) >= 120) then delayedCheck0 = true; end if ( delayedCheck0 == true ) then fibaro:call(88, "turnOff") end end,120000)
flamalex Posté(e) le 14 octobre 2015 Auteur Signaler Posté(e) le 14 octobre 2015 autant pour moi je ne me suis par relu et je vous prie de m en excuser ce n etait pas un "ordre" mais plutot un souhait de qqun qui cherche, surmnt mal, mais qui cherche et finit par etre desesperé bref dsl en meme tps, je ne vois pas l interet de venir pour la premiere fois sur ce forum et etre malhonnête ce n est pas mon but j en suis désolé. je reviendrai ce soir pour la partie technique apres test merci a ts (dsl encore et aussi pour les abreviations, je me dépeche, mais je tenais àvous répondre)
Rem's Posté(e) le 14 octobre 2015 Signaler Posté(e) le 14 octobre 2015 Crois moi, l'entraide est le "maître" môt de ce forum. Il est vrai que les admin, un peu vieux jeu, ne sachant pas toujours ce servir d'un ordi ou d'internet ...... (LOL) !!! ont mis au point la fonction "<>" qui permet d'insérer un code Lua dans les messages (beaucoup plus lisible, et surtout les autres peuvent le copier pour le modifier). D'ailleurs, un exellent membre de ce forum m'avait à l'époque dépatouiller avec une scène du même style ... je te la livre ci dessous. --[[ %% properties 384 value %% globals --]] local wallplug = 112 local mss = 384 local mss_lux = 386 local nom_variable_global = "Timerdate" local heure = string.format(os.date("%H"), "%2d")..string.format(os.date("%M"), "%2d") local heureValable = heure >= "1700" or heure < "0815" -- local faibleLumiere = (tonumber(fibaro:getValue(mss_lux, "value")) < 30) local enAlerte = (tonumber(fibaro:getValue(mss, "value")) > 0) -- A chaque fois que le détecteur sera en alerte et que la luminosité -- sera faible, on va modifier la variable globale if enAlerte and heureValable then local extinction = os.time() + 150 fibaro:setGlobal(nom_variable_global, extinction) fibaro:debug("Extinction prévu à " ..os.date("%X", extinction)) else fibaro:abort() end -- Si plus d'une scène tourne en même temps, on arrête celle-ci if (fibaro:countScenes() > 1) then fibaro:abort() end -- On allume le bandeau fibaro:call(wallplug, "turnOn") fibaro:debug("Allumage à " .. os.date("%X")) -- On attends d'avoir atteint l'heure d'exctinction. while (os.time() < tonumber(fibaro:getGlobalValue(nom_variable_global))) do fibaro:sleep(1000); end -- On éteint le bandeau fibaro:call(wallplug, "turnOff") fibaro:debug("Extinction à " .. os.date("%X")) un conseil, utilise ces différents solutions, en test, en en activant que l'une après l'autre (quoique a priori cela répondent au même besoin). PS : j'ai toujours fibaro:sleep dans mes scènes au lieu de setimout, c'est grave ... ?? (quelle différence .?) 1
Lazer Posté(e) le 14 octobre 2015 Signaler Posté(e) le 14 octobre 2015 Settimeout c'est asynchrone, fonctionne totalement différemment de sleep
pepite Posté(e) le 14 octobre 2015 Signaler Posté(e) le 14 octobre 2015 J'ai compris de puis peu : sleep : arrete la lecture du script au sleep ;-) settimeout permet de lire le script jusqu'a la fin sans arret ;-) mais j'ai du mal à l'utiliser c'est clair
flamalex Posté(e) le 14 octobre 2015 Auteur Signaler Posté(e) le 14 octobre 2015 merci PEPITE, j'ai une erreur sur la ligne 26 ci dessous "fibaro:debug("Heure actuelle" : ..now)" " [ fatal] Runtime error: /opt/fibaro/scenes/101.lua:20: ')' expected near ':'[0m" que veut dire cette erreur? j'ai retiré les 2 points de suspensions en ligne 26 maintenant j'ai une erreur en ligne 29 merci REM'S, je vais étudier ton script, merci Alex
flamalex Posté(e) le 14 octobre 2015 Auteur Signaler Posté(e) le 14 octobre 2015 --[[ %% properties 90 value %% globals --]] -- Si scene deja en cours, arret if fibaro:countScenes()>1 then fibaro:debug("Scene déjà en cours, arrêt") fibaro:abort() end local luminosite = tonumber(fibaro:getValue(92, "value")) local mouvement = tonumber(fibaro:getValue(90, "value")) local now = tonumber((os.date("%H"))) fibaro:debug("Heure actuelle" ..now) if ((now >= "13" and now <= "21") and (luminosite < "6") and (mouvement == "1")) then fibaro:call(88, "setvalue", "10") end setTimeout(function() local delayedCheck0 = false; local tempDeviceState0, deviceLastModification0 = fibaro:get(90, "value") fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0) if (mouvement == "0" and (os.time() - deviceLastModification0) >= 10) then delayedCheck0 = true; end if ( delayedCheck0 == true ) then fibaro:call(88, "turnOff") end end,10000) aprés avoir supprimé les 2 points en ligne 26 "fibaro:debug("Heure actuelle" ..now) " puis erreur sur la ligne 29 "and (mouvement == "1")) " parce qu'il fallait mettre 2 x "=" au lieu d'un seul idem en ligne 42 "if (mouvement == "0" " bref j'ai de nouveau une erreur sur ligne 27 "if ((now >= "13" and now <= "21") " [ fatal] Runtime error: /opt/fibaro/scenes/101.lua:27: attempt to compare string with number[0m voila pourquoi je fais appel à des experts, pcq pour trouver "2 points, et 2 =" moi il m'a fallu 2h, vous comprenez!!!! maintenant je dois repartir mais c'est comme cela dans ts les domaines, ts les métiers chacun son truc
pepite Posté(e) le 14 octobre 2015 Signaler Posté(e) le 14 octobre 2015 desole, je l'ai ecris assez vite, j'ai fait des boulettes lol je vais corriger ;-), desole de t'avoir fait perdre 2 h ;-) Apres c'est avec des erreurs que l'on comprend l'erreur ;-) Essaie comme ca : --[[ %% properties 90 value %% globals --]] -- Si scene deja en cours, arret if fibaro:countScenes()> 1 then fibaro:debug("Scene déjà en cours, arrêt") fibaro:abort() end local luminosite = tonumber(fibaro:getValue(92, "value")) local mouvement = tonumber(fibaro:getValue(90, "value")) local now = tonumber((os.date("%H"))) local heuredebut = 19 local heurefin = 21 local seuilluminosite = 1 fibaro:debug("Heure actuelle :" ..now) if ((now >= heuredebut and now <= heurefin) and (luminosite < seuilluminosite) and (mouvement == "1")) then fibaro:call(88, "setvalue", "10") end setTimeout(function() local delayedCheck0 = false; local tempDeviceState0, deviceLastModification0 = fibaro:get(90, "value") fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0) if (mouvement == "0" and (os.time() - deviceLastModification0) >= 120) then delayedCheck0 = true; end if ( delayedCheck0 == true ) then fibaro:call(88, "turnOff") end end,120000) Il y a peut-etre encore des erreurs ;-) Desole d'avance ;-)
flamalex Posté(e) le 14 octobre 2015 Auteur Signaler Posté(e) le 14 octobre 2015 lol pepite, je ne disais pas cela pour ça )))) je teste rien ne se passe message DEBUG [DEBUG] 19:38:12: Scene déjà en cours, arrêt[DEBUG] 19:38:19: Temps écoulé 7[DEBUG] 19:44:30: Heure actuelle :19[DEBUG] 19:44:34: Scene déjà en cours, arrêt[DEBUG] 19:44:34: Scene déjà en cours, arrêt[DEBUG] 19:44:39: Scene déjà en cours, arrêt[DEBUG] 19:44:42: Temps écoulé 3[DEBUG] 19:55:51: Heure actuelle :19[DEBUG] 19:55:56: Scene déjà en cours, arrêt[DEBUG] 19:56:03: Temps écoulé 7[DEBUG] 19:58:28: Heure actuelle :19[DEBUG] 19:58:33: Scene déjà en cours, arrêt[DEBUG] 19:58:33: Scene déjà en cours, arrêt[DEBUG] 19:58:40: Temps écoulé 7[DEBUG] 19:58:42: Heure actuelle :19[DEBUG] 19:58:54: Temps écoulé 12 Pepite, j'aime bcp ton script pcq il est bien structuré, (logic pour moi) j'essaie de comprendre plusieurs choses, a quoi servent les lignes 11 à 14? si la scene est déja active alors on ne la relance pas, c'est bien ca? je comprends que tu désignes des 'local" dans lesquels tu insères des données fonctions variables ou fixes, lignes 17 à 22 puis tu viens chercher l'heure actuelle pour la comparer aux heures de debut/fin pres enregistrées, lignes 25/27, démarrant ainsi la condition si heure actuelle est située entre 19 et 21h et lumiere < 1 et mouv=1 alors on allume la lumiere à 10%, lignes 27,28 et 29 après les lignes 31 à 35, je ne comprends pas (ne serait ce pas, tant qu'il y a détection mouvement alors le compteur des 120 secs repart à zero?) puis 37 à 43, ok pour moi la 45 avec 120000, je comprends pas non plus (un lien avec les 120 sec mais pourquoi x1000?)
Berale64 Posté(e) le 15 octobre 2015 Signaler Posté(e) le 15 octobre 2015 Il faut enlever les lignes 11 à 14. Au premier passage devant le fgms la scène démarre. Au passage suivant, si le délai n'est pas écoulé la lumière ne s’éteint pas mais il faut bien redémarrer une autre scène pour continuer le processus. Revoir le sujet que j'avais fait sur la fonction settimeout et aussi le très bon tuto (mais en anglais) sur le forum officiel. 5
pepite Posté(e) le 15 octobre 2015 Signaler Posté(e) le 15 octobre 2015 Salut @Berale, Une subtilité m'echappe alors ;-) 1er passage : scene demarre, allumage dimmer à 10 % 2eme passage : si dimmer allumé, 2eme instance arretee, le processus continue tout de meme non ? le settimeout de la 1ere instance continue tout de même ? je en sais pas si je suis tres clair ;-) merci pour tes explication et de dimmer ma lumiere à + de 10 % stp ;) 1
flamalex Posté(e) le 15 octobre 2015 Auteur Signaler Posté(e) le 15 octobre 2015 Salut, Ca fonctionne ? non pas encore comme tu peux le voir dans mon message precedent, on dirait que ca tourne en boucle par contre chez moi "le 10% " ne fonctionne pas (alors que module +bypass+ ampoule dimmable) juste pour ca je fais les tests anvec "turnOn" pour momnt.
pepite Posté(e) le 15 octobre 2015 Signaler Posté(e) le 15 octobre 2015 n'oublie pas d'enlever les lignes 11 à 14 comme le dit Berale24. Que ca tourne c'est normal puisque cela attend les 120 ;-) pas d'allumage de dimmer ? bizarre
flamalex Posté(e) le 15 octobre 2015 Auteur Signaler Posté(e) le 15 octobre 2015 n'oublie pas d'enlever les lignes 11 à 14 comme le dit Berale24. Que ca tourne c'est normal puisque cela attend les 120 ;-) pas d'allumage de dimmer ? bizarre --[[ %% properties 90 value 92 value %% globals --]] local delayedCheck0 = false; local tempDeviceState0, deviceLastModification0 = fibaro:get(90, "value"); local HeureActuelle = os.date("*t"); local mouvement = tonumber(fibaro:getValue(90, "value")); local luminosite = tonumber(fibaro:getValue(92, "value")); local seuilluminosite = 35; --luminosite local heuredebut = 14; --plage horaire local heurefin = 21; --local timeout = 6; --duree d'attente sans mouvement --if (fibaro:countScenes() > 1) then fibaro:abort() end; fibaro:debug("Il est "..HeureActuelle['hour']..":"..HeureActuelle['min']) fibaro:debug("le capteur est safe depuis : "..((os.time() - deviceLastModification0)/60).." min") if ((HeureActuelle['hour']>= heuredebut and HeureActuelle['hour'] <= heurefin) -- si heure actu est située entre 19 et 21h and ( mouvement > 0 )----detection de mouv and ( luminosite <= seuilluminosite )) --luminosité <=2Lux then fibaro:call(88, "turnOn"); --allumage module eclairage à 10% end setTimeout(function() local delayedCheck0 = false; local tempDeviceState0, deviceLastModification0 = fibaro:get(90, "value") fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0) if (( mouvement == 0 ) and (os.time() - deviceLastModification0) >= 6) then delayedCheck0 = true; ----si pas de mouv pdt 6 sec end if ( delayedCheck0 == true ) then fibaro:call(88, "turnOff") --extinction lumiere end end,12000) j'ai modifié les plages horaires, le turnOn et luminosité ci dessus afin de faire test dans la journée. pour le moment ca fonctionne, je testerai davantage ce soir, reste à voir le probleme du dimmer 10%
Messages recommandés