mirror of
https://github.com/home-assistant/core.git
synced 2026-08-24 10:13:52 -05:00
Fix Matter vacuum crash on nullable ServiceArea location info (#164411)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user