From ce27fb87c662867631dd90f08f38a3fee2ea40d5 Mon Sep 17 00:00:00 2001 From: Michael Chisholm Date: Mon, 1 Nov 2021 02:11:20 +1100 Subject: [PATCH] dlna_dmr: less eager discovery (#58780) --- homeassistant/components/dlna_dmr/config_flow.py | 16 ++++++++++++++++ homeassistant/components/dlna_dmr/manifest.json | 12 ------------ homeassistant/generated/ssdp.py | 12 ------------ tests/components/dlna_dmr/test_config_flow.py | 16 ++++++++++++++++ 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/homeassistant/components/dlna_dmr/config_flow.py b/homeassistant/components/dlna_dmr/config_flow.py index 2ac74fb4cbd..bfee37722b8 100644 --- a/homeassistant/components/dlna_dmr/config_flow.py +++ b/homeassistant/components/dlna_dmr/config_flow.py @@ -470,4 +470,20 @@ def _is_ignored_device(discovery_info: Mapping[str, Any]) -> bool: if discovery_info.get(ssdp.ATTR_UPNP_DEVICE_TYPE) not in DmrDevice.DEVICE_TYPES: return True + # Special cases for devices with other discovery methods (e.g. mDNS), or + # that advertise multiple unrelated (sent in separate discovery packets) + # UPnP devices. + manufacturer = discovery_info.get(ssdp.ATTR_UPNP_MANUFACTURER, "").lower() + model = discovery_info.get(ssdp.ATTR_UPNP_MODEL_NAME, "").lower() + + if manufacturer.startswith("xbmc") or model == "kodi": + # kodi + return True + if manufacturer.startswith("samsung") and "tv" in model: + # samsungtv + return True + if manufacturer.startswith("lg") and "tv" in model: + # webostv + return True + return False diff --git a/homeassistant/components/dlna_dmr/manifest.json b/homeassistant/components/dlna_dmr/manifest.json index 2c87260834f..962b2e167be 100644 --- a/homeassistant/components/dlna_dmr/manifest.json +++ b/homeassistant/components/dlna_dmr/manifest.json @@ -17,18 +17,6 @@ { "deviceType": "urn:schemas-upnp-org:device:MediaRenderer:3", "st": "urn:schemas-upnp-org:device:MediaRenderer:3" - }, - { - "deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1", - "nt": "urn:schemas-upnp-org:device:MediaRenderer:1" - }, - { - "deviceType": "urn:schemas-upnp-org:device:MediaRenderer:2", - "nt": "urn:schemas-upnp-org:device:MediaRenderer:2" - }, - { - "deviceType": "urn:schemas-upnp-org:device:MediaRenderer:3", - "nt": "urn:schemas-upnp-org:device:MediaRenderer:3" } ], "codeowners": ["@StevenLooman", "@chishm"], diff --git a/homeassistant/generated/ssdp.py b/homeassistant/generated/ssdp.py index 925ba5b82fe..9434bc11f61 100644 --- a/homeassistant/generated/ssdp.py +++ b/homeassistant/generated/ssdp.py @@ -95,18 +95,6 @@ SSDP = { { "deviceType": "urn:schemas-upnp-org:device:MediaRenderer:3", "st": "urn:schemas-upnp-org:device:MediaRenderer:3" - }, - { - "deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1", - "nt": "urn:schemas-upnp-org:device:MediaRenderer:1" - }, - { - "deviceType": "urn:schemas-upnp-org:device:MediaRenderer:2", - "nt": "urn:schemas-upnp-org:device:MediaRenderer:2" - }, - { - "deviceType": "urn:schemas-upnp-org:device:MediaRenderer:3", - "nt": "urn:schemas-upnp-org:device:MediaRenderer:3" } ], "fritz": [ diff --git a/tests/components/dlna_dmr/test_config_flow.py b/tests/components/dlna_dmr/test_config_flow.py index 5a2327ecce9..e2d82d5b559 100644 --- a/tests/components/dlna_dmr/test_config_flow.py +++ b/tests/components/dlna_dmr/test_config_flow.py @@ -631,6 +631,22 @@ async def test_ssdp_ignore_device(hass: HomeAssistant) -> None: assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT assert result["reason"] == "alternative_integration" + for manufacturer, model in [ + ("XBMC Foundation", "Kodi"), + ("Samsung", "Smart TV"), + ("LG Electronics.", "LG TV"), + ]: + discovery = dict(MOCK_DISCOVERY) + discovery[ssdp.ATTR_UPNP_MANUFACTURER] = manufacturer + discovery[ssdp.ATTR_UPNP_MODEL_NAME] = model + result = await hass.config_entries.flow.async_init( + DLNA_DOMAIN, + context={"source": config_entries.SOURCE_SSDP}, + data=discovery, + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "alternative_integration" + async def test_unignore_flow(hass: HomeAssistant, ssdp_scanner_mock: Mock) -> None: """Test a config flow started by unignoring a device."""