EventBus#

EventBus to system pub/sub do obsługi zdarzeń wewnętrznych. Zarządza callbackami modułów (OnInit, OnTimer, OnChange) oraz timerami (setTimeout/setInterval) z backendem w Go.

Dwa systemy zdarzeń#

vCLU ma dwa oddzielne systemy:

SystemPlikCel
EventBusEventBusGo.luaEventy wewnętrzne modułów (OnInit, OnTimer, OnChange)
StateBusStateBus.luaZmiany stanu dla integracji (MQTT, WebSocket, HomeKit)

EventBus — eventy wewnętrzne#

-- Rejestracja eventu modułowego (styl Grenton)
EventBus:on(module, "OnSwitchOn", function()
    print("switch on!")
end)

-- Rejestracja eventu po stringu (styl pluginów)
EventBus:on("custom_event", function(data)
    print("received: " .. tostring(data))
end)

StateBus — zmiany stanu#

-- Nasłuchiwanie zmian stanu (dla integracji)
StateBus:on("state_changed", function(data)
    -- data = {path, value, type, obj}
    print(data.path .. " = " .. tostring(data.value))
end)

API EventBus#

Singleton#

local eb = EventBus:getShared()

Rejestracja zdarzeń#

-- Moduł + nazwa eventu
eb:on(module, eventName, callback)

-- String event (pluginy)
eb:on(eventName, callback)

Emitowanie zdarzeń#

-- Moduł event
eb:fire(module, eventName)

-- String event z argumentami
eb:emit(eventName, arg1, arg2, ...)

Wyrejestrowanie#

eb:off(module, eventName, callback)  -- zwraca true jeśli usunięto

Timery#

-- Jednorazowy timer
local id = eb:setTimeout(function()
    print("once!")
end, 5000)  -- 5 sekund

-- Powtarzający się timer
local id = eb:setInterval(function()
    print("tick!")
end, 1000)  -- co 1 sekundę

-- Anulowanie
eb:clearInterval(id)

Klucz wewnętrzny eventu#

EventBus identyfikuje eventy kombinacją ID modułu i nazwy:

function EventBus:getKey(id, event)
    return id .. '-' .. event  -- np. "module_123-OnSwitchOn"
end

Obsługa błędów#

Callbacki są wywoływane wewnątrz pcall — błąd w jednym callbacku nie przerywa pozostałych:

local success, err = pcall(callback)
if not success then
    Logger:getShared():error("EventBus callback error: " .. tostring(err))
end

Backend Go#

Timery EventBus delegowane są do Go przez zarejestrowane funkcje:

LuaGoOpis
eb:setTimeout(cb, ms)__go_setTimeoutJednorazowy timer
eb:setInterval(cb, ms)__go_setIntervalPowtarzający się timer
eb:clearInterval(id)__go_clearTimerAnulowanie

Go zarządza precyzyjnym schedulingiem (goroutine z 10ms tickerem), a callbacki Lua są wywoływane w main loop.

Debug#

-- Wylistuj wszystkie zarejestrowane eventy
EventBus:getShared():debug()

-- Wylistuj wszystkie listenery StateBus
StateBus:debug()