Page 1 sur 2

Annuler une action décalée dans le temps

Publié : 03 janv. 2016, 20:08
par orbnu
Bonjour,

Y a-t-il un moyen d'annuler une action retardée, déclenché par un "On After XX" dans un script LUA ?

J'ai le souci suivant : je détecte un badge RFID (via un boitier EM4100 en USB) sur mon raspberry pi 2, afin de gérer l'activation/désactivation de mon alarme.
Pour l'activation, le badge fait que l'alarme est activée au bout de 30 secondes (pour laisser le temps de sortir), via un commandArray['setaway']="On AFTER 30" (setaway étant un device custom)
J'aimerais aussi pouvoir annuler l'activation retardée si je rebadge dans les 30 secondes. J'ai pour l'instant ajouté un garde fou via une variable utilisateur, mais ça ne traite pas tous les cas... la solution la plus propre serait d'annuler le "On AFTER"

Une idée sur une solution à mettre en oeuvre ?

--
Bruno

Re: Annuler une action décalée dans le temps

Publié : 05 janv. 2016, 02:23
par vil1driver
Salut,

Il me semble que ce n'est pas possible,

Par contre il y a surement possibilité de jouer avec le panneau de sécurité qui possède une tempo d'activation propre et paramétrable dans les préférences.
Sa tempo peut être stoppée.

En gros faire un script qui va si tu badges activer ce panneau (qui ne sera réellement activé qu'après le délai réglé)
Et qui va si tu rebadges le désactiver.

Tu te sers en suite de l'état du panneau de sécurité pour tes autres actions dans un script_security_xxxx.lua script qui réagit exclusivement aux changements d'état du panneau de sécurité.. Ou autres..

N'ésites pas à demander plus d'infos si ce n'est pas clair.

Bien venu ;)

Re: Annuler une action décalée dans le temps

Publié : 05 janv. 2016, 13:20
par patrice
Bonjour
On peut aussi envisager qq chose avec les interrupteurs qui ont un délai allumage/extinction dans leurs propriétés
Du style delai allumage 15 sec et si tu rebadge ca passe a off avec un délai extinction à 0

Re: Annuler une action décalée dans le temps

Publié : 05 janv. 2016, 13:25
par orbnu
Merci pour vos réponses, je regarde cela ce soir. J'aime bien l'approche avec les interrupteurs avec délai d'allumage :)

Sinon j'ai une approche un peu plus "bidouille" : je déclenche un device "text", en y positionnant comme valeur l'heure courante (ou toute autre valeur unique), et en la positionnant aussi dans une variable. A la détection du déclenchement de ce device, je compare la valeur du device à la valeur de la variable, et ne déclenche le traitement que si elles sont égales. Et si je rebadge, je passe la variable utilisateur à 0.

Je vous tiens au courant dès que je m'y colle, encore merci pour vos suggestions

Re: Annuler une action décalée dans le temps

Publié : 05 janv. 2016, 13:39
par vil1driver
patrice a écrit :Bonjour
On peut aussi envisager qq chose avec les interrupteurs qui ont un délai allumage/extinction dans leurs propriétés
Du style delai allumage 15 sec et si tu rebadge ca passe a off avec un délai extinction à 0

oui c'est sympa :D

mais... on est exactement dans la problématique de stopper un On AFTER

désolé ça ne fonctionne pas :|

Re: Annuler une action décalée dans le temps

Publié : 05 janv. 2016, 13:45
par patrice
Ah, le c.. il attend ces 15 sec pour considérer qu"il est à ON c'est ça ?

Re: Annuler une action décalée dans le temps

Publié : 05 janv. 2016, 13:57
par Neutrino
Bonjour,

Pour stopper un On AFTER, je renvoie son propre état à l'interrupteur.

Code : Tout sélectionner

commandArray['Tempo'] = otherdevices['Tempo']
Je pense que le fait d'envoyer un nouvel ordre à l'interrupteur, "écrase" l'ordre différé avec un ordre immédiat.

Re: Annuler une action décalée dans le temps

Publié : 05 janv. 2016, 14:10
par vil1driver
c'est ce que vient de proposer Patrice en somme ?

je ne comprends plus, c'est fonctionnel chez toi ?

si ton switch est à Off, tu le passes à On (avec delai de 15s) il ne passera à On que dans 15s
et tu as beau lui envoyer d'autres ordres (même son propre état, donc à l'instant t c'est toujours Off), il sait que de toute façon dans 15s il faut qu'il exécute l'ordre On.. et ici c'est bien ce qu'il se passe

Re: Annuler une action décalée dans le temps

Publié : 05 janv. 2016, 14:30
par patrice
Bon, je viens de tester en le forçant à OFFpar Lua et le fait de passer l'ordre inhibe bien le déclenchement prévu dans 15 sec.


commandArray = {}
commandArray['Tempo'] = 'Off'

return commandArray

Re: Annuler une action décalée dans le temps

Publié : 05 janv. 2016, 14:34
par vil1driver
ce que je propose plus en détail,

avoir un switch virtuel commuté (cf. JSON toggle) par le passage du badge,
on le nommera pour l'exemple 'badge'

faire un petit script réagissant à son changement d'état, donc de type Device
donc le but sera d'activer ou désactiver le panneau de sécurité (nommé 'SecPanel' pour l'exemple)

Code : Tout sélectionner

commandArray = {}

if(devicechanged['mpd_rock'] == 'On') then
    commandArray['SecPanel'] = "Arm Away"
    print('activation de l'alarme dans 15 secondes')

elseif(devicechanged['mpd_fun'] == 'Off) then
    commandArray['SecPanel'] = "Disarm"
    print('désactivation alarme')
end  

return commandArray
puis un autre qui va agir suivant l'activation/désactivation du panneau de sécurité (de type Security cette fois ci)

Code : Tout sélectionner

commandArray = {}

if globalvariables['Security'] == 'Armed Away' then
print('alarme activée')
-- autres actions ici

elseif globalvariables['Security'] == 'Disarmed' then
print('alarme désactivée')
-- autres actions ici

end

return commandArray