From 7116c7404a1bb3114a4bd1a002dea0445de5ae52 Mon Sep 17 00:00:00 2001 From: ochlocracy <5885236+ochlocracy@users.noreply.github.com> Date: Wed, 29 Jan 2020 12:03:20 -0500 Subject: [PATCH] Add PowerController to covers in Alexa (#31265) * Add PowerController to covers. * Comment Fix. * Update test device_class. * Update Comment. --- homeassistant/components/alexa/entities.py | 1 + homeassistant/components/alexa/handlers.py | 8 +++- tests/components/alexa/test_smart_home.py | 56 ++++++++++++++++++++-- 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/alexa/entities.py b/homeassistant/components/alexa/entities.py index 6b831986192..254cec44553 100644 --- a/homeassistant/components/alexa/entities.py +++ b/homeassistant/components/alexa/entities.py @@ -400,6 +400,7 @@ class CoverCapabilities(AlexaEntity): def interfaces(self): """Yield the supported interfaces.""" + yield AlexaPowerController(self.entity) supported = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0) if supported & cover.SUPPORT_SET_POSITION: yield AlexaRangeController( diff --git a/homeassistant/components/alexa/handlers.py b/homeassistant/components/alexa/handlers.py index 77e3c7f7d38..a834a18fbf3 100644 --- a/homeassistant/components/alexa/handlers.py +++ b/homeassistant/components/alexa/handlers.py @@ -119,7 +119,9 @@ async def async_api_turn_on(hass, config, directive, context): domain = ha.DOMAIN service = SERVICE_TURN_ON - if domain == media_player.DOMAIN: + if domain == cover.DOMAIN: + service = cover.SERVICE_OPEN_COVER + elif domain == media_player.DOMAIN: supported = entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0) power_features = media_player.SUPPORT_TURN_ON | media_player.SUPPORT_TURN_OFF if not supported & power_features: @@ -145,7 +147,9 @@ async def async_api_turn_off(hass, config, directive, context): domain = ha.DOMAIN service = SERVICE_TURN_OFF - if domain == media_player.DOMAIN: + if entity.domain == cover.DOMAIN: + service = cover.SERVICE_CLOSE_COVER + elif domain == media_player.DOMAIN: supported = entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0) power_features = media_player.SUPPORT_TURN_ON | media_player.SUPPORT_TURN_OFF if not supported & power_features: diff --git a/tests/components/alexa/test_smart_home.py b/tests/components/alexa/test_smart_home.py index 3d1e2b58d89..8ba3b3ab7ff 100644 --- a/tests/components/alexa/test_smart_home.py +++ b/tests/components/alexa/test_smart_home.py @@ -131,7 +131,7 @@ async def discovery_test(device, hass, expected_endpoints=1): def get_capability(capabilities, capability_name, instance=None): """Search a set of capabilities for a specific one.""" for capability in capabilities: - if instance and capability["instance"] == instance: + if instance and capability.get("instance") == instance: return capability if not instance and capability["interface"] == capability_name: return capability @@ -1452,7 +1452,11 @@ async def test_cover_position_range(hass): assert appliance["friendlyName"] == "Test cover range" capabilities = assert_endpoint_capabilities( - appliance, "Alexa.RangeController", "Alexa.EndpointHealth", "Alexa" + appliance, + "Alexa.PowerController", + "Alexa.RangeController", + "Alexa.EndpointHealth", + "Alexa", ) range_capability = get_capability(capabilities, "Alexa.RangeController") @@ -2515,6 +2519,36 @@ async def test_mode_unsupported_domain(hass): assert msg["payload"]["type"] == "INVALID_DIRECTIVE" +async def test_cover(hass): + """Test garage cover discovery and powerController.""" + device = ( + "cover.test", + "off", + { + "friendly_name": "Test cover", + "supported_features": 3, + "device_class": "garage", + }, + ) + appliance = await discovery_test(device, hass) + + assert appliance["endpointId"] == "cover#test" + assert appliance["displayCategories"][0] == "GARAGE_DOOR" + assert appliance["friendlyName"] == "Test cover" + + assert_endpoint_capabilities( + appliance, + "Alexa.ModeController", + "Alexa.PowerController", + "Alexa.EndpointHealth", + "Alexa", + ) + + await assert_power_controller_works( + "cover#test", "cover.open_cover", "cover.close_cover", hass + ) + + async def test_cover_position_mode(hass): """Test cover discovery and position using modeController.""" device = ( @@ -2533,7 +2567,11 @@ async def test_cover_position_mode(hass): assert appliance["friendlyName"] == "Test cover mode" capabilities = assert_endpoint_capabilities( - appliance, "Alexa", "Alexa.ModeController", "Alexa.EndpointHealth" + appliance, + "Alexa.PowerController", + "Alexa.ModeController", + "Alexa.EndpointHealth", + "Alexa", ) mode_capability = get_capability(capabilities, "Alexa.ModeController") @@ -2752,7 +2790,11 @@ async def test_cover_tilt_position_range(hass): assert appliance["friendlyName"] == "Test cover tilt range" capabilities = assert_endpoint_capabilities( - appliance, "Alexa.RangeController", "Alexa.EndpointHealth", "Alexa" + appliance, + "Alexa.PowerController", + "Alexa.RangeController", + "Alexa.EndpointHealth", + "Alexa", ) range_capability = get_capability(capabilities, "Alexa.RangeController") @@ -2868,7 +2910,11 @@ async def test_cover_semantics_position_and_tilt(hass): assert appliance["friendlyName"] == "Test cover semantics" capabilities = assert_endpoint_capabilities( - appliance, "Alexa.RangeController", "Alexa.EndpointHealth", "Alexa" + appliance, + "Alexa.PowerController", + "Alexa.RangeController", + "Alexa.EndpointHealth", + "Alexa", ) # Assert for Position Semantics