Indholdsfortegnelse:

Tilføj tilpasset Alexa -kontrol til Raspberry Pi -projekt: 5 trin
Tilføj tilpasset Alexa -kontrol til Raspberry Pi -projekt: 5 trin

Video: Tilføj tilpasset Alexa -kontrol til Raspberry Pi -projekt: 5 trin

Video: Tilføj tilpasset Alexa -kontrol til Raspberry Pi -projekt: 5 trin
Video: Windows Event and Logging Demystified: IT Admin Edition 2024, Juli
Anonim
Tilføj brugerdefineret Alexa -kontrol til Raspberry Pi -projekt
Tilføj brugerdefineret Alexa -kontrol til Raspberry Pi -projekt

Dette projekt er tiltænkt alle, der har et Raspberry Pi -projekt, der bruger Python, der ønsker at tilføje stemmestyring via deres eksisterende Amazon Echo -enheder. Du behøver ikke at være en erfaren programmør, men du skal være tryg ved at bruge kommandolinjen og tilpasse eksisterende kode, så den passer til dine behov.

Jeg startede oprindeligt med et projekt for at gøre min Raspberry Pi stemmestyret med Alexa, så den kunne opvarme vand i en kedel til en bestemt temperatur. Selvom den interaktion, jeg ønskede, var ganske enkel (send et nummer fra Alexa til Raspberry Pi), tog det meget arbejde at komme til den tilstand fra de eksisterende selvstudier. Jeg håber, at denne vejledning vil gøre denne proces så hurtig som muligt for andre.

I mit eksempel starter jeg med en Raspberry Pi Zero W med Raspbian. Jeg har et Python3 -program på min Pi, der er i stand til at skrive tekst til et SPI -display, og jeg har et termometersonde, som jeg kan læse. For dig kan dette program være næsten alt, men tanken er, at du måske har nogle inputenheder, som du vil læse via Alexa og/eller nogle outputenheder, som du vil styre ved hjælp af Alexa.

Målet er at gå fra et grundlæggende program som det ovenfor beskrevne til en enhed, som du nemt kan styre med mit ekko. Forudsat at du allerede har denne hardware, bør dette projekt ikke koste dig nogen penge. I sidste ende kommer du til det punkt, hvor du kan sige ting som:

Mig: "Alexa, spørg min gadget om at kontrollere temperaturen på sensor 1."

Alexas svar: "Sonden læser 72,31 grader."

eller

Mig: "Alexa, fortæl min gadget at skrive George Washington"

Svar: Displayet, der er tilsluttet min Raspberry Pi, læser nu "George Washington"

I det næste afsnit vil jeg beskrive, hvad der skal ske bag kulisserne for at få dette til at fungere. Hvis du bare vil få dette til at fungere på dit projekt og er ligeglad med, hvordan det fungerer, kan du springe det over (selvom det kan gøre det sværere, hvis noget går galt).

Trin 1: Baggrund

Baggrund
Baggrund

I dette billede (kredit: https://developer.amazon.com/en-US/docs/alexa/alex… kan vi se den generelle arkitektur for Alexa Gadgets.

Når du siger noget til din Echo -enhed, sender den lyden til Alexa Cloud, hvor den behandles, og hvor der genereres et svar for at svare på dig. Når du spørger, hvad vejret er, er det bare disse to i kommunikation. Antag nu, at du vil tilføje stemmestyring til et af dine små projekter på en Raspberry Pi. At behandle alt om bord ville kræve betydelig hardware og en meget sofistikeret kodebase for at få gang i tingene. En bedre løsning ville være at udnytte Alexa Cloud, som er meget sofistikeret og er blevet meget god til at håndtere komplekse talemønstre. Alexa Gadgets giver dig en god måde at gøre dette på.

En Alexa Gadget kommunikerer med en Echo -enhed ved hjælp af bluetooth. Når denne forbindelse er etableret, sender de to meddelelser til hinanden ved hjælp af UTF-8-kodning. Når ekkoet sender noget til gadgeten, kaldes det et direktiv. Den anden retning kaldes en begivenhed. Inden vi går ind i den nøjagtige strøm af alt dette, bør vi introducere et andet nøgleelement: brugerdefinerede Alexa Skills.

Alexa giver udviklere mulighed for at skabe deres egne tilpassede færdigheder, som giver dem mulighed for at designe deres egne interaktioner og adfærd til brug på alle Echo -enheder. For eksempel kan en udvikler oprette en brugerdefineret færdighed til at fortælle dig afstanden mellem to lufthavne i USA. En bruger ville sige: "Alexa, spørg min brugerdefinerede afstandsberegner, hvad afstanden er mellem LAX og JFK", og den kunne svare med "2475 miles". Hvordan gør det dette? Når en udvikler laver en tilpasset færdighed, definerer de det, der kaldes "brugerdefinerede hensigter" med "prøveudtalelser", der indeholder "slots". For eksempel kan jeg i denne færdighed have til hensigt "calc_dist" at beregne afstanden mellem to punkter. En prøveudtale ville være "hvad afstanden er mellem {slot1} og {slot2}" eller "hvor langt mellem {slot1} og {slot2}". Slidserne vist i parentes har bestemte typer. I dette tilfælde ville disse typer være lufthavnskoder som LAX, JFK, BOS, ATL. Når en bruger beder om den tilpassede færdighed, prøver Alexa Cloud at matche, hvad brugeren siger til en brugerdefineret hensigt ved hjælp af de medfølgende prøveudtalelser, og forsøger at finde gyldige slotværdier for den anmodning. I dette eksempel ville det opdage, at brugeren ønskede "calc_dist" hensigten, og at slot1 er LAX og slot2 er JFK. På dette tidspunkt videregiver Alexa Cloud arbejdet til udviklerens egen kode. Grundlæggende fortæller den udviklerens kode, hvilken hensigt den modtog, og hvad alle slotværdierne var, blandt andre detaljer.

Udvikleren får bestemme, hvor deres kode bor, men en meget populær mulighed er at bruge en AWS Lambda -funktion. Hvis du ikke ved, hvad det er, er det i det væsentlige en service, der giver dig mulighed for at uploade kode, der kan køres når som helst og derefter kun opkræver dig for den tid, din kode bliver kørt. Hvis vi fortsætter med vores eksempel, kan udviklerens kode være en Python -funktion, der modtager de to lufthavnskoder, slår deres placeringer op, beregner afstandene og derefter sender et svar tilbage til Alexa Cloud for at tale noget til brugeren. Alexa Cloud ville derefter sende denne taleinformation tilbage til brugerens enhed, og de ville få svaret.

Nu kan vi komme tilbage til gadgeten. Vi kan skabe brugerdefinerede færdigheder, der er designet til at arbejde specifikt med gadgets. En udvikler kan skrive en færdighed, der sender et direktiv til en tilsluttet gadget. Dette direktiv har en nyttelast, der kan bruges, men det er nødvendigt af gadgeten. Denne færdighed kan også sende et direktiv og derefter lytte efter en begivenhed fra gadgeten, så færdighedskoden kan have adgang til oplysninger, der sendes fra gadgeten.

Etablering af dette flow giver mulighed for at skabe et meget kraftfuldt værktøj, fordi billige gadgets kan have mulighed for at kommunikere med kode i skyen og reagere på stemmekommandoer ved hjælp af nogle af de bedste tilgængelige stemmegenkendelse.

Det skal bemærkes, at de fleste færdigheder tillader forskellige måder at interagere med dem. For eksempel kan en bruger hoppe direkte ind i en hensigt ved at sige "Alexa, spørg min brugerdefinerede afstandsberegner, hvad afstanden er mellem LAX og JFK" (kaldet en one-shot-påkaldelse), eller de kan simpelthen bruge en lanceringshensigt: "Alexa, åbn min brugerdefinerede afstandsberegner ". Dette sidste eksempel vil typisk blive fulgt af Alexa, der reagerer med en prompt om mere information. Denne vejledning udelader forsætligt støtte til sidstnævnte. Mere specifikt, uden at ændre Lambda-funktionen, kan du kun påberåbe dig færdigheden ved hjælp af et enkelt skud. Dette designvalg gør det muligt for modellen at være mere enkel (behøver ikke at understøtte lanceringshensigter eller samtaleflow), og jeg har fundet ud af, at jeg normalt vil interagere med mine gadgets ved hjælp af one-shot-påkaldelser alligevel, da de normalt er hurtigere.

Trin 2: Registrer gadgeten på Alexa Voice Service Developer Console

Det følgende er en beskrivelse af de nødvendige trin. Jeg har oprettet en tilsvarende video, der viser, hvordan man gør alle disse trin. Du kan bruge enten eller begge dele til at fuldføre dette trin.

  1. Naviger til
  2. Hvis du ikke allerede har en gratis konto, skal du oprette en
  3. Klik på "Produkter"
  4. Udfyld etiketter, og vælg "Alexa Gadget"
  5. Udfyld hvad du vil for resten af felterne
  6. Klik på Udfør

Trin 3: Opret AWS Lambda -funktion og tilpasset færdighed

Opret brugerdefineret færdighed på Alexa Skills Kit Developer Console

Kode til denne vejledning kan findes her

Inden du gennemfører dette trin, skal du oprette en.zip -fil, der indeholder installationspakken til AWS Lambda -funktionen, som vist i selvstudiet her.

  1. Download mappen "lambda" fra min Github, som indeholder "lambda_function.py" og "requirements.txt"
  2. Åbn terminalen, og skift den aktuelle mappe til at være inde i denne mappe.
  3. Kør følgende sekvens:

pip install -r krav.txt -t skill_env

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

Din.zip-fil vil nu blive placeret i biblioteket, hvor lambda-mappen var og vil blive kaldt "skill-code.zip".

En note om omkostningerne ved hosting på AWS: Denne vejledning kræver, at du har en AWS -konto (gratis at oprette). Lambda -funktioner koster dog penge, men deres nuværende prisfastsættelse i N. Virginia -regionen er $ 0.000000208 pr. 100 ms brug med 128 MB hukommelse. Til reference regner hver påkaldelse af mine færdigheder omkring 800 ms brug på dette niveau. For at få en regning på $ 1,00USD skulle du påberåbe dig denne funktion omkring 600.000 gange, hvilket (hvis det tager dig 5 sekunder pr. Påkaldelse) ville tage dig over 34 dages uafbrudt opkald til din funktion. Omkostninger bør ikke være et væsentligt problem, medmindre du offentliggør din færdighed, og et stort antal mennesker begynder at bruge det. Hvis du er bekymret for at få regninger på AWS, kan du overveje at oprette brugsalarmer, der giver dig besked, hvis brugen passerer en defineret tærskel.

Det følgende er en beskrivelse af de nødvendige trin. Jeg har oprettet en tilsvarende video, der viser, hvordan man gør alle disse trin. Du kan bruge enten eller begge til at fuldføre dette trin.

  1. Naviger til https://aws.amazon.com/ og log ind på konsollen, eller opret en gratis konto, hvis du ikke har en
  2. Søg efter og klik på Lambda under tjenester
  3. Klik på "Opret funktion"
  4. Vælg "Forfatter fra bunden", giv det et navn, og vælg den nyeste Python 3 -version til runtime
  5. Skift "rediger kode inline" til "upload en.zip -fil", og vælg.zip -filen, der er oprettet ovenfor
  6. I et nyt vindue skal du navigere til https://developer.amazon.com/alexa/console/ask og logge ind
  7. Klik på "Opret færdighed"
  8. Mærk den, vælg "Brugerdefineret" model og "Tilvejebring din egen" og klik på "Opret færdighed"
  9. Klik på "Start fra bunden" og klik på "Vælg"
  10. Klik på "Tilføj" under "Hensigter"
  11. Opret en tilpasset hensigt kaldet "alexa_to_pi", og udfyld "skriv {person}" som en prøveudtale
  12. Lav en hensigtsplads kaldet "person" med typen "AMAZON. Person"
  13. Opret en tilpasset hensigt kaldet "pi_to_alexa" og udfyld "tjek temperaturen fra sensoren {sensor_num}
  14. Lav en hensigtsplads kaldet "sensor_num" med typen "AMAZON. NUMBER"
  15. Under grænseflader skal du aktivere "Custom Interface Controller"
  16. Under Slutpunkt skal du vælge "AWS Lambda ARN" og kopiere "Dit Skill ID"
  17. Naviger tilbage til AWS -konsollen
  18. Klik på "Tilføj udløser"
  19. Vælg "Alexa Skills Kit", markér "Aktiver" under Bekræftelses -id -verificering, indsæt det Skill -ID, du lige har kopieret, og klik på tilføj
  20. Kopier Lambda ARN i øverste højre hjørne
  21. Naviger tilbage til Alexa Developer Console og indsæt Lambda ARN i feltet "Standardområde"
  22. Under Tilkaldelse skal du indstille navnet på dygtighedskald til at være "min gadget"
  23. Klik på "Gem model" og derefter "Byg model"
  24. Klik på "Test" i de øverste faner, og skift vælgeren fra "Fra" til "Udvikling"
  25. Bemærk, at logfiler for Lambda -funktionen findes i "CloudWatch" -tjenesten på AWS.

Trin 4: Konfigurer koden på din Raspberry Pi

For at din Raspberry Pi kan kommunikere med Alexa -enheden, har den brug for en kode for at lette videregivelse af information via bluetooth og opretholde denne forbindelse, ud over et par andre filer. Den nemmeste måde at komme i gang med de mest opdaterede filer fra Amazon er at klone deres Raspberry Pi Gadgets-depot. Naviger til biblioteket for dit aktuelle projekt og kør

git-klon

Dette indlæser hele deres lager med al den nødvendige kode på din Pi. Det har nogle eksempler på projekter, der viser nogle af funktionerne i Alexa Gadgets. Hvis du vil have mere information, kan du se readme på deres Github -side.

Kør deres opsætningsfunktion for at få alt konfigureret.

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

sudo python3 launch.py -opsætning

Følg vejledningen, og svar "y", når du bliver spurgt, om du vil konfigurere ved hjælp af din Gadget -legitimationsoplysninger. Husk Amazon ID og Gadget Secret fra at konfigurere din gadget på udviklerkonsollen, da det bliver spurgt her. Jeg valgte "bt" transmissionstilstand til min Raspberry Pi Zero W. BLE understøttes ikke af alle ældre Echo -enheder, men du kan slå op, hvad din hardware er i stand til. Hvis du bruger din Pi i Desktop-tilstand, anbefaler Amazon at højreklikke på bluetooth-ikonet øverst til højre og klikke på "Fjern" Bluetooth "fra panel" for at undgå forbindelsesproblemer.

Bemærk: dette trin kan tage et stykke tid, afhængigt af hvor meget der skal installeres.

Nu har du alle de nødvendige supportfiler til at gå tilbage til dit projekt og begynde at tilføje funktionerne for at tillade kommunikation med dit ekko.

Hvis du vælger, kan du slette mappen "eksempler" i "Alexa-Gadgets-Raspberry-Pi-Samples/src"

Du kan have din projektkode, hvor du vil, men jeg laver en mappe i hjemmemappen til den, alternativt kan du downloade mappen med koden fra min Github, bare sørg for at redigere.ini -filerne som beskrevet nedenfor.

cd /home /pi

mkdir my_project cd my_project touch my_gadget.py touch my_gadget.ini

Jeg har nu oprettet to filer i en mappe kaldet "mit_projekt".. Ini -filen er vigtig. Sørg for, at det indeholder følgende og erstat i dit Amazon -id og gadgethemmelighed:

[GadgetSettings]

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

Lad os nu se på python -filen, før vi går ind i detaljerne:

import json

fra agt import AlexaGadget

klasse MyGadget (AlexaGadget):

def _init _ (selv):

super ()._ init _ ()

def on_custom_mygadget_alexatopi (selv, direktiv):

nyttelast = json.loads (directive.payload.decode ("utf-8")) print ("Modtagne data:" + str (nyttelast)) skrive_tekst (str (nyttelast ['data'] ['person'] ['værdi ']))

def on_custom_mygadget_pitoalexa (selv, direktiv):

nyttelast = json.loads (directive.payload.decode ("utf-8")) print ("Modtagne data:" + str (nyttelast)) nyttelast = {'data': "Sonden læser" + str (get_temp (nyttelast) ['data'] ['sensor_num'] ['værdi'])) + "grader."} self.send_custom_event ('Custom. MyGadget', 'PiToAlexa', nyttelast) MyGadget (). main ()

Først vil du bemærke, at den kalder to funktioner: write_text () og get_temp (). I min kode definerer jeg disse funktioner i den samme fil, men de er afhængige af min hardware, så jeg har valgt at udelade dem. Jeg har vedhæftet denne fil med de funktioner, der er defineret til bare at udskrive og returnere dummy -data, hvis du vil køre denne nøjagtige kode. Jeg vil foreslå at teste med denne nøjagtige kode, før du ændrer den til at fungere med dit projekt. Jeg har også vedhæftet.ini -filen, men sørg for at gå ind og ændre ID og gadgethemmelighed. Topfunktionen modtager data videregivet fra Alexa. Bundfunktionen modtager data i samme format, men Alexa -enheden venter i fem sekunder på, at en begivenhed sendes tilbage med sin egen nyttelast. Denne nyttelast er speciel ved, at Alexa -enheden taler dens indhold.

Når du har disse filer, skal du navigere til "my_project" -mappen og køre python -filen.

sudo genstart

cd/home/pi/my_project sudo python3./my_gadget.py

Hvis det er første gang, du kører programmet, skal du parre det med din Echo -enhed. Sørg for, at din Echo -enhed er i nærheden af Raspberry Pi, da vi skal muliggøre en bluetooth -forbindelse.

Klik på "enheder" i nederste højre hjørne i Alexa -appen på din mobilenhed.

Klik på "Echo & Alexa" øverst til venstre.

Klik på din Echo -enhed.

Under "TRÅDLØS" skal du trykke på "Bluetooth -enheder".

Tryk på "PAAR EN NY ENHED", og du skal se din gadget på listen.

Tryk på din gadget. Du skulle se Pi -rapporten om, at den var parret.

Mens du ser output på din Pi, kan du prøve at give en stemmekommando til ekkoet:

Du: "Alexa, spørg min gadget om at kontrollere temperaturen fra sensor en"

Hvis alt fungerede korrekt, skulle du høre:

Ekko: "Sonden læser 120.505 grader."

Du: "Alexa, fortæl min gadget at skrive George Washington."

Pi skal udskrive:

Modtagne data: {'data': {'person': {'name': 'person', 'value': 'George Washington', 'confirmStatus': 'NONE'}}}

George Washington"

Trin 5: Indpakning

Videoen vist her er et eksempel på, at gadgeten arbejder med at læse temperaturen (den samme sonde i F vs. C) og skrive navne til et enkelt display.

Nu hvor du forhåbentlig har noget, der virker, skal du prøve at gå og tilpasse dette til at gøre dit eget projekt mere i stand. Husk, at du nemt kan redigere hensigterne i Alexa Developer Console, og at alle de slots, du bruger, bliver overført til din Pi i nyttelasten. Desuden kan du få Alexa til at sige alt, hvad du vil, ved blot at redigere den nyttelast, du sender tilbage i tilfælde af din Raspberry Pi -kode.

Bemærk, at denne vejledning ikke er beregnet til at være den endelige løsning for alle de funktioner, du kan ønske dig med en Alexa Gadget. Det er bevidst begrænset til at give dig to enkle funktioner til at videregive data i hver retning mellem Alexa og en gadget. Hvis du er interesseret i at bygge mere sofistikerede interaktionsmodeller, vil jeg opfordre dig til at læse alle readme-filerne i https://github.com/alexa/Alexa-Gadgets-Raspberry-P… og prøve alle de eksempler, de giver. Jeg vil også foreslå, at du læser dokumentationen til Alexa Gadgets Toolkit og Alexa Skills Kit.

Anbefalede: