user.lua#
user.lua to plik z kodem użytkownika — funkcje, zmienne i logika automatyki, które są wywoływane z poziomu om.lua lub eventów.
Lokalizacja#
Plik znajduje się w katalogu danych CLU, typowo:
a/clu/user.luaŁadowanie#
user.lua jest ładowany jako pierwszy w sekwencji LoadCLUData(), przed om.lua:
local ok, err = pcall(function() require "user" end)
if not ok then
Logger:getShared():warn("[LUA] user.lua skipped: " .. tostring(err))
endKluczowe cechy:
- Opcjonalny — jeśli nie istnieje, system działa dalej bez błędu
- Błędy są logowane, ale nie przerywają inicjalizacji
- Ładowany przez
require, więc wykonuje się raz (cachowany wpackage.loaded)
Co może zawierać#
Funkcje wywoływane z eventów#
Najczęstsze zastosowanie — funkcje, które om.lua podpina pod eventy modułów:
-- user.lua
function sceneLightsOff()
CLU520046772:execute(0, "DOUT1:set(0, 0)")
CLU520046772:execute(0, "DOUT2:set(0, 0)")
end
function onMotionDetected()
CLU520046772:execute(0, "DOUT_HALL:set(0, 1)")
Timer_AutoOff:start()
endW om.lua te funkcje są referencjami w event handlerach:
DIN1:add_event(DIN.EVENT_ON_CHANGE, onMotionDetected)Zmienne użytkownika#
function testInit()
setVar("initialized", true)
endSynchronizacja z innymi CLU#
function synchronize(pathOrName, value)
-- Wywoływana z innych CLU via _:sync()
_:sync(pathOrName, value)
endCzego nie powinien zawierać#
- Definicji modułów — to robi
om.lua(generowany przez OM) - Bezpośrednich odwołań do plików —
dofile()iloadfile()są zablokowane (używajrequire()i katalogu modules/) - Nieskończonych pętli — zablokują pętlę główną (10ms tick)
Dostęp do globalnego stanu#
user.lua ma pełny dostęp do globalnej przestrzeni nazw Lua:
-- Dostęp do modułów zdefiniowanych w om.lua
CLU520046772:set(1, 10000)
-- Dostęp do Registry
_:get("CLU.DOUT1")
-- Dostęp do EventBus
EventBus:getShared():on("custom_event", function()
print("custom event fired")
end)Kolejność ładowania#
1. bootstrap_go.lua → runtime Lua (EventBus, Registry, moduły...)
2. user.lua → funkcje użytkownika
3. om.lua → definicje obiektów, event bindingi
4. SYSTEM.Init() → EVENT_ON_INIT → OnInit()user.lua ładuje się po bootstrapie (więc ma dostęp do klas jak Timer, DOUT, EventBus), ale przed om.lua (więc jeszcze nie istnieją konkretne instancje modułów).
Dlatego w user.lua definiuje się funkcje, a nie wywołuje metody modułów — moduły pojawią się dopiero po załadowaniu om.lua.