Innholdsfortegnelse:

Legg til tilpasset Alexa -kontroll til Raspberry Pi -prosjektet: 5 trinn
Legg til tilpasset Alexa -kontroll til Raspberry Pi -prosjektet: 5 trinn

Video: Legg til tilpasset Alexa -kontroll til Raspberry Pi -prosjektet: 5 trinn

Video: Legg til tilpasset Alexa -kontroll til Raspberry Pi -prosjektet: 5 trinn
Video: Windows Event and Logging Demystified: IT Admin Edition 2024, Juli
Anonim
Legg til tilpasset Alexa -kontroll til Raspberry Pi -prosjektet
Legg til tilpasset Alexa -kontroll til Raspberry Pi -prosjektet

Dette prosjektet er beregnet på alle som har et Raspberry Pi -prosjekt som bruker Python som ønsker å legge til stemmestyring via sine eksisterende Amazon Echo -enheter. Du trenger ikke å være en erfaren programmerer, men du bør være komfortabel med å bruke kommandolinjen og tilpasse eksisterende kode for å passe dine behov.

Jeg startet i utgangspunktet med et prosjekt for å gjøre Raspberry Pi min stemmestyrt med Alexa slik at den kunne varme vann i en vannkoker til en bestemt temperatur. Selv om samspillet jeg ønsket var ganske enkelt (send ett nummer fra Alexa til Raspberry Pi), tok det mye arbeid å komme til den tilstanden fra de eksisterende opplæringsprogrammene. Jeg håper denne opplæringen vil gjøre denne prosessen så rask som mulig for andre.

I mitt eksempel starter jeg med en Raspberry Pi Zero W med Raspbian. Jeg har et Python3 -program på min Pi som er i stand til å skrive tekst til en SPI -skjerm, og jeg har en termometerprobe som jeg kan lese. For deg kan dette programmet være nesten alt, men tanken er at du kan ha noen inndataenheter du vil lese via Alexa og/eller noen utdataenheter du vil kontrollere ved hjelp av Alexa.

Målet er å gå fra et grunnleggende program som det som er beskrevet ovenfor til en enhet som du enkelt kan kontrollere med mitt ekko. Forutsatt at du allerede har denne maskinvaren, bør dette prosjektet ikke koste deg noen penger. Til slutt kommer du til det punktet hvor du kan si ting som:

Meg: "Alexa, be min gadget om å sjekke temperaturen på sensor 1."

Alexas svar: "Sonden leser 72,31 grader."

eller

Meg: "Alexa, fortell min gadget å skrive George Washington"

Svar: Displayet som er koblet til min Raspberry Pi, leser nå "George Washington"

I neste avsnitt vil jeg beskrive hva som må skje bak kulissene for å få dette til å fungere. Hvis du bare vil få dette til å fungere på prosjektet ditt og ikke bryr deg om hvordan det fungerer, kan du hoppe over det (selv om det kan gjøre det vanskeligere hvis noe går galt).

Trinn 1: Bakgrunn

Bakgrunn
Bakgrunn

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

Når du sier noe til Echo -enheten din, sender den lyden til Alexa Cloud, hvor den behandles og hvor det genereres et svar for å svare deg. Når du spør hva været er, er det bare disse to i kommunikasjon. Anta nå at du vil legge til talekontroll til et av dine små prosjekter på en Raspberry Pi. Å behandle alt ombord vil kreve betydelig maskinvare og en veldig sofistikert kodebase for å få ting til å gå. En bedre løsning ville være å utnytte Alexa Cloud, som er veldig sofistikert og har blitt veldig god til å håndtere komplekse talemønstre. Alexa Gadgets gir deg en god måte å gjøre dette på.

En Alexa -gadget kommuniserer med en ekko -enhet ved hjelp av bluetooth. Når denne forbindelsen er opprettet, sender de to meldingene til hverandre ved hjelp av UTF-8-koding. Når Echo sender noe til gadgeten, kalles det et direktiv. Den andre retningen omtales som en hendelse. Før vi går inn på den eksakte flyt av alt dette, bør vi introdusere et annet sentralt element: tilpassede Alexa -ferdigheter.

Alexa lar utviklere lage sine egne tilpassede ferdigheter, som lar dem designe sine egne interaksjoner og atferd for bruk på alle Echo -enheter. For eksempel kan en utvikler lage en tilpasset ferdighet for å fortelle deg avstanden mellom to flyplasser i USA. En bruker vil si: "Alexa, spør min egendefinerte avstandskalkulator hva avstanden er mellom LAX og JFK", og den kan svare med "2475 miles". Hvordan gjør det dette? Når en utvikler lager en egendefinert ferdighet, definerer de det som kalles "tilpassede hensikter" med "prøveuttalelser" som inneholder "spor". For eksempel kan jeg i denne ferdigheten ha til hensikt "calc_dist" å beregne avstanden mellom to punkter. Et eksempel er "hva avstanden er mellom {slot1} og {slot2}" eller "hvor langt mellom {slot1} og {slot2}". Sporene som vises i parentes har spesifikke typer. I dette tilfellet vil disse typene være flyplasskoder som LAX, JFK, BOS, ATL. Når en bruker ber om den egendefinerte ferdigheten, prøver Alexa Cloud å matche det brukeren sier til en tilpasset hensikt ved hjelp av de medfølgende prøveuttalelsene og prøver å finne gyldige sporverdier for forespørselen. I dette eksemplet vil det finne ut at brukeren ønsket "calc_dist" -intensjonen, og at slot1 er LAX og slot2 er JFK. På dette tidspunktet overfører Alexa Cloud arbeidet til utviklerens egen kode. I utgangspunktet forteller den utviklerkoden hvilken hensikt den mottok og hva alle sporverdiene var, blant annet detaljer.

Utvikleren får bestemme hvor koden deres bor, men et veldig populært alternativ er å bruke en AWS Lambda -funksjon. Hvis du ikke vet hva det er, er det i hovedsak en tjeneste som lar deg laste opp kode som kan kjøres når som helst og deretter belaster deg bare for den tiden koden blir kjørt. Hvis vi fortsetter med vårt eksempel, kan utviklerens kode være en Python -funksjon som mottar de to flyplasskodene, ser etter posisjonene deres, beregner avstandene og deretter sender et svar tilbake til Alexa Cloud for å si noe til brukeren. Alexa Cloud ville deretter sende denne taleinformasjonen tilbake til brukerens enhet, og de ville få svaret.

Nå kan vi komme tilbake til gadgeten. Vi kan lage tilpassede ferdigheter som er designet for å fungere spesielt med gadgets. En utvikler kan skrive en ferdighet som sender ut et direktiv til en tilkoblet gadget. Dette direktivet har en nyttelast som kan brukes, men det er nødvendig av modulen. Denne ferdigheten kan også sende et direktiv og deretter lytte etter en hendelse fra gadgeten, slik at ferdighetskoden kan ha tilgang til informasjon sendt fra gadgeten.

Etablering av denne flyt gjør det mulig å lage et veldig kraftig verktøy fordi billige gadgets kan ha muligheten til å kommunisere med kode i skyen og svare på talekommandoer ved å bruke noen av de beste tilgjengelige stemmegjenkjenningene.

Det skal bemerkes at de fleste ferdigheter tillater forskjellige måter å samhandle med dem. For eksempel kan en bruker hoppe rett inn i en intensjon ved å si "Alexa, spør min egendefinerte avstandskalkulator hva avstanden er mellom LAX og JFK" (kalt en ettskuddsanrop) eller de kan ganske enkelt bruke en lanseringshensikt: "Alexa, åpne min egendefinerte avstandskalkulator ". Dette siste eksemplet vil vanligvis bli fulgt av Alexa som svarer med en melding om mer informasjon. Denne opplæringen utelater forsettlig støtte for sistnevnte. Nærmere bestemt, uten å endre Lambda-funksjonen, kan du bare påkalle ferdigheten ved å bruke en ettskudd. Dette designvalget gjør at modellen kan være mer enkel (trenger ikke å støtte lanseringshensikter eller samtaleflyt), og jeg har funnet ut at jeg vanligvis ønsker å samhandle med gadgetene mine ved å bruke ettskuddsoppfordringer uansett siden de vanligvis er raskere.

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

Følgende er en beskrivelse av trinnene som trengs. Jeg har laget en tilsvarende video som viser hvordan du gjør alle disse trinnene. Du kan bruke enten eller begge deler for å fullføre dette trinnet.

  1. Naviger til
  2. Hvis du ikke allerede har en gratis konto, må du opprette en
  3. Klikk på "Produkter"
  4. Fyll ut etiketter og velg "Alexa Gadget"
  5. Fyll ut hva du vil for resten av feltene
  6. Klikk på Fullfør

Trinn 3: Lag AWS Lambda -funksjon og tilpasset ferdighet

Lag tilpasset ferdighet på utviklerkonsollen for Alexa Skills Kit

Koden for denne opplæringen finner du her

Før du fullfører dette trinnet, må du lage en.zip -fil som inneholder distribusjonspakken for AWS Lambda -funksjonen som vist i opplæringen her.

  1. Last ned mappen "lambda" fra min Github som inneholder "lambda_function.py" og "requirements.txt"
  2. Åpne terminalen og endre den nåværende katalogen for å være inne i denne mappen.
  3. Kjør følgende sekvens:

pip install -r requirements.txt -t skill_env

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

ZIP-filen din vil nå bli plassert i katalogen der lambda-mappen var og vil bli kalt "skill-code.zip".

Et notat om kostnaden for hosting på AWS: Denne opplæringen krever at du har en AWS -konto (gratis å opprette). Lambda -funksjoner koster imidlertid penger, men den nåværende prisen i N. Virginia -regionen er $ 0.000000208 per 100 ms bruk med 128 MB minne. For referanse regner hver påkallelse av mine ferdigheter omtrent 800 ms bruk på denne nivået. For å få en regning på $ 1,00 USD, må du påkalle denne funksjonen omtrent 600 000 ganger, noe som (hvis det tar deg 5 sekunder per påkallelse) vil ta deg over 34 dager med å ringe funksjonen din direkte. Kostnad bør ikke være et vesentlig problem med mindre du publiserer ferdigheten din og et stort antall mennesker begynner å bruke den. Hvis du er bekymret for å få regninger på AWS, bør du vurdere å sette opp bruksalarmer som varsler deg hvis bruken passerer en definert terskel.

Følgende er en beskrivelse av trinnene som trengs. Jeg har laget en tilsvarende video som viser hvordan du gjør alle disse trinnene. Du kan bruke enten eller begge for å fullføre dette trinnet.

  1. Naviger til https://aws.amazon.com/ og logg deg på konsollen eller opprett en gratis konto hvis du ikke har en
  2. Søk etter og klikk på Lambda under tjenester
  3. Klikk "Opprett funksjon"
  4. Velg "Forfatter fra bunnen av", gi den et navn, og velg den siste Python 3 -versjonen for kjøretid
  5. Endre "rediger kode inline" til "last opp en.zip -fil" og velg.zip -filen som er opprettet ovenfor
  6. I et nytt vindu, naviger til https://developer.amazon.com/alexa/console/ask og logg deg på
  7. Klikk på "Skap ferdigheter"
  8. Merk den, velg "Egendefinert" modell og "Tilbyr din egen" og klikk "Opprett ferdighet"
  9. Klikk "Start fra bunnen av" og klikk "Velg"
  10. Under "Intens" klikker du på "Legg til"
  11. Lag en tilpasset intensjon kalt "alexa_to_pi" og fyll ut "skriv {person}" som et eksempel
  12. Lag en intensjonsluke kalt "person" med typen "AMAZON. Person"
  13. Lag en tilpasset intensjon kalt "pi_to_alexa" og fyll ut "sjekk temperaturen fra sensoren {sensor_num}
  14. Lag en intensjonsluke kalt "sensor_num" med typen "AMAZON. NUMBER"
  15. Under Grensesnitt slår du på "Tilpasset grensesnittkontroller"
  16. Under Sluttpunkt, velg "AWS Lambda ARN" og kopier "Din ferdighets -ID"
  17. Naviger tilbake til AWS -konsollen
  18. Klikk på "Legg til utløser"
  19. Velg "Alexa Skills Kit", merk av for "Aktiver" under Ferdighets -ID -bekreftelse, lim inn ferdighets -IDen du nettopp kopierte og klikk på legg til
  20. Kopier Lambda ARN i øvre høyre hjørne
  21. Naviger tilbake til Alexa Developer Console og lim inn Lambda ARN i "Standard Region" -feltet
  22. Under Tilkalling, angi ferdighetsinvokasjonsnavnet som "min gadget"
  23. Klikk "Lagre modell" og deretter "Bygg modell"
  24. Klikk "Test" i de øverste fanene og endre velgeren fra "Av" til "Utvikling"
  25. Vær oppmerksom på at logger for Lambda -funksjonen finnes i "CloudWatch" -tjenesten på AWS.

Trinn 4: Sett opp koden på din Raspberry Pi

For at din Raspberry Pi skal kommunisere med Alexa -enheten, trenger den litt kode for å lette å overføre informasjon via bluetooth og opprettholde den tilkoblingen, i tillegg til noen få andre filer. Den enkleste måten å komme i gang med de mest oppdaterte filene fra Amazon er å klone Raspberry Pi Gadgets-depotet. Naviger til katalogen for ditt nåværende prosjekt og kjør

git-klon

Dette vil laste hele depotet med all nødvendig kode på din Pi. Den har noen eksempelprosjekter som viser noen av funksjonene til Alexa Gadgets. Hvis du vil ha mer informasjon, kan du se readme på deres Github -side.

Kjør konfigurasjonsfunksjonen for å få alt konfigurert.

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

sudo python3 launch.py -oppsett

Følg instruksjonene og svar "y" når du blir spurt om du vil konfigurere ved hjelp av Gadget -legitimasjonen din. Husk Amazon -ID og Gadget Secret fra å sette opp gadgeten din på utviklerkonsollen siden den blir bedt om det her. Jeg valgte "bt" overføringsmodus for min Raspberry Pi Zero W. BLE støttes ikke av alle eldre Echo -enheter, men du kan slå opp hva maskinvaren din er i stand til. Hvis du bruker Pi i skrivebordsmodus, anbefaler Amazon å høyreklikke på Bluetooth-ikonet øverst til høyre og klikke "Fjern" Bluetooth "fra panel" for å unngå tilkoblingsproblemer.

Merk: dette trinnet kan ta en stund, avhengig av hvor mye som må installeres.

Nå vil du ha alle nødvendige støttefiler for å gå tilbake til prosjektet og begynne å legge til funksjonene for å tillate kommunikasjon med ditt ekko.

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

Du kan ha prosjektkoden din hvor du vil, men jeg lager en mappe i hjemmekatalogen for den, alternativt kan du laste ned mappen med koden fra min Github, bare pass på å redigere.ini -filene som beskrevet nedenfor.

cd /home /pi

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

Jeg har nå opprettet to filer i en mappe som heter "mitt_prosjekt".. Ini -filen er viktig. Pass på at den inneholder følgende og erstatter i Amazon -ID -en og gadgethemmeligheten:

[GadgetSettings]

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

La oss ta en titt på python -filen før vi går inn på detaljene:

importer json

fra agt import AlexaGadget

klasse MyGadget (AlexaGadget):

def _init _ (self):

super ()._ init _ ()

def on_custom_mygadget_alexatopi (selv, direktiv):

nyttelast = json.loads (directive.payload.decode ("utf-8")) print ("Mottatte data:" + str (nyttelast)) write_text (str (nyttelast ['data'] ['person'] ['verdi ']))

def on_custom_mygadget_pitoalexa (selv, direktiv):

nyttelast = json.loads (directive.payload.decode ("utf-8")) print ("Mottatte data:" + str (nyttelast)) nyttelast = {'data': "Sonden leser" + str (get_temp (nyttelast) ['data'] ['sensor_num'] ['verdi'])) + "grader."} self.send_custom_event ('Custom. MyGadget', 'PiToAlexa', nyttelast) MyGadget (). main ()

Først vil du legge merke til at den kaller to funksjoner: write_text () og get_temp (). I koden min definerer jeg disse funksjonene i den samme filen, men de er avhengige av maskinvaren min, så jeg har valgt å utelate dem. Jeg har vedlagt denne filen med de funksjonene som er definert for å bare skrive ut og returnere dummy -data i tilfelle du vil kjøre denne eksakte koden. Jeg vil foreslå å teste med denne eksakte koden før du endrer den for å fungere med prosjektet ditt. Jeg har også lagt ved.ini -filen, men sørg for at du går inn og endrer ID og gadgethemmelighet. Toppfunksjonen mottar data sendt fra Alexa. Den nederste funksjonen mottar data i samme format, men Alexa -enheten vil vente i fem sekunder på at en hendelse skal sendes tilbake med sin egen nyttelast. Denne nyttelasten er spesiell ved at Alexa -enheten vil snakke innholdet.

Når du har disse filene, navigerer du til "my_project" -mappen og kjører python -filen.

sudo omstart

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

Hvis dette er første gang du kjører programmet, må du koble det til Echo -enheten din. Sørg for at Echo -enheten din er i nærheten av Raspberry Pi, siden vi må tillate en Bluetooth -tilkobling.

Klikk på "enheter" i nedre høyre hjørne i Alexa -appen på mobilenheten din.

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

Klikk på Echo -enheten.

Trykk på "Bluetooth -enheter" under "TRÅDLØS".

Trykk på "KOBLE EN NY ENHET", og du bør se gadgeten din på listen.

Trykk på gadgeten din. Du bør se Pi -rapporten om at den ble parret.

Mens du ser utgangen på Pi -en din, kan du prøve å gi en stemmekommando til ekkoet:

Du: "Alexa, be min gadget om å sjekke temperaturen fra sensor en"

Hvis alt fungerte som det skal, bør du høre:

Ekko: "Sonden leser 120.505 grader."

Du: "Alexa, fortell min gadget å skrive George Washington."

Pi skal skrive ut:

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

George Washington"

Trinn 5: Innpakning

Videoen som vises her er et eksempel på at gadgeten jobber med å lese temperaturen (den samme sonden i F mot C) og skrive navn til en enkel skjerm.

Nå som du forhåpentligvis har noe som fungerer, bør du prøve å tilpasse dette for å gjøre ditt eget prosjekt mer i stand. Husk at du enkelt kan redigere intensjonene i Alexa Developer Console, og at alle sporene du bruker vil bli overført til din Pi i nyttelasten. Videre kan du få Alexa til å si hva du vil ved å bare redigere nyttelasten du sender tilbake i hendelsen fra din Raspberry Pi -kode.

Vær oppmerksom på at denne opplæringen ikke er ment å være en endelig løsning for alle funksjonene du kan ønske deg med en Alexa Gadget. Det er med vilje begrenset til å gi deg to enkle funksjoner for å overføre data i hver retning mellom Alexa og en gadget. Hvis du er interessert i å bygge mer sofistikerte interaksjonsmodeller, vil jeg oppfordre deg til å lese alle readme-filene i https://github.com/alexa/Alexa-Gadgets-Raspberry-P… og prøve alle eksemplene de gir. Jeg vil også foreslå at du leser dokumentasjonen for Alexa Gadgets Toolkit og Alexa Skills Kit.

Anbefalt: