Home Assistant Unofficial Reference 2024.12.1
light.py
Go to the documentation of this file.
1 """Switcher integration Light platform."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import Any, cast
7 
8 from aioswitcher.api import SwitcherApi, SwitcherBaseResponse
9 from aioswitcher.device import DeviceCategory, DeviceState, SwitcherLight
10 
11 from homeassistant.components.light import ColorMode, LightEntity
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.core import HomeAssistant, callback
14 from homeassistant.exceptions import HomeAssistantError
15 from homeassistant.helpers.dispatcher import async_dispatcher_connect
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 
18 from .const import SIGNAL_DEVICE_ADD
19 from .coordinator import SwitcherDataUpdateCoordinator
20 from .entity import SwitcherEntity
21 
22 _LOGGER = logging.getLogger(__name__)
23 
24 API_SET_LIGHT = "set_light"
25 
26 
28  hass: HomeAssistant,
29  config_entry: ConfigEntry,
30  async_add_entities: AddEntitiesCallback,
31 ) -> None:
32  """Set up Switcher light from a config entry."""
33 
34  @callback
35  def async_add_light(coordinator: SwitcherDataUpdateCoordinator) -> None:
36  """Add light from Switcher device."""
37  entities: list[LightEntity] = []
38 
39  if coordinator.data.device_type.category in (
40  DeviceCategory.SINGLE_SHUTTER_DUAL_LIGHT,
41  DeviceCategory.DUAL_SHUTTER_SINGLE_LIGHT,
42  DeviceCategory.LIGHT,
43  ):
44  number_of_lights = len(cast(SwitcherLight, coordinator.data).light)
45  if number_of_lights == 1:
46  entities.append(SwitcherSingleLightEntity(coordinator, 0))
47  else:
48  entities.extend(
49  SwitcherMultiLightEntity(coordinator, i)
50  for i in range(number_of_lights)
51  )
52  async_add_entities(entities)
53 
54  config_entry.async_on_unload(
55  async_dispatcher_connect(hass, SIGNAL_DEVICE_ADD, async_add_light)
56  )
57 
58 
60  """Representation of a Switcher light entity."""
61 
62  _attr_color_mode = ColorMode.ONOFF
63  _attr_supported_color_modes = {ColorMode.ONOFF}
64  control_result: bool | None = None
65  _light_id: int
66 
67  @callback
68  def _handle_coordinator_update(self) -> None:
69  """When device updates, clear control result that overrides state."""
70  self.control_resultcontrol_result = None
71  self.async_write_ha_stateasync_write_ha_state()
72 
73  @property
74  def is_on(self) -> bool:
75  """Return True if entity is on."""
76  if self.control_resultcontrol_result is not None:
77  return self.control_resultcontrol_result
78 
79  data = cast(SwitcherLight, self.coordinator.data)
80  return bool(data.light[self._light_id] == DeviceState.ON)
81 
82  async def _async_call_api(self, api: str, *args: Any) -> None:
83  """Call Switcher API."""
84  _LOGGER.debug("Calling api for %s, api: '%s', args: %s", self.namename, api, args)
85  response: SwitcherBaseResponse | None = None
86  error = None
87 
88  try:
89  async with SwitcherApi(
90  self.coordinator.data.device_type,
91  self.coordinator.data.ip_address,
92  self.coordinator.data.device_id,
93  self.coordinator.data.device_key,
94  self.coordinator.token,
95  ) as swapi:
96  response = await getattr(swapi, api)(*args)
97  except (TimeoutError, OSError, RuntimeError) as err:
98  error = repr(err)
99 
100  if error or not response or not response.successful:
101  self.coordinator.last_update_success = False
102  self.async_write_ha_stateasync_write_ha_state()
103  raise HomeAssistantError(
104  f"Call api for {self.name} failed, api: '{api}', "
105  f"args: {args}, response/error: {response or error}"
106  )
107 
108  async def async_turn_on(self, **kwargs: Any) -> None:
109  """Turn the light on."""
110  await self._async_call_api_async_call_api(API_SET_LIGHT, DeviceState.ON, self._light_id)
111  self.control_resultcontrol_result = True
112  self.async_write_ha_stateasync_write_ha_state()
113 
114  async def async_turn_off(self, **kwargs: Any) -> None:
115  """Turn the light off."""
116  await self._async_call_api_async_call_api(API_SET_LIGHT, DeviceState.OFF, self._light_id)
117  self.control_resultcontrol_result = False
118  self.async_write_ha_stateasync_write_ha_state()
119 
120 
122  """Representation of a Switcher single light entity."""
123 
124  _attr_name = None
125 
126  def __init__(
127  self,
128  coordinator: SwitcherDataUpdateCoordinator,
129  light_id: int,
130  ) -> None:
131  """Initialize the entity."""
132  super().__init__(coordinator)
133  self._light_id_light_id = light_id
134  self.control_resultcontrol_result: bool | None = None
135 
136  # Entity class attributes
137  self._attr_unique_id_attr_unique_id = f"{coordinator.device_id}-{coordinator.mac_address}"
138 
139 
141  """Representation of a Switcher multiple light entity."""
142 
143  _attr_translation_key = "light"
144 
145  def __init__(
146  self,
147  coordinator: SwitcherDataUpdateCoordinator,
148  light_id: int,
149  ) -> None:
150  """Initialize the entity."""
151  super().__init__(coordinator)
152  self._light_id_light_id = light_id
153  self.control_resultcontrol_result: bool | None = None
154 
155  # Entity class attributes
156  self._attr_translation_placeholders_attr_translation_placeholders = {"light_id": str(light_id + 1)}
157  self._attr_unique_id_attr_unique_id = (
158  f"{coordinator.device_id}-{coordinator.mac_address}-{light_id}"
159  )
None __init__(self, SwitcherDataUpdateCoordinator coordinator, int light_id)
Definition: light.py:149
None __init__(self, SwitcherDataUpdateCoordinator coordinator, int light_id)
Definition: light.py:130
str|UndefinedType|None name(self)
Definition: entity.py:738
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: light.py:31
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103