Home Assistant Unofficial Reference 2024.12.1
number.py
Go to the documentation of this file.
1 """Support for Rituals Perfume Genie numbers."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Awaitable, Callable
6 from dataclasses import dataclass
7 from typing import Any
8 
9 from pyrituals import Diffuser
10 
11 from homeassistant.components.number import NumberEntity, NumberEntityDescription
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.core import HomeAssistant
14 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15 
16 from .const import DOMAIN
17 from .coordinator import RitualsDataUpdateCoordinator
18 from .entity import DiffuserEntity
19 
20 
21 @dataclass(frozen=True, kw_only=True)
23  """Class describing Rituals number entities."""
24 
25  value_fn: Callable[[Diffuser], int]
26  set_value_fn: Callable[[Diffuser, int], Awaitable[Any]]
27 
28 
29 ENTITY_DESCRIPTIONS = (
31  key="perfume_amount",
32  translation_key="perfume_amount",
33  native_min_value=1,
34  native_max_value=3,
35  value_fn=lambda diffuser: diffuser.perfume_amount,
36  set_value_fn=lambda diffuser, value: diffuser.set_perfume_amount(value),
37  ),
38 )
39 
40 
42  hass: HomeAssistant,
43  config_entry: ConfigEntry,
44  async_add_entities: AddEntitiesCallback,
45 ) -> None:
46  """Set up the diffuser numbers."""
47  coordinators: dict[str, RitualsDataUpdateCoordinator] = hass.data[DOMAIN][
48  config_entry.entry_id
49  ]
51  RitualsNumberEntity(coordinator, description)
52  for coordinator in coordinators.values()
53  for description in ENTITY_DESCRIPTIONS
54  )
55 
56 
58  """Representation of a diffuser number entity."""
59 
60  entity_description: RitualsNumberEntityDescription
61 
62  @property
63  def native_value(self) -> int:
64  """Return the number value."""
65  return self.entity_descriptionentity_description.value_fn(self.coordinator.diffuser)
66 
67  async def async_set_native_value(self, value: float) -> None:
68  """Change to new number value."""
69  if not value.is_integer():
70  raise ValueError(f"Can't set value to {value}. Value must be an integer.")
71  await self.entity_descriptionentity_description.set_value_fn(
72  self.coordinator.diffuser, int(value)
73  )
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: number.py:45