Skip to content

feat(idle): add opt-in idle_action "engaged" (never-off float on setpoint) - #405

Open
andgian wants to merge 1 commit into
snazzybean:mainfrom
andgian:feature/idle-action-engaged
Open

feat(idle): add opt-in idle_action "engaged" (never-off float on setpoint)#405
andgian wants to merge 1 commit into
snazzybean:mainfrom
andgian:feature/idle-action-engaged

Conversation

@andgian

@andgian andgian commented Aug 5, 2026

Copy link
Copy Markdown

Summary

Adds a fourth idle_action, engaged, for climate devices that should never fully switch off at idle — an inverter AC that stays on its setpoint and lets the compressor modulate rather than cycling off.

It is a never-off variant of setback and is fully opt-in: the existing idle actions (off / fan_only / setback / low) are unchanged.

Motivation

For a floor-mounted inverter AC, the unit's onboard return sensor reads the cold air pooling at the floor and reports "at setpoint" while the occupied zone (desk height) is still warm. With setback/off, the unit stops at idle and the room drifts warm. Driving the room off an external sensor and keeping the unit engaged on the setpoint holds true comfort — the inverter simply modulates.

Behaviour of engaged

  • Floats exactly on the setpoint (offset 0, vs setback's DEFAULT_IDLE_SETBACK_OFFSET).
  • When the unit is found idle in a non-cooling mode (auto / off / dry / fan_only) it re-engages a cooling mode (set_hvac_mode before set_temperature, honoring the Airstage ordering gotcha) instead of falling back to off — so a device left in auto (common on Airstage) keeps holding the setpoint.
  • Is exempt from force_off (Action when schedule is off gets overridden by device "When Idle" setting #368), like idle_action=low: when the room is shut down explicitly (schedule-off / presence-away) an engaged device still stays engaged. Users who want the room to turn off on shutdown keep the default idle action.

Scope / notes

  • Cooling-focused: engaged re-engages cooling for a cool-capable unit; a device already in heat floats on the heat target, but engaged does not re-engage heating from off (out of scope; the motivating case is an inverter AC).
  • Config: engaged is added to the rooms/save websocket schema idle_action enum. (The frontend dropdown is not touched in this PR — the WS API and headless config accept it; happy to add the UI option in a follow-up if desired.)
  • The behaviour has been running in production (as a local patch expressed via setback) on an Airstage AC + underfloor hybrid setup; this PR re-expresses it as a clean opt-in action. A maintainer review/test of the exact engaged code path before merge is welcome.

…oint)

Adds a fourth idle_action, "engaged", for climate devices that should never
fully switch off at idle — an inverter AC that stays on its setpoint and lets
the compressor modulate rather than cycling off. It is a never-off variant of
"setback":

- floats exactly on the setpoint (offset 0, vs setback's DEFAULT_IDLE_SETBACK_OFFSET);
- when the unit is found idle in a non-cooling mode (auto/off/dry/fan_only),
  re-engages a cooling mode (set_hvac_mode before set_temperature) instead of
  falling back to off — so a device left in "auto" (common on Airstage) keeps
  holding the setpoint;
- is exempt from force_off (snazzybean#368), like idle_action=low: when the room is shut
  down explicitly it still stays engaged. Users who want the room to turn off
  on schedule-off/away keep the default idle_action.

Opt-in only: existing idle_action values (off/fan_only/setback/low) are
unchanged. Added to the websocket rooms/save schema enum.

Rationale: for a floor-mounted inverter AC whose onboard sensor reads the cold
air pooling at the floor, turning off at idle lets the occupied zone drift warm;
keeping the unit engaged on an external room sensor holds true comfort.
@andgian
andgian requested a review from snazzybean as a code owner August 5, 2026 15:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants