diff --git a/homeassistant/components/synology_dsm/binary_sensor.py b/homeassistant/components/synology_dsm/binary_sensor.py index ac930467442..7511953de90 100644 --- a/homeassistant/components/synology_dsm/binary_sensor.py +++ b/homeassistant/components/synology_dsm/binary_sensor.py @@ -2,7 +2,6 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Any from synology_dsm.api.core.security import SynoCoreSecurity from synology_dsm.api.storage.storage import SynoStorage @@ -17,10 +16,10 @@ from homeassistant.const import CONF_DISKS from homeassistant.core import HomeAssistant from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.entity_platform import AddEntitiesCallback -from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from . import SynoApi from .const import DOMAIN +from .coordinator import SynologyDSMCentralUpdateCoordinator from .entity import ( SynologyDSMBaseEntity, SynologyDSMDeviceEntity, @@ -89,7 +88,9 @@ async def async_setup_entry( async_add_entities(entities) -class SynoDSMBinarySensor(SynologyDSMBaseEntity, BinarySensorEntity): +class SynoDSMBinarySensor( + SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator], BinarySensorEntity +): """Mixin for binary sensor specific attributes.""" entity_description: SynologyDSMBinarySensorEntityDescription @@ -97,7 +98,7 @@ class SynoDSMBinarySensor(SynologyDSMBaseEntity, BinarySensorEntity): def __init__( self, api: SynoApi, - coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], + coordinator: SynologyDSMCentralUpdateCoordinator, description: SynologyDSMBinarySensorEntityDescription, ) -> None: """Initialize the Synology DSM binary_sensor entity.""" @@ -131,7 +132,7 @@ class SynoDSMStorageBinarySensor(SynologyDSMDeviceEntity, SynoDSMBinarySensor): def __init__( self, api: SynoApi, - coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], + coordinator: SynologyDSMCentralUpdateCoordinator, description: SynologyDSMBinarySensorEntityDescription, device_id: str | None = None, ) -> None: diff --git a/homeassistant/components/synology_dsm/camera.py b/homeassistant/components/synology_dsm/camera.py index 6dac67cf72d..65520968e1d 100644 --- a/homeassistant/components/synology_dsm/camera.py +++ b/homeassistant/components/synology_dsm/camera.py @@ -20,7 +20,6 @@ from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback -from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from . import SynoApi from .const import ( @@ -29,6 +28,7 @@ from .const import ( DOMAIN, SIGNAL_CAMERA_SOURCE_CHANGED, ) +from .coordinator import SynologyDSMCameraUpdateCoordinator from .entity import SynologyDSMBaseEntity, SynologyDSMEntityDescription from .models import SynologyDSMData @@ -54,17 +54,16 @@ async def async_setup_entry( ) -class SynoDSMCamera(SynologyDSMBaseEntity, Camera): +class SynoDSMCamera(SynologyDSMBaseEntity[SynologyDSMCameraUpdateCoordinator], Camera): """Representation a Synology camera.""" _attr_supported_features = CameraEntityFeature.STREAM - coordinator: DataUpdateCoordinator[dict[str, dict[str, SynoCamera]]] entity_description: SynologyDSMCameraEntityDescription def __init__( self, api: SynoApi, - coordinator: DataUpdateCoordinator[dict[str, dict[str, SynoCamera]]], + coordinator: SynologyDSMCameraUpdateCoordinator, camera_id: str, ) -> None: """Initialize a Synology camera.""" diff --git a/homeassistant/components/synology_dsm/coordinator.py b/homeassistant/components/synology_dsm/coordinator.py index e2f0f0741f4..9090b945d44 100644 --- a/homeassistant/components/synology_dsm/coordinator.py +++ b/homeassistant/components/synology_dsm/coordinator.py @@ -3,7 +3,7 @@ from __future__ import annotations from datetime import timedelta import logging -from typing import Any +from typing import Any, TypeVar import async_timeout from synology_dsm.api.surveillance_station.camera import SynoCamera @@ -23,9 +23,10 @@ from .const import ( ) _LOGGER = logging.getLogger(__name__) +_DataT = TypeVar("_DataT") -class SynologyDSMUpdateCoordinator(DataUpdateCoordinator): +class SynologyDSMUpdateCoordinator(DataUpdateCoordinator[_DataT]): """DataUpdateCoordinator base class for synology_dsm.""" def __init__( @@ -46,7 +47,9 @@ class SynologyDSMUpdateCoordinator(DataUpdateCoordinator): ) -class SynologyDSMSwitchUpdateCoordinator(SynologyDSMUpdateCoordinator): +class SynologyDSMSwitchUpdateCoordinator( + SynologyDSMUpdateCoordinator[dict[str, dict[str, Any]]] +): """DataUpdateCoordinator to gather data for a synology_dsm switch devices.""" def __init__( @@ -78,7 +81,7 @@ class SynologyDSMSwitchUpdateCoordinator(SynologyDSMUpdateCoordinator): } -class SynologyDSMCentralUpdateCoordinator(SynologyDSMUpdateCoordinator): +class SynologyDSMCentralUpdateCoordinator(SynologyDSMUpdateCoordinator[None]): """DataUpdateCoordinator to gather data for a synology_dsm central device.""" def __init__( @@ -106,7 +109,9 @@ class SynologyDSMCentralUpdateCoordinator(SynologyDSMUpdateCoordinator): return None -class SynologyDSMCameraUpdateCoordinator(SynologyDSMUpdateCoordinator): +class SynologyDSMCameraUpdateCoordinator( + SynologyDSMUpdateCoordinator[dict[str, dict[str, SynoCamera]]] +): """DataUpdateCoordinator to gather data for a synology_dsm cameras.""" def __init__( diff --git a/homeassistant/components/synology_dsm/entity.py b/homeassistant/components/synology_dsm/entity.py index 1404d933020..0cc17222802 100644 --- a/homeassistant/components/synology_dsm/entity.py +++ b/homeassistant/components/synology_dsm/entity.py @@ -2,16 +2,19 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Any +from typing import Any, TypeVar from homeassistant.helpers.entity import DeviceInfo, EntityDescription -from homeassistant.helpers.update_coordinator import ( - CoordinatorEntity, - DataUpdateCoordinator, -) +from homeassistant.helpers.update_coordinator import CoordinatorEntity from .common import SynoApi from .const import ATTRIBUTION, DOMAIN +from .coordinator import ( + SynologyDSMCentralUpdateCoordinator, + SynologyDSMUpdateCoordinator, +) + +_CoordinatorT = TypeVar("_CoordinatorT", bound=SynologyDSMUpdateCoordinator[Any]) @dataclass @@ -26,9 +29,7 @@ class SynologyDSMEntityDescription(EntityDescription, SynologyDSMRequiredKeysMix """Generic Synology DSM entity description.""" -class SynologyDSMBaseEntity( - CoordinatorEntity[DataUpdateCoordinator[dict[str, dict[str, Any]]]] -): +class SynologyDSMBaseEntity(CoordinatorEntity[_CoordinatorT]): """Representation of a Synology NAS entry.""" entity_description: SynologyDSMEntityDescription @@ -38,7 +39,7 @@ class SynologyDSMBaseEntity( def __init__( self, api: SynoApi, - coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], + coordinator: _CoordinatorT, description: SynologyDSMEntityDescription, ) -> None: """Initialize the Synology DSM entity.""" @@ -67,13 +68,15 @@ class SynologyDSMBaseEntity( await super().async_added_to_hass() -class SynologyDSMDeviceEntity(SynologyDSMBaseEntity): +class SynologyDSMDeviceEntity( + SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator] +): """Representation of a Synology NAS disk or volume entry.""" def __init__( self, api: SynoApi, - coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], + coordinator: SynologyDSMCentralUpdateCoordinator, description: SynologyDSMEntityDescription, device_id: str | None = None, ) -> None: diff --git a/homeassistant/components/synology_dsm/sensor.py b/homeassistant/components/synology_dsm/sensor.py index 156dbe3e79c..0a0779b1979 100644 --- a/homeassistant/components/synology_dsm/sensor.py +++ b/homeassistant/components/synology_dsm/sensor.py @@ -26,11 +26,11 @@ from homeassistant.const import ( from homeassistant.core import HomeAssistant from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.entity_platform import AddEntitiesCallback -from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from homeassistant.util.dt import utcnow from . import SynoApi from .const import CONF_VOLUMES, DOMAIN, ENTITY_UNIT_LOAD +from .coordinator import SynologyDSMCentralUpdateCoordinator from .entity import ( SynologyDSMBaseEntity, SynologyDSMDeviceEntity, @@ -328,7 +328,9 @@ async def async_setup_entry( async_add_entities(entities) -class SynoDSMSensor(SynologyDSMBaseEntity, SensorEntity): +class SynoDSMSensor( + SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator], SensorEntity +): """Mixin for sensor specific attributes.""" entity_description: SynologyDSMSensorEntityDescription @@ -336,7 +338,7 @@ class SynoDSMSensor(SynologyDSMBaseEntity, SensorEntity): def __init__( self, api: SynoApi, - coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], + coordinator: SynologyDSMCentralUpdateCoordinator, description: SynologyDSMSensorEntityDescription, ) -> None: """Initialize the Synology DSM sensor entity.""" @@ -383,7 +385,7 @@ class SynoDSMStorageSensor(SynologyDSMDeviceEntity, SynoDSMSensor): def __init__( self, api: SynoApi, - coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], + coordinator: SynologyDSMCentralUpdateCoordinator, description: SynologyDSMSensorEntityDescription, device_id: str | None = None, ) -> None: @@ -410,7 +412,7 @@ class SynoDSMInfoSensor(SynoDSMSensor): def __init__( self, api: SynoApi, - coordinator: DataUpdateCoordinator[dict[str, dict[str, Any]]], + coordinator: SynologyDSMCentralUpdateCoordinator, description: SynologyDSMSensorEntityDescription, ) -> None: """Initialize the Synology SynoDSMInfoSensor entity.""" diff --git a/homeassistant/components/synology_dsm/switch.py b/homeassistant/components/synology_dsm/switch.py index 26909ceddd9..245b8804488 100644 --- a/homeassistant/components/synology_dsm/switch.py +++ b/homeassistant/components/synology_dsm/switch.py @@ -12,10 +12,10 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback -from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from . import SynoApi from .const import DOMAIN +from .coordinator import SynologyDSMSwitchUpdateCoordinator from .entity import SynologyDSMBaseEntity, SynologyDSMEntityDescription from .models import SynologyDSMData @@ -54,17 +54,18 @@ async def async_setup_entry( ) -class SynoDSMSurveillanceHomeModeToggle(SynologyDSMBaseEntity, SwitchEntity): +class SynoDSMSurveillanceHomeModeToggle( + SynologyDSMBaseEntity[SynologyDSMSwitchUpdateCoordinator], SwitchEntity +): """Representation a Synology Surveillance Station Home Mode toggle.""" - coordinator: DataUpdateCoordinator[dict[str, dict[str, bool]]] entity_description: SynologyDSMSwitchEntityDescription def __init__( self, api: SynoApi, version: str, - coordinator: DataUpdateCoordinator[dict[str, dict[str, bool]]], + coordinator: SynologyDSMSwitchUpdateCoordinator, description: SynologyDSMSwitchEntityDescription, ) -> None: """Initialize a Synology Surveillance Station Home Mode.""" @@ -78,7 +79,7 @@ class SynoDSMSurveillanceHomeModeToggle(SynologyDSMBaseEntity, SwitchEntity): @property def is_on(self) -> bool: """Return the state.""" - return self.coordinator.data["switches"][self.entity_description.key] + return self.coordinator.data["switches"][self.entity_description.key] # type: ignore[no-any-return] async def async_turn_on(self, **kwargs: Any) -> None: """Turn on Home mode.""" diff --git a/homeassistant/components/synology_dsm/update.py b/homeassistant/components/synology_dsm/update.py index 445e682651c..18200fb30d9 100644 --- a/homeassistant/components/synology_dsm/update.py +++ b/homeassistant/components/synology_dsm/update.py @@ -14,6 +14,7 @@ from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.entity_platform import AddEntitiesCallback from .const import DOMAIN +from .coordinator import SynologyDSMCentralUpdateCoordinator from .entity import SynologyDSMBaseEntity, SynologyDSMEntityDescription from .models import SynologyDSMData @@ -46,7 +47,9 @@ async def async_setup_entry( ) -class SynoDSMUpdateEntity(SynologyDSMBaseEntity, UpdateEntity): +class SynoDSMUpdateEntity( + SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator], UpdateEntity +): """Mixin for update entity specific attributes.""" entity_description: SynologyDSMUpdateEntityEntityDescription