Skip to content

v2.9.2

Choose a tag to compare

@kristofferR kristofferR released this 08 Apr 19:10

What's New

Sleep Number support — major expansion

  • Unified thermal climate entity for Sleep Number Climate 360 / FlexFit (Fuzion) beds. Automatically adapts to whichever hardware module the bed has:
    • Frosty (Cooling Module) — cooling only, low / medium / high presets.
    • Heidi (Core Temperature Module) — both heating AND cooling on the same entity, adding a boost preset for Heidi's high-power cooling mode.
  • Sleep Number setting (firmness) number entity driven by the real PSNS / PSNG commands.
  • Split left / right bed presence sensors backed by a single grouped BAMG query (with a legacy bed_presence alias kept for backwards compatibility with existing automations).
  • Footwarming climate entity with its own timer select (30 min – 6 h) and presets.
  • Climate Timer select for the unified thermal entity (30 min – 10 h).
  • Sleep Number BAM / MCR support — new controller for older Sleep Number i8 / 360 FlexFit 2 bases that speak the pre-Fuzion MCR UART protocol instead of BamKey. Exposes side-specific firmness, foundation presets (Favorite / Read / Watch TV / Flat / Zero G / Snore), under-bed light, and optional chamber-based occupancy on firmware that reports it.

Bug Fixes

Sleep Number BamKey (Climate 360 / FlexFit)

  • Thermal preset / timer cache is now only committed after the BLE write succeeds, so a failed write can no longer leave the resume state ahead of the bed.
  • FWTG reconnect now seeds the footwarming timer from the device's total field instead of defaulting to 2 h.
  • Live remaining countdown no longer overwrites the user-selected timer, so the timer select stays on a canonical value and turn_on resumes the full duration.
  • OFF → COOL/HEAT transitions now restore the last preset the user actually ran for that direction (per-hvac resume cache) instead of silently dropping back to low.
  • boost is hidden from preset_modes while the entity is in heat, forced to cool when picked from an off state, and hard-rejected if a caller tries (heat, boost) — the cooling-only SPECIAL_HIGH_COOLING mode can never slip into a heating command.
  • Thermal off sends timer=0 (matching the SleepIQ app); footwarming off keeps its cached timer (also matching the app).
  • Connect-time query_config no longer treats transport failures (BleakError, ConnectionError, TimeoutError) as "feature absent". Only the dedicated FAIL:0 unknown bamkey response is interpreted that way; transient protocol errors bubble and are retried on the next connect.
  • Bed presence polling is deduplicated via a short lock + TTL so the legacy and per-side sensors don't each re-run the same BAMG query every update cycle.

Sleep Number BAM / MCR (i8 / 360 FlexFit 2)

  • MCR replies are now correlated to the outstanding request via (function_code, side), so late notifications from prior commands can't wake the waiter with a wrong / incomplete result.
  • MCR writes always use write-with-response — no more silent fallback to fire-and-forget on the one transport that most needs an ACK.
  • The response wait now races the caller's cancel event and the coordinator's cancel signal, so cancellations or disconnects exit promptly instead of holding the serialized BLE path until the timeout.
  • A transient malformed pump-status reply no longer aborts the rest of MCR initialization (under-bed light and chamber queries continue).
  • _async_read_chamber_types publishes the generic bed_presence key alongside the split left/right keys so the legacy compatibility sensor reflects fresh data on MCR beds too.
  • Bed presence polling dedup (lock + TTL) mirrored from the Fuzion controller.

Ref #318 #322