From 8cf6f501931640cd8c69143f81a2323ab2d60c24 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Wed, 8 Jun 2022 10:52:01 +0200 Subject: [PATCH] Ensure netgear devices are tracked with one enabled config entry (#72969) Co-authored-by: Martin Hjelmare --- homeassistant/components/netgear/__init__.py | 7 +++---- homeassistant/components/netgear/router.py | 17 +++++++++++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/netgear/__init__.py b/homeassistant/components/netgear/__init__.py index 7a4d0e7a8cd..679a93f8da1 100644 --- a/homeassistant/components/netgear/__init__.py +++ b/homeassistant/components/netgear/__init__.py @@ -18,7 +18,6 @@ from .const import ( KEY_COORDINATOR_SPEED, KEY_COORDINATOR_TRAFFIC, KEY_ROUTER, - MODE_ROUTER, PLATFORMS, ) from .errors import CannotLoginException @@ -72,7 +71,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_update_devices() -> bool: """Fetch data from the router.""" - if router.mode == MODE_ROUTER: + if router.track_devices: return await router.async_update_device_trackers() return False @@ -107,7 +106,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: update_interval=SPEED_TEST_INTERVAL, ) - if router.mode == MODE_ROUTER: + if router.track_devices: await coordinator.async_config_entry_first_refresh() await coordinator_traffic_meter.async_config_entry_first_refresh() @@ -134,7 +133,7 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: if not hass.data[DOMAIN]: hass.data.pop(DOMAIN) - if router.mode != MODE_ROUTER: + if not router.track_devices: router_id = None # Remove devices that are no longer tracked device_registry = dr.async_get(hass) diff --git a/homeassistant/components/netgear/router.py b/homeassistant/components/netgear/router.py index 301906f22b6..67e573d0e92 100644 --- a/homeassistant/components/netgear/router.py +++ b/homeassistant/components/netgear/router.py @@ -80,6 +80,7 @@ class NetgearRouter: self.hardware_version = "" self.serial_number = "" + self.track_devices = True self.method_version = 1 consider_home_int = entry.options.get( CONF_CONSIDER_HOME, DEFAULT_CONSIDER_HOME.total_seconds() @@ -112,11 +113,23 @@ class NetgearRouter: self.serial_number = self._info["SerialNumber"] self.mode = self._info.get("DeviceMode", MODE_ROUTER) + enabled_entries = [ + entry + for entry in self.hass.config_entries.async_entries(DOMAIN) + if entry.disabled_by is None + ] + self.track_devices = self.mode == MODE_ROUTER or len(enabled_entries) == 1 + _LOGGER.debug( + "Netgear track_devices = '%s', device mode '%s'", + self.track_devices, + self.mode, + ) + for model in MODELS_V2: if self.model.startswith(model): self.method_version = 2 - if self.method_version == 2 and self.mode == MODE_ROUTER: + if self.method_version == 2 and self.track_devices: if not self._api.get_attached_devices_2(): _LOGGER.error( "Netgear Model '%s' in MODELS_V2 list, but failed to get attached devices using V2", @@ -133,7 +146,7 @@ class NetgearRouter: return False # set already known devices to away instead of unavailable - if self.mode == MODE_ROUTER: + if self.track_devices: device_registry = dr.async_get(self.hass) devices = dr.async_entries_for_config_entry(device_registry, self.entry_id) for device_entry in devices: