コモノポリタン

コモノ、デジモノが好きなKomonopolitan住民 (はてなダイアリーからの引っ越しです)

【Home AssistantでDIY Smart Home】zigbee2mqtt再導入!

【Home Assistant(Hass.io)】
zigbee2mqttアドオンに入れ替える

「Home Assistant(Hass.io)でホームオートメーション 再起動!」シリーズです。

 zigbee2mqttを独立インストールしていたのをHome Assistantのアドオン版に入れ替えてみました。きっかけは、そう新しいXiaomi door&windowセンサーの購入でした。話せば長い物語、です。

 ということで、奮闘記兼再設定時の備忘録として、ここに記録を残します。

この記事の前提条件
Home Assistant core 2021.11.5
Home Assistant OS 6.6
Server Raspberry Pi 4(2GB)

 上記バージョンを前提とした手順です。 (最新版では動かないこともあるかもしれませんが、私が使っている限り、備忘録を兼ねて最新化してゆきたいとは思っています)

0. 経緯(懺悔?)

 きっかけとなった事件は、家じゅうの窓にセンサーを貼り付けたので念のため予備機を購入しようといつものaliexpressで発注したところから発生しました。いままでと同じ店から購入したのに、なんと届いたのは、MCCGQ11LMではなくて MCCGQ14LMが届いたのです。サイトには「MCCGQ11LM」ですと書いてあるのですが、どうやら後継機がMCCGQ14LMで私が注文したタイミングでは一斉に切り替わっている模様。MCCGQ14LMで検索すると各地で阿鼻叫喚の状況が展開している様子でした(おおげさ?)。
(その後、騒動は落ちつたらしく、MCCGQ14LMは「Aqara door windows sensor E1」として別扱いされているようです。bluetooth版のドア窓センサーに引き続き、ついうっかりを時々やります)
 この型番はzigbee2mqttの「サポートされているデバイス」記載がないので、そのままでは接続できそうにありません。さてどうしたものか…。実際つないでみても「サポートされないよん」と冷たいログが流れます。

 ううむ。ここから格闘が始まりました。調べたところzigbee2mqttのコーディネーターのファームウェアを入れ替えれば使えるらしいということで、まずは入れ変えてみました。(注意:よっぽどのことがないかぎり、ファームの入れ替えはお勧めしません。私は夜中でよく考えないで入れ変えちゃいました…)
 当然のようにすべてのzigbeeバイスが一旦接続解除されました。頑張って再接続(ペアリングボタンを押しに家じゅうを駆け巡るということ)しましたが、なな、なんとXiaomiのライトセンサーがどうあっても再接続できません。

 これまた調べたところ、channelを11から15に変えると良いらしいということで、channelを変更してzigbee2mqttを再起動。(注:channelの変更はよっぽどの事が無い限りお勧めしません。私は夜中によく考えずに変更してしまいました)
 再び当然のようにすべてのzigbeeバイスが一旦接続解除されました。また家じゅうを巡るのか、と混乱した私の頭は「どうせならzigbee2mqttを入れ替えてみようか。最近network mapが見えなくなっていたし」とか謎の回路が接続されてしまいました。

 教訓:設定作業は昼間、落ち着いた気持ちの時にやりましょう!

ということで(どういうことだ?)イチからzigbee2mqttアドオンを設定してゆきましょう!

出来上がりの構成はこうなるハズ。少しすっきり。
f:id:maky_Ba:20211205141856j:plain:w400

以前設定した時(「zigbeeデバイスを活用せよ!基本+ドア編」)はこう↓でした。
https://cdn-ak.f.st-hatena.com/images/fotolife/m/maky_Ba/20210105/20210105011114.png

1. 準備

f:id:maky_Ba:20201228222611j:plain:w200:left Zigbee USB Adapter (CC2531 アンテナ付き)
Wireless USB Zigbee Snifferです。基板アンテナ版は接続いまいちなのでコレを。でもこれzigbee2mqttでは今や"Not Recommended"に。でも使えます。
価格:AliExpressで送料込で約1000円。
f:id:maky_Ba:20201228223422j:plain:w200:left CC Debugger
このデバッガーと下のケーブルを組み合わせて使います。CC2531はFirmwareを書き換えないと使えません。このあたりも"Not recommended"の理由のようですが大した手間ではありません。
価格:AliExpressで700円弱で買いました。
f:id:maky_Ba:20201228223745j:plain:w200:left CC2531 Download Cable
CC2531のFirmwareを書き換えるために、上のデバッガーと組み合わせて使います。
価格:AliExpressで150円ぐらいで買いました。
f:id:maky_Ba:20211205142744j:plain:w200:left CC2531 アンテナ付き用ケース
基盤剥き身で運用するのはアレなので、3Dプリンタでガワ(筒? ?)をつくりました。SW2を押す穴を開けておいたので、ケースに入れたままペアリング可。
(新しいフィラメントの設定がつまっていないので、バリとか目立ちますね。やすりがけしないと)
f:id:maky_Ba:20210314105729j:plain:w200:left USBアダプタ用電源
写真はOHM社「USBポート付安全タップ(HS-TA2U2-W)」ですが、USB規格(5V500mA)で十分そうなので、なんでもよし。CC2351USBアダプタの正確な電力消費量は不明ですが…。以前ESP32で使ったコンセント兼USBアダプタも活用してます。

2. zigbee2mqttのセットアップ

 zigbee2mqttのサイトが一新されました。まあ中身はあまり変わらないのですが、情報にアクセスしやすくなりました。こういったアクティブなサイトは良いですね、使ってゆこうという気になります。
 さて基本的には下記のページの "Get started"ボタンを押して"Getting Started"ページに従って進めてゆきます。 www.zigbee2mqtt.io

2.1. Zigbee USBアダプター(コーディネイター(Coordinator))の設定

2.1.1. Zigbeeアダプター(コーディネイター)用ファームウェアの導入

"Getting Started”(さあはじめましょう)ページの"Prerequisites"(前提条件)には次に三つのハードウェアが必要と書いてあります。

  1. Zigbeeアダプター:"See supported Adapters."のリンク先に使えるアダプタがずらっと並んでいます。ただし最新のアダプタは日本からは入手しにくそう。私は上にも書いた非推奨アダプタ”Texas Instruments CC2531"を使います。非推奨の理由が「書き込み用の器材必要」「接続範囲が狭い」「デバイスを沢山ぶらさげられない」というもの。確かに機材は必要ですがそれほど高くないし、手間もそれほどではない。2番目と3番目はルーターを設置すればとりあえず解決できます。
  2. サーバー:今回はHome Assistantのアドオンをインストールするので、不要というかHome Assistantサーバーで兼用です。
  3. zigbeeバイス:一つ以上のデバイスが必要、ってまあそれが目的ですから。今や我が家には50以上のデバイスが…。

 まずはZigbeeアダプタ(コーディネイター(Coordinator))が無ければ始まりませんので、それを設定してゆきます。Zigbee USB Adapter(CC2531)を使うには、前述の通り書き込み用の機材を使ってファームウェアを変更してあげる必要があります。基本は下記の通りです。 www.zigbee2mqtt.io

 注1:上記ページのNote 1には「今まで使っていたらファームを書き換えても再設定は必要ありません」とあります。が、必ずしもそうならない、再設定が必要な時もあると思っておいた方が良いでしょう。やられた!
 注2:Note 2には「20個以上のデバイスを使う場合は、"Source routing firmware"を使いなさい」とありますので、以下では"Source routing firmware"を使う前提で進めます*1

  Windowsでのやり方を下記にメモしておきます。

  1. SmartRF Flash programmer( -2 / V2じゃないほう)」をダウンロードしてインストールします。
    まずTI(Texus Instruments)のアカウントであるmyTIアカウントを作ることを求められます。日本語でページを表示することも可能なので難しくないでしょう。
  2. 次にCC debugger driver をインストールします。
    ダウンロードしたzipファイルを展開してインストールします。CC DebuggerのUSBケーブルをPCに挿してみてしばらく待ってから、Windowsバイスマネージャで[Cable control devices] - [CC Debugger]が表示されていたら良し!ですが、[不明なデバイス]やら何や違う名前でビックリマークとかついていたら右クリックで「デバイスの更新」を選び、ダウンロードしたファイルの中のドライバ(win_32bit_x86もしくはwin_64bit_x64フォルダ、Windowsに合わせて選んでくださいね)のドライバを指定してインストールし直してください。
  3. CC DebuggerとZigbee USBアダプターを10ピンのフラットケーブルでつないで(写真のように1と基板上にシルク印刷されているところに赤い線が来るように接続)、両方をUSBをPCに繋ぎ、デバッガーのResetrボタンを押します。うまくいけばデバッガーのLEDが緑色に光るはずです。
    f:id:maky_Ba:20201230211419j:plain:w300
    (なんかごちゃごちゃしていてすみません…)

  4. Help request for new device Xiaomi Aqara E1 door & window contact sensor のディスカッションの中でMCCGQ14LMに対応したファームの話が出ていました。12月のzigbee2mqttリリースで正式サイトの方で更新されたので、Coordinator Firmwareリンク先の「source_routing」フォルダの中のCC2531_SOURCE_ROUTING_20211116.zipをダウンロードして解凍しておきます。

  5. Flash Programmerを起動して、Flash Imageに先ほど展開したファイルを指定して、下の方の「Perform action」ボタンをクリックします。OKとなったら良し。
    f:id:maky_Ba:20201230212052j:plain:w300

2.1.2. Zigbee USBアダプターの接続状況の確認

 ファームウェアを入れ替えたUSBアダプタを稼働中の(Home Assistantを実行中の)Raspberry Pi 4Bに接続します。電波の飛びがイマイチと言われるTexas InstrumentsのアダプターなのでUBS延長ケーブルでラズパイとアダプタを離した方が良いと思います。
 次にZigbee2mqttアドオンの設定に記述するためにUSBがどこに刺さっているかを調べます。左側のサイドバーで「Supervisor」画面を開き「システム」タブを開きます。Hostパネルの右下の3つ点でHardwareを選びます。
f:id:maky_Ba:20211128115857j:plain:w400
/dev/ttyACM0Zigbee USBアダプターが刺さっているということがわかります。

【少しクラシックなやり方】
 一応GUIではなくCUIでのやり方も載せておきます。Terminalアドオンで下記コマンドを実行します。

$ ls -l /dev/serial/by-id
total 0
lrwxrwxrwx. 1 root root 13 Nov 23 22:51 usb-Texas_Instruments_TI_CC2531_USB_CDC___0X00124B00xxxxxxxx-if00 -> ../../ttyACM0

このやり方でも、/dev/ttyACM0にUSBが刺さっているということがわかります。

2.2. MQTT Broker(Mosquitto broker)アドオン

2.2.1. Mosquitto brokerアドオンのインストール

 アドオンストアから「Mosquitto broker」を探してインストールする。「設定」タブで下記のようにlogins:(username, password)を記載する。SAVEして「情報」タブに戻って開始する。

logins:
  - username: mqtt  ←自分用に設定してくださいね
    password: mqtt  ←自分用に設定してくださいね
anonymous: false
customize:
  active: false
  folder: mosquitto
certfile: fullchain.pem
keyfile: privkey.pem
require_certificate: false

 「ログ」タブで開始時のメッセージを確認する。WARNINGぐらいは見逃してもERRORとか出てたら設定を再確認します。

2.2.2. HAインテグレーションの設定

 左側のサイドバー「設定」→「インテグレーション」を確認すると「MQTT」が既に発見されています(されていなければ再起動すれば見つかるはずと思います)。MQTTインテグレーションの「構成」ボタンをクリックすると「MQTT Broker via Hass.io add-on」メッセージ画面が出るので、「Enable discovery」がチェックされていることを確認の上「送信」(submitボタンですね…)を押します。

f:id:maky_Ba:20210101221717j:plain:w400 f:id:maky_Ba:20210101222128j:plain:w400
(画面はもしかしたら古いかも…)

2.3. Zigbee2mqttアドオン

2.3.1. Zigbee2mqttアドオンインストール

 前はRaspberry Pi ZeroWにzigbee2mqttをインストールしましたが、今回はHome Assistantのアドオンをインストールします。基本的には下記のアドオンインストールの手順通り。 github.com

 左側のサイドバーの「Supervisor」を選んで「アドオンストア」を開いて右の三つ点から「リポジトリ」を選んでhttps://github.com/zigbee2mqtt/hassio-zigbee2mqttを設定します。アドオンストアにZigbee2mqttアドオンが表示されるので、それをインストールします。
f:id:maky_Ba:20211127214728j:plain:w350

2.3.2. Zigbee2mqttアドオンの設定

 「0. 経緯(懺悔?)」に書きましたが、Xiaomi lightセンサー(GZCGQ01LM)とうまくペアリングできないのもこのゴタゴタの一部で、下記にはよるとchannelを11から15に変更するうまくゆく、みたいなことが書いてありました。ほんと? 他に悪影響無い?
issueexplorer.com

 このゴタゴタの最中に何度も導入したりして試してみました。なんとなくそうかな、と思えるの程度ですし、結局channel 11でも登録できたので採用に値せず!が私の結論です。

 ちなみにこのXaomi lightセンサーですが、最初から登録できるなら最初の方に登録した方がスムーズな感じです。登録済み機器が増えるたびに登録が難しくなってゆきます。
 そもそもスマートシーリングライトに組み込んだ時も反応が10秒ほど遅れたりするので、のんきに信号をやりとりしているから登録も難しいのかな、って勝手に思っていましたが、逆にどうやらコイツは信号を頻繁にやり取りしようとしているようです。登録機器が少ないときはほぼリアルタイムで光量の変化を送ってきます。機器が増えてくるとどうも他に邪魔されてうまくハンドシェイクできない感があります。それは登録にも影響しているのでは、と推測。登録が中途半端になって測定結果が送られていない場合は対処は後程(「4.2. Xiaomiライトセンサーから信号が来ない時」)記述します。

 アドオン設定タブを下記の様に記述してアドオンを起動します。

data_path: /config/zigbee2mqtt
external_converters: []
devices: devices.yaml
groups: groups.yaml
homeassistant: true
permit_join: false
mqtt:
  base_topic: zigbee2mqtt
serial:
  port: /dev/ttyACM0   ←ここに 2.2.2.の情報を入れる
advanced:
  log_level: warn
  pan_id: 6754
  channel: 11   ←(Xiaomi Lightセンサーの為にここをchannel:11⇒15へ変更という情報も)
  network_key:
  availability_blocklist: []
  availability_passlist: []
device_options: {}
blocklist: []
passlist: []
queue: {}
frontend:
  port: 8099
experimental: {}
availability: false
socat:
  enabled: false
(以下略)

 うまくいけばログにはエラーが出ず、「情報」タブは下記の様な感じになります。
f:id:maky_Ba:20211127221526j:plain:w400

 Zigbee2mqttのWebUIはこんな感じ。
f:id:maky_Ba:20211127222730j:plain:w400
(赤枠のところは後段で使うデバイスを追加可能にするボタン)

2.4. Zigbee USBアダプター(ルーター(Router))の追加

 zigbeeバイスを登録したい!という、はやる気持ちを抑えて、まずはルーターを設置してゆきましょう。
 2.1でラズパイに接続したコーディネーターはzigbeeセンサーネットワークとHome Assistantとの橋渡しをする必要があるので、HAサーバにつないだり、単体のRaspberry Piにつないだりする(これは前回)必要があります。
 一方、ルーターは単にEnd Device(センサーデバイス)とコーディネーターを繋いで信号(情報)を中継すれば良いだけなのです。つまりRaspbeerry Piなどは不要でzigbee USBアダプタとそれを動かす電源があれば十分です。ということで、淡々とzigbee USBアダプターの設定を進めましょう。

2.4.1. USBアダプター(ルーター)用ファームウェアの導入

 ルーターファームウェアの書き込む手順は上記のコーディネイター(Coordinator)と同じです。 違いはファームウェアです。下記のサイトからCC2531_router_2020_09_29.zipをダウンロードし展開して、router-cc2531-std.hexをUSBアダプタに書き込みます。 github.com

2.4.2. ルーターをペアリング

 ルーターもコーディネーターから見ればzigbeeバイスの一つとして見えます。まず左側のサイドバーから「Zigbee2mqtt」画面(Web UI)に入ってペアリングします。右上の「Permit join (All)」をクリックすると下記の様に255秒のカウントダウン付きでペアリング可能状態に入ります。 f:id:maky_Ba:20211128013436j:plain:w400

 今までは端末からちまちまコマンドを打っていましたが、UIだけでペアリングが出来るようなりました。アドオン素晴らしい。しかも一定時間が経過すると自動的にペアリング不可になりセキュリティも向上!
 ルータのZigbeeUSBアダプタの電源を入れ(USB電源につなぎ)、基板上SW2ボタン(LEDの近く)を5秒ほど押すとペアリングモードに入ります。ルーターの状態はアダプタの基板上のLEDの光り方でわかります。

  • 赤色で1秒に1回の点滅: ルーターはネットワークに接続中です。接続出来たら1回緑色に点滅します
  • 赤色で4秒に1回の点滅: ルーターはコーディネーターに接続され正常に稼働中
  • 赤色で短い点滅: ルーターはコーディネーターに情報が遅れない状態

のんびり赤点滅が通常状態です。

f:id:maky_Ba:20211205144315j:plain:h250
 ルーターの設置イメージはこんな感じですね。ちなみに以前の記事で「白かグレーかでどっちがいいかな」なんてコメントした方のルーターは結局テレビの裏のコンセントに挿しているの、白だろうがグレーだろうが関係ありませんでした…。ま、そんなものです。

 画面上ではこんな感じで表示されます。
f:id:maky_Ba:20211127230907j:plain:w400
 必要な数だけルーターの追加を繰り返します。

3. デバイスの接続手順

 Xiaomiドア&窓センサーを接続してみます。

3.1. Zigbee2mqttアドオンでデバイスのペアリング

f:id:maky_Ba:20210110202122j:plain:w300
 Xiaomi Aqara Door Window Sensorのペアリング方法は下記ページにあります。 www.zigbee2mqtt.io

 ルーターをペアリングした時と同じように、「Permit join (All)」ボタンを押してサーバー側をペアリングモードに入れた後で、窓&ドアセンサーの短辺の側面にあるリセットボタンを5秒押すと青色ランプが点滅してペアリングモードになります。ボタンを離すと短くチカチカして、すぐにzigbee2mqttとペアリングされます。
 ボタンをホールド(3~5秒) ⇒ LED青点滅 ⇒ ボタンを離すと消灯 ⇒ 短く3回点滅
これがペアリングに成功するときの流れです。ルーターに既に機器が沢山登録されている(コーディネーター、ルーターを含むzigbeeバイス21個が最大らしい)と最後の3回点滅が1回点滅になります。その場合はペアリング失敗です。

 ペアリングされると下記の様にZigbee2mqttのWebUIでデバイスが見えるようになります。 f:id:maky_Ba:20211128014337j:plain:w400

3.2. エンティティID/Friendly Nameを変える

 ペアリングした初期状態では、Home AssistantのエンティティIDもFriendly Name(これはHAとzigbee2mqtt共用の設定)のどちらもIEEE Address(下の図参照)になります。さすがに分かり難いので変更しておきましょう。
 Friendly Nameをクリックするとデバイスの個別画面が開きます。その下の方に「編集」アイコン(青地にペン)があるのでクリック。
f:id:maky_Ba:20211128014955j:plain:w400
 Friendly Nameを適当に(例えば、xiaomi_door-window_15)に設定し「Update Home Assistant entity ID」のトグルをOnにすると、設定したFriendly nameをHome Assistant側のエンティティIDにも反映してくれます。便利。
f:id:maky_Ba:20211205184415j:plain:w400

 きちんとペアリング出来ているかは、デバイス個別画面の「Exposes」タブを見て、いろいろな属性情報が見えるようになっていれば大丈夫です。
f:id:maky_Ba:20211128020602j:plain:w400

 (Xiaomiライトセンサーはこれが上手くいかないんです。ペアリングを何回もやり直して、気が付いたらペアリングしていた、というのが本音。手順化はまだできず、です。ドア&窓センサーはその点良い子です。)

4. その他

4.1. zigbeeネットワーク図

 デバイスがどのルーター経由で接続しているか、接続が切れているかなどの状況を一発で把握するにはzigbeeネットワーク図が便利です。以前導入したネットワーク図は今はどうもちゃんと動かない様子です。それも今回の騒動の一端ではあります。
 zigbee2mqttアドオンならzigbeeネットワーク図を見るのも簡単。Zigbee2mqtt WebUIで、上に並んでいるタブの「Map」をクリックするだけ。
f:id:maky_Ba:20211204022958j:plain:w400
 わー、たくさんだ!たんぽぽみたいだ、たいへんだー(棒読み)

4.2. Xiaomiライトセンサーから信号が来ない時

 下記にずばり「GZCGQ01LM not working(GZCGQ01LM(ライトセンサー)が動かない」というのがあります。

issueexplorer.com
おお、ロシア語?*2 まあ同じ画面を下に貼っておきます。
 zigbee2mqttアドオンの「Devicies」タブの中から目的のXiaomiライトセンサーを選び、デバイス画面の「Reporting」タブで、一度報告対象を削除(右側の赤の「Disable」ボタン)して、再度同じ設定で適用(右側の青色の「Apply」ボタン)すれば報告再開するようです。
f:id:maky_Ba:20211205093016j:plain:w400

5. おわりに

 なんとかzigbeeバイス系の復旧完了。ライトセンサーの反応復活(外壁につけたやつとか)とか反応向上とか、いろいろ良くなりました!
 ただ「一つ直るとひとつ悪くなる」の法則で昨日からBluetooth LEでつながっているOMRONの環境センサーからの情報が取れなくなっている(断続的だったり、ごそっとだったり)!
f:id:maky_Ba:20211205183112j:plain:w250
 あぁぁ、てんてこまいだ…。
 BLEレシーバーにしているRasperry Pi ZeroWHの問題か? それともデータ書き込み先のInfluxDBサーバーの問題か? Home Assistant ServerのMQTTアドオンがちゃんと受信していないのか? 疑わしい所満載だ。
 今回zigbee2mqttサーバーを一つ廃止してHome Assistantサーバーに統合して管理先を一つ減らしましたが、メンテナンスフリーのスマートホームはまだ遠い。頑張ります!!

maky-ba.hatenablog.com

*1:そもそもCC2531以外のUSBアダプタを手に入れれば劇的に接続数が改善するって言われているのですが、なかなか見つからず。

*2:大学での第二外国語がロシア語でしたが歯が立たず。ま、二語なんてそんなものですよね。