Refactor esphome platform setup to reduce boilerplate (#120415)

This commit is contained in:
J. Nick Koston 2024-06-25 17:03:04 +02:00 committed by GitHub
parent 49e6316c42
commit 4feca36ca6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 170 additions and 327 deletions

View file

@ -2,6 +2,8 @@
from __future__ import annotations
from functools import partial
from aioesphomeapi import (
AlarmControlPanelCommand,
AlarmControlPanelEntityState,
@ -28,8 +30,7 @@ from homeassistant.const import (
STATE_ALARM_PENDING,
STATE_ALARM_TRIGGERED,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from .entity import (
EsphomeEntity,
@ -37,7 +38,6 @@ from .entity import (
esphome_state_property,
platform_async_setup_entry,
)
from .entry_data import ESPHomeConfigEntry
from .enum_mapper import EsphomeEnumMapper
_ESPHOME_ACP_STATE_TO_HASS_STATE: EsphomeEnumMapper[AlarmControlPanelState, str] = (
@ -69,22 +69,6 @@ class EspHomeACPFeatures(APIIntEnum):
ARM_VACATION = 32
async def async_setup_entry(
hass: HomeAssistant,
entry: ESPHomeConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up ESPHome switches based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=AlarmControlPanelInfo,
entity_type=EsphomeAlarmControlPanel,
state_type=AlarmControlPanelEntityState,
)
class EsphomeAlarmControlPanel(
EsphomeEntity[AlarmControlPanelInfo, AlarmControlPanelEntityState],
AlarmControlPanelEntity,
@ -169,3 +153,11 @@ class EsphomeAlarmControlPanel(
self._client.alarm_control_panel_command(
self._key, AlarmControlPanelCommand.TRIGGER, code
)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=AlarmControlPanelInfo,
entity_type=EsphomeAlarmControlPanel,
state_type=AlarmControlPanelEntityState,
)

View file

@ -2,11 +2,12 @@
from __future__ import annotations
from functools import partial
from aioesphomeapi import ButtonInfo, EntityInfo, EntityState
from homeassistant.components.button import ButtonDeviceClass, ButtonEntity
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from homeassistant.util.enum import try_parse_enum
from .entity import (
@ -14,23 +15,6 @@ from .entity import (
convert_api_error_ha_error,
platform_async_setup_entry,
)
from .entry_data import ESPHomeConfigEntry
async def async_setup_entry(
hass: HomeAssistant,
entry: ESPHomeConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up ESPHome buttons based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=ButtonInfo,
entity_type=EsphomeButton,
state_type=EntityState,
)
class EsphomeButton(EsphomeEntity[ButtonInfo, EntityState], ButtonEntity):
@ -63,3 +47,11 @@ class EsphomeButton(EsphomeEntity[ButtonInfo, EntityState], ButtonEntity):
async def async_press(self) -> None:
"""Press the button."""
self._client.button_command(self._key)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=ButtonInfo,
entity_type=EsphomeButton,
state_type=EntityState,
)

View file

@ -12,27 +12,9 @@ from aiohttp import web
from homeassistant.components import camera
from homeassistant.components.camera import Camera
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from .entity import EsphomeEntity, platform_async_setup_entry
from .entry_data import ESPHomeConfigEntry
async def async_setup_entry(
hass: HomeAssistant,
entry: ESPHomeConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up esphome cameras based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=CameraInfo,
entity_type=EsphomeCamera,
state_type=CameraState,
)
class EsphomeCamera(Camera, EsphomeEntity[CameraInfo, CameraState]):
@ -95,3 +77,11 @@ class EsphomeCamera(Camera, EsphomeEntity[CameraInfo, CameraState]):
return await camera.async_get_still_stream(
request, stream_request, camera.DEFAULT_CONTENT_TYPE, 0.0
)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=CameraInfo,
entity_type=EsphomeCamera,
state_type=CameraState,
)

View file

@ -2,6 +2,7 @@
from __future__ import annotations
from functools import partial
from typing import Any, cast
from aioesphomeapi import (
@ -52,8 +53,7 @@ from homeassistant.const import (
PRECISION_WHOLE,
UnitOfTemperature,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from .entity import (
EsphomeEntity,
@ -61,28 +61,11 @@ from .entity import (
esphome_state_property,
platform_async_setup_entry,
)
from .entry_data import ESPHomeConfigEntry
from .enum_mapper import EsphomeEnumMapper
FAN_QUIET = "quiet"
async def async_setup_entry(
hass: HomeAssistant,
entry: ESPHomeConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up ESPHome climate devices based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=ClimateInfo,
entity_type=EsphomeClimateEntity,
state_type=ClimateState,
)
_CLIMATE_MODES: EsphomeEnumMapper[ClimateMode, HVACMode] = EsphomeEnumMapper(
{
ClimateMode.OFF: HVACMode.OFF,
@ -335,3 +318,11 @@ class EsphomeClimateEntity(EsphomeEntity[ClimateInfo, ClimateState], ClimateEnti
self._client.climate_command(
key=self._key, swing_mode=_SWING_MODES.from_hass(swing_mode)
)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=ClimateInfo,
entity_type=EsphomeClimateEntity,
state_type=ClimateState,
)

View file

@ -2,6 +2,7 @@
from __future__ import annotations
from functools import partial
from typing import Any
from aioesphomeapi import APIVersion, CoverInfo, CoverOperation, CoverState, EntityInfo
@ -13,8 +14,7 @@ from homeassistant.components.cover import (
CoverEntity,
CoverEntityFeature,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from homeassistant.util.enum import try_parse_enum
from .entity import (
@ -23,23 +23,6 @@ from .entity import (
esphome_state_property,
platform_async_setup_entry,
)
from .entry_data import ESPHomeConfigEntry
async def async_setup_entry(
hass: HomeAssistant,
entry: ESPHomeConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up ESPHome covers based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=CoverInfo,
entity_type=EsphomeCover,
state_type=CoverState,
)
class EsphomeCover(EsphomeEntity[CoverInfo, CoverState], CoverEntity):
@ -137,3 +120,11 @@ class EsphomeCover(EsphomeEntity[CoverInfo, CoverState], CoverEntity):
"""Move the cover tilt to a specific position."""
tilt_position: int = kwargs[ATTR_TILT_POSITION]
self._client.cover_command(key=self._key, tilt=tilt_position / 100)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=CoverInfo,
entity_type=EsphomeCover,
state_type=CoverState,
)

View file

@ -3,31 +3,13 @@
from __future__ import annotations
from datetime import date
from functools import partial
from aioesphomeapi import DateInfo, DateState
from homeassistant.components.date import DateEntity
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .entity import EsphomeEntity, esphome_state_property, platform_async_setup_entry
from .entry_data import ESPHomeConfigEntry
async def async_setup_entry(
hass: HomeAssistant,
entry: ESPHomeConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up esphome dates based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=DateInfo,
entity_type=EsphomeDate,
state_type=DateState,
)
class EsphomeDate(EsphomeEntity[DateInfo, DateState], DateEntity):
@ -45,3 +27,11 @@ class EsphomeDate(EsphomeEntity[DateInfo, DateState], DateEntity):
async def async_set_value(self, value: date) -> None:
"""Update the current date."""
self._client.date_command(self._key, value.year, value.month, value.day)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=DateInfo,
entity_type=EsphomeDate,
state_type=DateState,
)

View file

@ -3,32 +3,14 @@
from __future__ import annotations
from datetime import datetime
from functools import partial
from aioesphomeapi import DateTimeInfo, DateTimeState
from homeassistant.components.datetime import DateTimeEntity
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
import homeassistant.util.dt as dt_util
from .entity import EsphomeEntity, esphome_state_property, platform_async_setup_entry
from .entry_data import ESPHomeConfigEntry
async def async_setup_entry(
hass: HomeAssistant,
entry: ESPHomeConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up esphome datetimes based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=DateTimeInfo,
entity_type=EsphomeDateTime,
state_type=DateTimeState,
)
class EsphomeDateTime(EsphomeEntity[DateTimeInfo, DateTimeState], DateTimeEntity):
@ -46,3 +28,11 @@ class EsphomeDateTime(EsphomeEntity[DateTimeInfo, DateTimeState], DateTimeEntity
async def async_set_value(self, value: datetime) -> None:
"""Update the current datetime."""
self._client.datetime_command(self._key, int(value.timestamp()))
async_setup_entry = partial(
platform_async_setup_entry,
info_type=DateTimeInfo,
entity_type=EsphomeDateTime,
state_type=DateTimeState,
)

View file

@ -2,31 +2,15 @@
from __future__ import annotations
from functools import partial
from aioesphomeapi import EntityInfo, Event, EventInfo
from homeassistant.components.event import EventDeviceClass, EventEntity
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from homeassistant.util.enum import try_parse_enum
from .entity import EsphomeEntity, platform_async_setup_entry
from .entry_data import ESPHomeConfigEntry
async def async_setup_entry(
hass: HomeAssistant,
entry: ESPHomeConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up ESPHome event based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=EventInfo,
entity_type=EsphomeEvent,
state_type=Event,
)
class EsphomeEvent(EsphomeEntity[EventInfo, Event], EventEntity):
@ -48,3 +32,11 @@ class EsphomeEvent(EsphomeEntity[EventInfo, Event], EventEntity):
self._update_state_from_entry_data()
self._trigger_event(self._state.event_type)
self.async_write_ha_state()
async_setup_entry = partial(
platform_async_setup_entry,
info_type=EventInfo,
entity_type=EsphomeEvent,
state_type=Event,
)

View file

@ -2,6 +2,7 @@
from __future__ import annotations
from functools import partial
import math
from typing import Any
@ -13,8 +14,7 @@ from homeassistant.components.fan import (
FanEntity,
FanEntityFeature,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from homeassistant.util.percentage import (
ordered_list_item_to_percentage,
percentage_to_ordered_list_item,
@ -28,28 +28,11 @@ from .entity import (
esphome_state_property,
platform_async_setup_entry,
)
from .entry_data import ESPHomeConfigEntry
from .enum_mapper import EsphomeEnumMapper
ORDERED_NAMED_FAN_SPEEDS = [FanSpeed.LOW, FanSpeed.MEDIUM, FanSpeed.HIGH]
async def async_setup_entry(
hass: HomeAssistant,
entry: ESPHomeConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up ESPHome fans based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=FanInfo,
entity_type=EsphomeFan,
state_type=FanState,
)
_FAN_DIRECTIONS: EsphomeEnumMapper[FanDirection, str] = EsphomeEnumMapper(
{
FanDirection.FORWARD: DIRECTION_FORWARD,
@ -180,3 +163,11 @@ class EsphomeFan(EsphomeEntity[FanInfo, FanState], FanEntity):
self._attr_speed_count = len(ORDERED_NAMED_FAN_SPEEDS)
else:
self._attr_speed_count = static_info.supported_speed_levels
async_setup_entry = partial(
platform_async_setup_entry,
info_type=FanInfo,
entity_type=EsphomeFan,
state_type=FanState,
)

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from functools import lru_cache
from functools import lru_cache, partial
from typing import TYPE_CHECKING, Any, cast
from aioesphomeapi import (
@ -29,8 +29,7 @@ from homeassistant.components.light import (
LightEntity,
LightEntityFeature,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from .entity import (
EsphomeEntity,
@ -38,27 +37,10 @@ from .entity import (
esphome_state_property,
platform_async_setup_entry,
)
from .entry_data import ESPHomeConfigEntry
FLASH_LENGTHS = {FLASH_SHORT: 2, FLASH_LONG: 10}
async def async_setup_entry(
hass: HomeAssistant,
entry: ESPHomeConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up ESPHome lights based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=LightInfo,
entity_type=EsphomeLight,
state_type=LightState,
)
_COLOR_MODE_MAPPING = {
ColorMode.ONOFF: [
LightColorCapability.ON_OFF,
@ -437,3 +419,11 @@ class EsphomeLight(EsphomeEntity[LightInfo, LightState], LightEntity):
if ColorMode.COLOR_TEMP in supported:
self._attr_min_color_temp_kelvin = _mired_to_kelvin(static_info.max_mireds)
self._attr_max_color_temp_kelvin = _mired_to_kelvin(static_info.min_mireds)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=LightInfo,
entity_type=EsphomeLight,
state_type=LightState,
)

View file

@ -2,14 +2,14 @@
from __future__ import annotations
from functools import partial
from typing import Any
from aioesphomeapi import EntityInfo, LockCommand, LockEntityState, LockInfo, LockState
from homeassistant.components.lock import LockEntity, LockEntityFeature
from homeassistant.const import ATTR_CODE
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from .entity import (
EsphomeEntity,
@ -17,23 +17,6 @@ from .entity import (
esphome_state_property,
platform_async_setup_entry,
)
from .entry_data import ESPHomeConfigEntry
async def async_setup_entry(
hass: HomeAssistant,
entry: ESPHomeConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up ESPHome switches based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=LockInfo,
entity_type=EsphomeLock,
state_type=LockEntityState,
)
class EsphomeLock(EsphomeEntity[LockInfo, LockEntityState], LockEntity):
@ -92,3 +75,11 @@ class EsphomeLock(EsphomeEntity[LockInfo, LockEntityState], LockEntity):
async def async_open(self, **kwargs: Any) -> None:
"""Open the door latch."""
self._client.lock_command(self._key, LockCommand.OPEN)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=LockInfo,
entity_type=EsphomeLock,
state_type=LockEntityState,
)

View file

@ -2,6 +2,7 @@
from __future__ import annotations
from functools import partial
from typing import Any
from aioesphomeapi import (
@ -23,9 +24,7 @@ from homeassistant.components.media_player import (
MediaType,
async_process_play_media_url,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from .entity import (
EsphomeEntity,
@ -35,23 +34,6 @@ from .entity import (
)
from .enum_mapper import EsphomeEnumMapper
async def async_setup_entry(
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up esphome media players based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=MediaPlayerInfo,
entity_type=EsphomeMediaPlayer,
state_type=MediaPlayerEntityState,
)
_STATES: EsphomeEnumMapper[EspMediaPlayerState, MediaPlayerState] = EsphomeEnumMapper(
{
EspMediaPlayerState.IDLE: MediaPlayerState.IDLE,
@ -159,3 +141,11 @@ class EsphomeMediaPlayer(
self._key,
command=MediaPlayerCommand.MUTE if mute else MediaPlayerCommand.UNMUTE,
)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=MediaPlayerInfo,
entity_type=EsphomeMediaPlayer,
state_type=MediaPlayerEntityState,
)

View file

@ -2,6 +2,7 @@
from __future__ import annotations
from functools import partial
import math
from aioesphomeapi import (
@ -12,9 +13,7 @@ from aioesphomeapi import (
)
from homeassistant.components.number import NumberDeviceClass, NumberEntity, NumberMode
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from homeassistant.util.enum import try_parse_enum
from .entity import (
@ -25,23 +24,6 @@ from .entity import (
)
from .enum_mapper import EsphomeEnumMapper
async def async_setup_entry(
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up esphome numbers based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=NumberInfo,
entity_type=EsphomeNumber,
state_type=NumberState,
)
NUMBER_MODES: EsphomeEnumMapper[EsphomeNumberMode, NumberMode] = EsphomeEnumMapper(
{
EsphomeNumberMode.AUTO: NumberMode.AUTO,
@ -87,3 +69,11 @@ class EsphomeNumber(EsphomeEntity[NumberInfo, NumberState], NumberEntity):
async def async_set_native_value(self, value: float) -> None:
"""Update the current value."""
self._client.number_command(self._key, value)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=NumberInfo,
entity_type=EsphomeNumber,
state_type=NumberState,
)

View file

@ -2,13 +2,13 @@
from __future__ import annotations
from functools import partial
from typing import Any
from aioesphomeapi import EntityInfo, SwitchInfo, SwitchState
from homeassistant.components.switch import SwitchDeviceClass, SwitchEntity
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from homeassistant.util.enum import try_parse_enum
from .entity import (
@ -17,23 +17,6 @@ from .entity import (
esphome_state_property,
platform_async_setup_entry,
)
from .entry_data import ESPHomeConfigEntry
async def async_setup_entry(
hass: HomeAssistant,
entry: ESPHomeConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up ESPHome switches based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=SwitchInfo,
entity_type=EsphomeSwitch,
state_type=SwitchState,
)
class EsphomeSwitch(EsphomeEntity[SwitchInfo, SwitchState], SwitchEntity):
@ -64,3 +47,11 @@ class EsphomeSwitch(EsphomeEntity[SwitchInfo, SwitchState], SwitchEntity):
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn the entity off."""
self._client.switch_command(self._key, False)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=SwitchInfo,
entity_type=EsphomeSwitch,
state_type=SwitchState,
)

View file

@ -2,12 +2,12 @@
from __future__ import annotations
from functools import partial
from aioesphomeapi import EntityInfo, TextInfo, TextMode as EsphomeTextMode, TextState
from homeassistant.components.text import TextEntity, TextMode
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from .entity import (
EsphomeEntity,
@ -17,23 +17,6 @@ from .entity import (
)
from .enum_mapper import EsphomeEnumMapper
async def async_setup_entry(
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up esphome texts based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=TextInfo,
entity_type=EsphomeText,
state_type=TextState,
)
TEXT_MODES: EsphomeEnumMapper[EsphomeTextMode, TextMode] = EsphomeEnumMapper(
{
EsphomeTextMode.TEXT: TextMode.TEXT,
@ -68,3 +51,11 @@ class EsphomeText(EsphomeEntity[TextInfo, TextState], TextEntity):
async def async_set_value(self, value: str) -> None:
"""Update the current value."""
self._client.text_command(self._key, value)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=TextInfo,
entity_type=EsphomeText,
state_type=TextState,
)

View file

@ -3,33 +3,15 @@
from __future__ import annotations
from datetime import time
from functools import partial
from aioesphomeapi import TimeInfo, TimeState
from homeassistant.components.time import TimeEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .entity import EsphomeEntity, esphome_state_property, platform_async_setup_entry
async def async_setup_entry(
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up esphome times based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=TimeInfo,
entity_type=EsphomeTime,
state_type=TimeState,
)
class EsphomeTime(EsphomeEntity[TimeInfo, TimeState], TimeEntity):
"""A time implementation for esphome."""
@ -45,3 +27,11 @@ class EsphomeTime(EsphomeEntity[TimeInfo, TimeState], TimeEntity):
async def async_set_value(self, value: time) -> None:
"""Update the current time."""
self._client.time_command(self._key, value.hour, value.minute, value.second)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=TimeInfo,
entity_type=EsphomeTime,
state_type=TimeState,
)

View file

@ -2,6 +2,7 @@
from __future__ import annotations
from functools import partial
from typing import Any
from aioesphomeapi import EntityInfo, ValveInfo, ValveOperation, ValveState
@ -11,8 +12,7 @@ from homeassistant.components.valve import (
ValveEntity,
ValveEntityFeature,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.core import callback
from homeassistant.util.enum import try_parse_enum
from .entity import (
@ -21,23 +21,6 @@ from .entity import (
esphome_state_property,
platform_async_setup_entry,
)
from .entry_data import ESPHomeConfigEntry
async def async_setup_entry(
hass: HomeAssistant,
entry: ESPHomeConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up ESPHome valves based on a config entry."""
await platform_async_setup_entry(
hass,
entry,
async_add_entities,
info_type=ValveInfo,
entity_type=EsphomeValve,
state_type=ValveState,
)
class EsphomeValve(EsphomeEntity[ValveInfo, ValveState], ValveEntity):
@ -103,3 +86,11 @@ class EsphomeValve(EsphomeEntity[ValveInfo, ValveState], ValveEntity):
async def async_set_valve_position(self, position: float) -> None:
"""Move the valve to a specific position."""
self._client.valve_command(key=self._key, position=position / 100)
async_setup_entry = partial(
platform_async_setup_entry,
info_type=ValveInfo,
entity_type=EsphomeValve,
state_type=ValveState,
)