【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を使うやり方があります。
こんな感じでしょうか。
(2012/12/05 追記:zigbee2mqttをアドオンで導入する方法を下記に記しました。) maky-ba.hatenablog.com
- 【Home Assistant(Hass.io)】基本のzigbee2mqttの導入とzigbeeデバイス(Door&Windowセンサー)の接続
- 1. 準備
- 2. zigbee2mqttのセットアップ
- 3. Home Assistant側の設定
- 4. zigbeeデバイス(Xiaomi Aqara Window Door Sensor)を接続
- 5. おわりに
この記事の前提条件 | |
---|---|
Home Assistant | 2021.1.0※ |
HassOS | 5.10 |
Server | Raspberry Pi 4(2GB) |
上記バージョンを前提とした手順です。 (最新版では動かないこともあるかもしれませんが、私が使っている限り、備忘録を兼ねて最新化してゆきたいとは思っています)
1. 準備
Zigbee USB Adapter (CC2531 アンテナ付き)
Wireless USB Zigbee Snifferです。PCB(基板上)アンテナのものもありましたが、デバイスとの接続性が良いかもという期待でアンテナ付きを選びました。
価格:AliExpressで500円ちょいで買いました。
CC Debugger
CC2531はFirmwareを書き換えないとzigbee2mqttでは使えないそうです。このデバッガーと下のダウンロードケーブルを組み合わせて使います。
価格:AliExpressで700円弱で買いました。
CC2531 Download Cable
CC2531のFirmwareを書き換えるために、上のデバッガーと組み合わせて使います。
価格:AliExpressで150円ぐらいで買いました。
Raspberry Pi Zero W/WH
USBを挿す本体。今回はRaspberry Pi 3/4ではなくちっこい方のZeroでいきます。写真はWですがヘッダピンのあるのWHでも同じ。あ、写真撮り忘れましたがmicro USBのACアダプタも必要ですよ。
価格:秋月電子とかマルツとかでもケース付きで3000円しないと思います。
L字コネクタUSB変換ケーブル
Raspberry Pi本体はmicro USBの口で、ZigbeeアダプタはふつーのUSBですので繋ぐケーブルが必要です。
価格:このELECOMのやつは700円弱でしょうか。Amazonでもその半額ぐらいのもありますが…
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でのやり方を下記にメモしておきます。
- 「 SmartRF Flash programmer( -2 / V2じゃないほう)」をダウンロードしてインストールします。
まずTI(Texus Instruments)のアカウントであるmyTIアカウントを作ることを求められます。日本語でページを表示することも可能なので難しくないでしょう。 - 次にCC debugger driver をインストールします。
ダウンロードしたzipファイルを展開してインストールします。CC DebuggerのUSBケーブルをPCに挿してみてしばらく待ってから、Windowsデバイスマネージャで[Cable control devices] - [CC Debugger]が表示されていたら良し!ですが、[不明なデバイス]やら何や違う名前でビックリマークとかついていたら右クリックで「デバイスの更新」を選び、ダウンロードしたファイルの中のドライバ(win_32bit_x86もしくはwin_64bit_x64フォルダ、Windowsに合わせて選んでくださいね)のドライバを指定してインストールし直してください。 - CC DebuggerとZigbee USBアダプターを10ピンのフラットケーブルでつないで(写真のように1と基板上にシルク印刷されているところに赤い線が来るように接続)、両方をUSBをPCに繋ぎ、デバッガーの
Resetr
ボタンを押します。うまくいけばデバッガーのLEDが緑色に光るはずです。
(なんかごちゃごちゃしていてすみません…) - Z-Stack_Home_1.2のdefaultファーム置き場にあるファームウェアCC2531_DEFAULT_20190608.zipをダウンロードして解凍しておきます。
- Flash Programmerを起動して、Flash Imageに先ほど展開したファイルを指定して、下の方の「Perform action」ボタンをクリックします。OKとなったら良し。
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ユーザへのパスワード設定など一通り(パスワード設定、WiFi、ssh, 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ボタンですね…)を押します。
4. zigbeeデバイス(Xiaomi Aqara Window Door Sensor)を接続
4.1. zigbee2mqtt側でのデバイスの接続
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つ発見した状態です。
「3エントリー」の所をクリックすると「battery(電池残量)」と「contact(開閉)」と「linkquality(電波強度)」の3つが自動的に登録されていることがわかります。
これらエントリーを「状態」のところのカードに登録すれば値を確認できるようになります。
メインはやはり「contact」です。true
でCLOSE
(=閉(画面では「閉鎖」))、false
でOPEN
(「開」(画面では「開放」 )ってちょっと不思議な気もしますが、contact=接触なので接触しているの状態が正true
で良いのだと思います。
linkqualityはzigbeeの無線接続強度を示していて、20以下だとちょっと弱すぎ(遠すぎ)ということのようです。
(うっかり自動発見から漏れた場合対処法)
最初にzigbee2mqttとデバイスがペアリングされたときに、"paired"というメッセージがパブリッシュされます。それを読み込んでHome Assistantはデバイスを自動登録します。が、タイミング悪く(Home Assistantが立ち上がっていない時とか)pairedのメッセージをHAが読めないとその後何度ペアリングボタンを押してもダメです。
原因は「zigbee2mqttのDataBaseにデバイスが登録されてしまっているから」です。ペアリングボタンを押しても"paired"のメッセージは飛ばず、"joined"のメッセージしか飛びません。つまりは一度zigbee2mqttのDBからそのデバイスの登録を削除すればよいのです。zigbee2mqttではこの辺りの設定(config)もmqttベースです。
その方法は「設定」→「インテグレーション」で「MQTT」パネルの「設定」をクリック(下の左の画面)し、出てきた画面の「パケットをパブリッシュ」に下記メッセージを設定しパブリッシュします(下の右の画面)。
その後、再度デバイスのペアリングボタンを押せば"paired"のメッセージが飛ぶはずです。
4.3. センサーの取り付け
小さな箱(マグネット棒が入っています)と大きめの方の箱(本体)の横について目盛りが大体同じ位置になるようにそろえて裏の両面テープでドアや窓に貼り付けます。小さな箱にはマグネット棒が縦(?長辺と並行?)に入っているので、縦を軸にに回転させても問題ありません。
下の写真は玄関のドアに貼りつけた例ですが、小さな箱はドア表面に貼り付けて本体は枠に貼り付けているので、直角になっていますが問題ありません。
5. おわりに
これでzigbeeデバイスの状態をHome Assistantから確認できるようになりました。実際にこのDoor&Windowセンサーを使うには、うまい具合に(=狙ったように反応するように)窓やドアに貼り付けなければなりません。上の玄関のドアの例は小箱と本体の位置関係がちょうどいい感じに貼り付けることができましたが、いつもそうとは限りません。次はDoor&Windowセンサーの取り付けの工夫とちょっとした改造などにトライしたいと思います。
*1:なんだか目的を見失っている感はありますが。温度・湿度を測って何がしたかったのだろう…エアコンとの連動だった気も…あ、「赤外線リモコンでエアコン操作」を失念…。暑くなくなったからなぁ。
*2:夏と違って窓を開けっぱにすることはあまりないので、冬の今は閉め忘れも無いのですが…
*3:既に購入済みなので別途使い道を考えないといけませんねぇ。スマートホームもったいないオバケが出そう。
*4:こいつが正式なZigBeeデバイスであるかは不明。ZigBeeアライアンスは結構しっかりしていますから。それと電波法うにゃららも気にする人は避けるべきかと…ちなみにマニュアルは今後の日本市場を意識してか日本語のページもありましたよ。