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 --> outReagowanie 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 --> haWystarczy, ż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ń.