Summary
Add a dedicated select entity for the Duco BOX so users can explicitly set the discrete ventilation modes, including the timed states, without overloading the fan entity.
Why this issue exists
The current direction in core#9 treats the stable Duco modes as fan presets. That no longer looks like the clearest model for the user experience we want.
A dedicated select keeps the mode choice explicit, while the fan entity can stay focused on airflow control.
Design direction to track
1. Add a BOX mode select
The BOX should expose a dedicated select entity for the discrete Duco control states:
AUTO
MAN1
MAN2
MAN3
CNT1
CNT2
CNT3
EMPT
The select should:
- read from
Ventilation.State
- write through
async_set_ventilation_state()
- exist alongside the fan entity instead of replacing it
2. Keep the fan entity focused on airflow control
The fan entity should stay focused on percentage-style airflow control rather than becoming a second mode selector.
Open implementation question:
- whether the displayed fan percentage should continue to be derived from the current reported state, or move to
FlowLvlTgt
Current recommendation:
- keep the fan percentage based on the effective reported state until real-device behavior shows
FlowLvlTgt is more reliable for Home Assistant UX
- do not switch to
FlowLvlTgt just because it exists if it can lag behind the actual active mode
3. Keep timing semantics out of this issue
The installer-configurable duration problem should stay tracked separately.
Related timing work:
core#20 tracks removal of misleading fixed-duration assumptions like 15 min, 30 min, and 45 min
This issue is about adding an explicit mode select, not about how timed states are labeled internally.
Scope
In scope:
- add a BOX mode select entity for the discrete Duco states
- keep the fan entity and mode control responsibilities separate
- decide how the fan percentage should be derived for BOX
- update tests and snapshots to match the final entity model
Out of scope:
- zonal valve select entities already tracked elsewhere
- generic Duco label cleanup beyond the control-model implications
- installer-configurable manual durations beyond linking to
core#20
Acceptance criteria
- BOX ventilation modes are exposed through a dedicated select entity
- the select exists alongside the existing fan entity
- writes use the existing Duco ventilation-state API path
- the fan entity contract remains focused on airflow control
- the chosen percentage read model is explicitly documented in code and tests
Related
- Refines the direction described in
core#9
- Related label/timing follow-up:
core#20
- Related zonal select work:
core#21
Summary
Add a dedicated select entity for the Duco BOX so users can explicitly set the discrete ventilation modes, including the timed states, without overloading the fan entity.
Why this issue exists
The current direction in
core#9treats the stable Duco modes as fan presets. That no longer looks like the clearest model for the user experience we want.A dedicated select keeps the mode choice explicit, while the fan entity can stay focused on airflow control.
Design direction to track
1. Add a BOX mode select
The BOX should expose a dedicated select entity for the discrete Duco control states:
AUTOMAN1MAN2MAN3CNT1CNT2CNT3EMPTThe select should:
Ventilation.Stateasync_set_ventilation_state()2. Keep the fan entity focused on airflow control
The fan entity should stay focused on percentage-style airflow control rather than becoming a second mode selector.
Open implementation question:
FlowLvlTgtCurrent recommendation:
FlowLvlTgtis more reliable for Home Assistant UXFlowLvlTgtjust because it exists if it can lag behind the actual active mode3. Keep timing semantics out of this issue
The installer-configurable duration problem should stay tracked separately.
Related timing work:
core#20tracks removal of misleading fixed-duration assumptions like15 min,30 min, and45 minThis issue is about adding an explicit mode select, not about how timed states are labeled internally.
Scope
In scope:
Out of scope:
core#20Acceptance criteria
Related
core#9core#20core#21