Home Assistant Unofficial Reference 2024.12.1
services.py
Go to the documentation of this file.
1 """Support for Bluesound devices."""
2 
3 from __future__ import annotations
4 
5 from typing import NamedTuple
6 
7 import voluptuous as vol
8 
9 from homeassistant.const import ATTR_ENTITY_ID
10 from homeassistant.core import HomeAssistant, ServiceCall
11 from homeassistant.helpers import config_validation as cv
12 
13 from .const import ATTR_MASTER, DOMAIN
14 
15 SERVICE_CLEAR_TIMER = "clear_sleep_timer"
16 SERVICE_JOIN = "join"
17 SERVICE_SET_TIMER = "set_sleep_timer"
18 SERVICE_UNJOIN = "unjoin"
19 
20 BS_SCHEMA = vol.Schema({vol.Optional(ATTR_ENTITY_ID): cv.entity_ids})
21 
22 BS_JOIN_SCHEMA = BS_SCHEMA.extend({vol.Required(ATTR_MASTER): cv.entity_id})
23 
24 
25 class ServiceMethodDetails(NamedTuple):
26  """Details for SERVICE_TO_METHOD mapping."""
27 
28  method: str
29  schema: vol.Schema
30 
31 
32 SERVICE_TO_METHOD = {
33  SERVICE_JOIN: ServiceMethodDetails(method="async_join", schema=BS_JOIN_SCHEMA),
34  SERVICE_UNJOIN: ServiceMethodDetails(method="async_unjoin", schema=BS_SCHEMA),
35  SERVICE_SET_TIMER: ServiceMethodDetails(
36  method="async_increase_timer", schema=BS_SCHEMA
37  ),
38  SERVICE_CLEAR_TIMER: ServiceMethodDetails(
39  method="async_clear_timer", schema=BS_SCHEMA
40  ),
41 }
42 
43 
44 def setup_services(hass: HomeAssistant) -> None:
45  """Set up services for Bluesound component."""
46 
47  async def async_service_handler(service: ServiceCall) -> None:
48  """Map services to method of Bluesound devices."""
49  if not (method := SERVICE_TO_METHOD.get(service.service)):
50  return
51 
52  params = {
53  key: value for key, value in service.data.items() if key != ATTR_ENTITY_ID
54  }
55  if entity_ids := service.data.get(ATTR_ENTITY_ID):
56  target_players = [
57  player for player in hass.data[DOMAIN] if player.entity_id in entity_ids
58  ]
59  else:
60  target_players = hass.data[DOMAIN]
61 
62  for player in target_players:
63  await getattr(player, method.method)(**params)
64 
65  for service, method in SERVICE_TO_METHOD.items():
66  hass.services.async_register(
67  DOMAIN, service, async_service_handler, schema=method.schema
68  )
None setup_services(HomeAssistant hass)
Definition: services.py:44