JossAlf Posté(e) le 18 mars 2016 Signaler Posté(e) le 18 mars 2016 (modifié) Bonjour, J'ai un problème avec fobaro:abort(). Je suis en 4.056. Je pensais que l'utilisation de cette fonction permettait d'arrêter la scène en cours (comme faire un kill UNIX) ?! Or, dans une de mes scènes, qui vérifie si mon portail est resté ouvert, j'utilise un figaro:sleep de 10 minutes avant d'envoyer une annonce en TTS. Si le portail se referme pendant les 10 minutes je fais un figaro:abort() ce qui devrait tout arrêté ! Mais 10 minutes plus tard, la scène reprend là où elle s'était arrêtée. Avez-vous une explication ? Pourquoi est-ce que figaro:abort() ne tue pas la scène ? Voici la scène : --[[ %% properties 45 value %% globals --]] local etat_portail = fibaro:getValue(45, "value"); fibaro:debug(etat_portail .. " : Test initial de l'état du portail") if fibaro:countScenes() > 1 then -- si la scène est lancée plus d'une fois alors fibaro:debug("Arrêt de la scène car plus de 2 scènes en même temps.") fibaro:abort() -- arrêt de cette lecture du script end -- fin de la condition if (tonumber(etat_portail) == 0) then fibaro:debug("Arrêt de la scène car portail refermé.") fibaro:abort() end if (tonumber(etat_portail) == 1) then local dt = os.date("%H:%M"); -- on attend 10 minutes fibaro:sleep(600*1000); -- on récupère l'état du portail pour voir si il a été fermé etat_portail = fibaro:getValue(45, "value"); fibaro:debug(etat_portail .. "Le portail a été ouvert il y a 10 minutes (avant la boucle)") while (tonumber(etat_portail) == 1) do --Annonce sur la Squeezebox ... fibaro:call(135, "pressButton", "2"); --fin annonce --on attend 15 minutes fibaro:sleep(900*1000); -- Récupération de l'état pour voir s'il n'y a pas de changement etat_portail = fibaro:getValue(45, "value"); fibaro:debug(etat_portail .. " : Test dans la boucle de l'état du portail") end end et le debug de ce matin : [DEBUG] 07:55:39: 1 : Test initial de l'état du portail (ouverture) [DEBUG] 07:56:24: 0 : Test initial de l'état du portail(fermeture) [DEBUG] 07:56:24: Arrêt de la scène car portail refermé. [DEBUG] 08:05:40: 0Le portail est ouvert depuis 10 minutes (avant la boucle) [DEBUG] 08:12:42: 1 : Test initial de l'état du portail(ouverture) [DEBUG] 08:13:21: 0 : Test initial de l'état du portail(fermeture) [DEBUG] 08:13:21: Arrêt de la scène car portail refermé. [DEBUG] 08:22:43: 0Le portail est ouvert depuis 10 minutes (avant la boucle) [DEBUG] 08:33:27: 1 : Test initial de l'état du portail(ouverture) [DEBUG] 08:33:46: 0 : Test initial de l'état du portail(fermeture) [DEBUG] 08:33:46: Arrêt de la scène car portail refermé. [DEBUG] 08:43:28: 0Le portail est ouvert depuis 10 minutes (avant la boucle) Il y a une autre fonction que abort pour tuer une scène en cours avec un sleep ? PS : Je ne veux pas passer par GEA. MAJ : La solution est d'utiliser figaro:killScenes() à la ligne 18 pour arrêter (tuer) toutes les instances en cours ! Modifié le 18 mars 2016 par JossAlf
Berale64 Posté(e) le 18 mars 2016 Signaler Posté(e) le 18 mars 2016 La façon dont je vois les choses: Ta scène démarre sur un trigger (45). Si ton portail est ouvert, tu arrives à la ligne 21 et fais un sleep de 10 mn. Si pendant ce temps il y a un nouveau trigger (portail fermé) une nouvelle scène démarre et la ligne 11 (countscene) empèche d'aller plus loin. C'est donc la première scène qui après les 10 mn continue son exécution.
JossAlf Posté(e) le 18 mars 2016 Auteur Signaler Posté(e) le 18 mars 2016 Oui, mais figaro:abort() ne tue pas toutes les instances en cours ?
Berale64 Posté(e) le 18 mars 2016 Signaler Posté(e) le 18 mars 2016 Ah! non. Et heureusement, sinon imagine ce que ferait la ligne 11.
JossAlf Posté(e) le 18 mars 2016 Auteur Signaler Posté(e) le 18 mars 2016 Très juste Alors du coup, comment faire pour tuer la scène qui est en sleep ? (si je puis dire ) OU comment ne pas utiliser un sleep mais attendre 10 minutes pour prévenir que le portail est encore ouvert (et ça pendant tant que le portail reste ouvert) ?
JossAlf Posté(e) le 18 mars 2016 Auteur Signaler Posté(e) le 18 mars 2016 (modifié) J'ai trouvé figaro:killScenes() mais ça marche pas en V4.056 ? MAJ : Ha ben si ça fonctionne j'avais oublié la majuscule Là du coup ça tuera toutes le instances ! Je teste ... Modifié le 18 mars 2016 par JossAlf
JossAlf Posté(e) le 18 mars 2016 Auteur Signaler Posté(e) le 18 mars 2016 Ha ben non ça marche pas --[[ %% properties 45 value %% globals --]] local etat_portail = fibaro:getValue(45, "value"); fibaro:debug(etat_portail .. " : Test initial de l'état du portail") if fibaro:countScenes() > 1 then -- si la scène est lancée plus d'une fois alors fibaro:debug("Arrêt de la scène car plus de 2 scènes en même temps.") fibaro:abort() -- arrêt de cette lecture du script end -- fin de la condition if (tonumber(etat_portail) == 0) then fibaro:debug("Arrêt de la scène car portail refermé.") fibaro:killScenes(350) end J'ai ça en debug : [DEBUG] 12:24:01: 0 : Test initial de l'état du portail [DEBUG] 12:24:01: Arrêt de la scène car portail refermé. [ERROR] 12:24:01: line 18: attempt to call method 'killScenes' (a nil value) grrrrrr
JossAlf Posté(e) le 18 mars 2016 Auteur Signaler Posté(e) le 18 mars 2016 En relançant la box ... fibaro:killScenes(350) est reconnue ... ??! Va comprendre ... Tout fonctionne parfaitement du coup : Quand le portail se referme, toutes les instances sont tuées
Berale64 Posté(e) le 18 mars 2016 Signaler Posté(e) le 18 mars 2016 Il me semble que ton problème peut aussi être traité avec setTimeout, mais si ça marche comme ça !!!
Messages recommandés