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:
E successivamente cliccare Crea token ed inserire come nome: 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
Dare un nome a piacere, selezionare Smart Home e cliccare Create skill
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.
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à.
Nella nuova pagina che si apre, selezionate Ruoli e poi Crea ruolo
Nella nuova pagina selezionare Servizio AWS, poi Lambda e cliccare Successivo: Autorizzazioni
Nella 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!
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:
Copiamo 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
Nella 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:
Se 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.
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…
Anche io ho lo stesso identico problema… Cosa sbagliamo?
Ciao,
Affinché il tutto funzionasse nel mio caso ho dovuto (credo che sia necessario):
1) configurare l’inoltro delle porte sul router, crea quindi un port forwarding dalla 443 (wan) alla 8123 (lan) instradata sull’indirizzo di home assistant.
2 sostituire 8123 con 443 nel passaggio riportato nella presente guida poco prima del test dove cita:
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
Ciao, per il punto 1…Con che router lo hai fatto?
Io ho un FritzBox ma non riesco in alcun modo a impostare il forward da 443 a 8123…
C’é un altro modo o puoi indicarmi come l’hai fatto sul tuo?
ciao se hai il fritz, probabilmente hai già la porta 443 occupata per i suoi servizi. imposta i servizi del fritz su altra porta libera diversa dalla 443 di default
Ciao, non sono riuscito a completare le istruzioni forse perchè a distanza di un anno probabilmente hanno cambiato qualche cosa nella pagina …. dopo aver copiato e salvato il codice “lambda_function.py” poi non riesco a proseguire dato che non trovo il tasto “Distribuisci” e non vedo neppure le “variabili ambiente ” da modificare , puoi aiutarmi?