Home Assistant Unofficial Reference 2024.12.1
light.py
Go to the documentation of this file.
1 """Support for Avion dimmers."""
2 
3 from __future__ import annotations
4 
5 import importlib
6 import time
7 from typing import Any
8 
9 import voluptuous as vol
10 
12  ATTR_BRIGHTNESS,
13  PLATFORM_SCHEMA as LIGHT_PLATFORM_SCHEMA,
14  ColorMode,
15  LightEntity,
16 )
17 from homeassistant.const import (
18  CONF_API_KEY,
19  CONF_DEVICES,
20  CONF_ID,
21  CONF_NAME,
22  CONF_PASSWORD,
23  CONF_USERNAME,
24 )
25 from homeassistant.core import HomeAssistant
27 from homeassistant.helpers.entity_platform import AddEntitiesCallback
28 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
29 
30 DEVICE_SCHEMA = vol.Schema(
31  {
32  vol.Required(CONF_API_KEY): cv.string,
33  vol.Optional(CONF_ID): cv.positive_int,
34  vol.Optional(CONF_NAME): cv.string,
35  }
36 )
37 
38 PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend(
39  {
40  vol.Optional(CONF_DEVICES, default={}): {cv.string: DEVICE_SCHEMA},
41  vol.Optional(CONF_USERNAME): cv.string,
42  vol.Optional(CONF_PASSWORD): cv.string,
43  }
44 )
45 
46 
48  hass: HomeAssistant,
49  config: ConfigType,
50  add_entities: AddEntitiesCallback,
51  discovery_info: DiscoveryInfoType | None = None,
52 ) -> None:
53  """Set up an Avion switch."""
54  avion = importlib.import_module("avion")
55 
56  lights = [
57  AvionLight(
58  avion.Avion(
59  mac=address,
60  passphrase=device_config[CONF_API_KEY],
61  name=device_config.get(CONF_NAME),
62  object_id=device_config.get(CONF_ID),
63  connect=False,
64  )
65  )
66  for address, device_config in config[CONF_DEVICES].items()
67  ]
68  if CONF_USERNAME in config and CONF_PASSWORD in config:
69  lights.extend(
70  AvionLight(device)
71  for device in avion.get_devices(
72  config[CONF_USERNAME], config[CONF_PASSWORD]
73  )
74  )
75 
76  add_entities(lights)
77 
78 
80  """Representation of an Avion light."""
81 
82  _attr_support_color_mode = ColorMode.BRIGHTNESS
83  _attr_support_color_modes = {ColorMode.BRIGHTNESS}
84  _attr_should_poll = False
85  _attr_assumed_state = True
86  _attr_is_on = True
87 
88  def __init__(self, device):
89  """Initialize the light."""
90  self._attr_name_attr_name = device.name
91  self._attr_unique_id_attr_unique_id = device.mac
92  self._attr_brightness_attr_brightness = 255
93  self._switch_switch = device
94 
95  def set_state(self, brightness):
96  """Set the state of this lamp to the provided brightness."""
97  avion = importlib.import_module("avion")
98 
99  # Bluetooth LE is unreliable, and the connection may drop at any
100  # time. Make an effort to re-establish the link.
101  initial = time.monotonic()
102  while True:
103  if time.monotonic() - initial >= 10:
104  return False
105  try:
106  self._switch_switch.set_brightness(brightness)
107  break
108  except avion.AvionException:
109  self._switch_switch.connect()
110  return True
111 
112  def turn_on(self, **kwargs: Any) -> None:
113  """Turn the specified or all lights on."""
114  if (brightness := kwargs.get(ATTR_BRIGHTNESS)) is not None:
115  self._attr_brightness_attr_brightness = brightness
116 
117  self.set_stateset_state(self.brightnessbrightness)
118  self._attr_is_on_attr_is_on_attr_is_on = True
119 
120  def turn_off(self, **kwargs: Any) -> None:
121  """Turn the specified or all lights off."""
122  self.set_stateset_state(0)
123  self._attr_is_on_attr_is_on_attr_is_on = False
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: light.py:52