51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
"""UPnP/IGD coordinator."""
|
|
|
|
from collections.abc import Mapping
|
|
from datetime import timedelta
|
|
from typing import Any
|
|
|
|
from async_upnp_client.exceptions import UpnpCommunicationError
|
|
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.device_registry import DeviceEntry
|
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
|
|
|
from .const import LOGGER
|
|
from .device import Device
|
|
|
|
|
|
class UpnpDataUpdateCoordinator(DataUpdateCoordinator):
|
|
"""Define an object to update data from UPNP device."""
|
|
|
|
def __init__(
|
|
self,
|
|
hass: HomeAssistant,
|
|
device: Device,
|
|
device_entry: DeviceEntry,
|
|
update_interval: timedelta,
|
|
) -> None:
|
|
"""Initialize."""
|
|
self.device = device
|
|
self.device_entry = device_entry
|
|
|
|
super().__init__(
|
|
hass,
|
|
LOGGER,
|
|
name=device.name,
|
|
update_interval=update_interval,
|
|
)
|
|
|
|
async def _async_update_data(self) -> Mapping[str, Any]:
|
|
"""Update data."""
|
|
try:
|
|
return await self.device.async_get_data()
|
|
except UpnpCommunicationError as exception:
|
|
LOGGER.debug(
|
|
"Caught exception when updating device: %s, exception: %s",
|
|
self.device,
|
|
exception,
|
|
)
|
|
raise UpdateFailed(
|
|
f"Unable to communicate with IGD at: {self.device.device_url}"
|
|
) from exception
|