Home Assistant Unofficial Reference 2024.12.1
services.py
Go to the documentation of this file.
1 """Reolink additional services."""
2 
3 from __future__ import annotations
4 
5 from reolink_aio.api import Chime
6 from reolink_aio.enums import ChimeToneEnum
7 from reolink_aio.exceptions import InvalidParameterError, ReolinkError
8 import voluptuous as vol
9 
10 from homeassistant.config_entries import ConfigEntryState
11 from homeassistant.const import ATTR_DEVICE_ID
12 from homeassistant.core import HomeAssistant, ServiceCall, callback
13 from homeassistant.exceptions import HomeAssistantError, ServiceValidationError
14 from homeassistant.helpers import device_registry as dr
15 
16 from .const import DOMAIN
17 from .host import ReolinkHost
18 from .util import get_device_uid_and_ch
19 
20 ATTR_RINGTONE = "ringtone"
21 
22 
23 @callback
24 def async_setup_services(hass: HomeAssistant) -> None:
25  """Set up Reolink services."""
26 
27  async def async_play_chime(service_call: ServiceCall) -> None:
28  """Play a ringtone."""
29  service_data = service_call.data
30  device_registry = dr.async_get(hass)
31 
32  for device_id in service_data[ATTR_DEVICE_ID]:
33  config_entry = None
34  device = device_registry.async_get(device_id)
35  if device is not None:
36  for entry_id in device.config_entries:
37  config_entry = hass.config_entries.async_get_entry(entry_id)
38  if config_entry is not None and config_entry.domain == DOMAIN:
39  break
40  if (
41  config_entry is None
42  or device is None
43  or config_entry.state == ConfigEntryState.NOT_LOADED
44  ):
46  translation_domain=DOMAIN,
47  translation_key="service_entry_ex",
48  translation_placeholders={"service_name": "play_chime"},
49  )
50  host: ReolinkHost = config_entry.runtime_data.host
51  (device_uid, chime_id, is_chime) = get_device_uid_and_ch(device, host)
52  chime: Chime | None = host.api.chime(chime_id)
53  if not is_chime or chime is None:
55  translation_domain=DOMAIN,
56  translation_key="service_not_chime",
57  translation_placeholders={"device_name": str(device.name)},
58  )
59 
60  ringtone = service_data[ATTR_RINGTONE]
61  try:
62  await chime.play(ChimeToneEnum[ringtone].value)
63  except InvalidParameterError as err:
64  raise ServiceValidationError(err) from err
65  except ReolinkError as err:
66  raise HomeAssistantError(err) from err
67 
68  hass.services.async_register(
69  DOMAIN,
70  "play_chime",
71  async_play_chime,
72  schema=vol.Schema(
73  {
74  vol.Required(ATTR_DEVICE_ID): list[str],
75  vol.Required(ATTR_RINGTONE): vol.In(
76  [method.name for method in ChimeToneEnum][1:]
77  ),
78  }
79  ),
80  )