Home Guide Integrate Alexa su Home Assistant tramite hasska (agg. 01/2021)

Integrate Alexa su Home Assistant tramite hasska (agg. 01/2021)

2595
3
copertina

QUESTA GUIDA E’ UN AGGIORNAMENTO DELLA VERSIONE PRECEDENTE CHE POTRETE VISIONARE QUI: https://www.domoticadiy.it/2020/03/integrate-alexa-su-home-assistant-tramite-hasska/

Esistono 2 modi per integrare Amazon Alexa su Home Assistant:

  • a pagamento (5 euro al mese) tramite il servizio Nabu Casa;
  • gratis, tramite un servizio chiamato haaska

In questa guida andremo ovviamente a spiegare tutti i passaggi da effettuare per ottenere il servizio gratis. Armatevi di pazienza perchè la guida sarà lunghetta!

REQUISITI

Per poter procedere correttamente all’implementazione di Alexa su Home Assistant, è necessario che abbiate attivato l’ HTTPS. Se non lo avete ancora fatto, seguite prima questa guida. Inoltre sarà necessario caricare diversi file sul Raspberry, è quindi consigliabile abilitare il servizio SAMBA sul Raspberry, oppure procurarvi un programma FTP come Filezilla.

INTEGRAZIONE SU HOME ASSISTANT

Per prima cosa apriamo il nostro file di configurazione configuration.yaml presente nella directory d’installazione di Home Assistant e aggiungiamo le seguenti stringhe:

api:

e ancora:

alexa:
  smart_home:

Salviamo e riavviamo Home Assistant da interfaccia grafica oppure con il comando SSH:

sudo reboot

 

GENERAZIONE TOKEN DI LUNGA VITA

Entriamo ora in Home Assistant e creiamoci un token di lunga vita (10 anni): cliccate sul vostro nome dal menu di sinitra:

profilo-ha

E successivamente cliccare Crea token ed inserire come nome: haaska

token-lunga-vita-haaska

Verrà generata una stringa. Copiatevela da parte in un blocco note, ci servirà più avanti.

 

ALEXA DEVELOPER CONSOLE

Apriamo una nuova finestra del browser e colleghiamoci a https://developer.amazon.com/alexa/console/ask con le stesse credenzioni del nostro amazon.it

Clicchiamo su Create skill

create-skillDare un nome a piacere, selezionare Smart Home e cliccare Create skill

create-skill-2

Nella nuova pagina lasciare spuntato v3 nel Payload version e appuntarsi da parte Your Skill ID. Mantenere aperta la finestra perchè ci servirà più avanti.

create-skill-3

AMAZON WEB SERVICE (AWS)

Aprire una nuova finestra del browser e collegarsi al sito: https://console.aws.amazon.com/console/home e registrarsi.

Nota bene: vi verrà richiesto di inserire i dati della vostra carta di credito per procedere. Potete tranquillamente farlo in quanto serve ad Amazon per addebitarvi eventuali costi se sforate il limite di chiamate del servizio. Siccome il servizio è usato esclusivamente da voi, è impossibile sforare tale limite. Questa opzione è stata pensata per addebitare i costi delle chiamate AWS nel caso steste creando un’applicazione commerciale distribuita a centinaia/migliaia di utenti dove sicuramente il limite sarebbe raggiunto. Quindi, essendo una vostra app personale, potete stare sereni!

Una volta loggati, selezionate il menu Servizi in alto e cercate il servizio IAM sotto Sicurezza, identità, conformità.

aws-1

Nella nuova pagina che si apre, selezionate Ruoli e poi Crea ruolo

aws-2

Nella nuova pagina selezionare Servizio AWS, poi Lambda e cliccare Successivo: Autorizzazioni

aws-3Nella pagina che si apre, inserire nell’input di ricerca: AWSLambdaBasicExecutionRole

Selezionare il checkbox e cliccare Successivo: Tag

Ignorare la configurazione della pagina TAG e andare avanti cliccando Verifica.

Nella prossima pagina inserire nel campo Nome ruolo: AWSLambdaBasicExecutionRole-SmartHome e cliccare Crea ruolo

Creato il ruolo, andiamo su https://console.aws.amazon.com/lambda/home, selezioniamo Funzioni dalla colonna di sinistra e clicchiamo Crea funzione, dopo essersi accertati che dal menu in alto a destra sia selezionata la nazione:Irlanda

Nota bene: la selezione Irlanda è importantissima, non selezionate altri paesi!

aws-7

Nella prossima schermata selezionate Crea da zero e compilate i campi:

  • Nome: haaska
  • Runtime: Python 3.8
  • Ruolo: Selezionare un ruolo esistente
  • Ruolo esistente: AWSLambdaBasicExecutionRole-SmartHome

E cliccate Crea funzione

Nella nuova pagina che appare, aggiungete il trigger Alexa Smart Home (se non ci fosse di già):

Nel campo ID applicazione inserite la vostra Skill ID che vi siete appuntati al punto precedente qui.

Tornati alla pagina precedente, scendere a metà circa e trovare la sezione Codice della funzione

Nella colonna di sinistra, all’interno della cartella contenente il nome della vostra funzione, create un file (se non è già presente) di nome lambda_function.py

Selezionatelo e nell’editor di codice a destra copiate ed incollate il codice che potete trovare a questo indirizzo ma che per comodità riporto qui di seguito:

"""
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'))

Cliccate su File->Salva e cliccate successivamente Distribuisci

Ora spostatevi un po’ più in basso nella sezione Variabili di ambiente, cliccate Modifica ed inserite i seguenti campi:

BASE_URL : https://lamiacasa.duckdns.org:8123 (sostituite lamiacasa con il vostro dominio duckdns. IMPORTANTE non inserire il trailing finale “/”: dopo il numero di port per intenderci)
NOT_VERIFY_SSL : True
DEBUG : True
LONG_LIVED_ACCESS_TOKEN : (il vostro token di lunga vita generato in Home Assistant a inizio guida e vi siete segnati su un blocco note)

e salvare.

DEBUG e LONG_LIVED_ACCESS_TOKEN verranno utilizzati ora solo per il debug, una volta verificato l’effettivo funzionamento, potranno essere rimossi come vedremo di seguito.

Sempre in alto a destra della schermata è presente una stringa denominata ARN simile a questa:

arn:aws:lambda:eu-west-1:xxxxxxxxxxxx:function:haaska

Copiatevi la vostra personalizzata in un blocco note perchè servirà più avanti. Lasciate infine aperta anche questa finestra del browser.

Riapriamo la scheda del browser a cui eravamo fermi con questa schermata:

create-skill-3Copiamo quindi nel campo Default endpoint* la stringa ARN segnata in precedenza.

Cliccare quindi su Save

Clicchiamo ora dal menu di sinistra ACCOUNT LINKING e compilare i campi:

  • Authorization URI: https://lamiacasa.duckdns.org:8123/auth/authorize
  • Access Token URI: https://lamiacasa.duckdns.org:8123/auth/token
  • Client ID: https://layla.amazon.com/
  • CLIENT Secret: DOMOTICADIY o qualsiasi valore a vostro piacimento
  • Client Authentication Scheme: Credentials in request body
  • Cliccare su + Add Scope e inserire smart_home

IMPORTANTE: in Client ID non dimenticate il trailing “/” finale come da esempio!

Cliccare su Save

 

TESTIAMO IL TUTTO

Aprire di nuovo la scheda del browser dove avete configurato la funzione lambda e clicchiamo su Configura eventi di test

aws-15Nella finestra che si apre diamo un nome Test e nel campo del codice cancelliamo il testo presente e incolliamo:

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

Clicchiamo su Crea e nella pagina principale clicchiamo su Esegui il test

Se tutto è andato a buon fine dovreste ricevere una schermata sotto il codice, simile a questa:

aws-16Se invece ricevete qualche errore del tipo “HomeAssistant 500 Internal Server Error” è molto probabile che ci sia qualche script/automazione/entità o altro all’interno del vostro Home Assistant che sia incompatibile con Haaska o malconfigurata (caso tipico con i componenti climate). A questo punto è consigliato procedere a step ed includere solo i dispositivi di cui abbiamo veramente bisogno. Possiamo quindi andare a modificare il nostro configuration.yaml in:

alexa:
  smart_home:
    filter: 
      include_domains:
        - switch
        - light
      exclude_domains:
        - automation

Come vedere è stata aggiunta l’opzione filter che permette appunto di filtrare ciò che vogliamo che Alexa possa vedere:

  • include_entities: elenco di ID degli unici device da esporre alla Skill
  • include_domains: elenco dei domini (light, switch, sensors, ecc…) da esporrre alla Skill
  • exclude_entities: elenco di ID degli unici device da NON esporre alla Skill
  • exclude_domains: elenco dei domini (light, switch, sensors, ecc…) da NON esporre alla Skill

Nell’esempio ho escluso tutte le automazioni, e incluso solamente gli interruttori e le luci.

E’ inoltre possibile configurare i nomi di alcune entità in modo da far apparire un “nome amichevole” direttamente da app Alexa durante il discovery dei dispositivi, senza quindi che lo mettiate voi in manuale dentro l’app Alexa.

Come si fa? Aggiugendo l’opzione entity_config sullo stesso livello (indentazione) di filter:

filter:
  ...
# configurazioni opzionali per entità
entity_config:
  switch.pulsante_camera_main:
  name: Pulsante cameretta
  description: Pulsante principale della cameretta

 

ABILITAZIONE DELLA SKILL

Terminato il test, ora possiamo aprire l’app Alexa dal nostro telefono e nella sezione Skill -> Le mie skill -> Skill per Sviluppatori selezionare ed abilitare la vostra Skill appena creata (haaska).

Fatto ciò potete fare Ricerca dispositivi e in 45 secondi appariranno tutte le entità presenti su Home Assistant

SICUREZZA

Verificato che da app Alexa tutte le vostre entità di Home Assistant siano state trovate, possiamo rimuovere il token utilizzato per la fase di test.

Andiamo in: https://eu-west-1.console.aws.amazon.com/lambda/home e selezionate la vostra app.

Torniamo nella sezione Variabili di ambiente e modifichiamo, eliminando i campi DEBUG e LONG_LIVED_ACCESS_TOKEN e salviamo.

3 Commenti

  1. Non mi attiva la Skill !!!
    Seguita tutta la guida, test della funzione perfetto, nel log vedevo le mie entità.
    Quando vado ad attivare la Skill, mi propone l’accesso al mio HA, tutto ok, ma Amazon mi dice: “Al momento non è possibile collegare la Skill” 🙁
    C’è un limite alle skill sviluppatore?
    Altro?
    Mah…