Aller au contenu

Messages recommandés

Posté(e) (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é par JossAlf
Posté(e)

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.

Posté(e)

Très juste :)

 

Alors du coup, comment faire pour tuer la scène qui est en sleep ? (si je puis dire :P )

 

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

Posté(e) (modifié)

J'ai trouvé figaro:killScenes() mais ça marche pas en V4.056 ?

 

MAJ : Ha ben si ça fonctionne j'avais oublié la majuscule  :wub:

 

Là  du coup ça tuera toutes le instances !

Je teste ...

Modifié par JossAlf
Posté(e)

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

Posté(e)

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

×
×
  • Créer...