"""Support for alexa Smart Home Skill API.""" import logging import homeassistant.core as ha from .const import API_DIRECTIVE, API_HEADER from .errors import AlexaError, AlexaBridgeUnreachableError from .handlers import HANDLERS from .messages import AlexaDirective _LOGGER = logging.getLogger(__name__) EVENT_ALEXA_SMART_HOME = "alexa_smart_home" async def async_handle_message(hass, config, request, context=None, enabled=True): """Handle incoming API messages. If enabled is False, the response to all messagess will be a BRIDGE_UNREACHABLE error. This can be used if the API has been disabled in configuration. """ assert request[API_DIRECTIVE][API_HEADER]["payloadVersion"] == "3" if context is None: context = ha.Context() directive = AlexaDirective(request) try: if not enabled: raise AlexaBridgeUnreachableError( "Alexa API not enabled in Home Assistant configuration" ) if directive.has_endpoint: directive.load_entity(hass, config) funct_ref = HANDLERS.get((directive.namespace, directive.name)) if funct_ref: response = await funct_ref(hass, config, directive, context) if directive.has_endpoint: response.merge_context_properties(directive.endpoint) else: _LOGGER.warning( "Unsupported API request %s/%s", directive.namespace, directive.name ) response = directive.error() except AlexaError as err: response = directive.error( error_type=err.error_type, error_message=err.error_message ) request_info = {"namespace": directive.namespace, "name": directive.name} if directive.has_endpoint: request_info["entity_id"] = directive.entity_id hass.bus.async_fire( EVENT_ALEXA_SMART_HOME, { "request": request_info, "response": {"namespace": response.namespace, "name": response.name}, }, context=context, ) return response.serialize()