Wydajność#

vCLU jest zaprojektowane dla ograniczonego sprzętu – Raspberry Pi z 512 MB RAM. Pojedynczy proces bez zewnętrznych zależności sprawia, że system jest lekki i przewidywalny.

Zużycie zasobów#

ZasóbWartość
Rozmiar binarki~13 MB
RAM minimum~13 MB (RPi 1, tryb bare minimum)
RAM typowy30–50 MB (pełna konfiguracja z HomeKit, MQTT, pluginami)
CPU w spoczynku<1%
CPU podczas discovery~5% (skanowanie sieci Grenton)
Dysk~10 MB (binarka + dane konfiguracyjne)

Obsługiwany sprzęt#

UrządzenieStatusUwagi
Raspberry Pi 4ZalecanyNajlepsza wydajność, 1–8 GB RAM
Raspberry Pi 3 B+WspieranyWystarczający dla typowych instalacji
Raspberry Pi Zero 2 WWspieranyKompaktowy, quad-core, 512 MB RAM
Raspberry Pi Zero WWspieranyWolniejszy start, single-core, działa stabilnie
Raspberry Pi 1Minimum512 MB RAM, testowane – działa z ograniczeniami

Architektura ARM64 (aarch64) jest preferowana. Wersja ARM32 (armv6l) działa na starszych modelach Pi.

Metryki systemowe#

vCLU zbiera metryki co 1 minutę i przechowuje je przez 24 godziny. Dostępne są w panelu webowym (zakładka Stats) oraz przez endpoint Prometheus.

System#

MetrykaOpis
Pamięć (MB)Zużycie pamięci procesu
GoroutinesLiczba aktywnych gorutyn
GC pauseCzas ostatniej pauzy garbage collectora

Lua#

MetrykaOpis
ExecutionsLiczba wykonań kodu Lua
ErrorsBłędy w callbackach Lua
Avg exec timeŚredni czas wykonania callbacka
TimersLiczba aktywnych timerów

MQTT#

MetrykaOpis
ConnectedLiczba podłączonych klientów
PublishedOpublikowane wiadomości
ReceivedOdebrane wiadomości
ReconnectsLiczba ponownych połączeń

HTTP#

MetrykaOpis
Total requestsWszystkie żądania HTTP
API requestsŻądania do endpointów /api/
Web requestsŻądania stron panelu
ErrorsOdpowiedzi z kodem 4xx/5xx
RateŻądania na sekundę

HomeKit#

MetrykaOpis
AccessoriesZarejestrowane akcesoria
PairedSparowane urządzenia Apple
Get / Set / EventsOperacje odczytu, zapisu i powiadomień

MCP (agent AI)#

MetrykaOpis
RequestsŻądania od agentów AI
ErrorsBłędy przetwarzania
SessionsAktywne sesje MCP
Latency bucketsRozkład czasów odpowiedzi

Endpoint Prometheus#

Metryki dostępne są pod adresem:

GET /metrics

Format odpowiedzi jest kompatybilny z Prometheus. Można go podłączyć do Grafany lub dowolnego systemu monitoringu. Endpoint wymaga uwierzytelnienia (sesja lub klucz API).

Optymalizacje wydajności#

Jeden proces, zero zależności#

vCLU nie wymaga zewnętrznego brokera MQTT, bazy danych ani kontenera Docker. Wszystko działa w ramach jednego procesu – eliminuje to narzut komunikacji międzyprocesowej i upraszcza diagnostykę.

Sekwencyjne wykonanie Lua#

Maszyna wirtualna Lua działa w dedykowanej gorutynie z kolejką zadań. Callbacki wykonują się jeden po drugim, co eliminuje wyścigi danych bez kosztu blokad (mutex). Szczegóły w rozdziale Wielozadaniowość.

Optymistyczne aktualizacje stanu#

Obiekty Remote* (RemoteSwitch, RemoteDimmer, RemoteRoller) ustawiają lokalny cache natychmiast po wywołaniu komendy. Subskrypcja CLU potwierdza lub koryguje stan później. Dzięki temu dashboard reaguje natychmiast, bez czekania na odpowiedź z modułu Grenton.

sequenceDiagram
    participant U as Użytkownik
    participant V as vCLU (cache)
    participant G as Grenton CLU

    U->>V: switchOn()
    V->>V: _lastState = 1 (natychmiast)
    V->>G: set(1) — fire-and-forget UDP
    V->>U: Dashboard pokazuje ON
    G-->>V: Subskrypcja potwierdza stan 1

Fire-and-forget UDP#

Komendy sterujące (set, execute) wysyłane są przez __go_send_command_noreply – pakiet UDP bez oczekiwania na odpowiedź. Eliminuje to blokowanie maszyny Lua na czas round-tripu sieciowego (~10–50 ms na komendę).

Odświeżanie subskrypcji#

Zamiast niszczenia i ponownego tworzenia subskrypcji co 30 sekund (34 blokujące wywołania UDP), system używa clientRefresh – jednego pakietu odświeżającego sesję (17 wywołań, fire-and-forget). Czas odświeżania spadł z 2–3 sekund do kilku milisekund.

Polling GPIO#

Piny wejściowe GPIO odpytywane są co 50 ms z kolejką zdarzeń. Zmiany stanu trafiają do kolejki Lua jako eventy, nie blokując głównej pętli przetwarzania.

Diagnostyka wydajności#

Jeśli system reaguje wolno:

  1. Sprawdź zakładkę Stats w panelu – sekcja Lua pokaże średni czas wykonania callbacków
  2. Poszukaj ostrzeżeń w logach o callbackach przekraczających timeout
  3. Sprawdź liczbę aktywnych timerów – zbyt wiele (>1000) może spowalniać cykl
  4. Sprawdź bufor MQTT – przy >1000 oczekujących wiadomości system odrzuca najstarsze