Fix Matter vacuum crash on nullable ServiceArea location info (#164411)

This commit is contained in:
Stefan Agner
2026-02-28 00:11:32 +01:00
committed by GitHub
parent 0f4852d8c2
commit 492b542136
8 changed files with 1025 additions and 2 deletions
+3 -2
View File
@@ -168,8 +168,9 @@ class MatterVacuum(MatterEntity, StateVacuumEntity):
segments: dict[str, Segment] = {}
for area in supported_areas:
area_name = None
if area.areaInfo and area.areaInfo.locationInfo:
area_name = area.areaInfo.locationInfo.locationName
location_info = area.areaInfo.locationInfo
if location_info not in (None, clusters.NullValue):
area_name = location_info.locationName
if area_name:
segment_id = str(area.areaID)
+1
View File
@@ -92,6 +92,7 @@ FIXTURES = [
"mock_window_covering_tilt",
"onoff_light_with_levelcontrol_present",
"resideo_x2s_thermostat",
"roborock_saros_10",
"secuyou_smart_lock",
"silabs_dishwasher",
"silabs_evse_charging",
@@ -0,0 +1,540 @@
{
"node_id": 202,
"date_commissioned": "2025-01-01T00:00:00",
"last_interview": "2026-01-01T00:00:00",
"interview_version": 6,
"available": true,
"is_bridge": false,
"attributes": {
"0/29/0": [
{
"0": 22,
"1": 1
}
],
"0/29/1": [29, 31, 40, 48, 49, 50, 51, 60, 62, 63],
"0/29/2": [],
"0/29/3": [1],
"0/29/65533": 2,
"0/29/65532": 0,
"0/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
"0/29/65529": [],
"0/29/65528": [],
"0/31/0": [
{
"1": 5,
"2": 2,
"3": [112233],
"4": null,
"254": 2
}
],
"0/31/2": 4,
"0/31/3": 3,
"0/31/4": 4,
"0/31/65533": 2,
"0/31/65532": 0,
"0/31/65531": [0, 2, 3, 4, 65528, 65529, 65531, 65532, 65533],
"0/31/65529": [],
"0/31/65528": [],
"0/40/0": 18,
"0/40/1": "Roborock",
"0/40/2": 5248,
"0/40/3": "Robotic Vacuum Cleaner",
"0/40/4": 5,
"0/40/5": "",
"0/40/6": "**REDACTED**",
"0/40/7": 2,
"0/40/8": "1.4",
"0/40/9": 2,
"0/40/10": "1.4",
"0/40/13": "https://www.roborock.com",
"0/40/14": "Robotic Vacuum Cleaner",
"0/40/15": "RAPEED12345678",
"0/40/18": "12AB12AB12AB12AB",
"0/40/19": {
"0": 3,
"1": 65535
},
"0/40/21": 17039360,
"0/40/22": 1,
"0/40/24": 1,
"0/40/65533": 4,
"0/40/65532": 0,
"0/40/65531": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 18, 19, 21, 22, 65528,
65529, 65531, 65532, 65533
],
"0/40/65529": [],
"0/40/65528": [],
"0/48/0": 0,
"0/48/1": {
"0": 60,
"1": 900
},
"0/48/2": 0,
"0/48/3": 2,
"0/48/4": true,
"0/48/65533": 2,
"0/48/65532": 0,
"0/48/65531": [0, 1, 2, 3, 4, 65528, 65529, 65531, 65532, 65533],
"0/48/65529": [0, 2, 4],
"0/48/65528": [1, 3, 5],
"0/49/0": 1,
"0/49/1": [],
"0/49/4": true,
"0/49/5": 0,
"0/49/6": null,
"0/49/7": null,
"0/49/2": 30,
"0/49/3": 60,
"0/49/8": [0],
"0/49/65533": 2,
"0/49/65532": 1,
"0/49/65531": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 65528, 65529, 65531, 65532, 65533
],
"0/49/65529": [0, 2, 4, 6, 8],
"0/49/65528": [1, 5, 7],
"0/50/65533": 1,
"0/50/65532": 0,
"0/50/65531": [65528, 65529, 65531, 65532, 65533],
"0/50/65529": [0],
"0/50/65528": [1],
"0/51/0": [
{
"0": "ap0",
"1": false,
"2": null,
"3": null,
"4": "sko58laD",
"5": [],
"6": [],
"7": 0
},
{
"0": "wlan0",
"1": true,
"2": null,
"3": null,
"4": "sEo58laD",
"5": ["wKhQuQ=="],
"6": [
"/XqKrJXsABCySjn//vJWgw==",
"KgIBaTwJABCySjn//vJWgw==",
"/oAAAAAAAACySjn//vJWgw=="
],
"7": 0
},
{
"0": "sit0",
"1": false,
"2": null,
"3": null,
"4": "AAAAAAAA",
"5": [],
"6": [],
"7": 0
},
{
"0": "lo",
"1": true,
"2": null,
"3": null,
"4": "AAAAAAAA",
"5": ["fwAAAQ=="],
"6": ["AAAAAAAAAAAAAAAAAAAAAQ=="],
"7": 0
}
],
"0/51/1": 296,
"0/51/2": 8,
"0/51/3": 6328,
"0/51/8": false,
"0/51/65533": 2,
"0/51/65532": 0,
"0/51/65531": [0, 1, 2, 3, 8, 65528, 65529, 65531, 65532, 65533],
"0/51/65529": [0, 1],
"0/51/65528": [2],
"0/60/0": 0,
"0/60/1": null,
"0/60/2": null,
"0/60/65533": 1,
"0/60/65532": 0,
"0/60/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533],
"0/60/65529": [0, 2],
"0/60/65528": [],
"0/62/0": [
{
"1": "FTABAQEkAgE3AyQTAhgmBIAigScmBYAlTTo3BiQVAiQRyhgkBwEkCAEwCUEEFn0vNfCOD0dTxJ+/vIAsLHsPottGgAzLEYjD0IZda+wcLI6otwL3l70MZK44UQact9g+kLna4RHtR2DtJjzi3DcKNQEoARgkAgE2AwQCBAEYMAQUfe7BMayXJA5FAhU93iHoPeGaicwwBRS9bdraaL8JLSNzrDNJcbicl5ghHRgwC0DAfR8r1sKukiqQw8dPHxQBsDVYjQ2jyerfvkYRSMQGIr9Pr594PCSUazATbDgxf9kvIT7cpAnWVjA1YaYLXSlVGA==",
"2": "FTABAQEkAgE3AyQUARgmBIAigScmBYAlTTo3BiQTAhgkBwEkCAEwCUEEYKwzNQoI9xg/J/BXjm//XmufngPSiphrXcf/ZbJxf7K3k8Xo7I77pwece9Uj8QnKrMMUdloy0sNyxbIPkTGpyjcKNQEpARgkAmAwBBS9bdraaL8JLSNzrDNJcbicl5ghHTAFFBfVqc98NGU0Xt+pmyNVXJvnhDlkGDALQKoRuyZfkC/AbH9qIIxjOhkfJB2ZS8sovhbN1fo+cvSfZXdBw255Ytf9nag0yY2maE5thqhIE4MgGV9jwQ2EPysY",
"254": 2
}
],
"0/62/1": [
{
"1": "BFhpm8fVgw4hzcuwFGwSe59XhvdUHtMntaUUbgCX0jqoaA1fjjcRYrZCA0PDImdLtZSkrUdug3S/euAVf4gvaKo=",
"2": 4939,
"3": 2,
"4": 202,
"5": "Home Assistant",
"254": 2
}
],
"0/62/2": 5,
"0/62/3": 2,
"0/62/4": [
"FTABAQEkAgE3AyQUARgmBIAigScmBYAlTTo3BiQUARgkBwEkCAEwCUEEZGswP7Cx5r/rggyFyL5F/W2s7jQv9jdnF/BtORJ5CJLHyNrJouomrpNPkewkATT25URTzakxfZ/BC2RRof3LQjcKNQEpARgkAmAwBBSwDB1/C2jgnr2LPAd9KH/07G7HSjAFFLAMHX8LaOCevYs8B30of/TsbsdKGDALQGEJod+l+O0QOa/rnbYaghE4QgquJyT9pviD3sP2+MbUXJj1br+dZLQ7CfeCKfbM8EO9iPAe1ULLveIFfHakCpAY",
"FTABAQEkAgE3AyQUARgmBIAigScmBYAlTTo3BiQUARgkBwEkCAEwCUEEDheXhz87ejqXrjJrfcRfXbv1Co84yVLcfxYr3Q4VM5Fx0JCbQDNTmqeZ/BC67MDnaqXhrPHz6tPXjC7kar6RLDcKNQEpARgkAmAwBBQX1anPfDRlNF7fqZsjVVyb54Q5ZDAFFBfVqc98NGU0Xt+pmyNVXJvnhDlkGDALQFQj3btpuzZU/TNTTTh2Q/bUE8TTOP7U4kV4J8VNyl/phUUHSfnTAnaTR/YcUehZcgPJqnW6433HWTjsa8lopVMY"
],
"0/62/5": 2,
"0/62/65533": 1,
"0/62/65532": 0,
"0/62/65531": [0, 1, 2, 3, 4, 5, 65528, 65529, 65531, 65532, 65533],
"0/62/65529": [0, 2, 4, 6, 7, 9, 10, 11],
"0/62/65528": [1, 3, 5, 8],
"0/63/0": [],
"0/63/1": [],
"0/63/2": 4,
"0/63/3": 3,
"0/63/65533": 2,
"0/63/65532": 0,
"0/63/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
"0/63/65529": [0, 1, 3, 4],
"0/63/65528": [2, 5],
"1/29/0": [
{
"0": 17,
"1": 1
},
{
"0": 116,
"1": 1
}
],
"1/29/1": [3, 29, 47, 84, 85, 97, 336],
"1/29/2": [],
"1/29/3": [],
"1/29/65533": 2,
"1/29/65532": 0,
"1/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
"1/29/65529": [],
"1/29/65528": [],
"1/3/0": 0,
"1/3/1": 3,
"1/3/65533": 5,
"1/3/65532": 0,
"1/3/65531": [0, 1, 65528, 65529, 65531, 65532, 65533],
"1/3/65529": [0],
"1/3/65528": [],
"1/336/0": [
{
"0": 1,
"1": 0,
"2": {
"0": {
"0": "Living room",
"1": null,
"2": 52
},
"1": null
}
},
{
"0": 2,
"1": 0,
"2": {
"0": {
"0": "Bathroom",
"1": null,
"2": 6
},
"1": null
}
},
{
"0": 3,
"1": 0,
"2": {
"0": {
"0": "Bedroom",
"1": null,
"2": 7
},
"1": null
}
},
{
"0": 4,
"1": 0,
"2": {
"0": {
"0": "Office",
"1": null,
"2": 88
},
"1": null
}
},
{
"0": 5,
"1": 0,
"2": {
"0": {
"0": "Corridor",
"1": null,
"2": 16
},
"1": null
}
},
{
"0": 6,
"1": 0,
"2": {
"0": null,
"1": {
"0": 17,
"1": 2
}
}
},
{
"0": 7,
"1": 0,
"2": {
"0": null,
"1": {
"0": 43,
"1": 2
}
}
}
],
"1/336/2": [],
"1/336/65533": 1,
"1/336/65532": 4,
"1/336/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533],
"1/336/65529": [0],
"1/336/65528": [1],
"1/336/1": [
{
"0": 0,
"1": "Map-0"
}
],
"1/47/0": 1,
"1/47/1": 0,
"1/47/2": "Primary Battery",
"1/47/31": [],
"1/47/12": 200,
"1/47/14": 0,
"1/47/15": false,
"1/47/16": 3,
"1/47/17": true,
"1/47/26": 2,
"1/47/28": true,
"1/47/65533": 3,
"1/47/65532": 6,
"1/47/65531": [
0, 1, 2, 12, 14, 15, 16, 17, 26, 28, 31, 65528, 65529, 65531, 65532, 65533
],
"1/47/65529": [],
"1/47/65528": [],
"1/84/0": [
{
"label": "Idle",
"mode": 0,
"modeTags": [
{
"value": 16384
}
]
},
{
"label": "Cleaning",
"mode": 1,
"modeTags": [
{
"value": 16385
}
]
},
{
"label": "Mapping",
"mode": 2,
"modeTags": [
{
"value": 16386
}
]
}
],
"1/84/1": 0,
"1/84/65533": 3,
"1/84/65532": 0,
"1/84/65531": [0, 1, 65528, 65529, 65531, 65532, 65533],
"1/84/65529": [0],
"1/84/65528": [1],
"1/85/0": [
{
"label": "Quiet, Vacuum Only",
"mode": 1,
"modeTags": [
{
"value": 2
},
{
"value": 16385
}
]
},
{
"label": "Auto, Vacuum Only",
"mode": 2,
"modeTags": [
{
"value": 0
},
{
"value": 16385
}
]
},
{
"label": "Deep Clean, Vacuum Only",
"mode": 3,
"modeTags": [
{
"value": 16384
},
{
"value": 16385
}
]
},
{
"label": "Quiet, Mop Only",
"mode": 4,
"modeTags": [
{
"value": 2
},
{
"value": 16386
}
]
},
{
"label": "Auto, Mop Only",
"mode": 5,
"modeTags": [
{
"value": 0
},
{
"value": 16386
}
]
},
{
"label": "Deep Clean, Mop Only",
"mode": 6,
"modeTags": [
{
"value": 16384
},
{
"value": 16386
}
]
},
{
"label": "Quiet, Vacuum and Mop",
"mode": 7,
"modeTags": [
{
"value": 2
},
{
"value": 16385
},
{
"value": 16386
}
]
},
{
"label": "Auto, Vacuum and Mop",
"mode": 8,
"modeTags": [
{
"value": 0
},
{
"value": 16385
},
{
"value": 16386
}
]
},
{
"label": "Deep Clean, Vacuum and Mop",
"mode": 9,
"modeTags": [
{
"value": 16384
},
{
"value": 16385
},
{
"value": 16386
}
]
}
],
"1/85/1": 8,
"1/85/65533": 3,
"1/85/65532": 0,
"1/85/65531": [0, 1, 65528, 65529, 65531, 65532, 65533],
"1/85/65529": [0],
"1/85/65528": [1],
"1/97/0": null,
"1/97/1": null,
"1/97/3": [
{
"0": 0
},
{
"0": 1
},
{
"0": 2
},
{
"0": 3
},
{
"0": 64
},
{
"0": 65
},
{
"0": 66
}
],
"1/97/4": 66,
"1/97/5": {
"0": 0
},
"1/97/65533": 2,
"1/97/65532": 0,
"1/97/65531": [0, 1, 3, 4, 5, 65528, 65529, 65531, 65532, 65533],
"1/97/65529": [0, 3, 128],
"1/97/65528": [4]
},
"attribute_subscriptions": []
}
@@ -3485,6 +3485,56 @@
'state': 'unknown',
})
# ---
# name: test_buttons[roborock_saros_10][button.robotic_vacuum_cleaner_identify-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'button',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'button.robotic_vacuum_cleaner_identify',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Identify',
'options': dict({
}),
'original_device_class': <ButtonDeviceClass.IDENTIFY: 'identify'>,
'original_icon': None,
'original_name': 'Identify',
'platform': 'matter',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '00000000000004D2-00000000000000CA-MatterNodeDevice-1-IdentifyButton-3-1',
'unit_of_measurement': None,
})
# ---
# name: test_buttons[roborock_saros_10][button.robotic_vacuum_cleaner_identify-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'identify',
'friendly_name': 'Robotic Vacuum Cleaner Identify',
}),
'context': <ANY>,
'entity_id': 'button.robotic_vacuum_cleaner_identify',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_buttons[secuyou_smart_lock][button.secuyou_smart_lock_identify-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
@@ -3995,6 +3995,78 @@
'state': 'previous',
})
# ---
# name: test_selects[roborock_saros_10][select.robotic_vacuum_cleaner_clean_mode-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'Quiet, Vacuum Only',
'Auto, Vacuum Only',
'Deep Clean, Vacuum Only',
'Quiet, Mop Only',
'Auto, Mop Only',
'Deep Clean, Mop Only',
'Quiet, Vacuum and Mop',
'Auto, Vacuum and Mop',
'Deep Clean, Vacuum and Mop',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'select',
'entity_category': None,
'entity_id': 'select.robotic_vacuum_cleaner_clean_mode',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Clean mode',
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Clean mode',
'platform': 'matter',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'clean_mode',
'unique_id': '00000000000004D2-00000000000000CA-MatterNodeDevice-1-MatterRvcCleanMode-85-1',
'unit_of_measurement': None,
})
# ---
# name: test_selects[roborock_saros_10][select.robotic_vacuum_cleaner_clean_mode-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Robotic Vacuum Cleaner Clean mode',
'options': list([
'Quiet, Vacuum Only',
'Auto, Vacuum Only',
'Deep Clean, Vacuum Only',
'Quiet, Mop Only',
'Auto, Mop Only',
'Deep Clean, Mop Only',
'Quiet, Vacuum and Mop',
'Auto, Vacuum and Mop',
'Deep Clean, Vacuum and Mop',
]),
}),
'context': <ANY>,
'entity_id': 'select.robotic_vacuum_cleaner_clean_mode',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'Auto, Vacuum and Mop',
})
# ---
# name: test_selects[secuyou_smart_lock][select.secuyou_smart_lock_operating_mode-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
@@ -11473,6 +11473,283 @@
'state': '20.55',
})
# ---
# name: test_sensors[roborock_saros_10][sensor.robotic_vacuum_cleaner_battery-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.robotic_vacuum_cleaner_battery',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Battery',
'options': dict({
}),
'original_device_class': <SensorDeviceClass.BATTERY: 'battery'>,
'original_icon': None,
'original_name': 'Battery',
'platform': 'matter',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '00000000000004D2-00000000000000CA-MatterNodeDevice-1-PowerSource-47-12',
'unit_of_measurement': '%',
})
# ---
# name: test_sensors[roborock_saros_10][sensor.robotic_vacuum_cleaner_battery-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'battery',
'friendly_name': 'Robotic Vacuum Cleaner Battery',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'sensor.robotic_vacuum_cleaner_battery',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '100',
})
# ---
# name: test_sensors[roborock_saros_10][sensor.robotic_vacuum_cleaner_battery_charge_state-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'not_charging',
'charging',
'full_charge',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.robotic_vacuum_cleaner_battery_charge_state',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Battery charge state',
'options': dict({
}),
'original_device_class': <SensorDeviceClass.ENUM: 'enum'>,
'original_icon': None,
'original_name': 'Battery charge state',
'platform': 'matter',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'battery_charge_state',
'unique_id': '00000000000004D2-00000000000000CA-MatterNodeDevice-1-PowerSourceBatChargeState-47-26',
'unit_of_measurement': None,
})
# ---
# name: test_sensors[roborock_saros_10][sensor.robotic_vacuum_cleaner_battery_charge_state-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'enum',
'friendly_name': 'Robotic Vacuum Cleaner Battery charge state',
'options': list([
'not_charging',
'charging',
'full_charge',
]),
}),
'context': <ANY>,
'entity_id': 'sensor.robotic_vacuum_cleaner_battery_charge_state',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'full_charge',
})
# ---
# name: test_sensors[roborock_saros_10][sensor.robotic_vacuum_cleaner_operational_error-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'no_error',
'unable_to_start_or_resume',
'unable_to_complete_operation',
'command_invalid_in_state',
'failed_to_find_charging_dock',
'stuck',
'dust_bin_missing',
'dust_bin_full',
'water_tank_empty',
'water_tank_missing',
'water_tank_lid_open',
'mop_cleaning_pad_missing',
'low_battery',
'cannot_reach_target_area',
'dirty_water_tank_full',
'dirty_water_tank_missing',
'wheels_jammed',
'brush_jammed',
'navigation_sensor_obscured',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.robotic_vacuum_cleaner_operational_error',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Operational error',
'options': dict({
}),
'original_device_class': <SensorDeviceClass.ENUM: 'enum'>,
'original_icon': None,
'original_name': 'Operational error',
'platform': 'matter',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'operational_error',
'unique_id': '00000000000004D2-00000000000000CA-MatterNodeDevice-1-RvcOperationalStateOperationalError-97-5',
'unit_of_measurement': None,
})
# ---
# name: test_sensors[roborock_saros_10][sensor.robotic_vacuum_cleaner_operational_error-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'enum',
'friendly_name': 'Robotic Vacuum Cleaner Operational error',
'options': list([
'no_error',
'unable_to_start_or_resume',
'unable_to_complete_operation',
'command_invalid_in_state',
'failed_to_find_charging_dock',
'stuck',
'dust_bin_missing',
'dust_bin_full',
'water_tank_empty',
'water_tank_missing',
'water_tank_lid_open',
'mop_cleaning_pad_missing',
'low_battery',
'cannot_reach_target_area',
'dirty_water_tank_full',
'dirty_water_tank_missing',
'wheels_jammed',
'brush_jammed',
'navigation_sensor_obscured',
]),
}),
'context': <ANY>,
'entity_id': 'sensor.robotic_vacuum_cleaner_operational_error',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'no_error',
})
# ---
# name: test_sensors[roborock_saros_10][sensor.robotic_vacuum_cleaner_operational_state-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'stopped',
'running',
'paused',
'error',
'seeking_charger',
'charging',
'docked',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.robotic_vacuum_cleaner_operational_state',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Operational state',
'options': dict({
}),
'original_device_class': <SensorDeviceClass.ENUM: 'enum'>,
'original_icon': None,
'original_name': 'Operational state',
'platform': 'matter',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'operational_state',
'unique_id': '00000000000004D2-00000000000000CA-MatterNodeDevice-1-RvcOperationalState-97-4',
'unit_of_measurement': None,
})
# ---
# name: test_sensors[roborock_saros_10][sensor.robotic_vacuum_cleaner_operational_state-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'enum',
'friendly_name': 'Robotic Vacuum Cleaner Operational state',
'options': list([
'stopped',
'running',
'paused',
'error',
'seeking_charger',
'charging',
'docked',
]),
}),
'context': <ANY>,
'entity_id': 'sensor.robotic_vacuum_cleaner_operational_state',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'docked',
})
# ---
# name: test_sensors[silabs_dishwasher][sensor.dishwasher_effective_current-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
@@ -149,6 +149,56 @@
'state': 'idle',
})
# ---
# name: test_vacuum[roborock_saros_10][vacuum.robotic_vacuum_cleaner-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'vacuum',
'entity_category': None,
'entity_id': 'vacuum.robotic_vacuum_cleaner',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': None,
'platform': 'matter',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': <VacuumEntityFeature: 29212>,
'translation_key': 'vacuum',
'unique_id': '00000000000004D2-00000000000000CA-MatterNodeDevice-1-MatterVacuumCleaner-84-1',
'unit_of_measurement': None,
})
# ---
# name: test_vacuum[roborock_saros_10][vacuum.robotic_vacuum_cleaner-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Robotic Vacuum Cleaner',
'supported_features': <VacuumEntityFeature: 29212>,
}),
'context': <ANY>,
'entity_id': 'vacuum.robotic_vacuum_cleaner',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'docked',
})
# ---
# name: test_vacuum[switchbot_k11_plus][vacuum.k11-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
+32
View File
@@ -338,6 +338,38 @@ async def test_vacuum_get_segments(
assert segments[2] == {"id": "2290649224", "name": "My Location C", "group": None}
@pytest.mark.parametrize("node_fixture", ["roborock_saros_10"])
async def test_vacuum_get_segments_nullable_location_info(
hass: HomeAssistant,
matter_node: MatterNode,
hass_ws_client: WebSocketGenerator,
) -> None:
"""Test vacuum get_segments handles nullable ServiceArea location info."""
await async_setup_component(hass, "homeassistant", {})
assert matter_node
entity_ids = [state.entity_id for state in hass.states.async_all("vacuum")]
assert len(entity_ids) == 1
entity_id = entity_ids[0]
state = hass.states.get(entity_id)
assert state
client = await hass_ws_client(hass)
await client.send_json_auto_id(
{"type": "vacuum/get_segments", "entity_id": entity_id}
)
msg = await client.receive_json()
assert msg["success"]
assert msg["result"]["segments"] == [
{"id": "1", "name": "Living room", "group": None},
{"id": "2", "name": "Bathroom", "group": None},
{"id": "3", "name": "Bedroom", "group": None},
{"id": "4", "name": "Office", "group": None},
{"id": "5", "name": "Corridor", "group": None},
]
@pytest.mark.parametrize("node_fixture", ["mock_vacuum_cleaner"])
async def test_vacuum_clean_area(
hass: HomeAssistant,