2019. már 02.

DIY Zigbee Bridge

írta: eNeS
DIY Zigbee Bridge

A Xiaomi tagadhatatlanul jó árú (Zigbee kompatibilis) termékekkel lepte el a piacot a közelmúltban. Bár nem vagyok az elemmel működő cuccok nagy barátja, ennek ellenére a Xiaomi ultra-mini hőmérője még engem is meggyőzött, hiszen formatervezett és kicsi.
Két hibáját találtam: az egyik, hogy nem ad magáról adott időközönként életjelet, hanem csak adott százaléknyi változáskor küld mérési eredményt, a másik, hogy kell hozzá a saját Xiaomi Gateway. Amivel nem is az ára lenne a visszatartó erő, mert nem drágább, mint egy Raspberry Pi 3, de kötelező és kikapcsolhatatlan módon Felhőn keresztül kommunikál. A blog visszatérő olvasói nyilván tisztában vannak már azzal, hogy én inkább a Felhőtlen szórakozás híve vagyok... Úgyhogy akik a Xiaomi Gateway-re, Felhőre és applikációra kíváncsiak, azok a XiaomiBlog-on olvassanak tovább, itt ilyesmiről nem lesz szó - maximum a hiányukról.

A Zigbee alapvető működését már elemezgettem a Vezeték nélküli kommunikációs formák című írásomban, és bár a Z-Wave-et több szempontból jobbnak tartom, viszont jelentősen drágább is, és mivel ennyire azért nem vagyok eleresztve anyagilag, maradok az "olcsó hús"-zigbee megoldásnál, ami persze a mesh képessége miatt még mindig valamivel üzembiztosabb a normál, WiFi-n csatlakozó eszközöknél. (habár ugyanazokat a frekvenciákat használja a Zigbee is, mint a normál WiFi)

Persze találkoztam más, bizalomgerjesztő Zigbee eszközzel is mindenfelé a neten bolyongva, így bizakodva olvastam a Zigbee2MQTT projektről, ami lehetővé teszi, hogy a gyártó Gateway-e nélkül használhassunk ilyeneket, és egyszerűen muszáj volt kipróbálnom. (e projekt létezése és népszerűsége egyben megnyugtat a felől, hogy nem csak engem zavar, hogy minden kínai lomot felhőstől akarnak letolni az ember torkán)
Azt azért tudni kell, hogy a konkurrens Z-Wave szabvánnyal szemben a Zigbee termékek nem minden esetben kompatibilisek egymással 100%-ban, érdemes nagy bevásárlás előtt tanulmányozni a támogatott eszközök listáját.

A Zigbee2MQTT segítségével Home Assistant és Domoticz rendszerbe is beilleszthetjük Zigbee eszközeinket, nézzük is hogyan.

Alapvetően nem sok tételből áll a do-it-yourself Zigbee Bridge:

  • Raspberry Pi (Zero W is elég hozzá)
  • 8GB microSD kártya
  • USB OTG kábel
  • USB CC2531 (vagy az antennával is rendelkező, kicsivel drágább, de nagyobb hatótávú CC2530)
  • 5V1A DC microUSB tápegység

zbee_test.jpg

Zigbee DIY Bridge akció közben, a teszt eszközzel együtt látható

Akinek itt már felcsillanna a szeme, hogy "csak ennyi az egész", le kell lombozzam: nem.

A CC2531 gyárilag egy Sniffer programmal érkezik, ami nem lesz jó nekünk, mivel egy Coordinator képességgel rendelkező eszköz kell ahhoz, hogy fel tudjon épülni a Zigbee Mesh hálózat. De semmi gond, ilyen firmware elérhető, letölthető és "flashelhető" rá, megfelelő eszközökkel. 

zigbee_xia.gif

Tehát a fentieken túl szükséges az alábbi két eszköz is (ezekre pontosan egy alkalommal lesz csak szükség, ha van ilyen ismeretségi körünkben, kölcsön is kérhetjük):

Eredeti leírás, képekkel:  zigbee2mqtt.io

Aki meg szeretné spórolni a fenti két eszköz árát, és van kedve bonyolítani az életét, van rá alternatív mód, egy Wemos D1 átprogramozása után azt is lehet CC debuggerként használni. Ahogy elnéztem az 1mm-es osztású programozó tűket a CC2531-en, én inkább megvettem a fenti szettet, akinek van kedve kísérletezni, a zigbee2mqtt.io oldalon leírták a szükséges lépéseket.

Ha mindezeket a tételeket összeszámoljuk, azért nem kizárt, hogy nagyobb összeg jön ki, mintha vettünk volna egy mezei Xiaomi Gatewayt, ami ékes mandarin nyelven köszöntene minket és szinte mindig működne, ha van internet kapcsolat és nincs túlterhelve a távoli szerver. Ízlés dolga. :)

No de nézzük a teendőket!

 

1. Feltelepítjük az SD kártyára a Raspbiant

2. Feltelepítjük a Domoticz-ot és a Mosquitto-t

3. Felprogramozzuk a CC2531-et

A CC Debugger, a Downloader Cable és a CC2531 Sniffer csatlakoztatása az alábbi kép szerint történjen: (a piros csík a szalagkábelen az 1-es lábat jelenti, lehetőség szerint ne kössük be fordítva...)

Kiemelném, hogy mind a programozót, mind a CC2531-et USB-n rá kell kötni a számítógépünkre a programozás idejére!

Letöltjük a megfelelő Zigbee Coordinator firmware-t innen:

https://github.com/Koenkk/Z-Stack-firmware/tree/master/coordinator/Z-Stack_Home_1.2/bin/default

Aktuális:

CC2531_DEFAULT_20190608.zip

majd kicsomagoljuk a ZIP fájlból.

A konkrét feltöltéshez kell egy alkalmazás is, Windowsra létezik hivatalos program a SmartRF Flash programmer, amit a Texas Instruments-hez beregisztrálva le is tölthet, akinek erre van igénye.

Én maradok a Linuxnál, a cc-tool teljesen alkalmas a flashelésre, az alábbi parancsokkal juthatunk ehhez könnyen, mindenféle regisztrációs plusz körök nélkül:

git clone https://github.com/dashesy/cc-tool.git
sudo apt-get install linux-headers-$(uname -r) build-essential libusb-1.0-0-dev libboost-all-dev
./bootstrap
./configure
make
sudo make install

Miután ez megvan, a korábban már letöltött és ZIP-ből kicsomagolt CC2531ZNP-Prod.hex állományt töltsük fel a alábbi paranccsal:

sudo cc-tool -e -w CC2531ZNP-Prod.hex

Erre jó esetben valami ilyesmit kell válaszul látnunk (ha valamiért nem indul meg a zöld villogó LED és nem töltődik fel a program, akkor nyomjuk meg a programozó RESET gombját, vagy csatlakoztassuk újra, győződjünk meg a kábelek helyes csatlakoztatásáról):

Programmer: CC Debugger
Target: CC2531
Erasing flash...
Completed
Writing flash (241 KB)...
Completed (17.95 s.)

Illetve ha mindkét eszközt kihúztuk, majd csak a CC2531-et visszadugtuk az USB csatlakozóba, és beütünk egy "dmesg | tail" parancsot valami ilyesmit illene látnunk:

[4301.156025] usb 2-1.5: Product: TI CC2531 USB CDC
[ 4301.156027] usb 2-1.5: Manufacturer: Texas Instruments
[ 4301.156030] usb 2-1.5: SerialNumber: __0X00124B0019369531
[ 4301.156999] cdc_acm 2-1.5:1.0: ttyACM0: USB ACM device

4. Feltelepítjük a Zigbee2MQTT-t:

Mivel a hivatalos telepítési leírás egyből olyan lépéssel kezdődik, ami ARMv6 architektúrán nem támogatott, ezért itt máris eltérünk ettől, és az alábbi módon töltjük le a NodeJS-t és egyúttal a Zigbee2MQTT-t. (persze mindig az éppen aktuális verziót, a cikk írásakor ez így működött)

wget https://nodejs.org/dist/v9.11.2/node-v9.11.2-linux-armv6l.tar.gz
tar -xzf node-v9.11.2-linux-armv6l.tar.gz
sudo cp -r node-v9.11.2-linux-armv6l/* /usr/local/
sudo apt-get install git
sudo git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
sudo chown -R pi:pi /opt/zigbee2mqtt
cd /opt/zigbee2mqtt
npm install

Ezen a ponton tarthatunk 8-10 perc kávészünetet, míg az install befejeződik. Majd nyissuk meg a konfigurációs beállításokat tartalmazó fájlt:

mcedit /opt/zigbee2mqtt/data/configuration.yaml

Aminek valami ehhez hasonló a tartalma:

homeassistant: false
permit_join: true
mqtt:
 base_topic: zigbee2mqtt
 server: 'mqtt://localhost'
serial:
 port: /dev/ttyACM0

 

Ha a fenti leírás szerint telepítettünk mindent (1 és 2. pont), akkor a "localhost" beállítás megfelelő, hiszen ugyanezen a gépen fut az MQTT bróker (mosquitto) is.. ha nem így tettünk, akkor nyilván tudjuk mit csináltunk, és be tudjuk írni a megfelelő IP címet a helyére. A "serial" beállításnál módosíthatjuk az USB-re kapcsolt CC2531 portját, amennyiben nem az alapértelmezett ttyACM0 nevet kapta, ezt a fenti dmesg parancs kimenetén egyértelműen láthatjuk. A "permit_join"-t érdemes "true"-ra állítani, amíg párosítjuk eszközeinket, majd után visszaállítani "false"-ra.

Ha sikerült mindent jól beállítanunk, akkor az alábbiak kiadása után:

cd /opt/zigbee2mqtt
npm start

Elindul a zigbee2mqtt. Gyors tesztet végeztem, megnyomtam a Xiaomi Mijia hőmérő egyetlen gombját, az elkezdte a párosítási műveletet.
No, azért nem azonnal, egy kicsit várni kellett azért:

> zigbee2mqtt@1.1.1 start /opt/zigbee2mqtt
> node index.js

zigbee2mqtt:info 2019-2-28 22:08:06 Logging to directory: '/opt/zigbee2mqtt/data/log/2019-02-28.22-08-06'
zigbee2mqtt:info 2019-2-28 22:08:10 Starting zigbee2mqtt version 1.1.1 (commit #92d88b6)
zigbee2mqtt:info 2019-2-28 22:08:10 Starting zigbee-shepherd
zigbee2mqtt:info 2019-2-28 22:08:16 zigbee-shepherd started
zigbee2mqtt:info 2019-2-28 22:08:16 Coordinator firmware version: '20190109'
zigbee2mqtt:info 2019-2-28 22:08:16 Currently 0 devices are joined:
zigbee2mqtt:warn 2019-2-28 22:08:16 `permit_join` set to `true` in configuration.yaml.
zigbee2mqtt:warn 2019-2-28 22:08:16 Allowing new devices to join.
zigbee2mqtt:warn 2019-2-28 22:08:16 Set `permit_join` to `false` once you joined all devices.
zigbee2mqtt:info 2019-2-28 22:08:16 Zigbee: allowing new devices to join.
zigbee2mqtt:info 2019-2-28 22:08:16 Connecting to MQTT server at mqtt://localhost
zigbee2mqtt:info 2019-2-28 22:08:18 zigbee-shepherd ready
zigbee2mqtt:info 2019-2-28 22:09:42 Connected to MQTT server
zigbee2mqtt:info 2019-2-28 22:09:42 MQTT publish: topic 'zigbee2mqtt/bridge/state', payload 'online'
zigbee2mqtt:info 2019-2-28 22:15:31 Connecting with device...
zigbee2mqtt:info 2019-2-28 22:15:31 MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"pairing","message":"connecting with device"}'
zigbee2mqtt:info 2019-2-28 22:15:34 Connecting with device...
zigbee2mqtt:info 2019-2-28 22:15:34 MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"pairing","message":"connecting with device"}'
zigbee2mqtt:info 2019-2-28 22:15:38 Connecting with device...
zigbee2mqtt:info 2019-2-28 22:15:38 MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"pairing","message":"connecting with device"}'
zigbee2mqtt:info 2019-2-28 22:15:38 New device with address 0x00158d0002c76eed connected!
zigbee2mqtt:info 2019-2-28 22:15:38 MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"device_connected","message":"0x00158d0002c76eed"}'
zigbee2mqtt:info 2019-2-28 22:15:38 MQTT publish: topic 'zigbee2mqtt/0x00158d0002c76eed', payload '{"temperature":25.46,"linkquality":157}'
zigbee2mqtt:info 2019-2-28 22:15:38 MQTT publish: topic 'zigbee2mqtt/0x00158d0002c76eed', payload '{"temperature":25.46,"linkquality":157,"humidity":43.71}'
zigbee2mqtt:info 2019-2-28 22:16:20 Device incoming...
zigbee2mqtt:info 2019-2-28 22:16:20 MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"pairing","message":"device incoming"}'

Ebből leszűrhető többek között az is, hogy a CC2531-re egy 2019 januári "Coordinator" firmware-t sikerült feltennem, meg azt, hogy a párosítás sikeres volt.

De ez még kevés, a Domoticz-ot ugyan feltettük, de a Domoticz-Zigbee csatoláshoz szükséges plugint még nem.

5. Feltelepítjük a Domoticz PYTHON plugint

cd ~
cd domoticz/plugins
git clone https://github.com/stas-demydiuk/domoticz-zigbee2mqtt-plugin.git zigbee2mqtt
sudo /etc/init.d/domoticz.sh restart

Miután újraindult a Domoticz, akkor a Beállítás->Hardver menüpontban immár hozzá tudjuk adni a Zigbee2MQTT típusú hardvert.

zbee_domo_hw.jpg

Amennyiben sikerrel jártunk, akkor a Beállítás->Eszközöknél megjelennek a párosított eszközök, engedélyezzük azokat, amikre szükségünk van. (egy eszköz többféle aleszközből állhat össze, elég a számunkra szükségeset engedélyezni)

zbee_domo_dev.jpg

6. A Zigbee2MQTT-t beállítjuk automatikusan induló szolgáltatásként

 

Készítsük el a szolgáltatást indító állományt:

sudo mcedit /etc/systemd/system/zigbee2mqtt.service

 Aminek a tartalma ez legyen:

[Unit]
Description=zigbee2mqtt
After=network.target

[Service]
ExecStart=/usr/local/bin/npm start
WorkingDirectory=/opt/zigbee2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

Megjegyzés: érdemes meggyőződni az npm bináris helyéről (/usr/local/bin/npm van /usr/bin/npm) különben a fenti nem fog működni.

Majd indítsuk el és engedélyezzük az automatikus indítását:

sudo systemctl start zigbee2mqtt
sudo systemctl enable zigbee2mqtt.service

 

Szólj hozzá

diy termékteszt zigbee raspberry okosotthon do-it-yourself