Skip to content

device_setpoint shows proportional boost value instead of direct target in mixed AC+TRV rooms #385

Description

@florianmulatz

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

  1. Configure a room with two devices:
    • AC: setpoint_mode: direct
    • TRV: setpoint_mode: proportional
  2. Room temperature significantly above the cooling target, so power_fraction is near 1.0.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions