Sommario:

Aggiungi il controllo Alexa personalizzato al progetto Raspberry Pi: 5 passaggi
Aggiungi il controllo Alexa personalizzato al progetto Raspberry Pi: 5 passaggi

Video: Aggiungi il controllo Alexa personalizzato al progetto Raspberry Pi: 5 passaggi

Video: Aggiungi il controllo Alexa personalizzato al progetto Raspberry Pi: 5 passaggi
Video: Building Alexa Skills for Home Automation with Raspberry Pi 2024, Luglio
Anonim
Aggiungi il controllo Alexa personalizzato al progetto Raspberry Pi
Aggiungi il controllo Alexa personalizzato al progetto Raspberry Pi

Questo progetto è destinato a chiunque abbia un progetto Raspberry Pi che utilizza Python e che desidera aggiungere il controllo vocale tramite i propri dispositivi Amazon Echo esistenti. Non è necessario essere un programmatore esperto, ma dovresti essere a tuo agio nell'usare la riga di comando e nell'adattare il codice esistente alle tue esigenze.

Inizialmente ho avviato un progetto per consentire al mio Raspberry Pi di essere controllato dalla voce con Alexa in modo che potesse riscaldare l'acqua in un bollitore a una temperatura specifica. Sebbene l'interazione che volevo fosse abbastanza semplice (passare un numero da Alexa al Raspberry Pi), ci è voluto molto lavoro per arrivare a quello stato dai tutorial esistenti. Spero che questo tutorial renda questo processo il più veloce possibile per gli altri.

Nel mio esempio, inizio con un Raspberry Pi Zero W con Raspbian. Ho un programma Python3 sul mio Pi che è in grado di scrivere testo su un display SPI e ho una sonda termometro che posso leggere. Per te, questo programma potrebbe essere quasi qualsiasi cosa, ma l'idea è che potresti avere alcuni dispositivi di input che desideri leggere tramite Alexa e/o alcuni dispositivi di output che desideri controllare tramite Alexa.

L'obiettivo è passare da un programma base come quello descritto sopra a un dispositivo che puoi controllare facilmente con il mio Echo. Supponendo che tu abbia già questo hardware, questo progetto non dovrebbe costarti denaro. Alla fine, arriverai al punto in cui puoi dire cose come:

Io: "Alexa, chiedi al mio gadget di controllare la temperatura sul sensore 1."

La risposta di Alexa: "La sonda legge 72,31 gradi".

o

Io: "Alexa, dì al mio gadget di scrivere George Washington"

Risposta: il display collegato al mio Raspberry Pi ora legge "George Washington"

Nella prossima sezione, descriverò cosa deve succedere dietro le quinte per farlo funzionare. Se vuoi solo farlo funzionare sul tuo progetto e non ti interessa come funziona, sentiti libero di saltarlo (anche se potrebbe renderlo più difficile se qualcosa va storto).

Passaggio 1: sfondo

Sfondo
Sfondo

In questa immagine (credit: https://developer.amazon.com/en-US/docs/alexa/alex… possiamo vedere l'architettura generale per Alexa Gadgets.

Quando dici qualcosa al tuo dispositivo Echo, invia l'audio ad Alexa Cloud, dove viene elaborato e dove viene generata una risposta per risponderti. Quando chiedi che tempo fa, sono solo questi due in comunicazione. Supponiamo ora di voler aggiungere il controllo vocale a uno dei tuoi piccoli progetti su un Raspberry Pi. L'elaborazione di tutto a bordo richiederebbe hardware significativo e una base di codice molto sofisticata per far funzionare le cose. Una soluzione migliore sarebbe sfruttare Alexa Cloud, che è molto sofisticato ed è diventato molto bravo a gestire schemi vocali complessi. Alexa Gadgets ti offre un buon modo per farlo.

Un Alexa Gadget comunica con un dispositivo Echo tramite bluetooth. Una volta stabilita questa connessione, i due si scambiano messaggi utilizzando la codifica UTF-8. Quando l'eco passa qualcosa al gadget, si chiama direttiva. L'altra direzione è indicata come un evento. Prima di entrare nel flusso esatto di tutto questo, dovremmo introdurre un altro elemento chiave: le abilità Alexa personalizzate.

Alexa consente agli sviluppatori di creare le proprie competenze personalizzate, che consentono loro di progettare le proprie interazioni e comportamenti da utilizzare su tutti i dispositivi Echo. Ad esempio, uno sviluppatore potrebbe creare un'abilità personalizzata per indicare la distanza tra due aeroporti negli Stati Uniti. Un utente direbbe: "Alexa, chiedi al mio calcolatore di distanza personalizzato qual è la distanza tra LAX e JFK" e potrebbe rispondere con "2475 miglia". Come lo fa? Quando uno sviluppatore crea un'abilità personalizzata, definisce i cosiddetti "intenti personalizzati" con "espressioni campione" contenenti "slot". Ad esempio, in questa abilità potrei avere l'intento "calc_dist" di calcolare la distanza tra due punti. Un'espressione di esempio sarebbe "qual è la distanza tra {slot1} e {slot2}" o "quanto dista tra {slot1} e {slot2}". Gli slot mostrati tra parentesi hanno tipi specifici. In questo caso quei tipi sarebbero codici aeroportuali come LAX, JFK, BOS, ATL. Quando un utente richiede l'abilità personalizzata, Alexa Cloud cerca di abbinare ciò che l'utente dice a un intento personalizzato utilizzando le espressioni di esempio fornite e cerca di trovare valori di slot validi per quella richiesta. In questo esempio, troverebbe che l'utente voleva l'intento "calc_dist" e che lo slot1 è LAX e lo slot2 è JFK. A questo punto, Alexa Cloud passa il lavoro al codice dello sviluppatore. Fondamentalmente, dice al codice degli sviluppatori quale intento ha ricevuto e quali erano tutti i valori degli slot, tra gli altri dettagli.

Lo sviluppatore può decidere dove risiede il proprio codice, ma un'opzione molto popolare è quella di utilizzare una funzione AWS Lambda. Se non sai cosa sia, è essenzialmente un servizio che ti consente di caricare codice che può essere eseguito in qualsiasi momento e quindi ti addebita solo per la quantità di tempo in cui il tuo codice viene eseguito. Se continuiamo con il nostro esempio, il codice dello sviluppatore potrebbe essere una funzione Python che riceve i due codici aeroportuali, cerca le loro posizioni, calcola le distanze e quindi invia una risposta all'Alexa Cloud per dire qualcosa all'utente. L'Alexa Cloud invierebbe quindi le informazioni vocali al dispositivo dell'utente e otterrebbe la risposta.

Ora possiamo tornare al gadget. Possiamo creare competenze personalizzate progettate per funzionare specificamente con i gadget. Uno sviluppatore può scrivere un'abilità che invia una direttiva a un gadget connesso. Tale direttiva ha un payload che può essere utilizzato in qualsiasi modo sia necessario per il gadget. Tale abilità può anche inviare una direttiva e quindi ascoltare un evento dal gadget in modo che il codice dell'abilità possa avere accesso alle informazioni inviate dal gadget.

Stabilire questo flusso consente di creare uno strumento molto potente perché i gadget economici possono avere la capacità di comunicare con il codice nel cloud e di rispondere ai comandi vocali utilizzando alcuni dei migliori sistemi di riconoscimento vocale disponibili.

Va notato che la maggior parte delle abilità consente vari modi di interagire con esse. Ad esempio, un utente potrebbe saltare direttamente a un intento dicendo "Alexa, chiedi al mio calcolatore di distanza personalizzato qual è la distanza tra LAX e JFK" (chiamato invocazione one-shot) o potrebbe semplicemente usare un intento di lancio: "Alexa, apri il mio calcolatore di distanza personalizzato". Quest'ultimo esempio sarebbe in genere seguito da Alexa che risponde con una richiesta di ulteriori informazioni. Questo tutorial omette intenzionalmente il supporto per quest'ultimo. Più specificamente, senza modificare la funzione Lambda, puoi solo invocare l'abilità utilizzando un'invocazione one-shot. Questa scelta di design consente al modello di essere più semplice (non deve supportare intenti di lancio o flusso di conversazione) e ho scoperto che di solito desidero interagire con i miei gadget utilizzando comunque invocazioni one-shot poiché di solito sono più veloci.

Passaggio 2: registra il gadget sulla Console per gli sviluppatori del servizio vocale Alexa

Di seguito è riportata una descrizione dei passaggi necessari. Ho creato un video equivalente che mostra come eseguire tutti questi passaggi. Puoi utilizzare uno o entrambi per completare questo passaggio.

  1. Vai a
  2. Se non hai già un account gratuito, creane uno
  3. Clicca su "Prodotti"
  4. Compila le etichette e seleziona "Alexa Gadget"
  5. Compila quello che vuoi per il resto dei campi
  6. Fare clic su Fine

Fase 3: creare la funzione AWS Lambda e l'abilità personalizzata

Crea abilità personalizzate sulla Console per gli sviluppatori di Alexa Skills Kit

Il codice per questo tutorial può essere trovato qui

Prima di completare questo passaggio, dovrai creare un file.zip che contenga il pacchetto di distribuzione per la funzione AWS Lambda come mostrato nel tutorial qui.

  1. Scarica la cartella "lambda" dal mio Github che contiene "lambda_function.py" e "requirements.txt"
  2. Apri il terminale e cambia la directory corrente in modo che si trovi all'interno di questa cartella.
  3. Eseguire la seguente sequenza:

pip install -r requisiti.txt -t skill_env

cp lambda_function.py skill_env cd skill_env zip -r../../skill-code.zip

Il tuo file.zip si troverà ora nella directory in cui si trovava la cartella lambda e si chiamerà "skill-code.zip".

Una nota sul costo dell'hosting su AWS: questo tutorial richiede che tu disponga di un account AWS (creazione gratuita). Le funzioni Lambda costano denaro, tuttavia, il loro prezzo attuale nella regione della Virginia del Nord è di $ 0,000000208 per 100 ms di utilizzo con 128 MB di memoria. Per riferimento, ogni invocazione della mia abilità fattura circa 800 ms di utilizzo a questo livello. Per accumulare una fattura di $ 1,00 USD, dovresti invocare questa funzione circa 600.000 volte che (se ti occorrono 5 secondi per invocazione) ti porterebbero oltre 34 giorni di chiamata continua alla tua funzione. Il costo non dovrebbe essere un problema significativo a meno che non pubblichi la tua abilità e un numero enorme di persone inizi a utilizzarla. Se sei preoccupato di ricevere fatture su AWS, prendi in considerazione l'impostazione di allarmi di utilizzo che ti avvisino se l'utilizzo supera una soglia definita.

Di seguito è riportata una descrizione dei passaggi necessari. Ho creato un video equivalente che mostra come eseguire tutti questi passaggi. Puoi utilizzare uno o entrambi per completare questo passaggio.

  1. Vai su https://aws.amazon.com/ e accedi alla console o crea un account gratuito se non ne hai uno
  2. Cerca e fai clic su Lambda in servizi
  3. Fare clic su "Crea funzione"
  4. Seleziona "Autore da zero", assegnagli un nome e scegli l'ultima versione di Python 3 per il runtime
  5. Cambia "codice di modifica in linea" in "carica un file.zip" e seleziona il file.zip creato sopra
  6. In una nuova finestra, vai su https://developer.amazon.com/alexa/console/ask e accedi
  7. Fare clic su "Crea abilità"
  8. Etichettalo, scegli il modello "Personalizzato" e "Fornisci il tuo" e fai clic su "Crea abilità"
  9. Fai clic su "Inizia da zero" e fai clic su "Scegli"
  10. In "Intenzioni", fai clic su "Aggiungi"
  11. Crea un intento personalizzato chiamato "alexa_to_pi" e inserisci "write {person}" come espressione di esempio
  12. Crea uno slot intento chiamato "persona" con il tipo "AMAZON. Person"
  13. Crea un intento personalizzato chiamato "pi_to_alexa" e compila "controlla la temperatura dal sensore {sensor_num}
  14. Crea uno slot di intent chiamato "sensor_num" con il tipo "AMAZON. NUMBER"
  15. In Interfacce, attiva "Controller interfaccia personalizzata"
  16. In Endpoint, seleziona "AWS Lambda ARN" e copia "Your Skill ID"
  17. Torna alla Console AWS
  18. Fare clic su "Aggiungi attivatore"
  19. Seleziona "Alexa Skills Kit", seleziona "Abilita" sotto la verifica dell'ID abilità, incolla l'ID abilità appena copiato e fai clic su aggiungi
  20. Copia l'ARN Lambda nell'angolo in alto a destra
  21. Torna alla Console per gli sviluppatori di Alexa e incolla l'ARN Lambda nel campo "Regione predefinita"
  22. In Invocazione, imposta il nome di attivazione dell'abilità su "il mio gadget"
  23. Fare clic su "Salva modello" e quindi su "Crea modello"
  24. Fai clic su "Test" nelle schede in alto e cambia il selettore da "Off" a "Sviluppo"
  25. Tieni presente che i log per la funzione Lambda si trovano nel servizio "CloudWatch" su AWS.

Passaggio 4: imposta il codice sul tuo Raspberry Pi

Affinché il tuo Raspberry Pi possa comunicare con il dispositivo Alexa, ha bisogno di un codice per facilitare il passaggio delle informazioni tramite Bluetooth e il mantenimento di tale connessione, oltre ad alcuni altri file. Il modo più semplice per iniziare con i file più aggiornati di Amazon è clonare il loro repository Raspberry Pi Gadgets. Vai alla directory del tuo progetto attuale ed esegui

git clone

Questo caricherà il loro intero repository con tutto il codice necessario sul tuo Pi. Ha alcuni progetti di esempio che mostrano alcune delle capacità di Alexa Gadgets. Se desideri maggiori informazioni, consulta il readme sulla loro pagina Github.

Esegui la loro funzione di configurazione per ottenere tutto configurato.

cd /home/pi/Alexa-Gadgets-Raspberry-Pi-Campioni

sudo python3 launch.py --setup

Segui le istruzioni e rispondi "y" quando ti viene chiesto se desideri configurare utilizzando le credenziali del tuo gadget. Richiama l'ID Amazon e il segreto del gadget dalla configurazione del tuo gadget sulla console degli sviluppatori poiché verrà richiesto qui. Ho scelto la modalità di trasmissione "bt" per il mio Raspberry Pi Zero W. BLE non è supportato da tutti i vecchi dispositivi Echo, ma puoi cercare di cosa è capace il tuo hardware. Se stai utilizzando il tuo Pi in modalità desktop, Amazon consiglia di fare clic con il pulsante destro del mouse sull'icona bluetooth in alto a destra e fare clic su "Rimuovi "Bluetooth" dal pannello" per evitare problemi di connettività.

Nota: questo passaggio potrebbe richiedere del tempo a seconda di quanto deve essere installato.

Ora avrai tutti i file di supporto necessari per tornare al tuo progetto e iniziare ad aggiungere le funzioni per consentire la comunicazione con il tuo Echo.

Se lo desideri, puoi eliminare la cartella "esempi" in "Alexa-Gadgets-Raspberry-Pi-Samples/src"

Puoi avere il codice del tuo progetto dove preferisci, ma creerò una cartella nella home directory per questo, in alternativa puoi scaricare la cartella con il codice dal mio Github, assicurati di modificare i file.ini come descritto di seguito.

cd /home/pi

mkdir mio_progetto cd mio_progetto touch mio_gadget.py touch mio_gadget.ini

Ora ho creato due file in una cartella chiamata "my_project". Il file.ini è importante. Assicurati che contenga quanto segue e sostituisci nel tuo ID Amazon e nel segreto del gadget:

[Impostazioni gadget]

amazonId = INSERT_AMAZON_ID_HERE alexaGadgetSecret = INSERT_ALEXA_GADGET_SECRET_HERE [GadgetCapabilities] Custom. MyGadget = 1.0

Ora, diamo un'occhiata al file python prima di entrare nei dettagli:

import json

da agt import AlexaGadget

classe MyGadget (AlexaGadget):

def _init_(self):

super()._init_()

def on_custom_mygadget_alexatopi(self, direttiva):

payload = json.loads(directive.payload.decode("utf-8")) print("Dati ricevuti: " + str(payload)) write_text(str(payload['data']['person']['value ']))

def on_custom_mygadget_pitoalexa(self, direttiva):

payload = json.loads(directive.payload.decode("utf-8")) print("Dati ricevuti: " + str(payload)) payload = {'data': "La sonda legge " + str(get_temp(payload) ['data'] ['sensor_num']['value'])) + " gradi."} self.send_custom_event('Custom. MyGadget', 'PiToAlexa', payload) MyGadget().main()

Per prima cosa noterai che chiama due funzioni: write_text() e get_temp(). Nel mio codice, definisco queste funzioni nello stesso file, ma dipendono dal mio hardware, quindi ho scelto di ometterle. Ho allegato questo file con quelle funzioni definite per stampare e restituire solo dati fittizi nel caso in cui si desideri eseguire questo codice esatto. Suggerirei di testare con questo codice esatto prima di modificarlo per funzionare con il progetto. Ho anche allegato il file.ini, ma assicurati di entrare e modificare l'ID e il segreto del gadget. La funzione superiore riceve i dati trasmessi da Alexa. La funzione inferiore riceve i dati nello stesso formato, ma il dispositivo Alexa attenderà cinque secondi prima che un evento venga restituito con il proprio payload. Questo payload è speciale in quanto il dispositivo Alexa parlerà dei suoi contenuti.

Una volta che hai questi file, vai alla cartella "my_project" ed esegui il file python.

sudo reboot

cd /home/pi/mio_progetto sudo python3./mio_gadget.py

Se è la prima volta che esegui il programma, dovrai associarlo al tuo dispositivo Echo. Assicurati che il tuo dispositivo Echo sia vicino al Raspberry Pi, poiché dobbiamo consentire una connessione Bluetooth.

Nell'App Alexa sul tuo dispositivo mobile, fai clic su "dispositivi" nell'angolo in basso a destra.

Fai clic su "Echo & Alexa" in alto a sinistra.

Fai clic sul tuo dispositivo Echo.

In "WIRELESS", tocca "Dispositivi Bluetooth".

Tocca "ACCOPPIA UN NUOVO DISPOSITIVO" e dovresti vedere il tuo gadget nell'elenco.

Tocca il tuo gadget. Dovresti vedere il rapporto Pi che è stato accoppiato con successo.

Mentre guardi l'output sul tuo Pi, prova a dare un comando vocale all'Echo:

Tu: "Alexa, chiedi al mio gadget di controllare la temperatura dal sensore uno"

Se tutto ha funzionato correttamente, dovresti sentire:

Echo: "La sonda legge 120,505 gradi."

Tu: "Alexa, dì al mio gadget di scrivere George Washington."

Il Pi dovrebbe stampare:

Dati ricevuti: {'data': {'person': {'name': 'person', 'value': 'George Washington', 'confirmationStatus': 'NESSUNO'}}}

George Washington"

Passaggio 5: concludere

Il video mostrato qui è un esempio del gadget che funziona con la lettura della temperatura (la stessa sonda in F vs. C) e la scrittura di nomi su un semplice display.

Ora che si spera che qualcosa funzioni, dovresti provare a personalizzarlo per rendere il tuo progetto più capace. Ricorda che puoi facilmente modificare gli intenti nella Console per gli sviluppatori di Alexa e che tutti gli slot che utilizzi verranno passati al tuo Pi nel payload. Inoltre, puoi chiedere ad Alexa di dire tutto ciò che desideri semplicemente modificando il payload che passi indietro nel caso dal tuo codice Raspberry Pi.

Tieni presente che questo tutorial non intende essere la soluzione finale per tutte le funzionalità che potresti desiderare con un Alexa Gadget. È intenzionalmente limitato a darti due semplici funzioni per il passaggio di dati in ogni direzione tra Alexa e un gadget. Se sei interessato a costruire modelli di interazione più sofisticati, ti incoraggio a leggere tutti i file readme in https://github.com/alexa/Alexa-Gadgets-Raspberry-P… e a provare tutti gli esempi che forniscono. Ti suggerirei anche di leggere la documentazione per Alexa Gadgets Toolkit e Alexa Skills Kit.

Consigliato: