Files
ha-ninlight/custom_components/ninlight/number.py
T

70 lines
2.3 KiB
Python

"""Fade and transition settings of a ninlight lamp."""
from __future__ import annotations
from dataclasses import dataclass
from homeassistant.components.number import (
NumberDeviceClass,
NumberEntity,
NumberEntityDescription,
NumberMode,
)
from homeassistant.const import EntityCategory, UnitOfTime
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .coordinator import NinlightConfigEntry, NinlightCoordinator
from .entity import NinlightEntity
PARALLEL_UPDATES = 0
@dataclass(frozen=True, kw_only=True)
class NinlightNumberDescription(NumberEntityDescription):
"""A millisecond setting stored under `key` in the lamp state."""
entity_category: EntityCategory = EntityCategory.CONFIG
device_class: NumberDeviceClass = NumberDeviceClass.DURATION
native_unit_of_measurement: str = UnitOfTime.MILLISECONDS
native_min_value: float = 0
native_step: float = 50
mode: NumberMode = NumberMode.BOX
NUMBERS = (
NinlightNumberDescription(key="fade_in", translation_key="fade_in", native_max_value=10_000),
NinlightNumberDescription(key="fade_out", translation_key="fade_out", native_max_value=10_000),
NinlightNumberDescription(
key="transition_default", translation_key="transition_default", native_max_value=60_000
),
)
async def async_setup_entry(
hass: HomeAssistant,
entry: NinlightConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
async_add_entities(NinlightNumber(entry.runtime_data, description) for description in NUMBERS)
class NinlightNumber(NinlightEntity, NumberEntity):
"""One millisecond setting."""
entity_description: NinlightNumberDescription
def __init__(
self, coordinator: NinlightCoordinator, description: NinlightNumberDescription
) -> None:
super().__init__(coordinator, description.key)
self.entity_description = description
@property
def native_value(self) -> int | None:
value = self.coordinator.data.state.get(self.entity_description.key)
return int(value) if value is not None else None
async def async_set_native_value(self, value: float) -> None:
await self.coordinator.async_set_state(**{self.entity_description.key: int(value)})