HomeKitでZigbeeを使う:Zigbee2MQTTを導入する

Apple対応品を使う

Zigbee2MQTTは、ZigbeeデバイスとMQTTブローカーをブリッジするプログラムです。Zigbeeデバイスと情報交換し、その情報をMQTTに橋渡します。Zigbeeデバイス製品を使用するためには、一般には各社の専用ブリッジ製品が必要です。でもZigbee2MQTTを導入すれば、専用ブリッジ製品を使う必要がなくなります。今回は、Zigbee機器をHomeKitから使えるようにするため、Zigbee2MQTTをRaspberry Pi 4にインストールします。

ZigbeeデバイスをHomeKitで使う2通りの方法

Zigbeeデバイスは省電力で応答も速く、メッシュも構成することから、スマートホームに欠かせません。AmazonやAliExpressでは、お値打ちなZigbeeデバイスが豊富に揃ってます。国内製品でもZigbeeは使用されています。国内で簡単に入手できて、HomeKitでも使えるZigbee製品としては、Philips HueまたはIKEAの製品があります。

専用ブリッジを使う

Zigbee接続デバイスをLAN側から使う第一の方法は、それぞれの会社が提供するブリッジを買うことです。ブリッジという名前以外に、ハブとかゲートウェイという製品名で呼ばれることもあります。Zigbeeブリッジは、Zigbee無線ネットワークとLANを接続します。さらに、LAN側で必要とされるプロトコルに、Zigbee側の情報を橋渡しします。

例えばIKEAとPhilipsのZigbeeブリッジは、LAN側がHomeKitプロトコルに対応していて、ZigbeeプロトコルとHomeKit Accessory Protocol (HAP) の相互変換をしてくれます。これによりHomeKitからZigbeeデバイスが使えるようになります。こんな順番の接続です。

[Hue/Ikeaのデバイス]--(Zigbee)--[Hue/Ikeaのブリッジ]--(HAP)--[HomeKit]

Zigbeeブリッジの接続や設定は簡単です。しかし、ブリッジはその会社のZigbee製品に特化されてますので、デバイスメーカーそれぞれのブリッジを揃える必要があります。

Zigbee2MQTTを使う

2番目の方法は、メーカが提供しているZigbeeブリッジを利用せずに、Zigbee2MQTT、MQTT、Homebridgeを使う方法です。これにより、ZigbeeプロトコルをMQTTにブリッジし、次にMQTTをHAPにブリッジします。

(Zigbee)--[Zigbee2MQTT]--(MQTT)--[Homebridge]--(HAP)

ここでは、これらをRaspberry Pi 4にインストールします。Raspberry PiにはZigbee無線を送受信する機能はありませんので、USB接続のZigbeeアダプタも使用します。さらには、HomebridgeをMQTTに対応させるためのプラグインも導入します。その結果、以下の構成になります。

左側のZigbeeデバイス側から、右側のHomeKit側に順番に、以下のハードウェア、ソフトウェアを組み合わせます。

  1. USB送受信器:Zigbeeデバイスと無線送受信するUSBアダプター
  2. Zigbee2MQTT:Zigbeeデバイスと通信してMQTTブローカに伝えるブリッジ
  3. Mosquitto:MQTTのブローカー(サーバー)
  4. Homebridgeとプラグイン:MQTT経由でZigbee2MQTTとやりとりするプラグイン

1, 2, 3までのユニットは、Home AssistantでZigbeeデバイスを制御する場合にも使われるものです。また、2, 3, 4の部分は、Windows、macOS、NASなどでも動かせますが、通常はLinux系のサーバーで動かします。処理能力も要求されないので、Raspberry Piがよく使われます。

Zigbee2MQTTを使う理由

上で述べたように、メーカーが用意してくれるブリッジを買えば、ZigbeeデバイスをHomeKitから使えます。しかし、一つのメーカーのブリッジは、その会社のZigbeeデバイスにしか対応しません。

一方、Zigbee2MQTTを設定する場合は、いろいろ揃えてインストールする手間が面倒です。でも、一旦設定すれば、多数のメーカのZigbeeデバイスに対応します。

国内で買えるHomeKit対応Zigbeeブリッジは、IKEAのTRÅDFRIDIRIGERAPhilips Hueブリッジだけで、それぞれIKEAとPhilipsのZigbeeデバイスをサポートしてます。それに対して、Zigbee2MQTTのコミュニティでは、自分たちが入手したZigbee製品のデータを持ち寄って、対応デバイスを増やし続けています。なので、ある程度知られたデバイスなら、ほぼ使用可能です。AliExpressなどで売られている安価で多彩なセンサ類、スイッチ類などがほとんど利用可能です。もちろんIKEAとPhilipsのZigbee製品も使えます。メーカーにとらわれず、適材適所に合わせて好きなようにデバイスを選択できます。

Zigbee2MQTTの対応デバイスはこちらから確認できます

HomebridgeとMosquitto

Raspberry Pi 4にインストールするモジュールのうち、以下に示したHomebridgeとMosquittoについては、

以前の記事で詳しく説明してあります。

Homebridgeをインストールする
HomebridgeはApple HomeKitのためのブリッジソフトウェアです。サーバーとして動かしておけば、HomeKit非対応のデバイスを、HomeKitアクセサリとして利用することができます。自作のデバイスや、GoogleやAmaz...
MQTTブローカーMosquittoを設置する
今回はMQTTブローカーをインストールします。MQTTがあると、スイッチ、センサ、リレー、サーボモータなどを接続したArduinoのようなコンピュータを、ネットワーク越しにIP接続したい時にとても便利です。また、MQTTを使うスマートホーム...

Zigbee2MQTTにはMQTTブローカーが必須なので、Mosquittoについては簡単に説明しておきます。

こちらの書いた手順で、MQTTブローカであるMosquittoをインストールします。基本的には、aptコマンドでインストールするだけです。

sudo apt install mosquitto mosquitto-clients

また、OS起動時に自動的にMQTTブローカが立ち上がるように以下の設定をしました。

sudo systemctl enable mosquitto.service

以下では、

  • USBトランシーバ、
  • Zigbee2MQTT、
  • Homebridgeプラグイン

について、詳しく説明します。

なお、Zigbee2MQTTに関しては、プロジェクトのホームページに詳細な情報があります。これを参考にしました。

Home | Zigbee2MQTT
Zigbee to MQTT bridge, get rid of your proprietary Zigbee bridges

USBトランシーバ

WiFi, BLEはどのスマホにもPCにも(Raspberry Pi 4にも)搭載されていますが、Zigbeeは搭載されてません。なので、Zigbee電波を送受信するアダプターが必要です。ただそのアダプタも、WiFiやBLEのように豊富には出回ってません。

Zigbee2MQTTで使えるおすすめアダプターはこちらで紹介されてます。それによるとTexas Instruments社のCC2652というチップを使用した製品が推奨されてます。実際に購入して、Raspberry PiやUbuntuマシンのUSBポートに挿すだけで、Zigbee2MQTTで使えた製品を2種類ご紹介します。

一つは、こちらの製品です。CC2652Pの方を買いましたが、CC2652Rでも動くのではと思います。検索してみたらPとRの違いはGPIOの数が違うくらいのようです。Zigbee2MQTT対応と書かれてます。

もう一つは、こちらのSonoffの製品です。上の製品よりも造りがしっかりしていて、価格も安くおすすめです。

ただし、Sonoff社には、別のSilicon Labs社チップを使った新製品があり、名前が紛らわしくて注意が必要です。詳細はこちらをご覧ください。

Z2M推奨Zigbee USBアダプタ
Zigbee2MQTT (Z2M) で使うZigbee USB アダプタ(トランシーバ)のお勧めはSnoffのZigbee 3.0 USB Dongle Plus ZBDongle-Pです。似た型番の製品にZigbee 3.0 USB Do...

これらのUSBトランシーバを、Raspberry PiやLinuxマシンのUSBポートに差し込むと認識されます。手元のRaspberry Pi 4でlsusbコマンドを発行すると、こんなふうに見えました。

$ lsusb
Bus 001 Device 003: ID 1a86:7523 QinHeng Electronics CH340 serial converter

シリアル変換のチップが入っているのでそれが認識されてます。シリアルチップは、特別にドライバをインストールしなくても、そのまま/dev/tty*に見えました。

$ ls /dev/tty*
/dev/tty    /dev/tty0  /dev/tty1  (略)  /dev/ttyUSB0

今まで使ったところでは、/dev/ttyUSB0もしくは/dev/ttyACM0という名前で現れることが多いです。macOSでもこの名前で現れました。USBトランシーバーを抜き差しすると、消えたり出現したりしますので、その挙動でも確認できます。この名前はZigbee2MQTTの設定で必要なので、メモしておきます。

Zigbee2MQTTをインストール

ではいよいよ、Zigbee2MQTTを公式ページの手順に従ってインストールします。色々なハードウェアにインストール可能ですが、Raspberry PiやLinuxマシンにインストールするには、以下の公式ページのガイドが参考になります。

Linux | Zigbee2MQTT
Zigbee to MQTT bridge, get rid of your proprietary Zigbee bridges

それに従って、以下のシェルコマンドを順番に発行すれば良いです。

# nodejsなどをインストールします。すでに入っているかもしれません。
# 公式ガイドのページではapt-getを使ってますが、aptに統一したいと思っているのでaptでインストールしました
sudo curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install -y nodejs git make g++ gcc
# nodeとnpmのバージョンを確認します
node --version  # 結果は v14.X, V16.x, V17.x, V18.Xであること
npm --version  # 結果は 6.X, 7.X or 8.Xであること
# zigbee2mqtt用のディレクトリを作ります
sudo mkdir /opt/zigbee2mqtt
sudo chown -R ${USER}: /opt/zigbee2mqtt
# Zigbee2MQTT リポジトリをクローンします(よくわかってないです)
git clone --depth 1 https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
# ディペンデンシーをインストールします(同上)
cd /opt/zigbee2mqtt
npm ci

これでエラーらしい表示が出なければokです。

次に設定ファイルを用意します。/opt/zigbee2mqtt/data/configuration.yamlにあるテキストファイルです。公式ページの設定例は以下です。

# MQTTの設定
mqtt:
# MQTT base topic、なんでも良いです
base_topic: zigbee2mqtt
# MQTT server URL、ブローカーのアドレスです
server: 'mqtt://localhost'
# MQTT のユーザ、パスワードを設定している場合は以下を記入
# user: my_user
# password: my_password
# Serial の設定
serial:
# USBトランシーバの接続場所です。今までの経験ではttyUSB0かttyACM0です。
port: /dev/ttyUSB0
# 以下の設定はおすすめらしいです
advanced:
network_key: GENERATE
# 以下を指定しておくとwebから操作できます。とても簡単なのでお勧めです
frontend: true

Zigbee2MQTTを起動する

起動させるには、

cd /opt/zigbee2mqtt
npm start

とします。いろいろメッセージが出ますが、エラーらしきものが出なければ成功です。止めるにはコントロールCを押します。

このコマンドで起動すると、自動起動などが面倒なので、systemctlを使います。まずは、/etc/systemd/system/zigbee2mqtt.serviceというファイルを作って、内容を、

[Unit]
Description=zigbee2mqtt
After=network.target
[Service]
ExecStart=/usr/bin/npm start
WorkingDirectory=/opt/zigbee2mqtt
StandardOutput=null
StandardError=inherit
Restart=always
RestartSec=10s
User=pi
[Install]
WantedBy=multi-user.target

とします。この例ではユーザ名piで起動することになってますので、別のユーザを使う場合は書き換えます。これで、

sudo systemctl enable zigbee2mqtt.service

とすれば、以後、自動的に起動します。とりあえず起動しておきたいので、

sudo systemctl start zigbee2mqtt.service

としておきます。startの代わりに、stop, restart, statusなどのコマンドが使えます。

プラグインを入れる

ここまでの作業で、必要なモジュールのほとんどが用意できました。欠けているのは、MosquittoとHomebridgeを結ぶパズルピース🧩の部分です。

Zigbee2MQTTは結果をMosquittoにパブリッシュします。HomebridgeはMosquittoとやりとりすれば、その結果が得られます。Mosquittoと接続するプラグイン🧩として、こちら

公衆MQTTサーバでLチカする
スイッチやセンサの状態や、リレーやサーボモータの制御コマンドを送受信する目的で、MQTT (Message Queueing Telemetry Transport)というプロトコルが使われます。MQTTは、Home AssistantやH...

で紹介したmqttthingを使うことも可能です。ただ、Zigbee2MQTTが出すMQTTメッセージに特化したプラグインがあるので、それを使ったほうが楽です。Homebridge z2mというプラグインです。これは、Mqttthingを元に、Zigbee2MQTT向けに機能拡張されたプラグインです。

homebridge-z2m
Expose your Zigbee devices to HomeKit with ease, by integrating 🐝 Zigbee2MQTT with 🏠 Homebridge.

このプラグインの設定項目はほとんどありません。上で設定したMQTTブローカーのアドレスやbase topicなどを設定するだけです。他は全部未設定でokです。あとはZigbee2MQTTが検出したデバイスが自動的にHomeKitアクセサリとして現れるようになります。

場合によっては、mqttthingとm2zプラグインを使い分けると便利なこともあります。詳しくは以下をご覧ください。

MqttthingとZigbee2MQTTプラグインを使い分ける
Homebridgeのプラグインは多数用意されていますが、手元の環境で一番活躍しているのは、 Homebridge MQTT-Thing (以下mqttthingプラグイン) と Homebridge Zigbee2MQTT (以下z2mプ...

HomeKitで使えるZigbeeデバイスの話題に関しては以下をご覧ください。

Zigbee
Zigbeeを使ったデバイスとその設定

MQTTで動作確認・設定する

Zigbee2MQTTは、MQTT経由で、いろいろな機能を提供しています。たとえば動作のすべての情報が、MQTTに流されているので、これをmosquitto_subコマンドでサブスクライブすれば確認できます。

mosquitto_sub -h localhost -t zigbee2mqtt/# -v

これにより、Zigbeeデバイスをペアリングする場合、Zigbeeスイッチをon/offする場合など、その都度メッセージが表示されるので、動作確認ができます。

Zigbee2MQTTに対する命令も、mosquitto_pubで指示できます。たとえば、とあるidのZigbeeデバイスのペアリングを外したい場合は、以下のようにします。

mosquitto_pub -h localhost -t zigbee2mqtt/bridge/request/device/remove -m '{"id":"0x9999999999999999"}'

ただ、次に説明するwebインタフェースの方が簡単です。MQTT経由での確認や操作は、あまり必要ないかもしれません。

Web UIで設定する

先のconfiguration.yamlファイルでfrontend: trueと設定しました。この設定により、webからの操作が可能になってます。デフォルトではポートが8080です。Webブラウザから、Zigbee2MQTTが稼働しているIPアドレスを指定して、例えば、http://pi4.local:8080/とかhttp://192.168.xxx.xxx:8080/などでアクセスします。するとZigbee2MQTTの動作確認、操作のためのページが以下のように表示されます。

いろいろな機能がありますが、GUIなので、操作を試して理解できます。

たとえば、上で、MQTT経由で試みたデバイス削除操作は、この画面のゴミ箱ボタンから可能です。ゴミ箱ボタンを押すと、下のようなダイアログパネルが出ます。

オプションのスイッチ、Force removeとBlock from joining againは重要です。まず、Zigbee2MQTTでのデバイス削除操作は、デフォルトでは、デバイスが接続している時のみ可能です。接続していないデバイスも、強制的にペアリング解消するスイッチがForce removeです。Force removeしても、またそのデバイスからの電波が届くと、通常はペアリング再開します。それも阻止するのがBlock from joining againボタンです。これらのスイッチを使ってペアリング解除したデバイスは、デバイスをリセットする操作(ボタンを長押しするとか、何回かon/offを繰り返すなど)をして、ペアリングモードに戻してから、他のシステムで再利用することになります。

また、右上のPermit join (All)のメニューは、ペアリングを開始するメニューです。先のconfiguration.yamlで、permit_join: trueという指定をすると、Zigbee2MQTTが常時ペアリングする設定になります。デフォルトではpermit_join: falseで、ペアリングしません。それを一時的にペアリング可能状態にするのがこのメニューです。クリックすると5分間有効になります。その状態で、ペアリングモードにしたデバイスを近づければ、ペアリングされます。

Dashboardメニューを選べば、それぞれのデバイスの状態を見て、操作が可能です。

また、Mapメニューを使うとデバイスの接続状態を見ることができます。

この例では、デバイスが少なく、end deviceしかありません。routerになるデバイスがあるとZigbeeのメッシュ接続の様子がわかって面白いです。電球などの消費電力に制約のないデバイスが電波を中継するルータになってくれます。

Zigbee2MQTTを更新する

対応するZigbee製品は増え続けているので、時々アップデートしたいところです。手順は公式ページのここに書いてあります。それによると、

/opt/zigbee2mqtt に update.sh というスクリプトがあるのでそれを実行すれば良いようです。

cd /opt/zigbee2mqtt
./update.sh

以下は、古い情報です。

対応するZigbee製品は増え続けているので、時々アップデートしたいところです。手順は公式ページのここに書いてあります。

# Zigbee2MQTTを停止する
sudo systemctl stop zigbee2mqtt
cd /opt/zigbee2mqtt
# 設定情報をバックアップする
cp -R data data-backup
# 更新する
git pull
npm ci
# 設定情報を復帰する
cp -R data-backup/* data
rm -rf data-backup
# Zigbee2MQTTを始動する
sudo systemctl start zigbee2mqtt

data以下をバックアップしておけば、ペアリング情報や設定状態は保存しておけるようです。

Zigbee無線のノイズ対策

2.4GHz帯のZigbee無線は、USB3.0からのノイズにも影響されやすいです。USB3.0を搭載しているRaspberry Piでは特に注意が必要です。その場合、Zigbee無線アダプタを、延長ケーブルを使ってRaspberry Piから離すことで、ノイズの影響を軽減できます。以下の動画は、延長ケーブルでRaspberry Pi 4搭載USB3.0のノイズを除去してます。

この動画のように、USB延長ケーブルを使って、コンピュータ本体から離した場所にZigbeeアダプタを置くと良いでしょう。50cmくらいでも効果はあります。

延長ケーブルだけでは不安定な場合、こんなUSBスタンドを使うと安定します。長いアンテナが付いているZigbeeアダプタを、安定した位置で設置できます。

まとめ

Zigbee2MQTTを使って、市販のZigbeeデバイスをHomeKitから使うための設定手順をまとめました。これで、市販されている大半のZigbee対応製品を、HomeKitから使用できるようになります。

Zigbeeは、WiFiと比較すると省電力にもかかわらず、メッシュネットワークを構成するので、広い範囲をカバーできます。BLEも似た特徴を持ちますが、安定性や応答速度などでZigbeeの方が優れているような印象があります。これからはZigbeeはThreadに移行していくらしいですが、物理層・データリンク層はZigbeeと共通なので、低電力で応答の良いという特長は引き継がれると思います。

コメント

  1. ひろし より:

    初めまして、こんばんは
    このHPを発見出来たことに感動しております。
    Homebridgeでここまでできるとは、脱帽です。
    zigbeeの接続とても興味が湧き私もAliExpressでドングルを購入しました。

    まだ、届いてはいないですがこのページを参考にして
    Apple home.appを充実させたいと思います。

    これからの更新楽しみに拝見させていただきます。

タイトルとURLをコピーしました