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ę NATYCHMIASTLua 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)| Metoda | Opis |
|---|---|
: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)| Tryb | Stała | Opis |
|---|---|---|
| Jednorazowy | Timer.MODE_COUNT_DOWN | Odpala raz i zatrzymuje się |
| Cykliczny | Timer.MODE_INTERVAL | Odpala powtarzalnie |
| Metoda | Stała | Opis |
|---|---|---|
| Start | Timer.METHOD_START | Uruchom / wznów po pauzie |
| Stop | Timer.METHOD_STOP | Zatrzymaj całkowicie |
| Pauza | Timer.METHOD_PAUSE | Wstrzymaj (można wznowić) |
| Zdarzenie | Stała | Opis |
|---|---|---|
| Timer | Timer.EVENT_ON_TIMER | Timer odpalił |
| Start | Timer.EVENT_ON_START | Timer uruchomiony |
| Stop | Timer.EVENT_ON_STOP | Timer zatrzymany |
| Pauza | Timer.EVENT_ON_PAUSE | Timer 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 miejscaLimity#
| Parametr | Wartość |
|---|---|
| Max liczba timerów | 1000 |
| Min interwał | 10ms |
| Min timeout | 1ms |
| Max okres | 24h |
Kiedy używać czego#
| Potrzeba | Użyj |
|---|---|
| Proste opóźnienie | after(ms, fn) |
| Cykliczne powtarzanie | every(ms, fn) |
| Sekwencja akcji | sequence() |
| Kaskada na grupie | cascade(group, ms, fn) |
| Pauza / wznowienie | Moduł Timer |
| Kompatybilność z OM | Moduł Timer |