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 __future__ import annotations
from functools import partial
from aioesphomeapi import ( from aioesphomeapi import (
AlarmControlPanelCommand, AlarmControlPanelCommand,
AlarmControlPanelEntityState, AlarmControlPanelEntityState,
@ -28,8 +30,7 @@ from homeassistant.const import (
STATE_ALARM_PENDING, STATE_ALARM_PENDING,
STATE_ALARM_TRIGGERED, STATE_ALARM_TRIGGERED,
) )
from homeassistant.core import HomeAssistant, callback from homeassistant.core import callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .entity import ( from .entity import (
EsphomeEntity, EsphomeEntity,
@ -37,7 +38,6 @@ from .entity import (
esphome_state_property, esphome_state_property,
platform_async_setup_entry, platform_async_setup_entry,
) )
from .entry_data import ESPHomeConfigEntry
from .enum_mapper import EsphomeEnumMapper from .enum_mapper import EsphomeEnumMapper
_ESPHOME_ACP_STATE_TO_HASS_STATE: EsphomeEnumMapper[AlarmControlPanelState, str] = ( _ESPHOME_ACP_STATE_TO_HASS_STATE: EsphomeEnumMapper[AlarmControlPanelState, str] = (
@ -69,22 +69,6 @@ class EspHomeACPFeatures(APIIntEnum):
ARM_VACATION = 32 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( class EsphomeAlarmControlPanel(
EsphomeEntity[AlarmControlPanelInfo, AlarmControlPanelEntityState], EsphomeEntity[AlarmControlPanelInfo, AlarmControlPanelEntityState],
AlarmControlPanelEntity, AlarmControlPanelEntity,
@ -169,3 +153,11 @@ class EsphomeAlarmControlPanel(
self._client.alarm_control_panel_command( self._client.alarm_control_panel_command(
self._key, AlarmControlPanelCommand.TRIGGER, code 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 __future__ import annotations
from functools import partial
from aioesphomeapi import ButtonInfo, EntityInfo, EntityState from aioesphomeapi import ButtonInfo, EntityInfo, EntityState
from homeassistant.components.button import ButtonDeviceClass, ButtonEntity from homeassistant.components.button import ButtonDeviceClass, ButtonEntity
from homeassistant.core import HomeAssistant, callback from homeassistant.core import callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.util.enum import try_parse_enum from homeassistant.util.enum import try_parse_enum
from .entity import ( from .entity import (
@ -14,23 +15,6 @@ from .entity import (
convert_api_error_ha_error, convert_api_error_ha_error,
platform_async_setup_entry, 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): class EsphomeButton(EsphomeEntity[ButtonInfo, EntityState], ButtonEntity):
@ -63,3 +47,11 @@ class EsphomeButton(EsphomeEntity[ButtonInfo, EntityState], ButtonEntity):
async def async_press(self) -> None: async def async_press(self) -> None:
"""Press the button.""" """Press the button."""
self._client.button_command(self._key) 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 import camera
from homeassistant.components.camera import Camera from homeassistant.components.camera import Camera
from homeassistant.core import HomeAssistant, callback from homeassistant.core import callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .entity import EsphomeEntity, platform_async_setup_entry 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]): class EsphomeCamera(Camera, EsphomeEntity[CameraInfo, CameraState]):
@ -95,3 +77,11 @@ class EsphomeCamera(Camera, EsphomeEntity[CameraInfo, CameraState]):
return await camera.async_get_still_stream( return await camera.async_get_still_stream(
request, stream_request, camera.DEFAULT_CONTENT_TYPE, 0.0 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 __future__ import annotations
from functools import partial
from typing import Any, cast from typing import Any, cast
from aioesphomeapi import ( from aioesphomeapi import (
@ -52,8 +53,7 @@ from homeassistant.const import (
PRECISION_WHOLE, PRECISION_WHOLE,
UnitOfTemperature, UnitOfTemperature,
) )
from homeassistant.core import HomeAssistant, callback from homeassistant.core import callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .entity import ( from .entity import (
EsphomeEntity, EsphomeEntity,
@ -61,28 +61,11 @@ from .entity import (
esphome_state_property, esphome_state_property,
platform_async_setup_entry, platform_async_setup_entry,
) )
from .entry_data import ESPHomeConfigEntry
from .enum_mapper import EsphomeEnumMapper from .enum_mapper import EsphomeEnumMapper
FAN_QUIET = "quiet" 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( _CLIMATE_MODES: EsphomeEnumMapper[ClimateMode, HVACMode] = EsphomeEnumMapper(
{ {
ClimateMode.OFF: HVACMode.OFF, ClimateMode.OFF: HVACMode.OFF,
@ -335,3 +318,11 @@ class EsphomeClimateEntity(EsphomeEntity[ClimateInfo, ClimateState], ClimateEnti
self._client.climate_command( self._client.climate_command(
key=self._key, swing_mode=_SWING_MODES.from_hass(swing_mode) 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 __future__ import annotations
from functools import partial
from typing import Any from typing import Any
from aioesphomeapi import APIVersion, CoverInfo, CoverOperation, CoverState, EntityInfo from aioesphomeapi import APIVersion, CoverInfo, CoverOperation, CoverState, EntityInfo
@ -13,8 +14,7 @@ from homeassistant.components.cover import (
CoverEntity, CoverEntity,
CoverEntityFeature, CoverEntityFeature,
) )
from homeassistant.core import HomeAssistant, callback from homeassistant.core import callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.util.enum import try_parse_enum from homeassistant.util.enum import try_parse_enum
from .entity import ( from .entity import (
@ -23,23 +23,6 @@ from .entity import (
esphome_state_property, esphome_state_property,
platform_async_setup_entry, 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): class EsphomeCover(EsphomeEntity[CoverInfo, CoverState], CoverEntity):
@ -137,3 +120,11 @@ class EsphomeCover(EsphomeEntity[CoverInfo, CoverState], CoverEntity):
"""Move the cover tilt to a specific position.""" """Move the cover tilt to a specific position."""
tilt_position: int = kwargs[ATTR_TILT_POSITION] tilt_position: int = kwargs[ATTR_TILT_POSITION]
self._client.cover_command(key=self._key, tilt=tilt_position / 100) 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 __future__ import annotations
from datetime import date from datetime import date
from functools import partial
from aioesphomeapi import DateInfo, DateState from aioesphomeapi import DateInfo, DateState
from homeassistant.components.date import DateEntity 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 .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): 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: async def async_set_value(self, value: date) -> None:
"""Update the current date.""" """Update the current date."""
self._client.date_command(self._key, value.year, value.month, value.day) 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 __future__ import annotations
from datetime import datetime from datetime import datetime
from functools import partial
from aioesphomeapi import DateTimeInfo, DateTimeState from aioesphomeapi import DateTimeInfo, DateTimeState
from homeassistant.components.datetime import DateTimeEntity 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 import homeassistant.util.dt as dt_util
from .entity import EsphomeEntity, esphome_state_property, platform_async_setup_entry 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): 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: async def async_set_value(self, value: datetime) -> None:
"""Update the current datetime.""" """Update the current datetime."""
self._client.datetime_command(self._key, int(value.timestamp())) 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 __future__ import annotations
from functools import partial
from aioesphomeapi import EntityInfo, Event, EventInfo from aioesphomeapi import EntityInfo, Event, EventInfo
from homeassistant.components.event import EventDeviceClass, EventEntity from homeassistant.components.event import EventDeviceClass, EventEntity
from homeassistant.core import HomeAssistant, callback from homeassistant.core import callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.util.enum import try_parse_enum from homeassistant.util.enum import try_parse_enum
from .entity import EsphomeEntity, platform_async_setup_entry 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): class EsphomeEvent(EsphomeEntity[EventInfo, Event], EventEntity):
@ -48,3 +32,11 @@ class EsphomeEvent(EsphomeEntity[EventInfo, Event], EventEntity):
self._update_state_from_entry_data() self._update_state_from_entry_data()
self._trigger_event(self._state.event_type) self._trigger_event(self._state.event_type)
self.async_write_ha_state() 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 __future__ import annotations
from functools import partial
import math import math
from typing import Any from typing import Any
@ -13,8 +14,7 @@ from homeassistant.components.fan import (
FanEntity, FanEntity,
FanEntityFeature, FanEntityFeature,
) )
from homeassistant.core import HomeAssistant, callback from homeassistant.core import callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.util.percentage import ( from homeassistant.util.percentage import (
ordered_list_item_to_percentage, ordered_list_item_to_percentage,
percentage_to_ordered_list_item, percentage_to_ordered_list_item,
@ -28,28 +28,11 @@ from .entity import (
esphome_state_property, esphome_state_property,
platform_async_setup_entry, platform_async_setup_entry,
) )
from .entry_data import ESPHomeConfigEntry
from .enum_mapper import EsphomeEnumMapper from .enum_mapper import EsphomeEnumMapper
ORDERED_NAMED_FAN_SPEEDS = [FanSpeed.LOW, FanSpeed.MEDIUM, FanSpeed.HIGH] 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( _FAN_DIRECTIONS: EsphomeEnumMapper[FanDirection, str] = EsphomeEnumMapper(
{ {
FanDirection.FORWARD: DIRECTION_FORWARD, FanDirection.FORWARD: DIRECTION_FORWARD,
@ -180,3 +163,11 @@ class EsphomeFan(EsphomeEntity[FanInfo, FanState], FanEntity):
self._attr_speed_count = len(ORDERED_NAMED_FAN_SPEEDS) self._attr_speed_count = len(ORDERED_NAMED_FAN_SPEEDS)
else: else:
self._attr_speed_count = static_info.supported_speed_levels 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 __future__ import annotations
from functools import lru_cache from functools import lru_cache, partial
from typing import TYPE_CHECKING, Any, cast from typing import TYPE_CHECKING, Any, cast
from aioesphomeapi import ( from aioesphomeapi import (
@ -29,8 +29,7 @@ from homeassistant.components.light import (
LightEntity, LightEntity,
LightEntityFeature, LightEntityFeature,
) )
from homeassistant.core import HomeAssistant, callback from homeassistant.core import callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .entity import ( from .entity import (
EsphomeEntity, EsphomeEntity,
@ -38,27 +37,10 @@ from .entity import (
esphome_state_property, esphome_state_property,
platform_async_setup_entry, platform_async_setup_entry,
) )
from .entry_data import ESPHomeConfigEntry
FLASH_LENGTHS = {FLASH_SHORT: 2, FLASH_LONG: 10} 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 = { _COLOR_MODE_MAPPING = {
ColorMode.ONOFF: [ ColorMode.ONOFF: [
LightColorCapability.ON_OFF, LightColorCapability.ON_OFF,
@ -437,3 +419,11 @@ class EsphomeLight(EsphomeEntity[LightInfo, LightState], LightEntity):
if ColorMode.COLOR_TEMP in supported: if ColorMode.COLOR_TEMP in supported:
self._attr_min_color_temp_kelvin = _mired_to_kelvin(static_info.max_mireds) 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) 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 __future__ import annotations
from functools import partial
from typing import Any from typing import Any
from aioesphomeapi import EntityInfo, LockCommand, LockEntityState, LockInfo, LockState from aioesphomeapi import EntityInfo, LockCommand, LockEntityState, LockInfo, LockState
from homeassistant.components.lock import LockEntity, LockEntityFeature from homeassistant.components.lock import LockEntity, LockEntityFeature
from homeassistant.const import ATTR_CODE from homeassistant.const import ATTR_CODE
from homeassistant.core import HomeAssistant, callback from homeassistant.core import callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .entity import ( from .entity import (
EsphomeEntity, EsphomeEntity,
@ -17,23 +17,6 @@ from .entity import (
esphome_state_property, esphome_state_property,
platform_async_setup_entry, 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): class EsphomeLock(EsphomeEntity[LockInfo, LockEntityState], LockEntity):
@ -92,3 +75,11 @@ class EsphomeLock(EsphomeEntity[LockInfo, LockEntityState], LockEntity):
async def async_open(self, **kwargs: Any) -> None: async def async_open(self, **kwargs: Any) -> None:
"""Open the door latch.""" """Open the door latch."""
self._client.lock_command(self._key, LockCommand.OPEN) 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 __future__ import annotations
from functools import partial
from typing import Any from typing import Any
from aioesphomeapi import ( from aioesphomeapi import (
@ -23,9 +24,7 @@ from homeassistant.components.media_player import (
MediaType, MediaType,
async_process_play_media_url, async_process_play_media_url,
) )
from homeassistant.config_entries import ConfigEntry from homeassistant.core import callback
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .entity import ( from .entity import (
EsphomeEntity, EsphomeEntity,
@ -35,23 +34,6 @@ from .entity import (
) )
from .enum_mapper import EsphomeEnumMapper 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( _STATES: EsphomeEnumMapper[EspMediaPlayerState, MediaPlayerState] = EsphomeEnumMapper(
{ {
EspMediaPlayerState.IDLE: MediaPlayerState.IDLE, EspMediaPlayerState.IDLE: MediaPlayerState.IDLE,
@ -159,3 +141,11 @@ class EsphomeMediaPlayer(
self._key, self._key,
command=MediaPlayerCommand.MUTE if mute else MediaPlayerCommand.UNMUTE, 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 __future__ import annotations
from functools import partial
import math import math
from aioesphomeapi import ( from aioesphomeapi import (
@ -12,9 +13,7 @@ from aioesphomeapi import (
) )
from homeassistant.components.number import NumberDeviceClass, NumberEntity, NumberMode from homeassistant.components.number import NumberDeviceClass, NumberEntity, NumberMode
from homeassistant.config_entries import ConfigEntry from homeassistant.core import callback
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.util.enum import try_parse_enum from homeassistant.util.enum import try_parse_enum
from .entity import ( from .entity import (
@ -25,23 +24,6 @@ from .entity import (
) )
from .enum_mapper import EsphomeEnumMapper 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( NUMBER_MODES: EsphomeEnumMapper[EsphomeNumberMode, NumberMode] = EsphomeEnumMapper(
{ {
EsphomeNumberMode.AUTO: NumberMode.AUTO, EsphomeNumberMode.AUTO: NumberMode.AUTO,
@ -87,3 +69,11 @@ class EsphomeNumber(EsphomeEntity[NumberInfo, NumberState], NumberEntity):
async def async_set_native_value(self, value: float) -> None: async def async_set_native_value(self, value: float) -> None:
"""Update the current value.""" """Update the current value."""
self._client.number_command(self._key, 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 __future__ import annotations
from functools import partial
from typing import Any from typing import Any
from aioesphomeapi import EntityInfo, SwitchInfo, SwitchState from aioesphomeapi import EntityInfo, SwitchInfo, SwitchState
from homeassistant.components.switch import SwitchDeviceClass, SwitchEntity from homeassistant.components.switch import SwitchDeviceClass, SwitchEntity
from homeassistant.core import HomeAssistant, callback from homeassistant.core import callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.util.enum import try_parse_enum from homeassistant.util.enum import try_parse_enum
from .entity import ( from .entity import (
@ -17,23 +17,6 @@ from .entity import (
esphome_state_property, esphome_state_property,
platform_async_setup_entry, 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): 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: async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn the entity off.""" """Turn the entity off."""
self._client.switch_command(self._key, False) 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 __future__ import annotations
from functools import partial
from aioesphomeapi import EntityInfo, TextInfo, TextMode as EsphomeTextMode, TextState from aioesphomeapi import EntityInfo, TextInfo, TextMode as EsphomeTextMode, TextState
from homeassistant.components.text import TextEntity, TextMode from homeassistant.components.text import TextEntity, TextMode
from homeassistant.config_entries import ConfigEntry from homeassistant.core import callback
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .entity import ( from .entity import (
EsphomeEntity, EsphomeEntity,
@ -17,23 +17,6 @@ from .entity import (
) )
from .enum_mapper import EsphomeEnumMapper 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( TEXT_MODES: EsphomeEnumMapper[EsphomeTextMode, TextMode] = EsphomeEnumMapper(
{ {
EsphomeTextMode.TEXT: TextMode.TEXT, EsphomeTextMode.TEXT: TextMode.TEXT,
@ -68,3 +51,11 @@ class EsphomeText(EsphomeEntity[TextInfo, TextState], TextEntity):
async def async_set_value(self, value: str) -> None: async def async_set_value(self, value: str) -> None:
"""Update the current value.""" """Update the current value."""
self._client.text_command(self._key, 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 __future__ import annotations
from datetime import time from datetime import time
from functools import partial
from aioesphomeapi import TimeInfo, TimeState from aioesphomeapi import TimeInfo, TimeState
from homeassistant.components.time import TimeEntity 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 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): class EsphomeTime(EsphomeEntity[TimeInfo, TimeState], TimeEntity):
"""A time implementation for esphome.""" """A time implementation for esphome."""
@ -45,3 +27,11 @@ class EsphomeTime(EsphomeEntity[TimeInfo, TimeState], TimeEntity):
async def async_set_value(self, value: time) -> None: async def async_set_value(self, value: time) -> None:
"""Update the current time.""" """Update the current time."""
self._client.time_command(self._key, value.hour, value.minute, value.second) 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 __future__ import annotations
from functools import partial
from typing import Any from typing import Any
from aioesphomeapi import EntityInfo, ValveInfo, ValveOperation, ValveState from aioesphomeapi import EntityInfo, ValveInfo, ValveOperation, ValveState
@ -11,8 +12,7 @@ from homeassistant.components.valve import (
ValveEntity, ValveEntity,
ValveEntityFeature, ValveEntityFeature,
) )
from homeassistant.core import HomeAssistant, callback from homeassistant.core import callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.util.enum import try_parse_enum from homeassistant.util.enum import try_parse_enum
from .entity import ( from .entity import (
@ -21,23 +21,6 @@ from .entity import (
esphome_state_property, esphome_state_property,
platform_async_setup_entry, 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): 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: async def async_set_valve_position(self, position: float) -> None:
"""Move the valve to a specific position.""" """Move the valve to a specific position."""
self._client.valve_command(key=self._key, position=position / 100) 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,
)