Aller au contenu

Messages recommandés

Posté(e) (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é par G.RozNCo
Posté(e) (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é par henri-allauch
Posté(e)

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.

Posté(e) (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é par henri-allauch
  • 4 mois après...
Posté(e) (modifié)

Bonjour à tous...

 

Je reviens à la charge, quitte à passer pour une andouille... :wacko: 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:

  1. [Toujours ON]
  2. [Toujours OFF]
  3. [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... :mellow: (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é par G.RozNCo
×
×
  • Créer...