You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.