Add button support to Alexa (#60163)

This commit is contained in:
Franck Nijhof 2021-11-23 17:19:13 +01:00 committed by GitHub
parent e3910856ad
commit 7a0ff4e2e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 2 deletions

View File

@ -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."""

View File

@ -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,

View File

@ -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
)