Add huawei_lte device registry upnp udn connection (#148370)

This commit is contained in:
Ville Skyttä 2025-07-08 04:32:29 +00:00 committed by GitHub
parent b0f7c985e4
commit ccc80c78a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 21 additions and 6 deletions

View File

@ -57,6 +57,7 @@ from .const import (
ATTR_CONFIG_ENTRY_ID, ATTR_CONFIG_ENTRY_ID,
CONF_MANUFACTURER, CONF_MANUFACTURER,
CONF_UNAUTHENTICATED_MODE, CONF_UNAUTHENTICATED_MODE,
CONF_UPNP_UDN,
CONNECTION_TIMEOUT, CONNECTION_TIMEOUT,
DEFAULT_DEVICE_NAME, DEFAULT_DEVICE_NAME,
DEFAULT_MANUFACTURER, DEFAULT_MANUFACTURER,
@ -147,9 +148,12 @@ class Router:
@property @property
def device_connections(self) -> set[tuple[str, str]]: def device_connections(self) -> set[tuple[str, str]]:
"""Get router connections for device registry.""" """Get router connections for device registry."""
return { connections = {
(dr.CONNECTION_NETWORK_MAC, x) for x in self.config_entry.data[CONF_MAC] (dr.CONNECTION_NETWORK_MAC, x) for x in self.config_entry.data[CONF_MAC]
} }
if udn := self.config_entry.data.get(CONF_UPNP_UDN):
connections.add((dr.CONNECTION_UPNP, udn))
return connections
def _get_data(self, key: str, func: Callable[[], Any]) -> None: def _get_data(self, key: str, func: Callable[[], Any]) -> None:
if not self.subscriptions.get(key): if not self.subscriptions.get(key):

View File

@ -51,6 +51,7 @@ from .const import (
CONF_MANUFACTURER, CONF_MANUFACTURER,
CONF_TRACK_WIRED_CLIENTS, CONF_TRACK_WIRED_CLIENTS,
CONF_UNAUTHENTICATED_MODE, CONF_UNAUTHENTICATED_MODE,
CONF_UPNP_UDN,
CONNECTION_TIMEOUT, CONNECTION_TIMEOUT,
DEFAULT_DEVICE_NAME, DEFAULT_DEVICE_NAME,
DEFAULT_NOTIFY_SERVICE_NAME, DEFAULT_NOTIFY_SERVICE_NAME,
@ -69,6 +70,7 @@ class HuaweiLteConfigFlow(ConfigFlow, domain=DOMAIN):
VERSION = 3 VERSION = 3
manufacturer: str | None = None manufacturer: str | None = None
upnp_udn: str | None = None
url: str | None = None url: str | None = None
@staticmethod @staticmethod
@ -250,6 +252,7 @@ class HuaweiLteConfigFlow(ConfigFlow, domain=DOMAIN):
{ {
CONF_MAC: get_device_macs(info, wlan_settings), CONF_MAC: get_device_macs(info, wlan_settings),
CONF_MANUFACTURER: self.manufacturer, CONF_MANUFACTURER: self.manufacturer,
CONF_UPNP_UDN: self.upnp_udn,
} }
) )
@ -284,11 +287,12 @@ class HuaweiLteConfigFlow(ConfigFlow, domain=DOMAIN):
# url_normalize only returns None if passed None, and we don't do that # url_normalize only returns None if passed None, and we don't do that
assert url is not None assert url is not None
unique_id = discovery_info.upnp.get( upnp_udn = discovery_info.upnp.get(ATTR_UPNP_UDN)
ATTR_UPNP_SERIAL, discovery_info.upnp[ATTR_UPNP_UDN] unique_id = discovery_info.upnp.get(ATTR_UPNP_SERIAL, upnp_udn)
)
await self.async_set_unique_id(unique_id) await self.async_set_unique_id(unique_id)
self._abort_if_unique_id_configured(updates={CONF_URL: url}) self._abort_if_unique_id_configured(
updates={CONF_UPNP_UDN: upnp_udn, CONF_URL: url}
)
def _is_supported_device() -> bool: def _is_supported_device() -> bool:
"""See if we are looking at a possibly supported device. """See if we are looking at a possibly supported device.
@ -319,6 +323,7 @@ class HuaweiLteConfigFlow(ConfigFlow, domain=DOMAIN):
} }
) )
self.manufacturer = discovery_info.upnp.get(ATTR_UPNP_MANUFACTURER) self.manufacturer = discovery_info.upnp.get(ATTR_UPNP_MANUFACTURER)
self.upnp_udn = upnp_udn
self.url = url self.url = url
return await self._async_show_user_form() return await self._async_show_user_form()

View File

@ -7,6 +7,7 @@ ATTR_CONFIG_ENTRY_ID = "config_entry_id"
CONF_MANUFACTURER = "manufacturer" CONF_MANUFACTURER = "manufacturer"
CONF_TRACK_WIRED_CLIENTS = "track_wired_clients" CONF_TRACK_WIRED_CLIENTS = "track_wired_clients"
CONF_UNAUTHENTICATED_MODE = "unauthenticated_mode" CONF_UNAUTHENTICATED_MODE = "unauthenticated_mode"
CONF_UPNP_UDN = "upnp_udn"
DEFAULT_DEVICE_NAME = "LTE" DEFAULT_DEVICE_NAME = "LTE"
DEFAULT_MANUFACTURER = "Huawei Technologies Co., Ltd." DEFAULT_MANUFACTURER = "Huawei Technologies Co., Ltd."

View File

@ -13,7 +13,11 @@ import requests_mock
from requests_mock import ANY from requests_mock import ANY
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components.huawei_lte.const import CONF_UNAUTHENTICATED_MODE, DOMAIN from homeassistant.components.huawei_lte.const import (
CONF_UNAUTHENTICATED_MODE,
CONF_UPNP_UDN,
DOMAIN,
)
from homeassistant.const import ( from homeassistant.const import (
CONF_NAME, CONF_NAME,
CONF_PASSWORD, CONF_PASSWORD,
@ -373,6 +377,7 @@ async def test_ssdp(
assert result["type"] == FlowResultType.CREATE_ENTRY assert result["type"] == FlowResultType.CREATE_ENTRY
assert result["title"] == service_info.upnp[ATTR_UPNP_MODEL_NAME] assert result["title"] == service_info.upnp[ATTR_UPNP_MODEL_NAME]
assert result["result"].data[CONF_UPNP_UDN] == service_info.upnp[ATTR_UPNP_UDN]
@pytest.mark.parametrize( @pytest.mark.parametrize(