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))
end

Kluczowe 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 w package.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()
end

W 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)
end

Synchronizacja z innymi CLU#

function synchronize(pathOrName, value)
    -- Wywoływana z innych CLU via _:sync()
    _:sync(pathOrName, value)
end

Czego nie powinien zawierać#

  • Definicji modułów — to robi om.lua (generowany przez OM)
  • Bezpośrednich odwołań do plikówdofile() i loadfile() są zablokowane (używaj require() 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.