core/homeassistant/components/technove/switch.py

122 lines
4.0 KiB
Python

"""Support for TechnoVE switches."""
from __future__ import annotations
from collections.abc import Callable, Coroutine
from dataclasses import dataclass
from typing import Any
from technove import Station as TechnoVEStation
from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ServiceValidationError
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import TechnoVEConfigEntry
from .const import DOMAIN
from .coordinator import TechnoVEDataUpdateCoordinator
from .entity import TechnoVEEntity
from .helpers import technove_exception_handler
async def _set_charging_enabled(
coordinator: TechnoVEDataUpdateCoordinator, enabled: bool
) -> None:
if coordinator.data.info.auto_charge:
raise ServiceValidationError(
translation_domain=DOMAIN,
translation_key="set_charging_enabled_on_auto_charge",
)
await coordinator.technove.set_charging_enabled(enabled=enabled)
coordinator.data.info.is_session_active = enabled
coordinator.async_set_updated_data(coordinator.data)
async def _enable_charging(coordinator: TechnoVEDataUpdateCoordinator) -> None:
await _set_charging_enabled(coordinator, True)
async def _disable_charging(coordinator: TechnoVEDataUpdateCoordinator) -> None:
await _set_charging_enabled(coordinator, False)
async def _set_auto_charge(
coordinator: TechnoVEDataUpdateCoordinator, enabled: bool
) -> None:
await coordinator.technove.set_auto_charge(enabled=enabled)
@dataclass(frozen=True, kw_only=True)
class TechnoVESwitchDescription(SwitchEntityDescription):
"""Describes TechnoVE binary sensor entity."""
is_on_fn: Callable[[TechnoVEStation], bool]
turn_on_fn: Callable[[TechnoVEDataUpdateCoordinator], Coroutine[Any, Any, None]]
turn_off_fn: Callable[[TechnoVEDataUpdateCoordinator], Coroutine[Any, Any, None]]
SWITCHES = [
TechnoVESwitchDescription(
key="auto_charge",
translation_key="auto_charge",
entity_category=EntityCategory.CONFIG,
is_on_fn=lambda station: station.info.auto_charge,
turn_on_fn=lambda coordinator: _set_auto_charge(coordinator, True),
turn_off_fn=lambda coordinator: _set_auto_charge(coordinator, False),
),
TechnoVESwitchDescription(
key="session_active",
translation_key="session_active",
entity_category=EntityCategory.CONFIG,
is_on_fn=lambda station: station.info.is_session_active,
turn_on_fn=_enable_charging,
turn_off_fn=_disable_charging,
),
]
async def async_setup_entry(
hass: HomeAssistant,
entry: TechnoVEConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up TechnoVE switch based on a config entry."""
async_add_entities(
TechnoVESwitchEntity(entry.runtime_data, description)
for description in SWITCHES
)
class TechnoVESwitchEntity(TechnoVEEntity, SwitchEntity):
"""Defines a TechnoVE switch entity."""
entity_description: TechnoVESwitchDescription
def __init__(
self,
coordinator: TechnoVEDataUpdateCoordinator,
description: TechnoVESwitchDescription,
) -> None:
"""Initialize a TechnoVE switch entity."""
self.entity_description = description
super().__init__(coordinator, description.key)
@property
def is_on(self) -> bool:
"""Return the state of the TechnoVE switch."""
return self.entity_description.is_on_fn(self.coordinator.data)
@technove_exception_handler
async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn on the TechnoVE switch."""
await self.entity_description.turn_on_fn(self.coordinator)
@technove_exception_handler
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn off the TechnoVE switch."""
await self.entity_description.turn_off_fn(self.coordinator)