I Connected My Withings Body+ to Home Assistant with an ESP32
Localizing My Withings Body+ via ESP32
By Dídac Sabatés | September 3, 2026
I have successfully integrated my Withings Body+ scale into Home Assistant using an ESP32. The primary goal was to ensure that my body composition and weight data travel directly to my local server, completely bypassing the Withings cloud infrastructure.
The Motivation: Cutting the Cord
Normally, the scale operates by identifying the user and syncing data to the official app. While the official Home Assistant integration is easy to set up, the data path is inefficient:
Body+ Withings Cloud Home Assistant
I wanted a truly local solution. By utilizing an ESP32 and ESPHome, I shifted the architecture to:
Body+ ESP32 Home Assistant
Data Flow Comparison
Hardware Requirements
Not all ESP boards are created equal. The Body+ relies on Bluetooth Classic, which limits the hardware choices.
| Board Model | Bluetooth Support | Compatible? |
|---|---|---|
| Original ESP32 | Classic + LE | ✅ Yes |
| ESP32-C3 | LE Only | ❌ No |
| ESP32-S3 | LE Only | ❌ No |
Note: Ensure you verify your board's pinout before starting.
The Engineering Hurdle
The hardest part wasn't the hardware, but the protocol. Withings does not document the communication method for third-party replacements. To solve this, I leveraged ChatGPT/Codex to perform the heavy lifting:
- Analyzing decompiled Android app code.
- Comparing Bluetooth packets.
- Translating those findings into C++ for
ESPHome.
"I became the world's most inefficient tester: I would flash the firmware, walk to the bathroom, step on the scale, check the logs, and repeat."
The process was a cycle of trial and error. Many attempts left the scale stuck on the setup screen until a log finally confirmed: Body+ association complete.
Project Checklist
- Source original ESP32
- Reverse engineer Bluetooth protocol via AI
- Write custom ESPHome component
- Remove Wi-Fi credentials from scale
- Validate data in Home Assistant
Handling Multiple Users
I initially worried I would have to distinguish between my wife and me based on weight thresholds (e.g., if then User A). However, the Body+ is smarter; it transmits a unique User ID with every measurement.
The custom component maps these IDs to specific sensors. We now track the following metrics for both profiles:
- Weight
- Body Fat %
- Fat Mass
- Muscle Mass
- Body Water
- Bone Mass
- Fat-free Mass
Home Assistant Integration & Persistence
While ESPHome provides the sensors automatically, they become unavailable if the ESP32 loses power. To prevent my dashboard from looking broken, I implemented template sensors.
The logic follows a simple persistence rule:
I also utilized step charts for visualization, ensuring the line remains flat between weigh-ins rather than interpolating fake data points.
# Example logic for persistence
template:
- sensor:
- name: "Persistent Weight"
state: "{{ states('sensor.esp32_weight') if states('sensor.esp32_weight') != 'unavailable' else states('sensor.persistent_weight') }}"
Final Results
The user experience remains unchanged, but the privacy is vastly improved. We step on the scale, and seconds later, the data is in Home Assistant. The scale no longer requires Wi-Fi, and the Withings app is obsolete.
Caveats:
- This was tested specifically with the Body+ and one specific ESP32 board.
- It is not a universal fix for all Withings models.
- The code is not yet on GitHub, but it will be soon.