Fix Matter water heater off mode (#167286)

Co-authored-by: Ludovic BOUÉ <132135057+lboue@users.noreply.github.com>
This commit is contained in:
Ludovic BOUÉ
2026-04-03 16:01:12 +00:00
committed by Franck Nijhof
co-authored by Ludovic BOUÉ
parent f93fdceac9
commit 02f1a9c3a9
2 changed files with 21 additions and 1 deletions
@@ -168,10 +168,15 @@ class MatterWaterHeater(MatterEntity, WaterHeaterEntity):
self._attr_target_temperature = self._get_temperature_in_degrees(
clusters.Thermostat.Attributes.OccupiedHeatingSetpoint
)
system_mode = self.get_matter_attribute_value(
clusters.Thermostat.Attributes.SystemMode
)
boost_state = self.get_matter_attribute_value(
clusters.WaterHeaterManagement.Attributes.BoostState
)
if boost_state == clusters.WaterHeaterManagement.Enums.BoostStateEnum.kActive:
if system_mode == clusters.Thermostat.Enums.SystemModeEnum.kOff:
self._attr_current_operation = STATE_OFF
elif boost_state == clusters.WaterHeaterManagement.Enums.BoostStateEnum.kActive:
self._attr_current_operation = STATE_HIGH_DEMAND
else:
self._attr_current_operation = STATE_ECO
@@ -218,6 +223,7 @@ DISCOVERY_SCHEMAS = [
clusters.Thermostat.Attributes.AbsMinHeatSetpointLimit,
clusters.Thermostat.Attributes.AbsMaxHeatSetpointLimit,
clusters.Thermostat.Attributes.LocalTemperature,
clusters.Thermostat.Attributes.SystemMode,
clusters.WaterHeaterManagement.Attributes.FeatureMap,
),
optional_attributes=(
@@ -226,6 +226,20 @@ async def test_update_from_water_heater(
assert state
assert state.state == STATE_ECO
# confirm water heater state is 'off' when SystemMode is set to 0 (kOff)
set_node_attribute(matter_node, 2, 513, 28, 0)
await trigger_subscription_callback(hass, matter_client)
state = hass.states.get(entity_id)
assert state
assert state.state == STATE_OFF
# confirm water heater state returns to 'eco' when SystemMode is set back to 4 (kHeat)
set_node_attribute(matter_node, 2, 513, 28, 4)
await trigger_subscription_callback(hass, matter_client)
state = hass.states.get(entity_id)
assert state
assert state.state == STATE_ECO
@pytest.mark.parametrize("node_fixture", ["silabs_water_heater"])
async def test_water_heater_turn_on_off(