1 """Support for LED numbers."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
7 from functools
import partial
9 from wled
import Segment
16 from .
import WLEDConfigEntry
17 from .const
import ATTR_INTENSITY, ATTR_SPEED
18 from .coordinator
import WLEDDataUpdateCoordinator
19 from .entity
import WLEDEntity
20 from .helpers
import wled_exception_handler
27 entry: WLEDConfigEntry,
28 async_add_entities: AddEntitiesCallback,
30 """Set up WLED number based on a config entry."""
31 coordinator = entry.runtime_data
33 update_segments = partial(
34 async_update_segments,
39 coordinator.async_add_listener(update_segments)
43 @dataclass(frozen=True, kw_only=True)
45 """Class describing WLED number entities."""
47 value_fn: Callable[[Segment], int |
None]
53 translation_key=
"speed",
54 entity_category=EntityCategory.CONFIG,
58 value_fn=
lambda segment: segment.speed,
62 translation_key=
"intensity",
63 entity_category=EntityCategory.CONFIG,
67 value_fn=
lambda segment:
int(segment.intensity),
73 """Defines a WLED speed number."""
75 entity_description: WLEDNumberEntityDescription
79 coordinator: WLEDDataUpdateCoordinator,
81 description: WLEDNumberEntityDescription,
83 """Initialize WLED ."""
84 super().
__init__(coordinator=coordinator)
94 f
"{coordinator.data.info.mac_address}_{description.key}_{segment}"
100 """Return True if entity is available."""
102 self.coordinator.data.state.segments[self.
_segment_segment]
106 return super().available
110 """Return the current WLED segment number value."""
112 self.coordinator.data.state.segments[self.
_segment_segment]
115 @wled_exception_handler
117 """Set the WLED segment value."""
119 if key == ATTR_SPEED:
120 await self.coordinator.wled.segment(
123 elif key == ATTR_INTENSITY:
124 await self.coordinator.wled.segment(
125 segment_id=self.
_segment_segment, intensity=
int(value)
131 coordinator: WLEDDataUpdateCoordinator,
132 current_ids: set[int],
133 async_add_entities: AddEntitiesCallback,
135 """Update segments."""
138 for segment
in coordinator.data.state.segments.values()
139 if segment.segment_id
is not None
142 new_entities: list[WLEDNumber] = []
145 for segment_id
in segment_ids - current_ids:
146 current_ids.add(segment_id)
148 WLEDNumber(coordinator, segment_id, desc)
for desc
in NUMBERS
_attr_translation_placeholders
float|None native_value(self)
None async_set_native_value(self, float value)
None __init__(self, WLEDDataUpdateCoordinator coordinator, int segment, WLEDNumberEntityDescription description)
None async_update_segments(WLEDDataUpdateCoordinator coordinator, set[int] current_ids, AddEntitiesCallback async_add_entities)
None async_setup_entry(HomeAssistant hass, WLEDConfigEntry entry, AddEntitiesCallback async_add_entities)