core/homeassistant/components/ohme/number.py

90 lines
2.9 KiB
Python

"""Platform for number."""
from collections.abc import Awaitable, Callable
from dataclasses import dataclass
from ohme import ApiException, OhmeApiClient
from homeassistant.components.number import NumberEntity, NumberEntityDescription
from homeassistant.const import PERCENTAGE, UnitOfTime
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .const import DOMAIN
from .coordinator import OhmeConfigEntry
from .entity import OhmeEntity, OhmeEntityDescription
PARALLEL_UPDATES = 1
@dataclass(frozen=True, kw_only=True)
class OhmeNumberDescription(OhmeEntityDescription, NumberEntityDescription):
"""Class describing Ohme number entities."""
set_fn: Callable[[OhmeApiClient, float], Awaitable[None]]
value_fn: Callable[[OhmeApiClient], float]
NUMBER_DESCRIPTION = [
OhmeNumberDescription(
key="target_percentage",
translation_key="target_percentage",
value_fn=lambda client: client.target_soc,
set_fn=lambda client, value: client.async_set_target(target_percent=value),
native_min_value=0,
native_max_value=100,
native_step=1,
native_unit_of_measurement=PERCENTAGE,
),
OhmeNumberDescription(
key="preconditioning_duration",
translation_key="preconditioning_duration",
value_fn=lambda client: client.preconditioning,
set_fn=lambda client, value: client.async_set_target(
pre_condition_length=value
),
native_min_value=0,
native_max_value=60,
native_step=5,
native_unit_of_measurement=UnitOfTime.MINUTES,
),
]
async def async_setup_entry(
hass: HomeAssistant,
config_entry: OhmeConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up numbers."""
coordinators = config_entry.runtime_data
coordinator = coordinators.charge_session_coordinator
async_add_entities(
OhmeNumber(coordinator, description)
for description in NUMBER_DESCRIPTION
if description.is_supported_fn(coordinator.client)
)
class OhmeNumber(OhmeEntity, NumberEntity):
"""Generic number entity for Ohme."""
entity_description: OhmeNumberDescription
@property
def native_value(self) -> float:
"""Return the current value of the number."""
return self.entity_description.value_fn(self.coordinator.client)
async def async_set_native_value(self, value: float) -> None:
"""Set the number value."""
try:
await self.entity_description.set_fn(self.coordinator.client, value)
except ApiException as e:
raise HomeAssistantError(
translation_key="api_failed", translation_domain=DOMAIN
) from e
await self.coordinator.async_request_refresh()