Debugowanie#

vCLU ma wbudowane narzędzia do debugowania runtime Lua — endpoint Execute, introspekcję registry i debug EventBus/StateBus.

Execute — REPL przez HTTP#

Endpoint /api/execute pozwala wykonać dowolny skrypt Lua w działającym silniku:

curl -X POST http://vclu:8080/api/execute \
  -H "Content-Type: application/json" \
  -d '{"script": "_:list()"}'

Tryb wyrażenia#

Pojedyncze wyrażenia są automatycznie opakowane i zwracają wartość:

-- Zwraca wynik
_:list()
_:get("CLU.DOUT1")._lastState
1 + 1

Wewnętrznie wrapper:

__vclu_result__ = (function() return <wyrażenie> end)()

Tryb instrukcji#

Gdy wrapper nie zadziała, skrypt jest wykonywany bezpośrednio:

-- Wielolinijkowe instrukcje
_:sync("CLU.DOUT1", 1)
print("done")

Output z print() jest przechwytywany przez __vclu_print_output__.

Bezpieczeństwo#

  • Execute trzyma lock na całym LState podczas wykonania
  • dofile() i loadfile() są zablokowane
  • Dostęp chroniony auth (Bearer token) w trybie produkcyjnym

Introspekcja Registry#

-- Lista wszystkich obiektów z typami i nazwami
_:list()

-- Czytelne podsumowanie
_:info()

-- Szukaj po wzorcu (Lua pattern)
_:find("CLU%.DOUT%d+")

-- Pełny eksport JSON
_:toJSON()

-- Odczytaj stan konkretnego obiektu
_:get("CLU.DOUT1")._lastState
_:get("CLU.DOUT1")._type

Debug EventBus#

-- Wypisz wszystkie zarejestrowane eventy i callbacki
EventBus:getShared():debug()

Loguje listę event key → callback count.

Debug StateBus#

-- Wypisz wszystkie listenery zmian stanu
StateBus:debug()

Przykłady użycia#

Sprawdzenie stanu systemu#

# Lista obiektów
curl -s -X POST http://vclu:8080/api/execute \
  -d '{"script": "_:info()"}'

# Stan konkretnego wyjścia
curl -s -X POST http://vclu:8080/api/execute \
  -d '{"script": "_:get(\"CLU.DOUT1\")._lastState"}'

Zmiana stanu na żywo#

# Włącz wyjście
curl -s -X POST http://vclu:8080/api/execute \
  -d '{"script": "_:sync(\"CLU.DOUT1\", 1)"}'

# Wyemituj event
curl -s -X POST http://vclu:8080/api/execute \
  -d '{"script": "_:event(\"CLU.DOUT_01.OnSwitchOn\")"}'

Testowanie timerów#

-- Jednorazowy timer za 3s
EventBus:getShared():setTimeout(function()
    print("timer fired!")
end, 3000)

Ograniczenia#

  • Execute() może zwracać wartości tylko z pojedynczych wyrażeń — wieloinstrukcyjne skrypty nie zwracają wartości
  • Długie skrypty blokują main loop (10ms tick) — unikaj ciężkich operacji
  • Brak breakpointów / step debugging — tylko print-based debugging