Baza wiedzy Sinum

Funkcje czasowe

Za pomocą obiektów dateTime oraz timerów można tworzyć skrypty operujące na czasie.

Wykonywanie akcji o określonych godzinach

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

Wykonywanie akcji co określony czas

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.

Tworzenie timera

Kliknij przycisk Zapisz. Nowo utworzony timer pojawi się na liście dostępnych timerów.

Lista 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.