インフラ・DevOps
Withings Body+をESP32でHome Assistantに接続した
I Connected My Withings Body+ to Home Assistant with an ESP32 (didac.dev)
要約
筆者は、クラウドを介さずにWithings Body+体重計のデータをHome Assistantに直接取り込むため、ESP32マイクロコントローラーを使用したDIYソリューションを開発しました。このシステムは、Bluetooth Classicで体重計と通信するESP32を介してデータを取得し、Wi-Fi経由でHome Assistantに送信します。これにより、データプライバシーが向上し、クラウド依存が排除されました。
全文翻訳
長年、私はWithings Body+を使用しています。私たちはそれに乗り、誰が誰かを認識し、測定値がWithingsアプリに表示されます。それ自体に問題はありませんでした。ただ、同じデータをHome Assistantでも使いたかったのです。
Home Assistantには既にWithingsインテグレーションがありますが、それはあなたのWithingsアカウントから測定値を取得します。つまり、データはBody+ → Withingsクラウド → Home Assistantという経路をたどります。私はこの中間ステップを削除したかったのです。
ChatGPTで少し調べたところ、オリジナルのESP32がBluetooth経由で体重計と通信し、ESP Homeを使用してその結果をHome Assistantに送信できることがわかりました。引き出しの中にESP32が一つあったので、試すのに十分な理由でした。
ハードウェア
体重計は改造したり分解したりしていません。ESP32は近くに置かれ、電源にはUSBケーブルが必要です。体重測定後、Body+はBluetooth経由で測定値をESP32に送信します。ESP HomeはそれをWi-Fi経由でHome Assistantに渡します。
Body+ → ESP32 → Home Assistant
Body+から保存されているWi-Fiネットワークも削除したので、体重計自体はもはやWithingsに何もアップロードできなくなりました。
ここで正確なESP32が重要になります。Body+はBluetooth Classicで同期しますが、ESP32-C3やESP32-S3ボードはBluetooth LEしかサポートしていません。私はオリジナルのESP32開発ボードを持っており、それが正しいものでした。Bluetooth Classicを搭載したオリジナルのESP32ならどれでも機能するはずですが、C3やS3では動作しません。
お使いのESPボードを特定し、そのピン配置を確認してください。
体重計のリバースエンジニアリング
ESP32は簡単な部分でした。問題は、Withingsアプリを置き換えようとする人向けにBody+のプロトコルが文書化されていないことでした。
この問題をOpenCode(Codexを実行)に任せました。それはWithings Androidアプリの古いバージョンを調べ、プロトコルに関する既存の作業と比較し、ESP Homeコンポーネントの構築を開始しました。
これにより、私は世界で最も非効率的なテストセットアップになりました。ESP32をフラッシュする。バスルームに行く。体重計をセットアップモードにする。それに乗る。ログを持って戻る。ログをCodexに渡す。繰り返す。
最初のビルドは何も機能しませんでした。後のビルドはBluetoothで接続しましたが、体重計をセットアップ画面でフリーズさせてしまいました。変更があるたびにファームウェアをビルドし直し、バスルームまで歩く必要がありました。そして、あるログでついにBody+のペアリング完了が表示されました。
もう一度体重計に乗ると、私の体重がHome Assistantに表示されました。
Codexは、私が現実的に自分ではできない部分、つまり逆コンパイルされたAndroidコードを読み、Bluetoothパケットを比較し、それをESP32用のC++に変換する作業を行いました。私は体重計、ログ、そして信じられないほど多くのほぼ同じ体重測定を提供しました。
それは魔法のような一つのプロンプトではありませんでした。ほとんどは「まだうまくいかない」というやり取りで、その後に別のファームウェアビルドがありました。
2つのプロフィール、2セットのセンサー
体重に基づいて誰が乗っているのか推測する必要があるかもしれないと思っていました。幸いなことに、Body+は既に私たちを識別し、各測定値にユーザーIDを含んでいます。両方のIDをESP Homeの設定に入れました。
コンポーネントはそれらを使用して、私のセンサーまたは妻のセンサーを更新し、知らないIDは無視します。
私たちはそれぞれ、以下の項目について独自の履歴を取得します。
体重
体脂肪
脂肪量
筋肉量
水分量
骨量
除脂肪量
体重計が誰の測定値かを決定します。ESP32はそれを正しい場所に送信するだけです。
Home Assistantで最後の測定値を保持する
ESP Homeはすべてを通常のセンサーとして公開するため、Home Assistantは追加作業なしでデバイスを検出しました。
ESP32を抜くと、生のセンサーは利用できなくなります。それは正しいですが、体重ダッシュボードではあまり役に立ちません。
USBケーブルを借りたからといって、私の最後の体重が消えてしまうのは困ります。
Home Assistantのテンプレートセンサーを追加して、最新の測定値を保持するようにしました。ESP32も同じ値を保存するため、再起動後すぐに復帰します。
私たちのダッシュボードはステップチャートも使用しています。2つの測定値の間で偽の値を作成するのではなく、次の体重測定まで平坦なままになります。
結果
私たちは以前と同じように体重計を使用しています。どちらかがそれに乗ってから数秒後に、正しいセンサーがHome Assistantで更新されます。
Body+はWi-Fiを必要とせず、Withingsアプリを開く必要もなく、データは自宅に留まります。
これは私たちのBody+、2つのプロフィール、そしてこの特定のESP32でのみテストしました。これはあらゆるWithings体重計に対応する普遍的なインテグレーションではないため、異なるモデルで動作することを期待してハードウェアを購入することは推奨しません。
公式インテグレーションが既に存在していたのに、多くのトークンを費やしましたが、今では私が望んでいたとおりに動作しています。そして、私の引き出しにあったESP32はついに恒久的な仕事を得ました。
コードはどこにあるか?
まだコードをGitHubにアップロードしていませんが、すぐにここにリンクを追加します。
この記事で使用されたもの
Home Assistant
ESP Home
ESP32-DevKitC 開発ボード
ChatGPT / Codex
OpenCode