1 """Support for Pioneer Network Receivers."""
3 from __future__
import annotations
7 from typing
import Final
9 import voluptuous
as vol
12 PLATFORM_SCHEMA
as MEDIA_PLAYER_PLATFORM_SCHEMA,
14 MediaPlayerEntityFeature,
23 _LOGGER = logging.getLogger(__name__)
25 CONF_SOURCES =
"sources"
27 DEFAULT_NAME =
"Pioneer AVR"
29 DEFAULT_TIMEOUT: Final =
None
30 DEFAULT_SOURCES: dict[str, str] = {}
34 MAX_SOURCE_NUMBERS = 60
36 PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend(
38 vol.Required(CONF_HOST): cv.string,
39 vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
40 vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
41 vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.socket_timeout,
42 vol.Optional(CONF_SOURCES, default=DEFAULT_SOURCES): {cv.string: cv.string},
50 add_entities: AddEntitiesCallback,
51 discovery_info: DiscoveryInfoType |
None =
None,
53 """Set up the Pioneer platform."""
67 """Representation of a Pioneer device."""
69 _attr_supported_features = (
70 MediaPlayerEntityFeature.PAUSE
71 | MediaPlayerEntityFeature.VOLUME_SET
72 | MediaPlayerEntityFeature.VOLUME_STEP
73 | MediaPlayerEntityFeature.VOLUME_MUTE
74 | MediaPlayerEntityFeature.TURN_ON
75 | MediaPlayerEntityFeature.TURN_OFF
76 | MediaPlayerEntityFeature.SELECT_SOURCE
77 | MediaPlayerEntityFeature.PLAY
80 def __init__(self, name, host, port, timeout, sources):
81 """Initialize the Pioneer device."""
95 """Execute `command` and return the response."""
97 telnet.write(command.encode(
"ASCII") + b
"\r")
98 except telnetlib.socket.timeout:
99 _LOGGER.debug(
"Pioneer command %s timed out", command)
105 result = telnet.read_until(b
"\r\n", timeout=0.2).decode(
"ASCII").strip()
106 if result.startswith(expected_prefix):
112 """Establish a telnet connection and sends command."""
117 _LOGGER.warning(
"Pioneer %s refused connection", self.
_name_name)
119 telnet.write(command.encode(
"ASCII") + b
"\r")
120 telnet.read_very_eager()
122 except telnetlib.socket.timeout:
123 _LOGGER.debug(
"Pioneer %s command %s timed out", self.
_name_name, command)
126 """Get the latest details from the device."""
130 _LOGGER.warning(
"Pioneer %s refused connection", self.
_name_name)
137 volume_str = self.
telnet_requesttelnet_request(telnet,
"?V",
"VOL")
138 self.
_volume_volume =
int(volume_str[3:]) / MAX_VOLUME
if volume_str
else None
140 muted_value = self.
telnet_requesttelnet_request(telnet,
"?M",
"MUT")
141 self.
_muted_muted = (muted_value ==
"MUT0")
if muted_value
else None
145 for i
in range(MAX_SOURCE_NUMBERS):
146 result = self.
telnet_requesttelnet_request(telnet, f
"?RGB{str(i).zfill(2)}",
"RGB")
151 source_name = result[6:]
152 source_number =
str(i).zfill(2)
157 source_number = self.
telnet_requesttelnet_request(telnet,
"?F",
"FN")
169 """Return the name of the device."""
170 return self.
_name_name
173 def state(self) -> MediaPlayerState | None:
174 """Return the state of the device."""
176 return MediaPlayerState.OFF
178 return MediaPlayerState.OFF
180 return MediaPlayerState.ON
186 """Volume level of the media player (0..1)."""
191 """Boolean if volume is currently muted."""
196 """Return the current input source."""
201 """List of available input sources."""
206 """Title of current playing media."""
210 """Turn off media player."""
214 """Volume up media player."""
218 """Volume down media player."""
222 """Set volume level, range 0..1."""
224 self.
telnet_commandtelnet_command(f
"{round(volume * MAX_VOLUME):03}VL")
227 """Mute (true) or unmute (false) media player."""
231 """Turn the media player on."""
235 """Select input source."""
236 self.
telnet_commandtelnet_command(f
"{self._source_name_to_number.get(source)}FN")
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
web.Response get(self, web.Request request, str config_key)