Za pomocą obiektów dateTime oraz timerów można tworzyć skrypty operujące na czasie.
Za każdym razem, gdy rozpoczyna się nowa minuta, emitowane jest zdarzenie "minute_changed".
if event.type == "minute_changed" then
print("Następna minuta...")
end
Automatyzacja reaguje na zdarzenie "minute_changed", co pozwala wykonywać zaprogramowane akcje dokładnie o określonych godzinach lub minutach.
12.05.2025, 15:05:01: [PRINT] Następna minuta...
12.05.2025, 15:06:00: [PRINT] Następna minuta...
12.05.2025, 15:07:00: [PRINT] Następna minuta...
Zamiast sprawdzać typ zdarzenia, można skorzystać z metody dateTime:changed(). Działa ona tak samo jak warunek event.type == "minute_changed" i ułatwia obsługę zdarzeń związanych z upływem czasu.
if dateTime:changed() then
print("Następna minuta...")
end
Aby stworzyć automatyzację, która otwiera rolety o godzinie 10:00, możesz napisać następujący skrypt:
local blind = sbus[47]
if dateTime:changed() and dateTime:getHours() == 9 and dateTime:getMinutes() == 0 then
blind:setValue("target_opening", 100)
end
Zwróć uwagę, że warunek wykorzystuje dateTime:changed(). Dzięki temu jest prawdziwy tylko wtedy, gdy godzina faktycznie zmienia się na 09:00. Bez tej metody automatyzacja wysyłałaby polecenie otwarcia rolety przy każdym zdarzeniu, jeśli tylko zegar wskazuje godzinę 09:00.
W ten sposób możesz dodać kolejne akcje, które będą uruchamiane o różnych godzinach, rozszerzając warunki w automatyzacji:
local blind = sbus[47]
if dateTime:changed() then
if dateTime:getHours() == 9 and dateTime:getMinutes() == 0 then
-- Otwórz żaluzję rano.
blind:setValue("target_opening", 100)
elseif dateTime:getHours() == 11 and dateTime:getMinutes() == 0 then
-- Przymknij żaluzję przed południem.
blind:setValue("target_opening", 50)
elseif dateTime:getHours() == 16 and dateTime:getMinutes() == 0 then
-- Ponownie otwórz żaluzję.
blind:setValue("target_opening", 100)
elseif dateTime:getHours() == 18 and dateTime:getMinutes() == 0 then
-- Zamknij żaluzję wieczorem.
blind:setValue("target_opening", 100)
end
end
Do okresowego wywoływania akcji można wykorzystać timer. Aby go utworzyć, przejdź do ustawień centrali i otwórz zakładkę Timery. Następnie kliknij przycisk +, aby dodać nowy timer. Wprowadź dowolną nazwę dla timera, a jednostkę czasu ustaw na sekundy.
Kliknij przycisk Zapisz. Nowo utworzony timer pojawi się na liście dostępnych timerów.
Zapisz ID utworzonego timera — będzie ono potrzebne do wykorzystania go w automatyzacji.
Przejdź do zakładki Automatyzacje. Utwórz nową automatyzację typu kod i wstaw poniższy skrypt, zamieniając 1 na odpowiednie ID Twojego timera:
local myTimer = timer[1]
if myTimer:getState() == "off" then
-- Włącz timer po raz pierwszy na 5 sekund
myTimer:start(5)
end
if myTimer:isElapsed() then
print("Timer zakończył odliczanie")
-- Włącz odliczanie ponownie
myTimer:start(5)
end
Zapisz automatyzację i otwórz panel logów. Co 5 sekund będą pojawiać się wpisy podobne do poniższych:
13.05.2025, 08:13:56: [PRINT] Timer zakończył odliczanie
13.05.2025, 08:14:01: [PRINT] Timer zakończył odliczanie
13.05.2025, 08:14:06: [PRINT] Timer zakończył odliczanie
Timer po utworzeniu oraz po restarcie centrali znajduje się w stanie wyłączonym (off). Kiedy timer aktywnie odlicza czas, jego stan zmienia się na counting. Po zakończeniu odliczania timer przechodzi w stan elapsed i emituje zdarzenie "lua_timer_elapsed".
Wyłącz automatyzację na co najmniej 10 sekund, a następnie włącz ją ponownie. Pomimo włączenia automatyzacji, w logu nie pojawią się nowe wpisy. Timer zakończył odliczanie i wyemitował zdarzenie, jednak wyłączona automatyzacja nie mogła go obsłużyć i ponownie uruchomić odliczania. Timer pozostaje w stanie "elapsed", przez co automatyzacja nie wznowi jego działania. Obecna automatyzacja zacznie działać poprawnie dopiero po restarcie centralki.
Problem ten można rozwiązać, dodając do skryptu następujący fragment kodu:
if automation[context().id]:changedValue("enabled") then
myTimer:start(5)
end
Funkcja context() zwraca informacje o kontekście działania skryptu. Jest to tabela, która pozwala zidentyfikować skrypt w systemie. W przypadku automatyzacji pole id zawiera jej unikalny identyfikator.
Obiekt automation umożliwia dostęp do wszystkich utworzonych automatyzacji przez ich ID, podobnie jak w przypadku urządzeń.
Gdy automatyzacja zostanie ponownie włączona, wyemituje zdarzenie zmiany parametru enabled.