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#
| Co | Przykład | Cena orientacyjna |
|---|---|---|
| Koordynator Zigbee USB | SONOFF Zigbee 3.0 USB Dongle Plus (wersja „P”, układ TI) | ok. 100 zł |
| Czujnik | SONOFF SNZB-02D (temperatura, wilgotność, wyświetlacz) | ok. 40 zł |
| Broker MQTT | Mosquitto (ten, z którego już korzysta vCLU) | 0 zł |
| Komputer na Zigbee2MQTT | ten sam Raspberry Pi co vCLU albo inny Linux | masz 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/ttyUSB0Konfiguracja 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: GENERATEJeś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#
- Otwórz panel
http://<adres>:8080i kliknij Permit join (All). - Na czujniku przytrzymaj przycisk przez około 5 sekund, aż mrugnie ikona sieci.
- Po kilkunastu sekundach czujnik pojawi się w panelu jako
0x0cef…. - Zmień mu nazwę na
salon_czujnik. Od teraz jego temat MQTT tozigbee2mqtt/salon_czujnik.

- 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:

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.