コモノポリタン

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

【Home AssistantでDIY Smart Home】zigbeeデバイスを活用せよ!センサーエリア拡大

【Home Assistant(Hass.io)】
zigbee2mqttにルーターを追加してエリア拡大!

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

 zigbee2mqttを導入し、調子に乗って窓センサーやライトセンサー、動体センサーなどをドンドン登録してきました。しかしドキュメントを読んでみるとCC2531はあまり沢山のデバイスを登録できない様子。窓1つに2個もデバイスを登録しなければならないので、なんとかより多くのデバイスを登録できるようにしたいところです。

 zigbeeセンサーネットワークには、中心となるZigbee Coordinator(ZC、コーディネーター)、センサーデバイスであるZigbee End Device(ZED、zigbee(エンド)デバイス)、それと中継点であるZigbee Router(ZR、ルーター)の3種類のデバイスが存在します。前回CC2531+Raspberry Pi Zeroで構築したのがコーディネーターでした。

 そのCC2531への接続数が20個もしくは15個で制限されるのだろうか?という話があって、それはzigbee2mqttのFAQ「I read that Zigbee2MQTT has a limit of 20 devices (when using a CC2531), is this true?」で一応の回答が出ています。まあ「制限ある?」という質問に対しては回答としてはイマイチよろしくないのですが、読み取ると「一つのデバイスとしては制限ある」でも「ルーターでネットワーク拡張できるので実質的には制限ない!」と言っているようです。

  • CC2531で作ったコーディネーターは、20個まで接続可能
    (ただし例示の中では15個制約があるように見える…)
  • CC2531で作ったルーターは、21個まで接続可能
  • ルーターもコーディネーターの接続数を消費

 ということで、今回はセンサーネットワークのカバー範囲を広げる≒接続できるデバイス数を増やす目的でルーターを構築します。

この記事の前提条件
Home Assistant 2021.3.2
HassOS 5.12
Server Raspberry Pi 4(2GB)

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

1. 準備

f:id:maky_Ba:20210313235406j:plain:w200:left Zigbee USB Adapter (CC2531 アンテナ付き)
Wireless USB Zigbee Snifferです。今回もちゃんとアンテナ付きのを選びました。
価格:AliExpressで前と同じ店で買いましたが倍近く値上がり。前回が特価?基盤サイズも違う…。送料込みだと200円ぐらいの差ですが。
f:id:maky_Ba:20210313235709j:plain:w200:left CC2531 アンテナ付き用ケース
基盤剥き身で運用するのはアレなので、3Dプリンタでガワをつくりました。青味がかっているように見えますが、グレーです。
f:id:maky_Ba:20210314105729j:plain:w200:left 電源:(適当な)USB ACアダプター
正確な電力消費量は不明ですが、USB規格(5V500mA)で十分そうです。ESP32の時はコストコで買ったコンセント直刺しのものを使いましたが、今回はOHM社「USBポート付安全タップ(HS-TA2U2-W)」を使ってみました。1,000円ぐらいかな。

2. CC2531ルーター構築

 コーディネーターはzigbeeセンサーネットワークとほかのネットワーク(Wifiとか)の橋渡しをしなければなりませんのでRaspberry Piの様なマイクロコントローラが必要ですが、ルーターは単にEnd Device(センサーデバイス)とコーディネーターを繋いで信号(情報)を中継すれば良いだけなのです。つまりRaspbeerry Piなどは不要でUSBアダプタと電源があれば十分です。zigbee USBアダプターの設定を進めましょう。

2.1. ルーターカスタムファームウェア導入

 前回コーディネーターを構築した時はZC用ファームウェアをUSBアダプタに導入しました。今回ルーターファームウェアの書き込む手順は前回の下記の記事と同じです。 maky-ba.hatenablog.com

 違いはファームウェアです。下記のサイトからCC2531_router_2020_09_29.zipをダウンロードし展開して、router-cc2531-std.hexをUSBアダプタに書き込みます。
github.com 以上!

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

 コーディネーター側のconfiguration.yamlpermit_join: trueが設定されていれば、ルーターの電源を入れたときにペアリングされるはずです。ルーターの状態はアダプタの基板上のLEDの光り方でわかります。

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

もしタイミングが合わなかったりして時々赤く点滅する正常状態にならなかった場合には、再度ペアリングします。SW2ボタン(LEDの近く)を5秒ほど押します。そうすると初期化され再度ペアリングが走ります。

f:id:maky_Ba:20210314111404j:plain:h250
 設置イメージはこんな感じですね。白のケースがよかったかな、でもアンテナもL字USBアダプタ(向き変換)も黒なのでこれでも良いかもしれませんね。

3. zigbee networkmapの表示

 注:どうやら最近はちゃんと動かないかも。少なくとも私の環境ではうまく動かなくなりました。 (2021/12/3追記)

 新しいデバイスを登録しても見た目上は、Raspberry Pi上に導入したzigbee2mqttにどんどん情報が格納されるだけなので本当にルーターが機能しているかちょっと心配になります。
そこで本当にツリー上のzigbeeセンサーネットワークが出来ているのかこの目で確認するために、Home AssistantのLovelace UI上でzigbeeセンサーネットワークでのデバイスの接続状況を図で見えるようしたいと思います。使うのは下記のCustom Cardです。
github.com

3.1. Home Assistantのconfiguration.yaml設定

まずはzigbee2mqttからの情報をnetworkmapで扱えるようにconfiguration.yamlにsensorの設定をします。

(前略)
sensor:
(中略)
  - platform: mqtt
    name: Zigbee2mqtt Networkmap
    state_topic: zigbee2mqtt/bridge/networkmap/raw
    value_template: >-
      {{ now().strftime('%Y-%m-%d %H:%M:%S') }}
    json_attributes_topic: zigbee2mqtt/bridge/networkmap/raw
(後略)

3.2. zigbee netowrkmapカスタムカードの.jsファイルの格納

 まず Releasesから最新のzigbee2mqtt-networkmap.jsをダウンロードして、wwwフォルダの下に格納します。(wwwフォルダは 【Home Assistant(Hass.io)でホームオートメーション】NFCタグで機器管理 - コモノポリタンで作ったかと思います)

3.3. カスタムカードをLovelace UIで使えるようにする

 「設定」の中で「Lovelaceダッシュボード」を選びます。「リソース」タブで右下の「リソースを追加」ボタンをクリックします。
f:id:maky_Ba:20210109162738j:plain:w240 f:id:maky_Ba:20210109162807j:plain:w240

 下記「新しいリソースを追加」ポップアップ画面でURLを設定します。

  • URL: /local/zigbee2mqtt-networkmap.js
  • リソースの種類: JavaScriptモジュール

f:id:maky_Ba:20210313230910j:plain:w400

3.4. zigbee networkmapの表示(Lovelace UI)

「状態」画面の右上で「ダッシュボードの編集」を選びLovelace UIの設定画面に入ります。マップは大きく表示したいので、「ビューの追加」(右下の+アイコン)でビューを作ります。ビューの名前設定と忘れずに「パネルモード」をonにしておきます。
f:id:maky_Ba:20210313232307j:plain:h150 f:id:maky_Ba:20210313232344j:plain:h150
 次に右下の「カードを追加」ボタンをクリックして、一番下の「マニュアル」を選びます(下の左側)。 ビジュアルエディタは使えないので、yamlを手でガシガシ記述してゆきます。
f:id:maky_Ba:20210109165030j:plain:w300

type: 'custom:zigbee2mqtt-networkmap'
entity: sensor.zigbee2mqtt_networkmap
mqtt_base_topic: zigbee2mqtt
force: 3000
node_size: 16
font_size: 12
link_width: 2
height: 400
css: |
  :host {
    --zigbee2mqtt-networkmap-node-color: rgba(18, 120, 98, .7);
    --zigbee2mqtt-networkmap-node-fill-color: #dcfaf3;
    --zigbee2mqtt-networkmap-node-pinned-color: rgba(190, 56, 93, .6);
    --zigbee2mqtt-networkmap-link-color: rgba(18, 120, 98, .5);
    --zigbee2mqtt-networkmap-hover-color: #be385d;
    --zigbee2mqtt-networkmap-link-selected-color: rgba(202, 164, 85, .6);
    --zigbee2mqtt-networkmap-label-color: #127862;
    --zigbee2mqtt-networkmap-arrow-color: rgba(18, 120, 98, 0.7);
    --zigbee2mqtt-networkmap-node-coordinator-color: rgba(224, 78, 93, .7);
    --zigbee2mqtt-networkmap-node-router-color: rgba(0, 165, 255, .7);
  }

 出来上がりはこんな感じですね。
f:id:maky_Ba:20210314114344j:plain:w300
 マウスの先が今回追加したルーターです。無事ルーター経由でデバイスが繋がっていますね。ノード間の信号強度?*1も表示されているの「あ、ここちょっと遠いのかな」なんて事もわかります。
 また、重なって見にくいところはノードをマウスで掴んでぐりぐり動かすことができます。特段意味はありませんが、びにょ~んとリアルタイムで動いて面白いです。

4. おわりに

 無事ルーターが追加されたので下記の計算で、現在合計35デバイスが接続できるようになりました。

 これでしばらくは大丈夫かな。

maky-ba.hatenablog.com

*1:Home Assistantに表示されるzigbeeバイスのLink Qualityとはちょっと違う(傾向は一緒)のでLQではないのかもしれませんが…