1 """Support for interfacing with NAD receivers through RS-232."""
3 from __future__
import annotations
5 from nad_receiver
import NADReceiver, NADReceiverTCP, NADReceiverTelnet
6 import voluptuous
as vol
9 PLATFORM_SCHEMA
as MEDIA_PLAYER_PLATFORM_SCHEMA,
11 MediaPlayerEntityFeature,
20 DEFAULT_TYPE =
"RS232"
21 DEFAULT_SERIAL_PORT =
"/dev/ttyUSB0"
23 DEFAULT_NAME =
"NAD Receiver"
24 DEFAULT_MIN_VOLUME = -92
25 DEFAULT_MAX_VOLUME = -20
26 DEFAULT_VOLUME_STEP = 4
29 MediaPlayerEntityFeature.VOLUME_SET
30 | MediaPlayerEntityFeature.VOLUME_MUTE
31 | MediaPlayerEntityFeature.TURN_ON
32 | MediaPlayerEntityFeature.TURN_OFF
33 | MediaPlayerEntityFeature.VOLUME_STEP
34 | MediaPlayerEntityFeature.SELECT_SOURCE
37 CONF_SERIAL_PORT =
"serial_port"
38 CONF_MIN_VOLUME =
"min_volume"
39 CONF_MAX_VOLUME =
"max_volume"
40 CONF_VOLUME_STEP =
"volume_step"
41 CONF_SOURCE_DICT =
"sources"
44 SOURCE_DICT_SCHEMA = vol.Schema({vol.Range(min=1, max=12): cv.string})
46 PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend(
48 vol.Optional(CONF_TYPE, default=DEFAULT_TYPE): vol.In(
49 [
"RS232",
"Telnet",
"TCP"]
51 vol.Optional(CONF_SERIAL_PORT, default=DEFAULT_SERIAL_PORT): cv.string,
52 vol.Optional(CONF_HOST): cv.string,
53 vol.Optional(CONF_PORT, default=DEFAULT_PORT): int,
54 vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
55 vol.Optional(CONF_MIN_VOLUME, default=DEFAULT_MIN_VOLUME): int,
56 vol.Optional(CONF_MAX_VOLUME, default=DEFAULT_MAX_VOLUME): int,
57 vol.Optional(CONF_SOURCE_DICT, default={}): SOURCE_DICT_SCHEMA,
58 vol.Optional(CONF_VOLUME_STEP, default=DEFAULT_VOLUME_STEP): int,
66 add_entities: AddEntitiesCallback,
67 discovery_info: DiscoveryInfoType |
None =
None,
69 """Set up the NAD platform."""
70 if config.get(CONF_TYPE)
in (
"RS232",
"Telnet"):
83 """Representation of a NAD Receiver."""
85 _attr_icon =
"mdi:speaker-multiple"
86 _attr_supported_features = SUPPORT_NAD
89 """Initialize the NAD Receiver device."""
99 if self.
configconfig[CONF_TYPE] ==
"RS232":
103 port = self.
configconfig[CONF_PORT]
104 self.
_nad_receiver_nad_receiver = NADReceiverTelnet(host, port)
107 """Turn the media player off."""
111 """Turn the media player on."""
115 """Volume up the media player."""
119 """Volume down the media player."""
123 """Set volume level, range 0..1."""
127 """Mute (true) or unmute (false) media player."""
134 """Select input source."""
139 """List of available input sources."""
144 """Return if device is available."""
148 """Retrieve latest state."""
149 power_state = self.
_nad_receiver_nad_receiver.main_power(
"?")
156 else MediaPlayerState.OFF
165 self.
calc_volumecalc_volume(volume)
if volume
is not None else None
172 """Calculate the volume given the decibel.
174 Return the volume (0..1).
176 return abs(self.
_min_volume_min_volume - decibel) / abs(
181 """Calculate the decibel given the volume.
191 """Representation of a NAD Digital amplifier."""
193 _attr_supported_features = SUPPORT_NAD
196 """Initialize the amplifier."""
199 self.
_min_vol_min_vol = (config[CONF_MIN_VOLUME] + 90) * 2
200 self.
_max_vol_max_vol = (config[CONF_MAX_VOLUME] + 90) * 2
206 """Turn the media player off."""
210 """Turn the media player on."""
214 """Step volume up in the configured increments."""
218 """Step volume down in the configured increments."""
222 """Set volume level, range 0..1."""
223 nad_volume_to_set =
int(
226 self.
_nad_receiver_nad_receiver.set_volume(nad_volume_to_set)
229 """Mute (true) or unmute (false) media player."""
236 """Select input source."""
241 """List of available input sources."""
245 """Get the latest details from the device."""
250 if nad_status
is None:
254 if nad_status[
"power"]:
270 """Convert nad volume range (0-200) to internal volume range.
272 Takes into account configured min and max volume.
274 if nad_volume < self.
_min_vol_min_vol:
275 volume_internal = 0.0
276 elif nad_volume > self.
_max_vol_max_vol:
277 volume_internal = 1.0
279 volume_internal = (nad_volume - self.
_min_vol_min_vol) / (
282 return volume_internal
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
web.Response get(self, web.Request request, str config_key)