コモノポリタン

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

【Home Assistantでホームオートメーション】ESPHomeで屋内センサー増量(拡張:四角温度計)

【Home Assistant(Hass.io)】
Xiaomiの温湿度計(四角いヤツ)

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

 家の観測点を増やすためにXiaomiの温湿度計(丸形)とそのデータを収集するESPHomeを設定しました。さらに安価なXiaomiの温湿度計(四角)を接続できるようにしましょう。

 Xiaomiの丸形の温湿度計(LYWSDCGQ)も1個1,000円ちょっとで結構安いのですが、四角いヤツ(LYWSD03MMC)はさらに安くて500円ぐらいです。3Dプリンタのフィラメントが保管中にちゃんと除湿されているか確認する用途等、数が必要となる場合には魅力的ですね。

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

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

1. XiaomiのIoTデバイス

 Xiaomiの温湿度センサーの情報を再掲しておきます。それから目覚まし時計とした買ったデバイスも温湿度計と言えば温湿度計なので、こちらの情報も追加しておきます。いずれもAliExpressなどの中国のECサイトで入手可能です*1

Xiaomi mijia Bluetooth 温湿度計(LYWSDCGQ )
丸形で表示は液晶。電池は単4で1年持つと言っています。壁掛け用のパネルが付いています。
前回はこれをHome Assistantに繋ぎました。

Xiaomi mijia Bluetooth 温湿度計(LYWSD03MMC)
四角で小型。表示は液晶。電池はCR2032で、こちらも1年持つと言っています。画面に快適さが顔文字で表示されるという「余計な」機能が付いています。通信が暗号化されているようで、今回の対象です。

Qingping 温湿度計付き目覚まし時計(CGD1)
手にちょうど収まるぐらいにサイズ感。表示は液晶でバックライト付き。電池は単3が2本。これも四角いヤツと一緒で通信が暗号化されているようですので、今回の対象です。(下記の方法でBindkeyを取るとアプリと切断され目覚まし機能が使えません。残念。これはまた別途考えましょう。)

LYWSDCGQ LYWSD03MMC CGD1
四角 四角
サイズ[mm] 60.8 x 60.8 x 22.5
43g
43 x 43 x 12.5
21.5g
80.3 x 41 x 83
106g
電池 単4 CR2032 単3 x2
電池の持ち 1年 1年 不明
信号送信間隔
(気温・湿度)
20回/分 10分に1回 3分に1回?
信号送信間隔
(電池残量)
10分に1回 1時間に1回 不明
BLE送信文 平文 暗号 暗号
値段(単価) 1,220円
4個セットの場合1,060円
540円
4個セットの場合420円
1480円

 本来はXiaomiのハブと一緒使ってXiaomiのクラウドサービスで管理するのですが、今回も例によって例のごとく、単なるIoTデバイスとしてこれらを使用します。

2. ESPHomeのアップデート

 丸型のXaiomi温湿度計(LYWSDCGQ )をHome Assistantに接続する記事を書いていたときは、ESPHomeのBeta版でないと四角いヤツは扱えませんでしたが、いまはBeta版が正式版に格上げされたので、Beta版を導入しなくても大丈夫です。ESPHomeのバージョンを最新(現時点では1.15.3)にアップデートしておけば大丈夫です。
 画面がちょっと変わったり、対応機種が増えたりしてます。活動が活発なのは良いですね。

 あとは、下記の流れで良いはず。

  1. 暗号化キー(Bindkey)の取得
  2. ESPHomeで四角温湿度計(LYWSD03MMC)用のplatformで設定
  3. ダッシュボードのカードの編集

3. Bindkey取得

3.1. ESPHome標準方法(パケットスニファを使う) ⇒ 失敗!

 暗号化のキー(Bindkey)は、Mi Homeアプリに四角温湿度計(LYWSD03MMC)を登録する時に生成されデバイスに割り当てられので、それを横取り(スニフ)する必要があります。基本的には、ESPHomeのドキュメントの「Bindkeyの取得方法」に従って進めます。私はAndrodタブレットとWindowsPCを使ってBindkey取得に挑みました。

  1. AndroidのPlayストアから「RCAP Remote」をタブレットにインストール
  2. Windows PCにWiresharkをインストール
  3. RCAP Remoteは、タブレットの中にVPNサーバを作りタブレットで実行するアプリが外部とネットワークで接続する時にその間に挟まり、通信を横取りする機能があります。
  4. Wiresharkは、そのPCAP Remoteが横取りした通信内容をSSLで接続して見る機能を提供します。

 その結果は、ううむ…
 AndroidアプリのMi Homeが中国(China Mainland)のサーバとやり取りする隙間にVPNサーバを差し込みBindkeyを取得しようとするのですが、何かがまずくて取得がうまくいきません。というか、Mi Homeでアプリの登録(=Bindkeyの発行)が出来ないのです。残念。初っ端から失敗…

3.2. 違う方法を探す

 いろいろ調べるとAaron Christophelさんが四角温湿度計(LYWSD03MMC)のコントローラを解析して、カスタムファームウェアを作ったりしているらしい。素晴らしい!
github.com

 AaronさんのATC_MiThermometerでは2つ方法でBindkeyを取得できます(正確には一つの方法はBindkey不要ですが)。

  1. 勝手にBindkey割り当て
    AaronさんのWeb Tool「Telink Flasher for Mi Thermostat」を使って温湿度計を勝手アクティベーションする。この時に勝手に新たなBindkeyを発行するので、もしこれ以前にMi Homeアプリを使っていてもこれ以降はMi Homeは使えません。
  2. カスタムファームウェア
    もう一つは、同じくWeb Tool「Telink Flasher for Mi Thermostat」を使って四角温湿度計(LYWSD03MMC)にカスタムファームウェアを導入。これにより丸形温湿度計と同様に暗号化されていない情報をbroadcastするようにできます。これも当然Mi Homeアプリと繋ぐことは想定されていませんね。

 これら2つの方法のうち、前者の穏やかな方の方法を試してみましょう。非暗号化ファームウェアも顔文字非表示など気になる機能がいろいろあるのでいずれ試してみたい、とは思いますがまずは簡単な方から。メッセージの暗号化キーさえ入手できれば、最新のESPHomeでは複数四角温湿度計(LYWSD03MMC)からセンサー値を読み出す「xiaomi_lywsd03mmc」プラットフォームが使えます。

 それではAronさんのサイトに従って進めれば良いのですが、複数四角温湿度計(LYWSD03MMC)がある場合は、初回電源投入時にBLEツールなどでBluetooth MACアドレスを記録しておいてください。まあ沢山使いたいので四角温湿度計(LYWSD03MMC)を買ったと思う*2ので「必ず忘れずに」MACアドレスをメモること、ですね。私は「NFCタグで機器管理」で管理しています。

 次にTelink Flasher for Mi Thermostat(下記左)にアクセスする。上の方の「Connect」ボタンを押すとBluetoothで接続できる機器がリストアップされます。四角温湿度計(LYWSD03MMC)は送信間隔がまばらなので、リストに出るまでしばらく待つ必要あるかもしれません。また最初はMACアドレスが表示されないかもしれませんが、これもしばらく待つと表示されます。
 複数の四角温湿度計(LYWSD03MMC)を使っているときは、いくつも表示されるので先ほどメモッたMACアドレスで区別してください。「ペア設定」を押してしばらく待つと、画面の下の方の「Log」というところに「Detected Mi Thermometer」「Connected」と出ます。

 Connectされると下記のような画面になりその時の温度と湿度が表示されるので、狙った四角温湿度計(LYWSD03MMC)かを確認しましょう。上の方の「Do Activate」ボタンを押すと「Mi Bind Key」が表示されます。

 このBindkeyの値(16バイトの16進表記⇒32桁!)をメモしておきます。

4. ESP Home設定

 次にESPHomeの設定をします。下記の記事で以前使った、WiFiなどの初期設定を済ませOTAアップロードが出来るようにしたデバイスを使います。

maky-ba.hatenablog.com

ESPHomeの画面で設定ファイル(例えば前回ので言えば「xiaomi_ble_1f」)のパネルで「EDIT」をクリックし、下記のように追加設定しました。

(前略)
# BLE Tracker
esp32_ble_tracker:

sensor:
 (xiaomi_lywsdcgqの設定省略)
  # Xiaomi Temperature-Humidity Sensor2 #2
  - platform: xiaomi_lywsd03mmc
    mac_address: "A4:C1:XX:XX:XX:XX"
    bindkey: "0fbbxxxxxxxxxxxxxxxxxxxxxxxeb2bd"
    temperature:
      name: "Xiaomi LYWSD03MMC No2 Temperature"
    humidity:
      name: "Xiaomi LYWSD03MMC No2 Humidity"
    battery_level:
      name: "Xiaomi LYWSD03MMC No2 Battery Level"

(後略)

 次に設定ファイルのパネルの「UPLOAD」をクリックします。アップロード時のログには四角温湿度計(LYWSD03MMC)からの気温データとかが表示されないかもしれません。この温湿度計は更新間隔が広くなかなか情報を送らない省電力設計なのです。したがってアップロードの画面で問題がなければ一旦閉じて、設定ファイルのパネルの「LOG」をクリックしてしばらく30分~1時間放置します。きっとログの中にデータ表示されていると思います。

5. Home Assistantでの設定

 既にESPHomeのデバイス設定は済んでいるので、ESPHomeに設定をアップロードしただけでHome Assistant側でもそのセンサー値(温度、湿度、電池残量)が使えるようになっているはずです。画面で使いたければ、「状態」で「ダッシュボードの編集」を選び、エンティティなどのカードを編集すれば、GUIだけで簡単に設定できます。先ほど言ったように更新間隔が広いので、最初は値が「不明」とかになっているかもしませんが、我慢して待ちましょう。

 また前にも書きましたが、エンティティの表示名も「設定」→「エンティティ」でエンティティを選ぶと「表示の上書き」に漢字で設定可能です。こちらもconfiguration.yamlとかcustomizer.yamlとかをエディタでごりごり記述する必要はありません。

6. おわりに

 これでさらに安価なXiaomi温湿度計(四角温度湿度計)が使えるようになりました。さて次は3Dプリンタのところで述べたようにフィラメント用のドライボックスを作って、この四角温湿度計を活用しましょう!

maky-ba.hatenablog.com

*1:技適、とかは気にしないでください…。(と言いながら改めて技適サイトを見てみると日本で売ってないくせにXiaomiはデバイスの登録をしているように見えるがどうだ?!)

*2:そういえばそろそろ独身の日なのでAliExpressとかで安く買えないかな。