Home Assistant Unofficial Reference 2024.12.1
number.py
Go to the documentation of this file.
1 """Platform for eq3 number entities."""
2 
3 from collections.abc import Awaitable, Callable
4 from dataclasses import dataclass
5 from typing import TYPE_CHECKING
6 
7 from eq3btsmart import Thermostat
8 from eq3btsmart.const import (
9  EQ3BT_MAX_OFFSET,
10  EQ3BT_MAX_TEMP,
11  EQ3BT_MIN_OFFSET,
12  EQ3BT_MIN_TEMP,
13 )
14 from eq3btsmart.models import Presets
15 
17  NumberDeviceClass,
18  NumberEntity,
19  NumberEntityDescription,
20  NumberMode,
21 )
22 from homeassistant.const import EntityCategory, UnitOfTemperature, UnitOfTime
23 from homeassistant.core import HomeAssistant
24 from homeassistant.helpers.entity_platform import AddEntitiesCallback
25 
26 from . import Eq3ConfigEntry
27 from .const import (
28  ENTITY_KEY_COMFORT,
29  ENTITY_KEY_ECO,
30  ENTITY_KEY_OFFSET,
31  ENTITY_KEY_WINDOW_OPEN_TEMPERATURE,
32  ENTITY_KEY_WINDOW_OPEN_TIMEOUT,
33  EQ3BT_STEP,
34 )
35 from .entity import Eq3Entity
36 
37 
38 @dataclass(frozen=True, kw_only=True)
40  """Entity description for eq3 number entities."""
41 
42  value_func: Callable[[Presets], float]
43  value_set_func: Callable[
44  [Thermostat],
45  Callable[[float], Awaitable[None]],
46  ]
47  mode: NumberMode = NumberMode.BOX
48  entity_category: EntityCategory | None = EntityCategory.CONFIG
49 
50 
51 NUMBER_ENTITY_DESCRIPTIONS = [
53  key=ENTITY_KEY_COMFORT,
54  value_func=lambda presets: presets.comfort_temperature.value,
55  value_set_func=lambda thermostat: thermostat.async_configure_comfort_temperature,
56  translation_key=ENTITY_KEY_COMFORT,
57  native_min_value=EQ3BT_MIN_TEMP,
58  native_max_value=EQ3BT_MAX_TEMP,
59  native_step=EQ3BT_STEP,
60  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
61  device_class=NumberDeviceClass.TEMPERATURE,
62  ),
64  key=ENTITY_KEY_ECO,
65  value_func=lambda presets: presets.eco_temperature.value,
66  value_set_func=lambda thermostat: thermostat.async_configure_eco_temperature,
67  translation_key=ENTITY_KEY_ECO,
68  native_min_value=EQ3BT_MIN_TEMP,
69  native_max_value=EQ3BT_MAX_TEMP,
70  native_step=EQ3BT_STEP,
71  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
72  device_class=NumberDeviceClass.TEMPERATURE,
73  ),
75  key=ENTITY_KEY_WINDOW_OPEN_TEMPERATURE,
76  value_func=lambda presets: presets.window_open_temperature.value,
77  value_set_func=lambda thermostat: thermostat.async_configure_window_open_temperature,
78  translation_key=ENTITY_KEY_WINDOW_OPEN_TEMPERATURE,
79  native_min_value=EQ3BT_MIN_TEMP,
80  native_max_value=EQ3BT_MAX_TEMP,
81  native_step=EQ3BT_STEP,
82  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
83  device_class=NumberDeviceClass.TEMPERATURE,
84  ),
86  key=ENTITY_KEY_OFFSET,
87  value_func=lambda presets: presets.offset_temperature.value,
88  value_set_func=lambda thermostat: thermostat.async_configure_temperature_offset,
89  translation_key=ENTITY_KEY_OFFSET,
90  native_min_value=EQ3BT_MIN_OFFSET,
91  native_max_value=EQ3BT_MAX_OFFSET,
92  native_step=EQ3BT_STEP,
93  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
94  device_class=NumberDeviceClass.TEMPERATURE,
95  ),
97  key=ENTITY_KEY_WINDOW_OPEN_TIMEOUT,
98  value_set_func=lambda thermostat: thermostat.async_configure_window_open_duration,
99  value_func=lambda presets: presets.window_open_time.value.total_seconds() / 60,
100  translation_key=ENTITY_KEY_WINDOW_OPEN_TIMEOUT,
101  native_min_value=0,
102  native_max_value=60,
103  native_step=5,
104  native_unit_of_measurement=UnitOfTime.MINUTES,
105  ),
106 ]
107 
108 
110  hass: HomeAssistant,
111  entry: Eq3ConfigEntry,
112  async_add_entities: AddEntitiesCallback,
113 ) -> None:
114  """Set up the entry."""
115 
117  Eq3NumberEntity(entry, entity_description)
118  for entity_description in NUMBER_ENTITY_DESCRIPTIONS
119  )
120 
121 
123  """Base class for all eq3 number entities."""
124 
125  entity_description: Eq3NumberEntityDescription
126 
127  def __init__(
128  self, entry: Eq3ConfigEntry, entity_description: Eq3NumberEntityDescription
129  ) -> None:
130  """Initialize the entity."""
131 
132  super().__init__(entry, entity_description.key)
133  self.entity_descriptionentity_description = entity_description
134 
135  @property
136  def native_value(self) -> float:
137  """Return the state of the entity."""
138 
139  if TYPE_CHECKING:
140  assert self._thermostat_thermostat.status is not None
141  assert self._thermostat_thermostat.status.presets is not None
142 
143  return self.entity_descriptionentity_description.value_func(self._thermostat_thermostat.status.presets)
144 
145  async def async_set_native_value(self, value: float) -> None:
146  """Set the state of the entity."""
147 
148  await self.entity_descriptionentity_description.value_set_func(self._thermostat_thermostat)(value)
149 
150  @property
151  def available(self) -> bool:
152  """Return whether the entity is available."""
153 
154  return (
155  self._thermostat_thermostat.status is not None
156  and self._thermostat_thermostat.status.presets is not None
157  and self._attr_available_attr_available
158  )
None __init__(self, Eq3ConfigEntry entry, Eq3NumberEntityDescription entity_description)
Definition: number.py:129
None async_setup_entry(HomeAssistant hass, Eq3ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: number.py:113