Środowisko Lua#

vCLU wykorzystuje język skryptowy Lua do automatyzacji inteligentnego domu. Lua jest lekki, szybki i prosty w nauce – idealny do pisania reguł typu “gdy czujnik wykryje ruch, zapal światło”.

Jak działa Twój kod#

Cały kod, który piszesz – pliki w katalogu modules/, konfiguracje zdarzeń, pluginy – działa w jednym wspólnym środowisku Lua.

graph TD
    subgraph "Środowisko Lua (vCLU)"
        user["user.lua<br/>(OM)"]
        modules["modules/<br/>Twój kod"]
        plugins[pluginy]
        shared["Współdzielone: urządzenia, timery,<br/>MQTT, EventBus, rejestr obiektów"]

        user --- shared
        modules --- shared
        plugins --- shared
    end

Kluczowa zasada: kod wykonuje się sekwencyjnie. Nie ma równoległego przetwarzania, nie ma wyścigów danych. Jeśli dwa zdarzenia nadejdą jednocześnie, jedno poczeka na zakończenie drugiego. Dzięki temu pisanie automatyzacji jest bezpieczne i przewidywalne.

Kolejność ładowania plików#

Przy starcie vCLU ładuje pliki w określonej kolejności:

  1. user.lua – definicje funkcji użytkownika (generowane przez Object Manager)
  2. om.lua – obiekty Grenton (moduły, wejścia/wyjścia)
  3. Proxy z innych CLU – obiekty zdalne (jeśli skonfigurowane)
  4. modules/ – Twoje pliki automatyzacji (init.lua pierwszy, potem alfabetycznie)
  5. Pluginy – zainstalowane rozszerzenia
  6. SYSTEM.Init() – inicjalizacja systemu, odpalenie EVENT_ON_INIT

Pisanie modułów#

Swoje automatyzacje umieszczasz w katalogu modules/. Przykład:

-- modules/init.lua (ładowany jako pierwszy)
MQTT_CLIENT = MQTT:new("broker1")
MQTT_CLIENT:setHost("192.168.0.10"):setPort(1883):setClientId("vclu-client")
MQTT_CLIENT:connect()

-- modules/lights.lua (ładowany potem, alfabetycznie)
local mySwitch = VirtualSwitch:new("custom.light1")
mySwitch:expose()

Pliki z głównego poziomu modules/ ładują się automatycznie. Podkatalogi (np. modules/scenes/) wymagają ręcznego załadowania przez require().

Reload vs Reinicjalizacja#

Po edycji kodu masz dwie opcje zastosowania zmian:

OperacjaCo robiKiedy używać
ReloadPrzeładowuje kod, zachowuje połączeniaPo drobnych zmianach w kodzie
ReinicjalizacjaReset całego środowiska od zeraGdy coś nie działa po reload

Reload to szybsza opcja – stosuj ją po edycji plików w modules/.

Reinicjalizacja restartuje wszystko: timery, połączenia MQTT, stan obiektów. Używaj jej, gdy potrzebujesz czystego startu.

Jeśli edytujesz kod przez panel webowy, możesz najpierw przetestować zmiany w sandboxie (bezpieczne, izolowane środowisko), a potem wdrożyć je przez “Promote” – co automatycznie tworzy backup i przeładowuje kod.

Dobre praktyki#

  • Nie pisz nieskończonych pętli – vCLU ma wbudowany timeout (10 sekund). Skrypt, który się zapętli, zostanie automatycznie przerwany.
  • Używaj timerów do zadań okresowych zamiast while true:
    -- Dobrze: sprawdzaj temperaturę co 30 sekund
    every(30000, function()
        local temp = getTemperature()
        if temp > 25 then fan:switchOn() end
    end)
  • Trzymaj callbacki krótkie – poniżej 100ms. Długo działający callback blokuje przetwarzanie innych zdarzeń.
  • Nie używaj print() do debugowania w produkcji – użyj Logger:info() lub Logger:warn(), które widać w logach systemowych.

Agent AI#

Agent AI (MCP) może pisać i testować kod Lua za Ciebie. Wystarczy opisać słownie, co chcesz zautomatyzować – agent napisze moduł, przetestuje go w sandboxie i wdroży na produkcję. Możesz też poprosić agenta o wyjaśnienie istniejącego kodu lub pomoc w debugowaniu.