From f1bf28df18c3bd9853856e2c773794ea0801844e Mon Sep 17 00:00:00 2001 From: virtualbitzz <47397720+virtualbitzz@users.noreply.github.com> Date: Mon, 15 Sep 2025 04:28:40 -0700 Subject: [PATCH] Add Matter climate running state heat fan and cool fan (#151535) Co-authored-by: epenet <6771947+epenet@users.noreply.github.com> --- homeassistant/components/matter/climate.py | 34 ++++++++++------------ tests/components/matter/test_climate.py | 20 ++++++++++++- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/homeassistant/components/matter/climate.py b/homeassistant/components/matter/climate.py index df57da4ded3a..c15dd42d62b6 100644 --- a/homeassistant/components/matter/climate.py +++ b/homeassistant/components/matter/climate.py @@ -296,24 +296,22 @@ class MatterClimate(MatterEntity, ClimateEntity): if running_state_value := self.get_matter_attribute_value( clusters.Thermostat.Attributes.ThermostatRunningState ): - match running_state_value: - case ( - ThermostatRunningState.Heat | ThermostatRunningState.HeatStage2 - ): - self._attr_hvac_action = HVACAction.HEATING - case ( - ThermostatRunningState.Cool | ThermostatRunningState.CoolStage2 - ): - self._attr_hvac_action = HVACAction.COOLING - case ( - ThermostatRunningState.Fan - | ThermostatRunningState.FanStage2 - | ThermostatRunningState.FanStage3 - ): - self._attr_hvac_action = HVACAction.FAN - case _: - self._attr_hvac_action = HVACAction.OFF - + if running_state_value & ( + ThermostatRunningState.Heat | ThermostatRunningState.HeatStage2 + ): + self._attr_hvac_action = HVACAction.HEATING + elif running_state_value & ( + ThermostatRunningState.Cool | ThermostatRunningState.CoolStage2 + ): + self._attr_hvac_action = HVACAction.COOLING + elif running_state_value & ( + ThermostatRunningState.Fan + | ThermostatRunningState.FanStage2 + | ThermostatRunningState.FanStage3 + ): + self._attr_hvac_action = HVACAction.FAN + else: + self._attr_hvac_action = HVACAction.OFF # update target temperature high/low supports_range = ( self._attr_supported_features diff --git a/tests/components/matter/test_climate.py b/tests/components/matter/test_climate.py index 7761d5d27da7..a887ce1b5df6 100644 --- a/tests/components/matter/test_climate.py +++ b/tests/components/matter/test_climate.py @@ -85,6 +85,12 @@ async def test_thermostat_base( assert state assert state.attributes["hvac_action"] == HVACAction.HEATING + set_node_attribute(matter_node, 1, 513, 41, 5) + await trigger_subscription_callback(hass, matter_client) + state = hass.states.get("climate.longan_link_hvac") + assert state + assert state.attributes["hvac_action"] == HVACAction.HEATING + set_node_attribute(matter_node, 1, 513, 41, 8) await trigger_subscription_callback(hass, matter_client) state = hass.states.get("climate.longan_link_hvac") @@ -97,12 +103,24 @@ async def test_thermostat_base( assert state assert state.attributes["hvac_action"] == HVACAction.COOLING + set_node_attribute(matter_node, 1, 513, 41, 6) + await trigger_subscription_callback(hass, matter_client) + state = hass.states.get("climate.longan_link_hvac") + assert state + assert state.attributes["hvac_action"] == HVACAction.COOLING + set_node_attribute(matter_node, 1, 513, 41, 16) await trigger_subscription_callback(hass, matter_client) state = hass.states.get("climate.longan_link_hvac") assert state assert state.attributes["hvac_action"] == HVACAction.COOLING + set_node_attribute(matter_node, 1, 513, 41, 66) + await trigger_subscription_callback(hass, matter_client) + state = hass.states.get("climate.longan_link_hvac") + assert state + assert state.attributes["hvac_action"] == HVACAction.COOLING + set_node_attribute(matter_node, 1, 513, 41, 4) await trigger_subscription_callback(hass, matter_client) state = hass.states.get("climate.longan_link_hvac") @@ -121,7 +139,7 @@ async def test_thermostat_base( assert state assert state.attributes["hvac_action"] == HVACAction.FAN - set_node_attribute(matter_node, 1, 513, 41, 66) + set_node_attribute(matter_node, 1, 513, 41, 128) await trigger_subscription_callback(hass, matter_client) state = hass.states.get("climate.longan_link_hvac") assert state