1 """Support for LED lights."""
3 from __future__
import annotations
5 from functools
import partial
6 from typing
import Any, cast
10 ATTR_COLOR_TEMP_KELVIN,
22 from .
import WLEDConfigEntry
30 LIGHT_CAPABILITIES_COLOR_MODE_MAPPING,
32 from .coordinator
import WLEDDataUpdateCoordinator
33 from .entity
import WLEDEntity
34 from .helpers
import kelvin_to_255, kelvin_to_255_reverse, wled_exception_handler
41 entry: WLEDConfigEntry,
42 async_add_entities: AddEntitiesCallback,
44 """Set up WLED light based on a config entry."""
45 coordinator = entry.runtime_data
46 if coordinator.keep_main_light:
49 update_segments = partial(
50 async_update_segments,
56 coordinator.async_add_listener(update_segments)
61 """Defines a WLED main light."""
63 _attr_color_mode = ColorMode.BRIGHTNESS
64 _attr_translation_key =
"main"
65 _attr_supported_features = LightEntityFeature.TRANSITION
66 _attr_supported_color_modes = {ColorMode.BRIGHTNESS}
68 def __init__(self, coordinator: WLEDDataUpdateCoordinator) ->
None:
69 """Initialize WLED main light."""
70 super().
__init__(coordinator=coordinator)
75 """Return the brightness of this light between 1..255."""
76 return self.coordinator.data.state.brightness
80 """Return the state of the light."""
81 return bool(self.coordinator.data.state.on)
85 """Return if this main light is available or not."""
86 return self.coordinator.has_main_light
and super().available
88 @wled_exception_handler
90 """Turn off the light."""
92 if ATTR_TRANSITION
in kwargs:
94 transition = round(kwargs[ATTR_TRANSITION] * 10)
96 await self.coordinator.wled.master(on=
False, transition=transition)
98 @wled_exception_handler
100 """Turn on the light."""
102 if ATTR_TRANSITION
in kwargs:
104 transition = round(kwargs[ATTR_TRANSITION] * 10)
106 await self.coordinator.wled.master(
107 on=
True, brightness=kwargs.get(ATTR_BRIGHTNESS), transition=transition
112 """Defines a WLED light based on a segment."""
114 _attr_supported_features = LightEntityFeature.EFFECT | LightEntityFeature.TRANSITION
115 _attr_translation_key =
"segment"
116 _attr_min_color_temp_kelvin = COLOR_TEMP_K_MIN
117 _attr_max_color_temp_kelvin = COLOR_TEMP_K_MAX
121 coordinator: WLEDDataUpdateCoordinator,
124 """Initialize WLED segment light."""
125 super().
__init__(coordinator=coordinator)
136 f
"{self.coordinator.data.info.mac_address}_{self._segment}"
140 coordinator.data.info.leds.segment_light_capabilities
is not None
142 color_modes := LIGHT_CAPABILITIES_COLOR_MODE_MAPPING.get(
143 coordinator.data.info.leds.segment_light_capabilities[segment]
153 """Return True if entity is available."""
155 self.coordinator.data.state.segments[self.
_segment_segment]
159 return super().available
163 """Return the color value."""
164 if not (color := self.coordinator.data.state.segments[self.
_segment_segment].color):
166 return color.primary[:3]
170 """Return the color value."""
171 if not (color := self.coordinator.data.state.segments[self.
_segment_segment].color):
173 return cast(tuple[int, int, int, int], color.primary)
177 """Return the CT color value in K."""
178 cct = self.coordinator.data.state.segments[self.
_segment_segment].cct
183 """Return the current effect of the light."""
184 return self.coordinator.data.effects[
185 int(self.coordinator.data.state.segments[self.
_segment_segment].effect_id)
190 """Return the brightness of this light between 1..255."""
191 state = self.coordinator.data.state
195 if not self.coordinator.has_main_light:
197 (state.segments[self.
_segment_segment].brightness * state.brightness) / 255
200 return state.segments[self.
_segment_segment].brightness
204 """Return the list of supported effects."""
205 return [effect.name
for effect
in self.coordinator.data.effects.values()]
209 """Return the state of the light."""
210 state = self.coordinator.data.state
214 if not self.coordinator.has_main_light
and not state.on:
219 @wled_exception_handler
221 """Turn off the light."""
223 if ATTR_TRANSITION
in kwargs:
225 transition = round(kwargs[ATTR_TRANSITION] * 10)
228 if not self.coordinator.has_main_light:
229 await self.coordinator.wled.master(on=
False, transition=transition)
232 await self.coordinator.wled.segment(
233 segment_id=self.
_segment_segment, on=
False, transition=transition
236 @wled_exception_handler
238 """Turn on the light."""
239 data: dict[str, Any] = {
241 ATTR_SEGMENT_ID: self.
_segment_segment,
244 if ATTR_RGB_COLOR
in kwargs:
245 data[ATTR_COLOR_PRIMARY] = kwargs[ATTR_RGB_COLOR]
247 if ATTR_RGBW_COLOR
in kwargs:
248 data[ATTR_COLOR_PRIMARY] = kwargs[ATTR_RGBW_COLOR]
250 if ATTR_COLOR_TEMP_KELVIN
in kwargs:
252 kwargs[ATTR_COLOR_TEMP_KELVIN], COLOR_TEMP_K_MIN, COLOR_TEMP_K_MAX
255 if ATTR_TRANSITION
in kwargs:
257 data[ATTR_TRANSITION] = round(kwargs[ATTR_TRANSITION] * 10)
259 if ATTR_BRIGHTNESS
in kwargs:
260 data[ATTR_BRIGHTNESS] = kwargs[ATTR_BRIGHTNESS]
262 if ATTR_EFFECT
in kwargs:
263 data[ATTR_EFFECT] = kwargs[ATTR_EFFECT]
266 if not self.coordinator.has_main_light:
267 main_data = {ATTR_ON:
True}
268 if ATTR_BRIGHTNESS
in data:
269 main_data[ATTR_BRIGHTNESS] = data[ATTR_BRIGHTNESS]
270 data[ATTR_BRIGHTNESS] = 255
272 if ATTR_TRANSITION
in data:
273 main_data[ATTR_TRANSITION] = data[ATTR_TRANSITION]
274 del data[ATTR_TRANSITION]
276 await self.coordinator.wled.segment(**data)
277 await self.coordinator.wled.master(**main_data)
280 await self.coordinator.wled.segment(**data)
285 coordinator: WLEDDataUpdateCoordinator,
286 current_ids: set[int],
287 async_add_entities: AddEntitiesCallback,
289 """Update segments."""
292 for light
in coordinator.data.state.segments.values()
293 if light.segment_id
is not None
295 new_entities: list[WLEDMainLight | WLEDSegmentLight] = []
298 if not coordinator.keep_main_light
and (
299 len(current_ids) < 2
and len(segment_ids) > 1
304 for segment_id
in segment_ids - current_ids:
305 current_ids.add(segment_id)
None async_turn_on(self, **Any kwargs)
None async_turn_off(self, **Any kwargs)
int|None brightness(self)
None __init__(self, WLEDDataUpdateCoordinator coordinator)
_attr_supported_color_modes
int|None brightness(self)
None async_turn_on(self, **Any kwargs)
tuple[int, int, int, int]|None rgbw_color(self)
None async_turn_off(self, **Any kwargs)
int|None color_temp_kelvin(self)
list[str] effect_list(self)
None __init__(self, WLEDDataUpdateCoordinator coordinator, int segment)
_attr_translation_placeholders
tuple[int, int, int]|None rgb_color(self)
int kelvin_to_255(int k, int min_k, int max_k)
int kelvin_to_255_reverse(int v, int min_k, int max_k)
None async_setup_entry(HomeAssistant hass, WLEDConfigEntry entry, AddEntitiesCallback async_add_entities)
None async_update_segments(WLEDDataUpdateCoordinator coordinator, set[int] current_ids, AddEntitiesCallback async_add_entities)