Fix status checks in Matter binary sensors (#156276)

This PR fixes bitmap bit checking logic in Matter binary sensors by replacing equality comparisons with bitwise AND operations. The changes correct how the integration checks if specific bits are set in bitmap fields.

Key changes:

Changed equality checks (==) to bitwise AND operations (&) for checking bitmap bits
Wrapped bitwise operations with bool() to ensure boolean return values
Applied fixes consistently across PumpStatus, DishwasherAlarm, and RefrigeratorAlarm bitmaps
This commit is contained in:
Ludovic BOUÉ
2025-11-10 19:45:17 +01:00
committed by GitHub
parent 7b4f5ad362
commit 8429f154ca
2 changed files with 43 additions and 22 deletions

View File

@@ -353,17 +353,13 @@ DISCOVERY_SCHEMAS = [
device_class=BinarySensorDeviceClass.PROBLEM,
entity_category=EntityCategory.DIAGNOSTIC,
# DeviceFault or SupplyFault bit enabled
device_to_ha={
clusters.PumpConfigurationAndControl.Bitmaps.PumpStatusBitmap.kDeviceFault: True,
clusters.PumpConfigurationAndControl.Bitmaps.PumpStatusBitmap.kSupplyFault: True,
clusters.PumpConfigurationAndControl.Bitmaps.PumpStatusBitmap.kSpeedLow: False,
clusters.PumpConfigurationAndControl.Bitmaps.PumpStatusBitmap.kSpeedHigh: False,
clusters.PumpConfigurationAndControl.Bitmaps.PumpStatusBitmap.kLocalOverride: False,
clusters.PumpConfigurationAndControl.Bitmaps.PumpStatusBitmap.kRunning: False,
clusters.PumpConfigurationAndControl.Bitmaps.PumpStatusBitmap.kRemotePressure: False,
clusters.PumpConfigurationAndControl.Bitmaps.PumpStatusBitmap.kRemoteFlow: False,
clusters.PumpConfigurationAndControl.Bitmaps.PumpStatusBitmap.kRemoteTemperature: False,
}.get,
device_to_ha=lambda x: bool(
x
& (
clusters.PumpConfigurationAndControl.Bitmaps.PumpStatusBitmap.kDeviceFault
| clusters.PumpConfigurationAndControl.Bitmaps.PumpStatusBitmap.kSupplyFault
)
),
),
entity_class=MatterBinarySensor,
required_attributes=(
@@ -377,9 +373,9 @@ DISCOVERY_SCHEMAS = [
key="PumpStatusRunning",
translation_key="pump_running",
device_class=BinarySensorDeviceClass.RUNNING,
device_to_ha=lambda x: (
device_to_ha=lambda x: bool(
x
== clusters.PumpConfigurationAndControl.Bitmaps.PumpStatusBitmap.kRunning
& clusters.PumpConfigurationAndControl.Bitmaps.PumpStatusBitmap.kRunning
),
),
entity_class=MatterBinarySensor,
@@ -395,8 +391,8 @@ DISCOVERY_SCHEMAS = [
translation_key="dishwasher_alarm_inflow",
device_class=BinarySensorDeviceClass.PROBLEM,
entity_category=EntityCategory.DIAGNOSTIC,
device_to_ha=lambda x: (
x == clusters.DishwasherAlarm.Bitmaps.AlarmBitmap.kInflowError
device_to_ha=lambda x: bool(
x & clusters.DishwasherAlarm.Bitmaps.AlarmBitmap.kInflowError
),
),
entity_class=MatterBinarySensor,
@@ -410,8 +406,8 @@ DISCOVERY_SCHEMAS = [
translation_key="alarm_door",
device_class=BinarySensorDeviceClass.PROBLEM,
entity_category=EntityCategory.DIAGNOSTIC,
device_to_ha=lambda x: (
x == clusters.DishwasherAlarm.Bitmaps.AlarmBitmap.kDoorError
device_to_ha=lambda x: bool(
x & clusters.DishwasherAlarm.Bitmaps.AlarmBitmap.kDoorError
),
),
entity_class=MatterBinarySensor,
@@ -481,8 +477,8 @@ DISCOVERY_SCHEMAS = [
translation_key="alarm_door",
device_class=BinarySensorDeviceClass.PROBLEM,
entity_category=EntityCategory.DIAGNOSTIC,
device_to_ha=lambda x: (
x == clusters.RefrigeratorAlarm.Bitmaps.AlarmBitmap.kDoorOpen
device_to_ha=lambda x: bool(
x & clusters.RefrigeratorAlarm.Bitmaps.AlarmBitmap.kDoorOpen
),
),
entity_class=MatterBinarySensor,

View File

@@ -239,11 +239,12 @@ async def test_pump(
assert state
assert state.state == "off"
# PumpStatus --> DeviceFault bit
# Initial state: kRunning bit only (no fault bits) should be off
state = hass.states.get("binary_sensor.mock_pump_problem")
assert state
assert state.state == "unknown"
assert state.state == "off"
# Set DeviceFault bit
set_node_attribute(matter_node, 1, 512, 16, 1)
await trigger_subscription_callback(hass, matter_client)
@@ -251,7 +252,14 @@ async def test_pump(
assert state
assert state.state == "on"
# PumpStatus --> SupplyFault bit
# Clear all bits - problem sensor should be off
set_node_attribute(matter_node, 1, 512, 16, 0)
await trigger_subscription_callback(hass, matter_client)
state = hass.states.get("binary_sensor.mock_pump_problem")
assert state
assert state.state == "off"
# Set SupplyFault bit
set_node_attribute(matter_node, 1, 512, 16, 2)
await trigger_subscription_callback(hass, matter_client)
@@ -270,6 +278,7 @@ async def test_dishwasher_alarm(
state = hass.states.get("binary_sensor.dishwasher_door_alarm")
assert state
# set DoorAlarm alarm
set_node_attribute(matter_node, 1, 93, 2, 4)
await trigger_subscription_callback(hass, matter_client)
@@ -277,6 +286,22 @@ async def test_dishwasher_alarm(
assert state
assert state.state == "on"
# clear DoorAlarm alarm
set_node_attribute(matter_node, 1, 93, 2, 0)
await trigger_subscription_callback(hass, matter_client)
state = hass.states.get("binary_sensor.dishwasher_inflow_alarm")
assert state
assert state.state == "off"
# set InflowError alarm
set_node_attribute(matter_node, 1, 93, 2, 1)
await trigger_subscription_callback(hass, matter_client)
state = hass.states.get("binary_sensor.dishwasher_inflow_alarm")
assert state
assert state.state == "on"
@pytest.mark.parametrize("node_fixture", ["valve"])
async def test_water_valve(