Environment
- RoomMind version: 1.7.5
- Home Assistant version: 2026.5+
- Installation method: manual (HACS-compatible)
Description
In a room configured with a direct-mode AC and a proportional-mode TRV, the hero card's "Device set to X°C" display shows the proportional boost setpoint (e.g. the AC's min_temp, ~16°C) instead of the actual comfort target that is sent to the AC (e.g. 24°C).
Steps to Reproduce
- Configure a room with two devices:
- AC:
setpoint_mode: direct
- TRV:
setpoint_mode: proportional
- Room temperature significantly above the cooling target, so
power_fraction is near 1.0.
- Observe the "Device set to X°C" value on the room's hero card.
Expected: the real cool_target (e.g. 24.0°C) — what async_apply() actually sends to the AC.
Actual: the proportional boost formula result, driven down to the AC's min_temp/AC_COOLING_BOOST_TARGET.
Root Cause
In coordinator.py, _build_room_state_dict() computed _all_direct across all devices in the room:
_direct_eids = get_direct_setpoint_eids(_room_devices) # only the AC
_devs_with_eid = [d for d in _room_devices if d.get("entity_id")] # AC + TRV
_all_direct = bool(_devs_with_eid) and len(_direct_eids) == len(_devs_with_eid)
# mixed room -> _all_direct = False
_compute_device_setpoint() only shortcuts to target_temp when all_direct=True; otherwise it falls through to the proportional formula:
boost = device_min_temp # e.g. 16.0°C
sp = round(current_temp - power_fraction * (current_temp - boost), 1)
sp = max(boost, sp)
sp = min(target_temp, sp)
# -> 16.0°C, shown in the UI
Meanwhile mpc_controller.py's async_apply() already routes correctly per-device:
ha_cool_direct = celsius_to_ha_temp(self.hass, effective_target)
ha_t = ha_cool_direct if eid in self._direct_eids else ha_target
# direct AC receives the real target, e.g. 24.0°C
So the actual device control is correct — only the UI display value is wrong. It's caused by the TRV's presence (which is turned off during cooling) forcing _all_direct = False for the whole room.
Suggested Fix
Evaluate directness only over the devices actually relevant to the current mode (cooling only ever commands ACs; TRVs are set to off), the same way mpc_controller.py and the compressor-group logic already scope _mode_relevant_eids.
I have a fix + regression test ready and will open a PR shortly.
Environment
Description
In a room configured with a direct-mode AC and a proportional-mode TRV, the hero card's "Device set to X°C" display shows the proportional boost setpoint (e.g. the AC's
min_temp, ~16°C) instead of the actual comfort target that is sent to the AC (e.g. 24°C).Steps to Reproduce
setpoint_mode: directsetpoint_mode: proportionalpower_fractionis near 1.0.Expected: the real cool_target (e.g. 24.0°C) — what
async_apply()actually sends to the AC.Actual: the proportional boost formula result, driven down to the AC's
min_temp/AC_COOLING_BOOST_TARGET.Root Cause
In
coordinator.py,_build_room_state_dict()computed_all_directacross all devices in the room:_compute_device_setpoint()only shortcuts totarget_tempwhenall_direct=True; otherwise it falls through to the proportional formula:Meanwhile
mpc_controller.py'sasync_apply()already routes correctly per-device:So the actual device control is correct — only the UI display value is wrong. It's caused by the TRV's presence (which is turned off during cooling) forcing
_all_direct = Falsefor the whole room.Suggested Fix
Evaluate directness only over the devices actually relevant to the current mode (cooling only ever commands ACs; TRVs are set to
off), the same waympc_controller.pyand the compressor-group logic already scope_mode_relevant_eids.I have a fix + regression test ready and will open a PR shortly.