Home Assistant Unofficial Reference 2024.12.1
number.py
Go to the documentation of this file.
1 """Number support for Melnor Bluetooth water timer."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable, Coroutine
6 from dataclasses import dataclass
7 from typing import Any
8 
9 from melnor_bluetooth.device import Valve
10 
12  NumberEntity,
13  NumberEntityDescription,
14  NumberMode,
15 )
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.const import EntityCategory, UnitOfTime
18 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 
21 from .const import DOMAIN
22 from .coordinator import MelnorDataUpdateCoordinator
23 from .entity import MelnorZoneEntity, get_entities_for_valves
24 
25 
26 @dataclass(frozen=True, kw_only=True)
28  """Describes Melnor number entity."""
29 
30  set_num_fn: Callable[[Valve, int], Coroutine[Any, Any, None]]
31  state_fn: Callable[[Valve], Any]
32 
33 
34 ZONE_ENTITY_DESCRIPTIONS: list[MelnorZoneNumberEntityDescription] = [
36  entity_category=EntityCategory.CONFIG,
37  native_max_value=360,
38  native_min_value=1,
39  key="manual_minutes",
40  translation_key="manual_minutes",
41  native_unit_of_measurement=UnitOfTime.MINUTES,
42  set_num_fn=lambda valve, value: valve.set_manual_watering_minutes(value),
43  state_fn=lambda valve: valve.manual_watering_minutes,
44  ),
46  entity_category=EntityCategory.CONFIG,
47  native_max_value=168,
48  native_min_value=1,
49  key="frequency_interval_hours",
50  translation_key="frequency_interval_hours",
51  native_unit_of_measurement=UnitOfTime.HOURS,
52  set_num_fn=lambda valve, value: valve.set_frequency_interval_hours(value),
53  state_fn=lambda valve: valve.frequency.interval_hours,
54  ),
56  entity_category=EntityCategory.CONFIG,
57  native_max_value=360,
58  native_min_value=1,
59  key="frequency_duration_minutes",
60  translation_key="frequency_duration_minutes",
61  native_unit_of_measurement=UnitOfTime.MINUTES,
62  set_num_fn=lambda valve, value: valve.set_frequency_duration_minutes(value),
63  state_fn=lambda valve: valve.frequency.duration_minutes,
64  ),
65 ]
66 
67 
69  hass: HomeAssistant,
70  config_entry: ConfigEntry,
71  async_add_entities: AddEntitiesCallback,
72 ) -> None:
73  """Set up the number platform."""
74 
75  coordinator: MelnorDataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id]
76 
78  get_entities_for_valves(
79  coordinator,
80  ZONE_ENTITY_DESCRIPTIONS,
81  lambda valve, description: MelnorZoneNumber(
82  coordinator, description, valve
83  ),
84  )
85  )
86 
87 
89  """A number implementation for a melnor device."""
90 
91  entity_description: MelnorZoneNumberEntityDescription
92  _attr_mode = NumberMode.BOX
93 
94  def __init__(
95  self,
96  coordinator: MelnorDataUpdateCoordinator,
97  entity_description: MelnorZoneNumberEntityDescription,
98  valve: Valve,
99  ) -> None:
100  """Initialize a number for a melnor device."""
101  super().__init__(coordinator, entity_description, valve)
102 
103  @property
104  def native_value(self) -> float | None:
105  """Return the current value."""
106  return self.entity_descriptionentity_description.state_fn(self._valve_valve)
107 
108  async def async_set_native_value(self, value: float) -> None:
109  """Update the current value."""
110  await self.entity_descriptionentity_description.set_num_fn(self._valve_valve, int(value))
111  self._async_write_ha_state_async_write_ha_state()
None __init__(self, MelnorDataUpdateCoordinator coordinator, MelnorZoneNumberEntityDescription entity_description, Valve valve)
Definition: number.py:99
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: number.py:72