JSON Schema#

Schematy plików konfiguracyjnych vCLU — formaty JSON, YAML i txt używane przez system.


.vclu.json — konfiguracja główna#

Źródło prawdy dla wszystkich ustawień. Przechowywany w katalogu CLU.

Ścieżka: {cluDir}/.vclu.json

{
  "setupCompleted": true,
  "createdAt": "2026-02-17T10:30:00Z",
  "lastModified": "2026-02-17T10:30:00Z",

  "device": {
    "name": "My CLU",
    "serialNumber": 285279991,
    "hardwareType": 18,
    "hardwareVersion": 1,
    "firmwareType": 3,
    "firmwareVersion": 1000,
    "firmwareVersionStr": "1.0.0-vclu",
    "deviceTypeId": "clu",
    "category": "CLU",
    "modules": [
      {
        "id": "mod_001",
        "typeId": "dout8t",
        "serial": "3300001234",
        "name": "Moduł 1",
        "hardwareType": 30
      }
    ],
    "ioObjects": [
      {
        "id": "DOU0001",
        "moduleId": "mod_001",
        "typeId": "dout",
        "index": 0,
        "name": "Moduł 1 DOU1",
        "luaType": 4
      }
    ]
  },

  "keys": {
    "key": "base64...",
    "iv": "base64...",
    "defaultIV": "base64...",
    "pin": "base64...",
    "broadcastKey": "base64...",
    "broadcastIV": "base64...",
    "broadcastEnabled": true
  },

  "auth": {
    "username": "admin",
    "passwordHash": "sha1hash..."
  },

  "mqttBroker": {
    "enabled": true,
    "port": 1883,
    "wsPort": 8080,
    "username": "mqtt_user",
    "password": "mqtt_pass"
  },

  "homeKit": {
    "enabled": true,
    "pin": "00102003",
    "port": 5123,
    "bridgeName": "vCLU Bridge",
    "serialNumber": "VCLU-001",
    "refreshInterval": 300
  },

  "metrics": {
    "enabled": true,
    "auth": false,
    "username": "",
    "password": ""
  },

  "plugins": {
    "pluginsDir": "~/.vclu/plugins",
    "repositories": [
      {
        "name": "vCLU Official",
        "url": "https://github.com/Domktorymysli/vclu-plugins",
        "enabled": true,
        "default": true
      }
    ],
    "installed": [
      {
        "id": "weather",
        "version": "1.0.0",
        "enabled": true,
        "repository": "vCLU Official",
        "installedAt": "2026-02-17T10:30:00Z",
        "config": {}
      }
    ]
  },

  "omFiles": [
    {
      "filename": "om_285279991.lua",
      "serial": 285279991,
      "cluName": "DOM20",
      "cluIp": "192.168.0.3",
      "objectCount": 45,
      "moduleCount": 5,
      "uploadedAt": "2026-02-17T10:30:00Z"
    }
  ]
}

Opis pól#

PoleTypOpis
setupCompletedboolCzy kreator konfiguracji został ukończony
createdAtISO8601Data utworzenia
lastModifiedISO8601Data ostatniej modyfikacji

device — konfiguracja urządzenia#

PoleTypOpis
namestringNazwa urządzenia
serialNumberuint64Numer seryjny
hardwareTypeuint8Typ sprzętu (0x12=Gate, 0x13=CLU)
hardwareVersionuint8Wersja sprzętu
firmwareTypeuint8Typ firmware (zwykle 0x03)
firmwareVersionuint32Wersja firmware
firmwareVersionStrstringWersja firmware (czytelna)
deviceTypeIdstring"clu" lub "gate"
categorystring"CLU" lub "GATE"
modulesarrayLista modułów I/O
ioObjectsarrayLista obiektów I/O

device.modules[] — moduł I/O#

PoleTypOpis
idstringID modułu (np. "mod_001")
typeIdstringTyp: "dout8t", "relay4", "din8"
serialstringNumer seryjny modułu
namestringNazwa
hardwareTypeuint8Typ HW: 0x1e (DOUT8T), 0x15 (RELAY4), 0x14 (DIN8)

device.ioObjects[] — obiekt I/O#

PoleTypOpis
idstringID obiektu (np. "DOU0001")
moduleIdstringID rodzica modułu
typeIdstringTyp: "dout", "din", "analog_in"
indexintIndeks w module
namestringNazwa
luaTypeintTyp Lua: 4 (DOUT), 3 (DIN), 12 (Analog)

keys — klucze szyfrowania#

PoleTypOpis
keystring (base64)16-bajtowy klucz projektu
ivstring (base64)16-bajtowy wektor IV
defaultIVstring (base64)Domyślny IV
pinstring (base64)8-bajtowy PIN (np. “00000000”)
broadcastKeystring (base64)Klucz broadcast (opcjonalny)
broadcastIVstring (base64)IV broadcast (opcjonalny)
broadcastEnabledboolCzy broadcast jest skonfigurowany

Klucze generowane automatycznie przez crypto/rand jeśli brak.

auth — uwierzytelnianie GUI#

PoleTypOpis
usernamestringLogin
passwordHashstringHasz SHA1 hasła

mqttBroker — wbudowany broker MQTT#

PoleTypOpis
enabledboolAktywny
portintPort TCP (domyślnie 1883)
wsPortintPort WebSocket (domyślnie 8080)
usernamestringUżytkownik brokera
passwordstringHasło brokera

homeKit — integracja Apple HomeKit#

PoleTypOpis
enabledboolAktywna
pinstringKod PIN parowania (np. “00102003”)
portintPort serwera
bridgeNamestringNazwa bridge
serialNumberstringNumer seryjny bridge
refreshIntervalintInterwał odświeżania (s)

metrics — metryki Prometheus#

PoleTypOpis
enabledboolAktywne
authboolWymagaj uwierzytelnienia
usernamestringLogin (jeśli auth=true)
passwordstringHasło (jeśli auth=true)

plugins — system pluginów#

PoleTypOpis
pluginsDirstringKatalog pluginów
repositoriesarrayRepozytoria pluginów
installedarrayZainstalowane pluginy

keys.json — klucze szyfrowania (TFTP)#

Plik kluczy w katalogu TFTP. Tworzony podczas wizarda.

Ścieżka: {cluDir}/a/keys.json

{
  "key": "dNmYo86Mw26WzlnCSrMMhw==",
  "iv": "ssxjISodN4B9F1+JdI+8ug==",
  "defaultIV": "ssxjISodN4B9F1+JdI+8ug==",
  "pin": "MDAwMDAwMDA=",
  "broadcastKey": "hd5SHpxl0N5+WEXTXlPQmw==",
  "broadcastIV": "BwYFBAMCAQAEAgkDBAEFBw==",
  "broadcastEnabled": true
}

Format identyczny z sekcją keys w .vclu.json. Wszystkie wartości base64-encoded, 16 bajtów (PIN: 8 bajtów).


CONFIG.JSON — format Object Manager#

Konfiguracja urządzenia w formacie OM. Serwowana przez TFTP, parsowana przez Object Manager.

Ścieżka: {cluDir}/a/CONFIG.JSON

{
  "sn": 3684849295,
  "mac": "46:0b:d4:48:0a:ec",
  "hwType": 18,
  "hwVer": 1,
  "fwType": 3,
  "fwApiVer": 1000,
  "fwVer": "0.3.232",
  "tfbusDevices": [
    "33000001:1e:02:01",
    "20100002:15:02:01"
  ],
  "zwaveDevices": []
}
PoleTypOpis
snuint64Numer seryjny (32-bit)
macstringAdres MAC
hwTypeuint8Typ sprzętu
hwVeruint8Wersja sprzętu
fwTypeuint8Typ firmware
fwApiVeruint32Wersja API firmware
fwVerstringWersja firmware (czytelna)
tfbusDevicesarrayModuły TFBus
zwaveDevicesarrayUrządzenia Z-Wave (puste w vCLU)

Format TFBus#

{serialHex}:{hwTypeHex}:02:01
FragmentOpis
serialHexHex numeru seryjnego modułu (np. 33000001)
hwTypeHexHex typu HW: 1e=DOUT8T, 15=RELAY4, 14=DIN8
02:01Stałe identyfikatory protokołu

config.txt — konfiguracja TFTP (tekstowa)#

Format legacy dla konfiguracji TFTP. 7 linii + opcjonalne moduły.

Ścieżka: {cluDir}/a/config.txt

00000000
dba2568f
46:0b:d4:48:0a:ec
00000003
000003e8
00000012
00000001
33000001:1e:02:01
20100002:15:02:01
LiniaPoleFormatOpis
1PIN8 znakówKod PIN (np. “00000000”)
2Serial8-znakowy hexNumer seryjny (skrócony, ostatnie 4 bajty)
3MACxx:xx:xx:xx:xx:xxAdres MAC
4Firmware Type8-znakowy hexTyp firmware
5Firmware Version8-znakowy hexWersja firmware
6Hardware Type8-znakowy hexTyp sprzętu
7Hardware Version8-znakowy hexWersja sprzętu
8+TFBus modulesserial:type:02:01Po jednym module na linię

config.json — konfiguracja runtime#

Konfiguracja urządzenia do użytku wewnętrznego. Generowana automatycznie.

Ścieżka: {cluDir}/a/config.json

{
  "serialNumber": 2852799910974750602,
  "macAddress": "72:b5:79:eb:92:5c",
  "hardwareType": 19,
  "hardwareVersion": 1,
  "firmwareType": 3,
  "firmwareVersion": 11163050,
  "firmwareVersionString": "00aa55aa-0000",
  "status": "OK",
  "tfBusDevices": [
    "33000001:1e:02:01",
    "20100002:15:02:01"
  ]
}

access_control.yaml — kontrola dostępu#

Ustawienia widoczności obiektów per integracja.

Ścieżka: {cluDir}/access_control.yaml

objects:
  CLU221000290.DOU0001:
    mqtt: full
    homekit: hidden
  CLU221000290.DIMM0001:
    mqtt: readonly
    homekit: full
  CLU221000290.ROLLER0001:
    mqtt: hidden
    homekit: hidden

Poziomy dostępu#

PoziomOpis
fullWidoczny i kontrolowalny (domyślny)
readonlyStan widoczny, ale bez sterowania
hiddenObiekt nie eksponowany do integracji

Priorytet#

  1. Ręczne expose() w user.lua — najwyższy
  2. AccessControl (ten plik) — stosowany przez autoExposeRegistry
  3. autoExposeRegistry() — eksponuje resztę z domyślnymi ustawieniami

Zmiany w MQTT obowiązują natychmiast. HomeKit wymaga restartu bridge.


Typy urządzeń#

IDKategoriaPrefix SNHW TypeModuły
gateGATE52000x12Nie
cluCLU22100x13Tak

Typy modułów#

IDHW TypePrefix SNWyjściaWejściaAnalog
dout8t0x1e33008x DOUT8x DIN1x ANA
relay40x1520104x DOUT1x ANA
din80x1418108x DIN1x ANA

Przepływ konfiguracji#

ReadMasterConfig()
  → .vclu.json

PropagateConfig()
  → a/CONFIG.JSON    (format Object Manager)
  → a/config.txt     (format TFTP)
  → a/config.json    (format runtime)
  → a/main.lua       (jeśli nie istnieje)
  → a/om.lua         (jeśli nie istnieje)
  → a/user.lua       (jeśli nie istnieje)

ReadMasterConfig() zwraca (nil, nil) gdy plik nie istnieje — zawsze sprawdzaj oba warunki: err != nil || config == nil.