Fix for missing/corrupt names of Matter devices (#92073)

* Fix missing names on some devices/bridges

* guard for None devicetype (just in case)

* Update homeassistant/components/matter/adapter.py

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>

* Update homeassistant/components/matter/adapter.py

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>

* Update homeassistant/components/matter/adapter.py

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>

* Update homeassistant/components/matter/adapter.py

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>

* black and isort

* Code quality

* Add tests

* Add coverage test, add None for empty string

---------

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
Co-authored-by: jbouwh <jan@jbsoft.nl>
This commit is contained in:
Marcel van der Veldt 2023-05-25 03:50:13 +02:00 committed by GitHub
parent 33387bf418
commit 2bb46c8a9e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 883 additions and 6 deletions

View File

@ -3,6 +3,7 @@ from __future__ import annotations
from typing import TYPE_CHECKING, cast
from matter_server.client.models.device_types import BridgedDevice
from matter_server.common.models import EventType, ServerInfoMessage
from homeassistant.config_entries import ConfigEntry
@ -20,6 +21,14 @@ if TYPE_CHECKING:
from matter_server.client.models.node import MatterEndpoint, MatterNode
def get_clean_name(name: str | None) -> str | None:
"""Strip spaces and null char from the name."""
if name is None:
return name
name = name.replace("\x00", "")
return name.strip() or None
class MatterAdapter:
"""Connect Matter into Home Assistant."""
@ -70,11 +79,27 @@ class MatterAdapter:
server_info = cast(ServerInfoMessage, self.matter_client.server_info)
basic_info = endpoint.device_info
name = basic_info.nodeLabel or basic_info.productLabel or basic_info.productName
# use (first) DeviceType of the endpoint as fallback product name
device_type = next(
(
x
for x in endpoint.device_types
if x.device_type != BridgedDevice.device_type
),
None,
)
name = (
get_clean_name(basic_info.nodeLabel)
or get_clean_name(basic_info.productLabel)
or get_clean_name(basic_info.productName)
or device_type.__class__.__name__
if device_type
else None
)
# handle bridged devices
bridge_device_id = None
if endpoint.is_bridged_device:
if endpoint.is_bridged_device and endpoint.node.endpoints[0] != endpoint:
bridge_device_id = get_device_id(
server_info,
endpoint.node.endpoints[0],
@ -91,14 +116,19 @@ class MatterAdapter:
# prefix identifier with 'serial_' to be able to filter it
identifiers.add((DOMAIN, f"{ID_TYPE_SERIAL}_{basic_info.serialNumber}"))
model = (
get_clean_name(basic_info.productName) or device_type.__class__.__name__
if device_type
else None
)
dr.async_get(self.hass).async_get_or_create(
name=name,
config_entry_id=self.config_entry.entry_id,
identifiers=identifiers,
hw_version=basic_info.hardwareVersionString,
sw_version=basic_info.softwareVersionString,
manufacturer=basic_info.vendorName,
model=basic_info.productName,
manufacturer=basic_info.vendorName or endpoint.node.device_info.vendorName,
model=model,
via_device=(DOMAIN, bridge_device_id) if bridge_device_id else None,
)

View File

@ -0,0 +1,411 @@
{
"node_id": 1,
"date_commissioned": "2022-11-29T21:23:48.485051",
"last_interview": "2022-11-29T21:23:48.485057",
"interview_version": 2,
"attributes": {
"0/4/0": 128,
"0/4/65532": 1,
"0/4/65533": 4,
"0/4/65528": [0, 1, 2, 3],
"0/4/65529": [0, 1, 2, 3, 4, 5],
"0/4/65531": [0, 65528, 65529, 65531, 65532, 65533],
"0/29/0": [
{
"type": 22,
"revision": 1
}
],
"0/29/1": [
4, 29, 31, 40, 42, 43, 44, 48, 49, 50, 51, 52, 53, 54, 55, 59, 60, 62, 63,
64, 65
],
"0/29/2": [41],
"0/29/3": [1],
"0/29/65532": 0,
"0/29/65533": 1,
"0/29/65528": [],
"0/29/65529": [],
"0/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
"0/31/0": [
{
"privilege": 5,
"authMode": 2,
"subjects": [112233],
"targets": null,
"fabricIndex": 1
}
],
"0/31/1": [],
"0/31/2": 4,
"0/31/3": 3,
"0/31/4": 3,
"0/31/65532": 0,
"0/31/65533": 1,
"0/31/65528": [],
"0/31/65529": [],
"0/31/65531": [0, 1, 2, 3, 4, 65528, 65529, 65531, 65532, 65533],
"0/40/0": 1,
"0/40/1": "Nabu Casa",
"0/40/2": 65521,
"0/40/3": "Mock Light",
"0/40/4": 32768,
"0/40/5": "Mock OnOff Light \u0000",
"0/40/6": "XX",
"0/40/7": 0,
"0/40/8": "v1.0",
"0/40/9": 1,
"0/40/10": "v1.0",
"0/40/11": "20200101",
"0/40/12": "",
"0/40/13": "",
"0/40/14": "",
"0/40/15": "12345678",
"0/40/16": false,
"0/40/17": true,
"0/40/18": "mock-onoff-light",
"0/40/19": {
"caseSessionsPerFabric": 3,
"subscriptionsPerFabric": 3
},
"0/40/65532": 0,
"0/40/65533": 1,
"0/40/65528": [],
"0/40/65529": [],
"0/40/65531": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
65528, 65529, 65531, 65532, 65533
],
"0/42/0": [],
"0/42/1": true,
"0/42/2": 0,
"0/42/3": 0,
"0/42/65532": 0,
"0/42/65533": 1,
"0/42/65528": [],
"0/42/65529": [0],
"0/42/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
"0/43/0": "en-US",
"0/43/1": [
"en-US",
"de-DE",
"fr-FR",
"en-GB",
"es-ES",
"zh-CN",
"it-IT",
"ja-JP"
],
"0/43/65532": 0,
"0/43/65533": 1,
"0/43/65528": [],
"0/43/65529": [],
"0/43/65531": [0, 1, 65528, 65529, 65531, 65532, 65533],
"0/44/0": 0,
"0/44/1": 0,
"0/44/2": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 7],
"0/44/65532": 0,
"0/44/65533": 1,
"0/44/65528": [],
"0/44/65529": [],
"0/44/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533],
"0/48/0": 0,
"0/48/1": {
"failSafeExpiryLengthSeconds": 60,
"maxCumulativeFailsafeSeconds": 900
},
"0/48/2": 0,
"0/48/3": 0,
"0/48/4": true,
"0/48/65532": 0,
"0/48/65533": 1,
"0/48/65528": [1, 3, 5],
"0/48/65529": [0, 2, 4],
"0/48/65531": [0, 1, 2, 3, 4, 65528, 65529, 65531, 65532, 65533],
"0/49/0": 1,
"0/49/1": [
{
"networkID": "",
"connected": true
}
],
"0/49/2": 10,
"0/49/3": 30,
"0/49/4": true,
"0/49/5": 0,
"0/49/6": "",
"0/49/7": null,
"0/49/65532": 1,
"0/49/65533": 1,
"0/49/65528": [1, 5, 7],
"0/49/65529": [0, 2, 4, 6, 8],
"0/49/65531": [0, 1, 2, 3, 4, 5, 6, 7, 65528, 65529, 65531, 65532, 65533],
"0/50/65532": 0,
"0/50/65533": 1,
"0/50/65528": [1],
"0/50/65529": [0],
"0/50/65531": [65528, 65529, 65531, 65532, 65533],
"0/51/0": [
{
"name": "WIFI_STA_DEF",
"isOperational": true,
"offPremiseServicesReachableIPv4": null,
"offPremiseServicesReachableIPv6": null,
"hardwareAddress": "",
"IPv4Addresses": [""],
"IPv6Addresses": [],
"type": 1
}
],
"0/51/1": 6,
"0/51/2": 31279,
"0/51/3": 8,
"0/51/4": 1,
"0/51/5": [],
"0/51/6": [],
"0/51/7": [],
"0/51/8": false,
"0/51/65532": 0,
"0/51/65533": 1,
"0/51/65528": [],
"0/51/65529": [0],
"0/51/65531": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 65528, 65529, 65531, 65532, 65533
],
"0/52/0": [],
"0/52/1": 166480,
"0/52/2": 86512,
"0/52/3": 157052,
"0/52/65532": 0,
"0/52/65533": 1,
"0/52/65528": [],
"0/52/65529": [],
"0/52/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
"0/53/65532": 15,
"0/53/65533": 1,
"0/53/65528": [],
"0/53/65529": [0],
"0/53/65531": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 65528, 65529, 65531, 65532, 65533
],
"0/54/0": "",
"0/54/1": 4,
"0/54/2": 3,
"0/54/3": 6,
"0/54/4": -61,
"0/54/5": null,
"0/54/6": null,
"0/54/7": null,
"0/54/8": null,
"0/54/9": null,
"0/54/10": null,
"0/54/11": null,
"0/54/12": null,
"0/54/65532": 3,
"0/54/65533": 1,
"0/54/65528": [],
"0/54/65529": [0],
"0/54/65531": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 65528, 65529, 65531, 65532,
65533
],
"0/55/0": null,
"0/55/1": null,
"0/55/2": 0,
"0/55/3": 0,
"0/55/4": 0,
"0/55/5": 0,
"0/55/6": 0,
"0/55/7": null,
"0/55/8": 0,
"0/55/65532": 3,
"0/55/65533": 1,
"0/55/65528": [],
"0/55/65529": [0],
"0/55/65531": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 65528, 65529, 65531, 65532, 65533
],
"0/59/65532": 0,
"0/59/65533": 1,
"0/59/65528": [],
"0/59/65529": [],
"0/59/65531": [65528, 65529, 65531, 65532, 65533],
"0/60/0": 0,
"0/60/1": null,
"0/60/2": null,
"0/60/65532": 0,
"0/60/65533": 1,
"0/60/65528": [],
"0/60/65529": [0, 1, 2],
"0/60/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533],
"0/62/0": [
{
"noc": "",
"icac": "",
"fabricIndex": 1
}
],
"0/62/1": [
{
"rootPublicKey": "",
"vendorId": 65521,
"fabricId": 1,
"nodeId": 1,
"label": "",
"fabricIndex": 1
}
],
"0/62/2": 5,
"0/62/3": 1,
"0/62/4": [""],
"0/62/5": 1,
"0/62/65532": 0,
"0/62/65533": 1,
"0/62/65528": [1, 3, 5, 8],
"0/62/65529": [0, 2, 4, 6, 7, 9, 10, 11],
"0/62/65531": [0, 1, 2, 3, 4, 5, 65528, 65529, 65531, 65532, 65533],
"0/63/0": [],
"0/63/1": [],
"0/63/2": 3,
"0/63/3": 3,
"0/63/65532": 0,
"0/63/65533": 1,
"0/63/65528": [2, 5],
"0/63/65529": [0, 1, 3, 4],
"0/63/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
"0/64/0": [
{
"label": "room",
"value": "bedroom 2"
},
{
"label": "orientation",
"value": "North"
},
{
"label": "floor",
"value": "2"
},
{
"label": "direction",
"value": "up"
}
],
"0/64/65532": 0,
"0/64/65533": 1,
"0/64/65528": [],
"0/64/65529": [],
"0/64/65531": [0, 65528, 65529, 65531, 65532, 65533],
"0/65/0": [],
"0/65/65532": 0,
"0/65/65533": 1,
"0/65/65528": [],
"0/65/65529": [],
"0/65/65531": [0, 65528, 65529, 65531, 65532, 65533],
"1/3/0": 0,
"1/3/1": 0,
"1/3/65532": 0,
"1/3/65533": 4,
"1/3/65528": [],
"1/3/65529": [0, 64],
"1/3/65531": [0, 1, 65528, 65529, 65531, 65532, 65533],
"1/4/0": 128,
"1/4/65532": 1,
"1/4/65533": 4,
"1/4/65528": [0, 1, 2, 3],
"1/4/65529": [0, 1, 2, 3, 4, 5],
"1/4/65531": [0, 65528, 65529, 65531, 65532, 65533],
"1/6/0": true,
"1/6/16384": true,
"1/6/16385": 0,
"1/6/16386": 0,
"1/6/16387": null,
"1/6/65532": 1,
"1/6/65533": 4,
"1/6/65528": [],
"1/6/65529": [0, 1, 2, 64, 65, 66],
"1/6/65531": [
0, 16384, 16385, 16386, 16387, 65528, 65529, 65531, 65532, 65533
],
"1/8/0": 52,
"1/8/1": 0,
"1/8/2": 1,
"1/8/3": 254,
"1/8/4": 0,
"1/8/5": 0,
"1/8/6": 0,
"1/8/15": 0,
"1/8/16": 0,
"1/8/17": null,
"1/8/18": 0,
"1/8/19": 0,
"1/8/20": 50,
"1/8/16384": null,
"1/8/65532": 3,
"1/8/65533": 5,
"1/8/65528": [],
"1/8/65529": [0, 1, 2, 3, 4, 5, 6, 7],
"1/8/65531": [
0, 1, 2, 3, 4, 5, 6, 15, 16, 17, 18, 19, 20, 16384, 65528, 65529, 65531,
65532, 65533
],
"1/29/0": [
{
"type": 257,
"revision": 1
}
],
"1/29/1": [3, 4, 6, 8, 29, 768, 1030],
"1/29/2": [],
"1/29/3": [],
"1/29/65532": 0,
"1/29/65533": 1,
"1/29/65528": [],
"1/29/65529": [],
"1/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
"1/768/0": 0,
"1/768/1": 0,
"1/768/2": 0,
"1/768/3": 24939,
"1/768/4": 24701,
"1/768/7": 0,
"1/768/8": 2,
"1/768/15": 0,
"1/768/16": 0,
"1/768/16384": 0,
"1/768/16385": 2,
"1/768/16386": 0,
"1/768/16387": 0,
"1/768/16388": 25,
"1/768/16389": 8960,
"1/768/16390": 0,
"1/768/16394": 31,
"1/768/16395": 0,
"1/768/16396": 65279,
"1/768/16397": 0,
"1/768/16400": 0,
"1/768/65532": 31,
"1/768/65533": 5,
"1/768/65528": [],
"1/768/65529": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 64, 65, 66, 67, 68, 71, 75, 76
],
"1/768/65531": [
0, 1, 2, 3, 4, 7, 8, 15, 16, 16384, 16385, 16386, 16387, 16388, 16389,
16390, 16394, 16395, 16396, 16397, 16400, 65528, 65529, 65531, 65532,
65533
],
"1/1030/0": 0,
"1/1030/1": 0,
"1/1030/2": 1,
"1/1030/65532": 0,
"1/1030/65533": 3,
"1/1030/65528": [],
"1/1030/65529": [],
"1/1030/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533]
},
"available": true
}

View File

@ -0,0 +1,411 @@
{
"node_id": 1,
"date_commissioned": "2022-11-29T21:23:48.485051",
"last_interview": "2022-11-29T21:23:48.485057",
"interview_version": 2,
"attributes": {
"0/4/0": 128,
"0/4/65532": 1,
"0/4/65533": 4,
"0/4/65528": [0, 1, 2, 3],
"0/4/65529": [0, 1, 2, 3, 4, 5],
"0/4/65531": [0, 65528, 65529, 65531, 65532, 65533],
"0/29/0": [
{
"type": 22,
"revision": 1
}
],
"0/29/1": [
4, 29, 31, 40, 42, 43, 44, 48, 49, 50, 51, 52, 53, 54, 55, 59, 60, 62, 63,
64, 65
],
"0/29/2": [41],
"0/29/3": [1],
"0/29/65532": 0,
"0/29/65533": 1,
"0/29/65528": [],
"0/29/65529": [],
"0/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
"0/31/0": [
{
"privilege": 5,
"authMode": 2,
"subjects": [112233],
"targets": null,
"fabricIndex": 1
}
],
"0/31/1": [],
"0/31/2": 4,
"0/31/3": 3,
"0/31/4": 3,
"0/31/65532": 0,
"0/31/65533": 1,
"0/31/65528": [],
"0/31/65529": [],
"0/31/65531": [0, 1, 2, 3, 4, 65528, 65529, 65531, 65532, 65533],
"0/40/0": 1,
"0/40/1": "Nabu Casa",
"0/40/2": 65521,
"0/40/3": "Mock Light",
"0/40/4": 32768,
"0/40/5": null,
"0/40/6": "XX",
"0/40/7": 0,
"0/40/8": "v1.0",
"0/40/9": 1,
"0/40/10": "v1.0",
"0/40/11": "20200101",
"0/40/12": "",
"0/40/13": "",
"0/40/14": "",
"0/40/15": "12345678",
"0/40/16": false,
"0/40/17": true,
"0/40/18": "mock-onoff-light",
"0/40/19": {
"caseSessionsPerFabric": 3,
"subscriptionsPerFabric": 3
},
"0/40/65532": 0,
"0/40/65533": 1,
"0/40/65528": [],
"0/40/65529": [],
"0/40/65531": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
65528, 65529, 65531, 65532, 65533
],
"0/42/0": [],
"0/42/1": true,
"0/42/2": 0,
"0/42/3": 0,
"0/42/65532": 0,
"0/42/65533": 1,
"0/42/65528": [],
"0/42/65529": [0],
"0/42/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
"0/43/0": "en-US",
"0/43/1": [
"en-US",
"de-DE",
"fr-FR",
"en-GB",
"es-ES",
"zh-CN",
"it-IT",
"ja-JP"
],
"0/43/65532": 0,
"0/43/65533": 1,
"0/43/65528": [],
"0/43/65529": [],
"0/43/65531": [0, 1, 65528, 65529, 65531, 65532, 65533],
"0/44/0": 0,
"0/44/1": 0,
"0/44/2": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 7],
"0/44/65532": 0,
"0/44/65533": 1,
"0/44/65528": [],
"0/44/65529": [],
"0/44/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533],
"0/48/0": 0,
"0/48/1": {
"failSafeExpiryLengthSeconds": 60,
"maxCumulativeFailsafeSeconds": 900
},
"0/48/2": 0,
"0/48/3": 0,
"0/48/4": true,
"0/48/65532": 0,
"0/48/65533": 1,
"0/48/65528": [1, 3, 5],
"0/48/65529": [0, 2, 4],
"0/48/65531": [0, 1, 2, 3, 4, 65528, 65529, 65531, 65532, 65533],
"0/49/0": 1,
"0/49/1": [
{
"networkID": "",
"connected": true
}
],
"0/49/2": 10,
"0/49/3": 30,
"0/49/4": true,
"0/49/5": 0,
"0/49/6": "",
"0/49/7": null,
"0/49/65532": 1,
"0/49/65533": 1,
"0/49/65528": [1, 5, 7],
"0/49/65529": [0, 2, 4, 6, 8],
"0/49/65531": [0, 1, 2, 3, 4, 5, 6, 7, 65528, 65529, 65531, 65532, 65533],
"0/50/65532": 0,
"0/50/65533": 1,
"0/50/65528": [1],
"0/50/65529": [0],
"0/50/65531": [65528, 65529, 65531, 65532, 65533],
"0/51/0": [
{
"name": "WIFI_STA_DEF",
"isOperational": true,
"offPremiseServicesReachableIPv4": null,
"offPremiseServicesReachableIPv6": null,
"hardwareAddress": "",
"IPv4Addresses": [""],
"IPv6Addresses": [],
"type": 1
}
],
"0/51/1": 6,
"0/51/2": 31279,
"0/51/3": 8,
"0/51/4": 1,
"0/51/5": [],
"0/51/6": [],
"0/51/7": [],
"0/51/8": false,
"0/51/65532": 0,
"0/51/65533": 1,
"0/51/65528": [],
"0/51/65529": [0],
"0/51/65531": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 65528, 65529, 65531, 65532, 65533
],
"0/52/0": [],
"0/52/1": 166480,
"0/52/2": 86512,
"0/52/3": 157052,
"0/52/65532": 0,
"0/52/65533": 1,
"0/52/65528": [],
"0/52/65529": [],
"0/52/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
"0/53/65532": 15,
"0/53/65533": 1,
"0/53/65528": [],
"0/53/65529": [0],
"0/53/65531": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 65528, 65529, 65531, 65532, 65533
],
"0/54/0": "",
"0/54/1": 4,
"0/54/2": 3,
"0/54/3": 6,
"0/54/4": -61,
"0/54/5": null,
"0/54/6": null,
"0/54/7": null,
"0/54/8": null,
"0/54/9": null,
"0/54/10": null,
"0/54/11": null,
"0/54/12": null,
"0/54/65532": 3,
"0/54/65533": 1,
"0/54/65528": [],
"0/54/65529": [0],
"0/54/65531": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 65528, 65529, 65531, 65532,
65533
],
"0/55/0": null,
"0/55/1": null,
"0/55/2": 0,
"0/55/3": 0,
"0/55/4": 0,
"0/55/5": 0,
"0/55/6": 0,
"0/55/7": null,
"0/55/8": 0,
"0/55/65532": 3,
"0/55/65533": 1,
"0/55/65528": [],
"0/55/65529": [0],
"0/55/65531": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 65528, 65529, 65531, 65532, 65533
],
"0/59/65532": 0,
"0/59/65533": 1,
"0/59/65528": [],
"0/59/65529": [],
"0/59/65531": [65528, 65529, 65531, 65532, 65533],
"0/60/0": 0,
"0/60/1": null,
"0/60/2": null,
"0/60/65532": 0,
"0/60/65533": 1,
"0/60/65528": [],
"0/60/65529": [0, 1, 2],
"0/60/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533],
"0/62/0": [
{
"noc": "",
"icac": "",
"fabricIndex": 1
}
],
"0/62/1": [
{
"rootPublicKey": "",
"vendorId": 65521,
"fabricId": 1,
"nodeId": 1,
"label": "",
"fabricIndex": 1
}
],
"0/62/2": 5,
"0/62/3": 1,
"0/62/4": [""],
"0/62/5": 1,
"0/62/65532": 0,
"0/62/65533": 1,
"0/62/65528": [1, 3, 5, 8],
"0/62/65529": [0, 2, 4, 6, 7, 9, 10, 11],
"0/62/65531": [0, 1, 2, 3, 4, 5, 65528, 65529, 65531, 65532, 65533],
"0/63/0": [],
"0/63/1": [],
"0/63/2": 3,
"0/63/3": 3,
"0/63/65532": 0,
"0/63/65533": 1,
"0/63/65528": [2, 5],
"0/63/65529": [0, 1, 3, 4],
"0/63/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
"0/64/0": [
{
"label": "room",
"value": "bedroom 2"
},
{
"label": "orientation",
"value": "North"
},
{
"label": "floor",
"value": "2"
},
{
"label": "direction",
"value": "up"
}
],
"0/64/65532": 0,
"0/64/65533": 1,
"0/64/65528": [],
"0/64/65529": [],
"0/64/65531": [0, 65528, 65529, 65531, 65532, 65533],
"0/65/0": [],
"0/65/65532": 0,
"0/65/65533": 1,
"0/65/65528": [],
"0/65/65529": [],
"0/65/65531": [0, 65528, 65529, 65531, 65532, 65533],
"1/3/0": 0,
"1/3/1": 0,
"1/3/65532": 0,
"1/3/65533": 4,
"1/3/65528": [],
"1/3/65529": [0, 64],
"1/3/65531": [0, 1, 65528, 65529, 65531, 65532, 65533],
"1/4/0": 128,
"1/4/65532": 1,
"1/4/65533": 4,
"1/4/65528": [0, 1, 2, 3],
"1/4/65529": [0, 1, 2, 3, 4, 5],
"1/4/65531": [0, 65528, 65529, 65531, 65532, 65533],
"1/6/0": true,
"1/6/16384": true,
"1/6/16385": 0,
"1/6/16386": 0,
"1/6/16387": null,
"1/6/65532": 1,
"1/6/65533": 4,
"1/6/65528": [],
"1/6/65529": [0, 1, 2, 64, 65, 66],
"1/6/65531": [
0, 16384, 16385, 16386, 16387, 65528, 65529, 65531, 65532, 65533
],
"1/8/0": 52,
"1/8/1": 0,
"1/8/2": 1,
"1/8/3": 254,
"1/8/4": 0,
"1/8/5": 0,
"1/8/6": 0,
"1/8/15": 0,
"1/8/16": 0,
"1/8/17": null,
"1/8/18": 0,
"1/8/19": 0,
"1/8/20": 50,
"1/8/16384": null,
"1/8/65532": 3,
"1/8/65533": 5,
"1/8/65528": [],
"1/8/65529": [0, 1, 2, 3, 4, 5, 6, 7],
"1/8/65531": [
0, 1, 2, 3, 4, 5, 6, 15, 16, 17, 18, 19, 20, 16384, 65528, 65529, 65531,
65532, 65533
],
"1/29/0": [
{
"type": 257,
"revision": 1
}
],
"1/29/1": [3, 4, 6, 8, 29, 768, 1030],
"1/29/2": [],
"1/29/3": [],
"1/29/65532": 0,
"1/29/65533": 1,
"1/29/65528": [],
"1/29/65529": [],
"1/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
"1/768/0": 0,
"1/768/1": 0,
"1/768/2": 0,
"1/768/3": 24939,
"1/768/4": 24701,
"1/768/7": 0,
"1/768/8": 2,
"1/768/15": 0,
"1/768/16": 0,
"1/768/16384": 0,
"1/768/16385": 2,
"1/768/16386": 0,
"1/768/16387": 0,
"1/768/16388": 25,
"1/768/16389": 8960,
"1/768/16390": 0,
"1/768/16394": 31,
"1/768/16395": 0,
"1/768/16396": 65279,
"1/768/16397": 0,
"1/768/16400": 0,
"1/768/65532": 31,
"1/768/65533": 5,
"1/768/65528": [],
"1/768/65529": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 64, 65, 66, 67, 68, 71, 75, 76
],
"1/768/65531": [
0, 1, 2, 3, 4, 7, 8, 15, 16, 16384, 16385, 16386, 16387, 16388, 16389,
16390, 16394, 16395, 16396, 16397, 16400, 65528, 65529, 65531, 65532,
65533
],
"1/1030/0": 0,
"1/1030/1": 0,
"1/1030/2": 1,
"1/1030/65532": 0,
"1/1030/65533": 3,
"1/1030/65528": [],
"1/1030/65529": [],
"1/1030/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533]
},
"available": true
}

View File

@ -8,6 +8,7 @@ from matter_server.common.helpers.util import dataclass_from_dict
from matter_server.common.models import EventType, MatterNodeData
import pytest
from homeassistant.components.matter.adapter import get_clean_name
from homeassistant.components.matter.const import DOMAIN
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr
@ -17,14 +18,24 @@ from .common import load_and_parse_node_fixture, setup_integration_with_node_fix
# This tests needs to be adjusted to remove lingering tasks
@pytest.mark.parametrize("expected_lingering_tasks", [True])
@pytest.mark.parametrize(
("node_fixture", "name"),
[
("onoff-light", "Mock OnOff Light"),
("onoff-light-alt-name", "Mock OnOff Light"),
("onoff-light-no-name", "Mock Light"),
],
)
async def test_device_registry_single_node_device(
hass: HomeAssistant,
matter_client: MagicMock,
node_fixture: str,
name: str,
) -> None:
"""Test bridge devices are set up correctly with via_device."""
await setup_integration_with_node_fixture(
hass,
"onoff-light",
node_fixture,
matter_client,
)
@ -37,7 +48,7 @@ async def test_device_registry_single_node_device(
# test serial id present as additional identifier
assert (DOMAIN, "serial_12345678") in entry.identifiers
assert entry.name == "Mock OnOff Light"
assert entry.name == name
assert entry.manufacturer == "Nabu Casa"
assert entry.model == "Mock Light"
assert entry.hw_version == "v1.0"
@ -145,3 +156,17 @@ async def test_node_added_subscription(
entity_state = hass.states.get("light.mock_onoff_light")
assert entity_state
async def test_get_clean_name_() -> None:
"""Test get_clean_name helper.
Test device names that are assigned to `null`
or have a trailing null char with spaces.
"""
assert get_clean_name(None) is None
assert get_clean_name("\x00") is None
assert get_clean_name(" \x00") is None
assert get_clean_name("") is None
assert get_clean_name("Mock device") == "Mock device"
assert get_clean_name("Mock device \x00") == "Mock device"