Alexa y Home Assistantant. Integra tus dispositivos sin nube

El proceso para la integración de Alexa en nuestro Home Assistant es bastante tedioso y largo pero no complidado si se siguen los pasos correctamente. Podéis encontrar la documentación oficial aquí.

Este método, de manera similar al realizado para integrar Google Home en Home Assistant y que puedes encontrar aquí, permiten la integración si necesidad de utilizar nabucasa.

Para poder utilizar los dispositivos de Home Assistant con Alexa hay dos opciones:

  1. Controlarlos únicamente desde nuestra red local (es decir desde dentro de nuestra casa)
  2. Controlarlos desde dentro o fuera de nuestra red local.

En este articulo vas a aprender la segunda opción pero es muy importante tener claro lo siguiente:

  • Tenéis que tener vuestro Home Assistant con una cuenta de Duckdns u otro servidor DDNS.
  • Tenéis que poder acceder perfectamente con Duckdns y certificado SSL a vuestro Home Assistant de la siguiente forma: https://TU_DOMINIO.duckdns.org
  • Tenéis que configurar base_url de vuestro Home Assistant como el punto anterior.
  • El puerto 443 tiene que estar mapeado al 8123 (sobra decirlo si teneis instalado correctamente Duckdns)
  • Podéis hacerlo con nginx proxy manager en lugar de tener instalado el add on Duckdns. El proceso sería exactamente igual. De esta forma solo deberéis tener abierto el puerto 443. El puerto 80 sería opcional para entrar por http.

Podéis encontrar la explicación de todo este proceso en el siguiente vídeo que podéis encontrar en mi canal y que aconsejo os suscribáis si os gusta el contenido.

En primer lugar lo que teneis que hacer es crearos una cuenta en la web de desarrolladores de amazón si no estais registrados. Debeis completar una serie de datos que os solicita como elegir un nombre y una contraseña, y poner una dirección de correo electrónico.

También necesitaremos tener una cuenta en el Centro de desarrolladores de AWS. Si no tenéis cuenta debéis crear una como en el paso anterior. En la parte superior derecha de la pantalla hay que pulsar sobre Crear una cuenta de AWS y rellenar un formulario con vuestros datos.

Recomiendo tener las 2 webs abiertas para poder trabajar fácilmente e ir de una a otra.

Creación de un Rol

Una vez creadas la cuentas e identificarnos, empezaremos a trabajar en la web Centro desarrolladores de AWS. En la consola de administración tendremos que buscar IAM. Hay un buscador para facilitarnos encontrarlo. Pulsando sobre IAM nos abrirá una ventana con un menú a la izquierda. Aquí tendremos que seleccionar Roles. Podremos leer que son los Roles y una pequeña información. A nosotros lo que nos interesa es la opción Crear un Rol que encontramos abajo, al final de la página. En la nueva ventana tendremos que dejar seleccionado Servicio de AWS y elegir Lambda un poco más abajo. En la parte inferior derecha pulsaremos sobre Siguiente: Servicios.

En la nueva página que se nos abre podemos filtrar políticas. En el buscador escribiremos lo siguiente: AWSLambdaBasicExecutionRole y marcamos la pequeña casilla situada a su izquierda. Pulsamos en Siguiente: Etiquetas en la parte inferior derecha de la pantalla. En la nueva ventana que se nos abre no tenemos que hacer nada y pulsamos en Siguiente: Revisar.

En Nombre de Rol* ponemos el nombre que más nos guste. Lo demás lo dejamos como está y pulsamos sobre Crear un Rol. Y con esto hemos acabado la primera parte.

La segunda parte es ir a Alexa developer console. Aquí lo primero que haremos será pulsar en Create Skill. En la ventana que se nos abre elegiremos un nombre de la Skill, el lenguaje y seleccionamos la opción Smart Home. Pulsaremos en la parte superior derecha de la página en Create Skill.

Regresamos al Centro de desarrolladores de AWS y en el menú superior izquierdo pulsamos sobre Servicios. En el buscador de servicios escribimos Lambda y lo seleccionamos.

En la nueva página que se nos abre es muy importante elegir el país en el menú superior derecho. Tendremos que seleccionar Europa (Irlanda) eu-west-1 (solo en el caso de vivir en España). Si no hacéis esto, este articulo no os servirá de nada porque no os va a funcionar.

Aclarado este primer paso, pulsamos sobre Crear una función. En la nueva página seleccionamos Crear una función desde cero y le damos un nombre a la función.

  • En el desplegable tiempo de ejecución seleccionamos Python 3.8.
  • En el desplegable Seleccionar o crear un rol de ejecución seleccionamos uso de un rol existente y elegiremos el rol creado anteriormente. Solo os debe aparecer uno si es la primera vez que realizáis este proceso.
  • Hacemos click en Crear una función.
  • En la nueva ventana que se nos abre pulsaremos sobre añadir desencadenador. En el desplegable elegimos Alexa smart home.
  • En ID de la aplicación tendremos que ir a la web de alexa developer console (web de desarrolladores de amazon) y copiar y pegar Your skill ID.
  • Terminamos presionando sobre el botón Agregar.
  • Seleccionamos nuestra función. Un poco más abajo tenemos un menú en el cual tenemos que ir a la primera opción: Código. Tendremos que borrar unas líneas de código que nos aparece y copiar y pegar el siguiente código (sacado de la web oficial de Home Asistant)
"""
Copyright 2019 Jason Hu <awaregit at gmail.com>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
import os
import json
import logging
import urllib3

_debug = bool(os.environ.get('DEBUG'))

_logger = logging.getLogger('HomeAssistant-SmartHome')
_logger.setLevel(logging.DEBUG if _debug else logging.INFO)


def lambda_handler(event, context):
    """Handle incoming Alexa directive."""
    
    _logger.debug('Event: %s', event)

    base_url = os.environ.get('BASE_URL')
    assert base_url is not None, 'Please set BASE_URL environment variable'

    directive = event.get('directive')
    assert directive is not None, 'Malformatted request - missing directive'
    assert directive.get('header', {}).get('payloadVersion') == '3', \
        'Only support payloadVersion == 3'
    
    scope = directive.get('endpoint', {}).get('scope')
    if scope is None:
        # token is in grantee for Linking directive 
        scope = directive.get('payload', {}).get('grantee')
    if scope is None:
        # token is in payload for Discovery directive 
        scope = directive.get('payload', {}).get('scope')
    assert scope is not None, 'Malformatted request - missing endpoint.scope'
    assert scope.get('type') == 'BearerToken', 'Only support BearerToken'

    token = scope.get('token')
    if token is None and _debug:
        token = os.environ.get('LONG_LIVED_ACCESS_TOKEN')  # only for debug purpose
    
    verify_ssl = not bool(os.environ.get('NOT_VERIFY_SSL'))
    
    http = urllib3.PoolManager(
        cert_reqs='CERT_REQUIRED' if verify_ssl else 'CERT_NONE',
        timeout=urllib3.Timeout(connect=2.0, read=10.0)
    )
    
    response = http.request(
        'POST', 
        '{}/api/alexa/smart_home'.format(base_url),
        headers={
            'Authorization': 'Bearer {}'.format(token),
            'Content-Type': 'application/json',
        },
        body=json.dumps(event).encode('utf-8'),
    )
    if response.status >= 400:
        return {
            'event': {
                'payload': {
                    'type': 'INVALID_AUTHORIZATION_CREDENTIAL' 
                            if response.status in (401, 403) else 'INTERNAL_ERROR',
                    'message': response.data.decode("utf-8"),
                }
            }
        }
    return json.loads(response.data.decode('utf-8'))
  • En el menú elegimos esta vez Configuración y en las opciones de la izquierda del nuevo menú que se nos abre elegimos Variables de entorno. Seleccionamos editar y tenemos que añadir 4 variables:
    1. BASE_URL: Nuestro dominio duckdns sin el puerto: https://mi_dominio.duckdns.org
    2. NOT_VERIFY_SSL: false
    3. DEBUG: false
    4. LONG_LIVED_ACCESS_TOKEN: Token de larga duración

Para sacar el token de larga duración nos vamos a nuestro Home Assistant y pulsamos en nuestro usuario. Aquí seleccionamos Crear token de larga duración, le damos un nombre, lo copiamos y lo pegamos en el paso anterior.

  • Pulsamos en la opción guardar.

Regresamos a nuestro Home Assistant y el configuration.yaml tendremos que añadir el siguiente código:

alexa:
  smart_home:

Reiniciamos Home Assistant.

Test de la función Lambda

Regresamos a la web del centro de desarrolladores AWS. En el menú seleccionamos código y en las opciones de la ventana de código fuente, en el desplegable Test elegimos Configure test event. Aquí seleccionamos Crear un evento de prueba nuevo, eliminamos el código de ejemplo, copiamos y pegamos el siguiente código y guardamos:

{
  "directive": {
    "header": {
      "namespace": "Alexa.Discovery",
      "name": "Discover",
      "payloadVersion": "3",
      "messageId": "1bd5d003-31b9-476f-ad03-71d471922820"
    },
    "payload": {
      "scope": {
        "type": "BearerToken"
      }
    }
  }
}

Pulsamos sobre la opción Test y si todo salido correctamente nos descubrirá los dispositivos de nuestro Home Assistant.

Configurar Endpoint Home Smart Service

Regresamos a la Consola de desarrolladores de Amazon y en el campo Default endpoint copiamos y pegamos el arn de la consola de desarrolladores de AWS (boton situado en la parte superior de la página que pone Copia ARN). Pulsamos en Save para guardar los cambios.

Account Linking

Al final de la página tendremos que pulsar en Setup Account Linking y rellenar los siguientes campos en la página que se nos abre:

  • Authorization URI: https://TU_DOMINIO.duckdns.org/auth/authorize
  • Access Token URI: https://TU_DOMINIO.duckdns.org/auth/token
  • Your Client ID: https://layla.amazon.com/ (solo si es para Europa)
  • Client Secret: Lo que queramos ya que Home Assistant no utiliza esta opción.
  • Your Authentication Scheme: Selecionamos Credentials in request body
  • Scope: Pulsamos en + Add Scope y escribimos smart_home

Pulsamos en save para guardar los cambios y en el menú de a izquierda seleccionamos la opción Permissions. Aquí activamos la opción Send Alexa Events.

Configuración en la app de Alexa en el móvil

La configuración se puede hacer tanto en el móvil como en el ordenador en la web de Alexa. Yo recomiendo hacerlo en el móvil.

  • Abrimos la aplicación de Alexa
  • Seleccionamos Más en el menú de la parte inferior.
  • Seleccionamos Skills y juegos
  • Pulsamos sobre Mis Skills en el menú superior y elegimos Desarrollador.
  • Nos aparecerá la Skill que hemos creado y un aviso de que Es necesario vincular con una cuenta.
  • Pulsamos sobre la Skill, nos autentificamos con nuestro usuario y contraseña de Amazon y empezará a encontrar todos nuestros dispositivos de Home Assistant.

Y con esto ya habremos acabado y podremos controlar todos nuestros dispositivos de Home Assistant con Alexa. Podéis consultar más opciones de configuración el la web oficial de Home Assistant.

Espero que os haya resultado útil.

Nos vemos en el siguiente Post, nos vemos en TECNOSANVARAS.

Un saludo a todos y …

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *