Files
core/homeassistant/components/evohome/button.py
T

123 lines
3.5 KiB
Python

"""Support for Button entities of the Evohome integration."""
from typing import override
import evohomeasync2 as evo
from homeassistant.components.button import ButtonEntity
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import EVOHOME_DATA
from .coordinator import EvoDataUpdateCoordinator
from .entity import is_valid_zone, unique_zone_id
async def async_setup_platform(
hass: HomeAssistant,
_: ConfigType,
async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None:
"""Set up the button platform for Evohome."""
if discovery_info is None:
return
coordinator = hass.data[EVOHOME_DATA].coordinator
tcs = hass.data[EVOHOME_DATA].tcs
entities: list[EvoResetButtonBase] = [EvoSystemResetButton(coordinator, tcs)]
entities.extend(
EvoZoneResetButton(coordinator, z) for z in tcs.zones if is_valid_zone(z)
)
if tcs.hotwater:
entities.append(EvoDhwResetButton(coordinator, tcs.hotwater))
async_add_entities(entities)
class EvoResetButtonBase(CoordinatorEntity[EvoDataUpdateCoordinator], ButtonEntity):
"""Base for Evohome's Button entities."""
# for _attr_device_class, ButtonDeviceClass.RESET is not available
_attr_entity_category = EntityCategory.CONFIG
_evo_device: evo.ControlSystem | evo.HotWater | evo.Zone
def __init__(
self,
coordinator: EvoDataUpdateCoordinator,
evo_device: evo.ControlSystem | evo.HotWater | evo.Zone,
) -> None:
"""Initialize an Evohome reset button entity."""
super().__init__(coordinator, context=evo_device.id)
self._evo_device = evo_device
self._attr_unique_id = f"{evo_device.id}_reset"
@override
async def async_press(self) -> None:
"""Reset the Evohome entity to its base operating mode."""
await self.coordinator.call_client_api(self._evo_device.reset())
class EvoSystemResetButton(EvoResetButtonBase):
"""Button entity for system reset."""
_evo_device: evo.ControlSystem
def __init__(
self,
coordinator: EvoDataUpdateCoordinator,
evo_device: evo.ControlSystem,
) -> None:
"""Initialize the system reset button."""
super().__init__(coordinator, evo_device)
@property
@override
def name(self) -> str:
"""Return the entity name (follows location renames)."""
return f"Reset {self._evo_device.location.name}"
class EvoDhwResetButton(EvoResetButtonBase):
"""Button entity for DHW override reset."""
_evo_device: evo.HotWater
@property
@override
def name(self) -> str:
"""Return the entity name (follows location renames)."""
return f"Reset {self._evo_device.location.name} DHW"
class EvoZoneResetButton(EvoResetButtonBase):
"""Button entity for zone override reset."""
_evo_device: evo.Zone
def __init__(
self,
coordinator: EvoDataUpdateCoordinator,
evo_device: evo.Zone,
) -> None:
"""Initialize the zone reset button."""
super().__init__(coordinator, evo_device)
self._attr_unique_id = f"{unique_zone_id(evo_device)}_reset"
@property
@override
def name(self) -> str:
"""Return the entity name (follows zone renames)."""
return f"Reset {self._evo_device.name}"