Home Assistant Unofficial Reference 2024.12.1
event.py
Go to the documentation of this file.
1 """Roon event entities."""
2 
3 import logging
4 from typing import cast
5 
6 from homeassistant.components.event import EventDeviceClass, EventEntity
7 from homeassistant.config_entries import ConfigEntry
8 from homeassistant.core import HomeAssistant, callback
9 from homeassistant.helpers.device_registry import DeviceInfo
10 from homeassistant.helpers.dispatcher import async_dispatcher_connect
11 from homeassistant.helpers.entity_platform import AddEntitiesCallback
12 
13 from .const import DOMAIN
14 
15 _LOGGER = logging.getLogger(__name__)
16 
17 
19  hass: HomeAssistant,
20  config_entry: ConfigEntry,
21  async_add_entities: AddEntitiesCallback,
22 ) -> None:
23  """Set up Roon Event from Config Entry."""
24  roon_server = hass.data[DOMAIN][config_entry.entry_id]
25  event_entities = set()
26 
27  @callback
28  def async_add_roon_volume_entity(player_data):
29  """Add or update Roon event Entity."""
30  dev_id = player_data["dev_id"]
31  if dev_id in event_entities:
32  return
33  # new player!
34  event_entity = RoonEventEntity(roon_server, player_data)
35  event_entities.add(dev_id)
36  async_add_entities([event_entity])
37 
38  # start listening for players to be added from the server component
39  config_entry.async_on_unload(
41  hass, "roon_media_player", async_add_roon_volume_entity
42  )
43  )
44 
45 
47  """Representation of a Roon Event entity."""
48 
49  _attr_device_class = EventDeviceClass.BUTTON
50  _attr_event_types = ["volume_up", "volume_down", "mute_toggle"]
51  _attr_translation_key = "volume"
52 
53  def __init__(self, server, player_data):
54  """Initialize the entity."""
55  self._server_server = server
56  self._player_data_player_data = player_data
57  player_name = player_data["display_name"]
58  self._attr_name_attr_name = f"{player_name} roon volume"
59  self._attr_unique_id_attr_unique_id = self._player_data_player_data["dev_id"]
60 
61  if self._player_data_player_data.get("source_controls"):
62  dev_model = self._player_data_player_data["source_controls"][0].get("display_name")
63 
64  self._attr_device_info_attr_device_info = DeviceInfo(
65  identifiers={(DOMAIN, self.unique_idunique_id)},
66  # Instead of setting the device name to the entity name, roon
67  # should be updated to set has_entity_name = True, and set the entity
68  # name to None
69  name=cast(str | None, self.namename),
70  manufacturer="RoonLabs",
71  model=dev_model,
72  via_device=(DOMAIN, self._server_server.roon_id),
73  )
74 
76  self, control_key: str, event: str, value: int
77  ) -> None:
78  """Callbacks from the roon api with volume request."""
79 
80  if event == "set_mute":
81  event = "mute_toggle"
82  elif event == "set_volume":
83  if value > 0:
84  event = "volume_up"
85  else:
86  event = "volume_down"
87  else:
88  _LOGGER.debug("Received unsupported roon volume event %s", event)
89  return
90 
91  self._trigger_event_trigger_event(event)
92  self.schedule_update_ha_stateschedule_update_ha_state()
93 
94  async def async_added_to_hass(self) -> None:
95  """Register volume hooks with the roon api."""
96 
97  self._server_server.roonapi.register_volume_control(
98  self.unique_idunique_id,
99  self.namename,
100  self._roonapi_volume_callback_roonapi_volume_callback,
101  0,
102  "incremental",
103  0,
104  0,
105  0,
106  False,
107  )
108 
109  async def async_will_remove_from_hass(self) -> None:
110  """Unregister volume hooks from the roon api."""
111  self._server_server.roonapi.unregister_volume_control(self.unique_idunique_id)
None _trigger_event(self, str event_type, dict[str, Any]|None event_attributes=None)
Definition: __init__.py:148
def __init__(self, server, player_data)
Definition: event.py:53
None _roonapi_volume_callback(self, str control_key, str event, int value)
Definition: event.py:77
None schedule_update_ha_state(self, bool force_refresh=False)
Definition: entity.py:1244
str|UndefinedType|None name(self)
Definition: entity.py:738
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: event.py:22
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103