diff --git a/homeassistant/components/alexa/entities.py b/homeassistant/components/alexa/entities.py index d74f9329812..2f7f6dc996b 100644 --- a/homeassistant/components/alexa/entities.py +++ b/homeassistant/components/alexa/entities.py @@ -9,6 +9,7 @@ from homeassistant.components import ( alert, automation, binary_sensor, + button, camera, cover, fan, @@ -424,6 +425,22 @@ class SwitchCapabilities(AlexaEntity): ] +@ENTITY_ADAPTERS.register(button.DOMAIN) +class ButtonCapabilities(AlexaEntity): + """Class to represent Button capabilities.""" + + def default_display_categories(self): + """Return the display categories for this entity.""" + return [DisplayCategory.ACTIVITY_TRIGGER] + + def interfaces(self): + """Yield the supported interfaces.""" + return [ + AlexaSceneController(self.entity, supports_deactivation=False), + Alexa(self.hass), + ] + + @ENTITY_ADAPTERS.register(climate.DOMAIN) class ClimateCapabilities(AlexaEntity): """Class to represent Climate capabilities.""" diff --git a/homeassistant/components/alexa/handlers.py b/homeassistant/components/alexa/handlers.py index edf900bb18f..edd510f7844 100644 --- a/homeassistant/components/alexa/handlers.py +++ b/homeassistant/components/alexa/handlers.py @@ -4,6 +4,7 @@ import math from homeassistant import core as ha from homeassistant.components import ( + button, camera, cover, fan, @@ -313,9 +314,13 @@ async def async_api_activate(hass, config, directive, context): entity = directive.entity domain = entity.domain + service = SERVICE_TURN_ON + if domain == button.DOMAIN: + service = button.SERVICE_PRESS + await hass.services.async_call( domain, - SERVICE_TURN_ON, + service, {ATTR_ENTITY_ID: entity.entity_id}, blocking=False, context=context, diff --git a/tests/components/alexa/test_smart_home.py b/tests/components/alexa/test_smart_home.py index 99d43816050..12708c9b55a 100644 --- a/tests/components/alexa/test_smart_home.py +++ b/tests/components/alexa/test_smart_home.py @@ -25,7 +25,7 @@ from homeassistant.components.media_player.const import ( ) import homeassistant.components.vacuum as vacuum from homeassistant.config import async_process_ha_core_config -from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT +from homeassistant.const import STATE_UNKNOWN, TEMP_CELSIUS, TEMP_FAHRENHEIT from homeassistant.core import Context from homeassistant.helpers import entityfilter from homeassistant.setup import async_setup_component @@ -3937,3 +3937,23 @@ async def test_initialize_camera_stream(hass, mock_camera, mock_stream): "https://mycamerastream.test/api/camera_proxy/camera.demo_camera?token=" in response["payload"]["imageUri"] ) + + +async def test_button(hass): + """Test button discovery.""" + device = ("button.ring_doorbell", STATE_UNKNOWN, {"friendly_name": "Ring Doorbell"}) + appliance = await discovery_test(device, hass) + + assert appliance["endpointId"] == "button#ring_doorbell" + assert appliance["displayCategories"][0] == "ACTIVITY_TRIGGER" + assert appliance["friendlyName"] == "Ring Doorbell" + + capabilities = assert_endpoint_capabilities( + appliance, "Alexa.SceneController", "Alexa" + ) + scene_capability = get_capability(capabilities, "Alexa.SceneController") + assert scene_capability["supportsDeactivation"] is False + + await assert_scene_controller_works( + "button#ring_doorbell", "button.press", False, hass + )