From da8a47614282129428e386253ad233f7071d5ced Mon Sep 17 00:00:00 2001 From: ochlocracy <5885236+ochlocracy@users.noreply.github.com> Date: Fri, 25 Oct 2019 16:34:52 -0400 Subject: [PATCH] Add support for supportedOperations to Alexa.PlaybackController (#28212) * Added support for supportedOperations to Alexa.PlaybackController * Added support for supportedOperations to Alexa.PlaybackController --- .../components/alexa/capabilities.py | 32 +++++++++++++++++++ tests/components/alexa/test_smart_home.py | 9 +++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/alexa/capabilities.py b/homeassistant/components/alexa/capabilities.py index deb83813dbc..56a18f1d521 100644 --- a/homeassistant/components/alexa/capabilities.py +++ b/homeassistant/components/alexa/capabilities.py @@ -17,6 +17,7 @@ from homeassistant.const import ( STATE_UNKNOWN, ) import homeassistant.components.climate.const as climate +import homeassistant.components.media_player.const as media_player from homeassistant.components.alarm_control_panel import ATTR_CODE_FORMAT, FORMAT_NUMBER from homeassistant.components import light, fan, cover import homeassistant.util.color as color_util @@ -110,6 +111,11 @@ class AlexaCapability: """Return the Configuration object.""" return [] + @staticmethod + def supported_operations(): + """Return the supportedOperations object.""" + return [] + def serialize_discovery(self): """Serialize according to the Discovery API.""" result = {"type": "AlexaInterface", "interface": self.name(), "version": "3"} @@ -150,6 +156,10 @@ class AlexaCapability: if instance is not None: result["instance"] = instance + supported_operations = self.supported_operations() + if supported_operations: + result["supportedOperations"] = supported_operations + return result def serialize_properties(self): @@ -484,6 +494,28 @@ class AlexaPlaybackController(AlexaCapability): """Return the Alexa API name of this interface.""" return "Alexa.PlaybackController" + def supported_operations(self): + """Return the supportedOperations object. + + Supported Operations: FastForward, Next, Pause, Play, Previous, Rewind, StartOver, Stop + """ + supported_features = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0) + + operations = { + media_player.SUPPORT_NEXT_TRACK: "Next", + media_player.SUPPORT_PAUSE: "Pause", + media_player.SUPPORT_PLAY: "Play", + media_player.SUPPORT_PREVIOUS_TRACK: "Previous", + media_player.SUPPORT_STOP: "Stop", + } + + supported_operations = [] + for operation in operations: + if operation & supported_features: + supported_operations.append(operations[operation]) + + return supported_operations + class AlexaInputController(AlexaCapability): """Implements Alexa.InputController. diff --git a/tests/components/alexa/test_smart_home.py b/tests/components/alexa/test_smart_home.py index 1de7d404ef6..177d52e83de 100644 --- a/tests/components/alexa/test_smart_home.py +++ b/tests/components/alexa/test_smart_home.py @@ -726,7 +726,7 @@ async def test_media_player(hass): assert appliance["displayCategories"][0] == "TV" assert appliance["friendlyName"] == "Test media player" - assert_endpoint_capabilities( + capabilities = assert_endpoint_capabilities( appliance, "Alexa.InputController", "Alexa.PowerController", @@ -737,6 +737,13 @@ async def test_media_player(hass): "Alexa.ChannelController", ) + playback_capability = get_capability(capabilities, "Alexa.PlaybackController") + assert playback_capability is not None + supported_operations = playback_capability["supportedOperations"] + operations = ["Play", "Pause", "Stop", "Next", "Previous"] + for operation in operations: + assert operation in supported_operations + await assert_power_controller_works( "media_player#test", "media_player.turn_on", "media_player.turn_off", hass )