【Home Assistant(Hass.io)】
Xiaomi Body Composition Scale 2で体重の記録を自動化する
「Home Assistant(Hass.io)でホームオートメーション 再起動!」シリーズです。
(書きかけ記事の消化強化期間中!!)
この間の夏に、Xiaomi スマート体組成計2(Body Composition Scale 2 (XMTZC05HM))がちょっと安売りされていたので買ってみました。半年たって、やっとHome Assistantに組み込みました。
いままで体重の記録するために、体重計に乗りながら「ねぇぐーぐる、makyの体重8x.x kg」と叫んで、IFTTT経由でGoogle Spread Sheetに記録していました。スマートではない…。*1
夏に購入してからは、Xiaomiスマート体組成計2は「体重計」として寂しく使われ続けておりHome Assistant連携していなかったのですが、ずっと「ねぇぐーぐる」と言い続けるのは、さすがにアレなので連携してみました。
この記事の前提条件 | |
---|---|
Home Assistant core | 2021.12.9 |
Home Assistant OS | 7.1 |
Server | Raspberry Pi 4(2GB) |
上記バージョンを前提とした手順です。 (最新版では動かないこともあるかもしれませんが、私が使っている限り、備忘録を兼ねて最新化してゆきたいとは思っています)
1. 準備
Xiaomi スマート体組成計2
Body Composition Scale 2 (XMTZC05HM)
Amazonで3000円を切るぐらいになっていたので、それじゃ、と買いました。今ではXiomiも正規販売店ありますがそこでも4,000円ぐらいかと。
ESP32
Xiaomiの体組成計はBluetooth接続です。ESPHomeに接続設定があるので、すでに導入しているESP32に体組織計の設定を追加します。
2. 設定
2.1. ESPHomeの設定
Xiaomiの体組成計XMTZC05HMは、ESPHomeで対応しています。
esphome.io
接続の為には、体組成計のBluetoothのMACアドレスが必要になります。Xiaomiのアプリに一度繋いでみるのも手ですね。現時点ではXiaomiの体組成計から得られる情報は「体重」「抵抗値」の2個のみです。
まずはユーザを作ります。私とゲストをつくってみます。それぞれに「体重(weight)」と「抵抗値(impedance)」の変数をtemplateで定義します。
次にxiaomi_miscale
プラットフォームで、「体重」(id: weight_miscale)と「抵抗値」(id inpedance_miscale)の設定をします。その中で体重や抵抗値でざっくり体組成計に載っている人を判別してそのユーザにも記録にします。*2
# Xiaomi Miscale2 # # User for Xiaomi mi scale - platform: template name: Weight maky id: weight_user1 unit_of_measurement: 'kg' icon: mdi:weight-kilogram accuracy_decimals: 2 - platform: template name: Impedance maky id: impedance_user1 unit_of_measurement: 'ohm' icon: mdi:omega accuracy_decimals: 0 - platform: template name: Weight Guest id: weight_guest unit_of_measurement: 'kg' icon: mdi:weight-kilogram accuracy_decimals: 2 - platform: template name: Impedance Guest id: impedance_guest unit_of_measurement: 'ohm' icon: mdi:omega accuracy_decimals: 0 - platform: xiaomi_miscale mac_address: 'XX:XX:XX:XX:XX:XX' weight: name: "Xiaomi Mi Scale Weight" id: weight_miscale on_value: then: - lambda: |- if (id(weight_miscale).state >= 75 && id(weight_miscale).state <= 85) { return id(weight_user1).publish_state(x); } else { return id(weight_guest).publish_state(x); } impedance: name: "Xiaomi Mi Scale Impedance" id: impedance_miscale on_value: then: - lambda: |- if (id(weight_miscale).state >= 75 && id(weight_miscale).state <= 85) { return id(impedance_user1).publish_state(x); } else { return id(impedance_guest).publish_state(x); }
2.2. 体組成の計算
Xiaomi体組成計の情報(体重と抵抗値)を使った体脂肪率の計算などは、下記のカスタムコンポーネントを使います。 github.com
HACSを使わない方法
- Githubよりbodymiscaleフォルダをダウンロードし、config/custom_components/bodymiscaleとして置く
- 一度再起動する
- 設定ファイル(bodymiscale.yamlとconfiguration.yaml)を記載、修正する
まずは体組成の計算の基となる個人情報の記入から。
maky: sensors: weight: sensor.weight_maky impedance: sensor.impedance_maky height: 171 born: "19XX-XX-XX" gender: "male" model_miscale: "181B"
次に体組成の計算コンポーネントをconfiguration.yamlに記載します。
(前略) # Xiaomi body mi scale2 # bodymiscale: !include /config/custom_components/bodymiscale/bodymiscale.yaml (後略)
HACSを使う方法
(2024/3/28:追記)
- サイドバー「HACS」から「Integration」⇒右下の「+ EXPPLORE & DONWLOAD REPOSITORYES」ボタンを押す
- 「Add Repository」でbodymiscaleを検索して表示したbodymiscleのページ右下の「Download」からbodymiscaleのカスタムコンポーネントをダウンロードする
- HACSページの「Integration」タブで再起動待ちを表示されるので、HomeAssistantを再起動する
- 再起動後、サイドバー「設定」から「デバイスとサービス」⇒右下の「+統合を追加」ボタンを押す
- 「新しい統合の設定」でbodymiscaleを検索して追加する。
- 「BodyMiScale」という何を入れよいかイマイチ分からない入力画面が表示されるが、一番上に体重計を使う人の名前(表示名)を入れて、年齢、性別も設定して「送信」する
- 次の「BodyMiScale」入力画面もこれも何を入れよいかイマイチ分からないが、一番上は身長、次が上で設定した体重のセンサー、次が体脂肪率のセンサーを設定して「送信」する
- 晴れて「成功!」と言われる
2.3. 体組成の表示
測定したデータを表示するカスタムカードとして下記を設定します。 github.com
- Githubよりdistフォルダの下にあるbody-miscale-card.jsをダウンロード(ファイルをRAWで開いて、ファイルに保存で)
- body-miscale-card.jsをconfig/www/の下に置く
- Github上のsrc/images以下のmiscale2.jpgとbodyscoreIcon/*.pngを、config/www/imagesの下に置く
- 「設定(Configuration) 」⇒「ダッシュボード」 ⇒「リソース」タブで「+リソースを追加」する
URL::/local/body-miscale-card.js?v=1.0.0
リソースの種類:JavaScriptモジュール - 「オーバービュー」⇒設定(縦・・・)の「ダッシュボードを編集」で「+カードを追加」する
- 下の方に「カスタム : BodyMiScaleカード」があるので、例えば下記の様に設定する。
(残念ながらbodyscoreIconフォルダのアイコン群は「ダーク」テーマでないと表示されません。ぐっすん*3)
3. おわりに
Xiaomiのこの体重計は、ガラストップで薄型でまあスタイリッシュなのですが、単体では体重しか表示しないという清い設計です。ま、そのあたりの割り切りがかえって良い(家の者に身構えさせることをしないとか)かと思ったり。
日本のメーカーにもそのあたり(取捨選択?ターゲティングの明確化?)頑張ってもらいたいなぁ、とも思う今日この頃です。