What's New
Broadcast mode for non-connectable scales. Some QN-protocol scales (notably certain Renpho ES-CS20M units) advertise weight data via BLE broadcasts without accepting GATT connections. BLE Scale Sync now reads weight directly from advertisement manufacturer data, no connection needed. Body composition is estimated using the Deurenberg formula when impedance data is unavailable.
BLE diagnostic tool (npm run diagnose). Detailed device analysis showing advertisement data, service UUIDs, RSSI, connectable flag, and step-by-step GATT connection testing. Useful for troubleshooting new or unrecognized scales.
Garmin 2FA/MFA support. The Garmin setup script now prompts for an authenticator code when multi-factor authentication is enabled on your Garmin account.
Fixes
- QN broadcast parser byte layout corrected (LE uint16 at bytes 17-18, stability flag at byte 15)
- ES-CS20M service UUID 0x1A10 fallback for unnamed Yunmai-protocol devices
- ES-CS20M 0x11 STOP frame support as stability signal
Other Changes
- Node.js 24 added to CI test matrix as a required check
- PR-triggered Docker image builds with
pr-{id}tags - ESLint v10, typescript-eslint v8.56
- 995 tests across 55 files
Thanks
- @APIUM for Garmin 2FA support (#41)
- @Tosiman-Global and @BenBaril83 for debugging the ES-CS20M broadcast protocol (#34)
- @marcelorodrigo for PR-triggered Docker builds (#44)
Full Changelog: v1.3.1...v1.4.0