From ab24d16e0054c584ff84e39b70b0b793f08865c5 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 27 Jun 2021 23:46:56 -1000 Subject: [PATCH] Suppress duplicate mdns discovery from netdisco (#52099) --- homeassistant/components/discovery/__init__.py | 13 ++++++++++--- homeassistant/components/discovery/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/discovery/test_init.py | 12 ++++++------ 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/discovery/__init__.py b/homeassistant/components/discovery/__init__.py index 883958226d8..5b6bb7a5372 100644 --- a/homeassistant/components/discovery/__init__.py +++ b/homeassistant/components/discovery/__init__.py @@ -13,6 +13,7 @@ from homeassistant.core import callback import homeassistant.helpers.config_validation as cv from homeassistant.helpers.discovery import async_discover, async_load_platform from homeassistant.helpers.event import async_track_point_in_utc_time +from homeassistant.loader import async_get_zeroconf import homeassistant.util.dt as dt_util DOMAIN = "discovery" @@ -139,6 +140,10 @@ async def async_setup(hass, config): ) zeroconf_instance = await zeroconf.async_get_instance(hass) + # Do not scan for types that have already been converted + # as it will generate excess network traffic for questions + # the zeroconf instance already knows the answers + zeroconf_types = list(await async_get_zeroconf(hass)) async def new_service_found(service, info): """Handle a new service if one is found.""" @@ -187,7 +192,7 @@ async def async_setup(hass, config): """Scan for devices.""" try: results = await hass.async_add_executor_job( - _discover, netdisco, zeroconf_instance + _discover, netdisco, zeroconf_instance, zeroconf_types ) for result in results: @@ -209,11 +214,13 @@ async def async_setup(hass, config): return True -def _discover(netdisco, zeroconf_instance): +def _discover(netdisco, zeroconf_instance, zeroconf_types): """Discover devices.""" results = [] try: - netdisco.scan(zeroconf_instance=zeroconf_instance) + netdisco.scan( + zeroconf_instance=zeroconf_instance, suppress_mdns_types=zeroconf_types + ) for disc in netdisco.discover(): for service in netdisco.get_info(disc): diff --git a/homeassistant/components/discovery/manifest.json b/homeassistant/components/discovery/manifest.json index a2d2df1730a..558c727c62c 100644 --- a/homeassistant/components/discovery/manifest.json +++ b/homeassistant/components/discovery/manifest.json @@ -2,7 +2,7 @@ "domain": "discovery", "name": "Discovery", "documentation": "https://www.home-assistant.io/integrations/discovery", - "requirements": ["netdisco==2.8.3"], + "requirements": ["netdisco==2.9.0"], "after_dependencies": ["zeroconf"], "codeowners": [], "quality_scale": "internal" diff --git a/requirements_all.txt b/requirements_all.txt index 746adfc31ce..087cc1942e3 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1008,7 +1008,7 @@ nessclient==0.9.15 netdata==0.2.0 # homeassistant.components.discovery -netdisco==2.8.3 +netdisco==2.9.0 # homeassistant.components.nam nettigo-air-monitor==1.0.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 8661bd0f93e..2913703d6a5 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -562,7 +562,7 @@ ndms2_client==0.1.1 nessclient==0.9.15 # homeassistant.components.discovery -netdisco==2.8.3 +netdisco==2.9.0 # homeassistant.components.nam nettigo-air-monitor==1.0.0 diff --git a/tests/components/discovery/test_init.py b/tests/components/discovery/test_init.py index 4dd77c98187..8be837bb16e 100644 --- a/tests/components/discovery/test_init.py +++ b/tests/components/discovery/test_init.py @@ -60,7 +60,7 @@ async def mock_discovery(hass, discoveries, config=BASE_CONFIG): async def test_unknown_service(hass): """Test that unknown service is ignored.""" - def discover(netdisco, zeroconf_instance): + def discover(netdisco, zeroconf_instance, suppress_mdns_types): """Fake discovery.""" return [("this_service_will_never_be_supported", {"info": "some"})] @@ -73,7 +73,7 @@ async def test_unknown_service(hass): async def test_load_platform(hass): """Test load a platform.""" - def discover(netdisco, zeroconf_instance): + def discover(netdisco, zeroconf_instance, suppress_mdns_types): """Fake discovery.""" return [(SERVICE, SERVICE_INFO)] @@ -89,7 +89,7 @@ async def test_load_platform(hass): async def test_load_component(hass): """Test load a component.""" - def discover(netdisco, zeroconf_instance): + def discover(netdisco, zeroconf_instance, suppress_mdns_types): """Fake discovery.""" return [(SERVICE_NO_PLATFORM, SERVICE_INFO)] @@ -109,7 +109,7 @@ async def test_load_component(hass): async def test_ignore_service(hass): """Test ignore service.""" - def discover(netdisco, zeroconf_instance): + def discover(netdisco, zeroconf_instance, suppress_mdns_types): """Fake discovery.""" return [(SERVICE_NO_PLATFORM, SERVICE_INFO)] @@ -122,7 +122,7 @@ async def test_ignore_service(hass): async def test_discover_duplicates(hass): """Test load a component.""" - def discover(netdisco, zeroconf_instance): + def discover(netdisco, zeroconf_instance, suppress_mdns_types): """Fake discovery.""" return [ (SERVICE_NO_PLATFORM, SERVICE_INFO), @@ -147,7 +147,7 @@ async def test_discover_config_flow(hass): """Test discovery triggering a config flow.""" discovery_info = {"hello": "world"} - def discover(netdisco, zeroconf_instance): + def discover(netdisco, zeroconf_instance, suppress_mdns_types): """Fake discovery.""" return [("mock-service", discovery_info)]