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
×
×
  • Créer...