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:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
],
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user