Skip to content

Commit

Permalink
Improve CoordinatorEntity typing (home-assistant#68441)
Browse files Browse the repository at this point in the history
  • Loading branch information
cdce8p authored Mar 21, 2022
1 parent 3320606 commit 830cc27
Show file tree
Hide file tree
Showing 23 changed files with 75 additions and 60 deletions.
6 changes: 3 additions & 3 deletions homeassistant/components/co2signal/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ATTR_ATTRIBUTION, PERCENTAGE
from homeassistant.core import HomeAssistant
from homeassistant.helpers import update_coordinator
from homeassistant.helpers.device_registry import DeviceEntryType
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import StateType
from homeassistant.helpers.update_coordinator import CoordinatorEntity

from . import CO2SignalCoordinator, CO2SignalResponse
from . import CO2SignalCoordinator
from .const import ATTRIBUTION, DOMAIN

SCAN_INTERVAL = timedelta(minutes=3)
Expand Down Expand Up @@ -55,7 +55,7 @@ async def async_setup_entry(
async_add_entities(CO2Sensor(coordinator, description) for description in SENSORS)


class CO2Sensor(update_coordinator.CoordinatorEntity[CO2SignalResponse], SensorEntity):
class CO2Sensor(CoordinatorEntity[CO2SignalCoordinator], SensorEntity):
"""Implementation of the CO2Signal sensor."""

_attr_state_class = SensorStateClass.MEASUREMENT
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/fjaraskupan/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def _constructor(device_state: DeviceState) -> list[Entity]:
async_setup_entry_platform(hass, config_entry, async_add_entities, _constructor)


class BinarySensor(CoordinatorEntity[State], BinarySensorEntity):
class BinarySensor(CoordinatorEntity[DataUpdateCoordinator[State]], BinarySensorEntity):
"""Grease filter sensor."""

entity_description: EntityDescription
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/fjaraskupan/fan.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ def _constructor(device_state: DeviceState):
async_setup_entry_platform(hass, config_entry, async_add_entities, _constructor)


class Fan(CoordinatorEntity[State], FanEntity):
class Fan(CoordinatorEntity[DataUpdateCoordinator[State]], FanEntity):
"""Fan entity."""

def __init__(
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/fjaraskupan/light.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def _constructor(device_state: DeviceState) -> list[Entity]:
async_setup_entry_platform(hass, config_entry, async_add_entities, _constructor)


class Light(CoordinatorEntity[State], LightEntity):
class Light(CoordinatorEntity[DataUpdateCoordinator[State]], LightEntity):
"""Light device."""

def __init__(
Expand Down
4 changes: 3 additions & 1 deletion homeassistant/components/fjaraskupan/number.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ def _constructor(device_state: DeviceState) -> list[Entity]:
async_setup_entry_platform(hass, config_entry, async_add_entities, _constructor)


class PeriodicVentingTime(CoordinatorEntity[State], NumberEntity):
class PeriodicVentingTime(
CoordinatorEntity[DataUpdateCoordinator[State]], NumberEntity
):
"""Periodic Venting."""

_attr_max_value: float = 59
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/fjaraskupan/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def _constructor(device_state: DeviceState) -> list[Entity]:
async_setup_entry_platform(hass, config_entry, async_add_entities, _constructor)


class RssiSensor(CoordinatorEntity[State], SensorEntity):
class RssiSensor(CoordinatorEntity[DataUpdateCoordinator[State]], SensorEntity):
"""Sensor device."""

def __init__(
Expand Down
3 changes: 1 addition & 2 deletions homeassistant/components/github/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,12 +172,11 @@ async def async_setup_entry(
)


class GitHubSensorEntity(CoordinatorEntity[dict[str, Any]], SensorEntity):
class GitHubSensorEntity(CoordinatorEntity[GitHubDataUpdateCoordinator], SensorEntity):
"""Defines a GitHub sensor entity."""

_attr_attribution = "Data provided by the GitHub API"

coordinator: GitHubDataUpdateCoordinator
entity_description: GitHubSensorEntityDescription

def __init__(
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/hassio/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from .const import ATTR_SLUG, DATA_KEY_ADDONS, DATA_KEY_OS


class HassioAddonEntity(CoordinatorEntity):
class HassioAddonEntity(CoordinatorEntity[HassioDataUpdateCoordinator]):
"""Base entity for a Hass.io add-on."""

def __init__(
Expand All @@ -38,7 +38,7 @@ def available(self) -> bool:
)


class HassioOSEntity(CoordinatorEntity):
class HassioOSEntity(CoordinatorEntity[HassioDataUpdateCoordinator]):
"""Base Entity for Hass.io OS."""

def __init__(
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/homewizard/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ async def async_setup_entry(
async_add_entities(entities)


class HWEnergySensor(CoordinatorEntity[DeviceResponseEntry], SensorEntity):
class HWEnergySensor(CoordinatorEntity[HWEnergyDeviceUpdateCoordinator], SensorEntity):
"""Representation of a HomeWizard Sensor."""

def __init__(
Expand Down
6 changes: 3 additions & 3 deletions homeassistant/components/homewizard/switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ async def async_setup_entry(
)


class HWEnergySwitchEntity(CoordinatorEntity, SwitchEntity):
class HWEnergySwitchEntity(
CoordinatorEntity[HWEnergyDeviceUpdateCoordinator], SwitchEntity
):
"""Representation switchable entity."""

coordinator: HWEnergyDeviceUpdateCoordinator

def __init__(
self,
coordinator: HWEnergyDeviceUpdateCoordinator,
Expand Down
9 changes: 7 additions & 2 deletions homeassistant/components/kraken/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@
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 CoordinatorEntity
from homeassistant.helpers.update_coordinator import (
CoordinatorEntity,
DataUpdateCoordinator,
)

from . import KrakenData
from .const import (
Expand Down Expand Up @@ -86,7 +89,9 @@ def async_update_sensors(hass: HomeAssistant, config_entry: ConfigEntry) -> None
)


class KrakenSensor(CoordinatorEntity[Optional[KrakenResponse]], SensorEntity):
class KrakenSensor(
CoordinatorEntity[DataUpdateCoordinator[Optional[KrakenResponse]]], SensorEntity
):
"""Define a Kraken sensor."""

entity_description: KrakenSensorEntityDescription
Expand Down
6 changes: 2 additions & 4 deletions homeassistant/components/met/weather.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
from homeassistant.util.pressure import convert as convert_pressure
from homeassistant.util.speed import convert as convert_speed

from . import MetDataUpdateCoordinator, MetWeatherData
from . import MetDataUpdateCoordinator
from .const import (
ATTR_FORECAST_PRECIPITATION,
ATTR_MAP,
Expand Down Expand Up @@ -127,11 +127,9 @@ def format_condition(condition: str) -> str:
return condition


class MetWeather(CoordinatorEntity[MetWeatherData], WeatherEntity):
class MetWeather(CoordinatorEntity[MetDataUpdateCoordinator], WeatherEntity):
"""Implementation of a Met.no weather condition."""

coordinator: MetDataUpdateCoordinator

def __init__(
self,
coordinator: MetDataUpdateCoordinator,
Expand Down
2 changes: 0 additions & 2 deletions homeassistant/components/modern_forms/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,6 @@ async def _async_update_data(self) -> ModernFormsDevice:
class ModernFormsDeviceEntity(CoordinatorEntity[ModernFormsDataUpdateCoordinator]):
"""Defines a Modern Forms device entity."""

coordinator: ModernFormsDataUpdateCoordinator

def __init__(
self,
*,
Expand Down
6 changes: 2 additions & 4 deletions homeassistant/components/plugwise/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,12 @@
from homeassistant.helpers.update_coordinator import CoordinatorEntity

from .const import DOMAIN
from .coordinator import PlugwiseData, PlugwiseDataUpdateCoordinator
from .coordinator import PlugwiseDataUpdateCoordinator


class PlugwiseEntity(CoordinatorEntity[PlugwiseData]):
class PlugwiseEntity(CoordinatorEntity[PlugwiseDataUpdateCoordinator]):
"""Represent a PlugWise Entity."""

coordinator: PlugwiseDataUpdateCoordinator

def __init__(
self,
coordinator: PlugwiseDataUpdateCoordinator,
Expand Down
7 changes: 5 additions & 2 deletions homeassistant/components/powerwall/entity.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
"""The Tesla Powerwall integration base entity."""

from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.helpers.update_coordinator import (
CoordinatorEntity,
DataUpdateCoordinator,
)

from .const import (
DOMAIN,
Expand All @@ -13,7 +16,7 @@
from .models import PowerwallData, PowerwallRuntimeData


class PowerWallEntity(CoordinatorEntity[PowerwallData]):
class PowerWallEntity(CoordinatorEntity[DataUpdateCoordinator[PowerwallData]]):
"""Base class for powerwall entities."""

def __init__(self, powerwall_data: PowerwallRuntimeData) -> None:
Expand Down
5 changes: 3 additions & 2 deletions homeassistant/components/pure_energie/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,11 @@ async def async_setup_entry(
)


class PureEnergieSensorEntity(CoordinatorEntity[PureEnergieData], SensorEntity):
class PureEnergieSensorEntity(
CoordinatorEntity[PureEnergieDataUpdateCoordinator], SensorEntity
):
"""Defines an Pure Energie sensor."""

coordinator: PureEnergieDataUpdateCoordinator
entity_description: PureEnergieSensorEntityDescription

def __init__(
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/renault/renault_coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from collections.abc import Awaitable, Callable
from datetime import timedelta
import logging
from typing import TypeVar
from typing import Optional, TypeVar

from renault_api.kamereon.exceptions import (
AccessDeniedException,
Expand All @@ -16,7 +16,7 @@
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed

T = TypeVar("T", bound=KamereonVehicleDataAttributes)
T = TypeVar("T", bound=Optional[KamereonVehicleDataAttributes])


class RenaultDataUpdateCoordinator(DataUpdateCoordinator[T]):
Expand Down
10 changes: 6 additions & 4 deletions homeassistant/components/renault/renault_entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
from __future__ import annotations

from dataclasses import dataclass
from typing import Optional, cast
from typing import cast

from homeassistant.const import ATTR_NAME
from homeassistant.helpers.entity import Entity, EntityDescription
from homeassistant.helpers.typing import StateType
from homeassistant.helpers.update_coordinator import CoordinatorEntity

from .renault_coordinator import T
from .renault_coordinator import RenaultDataUpdateCoordinator, T
from .renault_vehicle import RenaultVehicleProxy


Expand Down Expand Up @@ -50,7 +50,9 @@ def name(self) -> str:
return f"{self.vehicle.device_info[ATTR_NAME]} {self.entity_description.name}"


class RenaultDataEntity(CoordinatorEntity[Optional[T]], RenaultEntity):
class RenaultDataEntity(
CoordinatorEntity[RenaultDataUpdateCoordinator[T]], RenaultEntity
):
"""Implementation of a Renault entity with a data coordinator."""

def __init__(
Expand All @@ -65,5 +67,5 @@ def __init__(
def _get_data_attr(self, key: str) -> StateType:
"""Return the attribute value from the coordinator data."""
if self.coordinator.data is None:
return None
return None # type: ignore[unreachable]
return cast(StateType, getattr(self.coordinator.data, key))
14 changes: 7 additions & 7 deletions homeassistant/components/renault/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from collections.abc import Callable
from dataclasses import dataclass
from datetime import datetime
from typing import TYPE_CHECKING, cast
from typing import TYPE_CHECKING, Any, Generic, cast

from renault_api.kamereon.enums import ChargeState, PlugState
from renault_api.kamereon.models import (
Expand Down Expand Up @@ -45,18 +45,18 @@


@dataclass
class RenaultSensorRequiredKeysMixin:
class RenaultSensorRequiredKeysMixin(Generic[T]):
"""Mixin for required keys."""

data_key: str
entity_class: type[RenaultSensor]
entity_class: type[RenaultSensor[T]]


@dataclass
class RenaultSensorEntityDescription(
SensorEntityDescription,
RenaultDataEntityDescription,
RenaultSensorRequiredKeysMixin,
RenaultSensorRequiredKeysMixin[T],
):
"""Class describing Renault sensor entities."""

Expand All @@ -73,7 +73,7 @@ async def async_setup_entry(
) -> None:
"""Set up the Renault entities from config entry."""
proxy: RenaultHub = hass.data[DOMAIN][config_entry.entry_id]
entities: list[RenaultSensor] = [
entities: list[RenaultSensor[Any]] = [
description.entity_class(vehicle, description)
for vehicle in proxy.vehicles.values()
for description in SENSOR_TYPES
Expand All @@ -87,7 +87,7 @@ async def async_setup_entry(
class RenaultSensor(RenaultDataEntity[T], SensorEntity):
"""Mixin for sensor specific attributes."""

entity_description: RenaultSensorEntityDescription
entity_description: RenaultSensorEntityDescription[T]

@property
def data(self) -> StateType:
Expand Down Expand Up @@ -157,7 +157,7 @@ def _get_utc_value(entity: RenaultSensor[T]) -> datetime:
return as_utc(original_dt)


SENSOR_TYPES: tuple[RenaultSensorEntityDescription, ...] = (
SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = (
RenaultSensorEntityDescription(
key="battery_level",
coordinator="battery",
Expand Down
5 changes: 3 additions & 2 deletions homeassistant/components/template/trigger_entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,14 @@
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import TemplateError
from homeassistant.helpers import template, update_coordinator
from homeassistant.helpers import template
from homeassistant.helpers.update_coordinator import CoordinatorEntity

from . import TriggerUpdateCoordinator
from .const import CONF_ATTRIBUTES, CONF_AVAILABILITY, CONF_PICTURE


class TriggerEntity(update_coordinator.CoordinatorEntity):
class TriggerEntity(CoordinatorEntity[TriggerUpdateCoordinator]):
"""Template entity based on trigger data."""

domain: str
Expand Down
Loading

0 comments on commit 830cc27

Please sign in to comment.