Tani czujnik Zigbee w Grentonie, HomeKit i Home Assistant#

Czujnik temperatury i wilgotności za około 40 zł, bez kabla i bez klikania w Object Managerze. Zigbee2MQTT rozmawia z czujnikiem, vCLU zamienia go w zwykły obiekt i wystawia do Apple Home i Home Assistant. Całość to kilkanaście linii Lua, które może napisać za Ciebie agent AI.


Co zbudujemy#

  • Zigbee2MQTT z koordynatorem USB, podłączony do tego samego brokera MQTT co vCLU
  • czujnik SONOFF SNZB-02D sparowany i nazwany po ludzku (salon_czujnik)
  • w vCLU obiekty: temperatura, wilgotność, bateria
  • temperatura i wilgotność w Apple Home i Home Assistant, w pokoju „Salon”

Czego potrzebujesz#

CoPrzykładCena orientacyjna
Koordynator Zigbee USBSONOFF Zigbee 3.0 USB Dongle Plus (wersja „P”, układ TI)ok. 100 zł
CzujnikSONOFF SNZB-02D (temperatura, wilgotność, wyświetlacz)ok. 40 zł
Broker MQTTMosquitto (ten, z którego już korzysta vCLU)0 zł
Komputer na Zigbee2MQTTten sam Raspberry Pi co vCLU albo inny Linuxmasz już

Zigbee2MQTT potrzebuje około 100–150 MB RAM. Zmieści się obok vCLU nawet na małym Raspberry Pi.


Krok 1: Zigbee2MQTT#

Zigbee2MQTT to osobna, darmowa aplikacja. Rozmawia z urządzeniami Zigbee przez koordynator USB i publikuje ich odczyty w MQTT, np. zigbee2mqtt/salon_czujnik → {"temperature": 24.5, "humidity": 53.9, "battery": 60}. Zna kilka tysięcy modeli urządzeń, dlatego vCLU nie obsługuje Zigbee sam, tylko korzysta z niej.

Najprościej uruchomić ją w Dockerze:

# docker-compose.yml
services:
  zigbee2mqtt:
    image: koenkk/zigbee2mqtt
    restart: unless-stopped
    volumes:
      - ./zigbee2mqtt-data:/app/data
    ports:
      - "8080:8080"           # panel WWW
    devices:
      - /dev/serial/by-id/usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_XXXX-if00-port0:/dev/ttyUSB0

Konfiguracja w zigbee2mqtt-data/configuration.yaml:

version: 4
mqtt:
  base_topic: zigbee2mqtt
  server: mqtt://192.168.1.50:1883     # broker, z którego korzysta vCLU
  user: zigbee2mqtt
  password: "!secret.yaml password"   # hasło w osobnym pliku secret.yaml
serial:
  port: /dev/ttyUSB0
  adapter: zstack                      # dongle „P” (TI); dla „E” (Silicon Labs): ember
frontend:
  enabled: true
  port: 8080
  auth_token: "!secret.yaml frontend_token"   # hasło do panelu
homeassistant:
  enabled: false                       # urządzenia do HA wystawi vCLU
advanced:
  network_key: GENERATE
  pan_id: GENERATE
  ext_pan_id: GENERATE

Jeśli broker wymaga logowania, załóż dla Zigbee2MQTT osobnego użytkownika (np. mosquitto_passwd), zamiast używać hasła vCLU czy Home Assistant.

Na Proxmoxie wygodnie jest postawić Zigbee2MQTT w małym kontenerze LXC (384 MB RAM) i przekazać do niego tylko port USB koordynatora.

Krok 2: parowanie czujnika#

  1. Otwórz panel http://<adres>:8080 i kliknij Permit join (All).
  2. Na czujniku przytrzymaj przycisk przez około 5 sekund, aż mrugnie ikona sieci.
  3. Po kilkunastu sekundach czujnik pojawi się w panelu jako 0x0cef….
  4. Zmień mu nazwę na salon_czujnik. Od teraz jego temat MQTT to zigbee2mqtt/salon_czujnik.

Czujnik salon_czujnik w panelu Zigbee2MQTT

  1. W ustawieniach urządzenia włącz retain. Broker zapamięta ostatni odczyt, więc vCLU po restarcie pokaże temperaturę od razu, a nie dopiero po kolejnym raporcie czujnika.

Krok 3: czujnik w vCLU#

vCLU łączy się z brokerem przez klienta MQTT (panel → Integracje → MQTT → Klient). Wystarczy moduł, który słucha tematu czujnika i przepisuje odczyty do obiektów:

-- modules/zigbee/salon_czujnik.lua
local TOPIC = "zigbee2mqtt/salon_czujnik"

local temp = VirtualNumber:new("zigbee_salon_temperatura", { unit = "°C" })
local wilg = VirtualNumber:new("zigbee_salon_wilgotnosc",  { unit = "%" })
local bat  = VirtualNumber:new("zigbee_salon_bateria",     { unit = "%" })

expose(temp, "temperature", { path = "zigbee.salon.temperatura", name = "Temperatura", area = "Salon" })
expose(wilg, "humidity",    { path = "zigbee.salon.wilgotnosc",  name = "Wilgotność",  area = "Salon" })
expose(bat,  "sensor",      { path = "zigbee.salon.bateria",     name = "Bateria czujnika", area = "Salon",
                              homekit = false })

local function r1(x) return math.floor(x * 10 + 0.5) / 10 end

MQTT:subscribe(TOPIC, function(topic, payload)
    local ok, d = pcall(JSON.decode, payload)
    if not ok or type(d) ~= "table" then return end
    if type(d.temperature) == "number" then temp:setValue(r1(d.temperature)) end
    if type(d.humidity) == "number" then wilg:setValue(r1(d.humidity)) end
    if type(d.battery) == "number" then bat:setValue(math.floor(d.battery + 0.5)) end
end)

Moduł z podkatalogu ładujemy w modules/init.lua:

require("zigbee/salon_czujnik")

expose() wystawia obiekty do Home Assistant i Apple Home. Bateria trafia tylko do Home Assistant (homekit = false), bo w Apple Home byłaby osobnym kafelkiem bez znaczenia na co dzień.

Albo: niech zrobi to agent#

Jeśli masz podłączonego agenta (Claude Code, Codex, inny) przez MCP, wystarczy napisać:

Dodaj czujnik z zigbee2mqtt/salon_czujnik jako temperaturę i wilgotność w salonie, wystaw do HomeKit i Home Assistant.

Agent użyje vclu_mqtt_discover, żeby zobaczyć, co czujnik wysyła, napisze moduł, sprawdzi go w sandboxie (bez wpływu na dom) i dopiero wtedy wdroży.

Sprawdzenie#

  • vCLU: panel → Urządzenia, szukaj zigbee.salon (wartości pojawią się po pierwszym odczycie)
  • Home Assistant: encje „Temperatura” i „Wilgotność” w obszarze Salon
  • Apple Home: czujniki w pokoju Salon (jeśli pokój się nie zgadza, przenieś je raz w aplikacji Dom)

Odczyty z czujnika możesz też pokazać na dashboardzie vCLU, obok czujników z Grentona:

Dashboard temperatur z czujnikiem Zigbee obok czujników Grentona

Co dalej#

Ten sam schemat działa dla czujników otwarcia, ruchu, zalania czy gniazdek Zigbee: temat zigbee2mqtt/<nazwa>, kilka linii Lua i expose(). Czujka zalania pod zmywarką może od razu uruchamiać automatykę w Grentonie, np. zamknąć elektrozawór.