1
0
mirror of https://github.com/home-assistant/core.git synced 2026-02-15 07:36:16 +00:00

Optimize coordinator data type for UptimeRobot (#162912)

This commit is contained in:
Simone Chemelli
2026-02-13 13:23:59 +01:00
committed by GitHub
parent 72aa9d8a6a
commit 9a407b8668
3 changed files with 16 additions and 21 deletions

View File

@@ -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

View File

@@ -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()
],
}

View File

@@ -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()