1 """Support for LED numbers."""
3 from __future__
import annotations
5 from abc
import abstractmethod
6 from collections.abc
import Coroutine
8 from typing
import Any, cast
10 from flux_led.protocol
import (
12 MUSIC_PIXELS_PER_SEGMENT_MAX,
15 PIXELS_PER_SEGMENT_MAX,
19 from homeassistant
import config_entries
29 from .const
import DOMAIN
30 from .coordinator
import FluxLedUpdateCoordinator
31 from .entity
import FluxEntity
32 from .util
import _effect_brightness
34 _LOGGER = logging.getLogger(__name__)
42 async_add_entities: AddEntitiesCallback,
44 """Set up the Flux lights."""
45 coordinator: FluxLedUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
46 device = coordinator.device
49 | FluxPixelsPerSegmentNumber
51 | FluxMusicPixelsPerSegmentNumber
52 | FluxMusicSegmentsNumber
54 base_unique_id = entry.unique_id
or entry.entry_id
56 if device.pixels_per_segment
is not None:
64 if device.segments
is not None:
66 if device.music_pixels_per_segment
is not None:
71 "music_pixels_per_segment",
74 if device.music_segments
is not None:
78 if device.effect_list
and device.effect_list != [EFFECT_RANDOM]:
85 FluxEntity, CoordinatorEntity[FluxLedUpdateCoordinator], NumberEntity
87 """Defines a flux_led speed number."""
89 _attr_native_min_value = 1
90 _attr_native_max_value = 100
92 _attr_mode = NumberMode.SLIDER
93 _attr_translation_key =
"effect_speed"
97 """Return the effect speed."""
98 return cast(float, self._device.speed)
101 """Set the flux speed value."""
102 current_effect = self._device.effect
103 new_speed =
int(value)
104 if not current_effect:
106 "Speed can only be adjusted when an effect is active"
108 if not self._device.speed_adjust_off
and not self._device.is_on:
110 await self._device.async_set_effect(
117 FluxEntity, CoordinatorEntity[FluxLedUpdateCoordinator], NumberEntity
119 """Base class for flux config numbers."""
121 _attr_entity_category = EntityCategory.CONFIG
122 _attr_native_min_value = 1
123 _attr_native_step = 1
124 _attr_mode = NumberMode.BOX
128 coordinator: FluxLedUpdateCoordinator,
132 """Initialize the flux number."""
133 super().
__init__(coordinator, base_unique_id, key)
134 self.
_debouncer_debouncer: Debouncer[Coroutine[Any, Any,
None]] |
None =
None
138 """Set up the debouncer when adding to hass."""
142 cooldown=DEBOUNCE_TIME,
156 """Call on debounce to set the value."""
159 """Check if the base pixel and segment settings will fit for music mode.
161 If they fit, they do not need to be configured.
163 pixels_per_segment = self._device.pixels_per_segment
164 segments = self._device.segments
165 assert pixels_per_segment
is not None
166 assert segments
is not None
168 pixels_per_segment <= MUSIC_PIXELS_PER_SEGMENT_MAX
169 and segments <= MUSIC_SEGMENTS_MAX
170 and pixels_per_segment * segments <= MUSIC_PIXELS_MAX
175 """Defines a flux_led pixels per segment number."""
177 _attr_translation_key =
"pixels_per_segment"
181 """Return the max value."""
183 PIXELS_PER_SEGMENT_MAX,
int(PIXELS_MAX / (self._device.segments
or 1))
188 """Return the pixels per segment."""
189 assert self._device.pixels_per_segment
is not None
190 return self._device.pixels_per_segment
193 """Set the pixels per segment."""
195 await self._device.async_set_device_config(
201 """Defines a flux_led segments number."""
203 _attr_translation_key =
"segments"
207 """Return the max value."""
208 assert self._device.pixels_per_segment
is not None
210 SEGMENTS_MAX,
int(PIXELS_MAX / (self._device.pixels_per_segment
or 1))
215 """Return the segments."""
216 assert self._device.segments
is not None
217 return self._device.segments
220 """Set the segments."""
222 await self._device.async_set_device_config(segments=self.
_pending_value_pending_value)
226 """A number that is only available if the base pixels do not fit in music mode."""
230 """Return if music pixels per segment can be set."""
235 """Defines a flux_led music pixels per segment number."""
237 _attr_translation_key =
"music_pixels_per_segment"
241 """Return the max value."""
242 assert self._device.music_segments
is not None
244 MUSIC_PIXELS_PER_SEGMENT_MAX,
245 int(MUSIC_PIXELS_MAX / (self._device.music_segments
or 1)),
250 """Return the music pixels per segment."""
251 assert self._device.music_pixels_per_segment
is not None
252 return self._device.music_pixels_per_segment
255 """Set the music pixels per segment."""
257 await self._device.async_set_device_config(
263 """Defines a flux_led music segments number."""
265 _attr_translation_key =
"music_segments"
269 """Return the max value."""
270 assert self._device.pixels_per_segment
is not None
273 int(MUSIC_PIXELS_MAX / (self._device.music_pixels_per_segment
or 1)),
278 """Return the music segments."""
279 assert self._device.music_segments
is not None
280 return self._device.music_segments
283 """Set the music segments."""
285 await self._device.async_set_device_config(music_segments=self.
_pending_value_pending_value)
None async_set_native_value(self, float value)
None _async_set_native_value(self)
None __init__(self, FluxLedUpdateCoordinator coordinator, str base_unique_id, str|None key)
bool _pixels_and_segments_fit_in_music_mode(self)
None async_added_to_hass(self)
int native_max_value(self)
None _async_set_native_value(self)
int native_max_value(self)
None _async_set_native_value(self)
None _async_set_native_value(self)
int native_max_value(self)
int native_max_value(self)
None _async_set_native_value(self)
None async_set_native_value(self, float value)
None async_request_refresh(self)
None async_setup_entry(HomeAssistant hass, config_entries.ConfigEntry entry, AddEntitiesCallback async_add_entities)
int _effect_brightness(int brightness)