G.RozNCo Posté(e) le 26 juillet Signaler Posté(e) le 26 juillet (modifié) Bonjour à tous, J'essais de faire une QA minuteur modulable, et je coince aux modification pendant un cycle. Le but etant d'activer un module pendant une durée définie (entre 5 et 30min) toutes les 5-60minutes, avec la possibilité de modifer le cycle et la durée mais également de forcer l'allumage ou l'extinction. La QA se lance proprement , mais reste bloqué dans la routine "cycle", et je n'arrives ni a la modifier ni a la forcée (ON ou OFF). Je me doutes que mes timers sont les probèmes ... La fonction "SetTimeout" est peut etre plus adaptée, mais du coup la pause entre les commande n'es pas prise en compte. Avez vous des idées? Merci d'avance. function QuickApp:B_ON(event) self:updateView("Label_Info", "text", "ON... "..os.date('%H:%M')) self:setVariable("Mode","ON") self:onInit() end function QuickApp:B_Off(event) self:updateView("Label_Info", "text", "OFF... "..os.date('%H:%M')) self:setVariable("Mode","OFF") self:onInit() end function QuickApp:B_Cycle() self:debug("Cycle: " , self:getVariable("Cycle"), " on/off | " , self:getVariable("Duree"), "min") self:updateView("Label_Info", "text", os.date('%H:%M').." Cycle: ON/OFF "..self:getVariable("Cycle").."% | "..self:getVariable("Duree").. "min") self:setVariable("Mode","AUTO") self:onInit() end function QuickApp:onInit() self:debug("Init",self:getVariable("Mode")) if self:getVariable("Mode") == "ON" then hub.call(tonumber(self:getVariable("Modul_id")),"turnOn") elseif self:getVariable("Mode") == "OFF" then hub.call(tonumber(self:getVariable("Modul_id")),"turnOff") elseif self:getVariable("Mode") =="AUTO" then local Ratio_ON= ( self:getVariable("Cycle") * self:getVariable("Duree")/100 ) local Ratio_OFF= ( self:getVariable("Duree") ) - Ratio_ON Timer=Ratio_ON *60 hub.call(tonumber(self:getVariable("Modul_id")),"turnOn") while Timer > 0 and self:getVariable("Mode") =="AUTO" do hub.sleep(1000) Timer=Timer-1 end Timer=Ratio_OFF *60 hub.call(tonumber(self:getVariable("Modul_id")),"turnOff") while Timer > 0 and self:getVariable("Mode") =="AUTO" do hub.sleep(1000) Timer=Timer-1 end self:onInit() else self:setVariable("Mode","OFF") end end Modifié le 26 juillet par G.RozNCo
henri-allauch Posté(e) le 26 juillet Signaler Posté(e) le 26 juillet Il y a 3 heures, G.RozNCo a dit : La fonction "SetTimeout" est peut etre plus adaptée OUI Il y a 3 heures, G.RozNCo a dit : mais du coup la pause entre les commande n'es pas prise en compte. ?
henri-allauch Posté(e) le 26 juillet Signaler Posté(e) le 26 juillet (modifié) Tu peux avoir ce genre de code à adapter aux valeurs de tes timer lus dans des variables et des conditions d'arrêt. C'est juste une exemple avec SetTimeOut : function Timer(self) local function TurnON(self) fibaro.call(Id_Device, "turnOn") self:debug("TurnON") end local function TurnOFF(self) fibaro.call(Id_Device, "turnOff") self:debug("TurnOFF") -- Relancer le Timer dans 10 Minutes ( suivant ton besoin Mode AUTO ) if ... mode AUTO == ON then fibaro.setTimeout(10*60*1000, function() Timer(self) end) end end -- Main de la fonction Timer -- Passer le device ON fibaro.setTimeout(0, function() TurnON(self) end) --Passer le device OFF dan 20 minutes fibaro.setTimeout(20*60*1000, function() TurnOFF(self) end) end Modifié le 26 juillet par henri-allauch
G.RozNCo Posté(e) le 30 juillet Auteur Signaler Posté(e) le 30 juillet Merci pour l'idée j'essaie ça ce weekend. Je ne vois pas trop ou s'arrête la fonction setTimeout Je ne me représente pas le déroulement temporel de cette QA.
henri-allauch Posté(e) le 30 juillet Signaler Posté(e) le 30 juillet (modifié) c'est un exemple à adapter pour utiliser setTimeout Tu apelle la fonction Timer. Son "main" (code après les deux fonctions TurnON() et TurnOFF() inclues dans la fonction Timer()) 1- va lancer immédiatement TurnON () qui va allumer le device c'est tout 2 - et ensuite la fonction TurnOFF () qui va éteindre le device dans 20 minutes et si on est toujours en AUTO : va relancer Timer () et ça boucle Et ça boucle tant que ton mode est en AUTO ON. il y a une heure, G.RozNCo a dit : Je ne vois pas trop ou s'arrête la fonction setTimeout la fonction setTimeout lance la fonction désignée en paramètre 2 à la fin du timer passé en paramètre 1 -> 0 : Immédiatement ..... 20*60*100 -> 20 minutes Modifié le 30 juillet par henri-allauch
henri-allauch Posté(e) le 30 juillet Signaler Posté(e) le 30 juillet Tu peux essayer ce QA de quelques lignes ... TEST_-Timer.fqa
G.RozNCo Posté(e) le 7 décembre Auteur Signaler Posté(e) le 7 décembre (modifié) Bonjour à tous... Je reviens à la charge, quitte à passer pour une andouille... je suis navré je ne comprends pas, j'ai surement un loupé dans mon raisonnement logique. Je ne parviens toujours pas à arrêter une routine de timer cyclique... Est ce qu'une âme charitable serait présente? => Je souhaites faire un module à 3 boutons fonctionnant comme cela: [Toujours ON] [Toujours OFF] [Cycle ON-OFF-ON-OFF...] avec comme paramètres : Durée d'un cycle %ON Nombre de cycles Je pensais que ce code ferait l'affaire, mais une fois dans le "Mode Cyclique" impossible de modifier quoi que ce soit... (d’où mon Watchdog) function QuickApp:B_Cycle() self:setVariable("Mode","AUTO") --Definition des paramètres Ratio_ON= ( self:getVariable("Cycle") * self:getVariable("Duree")/100 ) Ratio_OFF= ( self:getVariable("Duree") ) - Ratio_ON Watchdog = self:getVariable("Watchdog")*60/self:getVariable("Duree") --Definition de la durée totale while self:getVariable("Mode") =="AUTO" and Watchdog > 0 do self:T_ON(Ratio_ON) self:T_OFF(Ratio_OFF) Watchdog = Watchdog - 1 end self:debug("Sortie Mode AUTO") end function QuickApp:T_ON(Timer) hub.call(tonumber(self:getVariable("Modul_id")),"turnOn") Timer=Timer *60*10 while Timer > 0 and self:getVariable("Mode") =="AUTO" do hub.sleep(100) Timer=Timer-1 end end function QuickApp:T_OFF(Timer) hub.call(tonumber(self:getVariable("Modul_id")),"turnOff") Timer=Timer *60*10 while Timer > 0 and self:getVariable("Mode") =="AUTO" do hub.sleep(100) Timer=Timer-1 end end function QuickApp:onInit() self:setVariable("Watchdog", 12) hub.alert('push', { 2 }, os.date('%H:%M') .. "Initialisation", false,"" ) self:debug("Initialisation") end Modifié le 7 décembre par G.RozNCo
Messages recommandés