Ś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
endKluczowa 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:
- user.lua – definicje funkcji użytkownika (generowane przez Object Manager)
- om.lua – obiekty Grenton (moduły, wejścia/wyjścia)
- Proxy z innych CLU – obiekty zdalne (jeśli skonfigurowane)
- modules/ – Twoje pliki automatyzacji (
init.luapierwszy, potem alfabetycznie) - Pluginy – zainstalowane rozszerzenia
- 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:
| Operacja | Co robi | Kiedy używać |
|---|---|---|
| Reload | Przeładowuje kod, zachowuje połączenia | Po drobnych zmianach w kodzie |
| Reinicjalizacja | Reset całego środowiska od zera | Gdy 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żyjLogger:info()lubLogger: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.