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側に順番に、以下のハードウェア、ソフトウェアを組み合わせます。
- USB送受信器:Zigbeeデバイスと無線送受信するUSBアダプター
- Zigbee2MQTT:Zigbeeデバイスと通信してMQTTブローカに伝えるブリッジ
- Mosquitto:MQTTのブローカー(サーバー)
- 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ÅDFRI、DIRIGERA、Philips Hueブリッジだけで、それぞれIKEAとPhilipsのZigbeeデバイスをサポートしてます。それに対して、Zigbee2MQTTのコミュニティでは、自分たちが入手したZigbee製品のデータを持ち寄って、対応デバイスを増やし続けています。なので、ある程度知られたデバイスなら、ほぼ使用可能です。AliExpressなどで売られている安価で多彩なセンサ類、スイッチ類などがほとんど利用可能です。もちろんIKEAとPhilipsのZigbee製品も使えます。メーカーにとらわれず、適材適所に合わせて好きなようにデバイスを選択できます。
Zigbee2MQTTの対応デバイスはこちらから確認できます。
HomebridgeとMosquitto
Raspberry Pi 4にインストールするモジュールのうち、以下に示したHomebridgeとMosquittoについては、
以前の記事で詳しく説明してあります。
Zigbee2MQTTにはMQTTブローカーが必須なので、Mosquittoについては簡単に説明しておきます。
こちらの書いた手順で、MQTTブローカであるMosquittoをインストールします。基本的には、aptコマンドでインストールするだけです。
sudo apt install mosquitto mosquitto-clients
また、OS起動時に自動的にMQTTブローカが立ち上がるように以下の設定をしました。
sudo systemctl enable mosquitto.service
以下では、
- USBトランシーバ、
- Zigbee2MQTT、
- Homebridgeプラグイン
について、詳しく説明します。
なお、Zigbee2MQTTに関しては、プロジェクトのホームページに詳細な情報があります。これを参考にしました。
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社チップを使った新製品があり、名前が紛らわしくて注意が必要です。詳細はこちらをご覧ください。
これらの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マシンにインストールするには、以下の公式ページのガイドが参考になります。
それに従って、以下のシェルコマンドを順番に発行すれば良いです。
# 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と接続するプラグイン🧩として、こちら
で紹介したmqttthingを使うことも可能です。ただ、Zigbee2MQTTが出すMQTTメッセージに特化したプラグインがあるので、それを使ったほうが楽です。Homebridge z2mというプラグインです。これは、Mqttthingを元に、Zigbee2MQTT向けに機能拡張されたプラグインです。
このプラグインの設定項目はほとんどありません。上で設定したMQTTブローカーのアドレスやbase topicなどを設定するだけです。他は全部未設定でokです。あとはZigbee2MQTTが検出したデバイスが自動的にHomeKitアクセサリとして現れるようになります。
場合によっては、mqttthingとm2zプラグインを使い分けると便利なこともあります。詳しくは以下をご覧ください。
HomeKitで使える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と共通なので、低電力で応答の良いという特長は引き継がれると思います。
コメント
初めまして、こんばんは
このHPを発見出来たことに感動しております。
Homebridgeでここまでできるとは、脱帽です。
zigbeeの接続とても興味が湧き私もAliExpressでドングルを購入しました。
まだ、届いてはいないですがこのページを参考にして
Apple home.appを充実させたいと思います。
これからの更新楽しみに拝見させていただきます。
ありがとうございます。励みになります