コモノポリタン

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

【Home AssistantでDIY Smart Home】zigbeeデバイスを活用せよ!基本+ドア編(Door&Windowセンサー)

【Home Assistant(Hass.io)】
基本のzigbee2mqttの導入とzigbeeバイス(Door&Windowセンサー)の接続

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

 昨年末で一通り温湿度計が使えるようになりました。(まだまだ温湿度計の在庫はありますが)各部屋の温度、3Dプリンター周りなど様々なところの温度、湿度が測れています*1。さて次は何に取り組みましょうか…
 むむむ…このコロナ禍で在宅勤務が多いとは言え外出時の戸締りは以前から気になっていたところなので、ドアとか窓が閉まっていることを確認できるようにする、というのはどうでしょうか*2

 ドアとか窓につけるセンサーなので電源をUSBから取るとかは不可! つまりは電池で持ちが良いのが必須条件。低消費電力のTWELiteあたりを使って作ろうかと画策しておりました*3。が、結構手間は掛かりそうなので絶賛放置中でした。そんな中、最近愛用(?)しているXiaomiのAqaraデバイスの中に「Door & Window Sensor」なるものがあるのを発見! 磁石とリードスイッチを使った1chの開閉センサーです。AliExpressあたりだと1個千円程度ですし、電池駆動で結構持ちも良さそうです。しかしながらこれはXiaomiの他の温湿度計たちとは違ってBluetooth LE接続ではないので以前作ったESPHomeでは接続できません。
 ということで、やや泥縄的ではありますが、Xiaomi Aqara Door & Window Sensorの通信方式であるzigbee*4に対応した接続ポイントを作ります。zigbeeバイスとHome Assistantを繋ぐ方法として、中継点としてzigbee2mqttを使うやり方があります。

f:id:maky_Ba:20210105011114p:plain

こんな感じでしょうか。

(2012/12/05 追記:zigbee2mqttをアドオンで導入する方法を下記に記しました。) maky-ba.hatenablog.com

この記事の前提条件
Home Assistant 2021.1.0※
HassOS 5.10
Server Raspberry Pi 4(2GB)

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

1. 準備

f:id:maky_Ba:20201228222611j:plain:w200:left Zigbee USB Adapter (CC2531 アンテナ付き)
Wireless USB Zigbee Snifferです。PCB(基板上)アンテナのものもありましたが、デバイスとの接続性が良いかもという期待でアンテナ付きを選びました。
価格:AliExpressで500円ちょいで買いました。
f:id:maky_Ba:20201228223422j:plain:w200:left CC Debugger
CC2531はFirmwareを書き換えないとzigbee2mqttでは使えないそうです。このデバッガーと下のダウンロードケーブルを組み合わせて使います。
価格:AliExpressで700円弱で買いました。
f:id:maky_Ba:20201228223745j:plain:w200:left CC2531 Download Cable
CC2531のFirmwareを書き換えるために、上のデバッガーと組み合わせて使います。
価格:AliExpressで150円ぐらいで買いました。
f:id:maky_Ba:20201228224012j:plain:w200:left Raspberry Pi Zero W/WH
USBを挿す本体。今回はRaspberry Pi 3/4ではなくちっこい方のZeroでいきます。写真はWですがヘッダピンのあるのWHでも同じ。あ、写真撮り忘れましたがmicro USBのACアダプタも必要ですよ。
価格:秋月電子とかマルツとかでもケース付きで3000円しないと思います。
f:id:maky_Ba:20201228224353j:plain:w200:left L字コネクタUSB変換ケーブル
Raspberry Pi本体はmicro USBの口で、ZigbeeアダプタはふつーのUSBですので繋ぐケーブルが必要です。
価格:このELECOMのやつは700円弱でしょうか。Amazonでもその半額ぐらいのもありますが…
f:id:maky_Ba:20201228224745j:plain:w200:left Xiaomi Aqara Door & Window Sensor
これが今回接続したいzigbeeセンサー (MCCGQ11LM)。磁石とリードセンサーで出来ていてドアや窓につけて開閉を検知します。ちっこいです。これを改造して電池駆動の2値センサーとして活用している人が結構いますね。
価格:AliExpressで4個とかまとめて買うと1個900円ぐらいかな。

2. zigbee2mqttのセットアップ

 基本的には下記のページの "Getting started"に従って進めてゆきます。 www.zigbee2mqtt.io

2.1. Custom Firmware書き込み

 Zigbee USB Adapter(CC2531)をzigbee2mqttで使うにはFirmwareを書き換える必要がありますが、そのやり方は下記のリンクの通りです。
Zigbee2MQTT
 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. Z-Stack_Home_1.2のdefaultファーム置き場にあるファームウェアCC2531_DEFAULT_20190608.zipをダウンロードして解凍しておきます。
  5. Flash Programmerを起動して、Flash Imageに先ほど展開したファイルを指定して、下の方の「Perform action」ボタンをクリックします。OKとなったら良し。
    f:id:maky_Ba:20201230212052j:plain:w300

2.2 zigbee2mqttのインストール

2.3.1. Raspberry Pi Zero W/WHにRaspiOSの導入

 Raspberry PiのソフトウェアダウンロードのページからRaspiOSをダウンロードして、Raspberry Pi Zero Wに導入します。最近のやり方だとRaspberry Pi ImagerからOSイメージをダウンロードしてSDカードへ焼き付け、というのが標準でしょうか。私はまだ古いやり方(Etcherから焼く)を使っていますが…。piユーザへのパスワード設定など一通り(パスワード設定、WiFissh, Timezone, Localeぐらいかな)設定しておきます。

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

 USBアダプタをRaspberry Pi Zero Wに接続して電源を入れます。ssh接続して下記コマンドを実行します。

$ ls -l /dev/serial/by-id
合計 0
lrwxrwxrwx. 1 root root 13 12月 13 22:33 usb-Texas_Instruments_TI_CC2531_USB_CDC___0X00124B0014D94AA5-if00 -> ../../ttyACM0

上記では、/dev/ttyACM0にUSBが刺さっているということがわかります。

2.3.3. zigbee2mqttのインストール

 これも基本的にはRunning Zigbee2mqtt - 2.Installingの通りですね。ただし、Rapberry Pi Zero WはARMv6ベースなので、他(Raspberry Pi 3/4)のは違いARMv7/ARMv8ベースではありません。したがってzigbee2mqttのページのように進めようと思っても、まず最初のNode.jsのインストールから躓きます。まあ対策があってリンク先の言う通り進めるだけですが…

$ wget -O - https://raw.githubusercontent.com/sdesalas/node-pi-zero/master/install-node-v.last.sh | bash
$ sudo apt-get install -y git make g++ gcc

 これでNode.jsとnpmとgitが入ったはず(特にgitの時はなんしか色々言われるが気にしない)なので、下記のコマンドでバージョンを確認のこと。

$ node --version
v11.15.0   # たぶんzero Wでは多分v11がコンパイルされている最新版の様子
$ npm --version
6.7.8      # v6.xならよし

 zigbee2mqttのリポジトリをcloneしておく。

$ sudo git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
$ sudo chown -R pi:pi /opt/zigbee2mqtt

 zigbee2mqttが依存しているものをインストールします。gyp info okと出たらまあ、大丈夫でしょう。

cd /opt/zigbee2mqtt
npm ci --production
(中略)
gyp info ok
added XXX packages in XXX.XXX s

2.3.4. zigbee2mqtt初期設定

 まず設定ファイル/opt/zigbee2mqtt/data/configuration.yamlを編集します。server, user, password, advancedあたりを設定します。

homeassistant: true
# MQTT settings
mqtt:
  # MQTT base topic for Zigbee2MQTT MQTT messages
  base_topic: zigbee2mqtt
  # MQTT server URL
  server: 'mqtt://192.168.XX.XX:1883'
  # MQTT server authentication, uncomment if required:
  user: mqtt
  password: mqtt
advanced:
  network_key: GENERATE

 configuration.yamlを保存して、下記のように一度zigbee2mqttを立ち上げてみます。

$ cd /opt/zigbee2mqtt
$ npm start

 Zigbee2MQTT:infoとかZigbee2MQTT:warnとかしか出なければOKでしょう。Errとか言われたら設定ファイルをもう一度見直してみましょう。初回設定時にconfiguration.yamlファイルにpermit_join: trueやserialなどが追加されます。permi_joinがtrueでないとデバイスのペアリングができません。逆にfaleseにしておけば余計な接続はなされなくなります。英文メッセージにもありましたが、デバイスをすべて繋ぎ終えたら、falseにしておきましょう。

 次に一々起動するのは面倒なので、zigbee2mqttをシステムサービスとして自動的に実行するようにサービス登録します。まずはサービス設定ファイル(.service)を作成し編集します。

$ sudo nano /etc/systemd/system/zigbee2mqtt.service
[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

(npmの置き場が、Raspberry Pi Zeroと他の3/4とでは違うので気を付ける事。上記はzero用です)
 次の様にしてserviceをスタートさせてみます。

$ sudo systemctl start zigbee2mqtt
$ systemctl status zigbee2mqtt.service
● zigbee2mqtt.service - zigbee2mqtt
   Loaded: loaded (中略)
   Active: active (running) ・・・(以下略)

 上のように「running」となっていれば、まあサービスの起動はうまくいっているでしょう。うまくいっていたら、このサービスをRaspberry Pi起動時に自動的に起動するための呪文を唱えておきます。

$ sudo systemctl enable zigbee2mqtt.service

(心配なら再起動後に上記の systemctl status zigbee2mqtt.serviceでrunningになっているか確認してください)

# Zigbee2MQTTの停止
sudo systemctl stop zigbee2mqtt

# Zigbee2MQTTの開始
sudo systemctl start zigbee2mqtt

# Zigbee2MQTTのログを見る
sudo journalctl -u zigbee2mqtt.service -f

3. Home Assistant側の設定

3.1. MQTT Broker Add-on (Mosquitto broker) の導入

 Add-on Storeから「Mosquitto broker」を探してインストールする。Configurationタブで下記のようにlogins:(username, password)を記載する。SAVEしてinfoタブに戻ってSTARTする。

logins:
  - username: mqtt
    password: mqtt
anonymous: false
customize:
  active: false
  folder: mosquitto
certfile: fullchain.pem
keyfile: privkey.pem
require_certificate: false

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

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

 「設定」→「インテグレーション」を確認すると「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

4. zigbeeバイス(Xiaomi Aqara Window Door Sensor)を接続

4.1. zigbee2mqtt側でのデバイスの接続

f:id:maky_Ba:20210110202122j:plain:w300

 Xiaomi Aqara Door Window Sensorのペアリング方法は下記ページにあります。 www.zigbee2mqtt.io  センサーの短辺の側面にあるリセットボタンを5秒(3秒ぐらいかな)押すと青色ランプが点滅してペアリングモードになります。すぐにzigbee2mqttとペアリングされます。zigbee2mqttサービスのログを表示させてペアリングされているか確認します。

$ sudo journalctl -u zigbee2mqtt.service -f
(略)
Zigbee2QTT:info 2021-01-01 21:17:13:  Successfully interviewed '0x00158d000xxxxxx', device has successfully been paired
Zigbee2QTT:info 2021-01-01 21:17:13:  Device '0x00158d000xxxxxx' is supported, identified as : Xiaomi Aqara door & windows contact sensor (MCCGQ11LM)

 successfully been pairedって出ていればペアリング完了です。Device '0x00158d000xxxxxx'の囲まれた所が、デバイスID(device_id)になります。configration.yamlの最後のほうに自動的にデバイスが登録されているはずです。

(前略)
devices:
  '0x00158d000xxxxxx':
    friendly_name:  '0x00158d000xxxxxx'

 この状態では、デバイス名(friendly_name)も同じく0x00158d000xxxxxxになっています。これはあんまりなのでもう少しわかりやすい名前を付けましょう。

(前略)
devices:
  '0x00158d000xxxxxx':
    friendly_name: xiaomi_door-window_01

 上で設定したzigbee2mqttサービスを停止→起動してconfiguration.yamlファイルを読み込みます。

4.2. HomeAssistant側で自動デバイス発見・読み込みの確認

 まず念のためですが、「設定」→「サーバーコントロール」の中の「設定の再読込:ロケーションとカスタマイズの再読込」を実行してzigbee2mqtt側の変更を反映させておきます。
 次に「設定」→「インテグレーション」のMQTTのところ(赤枠)を確認すると「1デバイスそして3エントリー」と表示されています。これはZigbeeバイスを1つ発見した状態です。

f:id:maky_Ba:20210101232512j:plain:w300

 「3エントリー」の所をクリックすると「battery(電池残量)」と「contact(開閉)」と「linkquality(電波強度)」の3つが自動的に登録されていることがわかります。

f:id:maky_Ba:20210110165541j:plain:w300

 これらエントリーを「状態」のところのカードに登録すれば値を確認できるようになります。
f:id:maky_Ba:20210110165953j:plain:w300

 メインはやはり「contact」です。trueCLOSE(=閉(画面では「閉鎖」))、falseOPEN(「開」(画面では「開放」 )ってちょっと不思議な気もしますが、contact=接触なので接触しているの状態が正trueで良いのだと思います。
 linkqualityはzigbeeの無線接続強度を示していて、20以下だとちょっと弱すぎ(遠すぎ)ということのようです。

(うっかり自動発見から漏れた場合対処法)

 最初にzigbee2mqttとデバイスがペアリングされたときに、"paired"というメッセージがパブリッシュされます。それを読み込んでHome Assistantはデバイスを自動登録します。が、タイミング悪く(Home Assistantが立ち上がっていない時とか)pairedのメッセージをHAが読めないとその後何度ペアリングボタンを押してもダメです。
 原因は「zigbee2mqttのDataBaseにデバイスが登録されてしまっているから」です。ペアリングボタンを押しても"paired"のメッセージは飛ばず、"joined"のメッセージしか飛びません。つまりは一度zigbee2mqttのDBからそのデバイスの登録を削除すればよいのです。zigbee2mqttではこの辺りの設定(config)もmqttベースです。
 その方法は「設定」→「インテグレーション」で「MQTT」パネルの「設定」をクリック(下の左の画面)し、出てきた画面の「パケットをパブリッシュ」に下記メッセージを設定しパブリッシュします(下の右の画面)。

  • トピック:zigbee2mqtt/bridge/config/force_remove
  • ペイロード:0x00158d000XXXXXXX  ←自動発見させたいデバイスのID

f:id:maky_Ba:20210110160434j:plain:w240 f:id:maky_Ba:20210110161531j:plain:w240
 その後、再度デバイスのペアリングボタンを押せば"paired"のメッセージが飛ぶはずです。

4.3. センサーの取り付け

 小さな箱(マグネット棒が入っています)と大きめの方の箱(本体)の横について目盛りが大体同じ位置になるようにそろえて裏の両面テープでドアや窓に貼り付けます。小さな箱にはマグネット棒が縦(?長辺と並行?)に入っているので、縦を軸にに回転させても問題ありません。
 下の写真は玄関のドアに貼りつけた例ですが、小さな箱はドア表面に貼り付けて本体は枠に貼り付けているので、直角になっていますが問題ありません。
f:id:maky_Ba:20210110203923j:plain:w300

5. おわりに

 これでzigbeeバイスの状態をHome Assistantから確認できるようになりました。実際にこのDoor&Windowセンサーを使うには、うまい具合に(=狙ったように反応するように)窓やドアに貼り付けなければなりません。上の玄関のドアの例は小箱と本体の位置関係がちょうどいい感じに貼り付けることができましたが、いつもそうとは限りません。次はDoor&Windowセンサーの取り付けの工夫とちょっとした改造などにトライしたいと思います。

maky-ba.hatenablog.com

*1:なんだか目的を見失っている感はありますが。温度・湿度を測って何がしたかったのだろう…エアコンとの連動だった気も…あ、「赤外線リモコンでエアコン操作」を失念…。暑くなくなったからなぁ。

*2:夏と違って窓を開けっぱにすることはあまりないので、冬の今は閉め忘れも無いのですが…

*3:既に購入済みなので別途使い道を考えないといけませんねぇ。スマートホームもったいないオバケが出そう。

*4:こいつが正式なZigBeeバイスであるかは不明。ZigBeeアライアンスは結構しっかりしていますから。それと電波法うにゃららも気にする人は避けるべきかと…ちなみにマニュアルは今後の日本市場を意識してか日本語のページもありましたよ。