Home Assistant Unofficial Reference 2024.12.1
number.py
Go to the documentation of this file.
1 """Support for TPLink number entities."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 import logging
7 from typing import Final, cast
8 
9 from kasa import Device, Feature
10 
12  NumberEntity,
13  NumberEntityDescription,
14  NumberMode,
15 )
16 from homeassistant.core import HomeAssistant, callback
17 from homeassistant.helpers.entity_platform import AddEntitiesCallback
18 
19 from . import TPLinkConfigEntry
20 from .entity import (
21  CoordinatedTPLinkFeatureEntity,
22  TPLinkDataUpdateCoordinator,
23  TPLinkFeatureEntityDescription,
24  async_refresh_after,
25 )
26 
27 _LOGGER = logging.getLogger(__name__)
28 
29 
30 @dataclass(frozen=True, kw_only=True)
32  NumberEntityDescription, TPLinkFeatureEntityDescription
33 ):
34  """Base class for a TPLink feature based sensor entity description."""
35 
36 
37 NUMBER_DESCRIPTIONS: Final = (
39  key="smooth_transition_on",
40  mode=NumberMode.BOX,
41  ),
43  key="smooth_transition_off",
44  mode=NumberMode.BOX,
45  ),
47  key="auto_off_minutes",
48  mode=NumberMode.BOX,
49  ),
51  key="temperature_offset",
52  mode=NumberMode.BOX,
53  ),
54 )
55 
56 NUMBER_DESCRIPTIONS_MAP = {desc.key: desc for desc in NUMBER_DESCRIPTIONS}
57 
58 
60  hass: HomeAssistant,
61  config_entry: TPLinkConfigEntry,
62  async_add_entities: AddEntitiesCallback,
63 ) -> None:
64  """Set up sensors."""
65  data = config_entry.runtime_data
66  parent_coordinator = data.parent_coordinator
67  children_coordinators = data.children_coordinators
68  device = parent_coordinator.device
69  entities = CoordinatedTPLinkFeatureEntity.entities_for_device_and_its_children(
70  hass=hass,
71  device=device,
72  coordinator=parent_coordinator,
73  feature_type=Feature.Type.Number,
74  entity_class=TPLinkNumberEntity,
75  descriptions=NUMBER_DESCRIPTIONS_MAP,
76  child_coordinators=children_coordinators,
77  )
78 
79  async_add_entities(entities)
80 
81 
83  """Representation of a feature-based TPLink sensor."""
84 
85  entity_description: TPLinkNumberEntityDescription
86 
87  def __init__(
88  self,
89  device: Device,
90  coordinator: TPLinkDataUpdateCoordinator,
91  *,
92  feature: Feature,
93  description: TPLinkFeatureEntityDescription,
94  parent: Device | None = None,
95  ) -> None:
96  """Initialize the a switch."""
97  super().__init__(
98  device, coordinator, feature=feature, description=description, parent=parent
99  )
100  self._attr_native_min_value_attr_native_min_value = self._feature_feature.minimum_value
101  self._attr_native_max_value_attr_native_max_value = self._feature_feature.maximum_value
102 
103  @async_refresh_after
104  async def async_set_native_value(self, value: float) -> None:
105  """Set feature value."""
106  await self._feature_feature.set_value(int(value))
107 
108  @callback
109  def _async_update_attrs(self) -> None:
110  """Update the entity's attributes."""
111  self._attr_native_value_attr_native_value = cast(float | None, self._feature_feature.value)