Skip to content
Merged
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 57 additions & 8 deletions homeassistant/components/media_player/denonavr.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@
from homeassistant.components.media_player import (
SUPPORT_PAUSE, SUPPORT_NEXT_TRACK, SUPPORT_PREVIOUS_TRACK,
SUPPORT_TURN_OFF, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_STEP,
SUPPORT_SELECT_SOURCE, SUPPORT_PLAY_MEDIA, MEDIA_TYPE_CHANNEL,
MediaPlayerDevice, PLATFORM_SCHEMA, SUPPORT_TURN_ON,
MEDIA_TYPE_MUSIC, SUPPORT_VOLUME_SET, SUPPORT_PLAY)
SUPPORT_SELECT_SOURCE, SUPPORT_SELECT_SOUND_MODE,
SUPPORT_PLAY_MEDIA, MEDIA_TYPE_CHANNEL, MediaPlayerDevice,
PLATFORM_SCHEMA, SUPPORT_TURN_ON, MEDIA_TYPE_MUSIC,
SUPPORT_VOLUME_SET, SUPPORT_PLAY)
from homeassistant.const import (
CONF_HOST, STATE_OFF, STATE_PLAYING, STATE_PAUSED,
CONF_NAME, STATE_ON, CONF_ZONE, CONF_TIMEOUT)
Expand All @@ -24,15 +25,18 @@

_LOGGER = logging.getLogger(__name__)

DEFAULT_NAME = None
DEFAULT_SHOW_SOURCES = False
DEFAULT_TIMEOUT = 2
DEFAULT_SOUND_MODE = True
CONF_SHOW_ALL_SOURCES = 'show_all_sources'
CONF_ZONES = 'zones'
CONF_SOUND_MODE = 'sound_mode'
CONF_VALID_ZONES = ['Zone2', 'Zone3']
CONF_INVALID_ZONES_ERR = 'Invalid Zone (expected Zone2 or Zone3)'
KEY_DENON_CACHE = 'denonavr_hosts'

ATTR_SOUND_MODE_RAW = 'sound_mode_raw'

SUPPORT_DENON = SUPPORT_VOLUME_STEP | SUPPORT_VOLUME_MUTE | \
SUPPORT_TURN_ON | SUPPORT_TURN_OFF | \
SUPPORT_SELECT_SOURCE | SUPPORT_VOLUME_SET
Expand All @@ -49,6 +53,7 @@
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Optional(CONF_HOST): cv.string,
vol.Optional(CONF_NAME): cv.string,
vol.Optional(CONF_SOUND_MODE, default=DEFAULT_SOUND_MODE): cv.boolean,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is sound mode configurable? Can it not be detected from the device?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the option to disable sound_mode_support for old types receivers that do not have sound modes. As far as I know this can not be detected from the receiver itself. At least their is no direct bolean if sound mode is supported. It might be possible to see it from the absense of the current sound mode if you request it from the receiver.

However I always like to have the option to disable components in case they give problems for certain types/models. Of course I only have my own receiver to test with and that one does support sound_mode. So I cann't really test with a receiver that doesn't support sound mode.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

However I always like to have the option to disable components in case they give problems for certain types/models.

In Home Assistant we aim to represent devices as-is. If we go down the route to disable sound modes, we can start adding config options for everything…

Please remove the config option and base it on detecting support.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am working on it in the denonAVR library of @scarface-4711.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay. This PR can be merged when the config option has been removed and the lib has been updated.

vol.Optional(CONF_SHOW_ALL_SOURCES, default=DEFAULT_SHOW_SOURCES):
cv.boolean,
vol.Optional(CONF_ZONES):
Expand Down Expand Up @@ -84,6 +89,9 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
else:
add_zones = None

# Get config option for sound mode
sound_mode_support = config.get(CONF_SOUND_MODE)

# Start assignment of host and name
new_hosts = []
# 1. option: manual setting
Expand Down Expand Up @@ -117,7 +125,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
show_all_inputs=show_all_sources, timeout=timeout,
add_zones=add_zones)
for new_zone in new_device.zones.values():
receivers.append(DenonDevice(new_zone))
receivers.append(DenonDevice(new_zone,
sound_mode_support))
cache.add(host)
_LOGGER.info("Denon receiver at host %s initialized", host)

Expand All @@ -129,7 +138,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
class DenonDevice(MediaPlayerDevice):
"""Representation of a Denon Media Player Device."""

def __init__(self, receiver):
def __init__(self, receiver, sound_mode_support):
"""Initialize the device."""
self._receiver = receiver
self._name = self._receiver.name
Expand All @@ -147,6 +156,20 @@ def __init__(self, receiver):
self._frequency = self._receiver.frequency
self._station = self._receiver.station

self._sound_mode_support = sound_mode_support
if sound_mode_support:
self._sound_mode = self._receiver.sound_mode
self._sound_mode_raw = self._receiver.sound_mode_raw
self._sound_mode_list = self._receiver.sound_mode_list
else:
self._sound_mode = None
self._sound_mode_raw = None
self._sound_mode_list = None

self._supported_features_base = SUPPORT_DENON
self._supported_features_base |= (sound_mode_support and
SUPPORT_SELECT_SOUND_MODE)

def update(self):
"""Get the latest status information from device."""
self._receiver.update()
Expand All @@ -164,6 +187,9 @@ def update(self):
self._band = self._receiver.band
self._frequency = self._receiver.frequency
self._station = self._receiver.station
if self._sound_mode_support:
self._sound_mode = self._receiver.sound_mode
self._sound_mode_raw = self._receiver.sound_mode_raw

@property
def name(self):
Expand Down Expand Up @@ -197,12 +223,22 @@ def source_list(self):
"""Return a list of available input sources."""
return self._source_list

@property
def sound_mode(self):
"""Return the current matched sound mode."""
return self._sound_mode

@property
def sound_mode_list(self):
"""Return a list of available sound modes."""
return self._sound_mode_list

@property
def supported_features(self):
"""Flag media player features that are supported."""
if self._current_source in self._receiver.netaudio_func_list:
return SUPPORT_DENON | SUPPORT_MEDIA_MODES
return SUPPORT_DENON
return self._supported_features_base | SUPPORT_MEDIA_MODES
return self._supported_features_base

@property
def media_content_id(self):
Expand Down Expand Up @@ -276,6 +312,15 @@ def media_episode(self):
"""Episode of current playing media, TV show only."""
return None

@property
def device_state_attributes(self):
"""Return device specific state attributes."""
attributes = {}
if (self._sound_mode_raw is not None and self._sound_mode_support and
self._power == 'ON'):
attributes[ATTR_SOUND_MODE_RAW] = self._sound_mode_raw
return attributes

def media_play_pause(self):
"""Simulate play pause media player."""
return self._receiver.toggle_play_pause()
Expand All @@ -292,6 +337,10 @@ def select_source(self, source):
"""Select input source."""
return self._receiver.set_input_func(source)

def select_sound_mode(self, sound_mode):
"""Select sound mode."""
return self._receiver.set_sound_mode(sound_mode)

def turn_on(self):
"""Turn on media player."""
if self._receiver.power_on():
Expand Down