Skip to content

v1.30.0

Choose a tag to compare

@KristianP26 KristianP26 released this 02 Oct 19:55
d175fac

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)