From 9a407b86683c48e3abf35f59cb462fc83e5e1119 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Fri, 13 Feb 2026 13:23:59 +0100 Subject: [PATCH] Optimize coordinator data type for UptimeRobot (#162912) --- .../components/uptimerobot/coordinator.py | 23 +++++++++---------- .../components/uptimerobot/diagnostics.py | 2 +- homeassistant/components/uptimerobot/utils.py | 12 ++++------ 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/homeassistant/components/uptimerobot/coordinator.py b/homeassistant/components/uptimerobot/coordinator.py index c8c03f2c9ccc..16e49f6e408d 100644 --- a/homeassistant/components/uptimerobot/coordinator.py +++ b/homeassistant/components/uptimerobot/coordinator.py @@ -22,7 +22,9 @@ from .const import COORDINATOR_UPDATE_INTERVAL, DOMAIN, LOGGER type UptimeRobotConfigEntry = ConfigEntry[UptimeRobotDataUpdateCoordinator] -class UptimeRobotDataUpdateCoordinator(DataUpdateCoordinator[list[UptimeRobotMonitor]]): +class UptimeRobotDataUpdateCoordinator( + DataUpdateCoordinator[dict[int, UptimeRobotMonitor]] +): """Data update coordinator for UptimeRobot.""" config_entry: UptimeRobotConfigEntry @@ -43,7 +45,7 @@ class UptimeRobotDataUpdateCoordinator(DataUpdateCoordinator[list[UptimeRobotMon ) self.api = api - async def _async_update_data(self) -> list[UptimeRobotMonitor]: + async def _async_update_data(self) -> dict[int, UptimeRobotMonitor]: """Update data.""" try: response = await self.api.async_get_monitors() @@ -55,21 +57,18 @@ class UptimeRobotDataUpdateCoordinator(DataUpdateCoordinator[list[UptimeRobotMon if TYPE_CHECKING: assert isinstance(response.data, list) - monitors: list[UptimeRobotMonitor] = response.data + current_ids = self.data.keys() if self.data else () + new_monitors = {monitor.id: monitor for monitor in response.data} + if stale_ids := set(current_ids) - new_monitors.keys(): + device_registry = dr.async_get(self.hass) - current_monitors = ( - {str(monitor.id) for monitor in self.data} if self.data else set() - ) - new_monitors = {str(monitor.id) for monitor in monitors} - if stale_monitors := current_monitors - new_monitors: - for monitor_id in stale_monitors: - device_registry = dr.async_get(self.hass) + for monitor_id in stale_ids: if device := device_registry.async_get_device( - identifiers={(DOMAIN, monitor_id)} + identifiers={(DOMAIN, str(monitor_id))} ): device_registry.async_update_device( device_id=device.id, remove_config_entry_id=self.config_entry.entry_id, ) - return monitors + return new_monitors diff --git a/homeassistant/components/uptimerobot/diagnostics.py b/homeassistant/components/uptimerobot/diagnostics.py index 8f9f67fb47b2..937c8bfa7944 100644 --- a/homeassistant/components/uptimerobot/diagnostics.py +++ b/homeassistant/components/uptimerobot/diagnostics.py @@ -41,6 +41,6 @@ async def async_get_config_entry_diagnostics( "interval": monitor.interval, "status": monitor.status, } - for monitor in coordinator.data + for monitor in coordinator.data.values() ], } diff --git a/homeassistant/components/uptimerobot/utils.py b/homeassistant/components/uptimerobot/utils.py index ed50b7535fcf..579785273661 100644 --- a/homeassistant/components/uptimerobot/utils.py +++ b/homeassistant/components/uptimerobot/utils.py @@ -18,14 +18,10 @@ def new_device_listener( def _check_devices() -> None: """Check for new devices and call callback with any new monitors.""" - new_monitors: list[UptimeRobotMonitor] = [] - for monitor in coordinator.data: - if monitor.id not in known_devices: - known_devices.add(monitor.id) - new_monitors.append(monitor) - - if new_monitors: - new_devices_callback(new_monitors) + new_ids = coordinator.data.keys() - known_devices + if new_ids: + known_devices.update(new_ids) + new_devices_callback([coordinator.data[i] for i in new_ids]) # Check for devices immediately _check_devices()