1
0
mirror of https://github.com/home-assistant/core.git synced 2026-05-25 09:49:52 +01:00
Files
2026-04-30 21:14:48 +02:00

116 lines
3.5 KiB
Python

"""Support for Button entities of the Evohome integration."""
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] = [EvoResetSystemButton(coordinator, tcs)]
entities.extend(
[EvoResetZoneButton(coordinator, z) for z in tcs.zones if is_valid_zone(z)]
)
if tcs.hotwater:
entities.append(EvoResetDhwButton(coordinator, tcs.hotwater))
async_add_entities(entities)
class EvoResetButtonBase(CoordinatorEntity[EvoDataUpdateCoordinator], ButtonEntity):
"""Base for Evohome's Button entities."""
_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
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 EvoResetSystemButton(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)
self._attr_unique_id = f"{evo_device.id}_reset"
self._attr_name = f"Reset {evo_device.location.name}"
class EvoResetDhwButton(EvoResetButtonBase):
"""Button entity for DHW override reset."""
_evo_device: evo.HotWater
def __init__(
self,
coordinator: EvoDataUpdateCoordinator,
evo_device: evo.HotWater,
) -> None:
"""Initialize the DHW reset button."""
super().__init__(coordinator, evo_device)
self._attr_unique_id = f"{evo_device.id}_reset"
self._attr_name = f"Reset {evo_device.name}"
class EvoResetZoneButton(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
def name(self) -> str:
"""Return the name, dynamically following any zone rename."""
return f"Reset {self._evo_device.name}"