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+をESP32でHome Assistantに接続した
私は長年Withings Body+を使用しています。それに乗ると、誰が誰かを認識し、測定値がWithingsアプリに表示されます。それ自体に問題はありませんでした。ただ、同じデータをHome Assistantでも利用したかったのです。
Home Assistantには既にWithingsのインテグレーションがあります。設定には数分しかかからなかったでしょうが、それはあなたのWithingsアカウントから測定値を取得します。データは依然としてこの経路をたどる必要があります。
Body+ -> Withings cloud -> Home Assistant
私は中間のステップを削除したかったのです。ChatGPTで少し調べたところ、オリジナルのESP32がBluetooth経由でスケールと通信し、ESPHomeを使用して結果をHome Assistantに送信できることがわかりました。私は既に引き出しに一つ持っていたので、試すのに十分な理由でした。
ハードウェア#
スケールを改造したり開けたりしませんでした。ESP32は近くに置かれ、電源供給のためにUSBケーブルが必要です。
体重測定後、Body+はBluetooth経由で測定値をESP32に送信します。ESPHomeはそれを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では動作しません。
スケールのリバースエンジニアリング#
ESP32は簡単な部分でした。問題は、Withingsアプリの代替を目指す人にとって、Body+のプロトコルが文書化されていないことでした。
この問題をCodexを実行しているOpenCodeに与えました。それは古いバージョンのWithings Androidアプリを調べ、プロトコルに関する既存の作業と比較し、ESPHomeコンポーネントの構築を開始しました。
これにより、私は世界で最も非効率的なテストセットアップになりました。
- ESP32をフラッシュする。
- バスルームまで歩く。
- スケールをセットアップモードにする。
- 体重を測定する。
- ログを持って戻る。
- ログをCodexに渡す。
- 繰り返す。
最初のビルドは何も起こりませんでした。後のビルドではBluetoothで接続できましたが、スケールはセットアップ画面でスタックしたままでした。変更があるたびにファームウェアを再ビルドし、バスルームまで歩く必要がありました。
そして、ついにログの一つにBody+ association completeと表示されました。もう一度スケールに乗ると、私の体重がHome Assistantに表示されました。
Codexは、私が現実的に自分ではできない部分、つまり逆コンパイルされたAndroidコードを読み、Bluetoothパケットを比較し、それをESP32用のC++に変換するという作業を行いました。私はスケール、ログ、そして信じられないほど多くのほぼ同じ体重測定を提供しました。
それは一つの魔法のプロンプトではありませんでした。ほとんどは「まだうまくいかない」という言葉に続き、別のファームウェアビルドでした。
2つのプロフィール、2セットのセンサー#
体重に基づいて誰がスケールに乗ったのか推測する必要があるかもしれないと思いました。幸いなことに、Body+は既に私たちを識別し、各測定値にユーザーIDを含んでいます。
両方のIDをESPHomeの設定に入れました。コンポーネントはそれらを使用して、私のセンサーまたは妻のセンサーを更新し、知らないIDは無視します。
私たちはそれぞれ、以下の独自の履歴を取得します。
- 体重
- 体脂肪率
- 体脂肪量
- 筋肉量
- 体水分量
- 骨量
- 除脂肪量
スケールが誰の測定値かを決定します。ESP32はそれを正しい場所に送信するだけです。
Home Assistantで最後の測定値を保持する#
ESPHomeはすべてを通常のセンサーとして公開するため、Home Assistantは追加作業なしでデバイスを検出しました。
ESP32のプラグを抜くと、生のセンサーは利用できなくなります。これは正しいですが、体重ダッシュボードではあまり役に立ちません。USBケーブルを借りたために、私の最後の体重が消えるべきではありません。
Home Assistantのテンプレートセンサーを追加し、最新の測定値を保持するようにしました。ESP32も同じ値を保存するため、再起動後すぐに復旧します。私たちのダッシュボードはステップチャートも使用しています。測定値は、2つの間の偽の値を生成するのではなく、次の体重測定まで平坦なままです。
結果#
私たちは以前と同じようにスケールを使用しています。どちらかがそれに乗ってから数秒後に、正しいセンサーがHome Assistantで更新されます。Body+はWi-Fiを必要とせず、Withingsアプリを開く必要もなく、データは自宅に留まります。
私はこれを私たちのBody+、2つのプロフィール、そしてこの特定のESP32でのみテストしました。これはすべてのWithingsスケールに対する普遍的なインテグレーションではないため、異なるモデルで動作することを期待してハードウェアを購入することはお勧めしません。
公式のインテグレーションが既に存在していたのに、多くのトークンを消費しましたが、今では私が望んでいたとおりに動作しています。そして、私の引き出しにあったESP32はついに恒久的な仕事を得ました。
コードはどこにあるか?#
まだコードをGitHubにアップロードしていませんが、すぐにここにリンクを追加します。