Home Assistant Unofficial Reference 2024.12.1
receiver.py
Go to the documentation of this file.
1 """Code to handle a DenonAVR receiver."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 import contextlib
7 import logging
8 
9 from denonavr import DenonAVR
10 from denonavr.exceptions import AvrProcessingError
11 import httpx
12 
13 _LOGGER = logging.getLogger(__name__)
14 
15 
17  """Class to async connect to a DenonAVR receiver."""
18 
19  def __init__(
20  self,
21  host: str,
22  timeout: float,
23  show_all_inputs: bool,
24  zone2: bool,
25  zone3: bool,
26  use_telnet: bool,
27  update_audyssey: bool,
28  async_client_getter: Callable[[], httpx.AsyncClient],
29  ) -> None:
30  """Initialize the class."""
31  self._async_client_getter_async_client_getter = async_client_getter
32  self._receiver_receiver: DenonAVR | None = None
33  self._host_host = host
34  self._show_all_inputs_show_all_inputs = show_all_inputs
35  self._timeout_timeout = timeout
36  self._use_telnet_use_telnet = use_telnet
37  self._update_audyssey_update_audyssey = update_audyssey
38 
39  self._zones: dict[str, str | None] = {}
40  if zone2:
41  self._zones["Zone2"] = None
42  if zone3:
43  self._zones["Zone3"] = None
44 
45  @property
46  def receiver(self) -> DenonAVR | None:
47  """Return the class containing all connections to the receiver."""
48  return self._receiver_receiver
49 
50  async def async_connect_receiver(self) -> bool:
51  """Connect to the DenonAVR receiver."""
52  await self.async_init_receiver_classasync_init_receiver_class()
53  assert self._receiver_receiver
54 
55  if (
56  self._receiver_receiver.manufacturer is None
57  or self._receiver_receiver.name is None
58  or self._receiver_receiver.model_name is None
59  or self._receiver_receiver.receiver_type is None
60  ):
61  _LOGGER.error(
62  (
63  "Missing receiver information: manufacturer '%s', name '%s', model"
64  " '%s', type '%s'"
65  ),
66  self._receiver_receiver.manufacturer,
67  self._receiver_receiver.name,
68  self._receiver_receiver.model_name,
69  self._receiver_receiver.receiver_type,
70  )
71  return False
72 
73  _LOGGER.debug(
74  "%s receiver %s at host %s connected, model %s, serial %s, type %s",
75  self._receiver_receiver.manufacturer,
76  self._receiver_receiver.name,
77  self._receiver_receiver.host,
78  self._receiver_receiver.model_name,
79  self._receiver_receiver.serial_number,
80  self._receiver_receiver.receiver_type,
81  )
82 
83  return True
84 
85  async def async_init_receiver_class(self) -> None:
86  """Initialize the DenonAVR class asynchronously."""
87  receiver = DenonAVR(
88  host=self._host_host,
89  show_all_inputs=self._show_all_inputs_show_all_inputs,
90  timeout=self._timeout_timeout,
91  add_zones=self._zones,
92  )
93  # Use httpx.AsyncClient getter provided by Home Assistant
94  receiver.set_async_client_getter(self._async_client_getter_async_client_getter)
95  await receiver.async_setup()
96  # Do an initial update if telnet is used.
97  if self._use_telnet_use_telnet:
98  for zone in receiver.zones.values():
99  with contextlib.suppress(AvrProcessingError):
100  await zone.async_update()
101  if self._update_audyssey_update_audyssey:
102  await zone.async_update_audyssey()
103  await receiver.async_telnet_connect()
104 
105  self._receiver_receiver = receiver
None __init__(self, str host, float timeout, bool show_all_inputs, bool zone2, bool zone3, bool use_telnet, bool update_audyssey, Callable[[], httpx.AsyncClient] async_client_getter)
Definition: receiver.py:29