Timery#

after / every / cancel#

Podstawowe API timerów. Asynchroniczne - rejestrują callback i wracają natychmiast.

after(ms, fn)#

Wykonaj funkcję raz po opóźnieniu. Zwraca ID timera.

-- Włącz lampę za 5 sekund
after(5000, function()
    lamp:switchOn()
end)

-- Z anulowaniem
local id = after(10000, function()
    log.info("za późno!")
end)
cancel(id)

every(ms, fn)#

Wykonuj funkcję cyklicznie. Zwraca ID timera.

-- Loguj temperaturę co minutę
local id = every(60000, function()
    log.info("Temperatura: " .. sensor:getValue())
end)

-- Zatrzymaj po godzinie
after(3600000, function()
    cancel(id)
end)

cancel(id)#

Anuluj timer (jednorazowy lub cykliczny).

local id = every(1000, function() print("tick") end)
cancel(id)

Asynchroniczność#

after() i every() nie blokują - rejestrują callback i wracają natychmiast:

log.info("przed")
after(1000, function()
    log.info("po sekundzie")
end)
log.info("po after()")  -- wykona się NATYCHMIAST

Lua w vCLU jest jednowątkowy. Nigdy nie używaj pętli oczekującej - zablokuje cały runtime.

-- ŹLE - zawiesi CLU!
local start = os.clock()
while os.clock() - start < 1 do end

-- DOBRZE
after(1000, function()
    doSomething()
end)

sequence()#

Sekwencja akcji z opóźnieniami. Chainable API - każda metoda zwraca self.

sequence()
    :add(function() lamp1:switchOn() end)
    :wait(500)
    :add(function() lamp2:switchOn() end)
    :wait(500)
    :add(function() lamp3:switchOn() end)
    :run(function()
        log.info("Wszystkie lampy włączone")
    end)
MetodaOpis
:add(fn)Dodaj akcję
:wait(ms)Dodaj opóźnienie
:run(onComplete)Uruchom sekwencję
:stop()Zatrzymaj sekwencję

cascade(group, delayMs, fn)#

Wykonaj funkcję na każdym obiekcie w grupie z opóźnieniem między nimi.

-- Włącz światła jedno po drugim, co 100ms
local group = _:byTag("lights")
cascade(group, 100, function(obj, index)
    obj:switchOn()
end)

-- Lub na obiekcie grupy
group:cascade(100, function(obj)
    obj:switchOn()
end)

Przykłady#

Automatyczne wyłączenie po czasie#

lamp:add_event(DOUT.EVENT_ON_SWITCH_ON, function()
    after(300000, function()  -- 5 minut
        lamp:switchOff()
        log.info("Auto-wyłączenie")
    end)
end)

Cykliczne odpytywanie#

every(30000, function()
    local temp = sensor:getValue()
    if temp > 28 then
        fan:switchOn()
    else
        fan:switchOff()
    end
end)

Sekwencja porannego budzenia#

sequence()
    :add(function() blinds:open() end)
    :wait(2000)
    :add(function() kitchen_light:switchOn() end)
    :wait(60000)
    :add(function() coffee_machine:switchOn() end)
    :run()

Moduł Timer (kompatybilność z OM)#

Moduł Timer jest kompatybilny z Grenton Object Manager - używany w om.lua. Oferuje pauzę, wznowienie i zdarzenia.

local t = Timer:new("MojTimer", 0, EventBus:getShared())
t:set(Timer.FEATURE_TIME, 5000)
t:set(Timer.FEATURE_MODE, Timer.MODE_INTERVAL)

t:add_event(Timer.EVENT_ON_TIMER, function()
    log.info("Timer odpalił!")
end)

t:execute(Timer.METHOD_START)
TrybStałaOpis
JednorazowyTimer.MODE_COUNT_DOWNOdpala raz i zatrzymuje się
CyklicznyTimer.MODE_INTERVALOdpala powtarzalnie
MetodaStałaOpis
StartTimer.METHOD_STARTUruchom / wznów po pauzie
StopTimer.METHOD_STOPZatrzymaj całkowicie
PauzaTimer.METHOD_PAUSEWstrzymaj (można wznowić)
ZdarzenieStałaOpis
TimerTimer.EVENT_ON_TIMERTimer odpalił
StartTimer.EVENT_ON_STARTTimer uruchomiony
StopTimer.EVENT_ON_STOPTimer zatrzymany
PauzaTimer.EVENT_ON_PAUSETimer wstrzymany

Pauza i wznowienie - timer kontynuuje od miejsca, nie od początku:

t:execute(Timer.METHOD_START)   -- start
t:execute(Timer.METHOD_PAUSE)   -- pauza po kilku sekundach
t:get(Timer.FEATURE_VALUE)      -- pozostały czas w ms
t:execute(Timer.METHOD_START)   -- wznowienie od tego samego miejsca

Limity#

ParametrWartość
Max liczba timerów1000
Min interwał10ms
Min timeout1ms
Max okres24h

Kiedy używać czego#

PotrzebaUżyj
Proste opóźnienieafter(ms, fn)
Cykliczne powtarzanieevery(ms, fn)
Sekwencja akcjisequence()
Kaskada na grupiecascade(group, ms, fn)
Pauza / wznowienieModuł Timer
Kompatybilność z OMModuł Timer