Releases
v1.30.0
Compare
Sorry, something went wrong.
No results found
What's new
New HealthLog exporter.
Garmin: BMR is now uploaded.
New scale: Senssun IF_B7 (Grifema GA2001), a broadcast scale, in kg and lb.
Renpho R-MSC04: the app waits for the scale's body composition record after the weight.
QN scales: a separate display unit, and fixes for the weight anchor and 20-byte live frames.
Xiaomi scales export muscle mass instead of skeletal muscle.
BLE: GATT writes are queued per characteristic, so BlueZ no longer rejects them as "In Progress". New option ble.preemptive_adapter_reset, also in the add-on.
Metabolic age for women no longer comes out about 11 years too high.
1.30.0 (2026-10-02)
Added
addon: expose preemptive_adapter_reset as an add-on option (182dc7b ), closes #417
ble: let ble.preemptive_adapter_reset skip the post-GATT power-cycle (c8c2263 ), closes #417
ble: say once at info when the post-GATT power-cycle is off (b9f18eb ), closes #417
exporters: add a HealthLog exporter (#443 ) (6c1535d )
garmin: upload BMR as basal_met (#432 ) (14d79e8 )
qn: support an independent physical display unit (#429 ) (ced93a0 )
scales: acknowledge R-MSC04 status frames like the Renpho app (563b9f5 ), closes #434
scales: add Senssun IF_B7 broadcast adapter (Grifema GA2001) (eaec55a ), closes #423
scales: read a Senssun IF_B7 that displays lb (c81d7ff ), closes #423
scales: wait for the R-MSC04 body composition record (b8861eb ), closes #434
silvergear: hold a settled weigh-in for its own post-weigh-in frame (33a8e9d ), closes #357
Fixed
addon: actually pass --config-path to setup_garmin.py (22cbffb ), closes #435
addon: import a Garmin token that is newer than the cached one (#428 ) (7cd76a9 )
ble: queue GATT writes per characteristic so BlueZ stops rejecting them as In Progress (#211 ) (b3c81d2 )
ble: stop pointing a one-time pairing passkey at beurer_pin (#430 ) (2a925c0 )
body-comp: use the user's sex constant in the metabolic age reference (7c9f9a5 ), closes #433
config: make validate build the exporters it reports on (ecaf281 )
config: stop atomicWrite destroying the file it cannot replace (efb7c8b )
config: validate what the schema and the env path both let through (91b000b )
es-cs20m: read 0x14 stability from the status low nibble (91cba08 ), closes #376
exporters,config: parse what the config says, and stop the watcher eating edits (8a27c8b )
exporters: own the MQTT client, and bound every step of an export (ed94dca )
firmware: skip auto-connect for advertisement-read scales (4c2b819 ), closes #422
garmin: redact query values and respect suppressed context in error chains (8d2ae43 )
garmin: say the token file is missing instead of asking for a password (2e3a304 ), closes #435
garmin: stop setup reusing a stale token (#427 ) (3699443 )
mi-scale: export muscle mass, not skeletal muscle, for Xiaomi scales (#431 ) (6e9ce36 )
mqtt-proxy: never drive a GATT session for an advertisement-read scale (b074fa5 ), closes #422
mqtt-proxy: refuse an advertisement-read scale on the single-shot GATT path too (24d3b95 ), closes #422
mqtt-proxy: tell the ESP32 which scales are read from advertisements (10dcb40 ), closes #422
qn: send the weight anchor twice after START, where both Arboleaf captures put it (513c027 ), closes #331 #75
qn: stop answering 20-byte live frames with a 0.17 kg A2 (9a9025a ), closes #331 #235
qn: stop reading a 20-byte live frame through the original layout (f33618e ), closes #331
runtime: deliver a queued export to its own user, with its own timestamp (4db38bf )
scales: stop QN claiming a 0x1A10 scale on its AE00 service alone (909c062 ), closes #436
utils,exporters: give retries a delay, and make the HA metric check check (985e86a )
Docs
addon: say where the QN weight anchor is sent (b707812 ), closes #331
ble: count the composition hold in the session and cycle ceilings (c042d64 )
describe muscle mass as fat-free mass minus bone (f8a9e89 )
describe the R-MSC04 composition wait (66f524f ), closes #434
document ble.preemptive_adapter_reset (4c1e414 ), closes #417
esp32-proxy: explain how advertisement-read scales are handled (686f30b ), closes #422
esp32-proxy: say a restart can bring back one dropped connect (e9d6f70 ), closes #422
faq: describe the retry backoff and queue as they ship now (0cf84de )
fix two figures from today's follow-ups (07d9726 )
garmin: list BMR among the fields weight_only leaves unset (1c5f7e5 )
interfaces: say the completion hold is GATT-only (094e719 ), closes #357
list the Grifema GA2001 / Senssun IF_B7 as a broadcast scale (bde2812 ), closes #423
qn: document the post-START weight anchor (f57e283 ), closes #331
qn: record that 0x08 switches a QN-S500 to stone (dd6ca9d )
qn: say display_unit only reaches QN scales, and how sure 0x08 is (e2b0449 )
qn: stop telling users to try qn_time_sync_long apart from qn_weight_ack (e49fbeb ), closes #331
qualify where preemptive_adapter_reset applies (2cc878c ), closes #417
record the env-override and webhook header behaviour that changed (7a2dbc4 )
say the Grifema GA2001 / Senssun IF_B7 reads in kg and lb (08737bb ), closes #423
say the Senssun IF_B7 lb reading rests on one weigh-in (0f7e5f8 ), closes #423
say which broadcast paths hold a partial reading (289424b ), closes #357
scales: note the Silvergear wait for its post-weigh-in frame (15b4f29 ), closes #357
scales: say the R-MSC04 profile is the one the app writes (4bd5d16 ), closes #434
scales: say when a Silvergear step-off sends the weight at once (fdf1df9 ), closes #357
troubleshooting: cover scales that show a passkey to type, not to confirm (#430 ) (6e2b0f6 )
You can’t perform that action at this time.