1 """Component providing support for Reolink light entities."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
9 from reolink_aio.api
import Host
10 from reolink_aio.exceptions
import InvalidParameterError, ReolinkError
16 LightEntityDescription,
24 ReolinkChannelCoordinatorEntity,
25 ReolinkChannelEntityDescription,
26 ReolinkHostCoordinatorEntity,
27 ReolinkHostEntityDescription,
29 from .util
import ReolinkConfigEntry, ReolinkData
34 @dataclass(frozen=True, kw_only=True)
36 LightEntityDescription,
37 ReolinkChannelEntityDescription,
39 """A class that describes light entities."""
41 get_brightness_fn: Callable[[Host, int], int |
None] |
None =
None
42 is_on_fn: Callable[[Host, int], bool]
43 set_brightness_fn: Callable[[Host, int, int], Any] |
None =
None
44 turn_on_off_fn: Callable[[Host, int, bool], Any]
47 @dataclass(frozen=True, kw_only=True)
49 LightEntityDescription,
50 ReolinkHostEntityDescription,
52 """A class that describes host light entities."""
54 is_on_fn: Callable[[Host], bool]
55 turn_on_off_fn: Callable[[Host, bool], Any]
61 cmd_key=
"GetWhiteLed",
63 translation_key=
"floodlight",
64 supported=
lambda api, ch: api.supported(ch,
"floodLight"),
65 is_on_fn=
lambda api, ch: api.whiteled_state(ch),
66 turn_on_off_fn=
lambda api, ch, value: api.set_whiteled(ch, state=value),
67 get_brightness_fn=
lambda api, ch: api.whiteled_brightness(ch),
68 set_brightness_fn=
lambda api, ch, value: api.set_whiteled(ch, brightness=value),
72 cmd_key=
"GetPowerLed",
73 translation_key=
"status_led",
74 entity_category=EntityCategory.CONFIG,
75 supported=
lambda api, ch: api.supported(ch,
"power_led"),
76 is_on_fn=
lambda api, ch: api.status_led_enabled(ch),
77 turn_on_off_fn=
lambda api, ch, value: api.set_status_led(ch, value),
81 HOST_LIGHT_ENTITIES = (
84 cmd_key=
"GetStateLight",
85 translation_key=
"status_led",
86 entity_category=EntityCategory.CONFIG,
87 supported=
lambda api: api.supported(
None,
"state_light"),
88 is_on_fn=
lambda api: api.state_light,
89 turn_on_off_fn=
lambda api, value: api.set_state_light(value),
96 config_entry: ReolinkConfigEntry,
97 async_add_entities: AddEntitiesCallback,
99 """Set up a Reolink light entities."""
100 reolink_data: ReolinkData = config_entry.runtime_data
102 entities: list[ReolinkLightEntity | ReolinkHostLightEntity] = [
104 for entity_description
in LIGHT_ENTITIES
105 for channel
in reolink_data.host.api.channels
106 if entity_description.supported(reolink_data.host.api, channel)
110 for entity_description
in HOST_LIGHT_ENTITIES
111 if entity_description.supported(reolink_data.host.api)
118 """Base light entity class for Reolink IP cameras."""
120 entity_description: ReolinkLightEntityDescription
124 reolink_data: ReolinkData,
126 entity_description: ReolinkLightEntityDescription,
128 """Initialize Reolink light entity."""
130 super().
__init__(reolink_data, channel)
132 if entity_description.set_brightness_fn
is None:
141 """Return true if light is on."""
146 """Return the brightness of this light between 0.255."""
152 if bright_pct
is None:
155 return round(255 * bright_pct / 100.0)
158 """Turn light off."""
163 except ReolinkError
as err:
170 brightness := kwargs.get(ATTR_BRIGHTNESS)
171 )
is not None and self.
entity_descriptionentity_description.set_brightness_fn
is not None:
172 brightness_pct =
int(brightness / 255.0 * 100)
177 except InvalidParameterError
as err:
179 except ReolinkError
as err:
186 except ReolinkError
as err:
192 """Base host light entity class for Reolink IP cameras."""
194 entity_description: ReolinkHostLightEntityDescription
195 _attr_supported_color_modes = {ColorMode.ONOFF}
196 _attr_color_mode = ColorMode.ONOFF
200 reolink_data: ReolinkData,
201 entity_description: ReolinkHostLightEntityDescription,
203 """Initialize Reolink host light entity."""
209 """Return true if light is on."""
213 """Turn light off."""
216 except ReolinkError
as err:
224 except ReolinkError
as err:
None async_turn_on(self, **Any kwargs)
None __init__(self, ReolinkData reolink_data, ReolinkHostLightEntityDescription entity_description)
None async_turn_off(self, **Any kwargs)
None async_turn_off(self, **Any kwargs)
None __init__(self, ReolinkData reolink_data, int channel, ReolinkLightEntityDescription entity_description)
int|None brightness(self)
None async_turn_on(self, **Any kwargs)
_attr_supported_color_modes
None async_write_ha_state(self)
None async_setup_entry(HomeAssistant hass, ReolinkConfigEntry config_entry, AddEntitiesCallback async_add_entities)