Home Assistant Unofficial Reference 2024.12.1
number.py
Go to the documentation of this file.
1 """Component providing support for Reolink number entities."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from typing import Any
8 
9 from reolink_aio.api import Chime, Host
10 from reolink_aio.exceptions import InvalidParameterError, ReolinkError
11 
13  NumberEntity,
14  NumberEntityDescription,
15  NumberMode,
16 )
17 from homeassistant.const import EntityCategory, UnitOfTime
18 from homeassistant.core import HomeAssistant
19 from homeassistant.exceptions import HomeAssistantError, ServiceValidationError
20 from homeassistant.helpers.entity_platform import AddEntitiesCallback
21 
22 from .entity import (
23  ReolinkChannelCoordinatorEntity,
24  ReolinkChannelEntityDescription,
25  ReolinkChimeCoordinatorEntity,
26  ReolinkChimeEntityDescription,
27  ReolinkHostCoordinatorEntity,
28  ReolinkHostEntityDescription,
29 )
30 from .util import ReolinkConfigEntry, ReolinkData
31 
32 PARALLEL_UPDATES = 0
33 
34 
35 @dataclass(frozen=True, kw_only=True)
37  NumberEntityDescription,
38  ReolinkChannelEntityDescription,
39 ):
40  """A class that describes number entities."""
41 
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]
47 
48 
49 @dataclass(frozen=True, kw_only=True)
51  NumberEntityDescription,
52  ReolinkHostEntityDescription,
53 ):
54  """A class that describes number entities for the host."""
55 
56  method: Callable[[Host, float], Any]
57  mode: NumberMode = NumberMode.AUTO
58  value: Callable[[Host], float | None]
59 
60 
61 @dataclass(frozen=True, kw_only=True)
63  NumberEntityDescription,
64  ReolinkChimeEntityDescription,
65 ):
66  """A class that describes number entities for a chime."""
67 
68  method: Callable[[Chime, float], Any]
69  mode: NumberMode = NumberMode.AUTO
70  value: Callable[[Chime], float | None]
71 
72 
73 NUMBER_ENTITIES = (
75  key="zoom",
76  cmd_key="GetZoomFocus",
77  translation_key="zoom",
78  mode=NumberMode.SLIDER,
79  native_step=1,
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)),
85  ),
87  key="focus",
88  cmd_key="GetZoomFocus",
89  translation_key="focus",
90  mode=NumberMode.SLIDER,
91  native_step=1,
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)),
97  ),
98  # "Floodlight turn on brightness" controls the brightness of the floodlight when
99  # it is turned on internally by the camera (see "select.floodlight_mode" entity)
100  # or when using the "light.floodlight" entity.
102  key="floodlight_brightness",
103  cmd_key="GetWhiteLed",
104  translation_key="floodlight_brightness",
105  entity_category=EntityCategory.CONFIG,
106  native_step=1,
107  native_min_value=1,
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)),
112  ),
114  key="volume",
115  cmd_key="GetAudioCfg",
116  translation_key="volume",
117  entity_category=EntityCategory.CONFIG,
118  native_step=1,
119  native_min_value=0,
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)),
124  ),
126  key="guard_return_time",
127  cmd_key="GetPtzGuard",
128  translation_key="guard_return_time",
129  entity_category=EntityCategory.CONFIG,
130  native_step=1,
131  native_unit_of_measurement=UnitOfTime.SECONDS,
132  native_min_value=10,
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)),
137  ),
139  key="motion_sensitivity",
140  cmd_key="GetMdAlarm",
141  translation_key="motion_sensitivity",
142  entity_category=EntityCategory.CONFIG,
143  native_step=1,
144  native_min_value=1,
145  native_max_value=50,
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)),
149  ),
151  key="pir_sensitivity",
152  cmd_key="GetPirInfo",
153  translation_key="pir_sensitivity",
154  entity_category=EntityCategory.CONFIG,
155  native_step=1,
156  native_min_value=1,
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)),
161  ),
163  key="ai_face_sensititvity",
164  cmd_key="GetAiAlarm",
165  translation_key="ai_face_sensitivity",
166  entity_category=EntityCategory.CONFIG,
167  native_step=1,
168  native_min_value=0,
169  native_max_value=100,
170  supported=lambda api, ch: (
171  api.supported(ch, "ai_sensitivity") and api.ai_supported(ch, "face")
172  ),
173  value=lambda api, ch: api.ai_sensitivity(ch, "face"),
174  method=lambda api, ch, value: api.set_ai_sensitivity(ch, int(value), "face"),
175  ),
177  key="ai_person_sensititvity",
178  cmd_key="GetAiAlarm",
179  translation_key="ai_person_sensitivity",
180  entity_category=EntityCategory.CONFIG,
181  native_step=1,
182  native_min_value=0,
183  native_max_value=100,
184  supported=lambda api, ch: (
185  api.supported(ch, "ai_sensitivity") and api.ai_supported(ch, "people")
186  ),
187  value=lambda api, ch: api.ai_sensitivity(ch, "people"),
188  method=lambda api, ch, value: api.set_ai_sensitivity(ch, int(value), "people"),
189  ),
191  key="ai_vehicle_sensititvity",
192  cmd_key="GetAiAlarm",
193  translation_key="ai_vehicle_sensitivity",
194  entity_category=EntityCategory.CONFIG,
195  native_step=1,
196  native_min_value=0,
197  native_max_value=100,
198  supported=lambda api, ch: (
199  api.supported(ch, "ai_sensitivity") and api.ai_supported(ch, "vehicle")
200  ),
201  value=lambda api, ch: api.ai_sensitivity(ch, "vehicle"),
202  method=lambda api, ch, value: api.set_ai_sensitivity(ch, int(value), "vehicle"),
203  ),
205  key="ai_package_sensititvity",
206  cmd_key="GetAiAlarm",
207  translation_key="ai_package_sensitivity",
208  entity_category=EntityCategory.CONFIG,
209  native_step=1,
210  native_min_value=0,
211  native_max_value=100,
212  supported=lambda api, ch: (
213  api.supported(ch, "ai_sensitivity") and api.ai_supported(ch, "package")
214  ),
215  value=lambda api, ch: api.ai_sensitivity(ch, "package"),
216  method=lambda api, ch, value: api.set_ai_sensitivity(ch, int(value), "package"),
217  ),
219  key="ai_pet_sensititvity",
220  cmd_key="GetAiAlarm",
221  translation_key="ai_pet_sensitivity",
222  entity_category=EntityCategory.CONFIG,
223  native_step=1,
224  native_min_value=0,
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")
230  ),
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"),
233  ),
235  key="ai_pet_sensititvity",
236  cmd_key="GetAiAlarm",
237  translation_key="ai_animal_sensitivity",
238  entity_category=EntityCategory.CONFIG,
239  native_step=1,
240  native_min_value=0,
241  native_max_value=100,
242  supported=lambda api, ch: (
243  api.supported(ch, "ai_sensitivity") and api.supported(ch, "ai_animal")
244  ),
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"),
247  ),
249  key="ai_face_delay",
250  cmd_key="GetAiAlarm",
251  translation_key="ai_face_delay",
252  entity_category=EntityCategory.CONFIG,
253  entity_registry_enabled_default=False,
254  native_step=1,
255  native_unit_of_measurement=UnitOfTime.SECONDS,
256  native_min_value=0,
257  native_max_value=8,
258  supported=lambda api, ch: (
259  api.supported(ch, "ai_delay") and api.ai_supported(ch, "face")
260  ),
261  value=lambda api, ch: api.ai_delay(ch, "face"),
262  method=lambda api, ch, value: api.set_ai_delay(ch, int(value), "face"),
263  ),
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,
270  native_step=1,
271  native_unit_of_measurement=UnitOfTime.SECONDS,
272  native_min_value=0,
273  native_max_value=8,
274  supported=lambda api, ch: (
275  api.supported(ch, "ai_delay") and api.ai_supported(ch, "people")
276  ),
277  value=lambda api, ch: api.ai_delay(ch, "people"),
278  method=lambda api, ch, value: api.set_ai_delay(ch, int(value), "people"),
279  ),
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,
286  native_step=1,
287  native_unit_of_measurement=UnitOfTime.SECONDS,
288  native_min_value=0,
289  native_max_value=8,
290  supported=lambda api, ch: (
291  api.supported(ch, "ai_delay") and api.ai_supported(ch, "vehicle")
292  ),
293  value=lambda api, ch: api.ai_delay(ch, "vehicle"),
294  method=lambda api, ch, value: api.set_ai_delay(ch, int(value), "vehicle"),
295  ),
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,
302  native_step=1,
303  native_unit_of_measurement=UnitOfTime.SECONDS,
304  native_min_value=0,
305  native_max_value=8,
306  supported=lambda api, ch: (
307  api.supported(ch, "ai_delay") and api.ai_supported(ch, "package")
308  ),
309  value=lambda api, ch: api.ai_delay(ch, "package"),
310  method=lambda api, ch, value: api.set_ai_delay(ch, int(value), "package"),
311  ),
313  key="ai_pet_delay",
314  cmd_key="GetAiAlarm",
315  translation_key="ai_pet_delay",
316  entity_category=EntityCategory.CONFIG,
317  entity_registry_enabled_default=False,
318  native_step=1,
319  native_unit_of_measurement=UnitOfTime.SECONDS,
320  native_min_value=0,
321  native_max_value=8,
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")
326  ),
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"),
329  ),
331  key="ai_pet_delay",
332  cmd_key="GetAiAlarm",
333  translation_key="ai_animal_delay",
334  entity_category=EntityCategory.CONFIG,
335  entity_registry_enabled_default=False,
336  native_step=1,
337  native_unit_of_measurement=UnitOfTime.SECONDS,
338  native_min_value=0,
339  native_max_value=8,
340  supported=lambda api, ch: (
341  api.supported(ch, "ai_delay") and api.supported(ch, "ai_animal")
342  ),
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"),
345  ),
347  key="auto_quick_reply_time",
348  cmd_key="GetAutoReply",
349  translation_key="auto_quick_reply_time",
350  entity_category=EntityCategory.CONFIG,
351  native_step=1,
352  native_unit_of_measurement=UnitOfTime.SECONDS,
353  native_min_value=1,
354  native_max_value=60,
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)),
358  ),
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,
365  native_step=1,
366  native_min_value=-1,
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)),
371  ),
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,
378  native_step=1,
379  native_min_value=-1,
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)),
384  ),
386  key="auto_track_disappear_time",
387  cmd_key="GetAiCfg",
388  translation_key="auto_track_disappear_time",
389  entity_category=EntityCategory.CONFIG,
390  native_step=1,
391  native_unit_of_measurement=UnitOfTime.SECONDS,
392  native_min_value=1,
393  native_max_value=60,
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)
398  ),
399  ),
401  key="auto_track_stop_time",
402  cmd_key="GetAiCfg",
403  translation_key="auto_track_stop_time",
404  entity_category=EntityCategory.CONFIG,
405  native_step=1,
406  native_unit_of_measurement=UnitOfTime.SECONDS,
407  native_min_value=1,
408  native_max_value=60,
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)),
412  ),
414  key="day_night_switch_threshold",
415  cmd_key="GetIsp",
416  translation_key="day_night_switch_threshold",
417  entity_category=EntityCategory.CONFIG,
418  entity_registry_enabled_default=False,
419  native_step=1,
420  native_min_value=0,
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)),
425  ),
427  key="image_brightness",
428  cmd_key="GetImage",
429  translation_key="image_brightness",
430  entity_category=EntityCategory.CONFIG,
431  entity_registry_enabled_default=False,
432  native_step=1,
433  native_min_value=0,
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)),
438  ),
440  key="image_contrast",
441  cmd_key="GetImage",
442  translation_key="image_contrast",
443  entity_category=EntityCategory.CONFIG,
444  entity_registry_enabled_default=False,
445  native_step=1,
446  native_min_value=0,
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)),
451  ),
453  key="image_saturation",
454  cmd_key="GetImage",
455  translation_key="image_saturation",
456  entity_category=EntityCategory.CONFIG,
457  entity_registry_enabled_default=False,
458  native_step=1,
459  native_min_value=0,
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)),
464  ),
466  key="image_sharpness",
467  cmd_key="GetImage",
468  translation_key="image_sharpness",
469  entity_category=EntityCategory.CONFIG,
470  entity_registry_enabled_default=False,
471  native_step=1,
472  native_min_value=0,
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)),
477  ),
479  key="image_hue",
480  cmd_key="GetImage",
481  translation_key="image_hue",
482  entity_category=EntityCategory.CONFIG,
483  entity_registry_enabled_default=False,
484  native_step=1,
485  native_min_value=0,
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)),
490  ),
491 )
492 
493 HOST_NUMBER_ENTITIES = (
495  key="alarm_volume",
496  cmd_key="GetDeviceAudioCfg",
497  translation_key="alarm_volume",
498  entity_category=EntityCategory.CONFIG,
499  native_step=1,
500  native_min_value=0,
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)),
505  ),
507  key="message_volume",
508  cmd_key="GetDeviceAudioCfg",
509  translation_key="message_volume",
510  entity_category=EntityCategory.CONFIG,
511  native_step=1,
512  native_min_value=0,
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)),
517  ),
518 )
519 
520 CHIME_NUMBER_ENTITIES = (
522  key="volume",
523  cmd_key="DingDongOpt",
524  translation_key="volume",
525  entity_category=EntityCategory.CONFIG,
526  native_step=1,
527  native_min_value=0,
528  native_max_value=4,
529  value=lambda chime: chime.volume,
530  method=lambda chime, value: chime.set_option(volume=int(value)),
531  ),
532 )
533 
534 
536  hass: HomeAssistant,
537  config_entry: ReolinkConfigEntry,
538  async_add_entities: AddEntitiesCallback,
539 ) -> None:
540  """Set up a Reolink number entities."""
541  reolink_data: ReolinkData = config_entry.runtime_data
542 
543  entities: list[NumberEntity] = [
544  ReolinkNumberEntity(reolink_data, channel, entity_description)
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)
548  ]
549  entities.extend(
550  ReolinkHostNumberEntity(reolink_data, entity_description)
551  for entity_description in HOST_NUMBER_ENTITIES
552  if entity_description.supported(reolink_data.host.api)
553  )
554  entities.extend(
555  ReolinkChimeNumberEntity(reolink_data, chime, entity_description)
556  for entity_description in CHIME_NUMBER_ENTITIES
557  for chime in reolink_data.host.api.chime_list
558  )
559  async_add_entities(entities)
560 
561 
563  """Base number entity class for Reolink IP cameras."""
564 
565  entity_description: ReolinkNumberEntityDescription
566 
567  def __init__(
568  self,
569  reolink_data: ReolinkData,
570  channel: int,
571  entity_description: ReolinkNumberEntityDescription,
572  ) -> None:
573  """Initialize Reolink number entity."""
574  self.entity_descriptionentity_description = entity_description
575  super().__init__(reolink_data, channel)
576 
577  if entity_description.get_min_value is not None:
578  self._attr_native_min_value_attr_native_min_value = entity_description.get_min_value(
579  self._host_host.api, channel
580  )
581  if entity_description.get_max_value is not None:
582  self._attr_native_max_value_attr_native_max_value = entity_description.get_max_value(
583  self._host_host.api, channel
584  )
585  self._attr_mode_attr_mode = entity_description.mode
586 
587  @property
588  def native_value(self) -> float | None:
589  """State of the number entity."""
590  return self.entity_descriptionentity_description.value(self._host_host.api, self._channel_channel)
591 
592  async def async_set_native_value(self, value: float) -> None:
593  """Update the current value."""
594  try:
595  await self.entity_descriptionentity_description.method(self._host_host.api, self._channel_channel, value)
596  except InvalidParameterError as err:
597  raise ServiceValidationError(err) from err
598  except ReolinkError as err:
599  raise HomeAssistantError(err) from err
600  self.async_write_ha_stateasync_write_ha_state()
601 
602 
604  """Base number entity class for Reolink Host."""
605 
606  entity_description: ReolinkHostNumberEntityDescription
607 
608  def __init__(
609  self,
610  reolink_data: ReolinkData,
611  entity_description: ReolinkHostNumberEntityDescription,
612  ) -> None:
613  """Initialize Reolink number entity."""
614  self.entity_descriptionentity_description = entity_description
615  super().__init__(reolink_data)
616 
617  self._attr_mode_attr_mode = entity_description.mode
618 
619  @property
620  def native_value(self) -> float | None:
621  """State of the number entity."""
622  return self.entity_descriptionentity_description.value(self._host_host.api)
623 
624  async def async_set_native_value(self, value: float) -> None:
625  """Update the current value."""
626  try:
627  await self.entity_descriptionentity_description.method(self._host_host.api, value)
628  except InvalidParameterError as err:
629  raise ServiceValidationError(err) from err
630  except ReolinkError as err:
631  raise HomeAssistantError(err) from err
632  self.async_write_ha_stateasync_write_ha_state()
633 
634 
636  """Base number entity class for Reolink IP cameras."""
637 
638  entity_description: ReolinkChimeNumberEntityDescription
639 
640  def __init__(
641  self,
642  reolink_data: ReolinkData,
643  chime: Chime,
644  entity_description: ReolinkChimeNumberEntityDescription,
645  ) -> None:
646  """Initialize Reolink chime number entity."""
647  self.entity_descriptionentity_description = entity_description
648  super().__init__(reolink_data, chime)
649 
650  self._attr_mode_attr_mode = entity_description.mode
651 
652  @property
653  def native_value(self) -> float | None:
654  """State of the number entity."""
655  return self.entity_descriptionentity_description.value(self._chime_chime)
656 
657  async def async_set_native_value(self, value: float) -> None:
658  """Update the current value."""
659  try:
660  await self.entity_descriptionentity_description.method(self._chime_chime, value)
661  except InvalidParameterError as err:
662  raise ServiceValidationError(err) from err
663  except ReolinkError as err:
664  raise HomeAssistantError(err) from err
665  self.async_write_ha_stateasync_write_ha_state()