Home Assistant Unofficial Reference 2024.12.1
number.py
Go to the documentation of this file.
1 """Support for WiZ effect speed numbers."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable, Coroutine
6 from dataclasses import dataclass
7 from typing import cast
8 
9 from pywizlight import wizlight
10 
12  NumberEntity,
13  NumberEntityDescription,
14  NumberMode,
15 )
16 from homeassistant.const import EntityCategory
17 from homeassistant.core import HomeAssistant, callback
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from . import WizConfigEntry
21 from .entity import WizEntity
22 from .models import WizData
23 
24 
25 @dataclass(frozen=True, kw_only=True)
27  """Class to describe a WiZ number entity."""
28 
29  required_feature: str
30  set_value_fn: Callable[[wizlight, int], Coroutine[None, None, None]]
31  value_fn: Callable[[wizlight], int | None]
32 
33 
34 async def _async_set_speed(device: wizlight, speed: int) -> None:
35  await device.set_speed(speed)
36 
37 
38 async def _async_set_ratio(device: wizlight, ratio: int) -> None:
39  await device.set_ratio(ratio)
40 
41 
42 NUMBERS: tuple[WizNumberEntityDescription, ...] = (
44  key="effect_speed",
45  translation_key="effect_speed",
46  native_min_value=10,
47  native_max_value=200,
48  native_step=1,
49  value_fn=lambda device: cast(int | None, device.state.get_speed()),
50  set_value_fn=_async_set_speed,
51  required_feature="effect",
52  entity_category=EntityCategory.CONFIG,
53  ),
55  key="dual_head_ratio",
56  translation_key="dual_head_ratio",
57  native_min_value=0,
58  native_max_value=100,
59  native_step=1,
60  value_fn=lambda device: cast(int | None, device.state.get_ratio()),
61  set_value_fn=_async_set_ratio,
62  required_feature="dual_head",
63  entity_category=EntityCategory.CONFIG,
64  ),
65 )
66 
67 
69  hass: HomeAssistant,
70  entry: WizConfigEntry,
71  async_add_entities: AddEntitiesCallback,
72 ) -> None:
73  """Set up the wiz speed number."""
75  WizSpeedNumber(entry.runtime_data, entry.title, description)
76  for description in NUMBERS
77  if getattr(
78  entry.runtime_data.bulb.bulbtype.features, description.required_feature
79  )
80  )
81 
82 
84  """Defines a WiZ speed number."""
85 
86  entity_description: WizNumberEntityDescription
87  _attr_mode = NumberMode.SLIDER
88 
89  def __init__(
90  self, wiz_data: WizData, name: str, description: WizNumberEntityDescription
91  ) -> None:
92  """Initialize an WiZ device."""
93  super().__init__(wiz_data, name)
94  self.entity_descriptionentity_description = description
95  self._attr_unique_id_attr_unique_id_attr_unique_id = f"{self._device.mac}_{description.key}"
96  self._async_update_attrs_async_update_attrs_async_update_attrs()
97 
98  @property
99  def available(self) -> bool:
100  """Return if entity is available."""
101  return (
102  super().available
103  and self.entity_descriptionentity_description.value_fn(self._device_device) is not None
104  )
105 
106  @callback
107  def _async_update_attrs(self) -> None:
108  """Handle updating _attr values."""
109  if (value := self.entity_descriptionentity_description.value_fn(self._device_device)) is not None:
110  self._attr_native_value_attr_native_value = float(value)
111 
112  async def async_set_native_value(self, value: float) -> None:
113  """Set the speed value."""
114  await self.entity_descriptionentity_description.set_value_fn(self._device_device, int(value))
115  await self.coordinator.async_request_refresh()
None async_set_native_value(self, float value)
Definition: number.py:112
None __init__(self, WizData wiz_data, str name, WizNumberEntityDescription description)
Definition: number.py:91
None async_setup_entry(HomeAssistant hass, WizConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: number.py:72
None _async_set_speed(wizlight device, int speed)
Definition: number.py:34
None _async_set_ratio(wizlight device, int ratio)
Definition: number.py:38