-
-
Notifications
You must be signed in to change notification settings - Fork 38.2k
Add sound mode support #14910
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add sound mode support #14910
Changes from 2 commits
8280a19
5430c5f
81ca56b
7d2d249
554884c
4368e31
6a7454c
c93701b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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) | ||
|
|
@@ -24,15 +25,19 @@ | |
|
|
||
| _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_SOUND_MODE_DICT = 'sound_mode_dict' | ||
| 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 | ||
|
|
@@ -49,6 +54,8 @@ | |
| 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, | ||
| vol.Optional(CONF_SOUND_MODE_DICT): vol.Schema({str: list}), | ||
| vol.Optional(CONF_SHOW_ALL_SOURCES, default=DEFAULT_SHOW_SOURCES): | ||
| cv.boolean, | ||
| vol.Optional(CONF_ZONES): | ||
|
|
@@ -84,6 +91,10 @@ 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) | ||
| sound_mode_dict = config.get(CONF_SOUND_MODE_DICT) | ||
|
|
||
| # Start assignment of host and name | ||
| new_hosts = [] | ||
| # 1. option: manual setting | ||
|
|
@@ -117,7 +128,9 @@ 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, | ||
| sound_mode_dict)) | ||
| cache.add(host) | ||
| _LOGGER.info("Denon receiver at host %s initialized", host) | ||
|
|
||
|
|
@@ -129,7 +142,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, sound_mode_dict): | ||
| """Initialize the device.""" | ||
| self._receiver = receiver | ||
| self._name = self._receiver.name | ||
|
|
@@ -147,6 +160,24 @@ 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 | ||
| if sound_mode_dict is None: | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we can fetch it from the device, we should not allow it to be configured. Integrations should only represent the raw information that we receive from the device.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @balloob the sound_mode_dict can not be fetched from the device (receiver) itself, the denonavr library contains an default sound_mode_dict that is hard coded in the denonavr library. However that dictionary is based upon the data of about 10 diffrent models of denon receivers (from which the information xml files are available in the denonavr git repositry, but their could potentially be other values available for newer or very old receivers.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think that we should not include this config option because it will not motivate people to update the dictionary upstream for old and new receivers, resulting in all users having to collect the same information. |
||
| self._sound_mode_list = self._receiver.sound_mode_list | ||
| else: | ||
| self._receiver.set_sound_mode_dict(sound_mode_dict) | ||
| self._sound_mode_list = list(sound_mode_dict) | ||
| 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() | ||
|
|
@@ -164,6 +195,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): | ||
|
|
@@ -197,12 +231,27 @@ 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_raw(self): | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This isn't used. |
||
| """Return the current raw sound mode.""" | ||
| return self._sound_mode_raw | ||
|
|
||
| @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): | ||
|
|
@@ -276,6 +325,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'): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. visually indented line with same indent as next logical line |
||
| attributes[ATTR_SOUND_MODE_RAW] = self._sound_mode_raw | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. indentation is not a multiple of four |
||
| return attributes | ||
|
|
||
| def media_play_pause(self): | ||
| """Simulate play pause media player.""" | ||
| return self._receiver.toggle_play_pause() | ||
|
|
@@ -292,6 +350,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(): | ||
|
|
||
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.