From bb2191b2b0aced006e1d3a9ab0a81964f01b04a1 Mon Sep 17 00:00:00 2001 From: Dave Finlay Date: Wed, 3 Jan 2018 10:25:16 -0800 Subject: [PATCH] Add support for the renaming of Yamaha Receiver Zones via configuration file. Added a test to cover the change, plus previously untested options. (#11402) --- .../components/media_player/yamaha.py | 15 +++++--- tests/components/media_player/test_yamaha.py | 35 +++++++++++++++++++ 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/media_player/yamaha.py b/homeassistant/components/media_player/yamaha.py index 861e75ac144..10f7adccae0 100644 --- a/homeassistant/components/media_player/yamaha.py +++ b/homeassistant/components/media_player/yamaha.py @@ -27,6 +27,7 @@ SUPPORT_YAMAHA = SUPPORT_VOLUME_SET | SUPPORT_VOLUME_MUTE | \ CONF_SOURCE_NAMES = 'source_names' CONF_SOURCE_IGNORE = 'source_ignore' +CONF_ZONE_NAMES = 'zone_names' CONF_ZONE_IGNORE = 'zone_ignore' DEFAULT_NAME = 'Yamaha Receiver' @@ -40,6 +41,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_ZONE_IGNORE, default=[]): vol.All(cv.ensure_list, [cv.string]), vol.Optional(CONF_SOURCE_NAMES, default={}): {cv.string: cv.string}, + vol.Optional(CONF_ZONE_NAMES, default={}): {cv.string: cv.string}, }) @@ -57,6 +59,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): source_ignore = config.get(CONF_SOURCE_IGNORE) source_names = config.get(CONF_SOURCE_NAMES) zone_ignore = config.get(CONF_ZONE_IGNORE) + zone_names = config.get(CONF_ZONE_NAMES) if discovery_info is not None: name = discovery_info.get('name') @@ -84,14 +87,16 @@ def setup_platform(hass, config, add_devices, discovery_info=None): if receiver.zone not in zone_ignore: hass.data[KNOWN].add(receiver.ctrl_url) add_devices([ - YamahaDevice(name, receiver, source_ignore, source_names) + YamahaDevice(name, receiver, source_ignore, + source_names, zone_names) ], True) class YamahaDevice(MediaPlayerDevice): """Representation of a Yamaha device.""" - def __init__(self, name, receiver, source_ignore, source_names): + def __init__(self, name, receiver, source_ignore, + source_names, zone_names): """Initialize the Yamaha Receiver.""" self._receiver = receiver self._muted = False @@ -101,6 +106,7 @@ class YamahaDevice(MediaPlayerDevice): self._source_list = None self._source_ignore = source_ignore or [] self._source_names = source_names or {} + self._zone_names = zone_names or {} self._reverse_mapping = None self._playback_support = None self._is_playback_supported = False @@ -148,9 +154,10 @@ class YamahaDevice(MediaPlayerDevice): def name(self): """Return the name of the device.""" name = self._name - if self._zone != "Main_Zone": + zone_name = self._zone_names.get(self._zone, self._zone) + if zone_name != "Main_Zone": # Zone will be one of Main_Zone, Zone_2, Zone_3 - name += " " + self._zone.replace('_', ' ') + name += " " + zone_name.replace('_', ' ') return name @property diff --git a/tests/components/media_player/test_yamaha.py b/tests/components/media_player/test_yamaha.py index ad443fadebb..176cf7c5bf2 100644 --- a/tests/components/media_player/test_yamaha.py +++ b/tests/components/media_player/test_yamaha.py @@ -4,6 +4,15 @@ import xml.etree.ElementTree as ET import rxv +import homeassistant.components.media_player.yamaha as yamaha + +TEST_CONFIG = { + 'name': "Test Receiver", + 'source_ignore': ['HDMI5'], + 'source_names': {'HDMI1': 'Laserdisc'}, + 'zone_names': {'Main_Zone': "Laser Dome"} +} + def sample_content(name): """Read content into a string from a file.""" @@ -12,6 +21,14 @@ def sample_content(name): return content.read() +def yamaha_player(receiver): + """Create a YamahaDevice from a given receiver, presumably a Mock.""" + zone_controller = receiver.zone_controllers()[0] + player = yamaha.YamahaDevice(receiver=zone_controller, **TEST_CONFIG) + player.build_source_list() + return player + + class FakeYamaha(rxv.rxv.RXV): """Fake Yamaha receiver. @@ -74,6 +91,7 @@ class TestYamaha(unittest.TestCase): """Setup things to be run when tests are started.""" super(TestYamaha, self).setUp() self.rec = FakeYamaha("http://10.0.0.0:80/YamahaRemoteControl/ctrl") + self.player = yamaha_player(self.rec) def test_get_playback_support(self): """Test the playback.""" @@ -92,3 +110,20 @@ class TestYamaha(unittest.TestCase): self.assertTrue(support.stop) self.assertFalse(support.skip_f) self.assertFalse(support.skip_r) + + def test_configuration_options(self): + """Test configuration options.""" + rec_name = TEST_CONFIG['name'] + src_zone = 'Main_Zone' + src_zone_alt = src_zone.replace('_', ' ') + renamed_zone = TEST_CONFIG['zone_names'][src_zone] + ignored_src = TEST_CONFIG['source_ignore'][0] + renamed_src = 'HDMI1' + new_src = TEST_CONFIG['source_names'][renamed_src] + self.assertFalse(self.player.name == rec_name + ' ' + src_zone) + self.assertFalse(self.player.name == rec_name + ' ' + src_zone_alt) + self.assertTrue(self.player.name == rec_name + ' ' + renamed_zone) + + self.assertFalse(ignored_src in self.player.source_list) + self.assertFalse(renamed_src in self.player.source_list) + self.assertTrue(new_src in self.player.source_list)