1 """Support for Denon Network Receivers."""
3 from __future__
import annotations
8 import voluptuous
as vol
11 PLATFORM_SCHEMA
as MEDIA_PLAYER_PLATFORM_SCHEMA,
13 MediaPlayerEntityFeature,
22 _LOGGER = logging.getLogger(__name__)
24 DEFAULT_NAME =
"Music station"
27 MediaPlayerEntityFeature.VOLUME_SET
28 | MediaPlayerEntityFeature.VOLUME_MUTE
29 | MediaPlayerEntityFeature.TURN_ON
30 | MediaPlayerEntityFeature.TURN_OFF
31 | MediaPlayerEntityFeature.SELECT_SOURCE
33 SUPPORT_MEDIA_MODES = (
34 MediaPlayerEntityFeature.PAUSE
35 | MediaPlayerEntityFeature.STOP
36 | MediaPlayerEntityFeature.PREVIOUS_TRACK
37 | MediaPlayerEntityFeature.NEXT_TRACK
38 | MediaPlayerEntityFeature.PLAY
41 PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend(
43 vol.Required(CONF_HOST): cv.string,
44 vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
53 "Satellite / Cable":
"SAT/CBL",
62 "Media server":
"SERVER",
65 "Rapsody":
"RHAPSODY",
70 "Favorites":
"FAVORITES",
71 "Internet Radio":
"IRADIO",
72 "USB/IPOD":
"USB/IPOD",
83 add_entities: AddEntitiesCallback,
84 discovery_info: DiscoveryInfoType |
None =
None,
86 """Set up the Denon platform."""
87 denon =
DenonDevice(config[CONF_NAME], config[CONF_HOST])
94 """Representation of a Denon device."""
97 """Initialize the Denon device."""
114 nsfrn = self.
telnet_requesttelnet_request(telnet,
"NSFRN ?").removeprefix(
"NSFRN ")
116 self.
_name_name = nsfrn
120 for line
in self.
telnet_requesttelnet_request(telnet,
"SSFUN ?", all_lines=
True):
121 ssfun = line.removeprefix(
"SSFUN").split(
" ", 1)
124 if len(ssfun) == 2
and ssfun[1]:
125 configured_name = ssfun[1]
128 configured_name = source
133 for line
in self.
telnet_requesttelnet_request(telnet,
"SSSOD ?", all_lines=
True):
134 source, status = line.removeprefix(
"SSSOD").split(
" ", 1)
136 for pretty_name, name
in self.
_source_list_source_list.items():
143 """Execute `command` and return the response."""
144 _LOGGER.debug(
"Sending: %s", command)
145 telnet.write(command.encode(
"ASCII") + b
"\r")
148 line = telnet.read_until(b
"\r", timeout=0.2)
151 lines.append(line.decode(
"ASCII").strip())
152 _LOGGER.debug(
"Received: %s", line)
156 return lines[0]
if lines
else ""
159 """Establish a telnet connection and sends `command`."""
160 telnet = telnetlib.Telnet(self.
_host_host)
161 _LOGGER.debug(
"Sending: %s", command)
162 telnet.write(command.encode(
"ASCII") + b
"\r")
163 telnet.read_very_eager()
167 """Get the latest details from the device."""
171 """Get the latest details from the device, as boolean."""
173 telnet = telnetlib.Telnet(self.
_host_host)
182 for line
in self.
telnet_requesttelnet_request(telnet,
"MV?", all_lines=
True):
183 if line.startswith(
"MVMAX "):
185 self.
_volume_max_volume_max =
int(line[len(
"MVMAX ") : len(
"MVMAX XX")])
187 if line.startswith(
"MV"):
188 self.
_volume_volume =
int(line.removeprefix(
"MV"))
192 if self.
_mediasource_mediasource
in MEDIA_MODES.values():
205 for line
in self.
telnet_requesttelnet_request(telnet,
"NSE", all_lines=
True):
206 self.
_mediainfo_mediainfo += f
"{line.removeprefix(answer_codes.pop(0))}\n"
215 """Return the name of the device."""
216 return self.
_name_name
219 def state(self) -> MediaPlayerState | None:
220 """Return the state of the device."""
221 if self.
_pwstate_pwstate ==
"PWSTANDBY":
222 return MediaPlayerState.OFF
224 return MediaPlayerState.ON
230 """Volume level of the media player (0..1)."""
235 """Return boolean if volume is currently muted."""
240 """Return the list of available input sources."""
245 """Return the current media info."""
250 """Flag media player features that are supported."""
251 if self.
_mediasource_mediasource
in MEDIA_MODES.values():
252 return SUPPORT_DENON | SUPPORT_MEDIA_MODES
257 """Return the current input source."""
258 for pretty_name, name
in self.
_source_list_source_list.items():
264 """Turn off media player."""
268 """Volume up media player."""
272 """Volume down media player."""
276 """Set volume level, range 0..1."""
277 self.
telnet_commandtelnet_command(f
"MV{round(volume * self._volume_max):02}")
280 """Mute (true) or unmute (false) media player."""
281 mute_status =
"ON" if mute
else "OFF"
285 """Play media player."""
289 """Pause media player."""
293 """Pause media player."""
297 """Send the next track command."""
301 """Send the previous track command."""
305 """Turn the media player on."""
309 """Select input source."""
310 self.
telnet_commandtelnet_command(f
"SI{self._source_list.get(source)}")
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)