diff --git a/homeassistant/components/samsungtv/media_player.py b/homeassistant/components/samsungtv/media_player.py index 05921d7e84b..6b2235fe7e6 100644 --- a/homeassistant/components/samsungtv/media_player.py +++ b/homeassistant/components/samsungtv/media_player.py @@ -10,8 +10,9 @@ from homeassistant.components.media_player import ( MediaPlayerDevice, PLATFORM_SCHEMA) from homeassistant.components.media_player.const import ( MEDIA_TYPE_CHANNEL, SUPPORT_NEXT_TRACK, SUPPORT_PAUSE, - SUPPORT_PLAY, SUPPORT_PLAY_MEDIA, SUPPORT_PREVIOUS_TRACK, SUPPORT_TURN_OFF, - SUPPORT_TURN_ON, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_STEP) + SUPPORT_PLAY, SUPPORT_PLAY_MEDIA, SUPPORT_PREVIOUS_TRACK, + SUPPORT_SELECT_SOURCE, SUPPORT_TURN_OFF, SUPPORT_TURN_ON, + SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_STEP) from homeassistant.const import ( CONF_HOST, CONF_MAC, CONF_NAME, CONF_PORT, CONF_TIMEOUT, STATE_OFF, STATE_ON) @@ -26,9 +27,13 @@ DEFAULT_TIMEOUT = 1 KEY_PRESS_TIMEOUT = 1.2 KNOWN_DEVICES_KEY = 'samsungtv_known_devices' +SOURCES = { + 'TV': 'KEY_DTV', + 'HDMI': 'KEY_HDMI' +} SUPPORT_SAMSUNGTV = SUPPORT_PAUSE | SUPPORT_VOLUME_STEP | \ - SUPPORT_VOLUME_MUTE | SUPPORT_PREVIOUS_TRACK | \ + SUPPORT_VOLUME_MUTE | SUPPORT_PREVIOUS_TRACK | SUPPORT_SELECT_SOURCE | \ SUPPORT_NEXT_TRACK | SUPPORT_TURN_OFF | SUPPORT_PLAY | SUPPORT_PLAY_MEDIA PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ @@ -187,6 +192,11 @@ class SamsungTVDevice(MediaPlayerDevice): """Boolean if volume is currently muted.""" return self._muted + @property + def source_list(self): + """List of available input sources.""" + return list(SOURCES) + @property def supported_features(self): """Flag media player features that are supported.""" @@ -262,6 +272,7 @@ class SamsungTVDevice(MediaPlayerDevice): for digit in media_id: await self.hass.async_add_job(self.send_key, 'KEY_' + digit) await asyncio.sleep(KEY_PRESS_TIMEOUT, self.hass.loop) + await self.hass.async_add_job(self.send_key, 'KEY_ENTER') def turn_on(self): """Turn the media player on.""" @@ -269,3 +280,11 @@ class SamsungTVDevice(MediaPlayerDevice): self._wol.send_magic_packet(self._mac) else: self.send_key('KEY_POWERON') + + async def async_select_source(self, source): + """Select input source.""" + if source not in SOURCES: + _LOGGER.error('Unsupported source') + return + + await self.hass.async_add_job(self.send_key, SOURCES[source]) diff --git a/tests/components/samsungtv/test_media_player.py b/tests/components/samsungtv/test_media_player.py index b175a722036..b42250e2613 100644 --- a/tests/components/samsungtv/test_media_player.py +++ b/tests/components/samsungtv/test_media_player.py @@ -318,7 +318,7 @@ async def test_play_media(hass, samsung_mock): device.send_key = mock.Mock() await device.async_play_media(MEDIA_TYPE_CHANNEL, "576") - exp = [call("KEY_5"), call("KEY_7"), call("KEY_6")] + exp = [call("KEY_5"), call("KEY_7"), call("KEY_6"), call("KEY_ENTER")] assert device.send_key.call_args_list == exp assert len(sleeps) == 3 @@ -347,3 +347,21 @@ async def test_play_media_channel_as_non_positive(hass, samsung_mock): device.send_key = mock.Mock() await device.async_play_media(MEDIA_TYPE_CHANNEL, "-4") assert device.send_key.call_count == 0 + + +async def test_select_source(hass, samsung_mock): + """Test for select_source.""" + device = SamsungTVDevice(**WORKING_CONFIG) + device.hass = hass + device.send_key = mock.Mock() + await device.async_select_source("HDMI") + exp = [call("KEY_HDMI")] + assert device.send_key.call_args_list == exp + + +async def test_select_source_invalid_source(hass, samsung_mock): + """Test for select_source with invalid source.""" + device = SamsungTVDevice(**WORKING_CONFIG) + device.send_key = mock.Mock() + await device.async_select_source("INVALID") + assert device.send_key.call_count == 0