mirror of
https://github.com/home-assistant/core.git
synced 2025-07-18 10:47:10 +00:00
Add source selection to Samsung TV media player (#22612)
* add source selection * return generic list * remove useless timeout * Fix test * Add test for select_source * Add negative source test * Change order * Arghhh * Add hass object * Simplify source list Co-Authored-By: escoand <escoand@users.noreply.github.com>
This commit is contained in:
parent
1460f7bd80
commit
73008885c8
@ -10,8 +10,9 @@ from homeassistant.components.media_player import (
|
|||||||
MediaPlayerDevice, PLATFORM_SCHEMA)
|
MediaPlayerDevice, PLATFORM_SCHEMA)
|
||||||
from homeassistant.components.media_player.const import (
|
from homeassistant.components.media_player.const import (
|
||||||
MEDIA_TYPE_CHANNEL, SUPPORT_NEXT_TRACK, SUPPORT_PAUSE,
|
MEDIA_TYPE_CHANNEL, SUPPORT_NEXT_TRACK, SUPPORT_PAUSE,
|
||||||
SUPPORT_PLAY, SUPPORT_PLAY_MEDIA, SUPPORT_PREVIOUS_TRACK, SUPPORT_TURN_OFF,
|
SUPPORT_PLAY, SUPPORT_PLAY_MEDIA, SUPPORT_PREVIOUS_TRACK,
|
||||||
SUPPORT_TURN_ON, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_STEP)
|
SUPPORT_SELECT_SOURCE, SUPPORT_TURN_OFF, SUPPORT_TURN_ON,
|
||||||
|
SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_STEP)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_HOST, CONF_MAC, CONF_NAME, CONF_PORT, CONF_TIMEOUT, STATE_OFF,
|
CONF_HOST, CONF_MAC, CONF_NAME, CONF_PORT, CONF_TIMEOUT, STATE_OFF,
|
||||||
STATE_ON)
|
STATE_ON)
|
||||||
@ -26,9 +27,13 @@ DEFAULT_TIMEOUT = 1
|
|||||||
|
|
||||||
KEY_PRESS_TIMEOUT = 1.2
|
KEY_PRESS_TIMEOUT = 1.2
|
||||||
KNOWN_DEVICES_KEY = 'samsungtv_known_devices'
|
KNOWN_DEVICES_KEY = 'samsungtv_known_devices'
|
||||||
|
SOURCES = {
|
||||||
|
'TV': 'KEY_DTV',
|
||||||
|
'HDMI': 'KEY_HDMI'
|
||||||
|
}
|
||||||
|
|
||||||
SUPPORT_SAMSUNGTV = SUPPORT_PAUSE | SUPPORT_VOLUME_STEP | \
|
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
|
SUPPORT_NEXT_TRACK | SUPPORT_TURN_OFF | SUPPORT_PLAY | SUPPORT_PLAY_MEDIA
|
||||||
|
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
@ -187,6 +192,11 @@ class SamsungTVDevice(MediaPlayerDevice):
|
|||||||
"""Boolean if volume is currently muted."""
|
"""Boolean if volume is currently muted."""
|
||||||
return self._muted
|
return self._muted
|
||||||
|
|
||||||
|
@property
|
||||||
|
def source_list(self):
|
||||||
|
"""List of available input sources."""
|
||||||
|
return list(SOURCES)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def supported_features(self):
|
def supported_features(self):
|
||||||
"""Flag media player features that are supported."""
|
"""Flag media player features that are supported."""
|
||||||
@ -262,6 +272,7 @@ class SamsungTVDevice(MediaPlayerDevice):
|
|||||||
for digit in media_id:
|
for digit in media_id:
|
||||||
await self.hass.async_add_job(self.send_key, 'KEY_' + digit)
|
await self.hass.async_add_job(self.send_key, 'KEY_' + digit)
|
||||||
await asyncio.sleep(KEY_PRESS_TIMEOUT, self.hass.loop)
|
await asyncio.sleep(KEY_PRESS_TIMEOUT, self.hass.loop)
|
||||||
|
await self.hass.async_add_job(self.send_key, 'KEY_ENTER')
|
||||||
|
|
||||||
def turn_on(self):
|
def turn_on(self):
|
||||||
"""Turn the media player on."""
|
"""Turn the media player on."""
|
||||||
@ -269,3 +280,11 @@ class SamsungTVDevice(MediaPlayerDevice):
|
|||||||
self._wol.send_magic_packet(self._mac)
|
self._wol.send_magic_packet(self._mac)
|
||||||
else:
|
else:
|
||||||
self.send_key('KEY_POWERON')
|
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])
|
||||||
|
@ -318,7 +318,7 @@ async def test_play_media(hass, samsung_mock):
|
|||||||
device.send_key = mock.Mock()
|
device.send_key = mock.Mock()
|
||||||
await device.async_play_media(MEDIA_TYPE_CHANNEL, "576")
|
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 device.send_key.call_args_list == exp
|
||||||
assert len(sleeps) == 3
|
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()
|
device.send_key = mock.Mock()
|
||||||
await device.async_play_media(MEDIA_TYPE_CHANNEL, "-4")
|
await device.async_play_media(MEDIA_TYPE_CHANNEL, "-4")
|
||||||
assert device.send_key.call_count == 0
|
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user