Home Assistant Unofficial Reference 2024.12.1
remote.py
Go to the documentation of this file.
1 """Xbox Remote support."""
2 
3 from __future__ import annotations
4 
5 import asyncio
6 from collections.abc import Iterable
7 import re
8 from typing import Any
9 
10 from xbox.webapi.api.client import XboxLiveClient
11 from xbox.webapi.api.provider.smartglass.models import (
12  InputKeyType,
13  PowerState,
14  SmartglassConsole,
15  SmartglassConsoleList,
16 )
17 
19  ATTR_DELAY_SECS,
20  ATTR_NUM_REPEATS,
21  DEFAULT_DELAY_SECS,
22  RemoteEntity,
23 )
24 from homeassistant.config_entries import ConfigEntry
25 from homeassistant.core import HomeAssistant
26 from homeassistant.helpers.device_registry import DeviceInfo
27 from homeassistant.helpers.entity_platform import AddEntitiesCallback
28 from homeassistant.helpers.update_coordinator import CoordinatorEntity
29 
30 from .const import DOMAIN
31 from .coordinator import ConsoleData, XboxUpdateCoordinator
32 
33 
35  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
36 ) -> None:
37  """Set up Xbox media_player from a config entry."""
38  client: XboxLiveClient = hass.data[DOMAIN][entry.entry_id]["client"]
39  consoles: SmartglassConsoleList = hass.data[DOMAIN][entry.entry_id]["consoles"]
40  coordinator: XboxUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
41  "coordinator"
42  ]
43 
45  [XboxRemote(client, console, coordinator) for console in consoles.result]
46  )
47 
48 
49 class XboxRemote(CoordinatorEntity[XboxUpdateCoordinator], RemoteEntity):
50  """Representation of an Xbox remote."""
51 
52  def __init__(
53  self,
54  client: XboxLiveClient,
55  console: SmartglassConsole,
56  coordinator: XboxUpdateCoordinator,
57  ) -> None:
58  """Initialize the Xbox Media Player."""
59  super().__init__(coordinator)
60  self.client: XboxLiveClient = client
61  self._console: SmartglassConsole = console
62 
63  @property
64  def name(self):
65  """Return the device name."""
66  return f"{self._console.name} Remote"
67 
68  @property
69  def unique_id(self):
70  """Console device ID."""
71  return self._console.id
72 
73  @property
74  def data(self) -> ConsoleData:
75  """Return coordinator data for this console."""
76  return self.coordinator.data.consoles[self._console.id]
77 
78  @property
79  def is_on(self):
80  """Return True if device is on."""
81  return self.datadatadatadata.status.power_state == PowerState.On
82 
83  async def async_turn_on(self, **kwargs: Any) -> None:
84  """Turn the Xbox on."""
85  await self.client.smartglass.wake_up(self._console.id)
86 
87  async def async_turn_off(self, **kwargs: Any) -> None:
88  """Turn the Xbox off."""
89  await self.client.smartglass.turn_off(self._console.id)
90 
91  async def async_send_command(self, command: Iterable[str], **kwargs: Any) -> None:
92  """Send controller or text input to the Xbox."""
93  num_repeats = kwargs[ATTR_NUM_REPEATS]
94  delay = kwargs.get(ATTR_DELAY_SECS, DEFAULT_DELAY_SECS)
95 
96  for _ in range(num_repeats):
97  for single_command in command:
98  try:
99  button = InputKeyType(single_command)
100  await self.client.smartglass.press_button(self._console.id, button)
101  except ValueError:
102  await self.client.smartglass.insert_text(
103  self._console.id, single_command
104  )
105  await asyncio.sleep(delay)
106 
107  @property
108  def device_info(self) -> DeviceInfo:
109  """Return a device description for device registry."""
110  # Turns "XboxOneX" into "Xbox One X" for display
111  matches = re.finditer(
112  ".+?(?:(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|$)",
113  self._console.console_type,
114  )
115 
116  return DeviceInfo(
117  identifiers={(DOMAIN, self._console.id)},
118  manufacturer="Microsoft",
119  model=" ".join([m.group(0) for m in matches]),
120  name=self._console.name,
121  )
None __init__(self, XboxLiveClient client, SmartglassConsole console, XboxUpdateCoordinator coordinator)
Definition: remote.py:57
None async_turn_on(self, **Any kwargs)
Definition: remote.py:83
None async_send_command(self, Iterable[str] command, **Any kwargs)
Definition: remote.py:91
None async_turn_off(self, **Any kwargs)
Definition: remote.py:87
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: remote.py:36