diff --git a/homeassistant/components/thread/discovery.py b/homeassistant/components/thread/discovery.py index d07469f36fb..ce721a20e28 100644 --- a/homeassistant/components/thread/discovery.py +++ b/homeassistant/components/thread/discovery.py @@ -32,6 +32,7 @@ class ThreadRouterDiscoveryData: """Thread router discovery data.""" addresses: list[str] | None + border_agent_id: str | None brand: str | None extended_address: str | None extended_pan_id: str | None @@ -61,13 +62,16 @@ def async_discovery_data_from_service( # For legacy backwards compatibility zeroconf allows properties to be set # as strings but we never do that so we can safely cast here. service_properties = cast(dict[bytes, bytes | None], service.properties) + + border_agent_id = service_properties.get(b"id") ext_addr = service_properties.get(b"xa") ext_pan_id = service_properties.get(b"xp") - network_name = try_decode(service_properties.get(b"nn")) model_name = try_decode(service_properties.get(b"mn")) + network_name = try_decode(service_properties.get(b"nn")) server = service.server - vendor_name = try_decode(service_properties.get(b"vn")) thread_version = try_decode(service_properties.get(b"tv")) + vendor_name = try_decode(service_properties.get(b"vn")) + unconfigured = None brand = KNOWN_BRANDS.get(vendor_name) if brand == "homeassistant": @@ -84,6 +88,7 @@ def async_discovery_data_from_service( return ThreadRouterDiscoveryData( addresses=service.parsed_addresses(), + border_agent_id=border_agent_id.hex() if border_agent_id is not None else None, brand=brand, extended_address=ext_addr.hex() if ext_addr is not None else None, extended_pan_id=ext_pan_id.hex() if ext_pan_id is not None else None, diff --git a/tests/components/thread/__init__.py b/tests/components/thread/__init__.py index e7435b8e94a..f9d527919b4 100644 --- a/tests/components/thread/__init__.py +++ b/tests/components/thread/__init__.py @@ -93,6 +93,7 @@ ROUTER_DISCOVERY_HASS = { "server": "core-silabs-multiprotocol.local.", "properties": { b"rv": b"1", + b"id": b"#\x0cj\x1a\xc5\x7foK\xe2b\xac\xf3.^\xf5,", b"vn": b"HomeAssistant", b"mn": b"OpenThreadBorderRouter", b"nn": b"OpenThread HC", @@ -105,6 +106,7 @@ ROUTER_DISCOVERY_HASS = { b"sq": b"3", b"bb": b"\xf0\xbf", b"dn": b"DefaultDomain", + b"omr": b"@\xfd \xbe\x89IZ\x00\x01", }, "interface_index": None, } @@ -119,6 +121,7 @@ ROUTER_DISCOVERY_HASS_BAD_DATA = { "server": "core-silabs-multiprotocol.local.", "properties": { b"rv": b"1", + b"id": b"#\x0cj\x1a\xc5\x7foK\xe2b\xac\xf3.^\xf5,", b"vn": b"HomeAssistant\xff", # Invalid UTF-8 b"mn": b"OpenThreadBorderRouter", b"nn": b"OpenThread HC", @@ -131,6 +134,7 @@ ROUTER_DISCOVERY_HASS_BAD_DATA = { b"sq": b"3", b"bb": b"\xf0\xbf", b"dn": b"DefaultDomain", + b"omr": b"@\xfd \xbe\x89IZ\x00\x01", }, "interface_index": None, } @@ -145,6 +149,7 @@ ROUTER_DISCOVERY_HASS_MISSING_DATA = { "server": "core-silabs-multiprotocol.local.", "properties": { b"rv": b"1", + b"id": b"#\x0cj\x1a\xc5\x7foK\xe2b\xac\xf3.^\xf5,", b"mn": b"OpenThreadBorderRouter", b"nn": b"OpenThread HC", b"xp": b"\xe6\x0f\xc7\xc1\x86!,\xe5", @@ -156,6 +161,7 @@ ROUTER_DISCOVERY_HASS_MISSING_DATA = { b"sq": b"3", b"bb": b"\xf0\xbf", b"dn": b"DefaultDomain", + b"omr": b"@\xfd \xbe\x89IZ\x00\x01", }, "interface_index": None, } @@ -171,6 +177,7 @@ ROUTER_DISCOVERY_HASS_MISSING_MANDATORY_DATA = { "server": "core-silabs-multiprotocol.local.", "properties": { b"rv": b"1", + b"id": b"#\x0cj\x1a\xc5\x7foK\xe2b\xac\xf3.^\xf5,", b"vn": b"HomeAssistant", b"mn": b"OpenThreadBorderRouter", b"nn": b"OpenThread HC", @@ -182,6 +189,7 @@ ROUTER_DISCOVERY_HASS_MISSING_MANDATORY_DATA = { b"sq": b"3", b"bb": b"\xf0\xbf", b"dn": b"DefaultDomain", + b"omr": b"@\xfd \xbe\x89IZ\x00\x01", }, "interface_index": None, } @@ -197,6 +205,7 @@ ROUTER_DISCOVERY_HASS_NO_ACTIVE_TIMESTAMP = { "server": "core-silabs-multiprotocol.local.", "properties": { b"rv": b"1", + b"id": b"#\x0cj\x1a\xc5\x7foK\xe2b\xac\xf3.^\xf5,", b"vn": b"HomeAssistant", b"mn": b"OpenThreadBorderRouter", b"nn": b"OpenThread HC", @@ -208,6 +217,7 @@ ROUTER_DISCOVERY_HASS_NO_ACTIVE_TIMESTAMP = { b"sq": b"3", b"bb": b"\xf0\xbf", b"dn": b"DefaultDomain", + b"omr": b"@\xfd \xbe\x89IZ\x00\x01", }, "interface_index": None, } @@ -223,6 +233,7 @@ ROUTER_DISCOVERY_HASS_NO_STATE_BITMAP = { "server": "core-silabs-multiprotocol.local.", "properties": { b"rv": b"1", + b"id": b"#\x0cj\x1a\xc5\x7foK\xe2b\xac\xf3.^\xf5,", b"vn": b"HomeAssistant", b"mn": b"OpenThreadBorderRouter", b"nn": b"OpenThread HC", @@ -234,6 +245,7 @@ ROUTER_DISCOVERY_HASS_NO_STATE_BITMAP = { b"sq": b"3", b"bb": b"\xf0\xbf", b"dn": b"DefaultDomain", + b"omr": b"@\xfd \xbe\x89IZ\x00\x01", }, "interface_index": None, } @@ -249,6 +261,7 @@ ROUTER_DISCOVERY_HASS_BAD_STATE_BITMAP = { "server": "core-silabs-multiprotocol.local.", "properties": { b"rv": b"1", + b"id": b"#\x0cj\x1a\xc5\x7foK\xe2b\xac\xf3.^\xf5,", b"vn": b"HomeAssistant", b"mn": b"OpenThreadBorderRouter", b"nn": b"OpenThread HC", @@ -261,6 +274,7 @@ ROUTER_DISCOVERY_HASS_BAD_STATE_BITMAP = { b"sq": b"3", b"bb": b"\xf0\xbf", b"dn": b"DefaultDomain", + b"omr": b"@\xfd \xbe\x89IZ\x00\x01", }, "interface_index": None, } @@ -276,6 +290,7 @@ ROUTER_DISCOVERY_HASS_STATE_BITMAP_NOT_ACTIVE = { "server": "core-silabs-multiprotocol.local.", "properties": { b"rv": b"1", + b"id": b"#\x0cj\x1a\xc5\x7foK\xe2b\xac\xf3.^\xf5,", b"vn": b"HomeAssistant", b"mn": b"OpenThreadBorderRouter", b"nn": b"OpenThread HC", @@ -288,6 +303,7 @@ ROUTER_DISCOVERY_HASS_STATE_BITMAP_NOT_ACTIVE = { b"sq": b"3", b"bb": b"\xf0\xbf", b"dn": b"DefaultDomain", + b"omr": b"@\xfd \xbe\x89IZ\x00\x01", }, "interface_index": None, } diff --git a/tests/components/thread/test_discovery.py b/tests/components/thread/test_discovery.py index 84fe4c30974..4d43142b7b7 100644 --- a/tests/components/thread/test_discovery.py +++ b/tests/components/thread/test_discovery.py @@ -72,6 +72,7 @@ async def test_discover_routers(hass: HomeAssistant, mock_async_zeroconf: None) "aeeb2f594b570bbf", discovery.ThreadRouterDiscoveryData( addresses=["192.168.0.115"], + border_agent_id="230c6a1ac57f6f4be262acf32e5ef52c", brand="homeassistant", extended_address="aeeb2f594b570bbf", extended_pan_id="e60fc7c186212ce5", @@ -98,6 +99,7 @@ async def test_discover_routers(hass: HomeAssistant, mock_async_zeroconf: None) "f6a99b425a67abed", discovery.ThreadRouterDiscoveryData( addresses=["192.168.0.124"], + border_agent_id="bc3740c3e963aa8735bebecd7cc503c7", brand="google", extended_address="f6a99b425a67abed", extended_pan_id="9e75e256f61409a3", @@ -176,6 +178,7 @@ async def test_discover_routers_unconfigured( "aeeb2f594b570bbf", discovery.ThreadRouterDiscoveryData( addresses=["192.168.0.115"], + border_agent_id="230c6a1ac57f6f4be262acf32e5ef52c", brand="homeassistant", extended_address="aeeb2f594b570bbf", extended_pan_id="e60fc7c186212ce5", @@ -221,6 +224,7 @@ async def test_discover_routers_bad_data( "aeeb2f594b570bbf", discovery.ThreadRouterDiscoveryData( addresses=["192.168.0.115"], + border_agent_id="230c6a1ac57f6f4be262acf32e5ef52c", brand=None, extended_address="aeeb2f594b570bbf", extended_pan_id="e60fc7c186212ce5", diff --git a/tests/components/thread/test_websocket_api.py b/tests/components/thread/test_websocket_api.py index bfe71b8b21c..75e1b313132 100644 --- a/tests/components/thread/test_websocket_api.py +++ b/tests/components/thread/test_websocket_api.py @@ -332,6 +332,7 @@ async def test_discover_routers( "event": { "data": { "addresses": ["192.168.0.115"], + "border_agent_id": "230c6a1ac57f6f4be262acf32e5ef52c", "brand": "homeassistant", "extended_address": "aeeb2f594b570bbf", "extended_pan_id": "e60fc7c186212ce5", @@ -361,6 +362,7 @@ async def test_discover_routers( "event": { "data": { "addresses": ["192.168.0.124"], + "border_agent_id": "bc3740c3e963aa8735bebecd7cc503c7", "brand": "google", "extended_address": "f6a99b425a67abed", "extended_pan_id": "9e75e256f61409a3",