Improve sleepiq generic typing (#85330)

This commit is contained in:
Marc Mueller 2023-01-07 14:13:16 +01:00 committed by GitHub
parent e99840f82c
commit a2ef0caa07
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 40 additions and 29 deletions

View File

@ -8,10 +8,9 @@ from homeassistant.components.binary_sensor import (
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import DOMAIN, ICON_EMPTY, ICON_OCCUPIED, IS_IN_BED from .const import DOMAIN, ICON_EMPTY, ICON_OCCUPIED, IS_IN_BED
from .coordinator import SleepIQData from .coordinator import SleepIQData, SleepIQDataUpdateCoordinator
from .entity import SleepIQSleeperEntity from .entity import SleepIQSleeperEntity
@ -29,14 +28,16 @@ async def async_setup_entry(
) )
class IsInBedBinarySensor(SleepIQSleeperEntity, BinarySensorEntity): class IsInBedBinarySensor(
SleepIQSleeperEntity[SleepIQDataUpdateCoordinator], BinarySensorEntity
):
"""Implementation of a SleepIQ presence sensor.""" """Implementation of a SleepIQ presence sensor."""
_attr_device_class = BinarySensorDeviceClass.OCCUPANCY _attr_device_class = BinarySensorDeviceClass.OCCUPANCY
def __init__( def __init__(
self, self,
coordinator: DataUpdateCoordinator, coordinator: SleepIQDataUpdateCoordinator,
bed: SleepIQBed, bed: SleepIQBed,
sleeper: SleepIQSleeper, sleeper: SleepIQSleeper,
) -> None: ) -> None:

View File

@ -1,17 +1,21 @@
"""Entity for the SleepIQ integration.""" """Entity for the SleepIQ integration."""
from abc import abstractmethod from abc import abstractmethod
from typing import TypeVar, Union
from asyncsleepiq import SleepIQBed, SleepIQSleeper from asyncsleepiq import SleepIQBed, SleepIQSleeper
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.helpers import device_registry from homeassistant.helpers import device_registry
from homeassistant.helpers.entity import DeviceInfo, Entity from homeassistant.helpers.entity import DeviceInfo, Entity
from homeassistant.helpers.update_coordinator import ( from homeassistant.helpers.update_coordinator import CoordinatorEntity
CoordinatorEntity,
DataUpdateCoordinator,
)
from .const import ENTITY_TYPES, ICON_OCCUPIED from .const import ENTITY_TYPES, ICON_OCCUPIED
from .coordinator import SleepIQDataUpdateCoordinator, SleepIQPauseUpdateCoordinator
_SleepIQCoordinatorT = TypeVar(
"_SleepIQCoordinatorT",
bound=Union[SleepIQDataUpdateCoordinator, SleepIQPauseUpdateCoordinator],
)
def device_from_bed(bed: SleepIQBed) -> DeviceInfo: def device_from_bed(bed: SleepIQBed) -> DeviceInfo:
@ -33,14 +37,14 @@ class SleepIQEntity(Entity):
self._attr_device_info = device_from_bed(bed) self._attr_device_info = device_from_bed(bed)
class SleepIQBedEntity(CoordinatorEntity): class SleepIQBedEntity(CoordinatorEntity[_SleepIQCoordinatorT]):
"""Implementation of a SleepIQ sensor.""" """Implementation of a SleepIQ sensor."""
_attr_icon = ICON_OCCUPIED _attr_icon = ICON_OCCUPIED
def __init__( def __init__(
self, self,
coordinator: DataUpdateCoordinator, coordinator: _SleepIQCoordinatorT,
bed: SleepIQBed, bed: SleepIQBed,
) -> None: ) -> None:
"""Initialize the SleepIQ sensor entity.""" """Initialize the SleepIQ sensor entity."""
@ -61,14 +65,14 @@ class SleepIQBedEntity(CoordinatorEntity):
"""Update sensor attributes.""" """Update sensor attributes."""
class SleepIQSleeperEntity(SleepIQBedEntity): class SleepIQSleeperEntity(SleepIQBedEntity[_SleepIQCoordinatorT]):
"""Implementation of a SleepIQ sensor.""" """Implementation of a SleepIQ sensor."""
_attr_icon = ICON_OCCUPIED _attr_icon = ICON_OCCUPIED
def __init__( def __init__(
self, self,
coordinator: DataUpdateCoordinator, coordinator: _SleepIQCoordinatorT,
bed: SleepIQBed, bed: SleepIQBed,
sleeper: SleepIQSleeper, sleeper: SleepIQSleeper,
name: str, name: str,

View File

@ -8,10 +8,9 @@ from homeassistant.components.light import ColorMode, LightEntity
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
from .coordinator import SleepIQData from .coordinator import SleepIQData, SleepIQDataUpdateCoordinator
from .entity import SleepIQBedEntity from .entity import SleepIQBedEntity
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -31,14 +30,17 @@ async def async_setup_entry(
) )
class SleepIQLightEntity(SleepIQBedEntity, LightEntity): class SleepIQLightEntity(SleepIQBedEntity[SleepIQDataUpdateCoordinator], LightEntity):
"""Representation of a light.""" """Representation of a light."""
_attr_color_mode = ColorMode.ONOFF _attr_color_mode = ColorMode.ONOFF
_attr_supported_color_modes = {ColorMode.ONOFF} _attr_supported_color_modes = {ColorMode.ONOFF}
def __init__( def __init__(
self, coordinator: DataUpdateCoordinator, bed: SleepIQBed, light: SleepIQLight self,
coordinator: SleepIQDataUpdateCoordinator,
bed: SleepIQBed,
light: SleepIQLight,
) -> None: ) -> None:
"""Initialize the light.""" """Initialize the light."""
self.light = light self.light = light

View File

@ -11,10 +11,9 @@ from homeassistant.components.number import NumberEntity, NumberEntityDescriptio
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import ACTUATOR, DOMAIN, ENTITY_TYPES, FIRMNESS, ICON_OCCUPIED from .const import ACTUATOR, DOMAIN, ENTITY_TYPES, FIRMNESS, ICON_OCCUPIED
from .coordinator import SleepIQData from .coordinator import SleepIQData, SleepIQDataUpdateCoordinator
from .entity import SleepIQBedEntity from .entity import SleepIQBedEntity
@ -130,7 +129,7 @@ async def async_setup_entry(
async_add_entities(entities) async_add_entities(entities)
class SleepIQNumberEntity(SleepIQBedEntity, NumberEntity): class SleepIQNumberEntity(SleepIQBedEntity[SleepIQDataUpdateCoordinator], NumberEntity):
"""Representation of a SleepIQ number entity.""" """Representation of a SleepIQ number entity."""
entity_description: SleepIQNumberEntityDescription entity_description: SleepIQNumberEntityDescription
@ -138,7 +137,7 @@ class SleepIQNumberEntity(SleepIQBedEntity, NumberEntity):
def __init__( def __init__(
self, self,
coordinator: DataUpdateCoordinator, coordinator: SleepIQDataUpdateCoordinator,
bed: SleepIQBed, bed: SleepIQBed,
device: Any, device: Any,
description: SleepIQNumberEntityDescription, description: SleepIQNumberEntityDescription,

View File

@ -7,10 +7,9 @@ from homeassistant.components.select import SelectEntity
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
from .coordinator import SleepIQData from .coordinator import SleepIQData, SleepIQDataUpdateCoordinator
from .entity import SleepIQBedEntity from .entity import SleepIQBedEntity
@ -28,13 +27,16 @@ async def async_setup_entry(
) )
class SleepIQSelectEntity(SleepIQBedEntity, SelectEntity): class SleepIQSelectEntity(SleepIQBedEntity[SleepIQDataUpdateCoordinator], SelectEntity):
"""Representation of a SleepIQ select entity.""" """Representation of a SleepIQ select entity."""
_attr_options = list(BED_PRESETS) _attr_options = list(BED_PRESETS)
def __init__( def __init__(
self, coordinator: DataUpdateCoordinator, bed: SleepIQBed, preset: SleepIQPreset self,
coordinator: SleepIQDataUpdateCoordinator,
bed: SleepIQBed,
preset: SleepIQPreset,
) -> None: ) -> None:
"""Initialize the select entity.""" """Initialize the select entity."""
self.preset = preset self.preset = preset

View File

@ -7,10 +7,9 @@ from homeassistant.components.sensor import SensorEntity, SensorStateClass
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import DOMAIN, PRESSURE, SLEEP_NUMBER from .const import DOMAIN, PRESSURE, SLEEP_NUMBER
from .coordinator import SleepIQData from .coordinator import SleepIQData, SleepIQDataUpdateCoordinator
from .entity import SleepIQSleeperEntity from .entity import SleepIQSleeperEntity
SENSORS = [PRESSURE, SLEEP_NUMBER] SENSORS = [PRESSURE, SLEEP_NUMBER]
@ -31,14 +30,16 @@ async def async_setup_entry(
) )
class SleepIQSensorEntity(SleepIQSleeperEntity, SensorEntity): class SleepIQSensorEntity(
SleepIQSleeperEntity[SleepIQDataUpdateCoordinator], SensorEntity
):
"""Representation of an SleepIQ Entity with CoordinatorEntity.""" """Representation of an SleepIQ Entity with CoordinatorEntity."""
_attr_icon = "mdi:bed" _attr_icon = "mdi:bed"
def __init__( def __init__(
self, self,
coordinator: DataUpdateCoordinator, coordinator: SleepIQDataUpdateCoordinator,
bed: SleepIQBed, bed: SleepIQBed,
sleeper: SleepIQSleeper, sleeper: SleepIQSleeper,
sensor_type: str, sensor_type: str,

View File

@ -28,7 +28,9 @@ async def async_setup_entry(
) )
class SleepNumberPrivateSwitch(SleepIQBedEntity, SwitchEntity): class SleepNumberPrivateSwitch(
SleepIQBedEntity[SleepIQPauseUpdateCoordinator], SwitchEntity
):
"""Representation of SleepIQ privacy mode.""" """Representation of SleepIQ privacy mode."""
def __init__( def __init__(