om.lua (read-only)#

om.lua to plik generowany przez Object Manager (OM) — aplikację desktopową Grenton. Zawiera definicje wszystkich obiektów, modułów i event handlerów.

**vCLU nie modyfikuje om.lua.** Plik jest ładowany raz przy starcie i traktowany jako read-only. Wszelkie zmiany w konfiguracji modułów robi się w OM.

Jak OM generuje om.lua#

  1. OM łączy się z vCLU przez discovery protocol (UDP broadcast)
  2. Pobiera config.txt przez TFTP — lista modułów i ich typów HW
  3. Na podstawie tych danych generuje om.lua z definicjami modułów i IO

vCLU dostarcza tylko bazowy obiekt CLU — moduły i ich IO są dodawane przez OM.

Struktura pliku#

Typowy om.lua wygląda tak:

-- Lokalny CLU (GATE)
CLU520046772 = GATE:new(5000, 0xC0A800DA, ...)

-- Zdalne CLU (obiekty proxy)
CLU221000290 = OBJECT:new(1, 0xC0A80003, "CLU221000290")
CLU220000592 = OBJECT:new(1, 0xC0A80005, "CLU220000592")

-- Moduły lokalne (generowane przez OM na podstawie config.txt)
-- DOUT1 = ...
-- DIN1 = ...

-- Event handler
function OnInit()
    CLU520046772:set(1, 10000)   -- ustaw feature
    testInit(nil)                 -- wywołaj funkcję z user.lua
end

-- Binding eventu
CLU520046772:add_event(0, OnInit)  -- EVENT_ON_INIT

Kluczowe elementy#

GATE:new() — lokalny CLU#

CLU520046772 = GATE:new(port, ipHex, ...)

Tworzy główny obiekt CLU z portem nasłuchiwania i adresem IP w hex.

OBJECT:new() — zdalny CLU#

CLU221000290 = OBJECT:new(typeId, ipHex, name)

Proxy do komunikacji z innymi kontrolerami w sieci Grenton.

add_event() — binding eventów#

module:add_event(eventId, callback)

Podpina funkcję (zwykle zdefiniowaną w user.lua) pod event modułu.

Zmienne użytkownika#

OM może generować inicjalizację zmiennych user:

setVar("nightMode", false)
setVar("temperature_threshold", 22)

Typy modułów HW#

OM rozpoznaje moduły na podstawie typów sprzętowych z config.txt:

Typ HWModułOpis
0x1eDOUT8T8 wyjść cyfrowych (tristate)
0x15RELAY44 przekaźniki
0x14DIN88 wejść cyfrowych

Ładowanie#

om.lua jest ładowany po user.lua przez state.DoFile():

err := le.state.DoFile(omPath)
if err != nil {
    return fmt.Errorf("failed to load om.lua: %w", err)
}

W przeciwieństwie do user.lua, błąd w om.lua przerywa inicjalizację — bez definicji obiektów system nie może działać.

Nie dodawaj init(nil)#

OM nie generuje init(nil) w om.lua — i vCLU też tego nie potrzebuje. Inicjalizacja odbywa się przez SYSTEM.Init()EVENT_ON_INITOnInit().