System zdarzeń#

Zdarzenia (eventy) to sposób, w jaki komponenty vCLU komunikują się ze sobą. Gdy coś się dzieje – światło się zapala, czujnik odczytuje nową wartość, przychodzi wiadomość MQTT – system generuje zdarzenie, na które mogą reagować inne elementy.

Jak to działa w praktyce#

graph TD
    s1["Użytkownik naciska<br/>przycisk na ścianie"]
    s2["Czujnik wykrywa<br/>ruch w salonie"]
    s3["Wiadomość MQTT<br/>z zewnętrznego systemu"]

    e1["Zdarzenie:<br/>przycisk wciśnięty"]
    e2["Zdarzenie:<br/>stan się zmienił"]
    e3["Zdarzenie:<br/>nowa wiadomość"]

    a1["Automatyzacja:<br/>zapal światło"]
    a2["Automatyzacja:<br/>włącz alarm"]
    a3["Automatyzacja:<br/>zaktualizuj sensor"]

    out["Powiadomienia (automatycznie):<br/>HomeKit / Dashboard / Home Assistant<br/>dostają informację o nowym stanie"]

    s1 --> e1 --> a1 --> out
    s2 --> e2 --> a2 --> out
    s3 --> e3 --> a3 --> out

Reagowanie na zmiany stanu urządzeń#

Najprostszy sposób na automatyzację: reaguj, gdy urządzenie zmieni stan.

-- Reaguj na zmianę stanu przełącznika
local switch = _:get("CLU220000592.DOUT1")
switch:onChange(function()
    log.info("Przełącznik zmienił stan na: " .. tostring(switch:getValue()))
end)

Callback onChange wywołuje się za każdym razem, gdy wartość urządzenia się zmieni – niezależnie od tego, czy zmiana pochodzi z fizycznego przycisku, panelu webowego, HomeKit czy agenta AI.

Integracje automatycznie reagują na zdarzenia#

Nie musisz ręcznie powiadamiać HomeKit ani dashboardu o zmianach. System zdarzeń robi to automatycznie:

graph TD
    dev["Urządzenie zmienia stan"]

    subgraph "System zdarzeń (StateBus)"
        hk["HomeKit<br/>(Apple)"]
        dash["Dashboard<br/>(web)"]
        ha["Home<br/>Assistant"]
    end

    dev --> hk
    dev --> dash
    dev --> ha

Wystarczy, że urządzenie jest wystawione (expose()), a system zdarzeń zajmie się resztą.

Własne zdarzenia między modułami#

Możesz tworzyć własne zdarzenia do komunikacji między modułami:

-- modules/weather.lua -- wysyła zdarzenie
local eb = EventBus:getShared()
eb:emit("weather.updated", { temp = 22.5, humidity = 65 })

-- modules/climate.lua -- reaguje na zdarzenie
eb:on("weather.updated", function(data)
    if data.temp > 25 then
        log.info("Za ciepło! Włączam wentylację.")
        fan:switchOn()
    end
end)

Zdarzenia pozwalają utrzymać moduły niezależne od siebie. Moduł pogodowy nie musi wiedzieć, kto nasłuchuje – po prostu wysyła informację.

Zdarzenia MQTT#

Wiadomości MQTT automatycznie stają się zdarzeniami w Twoim kodzie Lua:

-- Nasłuchuj na wiadomości z czujnika temperatury
MQTT_CLIENT:subscribe("sensors/temperature", function(topic, payload)
    local data = JSON:decode(payload)
    Logger:info("Temperatura: " .. data.value .. "°C")
end)

Działa to w obie strony – możesz też publikować wiadomości MQTT z automatyzacji:

MQTT_CLIENT:publish("home/status", JSON:encode({ status = "armed" }))

Timery – zdarzenia w czasie#

System zdarzeń obsługuje też akcje odłożone w czasie:

-- Wykonaj za 5 sekund (jednorazowo)
after(5000, function()
    log.info("Minęło 5 sekund!")
end)

-- Wykonuj co 30 sekund (cyklicznie)
local timerId = every(30000, function()
    -- sprawdzaj czujnik co 30s
end)

-- Zatrzymaj cykliczne wykonywanie
cancel(timerId)

Odsubskrybowanie#

Każda subskrypcja może być anulowana, gdy nie jest już potrzebna:

-- onChange zwraca funkcję do anulowania subskrypcji
local unsubscribe = switch:onChange(function()
    -- ...
end)

-- Później, gdy nie potrzebujesz już reagować:
unsubscribe()

Bezpieczeństwo#

Błąd w jednym callbacku nie zatrzymuje pozostałych. Jeśli Twoja automatyzacja rzuci wyjątek, system zaloguje błąd i kontynuuje przetwarzanie kolejnych zdarzeń. Dzięki temu jeden wadliwy moduł nie zepsuje całego systemu.

Agent AI#

Agent AI może pomóc napisać automatyzacje oparte na zdarzeniach. Opisz scenariusz słownie (np. “gdy temperatura spadnie poniżej 18 stopni, włącz ogrzewanie i wyślij powiadomienie MQTT”), a agent stworzy odpowiedni kod Lua z obsługą zdarzeń.