1
mirror of https://github.com/home-assistant/core synced 2024-08-02 23:40:32 +02:00
ha-core/homeassistant/components/deconz/number.py
Robert Svensson c2f026d0a7
Minor deCONZ clean up (#76323)
* Rename secondary_temperature with internal_temperature

* Prefix binary and sensor descriptions matching on all sensor devices with COMMON_

* Always create entities in the same order

Its been reported previously that if the integration is removed and setup again that entity IDs can change if not sorted in the numerical order

* Rename alarmsystems to alarm_systems

* Use websocket enums

* Don't use legacy pydeconz constants

* Bump pydeconz to v103

* unsub -> unsubscribe
2022-08-06 01:34:27 +02:00

124 lines
3.7 KiB
Python

"""Support for configuring different deCONZ sensors."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from pydeconz.models.event import EventType
from pydeconz.models.sensor.presence import Presence
from homeassistant.components.number import (
DOMAIN,
NumberEntity,
NumberEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .deconz_device import DeconzDevice
from .gateway import DeconzGateway, get_gateway_from_config_entry
@dataclass
class DeconzNumberDescriptionMixin:
"""Required values when describing deCONZ number entities."""
suffix: str
update_key: str
value_fn: Callable[[Presence], float | None]
@dataclass
class DeconzNumberDescription(NumberEntityDescription, DeconzNumberDescriptionMixin):
"""Class describing deCONZ number entities."""
ENTITY_DESCRIPTIONS = {
Presence: [
DeconzNumberDescription(
key="delay",
value_fn=lambda device: device.delay,
suffix="Delay",
update_key="delay",
native_max_value=65535,
native_min_value=0,
native_step=1,
entity_category=EntityCategory.CONFIG,
)
]
}
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the deCONZ number entity."""
gateway = get_gateway_from_config_entry(hass, config_entry)
gateway.entities[DOMAIN] = set()
@callback
def async_add_sensor(_: EventType, sensor_id: str) -> None:
"""Add sensor from deCONZ."""
sensor = gateway.api.sensors.presence[sensor_id]
for description in ENTITY_DESCRIPTIONS.get(type(sensor), []):
if (
not hasattr(sensor, description.key)
or description.value_fn(sensor) is None
):
continue
async_add_entities([DeconzNumber(sensor, gateway, description)])
gateway.register_platform_add_device_callback(
async_add_sensor,
gateway.api.sensors.presence,
always_ignore_clip_sensors=True,
)
class DeconzNumber(DeconzDevice[Presence], NumberEntity):
"""Representation of a deCONZ number entity."""
TYPE = DOMAIN
def __init__(
self,
device: Presence,
gateway: DeconzGateway,
description: DeconzNumberDescription,
) -> None:
"""Initialize deCONZ number entity."""
self.entity_description: DeconzNumberDescription = description
super().__init__(device, gateway)
self._attr_name = f"{device.name} {description.suffix}"
self._update_keys = {self.entity_description.update_key, "reachable"}
@callback
def async_update_callback(self) -> None:
"""Update the number value."""
if self._device.changed_keys.intersection(self._update_keys):
super().async_update_callback()
@property
def native_value(self) -> float | None:
"""Return the value of the sensor property."""
return self.entity_description.value_fn(self._device)
async def async_set_native_value(self, value: float) -> None:
"""Set sensor config."""
await self.gateway.api.sensors.presence.set_config(
id=self._device.resource_id,
delay=int(value),
)
@property
def unique_id(self) -> str:
"""Return a unique identifier for this entity."""
return f"{self.serial}-{self.entity_description.suffix.lower()}"