1 """Component providing support for Reolink number entities."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
9 from reolink_aio.api
import Chime, Host
10 from reolink_aio.exceptions
import InvalidParameterError, ReolinkError
14 NumberEntityDescription,
23 ReolinkChannelCoordinatorEntity,
24 ReolinkChannelEntityDescription,
25 ReolinkChimeCoordinatorEntity,
26 ReolinkChimeEntityDescription,
27 ReolinkHostCoordinatorEntity,
28 ReolinkHostEntityDescription,
30 from .util
import ReolinkConfigEntry, ReolinkData
35 @dataclass(frozen=True, kw_only=True)
37 NumberEntityDescription,
38 ReolinkChannelEntityDescription,
40 """A class that describes number entities."""
42 get_max_value: Callable[[Host, int], float] |
None =
None
43 get_min_value: Callable[[Host, int], float] |
None =
None
44 method: Callable[[Host, int, float], Any]
45 mode: NumberMode = NumberMode.AUTO
46 value: Callable[[Host, int], float |
None]
49 @dataclass(frozen=True, kw_only=True)
51 NumberEntityDescription,
52 ReolinkHostEntityDescription,
54 """A class that describes number entities for the host."""
56 method: Callable[[Host, float], Any]
57 mode: NumberMode = NumberMode.AUTO
58 value: Callable[[Host], float |
None]
61 @dataclass(frozen=True, kw_only=True)
63 NumberEntityDescription,
64 ReolinkChimeEntityDescription,
66 """A class that describes number entities for a chime."""
68 method: Callable[[Chime, float], Any]
69 mode: NumberMode = NumberMode.AUTO
70 value: Callable[[Chime], float |
None]
76 cmd_key=
"GetZoomFocus",
77 translation_key=
"zoom",
78 mode=NumberMode.SLIDER,
80 get_min_value=
lambda api, ch: api.zoom_range(ch)[
"zoom"][
"pos"][
"min"],
81 get_max_value=
lambda api, ch: api.zoom_range(ch)[
"zoom"][
"pos"][
"max"],
82 supported=
lambda api, ch: api.supported(ch,
"zoom"),
83 value=
lambda api, ch: api.get_zoom(ch),
84 method=
lambda api, ch, value: api.set_zoom(ch,
int(value)),
88 cmd_key=
"GetZoomFocus",
89 translation_key=
"focus",
90 mode=NumberMode.SLIDER,
92 get_min_value=
lambda api, ch: api.zoom_range(ch)[
"focus"][
"pos"][
"min"],
93 get_max_value=
lambda api, ch: api.zoom_range(ch)[
"focus"][
"pos"][
"max"],
94 supported=
lambda api, ch: api.supported(ch,
"focus"),
95 value=
lambda api, ch: api.get_focus(ch),
96 method=
lambda api, ch, value: api.set_focus(ch,
int(value)),
102 key=
"floodlight_brightness",
103 cmd_key=
"GetWhiteLed",
104 translation_key=
"floodlight_brightness",
105 entity_category=EntityCategory.CONFIG,
108 native_max_value=100,
109 supported=
lambda api, ch: api.supported(ch,
"floodLight"),
110 value=
lambda api, ch: api.whiteled_brightness(ch),
111 method=
lambda api, ch, value: api.set_whiteled(ch, brightness=
int(value)),
115 cmd_key=
"GetAudioCfg",
116 translation_key=
"volume",
117 entity_category=EntityCategory.CONFIG,
120 native_max_value=100,
121 supported=
lambda api, ch: api.supported(ch,
"volume"),
122 value=
lambda api, ch: api.volume(ch),
123 method=
lambda api, ch, value: api.set_volume(ch, volume=
int(value)),
126 key=
"guard_return_time",
127 cmd_key=
"GetPtzGuard",
128 translation_key=
"guard_return_time",
129 entity_category=EntityCategory.CONFIG,
131 native_unit_of_measurement=UnitOfTime.SECONDS,
133 native_max_value=300,
134 supported=
lambda api, ch: api.supported(ch,
"ptz_guard"),
135 value=
lambda api, ch: api.ptz_guard_time(ch),
136 method=
lambda api, ch, value: api.set_ptz_guard(ch, time=
int(value)),
139 key=
"motion_sensitivity",
140 cmd_key=
"GetMdAlarm",
141 translation_key=
"motion_sensitivity",
142 entity_category=EntityCategory.CONFIG,
146 supported=
lambda api, ch: api.supported(ch,
"md_sensitivity"),
147 value=
lambda api, ch: api.md_sensitivity(ch),
148 method=
lambda api, ch, value: api.set_md_sensitivity(ch,
int(value)),
151 key=
"pir_sensitivity",
152 cmd_key=
"GetPirInfo",
153 translation_key=
"pir_sensitivity",
154 entity_category=EntityCategory.CONFIG,
157 native_max_value=100,
158 supported=
lambda api, ch: api.supported(ch,
"PIR"),
159 value=
lambda api, ch: api.pir_sensitivity(ch),
160 method=
lambda api, ch, value: api.set_pir(ch, sensitivity=
int(value)),
163 key=
"ai_face_sensititvity",
164 cmd_key=
"GetAiAlarm",
165 translation_key=
"ai_face_sensitivity",
166 entity_category=EntityCategory.CONFIG,
169 native_max_value=100,
170 supported=
lambda api, ch: (
171 api.supported(ch,
"ai_sensitivity")
and api.ai_supported(ch,
"face")
173 value=
lambda api, ch: api.ai_sensitivity(ch,
"face"),
174 method=
lambda api, ch, value: api.set_ai_sensitivity(ch,
int(value),
"face"),
177 key=
"ai_person_sensititvity",
178 cmd_key=
"GetAiAlarm",
179 translation_key=
"ai_person_sensitivity",
180 entity_category=EntityCategory.CONFIG,
183 native_max_value=100,
184 supported=
lambda api, ch: (
185 api.supported(ch,
"ai_sensitivity")
and api.ai_supported(ch,
"people")
187 value=
lambda api, ch: api.ai_sensitivity(ch,
"people"),
188 method=
lambda api, ch, value: api.set_ai_sensitivity(ch,
int(value),
"people"),
191 key=
"ai_vehicle_sensititvity",
192 cmd_key=
"GetAiAlarm",
193 translation_key=
"ai_vehicle_sensitivity",
194 entity_category=EntityCategory.CONFIG,
197 native_max_value=100,
198 supported=
lambda api, ch: (
199 api.supported(ch,
"ai_sensitivity")
and api.ai_supported(ch,
"vehicle")
201 value=
lambda api, ch: api.ai_sensitivity(ch,
"vehicle"),
202 method=
lambda api, ch, value: api.set_ai_sensitivity(ch,
int(value),
"vehicle"),
205 key=
"ai_package_sensititvity",
206 cmd_key=
"GetAiAlarm",
207 translation_key=
"ai_package_sensitivity",
208 entity_category=EntityCategory.CONFIG,
211 native_max_value=100,
212 supported=
lambda api, ch: (
213 api.supported(ch,
"ai_sensitivity")
and api.ai_supported(ch,
"package")
215 value=
lambda api, ch: api.ai_sensitivity(ch,
"package"),
216 method=
lambda api, ch, value: api.set_ai_sensitivity(ch,
int(value),
"package"),
219 key=
"ai_pet_sensititvity",
220 cmd_key=
"GetAiAlarm",
221 translation_key=
"ai_pet_sensitivity",
222 entity_category=EntityCategory.CONFIG,
225 native_max_value=100,
226 supported=
lambda api, ch: (
227 api.supported(ch,
"ai_sensitivity")
228 and api.ai_supported(ch,
"dog_cat")
229 and not api.supported(ch,
"ai_animal")
231 value=
lambda api, ch: api.ai_sensitivity(ch,
"dog_cat"),
232 method=
lambda api, ch, value: api.set_ai_sensitivity(ch,
int(value),
"dog_cat"),
235 key=
"ai_pet_sensititvity",
236 cmd_key=
"GetAiAlarm",
237 translation_key=
"ai_animal_sensitivity",
238 entity_category=EntityCategory.CONFIG,
241 native_max_value=100,
242 supported=
lambda api, ch: (
243 api.supported(ch,
"ai_sensitivity")
and api.supported(ch,
"ai_animal")
245 value=
lambda api, ch: api.ai_sensitivity(ch,
"dog_cat"),
246 method=
lambda api, ch, value: api.set_ai_sensitivity(ch,
int(value),
"dog_cat"),
250 cmd_key=
"GetAiAlarm",
251 translation_key=
"ai_face_delay",
252 entity_category=EntityCategory.CONFIG,
253 entity_registry_enabled_default=
False,
255 native_unit_of_measurement=UnitOfTime.SECONDS,
258 supported=
lambda api, ch: (
259 api.supported(ch,
"ai_delay")
and api.ai_supported(ch,
"face")
261 value=
lambda api, ch: api.ai_delay(ch,
"face"),
262 method=
lambda api, ch, value: api.set_ai_delay(ch,
int(value),
"face"),
265 key=
"ai_person_delay",
266 cmd_key=
"GetAiAlarm",
267 translation_key=
"ai_person_delay",
268 entity_category=EntityCategory.CONFIG,
269 entity_registry_enabled_default=
False,
271 native_unit_of_measurement=UnitOfTime.SECONDS,
274 supported=
lambda api, ch: (
275 api.supported(ch,
"ai_delay")
and api.ai_supported(ch,
"people")
277 value=
lambda api, ch: api.ai_delay(ch,
"people"),
278 method=
lambda api, ch, value: api.set_ai_delay(ch,
int(value),
"people"),
281 key=
"ai_vehicle_delay",
282 cmd_key=
"GetAiAlarm",
283 translation_key=
"ai_vehicle_delay",
284 entity_category=EntityCategory.CONFIG,
285 entity_registry_enabled_default=
False,
287 native_unit_of_measurement=UnitOfTime.SECONDS,
290 supported=
lambda api, ch: (
291 api.supported(ch,
"ai_delay")
and api.ai_supported(ch,
"vehicle")
293 value=
lambda api, ch: api.ai_delay(ch,
"vehicle"),
294 method=
lambda api, ch, value: api.set_ai_delay(ch,
int(value),
"vehicle"),
297 key=
"ai_package_delay",
298 cmd_key=
"GetAiAlarm",
299 translation_key=
"ai_package_delay",
300 entity_category=EntityCategory.CONFIG,
301 entity_registry_enabled_default=
False,
303 native_unit_of_measurement=UnitOfTime.SECONDS,
306 supported=
lambda api, ch: (
307 api.supported(ch,
"ai_delay")
and api.ai_supported(ch,
"package")
309 value=
lambda api, ch: api.ai_delay(ch,
"package"),
310 method=
lambda api, ch, value: api.set_ai_delay(ch,
int(value),
"package"),
314 cmd_key=
"GetAiAlarm",
315 translation_key=
"ai_pet_delay",
316 entity_category=EntityCategory.CONFIG,
317 entity_registry_enabled_default=
False,
319 native_unit_of_measurement=UnitOfTime.SECONDS,
322 supported=
lambda api, ch: (
323 api.supported(ch,
"ai_delay")
324 and api.ai_supported(ch,
"dog_cat")
325 and not api.supported(ch,
"ai_animal")
327 value=
lambda api, ch: api.ai_delay(ch,
"dog_cat"),
328 method=
lambda api, ch, value: api.set_ai_delay(ch,
int(value),
"dog_cat"),
332 cmd_key=
"GetAiAlarm",
333 translation_key=
"ai_animal_delay",
334 entity_category=EntityCategory.CONFIG,
335 entity_registry_enabled_default=
False,
337 native_unit_of_measurement=UnitOfTime.SECONDS,
340 supported=
lambda api, ch: (
341 api.supported(ch,
"ai_delay")
and api.supported(ch,
"ai_animal")
343 value=
lambda api, ch: api.ai_delay(ch,
"dog_cat"),
344 method=
lambda api, ch, value: api.set_ai_delay(ch,
int(value),
"dog_cat"),
347 key=
"auto_quick_reply_time",
348 cmd_key=
"GetAutoReply",
349 translation_key=
"auto_quick_reply_time",
350 entity_category=EntityCategory.CONFIG,
352 native_unit_of_measurement=UnitOfTime.SECONDS,
355 supported=
lambda api, ch: api.supported(ch,
"quick_reply"),
356 value=
lambda api, ch: api.quick_reply_time(ch),
357 method=
lambda api, ch, value: api.set_quick_reply(ch, time=
int(value)),
360 key=
"auto_track_limit_left",
361 cmd_key=
"GetPtzTraceSection",
362 translation_key=
"auto_track_limit_left",
363 mode=NumberMode.SLIDER,
364 entity_category=EntityCategory.CONFIG,
367 native_max_value=2700,
368 supported=
lambda api, ch: api.supported(ch,
"auto_track_limit"),
369 value=
lambda api, ch: api.auto_track_limit_left(ch),
370 method=
lambda api, ch, value: api.set_auto_track_limit(ch, left=
int(value)),
373 key=
"auto_track_limit_right",
374 cmd_key=
"GetPtzTraceSection",
375 translation_key=
"auto_track_limit_right",
376 mode=NumberMode.SLIDER,
377 entity_category=EntityCategory.CONFIG,
380 native_max_value=2700,
381 supported=
lambda api, ch: api.supported(ch,
"auto_track_limit"),
382 value=
lambda api, ch: api.auto_track_limit_right(ch),
383 method=
lambda api, ch, value: api.set_auto_track_limit(ch, right=
int(value)),
386 key=
"auto_track_disappear_time",
388 translation_key=
"auto_track_disappear_time",
389 entity_category=EntityCategory.CONFIG,
391 native_unit_of_measurement=UnitOfTime.SECONDS,
394 supported=
lambda api, ch: api.supported(ch,
"auto_track_disappear_time"),
395 value=
lambda api, ch: api.auto_track_disappear_time(ch),
396 method=
lambda api, ch, value: api.set_auto_tracking(
397 ch, disappear_time=
int(value)
401 key=
"auto_track_stop_time",
403 translation_key=
"auto_track_stop_time",
404 entity_category=EntityCategory.CONFIG,
406 native_unit_of_measurement=UnitOfTime.SECONDS,
409 supported=
lambda api, ch: api.supported(ch,
"auto_track_stop_time"),
410 value=
lambda api, ch: api.auto_track_stop_time(ch),
411 method=
lambda api, ch, value: api.set_auto_tracking(ch, stop_time=
int(value)),
414 key=
"day_night_switch_threshold",
416 translation_key=
"day_night_switch_threshold",
417 entity_category=EntityCategory.CONFIG,
418 entity_registry_enabled_default=
False,
421 native_max_value=100,
422 supported=
lambda api, ch: api.supported(ch,
"dayNightThreshold"),
423 value=
lambda api, ch: api.daynight_threshold(ch),
424 method=
lambda api, ch, value: api.set_daynight_threshold(ch,
int(value)),
427 key=
"image_brightness",
429 translation_key=
"image_brightness",
430 entity_category=EntityCategory.CONFIG,
431 entity_registry_enabled_default=
False,
434 native_max_value=255,
435 supported=
lambda api, ch: api.supported(ch,
"isp_bright"),
436 value=
lambda api, ch: api.image_brightness(ch),
437 method=
lambda api, ch, value: api.set_image(ch, bright=
int(value)),
440 key=
"image_contrast",
442 translation_key=
"image_contrast",
443 entity_category=EntityCategory.CONFIG,
444 entity_registry_enabled_default=
False,
447 native_max_value=255,
448 supported=
lambda api, ch: api.supported(ch,
"isp_contrast"),
449 value=
lambda api, ch: api.image_contrast(ch),
450 method=
lambda api, ch, value: api.set_image(ch, contrast=
int(value)),
453 key=
"image_saturation",
455 translation_key=
"image_saturation",
456 entity_category=EntityCategory.CONFIG,
457 entity_registry_enabled_default=
False,
460 native_max_value=255,
461 supported=
lambda api, ch: api.supported(ch,
"isp_satruation"),
462 value=
lambda api, ch: api.image_saturation(ch),
463 method=
lambda api, ch, value: api.set_image(ch, saturation=
int(value)),
466 key=
"image_sharpness",
468 translation_key=
"image_sharpness",
469 entity_category=EntityCategory.CONFIG,
470 entity_registry_enabled_default=
False,
473 native_max_value=255,
474 supported=
lambda api, ch: api.supported(ch,
"isp_sharpen"),
475 value=
lambda api, ch: api.image_sharpness(ch),
476 method=
lambda api, ch, value: api.set_image(ch, sharpen=
int(value)),
481 translation_key=
"image_hue",
482 entity_category=EntityCategory.CONFIG,
483 entity_registry_enabled_default=
False,
486 native_max_value=255,
487 supported=
lambda api, ch: api.supported(ch,
"isp_hue"),
488 value=
lambda api, ch: api.image_hue(ch),
489 method=
lambda api, ch, value: api.set_image(ch, hue=
int(value)),
493 HOST_NUMBER_ENTITIES = (
496 cmd_key=
"GetDeviceAudioCfg",
497 translation_key=
"alarm_volume",
498 entity_category=EntityCategory.CONFIG,
501 native_max_value=100,
502 supported=
lambda api: api.supported(
None,
"hub_audio"),
503 value=
lambda api: api.alarm_volume,
504 method=
lambda api, value: api.set_hub_audio(alarm_volume=
int(value)),
507 key=
"message_volume",
508 cmd_key=
"GetDeviceAudioCfg",
509 translation_key=
"message_volume",
510 entity_category=EntityCategory.CONFIG,
513 native_max_value=100,
514 supported=
lambda api: api.supported(
None,
"hub_audio"),
515 value=
lambda api: api.message_volume,
516 method=
lambda api, value: api.set_hub_audio(message_volume=
int(value)),
520 CHIME_NUMBER_ENTITIES = (
523 cmd_key=
"DingDongOpt",
524 translation_key=
"volume",
525 entity_category=EntityCategory.CONFIG,
529 value=
lambda chime: chime.volume,
530 method=
lambda chime, value: chime.set_option(volume=
int(value)),
537 config_entry: ReolinkConfigEntry,
538 async_add_entities: AddEntitiesCallback,
540 """Set up a Reolink number entities."""
541 reolink_data: ReolinkData = config_entry.runtime_data
543 entities: list[NumberEntity] = [
545 for entity_description
in NUMBER_ENTITIES
546 for channel
in reolink_data.host.api.channels
547 if entity_description.supported(reolink_data.host.api, channel)
551 for entity_description
in HOST_NUMBER_ENTITIES
552 if entity_description.supported(reolink_data.host.api)
556 for entity_description
in CHIME_NUMBER_ENTITIES
557 for chime
in reolink_data.host.api.chime_list
563 """Base number entity class for Reolink IP cameras."""
565 entity_description: ReolinkNumberEntityDescription
569 reolink_data: ReolinkData,
571 entity_description: ReolinkNumberEntityDescription,
573 """Initialize Reolink number entity."""
575 super().
__init__(reolink_data, channel)
577 if entity_description.get_min_value
is not None:
579 self.
_host_host.api, channel
581 if entity_description.get_max_value
is not None:
583 self.
_host_host.api, channel
589 """State of the number entity."""
593 """Update the current value."""
596 except InvalidParameterError
as err:
598 except ReolinkError
as err:
604 """Base number entity class for Reolink Host."""
606 entity_description: ReolinkHostNumberEntityDescription
610 reolink_data: ReolinkData,
611 entity_description: ReolinkHostNumberEntityDescription,
613 """Initialize Reolink number entity."""
621 """State of the number entity."""
625 """Update the current value."""
628 except InvalidParameterError
as err:
630 except ReolinkError
as err:
636 """Base number entity class for Reolink IP cameras."""
638 entity_description: ReolinkChimeNumberEntityDescription
642 reolink_data: ReolinkData,
644 entity_description: ReolinkChimeNumberEntityDescription,
646 """Initialize Reolink chime number entity."""
648 super().
__init__(reolink_data, chime)
654 """State of the number entity."""
658 """Update the current value."""
661 except InvalidParameterError
as err:
663 except ReolinkError
as err:
None async_set_native_value(self, float value)
None __init__(self, ReolinkData reolink_data, ReolinkHostNumberEntityDescription entity_description)
float|None native_value(self)
None async_set_native_value(self, float value)
float|None native_value(self)
None __init__(self, ReolinkData reolink_data, int channel, ReolinkNumberEntityDescription entity_description)
None async_write_ha_state(self)
None async_setup_entry(HomeAssistant hass, ReolinkConfigEntry config_entry, AddEntitiesCallback async_add_entities)