lexus_69 Posté(e) le 7 juillet 2017 Signaler Posté(e) le 7 juillet 2017 Bonjour à tous, Depuis quelques jours j'ai une scène qui bug. Elle fonctionnait très bien depuis plusieurs semaines et depuis peu elle ne fonctionne mais que partiellement... Voici la scène en question: --[[ %% properties 74 value %% globals --]] -- c'est la nuit ou petit dej alors stop if (fibaro:getGlobalValue("Jour_Nuit") == "Nuit") or (fibaro:getGlobalValue("Petit_Dej") == "OUI") then fibaro:debug("Scène annulée"); fibaro:abort(); end -- déclaration de variables local Petit_Dej = fibaro:getGlobalValue("Petit_Dej"); local Luminosite = fibaro:getValue(76, "value"); local delayedCheck0 = false; local tempDeviceState0, deviceLastModification0 = fibaro:get(74, "value"); local HeureActuelle = os.date("*t"); -- fin de déclaration de variables 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") fibaro:debug("La luminosité est de "..Luminosite.." Lux") fibaro:debug("Petit déjeuner : "..Petit_Dej) if ( tonumber(fibaro:getValue(74, "value")) > 0 ) and ( tonumber(fibaro:getValue(76, "value")) <= 5 ) -- valeur en Lux then fibaro:call(65, "turnOn"); fibaro:debug("Lampe allumée") fibaro:sleep(60*1000); end if (( tonumber(fibaro:getValue(74, "value")) == 0 ) and (os.time() - deviceLastModification0) >= 300) -- temps après extinction then delayedCheck0 = true; end if ( delayedCheck0 == true ) then fibaro:call(65, "turnOff"); fibaro:debug("Lampe éteinte") end La scène débute bien, la lampe s'allume mais ne s'éteint plus au bout de 5mn. J'ai l'impression que le décompte ne se fait plus. Quelqu'un a une idée ?
lexus_69 Posté(e) le 7 juillet 2017 Auteur Signaler Posté(e) le 7 juillet 2017 Je ne comprends plus... Ca me fait n'importe quoi maintenant. Il y a peut être un moyen plus simple. Dur dur d'apprendre quand on commence de zéro
PdB Posté(e) le 8 juillet 2017 Signaler Posté(e) le 8 juillet 2017 Bonjour, A mon avis ta variable deviceLastModification0 est erronée. Dans ta scène actuelle elle prend la valeur "ON/OFF" du module (fibaro:get(X,"value')) Alors qu'elle devrait correspondre, à l'heure du dernier changement d'état du module. Essaie avec: local deviceLastModification0 = fibaro:getModificationTime(74, 'value') Courage...
lexus_69 Posté(e) le 8 juillet 2017 Auteur Signaler Posté(e) le 8 juillet 2017 Merci pour la réponse mais ça ne fonctionne pas. Voici ce que j'ai dans le debug: [DEBUG] 11:08:19: Il est 11:8 [DEBUG] 11:08:19: line 29: attempt to perform arithmetic on local 'deviceLastModification0' (a nil value) line 29: fibaro:debug("le capteur est safe depuis : "..((os.time() - deviceLastModification0)/60).." min")
PdB Posté(e) le 8 juillet 2017 Signaler Posté(e) le 8 juillet 2017 Je ne vois pas à quoi te sert la variable tempDeviceState0 essaie de supprimer sa déclaration pour ne laisser que: local deviceLastModification0 = fibaro:getModificationTime(74, 'value')
lexus_69 Posté(e) le 8 juillet 2017 Auteur Signaler Posté(e) le 8 juillet 2017 Effectivement la variable tempDeviceState0 ne me servait plus, je l'ai enlevée. Maintenant la lampe s'allume mais ne veut pas s'éteindre au bout de 5mn. Par contre si je relance la scène manuellement la lampe s'éteint... Bizarre ! [DEBUG] 09:29:32: line 29: attempt to perform arithmetic on local 'deviceLastModification0' (a nil value)
PdB Posté(e) le 9 juillet 2017 Signaler Posté(e) le 9 juillet 2017 le problème de l'extinction vient du fait qu'il n'y pas de temporisation dans la scène. rajoute en dessous de %% globals: %% killOtherInstances et change: if (( tonumber(fibaro:getValue(74, "value")) == 0 ) and (os.time() - deviceLastModification0) >= 300) -- temps après extinction then delayedCheck0 = true; end par if (( tonumber(fibaro:getValue(74, "value")) == 0 ) then fibaro:sleep(300*1000) delayedCheck0 = true; end
jjacques68 Posté(e) le 10 juillet 2017 Signaler Posté(e) le 10 juillet 2017 Hello, pour ma culture perso, le %%killOtherInstances remplace le code if fibaro:countScenes() > 1 then fibaro:abort() end ? c"est bien ça ?
PdB Posté(e) le 10 juillet 2017 Signaler Posté(e) le 10 juillet 2017 C'est pas vraiment le même usage: %%killOtherInstances : lorsque la scène est lancée toutes les autres instances déjà en cours sont interrompues if fibaro:countScenes() > 1 then fibaro:abort() end : si d'autres instances sont déjà en cours alors la nouvelle instance est interrompue
Lazer Posté(e) le 10 juillet 2017 Signaler Posté(e) le 10 juillet 2017 Je ne le connaissais pas le %%killOtherInstances ça peut être utile
jjacques68 Posté(e) le 10 juillet 2017 Signaler Posté(e) le 10 juillet 2017 moi non plus, mais je me la note dans un coin
lexus_69 Posté(e) le 11 juillet 2017 Auteur Signaler Posté(e) le 11 juillet 2017 Merci pour toutes ces réponses ! J'ai pu avancer un peu sur mon problème en faisant quelques modifications. Maintenant la lumière s'éteint bien au bout de 5 mn mais j'ai encore un soucis. A l'heure actuelle, la lumière s'allume bien quand le détecteur est déclenché et que la luminosité est inférieur à 5lux mais s'éteint 5mn après le premier déclenchement. Or j'aimerais que la lumière reste allumée tant qu'il y a du mouvement et s'éteigne au bout de 5mn si plus de mouvement mais je ne sais comment faire... voici ma scène modifiée qui ne fonctionne pas encore à la perfection... --[[ %% properties 74 value %% globals --]] -- c'est la nuit ou petit dej alors stop if (fibaro:getGlobalValue("Jour_Nuit") == "Nuit") or (fibaro:getGlobalValue("Petit_Dej") == "OUI") then fibaro:debug("Scène annulée car nuit ou petit dej'"); fibaro:abort(); end -- déclaration des variables local Petit_Dej = fibaro:getGlobalValue("Petit_Dej"); local Luminosite = fibaro:getValue(76, "value"); local deviceLastModification0 = fibaro:getModificationTime(74, "value"); local delayedCheck0 = false; local HeureActuelle = os.date("*t"); -- fin de déclaration des variables if (fibaro:countScenes() > 1) then fibaro:abort() end; fibaro:debug("Il est "..HeureActuelle['hour']..":"..HeureActuelle['min']) fibaro:debug("La luminosité est de "..Luminosite.." Lux") fibaro:debug("Petit déjeuner : "..Petit_Dej) -- premier déclenchement on allume puis stop if ( tonumber(fibaro:getValue(74, "value")) > 0 ) and ( tonumber(fibaro:getValue(76, "value")) <= 5 ) then fibaro:call(65, "turnOn"); fibaro:debug("Lampe allumée") fibaro:abort() end -- déclenchements suivants on attends XX sec pour éteindre setTimeout(function() fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0); if (( tonumber(fibaro:getValue(74, "value")) == 0 ) and (os.time() - deviceLastModification0) >= 300) then delayedCheck0 = true; end if ( delayedCheck0 == true ) then fibaro:call(65, "turnOff"); fibaro:debug("Lampe éteinte") end end, 300*1000) Une autre question, est ce que le setTimout ne fait pas double emploi avec if (( tonumber(fibaro:getValue(74, "value")) == 0 ) and (os.time() - deviceLastModification0) >= 300) ? Encore merci par avance pour vos réponses ! Bonne journée.
lexus_69 Posté(e) le 11 juillet 2017 Auteur Signaler Posté(e) le 11 juillet 2017 (modifié) Je réponds à moi même Voici ce qui fonctionne parfaitement et qui répond à mes besoins: Merci PdB --[[ %% properties 74 value %% globals %% killOtherInstances --]] -- c'est la nuit ou petit dej alors stop if (fibaro:getGlobalValue("Jour_Nuit") == "Nuit") or (fibaro:getGlobalValue("Petit_Dej") == "OUI") then fibaro:debug("Scène annulée car nuit ou petit dej'"); fibaro:abort(); end -- déclaration des variables local Petit_Dej = fibaro:getGlobalValue("Petit_Dej"); local Luminosite = fibaro:getValue(76, "value"); local delayedCheck0 = false; local HeureActuelle = os.date("*t"); -- fin de déclaration des variables if fibaro:countScenes() > 1 then fibaro:abort() end fibaro:debug("Il est "..HeureActuelle['hour']..":"..HeureActuelle['min']) fibaro:debug("La luminosité est de "..Luminosite.." Lux") fibaro:debug("Petit déjeuner : "..Petit_Dej) if ( tonumber(fibaro:getValue(74, "value")) == 0 ) then fibaro:debug("Fin de présence, décompte de 5mn activé...") else fibaro:debug("Présence détectée") end -- premier déclenchement on allume puis stop if ( tonumber(fibaro:getValue(74, "value")) > 0 ) and ( tonumber(fibaro:getValue(76, "value")) <= 5 ) then fibaro:call(65, "turnOn"); fibaro:debug("Lampe allumée") fibaro:abort() end -- déclenchements suivants on attends 5mn pour éteindre setTimeout(function() if ( tonumber(fibaro:getValue(74, "value")) == 0 ) then delayedCheck0 = true; end if ( delayedCheck0 == true ) then fibaro:call(65, "turnOff"); fibaro:debug("Lampe éteinte") end end, 5*60*1000) --temps après extinction 5mn Modifié le 11 juillet 2017 par lexus_69
Messages recommandés