HomeKit#
vCLU działa jako bridge HomeKit - pojawia się w aplikacji Dom (Apple Home) jako jedno urządzenie-mostek, pod którym widoczne są wszystkie wyeksponowane obiekty (lampy, przełączniki, rolety, czujniki).
Jak to działa#
Aplikacja Dom (iPhone/iPad/Mac)
│
│ HAP (szyfrowane, lokalne)
│
vCLU HomeKit Bridge (:5123)
│
┌────────┼────────┐
│ │ │
switch cover sensor ...
(DOUT) (ROLLER) (DIN)- vCLU startuje bridge HAP na porcie 5123 (domyślnie)
- Bridge ogłasza się w sieci przez mDNS/Bonjour
- Użytkownik paruje bridge w aplikacji Dom podając PIN
- Wyeksponowane obiekty pojawiają się jako akcesoria HomeKit
- Zmiany stanu propagują się w czasie rzeczywistym
Konfiguracja#
Z panelu webowego#
Na stronie /homekit:
- Włącz/wyłącz bridge
- Ustaw PIN, nazwę bridge, port
- Kliknij “Restart Bridge” po zmianach
Przez .vclu.json#
{
"homeKit": {
"enabled": true,
"pin": "00102003",
"port": 5123,
"bridgeName": "vCLU Bridge",
"serialNumber": "VCLU-001",
"refreshInterval": 300
}
}| Parametr | Opis | Domyślnie |
|---|---|---|
enabled | Włącz bridge | false |
pin | 8-cyfrowy PIN do parowania | 00102003 |
port | Port HAP | 5123 |
bridgeName | Nazwa bridge w aplikacji Dom | vCLU Bridge |
serialNumber | Numer seryjny | VCLU-001 |
refreshInterval | Odświeżanie stanów co X sekund (0 = wyłączone) | 300 |
API#
# Status bridge
curl http://vclu:3000/api/homekit/status
# Restart bridge (przeładuj akcesoria)
curl -X POST http://vclu:3000/api/homekit/restartParowanie#
- Włącz HomeKit w panelu
/homekit - Otwórz aplikację Dom na iPhonie/iPadzie
- Stuknij “+” → “Dodaj akcesorium”
- Wybierz “vCLU Bridge” (lub wpisz PIN ręcznie)
- Podaj PIN (domyślnie
001-02-003)
Baza parowania przechowywana jest w katalogu `homekit-db/`. Nie usuwaj tego katalogu - utracisz parowanie i trzeba będzie usunąć bridge z aplikacji Dom i sparować ponownie.
Eksponowanie obiektów#
HomeKit pokazuje tylko obiekty wyeksponowane przez expose() z flagą homekit = true (domyślnie włączona):
-- Przekaźnik GPIO jako przełącznik w HomeKit
local relay = GPIO_DOUT:new("RELAY1", 17, {activeLow = true})
expose(relay, "switch", {name = "Lampa salon"})
-- Roleta
expose(_:get("CLU.ROLLER1"), "cover", {name = "Roleta kuchnia"})
-- Czujnik temperatury
expose({value = 22.5}, "temperature", {name = "Temp salon"})
-- Czujnik ruchu
expose(btn, "motion", {name = "Ruch korytarz"})
-- Scena (w HomeKit jako przycisk - wykonaj i wróć do OFF)
scene("wieczor", function()
_:get("CLU.DOUT1"):execute(DOUT.METHOD_SWITCH_ON)
end)
expose(getScene("wieczor"), "scene", {name = "Tryb wieczorny"})Kontrola integracji#
-- Tylko HomeKit (bez MQTT/HA)
expose(obj, "switch", {name = "Lamp"}):homekitOnly()
-- Tylko MQTT (bez HomeKit)
expose(obj, "switch", {name = "Lamp"}):mqttOnly()
-- Tylko odczyt (widoczne ale nie sterowane)
expose(obj, "sensor", {name = "Temp"}):readonly()Auto-expose z registry#
-- Wyeksponuj wszystkie obiekty z OM registry
-- Respektuje AccessControl
exposeRegistry()Obsługiwane typy#
| Typ expose | Akcesorium HomeKit | Opis |
|---|---|---|
switch | Switch | przełącznik ON/OFF |
light | Lightbulb | lampa ON/OFF |
dimmer | Lightbulb | lampa z jasnością 0-100 |
cover | WindowCovering | roleta z pozycją 0-100 |
sensor | ContactSensor | czujnik binarny |
motion | MotionSensor | czujnik ruchu |
temperature | TemperatureSensor | temperatura (°C) |
humidity | TemperatureSensor | wilgotność (%) |
scene | Switch (bezstanowy) | wykonaj i wróć do OFF |
number | Switch | wartość > 0 = ON |
Przepływ stanów i komend#
Stan zmieniony w vCLU - aktualizacja w HomeKit#
Obiekt Lua zmienia wartość
↓
StateBus:emit("state_changed", {path, value, type})
↓
bootstrap: __go_homekit_notify(path, value, type)
↓
Go: Server.NotifyStateChange() → characteristic.SetValue()
↓
HAP powiadamia sparowane urządzenia AppleKomenda z HomeKit - wykonanie w vCLU#
Użytkownik w aplikacji Dom stuka "włącz"
↓
HAP: OnValueRemoteUpdate(true)
↓
Go: luaExecutor.Execute("ExposedObjects:get(path):setValue(1)")
↓
Lua: obiekt.set() / obiekt.execute()
↓
Grenton UDP → prawdziwy CLU wykonuje komendęOdświeżanie periodyczne#
Oprócz zdarzeń w czasie rzeczywistym, bridge co refreshInterval sekund (domyślnie 300 = 5 min) odpytuje aktualny stan każdego akcesorium - zabezpieczenie przed przegapionymi aktualizacjami.
AccessControl#
Obiekty mogą mieć ograniczony dostęp w HomeKit:
| Poziom | Widoczność | Sterowanie |
|---|---|---|
full | tak | tak |
readonly | tak | nie |
hidden | nie | nie |
Więcej: AccessControl