Home Assistant Unofficial Reference 2024.12.1
light.py
Go to the documentation of this file.
1 """Support for Broadlink lights."""
2 
3 import logging
4 from typing import Any
5 
6 from broadlink.exceptions import BroadlinkException
7 
9  ATTR_BRIGHTNESS,
10  ATTR_COLOR_TEMP_KELVIN,
11  ATTR_HS_COLOR,
12  ColorMode,
13  LightEntity,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.core import HomeAssistant
17 from homeassistant.helpers.entity_platform import AddEntitiesCallback
18 
19 from .const import DOMAIN
20 from .entity import BroadlinkEntity
21 
22 _LOGGER = logging.getLogger(__name__)
23 
24 BROADLINK_COLOR_MODE_RGB = 0
25 BROADLINK_COLOR_MODE_WHITE = 1
26 BROADLINK_COLOR_MODE_SCENES = 2
27 
28 
30  hass: HomeAssistant,
31  config_entry: ConfigEntry,
32  async_add_entities: AddEntitiesCallback,
33 ) -> None:
34  """Set up the Broadlink light."""
35  device = hass.data[DOMAIN].devices[config_entry.entry_id]
36  lights = []
37 
38  if device.api.type in {"LB1", "LB2"}:
39  lights.append(BroadlinkLight(device))
40 
41  async_add_entities(lights)
42 
43 
45  """Representation of a Broadlink light."""
46 
47  _attr_has_entity_name = True
48  _attr_name = None
49  _attr_min_color_temp_kelvin = 2700
50  _attr_max_color_temp_kelvin = 6500
51 
52  def __init__(self, device):
53  """Initialize the light."""
54  super().__init__(device)
55  self._attr_unique_id_attr_unique_id = device.unique_id
56  self._attr_supported_color_modes_attr_supported_color_modes = set()
57 
58  data = self._coordinator_coordinator.data
59 
60  if {"hue", "saturation"}.issubset(data):
61  self._attr_supported_color_modes_attr_supported_color_modes.add(ColorMode.HS)
62  if "colortemp" in data:
63  self._attr_supported_color_modes_attr_supported_color_modes.add(ColorMode.COLOR_TEMP)
64  if not self.supported_color_modessupported_color_modessupported_color_modes:
65  self._attr_supported_color_modes_attr_supported_color_modes = {ColorMode.BRIGHTNESS}
66 
67  self._update_state_update_state_update_state(data)
68 
69  def _update_state(self, data):
70  """Update the state of the entity."""
71  if "pwr" in data:
72  self._attr_is_on_attr_is_on = bool(data["pwr"])
73 
74  if "brightness" in data:
75  self._attr_brightness_attr_brightness = round(data["brightness"] * 2.55)
76 
77  if self.supported_color_modessupported_color_modessupported_color_modes == {ColorMode.BRIGHTNESS}:
78  self._attr_color_mode_attr_color_mode = ColorMode.BRIGHTNESS
79  return
80 
81  if {"hue", "saturation"}.issubset(data):
82  self._attr_hs_color_attr_hs_color = [data["hue"], data["saturation"]]
83 
84  if "colortemp" in data:
85  self._attr_color_temp_kelvin_attr_color_temp_kelvin = data["colortemp"]
86 
87  if "bulb_colormode" in data:
88  if data["bulb_colormode"] == BROADLINK_COLOR_MODE_RGB:
89  self._attr_color_mode_attr_color_mode = ColorMode.HS
90  elif data["bulb_colormode"] == BROADLINK_COLOR_MODE_WHITE:
91  self._attr_color_mode_attr_color_mode = ColorMode.COLOR_TEMP
92  else:
93  # Scenes are not yet supported.
94  self._attr_color_mode_attr_color_mode = ColorMode.UNKNOWN
95 
96  async def async_turn_on(self, **kwargs: Any) -> None:
97  """Turn on the light."""
98  state = {"pwr": 1}
99 
100  if ATTR_BRIGHTNESS in kwargs:
101  brightness = kwargs[ATTR_BRIGHTNESS]
102  state["brightness"] = round(brightness / 2.55)
103 
104  if self.supported_color_modessupported_color_modessupported_color_modes == {ColorMode.BRIGHTNESS}:
105  state["bulb_colormode"] = BROADLINK_COLOR_MODE_WHITE
106 
107  elif ATTR_HS_COLOR in kwargs:
108  hs_color = kwargs[ATTR_HS_COLOR]
109  state["hue"] = int(hs_color[0])
110  state["saturation"] = int(hs_color[1])
111  state["bulb_colormode"] = BROADLINK_COLOR_MODE_RGB
112 
113  elif ATTR_COLOR_TEMP_KELVIN in kwargs:
114  color_temp = kwargs[ATTR_COLOR_TEMP_KELVIN]
115  state["colortemp"] = color_temp
116  state["bulb_colormode"] = BROADLINK_COLOR_MODE_WHITE
117 
118  await self._async_set_state_async_set_state(state)
119 
120  async def async_turn_off(self, **kwargs: Any) -> None:
121  """Turn off the light."""
122  await self._async_set_state_async_set_state({"pwr": 0})
123 
124  async def _async_set_state(self, state):
125  """Set the state of the light."""
126  device = self._device_device
127 
128  try:
129  state = await device.async_request(device.api.set_state, **state)
130  except (BroadlinkException, OSError) as err:
131  _LOGGER.error("Failed to set state: %s", err)
132  return
133 
134  self._update_state_update_state_update_state(state)
135  self.async_write_ha_stateasync_write_ha_state()
set[ColorMode]|set[str]|None supported_color_modes(self)
Definition: __init__.py:1302
bool add(self, _T matcher)
Definition: match.py:185