core/homeassistant/components/rituals_perfume_genie/number.py

90 lines
2.7 KiB
Python
Raw Normal View History

2021-06-08 01:28:31 +00:00
"""Support for Rituals Perfume Genie numbers."""
from __future__ import annotations
from collections.abc import Awaitable, Callable
from dataclasses import dataclass
from typing import Any
from pyrituals import Diffuser
from homeassistant.components.number import NumberEntity, NumberEntityDescription
2021-06-08 01:28:31 +00:00
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN
from .coordinator import RitualsDataUpdateCoordinator
2021-06-08 01:28:31 +00:00
from .entity import DiffuserEntity
@dataclass
class RitualsNumberEntityDescriptionMixin:
"""Mixin for required keys."""
value_fn: Callable[[Diffuser], int]
set_value_fn: Callable[[Diffuser, int], Awaitable[Any]]
@dataclass
class RitualsNumberEntityDescription(
NumberEntityDescription, RitualsNumberEntityDescriptionMixin
):
"""Class describing Rituals number entities."""
ENTITY_DESCRIPTIONS = (
RitualsNumberEntityDescription(
key="perfume_amount",
name="Perfume Amount",
icon="mdi:gauge",
native_min_value=1,
native_max_value=3,
value_fn=lambda diffuser: diffuser.perfume_amount,
set_value_fn=lambda diffuser, value: diffuser.set_perfume_amount(value),
),
)
2021-06-08 01:28:31 +00:00
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the diffuser numbers."""
coordinators: dict[str, RitualsDataUpdateCoordinator] = hass.data[DOMAIN][
config_entry.entry_id
]
async_add_entities(
RitualsNumberEntity(coordinator, description)
for coordinator in coordinators.values()
for description in ENTITY_DESCRIPTIONS
)
2021-06-08 01:28:31 +00:00
class RitualsNumberEntity(DiffuserEntity, NumberEntity):
"""Representation of a diffuser number entity."""
2021-06-08 01:28:31 +00:00
entity_description: RitualsNumberEntityDescription
def __init__(
self,
coordinator: RitualsDataUpdateCoordinator,
description: RitualsNumberEntityDescription,
) -> None:
2021-06-08 01:28:31 +00:00
"""Initialize the diffuser perfume amount number."""
super().__init__(coordinator, description)
self._attr_name = f"{coordinator.diffuser.name} {description.name}"
2021-06-08 01:28:31 +00:00
@property
def native_value(self) -> int:
"""Return the number value."""
return self.entity_description.value_fn(self.coordinator.diffuser)
2021-06-08 01:28:31 +00:00
async def async_set_native_value(self, value: float) -> None:
"""Change to new number value."""
if not value.is_integer():
raise ValueError(f"Can't set value to {value}. Value must be an integer.")
await self.entity_description.set_value_fn(
self.coordinator.diffuser, int(value)
)