INHOUDSOPGAWE:

Voeg pasgemaakte Alexa -beheer by Raspberry Pi -projek: 5 stappe
Voeg pasgemaakte Alexa -beheer by Raspberry Pi -projek: 5 stappe

Video: Voeg pasgemaakte Alexa -beheer by Raspberry Pi -projek: 5 stappe

Video: Voeg pasgemaakte Alexa -beheer by Raspberry Pi -projek: 5 stappe
Video: Home Assistant - первые настройки, File Editor, Maria DB, HACS - октябрь 2023 2024, November
Anonim
Voeg pasgemaakte Alexa -beheer by die Raspberry Pi -projek
Voeg pasgemaakte Alexa -beheer by die Raspberry Pi -projek

Hierdie projek is bedoel vir almal wat 'n Raspberry Pi -projek het wat Python gebruik wat stembeheer via hul bestaande Amazon Echo -toestelle wil byvoeg. U hoef nie 'n ervare programmeerder te wees nie, maar u moet gemaklik wees met die opdragreël en die bestaande kode aanpas by u behoeftes.

Ek het aanvanklik 'n projek aangepak om my Raspberry Pi in staat te stel om met Alexa stemgeregeld te word sodat dit water in 'n ketel tot 'n spesifieke temperatuur kan verhit. Alhoewel die interaksie wat ek wou hê, eenvoudig was (gee een nommer van Alexa na die Raspberry Pi), het dit baie werk geverg om in die toestand te kom van die bestaande tutoriale. Ek hoop dat hierdie handleiding die proses so vinnig as moontlik vir ander sal maak.

In my voorbeeld begin ek met 'n Raspberry Pi Zero W met Raspbian. Ek het 'n Python3 -program op my Pi wat teks na 'n SPI -skerm kan skryf, en ek het 'n termometersonde wat ek kan lees. Vir u kan hierdie program byna alles wees, maar die idee is dat u 'n paar invoertoestelle kan hê wat u wil lees via Alexa en/of 'n paar uitsetapparate wat u met Alexa wil beheer.

Die doel is om van 'n basiese program soos die hierbo beskryf na 'n toestel te gaan wat u maklik met my Echo kan beheer. As u al hierdie hardeware het, behoort hierdie projek u geen geld te kos nie. Uiteindelik kom u op die punt waar u dinge kan sê soos:

Ek: "Alexa, vra my toestel om die temperatuur op sensor 1 na te gaan."

Alexa se reaksie: "Die sonde lees 72,31 grade."

of

Ek: "Alexa, vertel my toestel om George Washington te skryf"

Antwoord: Die skerm wat aan my Raspberry Pi gekoppel is, lees nou "George Washington"

In die volgende afdeling sal ek beskryf wat agter die skerms moet gebeur om hierdie werk te laat werk. As u dit net aan u projek wil laat werk en nie omgee hoe dit werk nie, kan u dit asseblief oorslaan (alhoewel dit dalk moeiliker kan wees as iets verkeerd loop).

Stap 1: Agtergrond

Agtergrond
Agtergrond

In hierdie prent (krediet: https://developer.amazon.com/en-US/docs/alexa/alex … kan ons die algemene argitektuur van die Alexa Gadgets sien.

As u iets aan u Echo -toestel sê, stuur dit die klank na die Alexa Cloud, waar dit verwerk word en waar 'n antwoord gegenereer word om op u te reageer. As u vra wat die weer is, is dit net hierdie twee in kommunikasie. Veronderstel nou dat u stembeheer wil byvoeg by een van u klein projekte op 'n Raspberry Pi. Om alles aan boord te verwerk, verg aansienlike hardeware en 'n baie gesofistikeerde kodebasis om dinge aan die gang te kry. 'N Beter oplossing sou wees om gebruik te maak van die Alexa Cloud, wat baie gesofistikeerd is en baie goed is in die hantering van komplekse spraakpatrone. Alexa Gadgets bied u 'n goeie manier om dit te doen.

'N Alexa -gadget kommunikeer met Bluetooth met 'n Echo -toestel. Sodra hierdie verbinding tot stand gebring is, gee die twee vir mekaar boodskappe deur met UTF-8-kodering. As die Echo iets aan die gadget oordra, word dit 'n richtlijn genoem. Die ander rigting word 'n gebeurtenis genoem. Voordat ons in die presiese vloei van dit alles ingaan, moet ons nog 'n belangrike element bekendstel: persoonlike Alexa -vaardighede.

Met Alexa kan ontwikkelaars hul eie persoonlike vaardighede skep, waarmee hulle hul eie interaksies en gedrag kan ontwerp vir gebruik op alle Echo -toestelle. 'N Ontwikkelaar kan byvoorbeeld 'n persoonlike vaardigheid skep om die afstand tussen twee lughawens in die VSA te vertel. 'N Gebruiker sou sê:' Alexa, vra my persoonlike afstandsrekenaar wat die afstand tussen LAX en JFK is 'en dit kan reageer met' 2475 myl '. Hoe doen dit dit? As 'n ontwikkelaar 'n persoonlike vaardigheid maak, definieer hulle wat 'aangepaste voornemens' genoem word, met 'voorbeelduitsprake' wat 'gleuwe' bevat. Byvoorbeeld, in hierdie vaardigheid het ek moontlik die bedoeling "calc_dist" om die afstand tussen twee punte te bereken. 'N Voorbeelduitspraak sou wees "wat die afstand is tussen {slot1} en {slot2}" of "hoe ver tussen {slot1} en {slot2}". Die gleuwe tussen hakies het spesifieke tipes. In hierdie geval is hierdie tipe lughawekodes soos LAX, JFK, BOS, ATL. As 'n gebruiker om die aangepaste vaardigheid vra, probeer die Alexa Cloud om dit wat die gebruiker sê, aan te pas by 'n pasgemaakte bedoeling met behulp van die meegeleverde monsteruitsprake en probeer om geldige gleufwaardes vir die versoek te vind. In hierdie voorbeeld sou dit gevind word dat die gebruiker die bedoeling "calc_dist" wou hê en dat slot1 LAX is en slot2 JFK is. Op hierdie stadium gee die Alexa Cloud die werk deur na die ontwikkelaar se eie kode. Basies vertel dit die ontwikkelaars se kode watter voorneme dit gekry het en wat al die slotwaardes was, onder meer besonderhede.

Die ontwikkelaar kan besluit waar hul kode woon, maar 'n baie gewilde opsie is om 'n AWS Lambda -funksie te gebruik. As u nie weet wat dit is nie, is dit in wese 'n diens waarmee u kode kan oplaai wat te eniger tyd uitgevoer kan word en u dan slegs die tyd in rekening bring wat u kode gebruik. As ons met ons voorbeeld voortgaan, kan die kode van die ontwikkelaar 'n Python -funksie wees wat die twee lughawekodes ontvang, hul liggings opsoek, die afstande bereken en dan 'n antwoord terugstuur na die Alexa Cloud om iets met die gebruiker uit te spreek. Die Alexa Cloud stuur dan die spraakinligting terug na die gebruiker se toestel, en hulle kry die antwoord.

Nou kan ons terugkeer na die apparaat. Ons kan persoonlike vaardighede skep wat ontwerp is om spesifiek met gadgets te werk. 'N Ontwikkelaar kan 'n vaardigheid skryf wat 'n richtlijn na 'n gekoppelde apparaat stuur. Die richtlijn het 'n vrag wat gebruik kan word, maar dit is nodig vir die toestel. Die vaardigheid kan ook 'n richtlijn stuur en dan na 'n gebeurtenis vanaf die gadget luister, sodat die vaardigheidskode toegang kan hê tot inligting wat vanaf die gadget gestuur is.

Deur hierdie vloei moontlik te maak, is 'n baie kragtige instrument geskep, want goedkoop gadgets kan met die kode in die wolk kommunikeer en op stemopdragte reageer deur van die beste beskikbare stemherkenning gebruik te maak.

Daar moet op gelet word dat die meeste vaardighede verskillende maniere toelaat om met hulle te kommunikeer. 'N Gebruiker kan byvoorbeeld direk in 'n bedoeling spring deur te sê "Alexa, vra my persoonlike afstandsrekenaar wat die afstand is tussen LAX en JFK" ('n eenmalige oproep genoem), of hulle kan eenvoudig 'n lanseringsvoorneme gebruik:' Alexa, maak my persoonlike afstandrekenaar oop ". Hierdie laaste voorbeeld sal gewoonlik gevolg word deur Alexa wat reageer met 'n versoek om meer inligting. Hierdie tutoriaal laat doelbewus ondersteuning vir laasgenoemde weg. Meer spesifiek, sonder om die Lambda-funksie te verander, kan u slegs die vaardigheid aanroep met behulp van 'n eenmalige oproep. Met hierdie ontwerpkeuse kan die model eenvoudiger wees (hoef nie die bedoeling van die bekendstelling of die gespreksvloei te ondersteun nie), en ek het agtergekom dat ek gewoonlik met my toestelle wil kommunikeer met behulp van eenmalige aanroepings, aangesien dit gewoonlik vinniger is.

Stap 2: Registreer die gadget op die ontwikkelaarkonsole van Alexa Voice Service

Die volgende is 'n beskrywing van die nodige stappe. Ek het 'n ekwivalente video gemaak wat wys hoe om al hierdie stappe te doen. U kan óf óf albei gebruik om hierdie stap te voltooi.

  1. Gaan na
  2. As u nog nie 'n gratis rekening het nie, maak 'n rekening
  3. Klik op "Produkte"
  4. Vul etikette in en kies 'Alexa Gadget'
  5. Vul die res van die velde in wat u wil
  6. Klik op Voltooi

Stap 3: Skep AWS Lambda -funksie en persoonlike vaardigheid

Skep pasgemaakte vaardigheid op die ontwikkelaarkonsole van Alexa Skills Kit

Die kode vir hierdie tutoriaal kan hier gevind word

Voordat u hierdie stap voltooi, moet u 'n.zip -lêer skep wat die implementeringspakket vir die AWS Lambda -funksie bevat, soos getoon in die tutoriaal hier.

  1. Laai die gids "lambda" af van my Github, wat "lambda_function.py" en "requirements.txt" bevat
  2. Maak die terminale oop en verander die huidige gids om in hierdie gids te wees.
  3. Voer die volgende volgorde uit:

pip installeer -r requirements.txt -t skill_env

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

Jou.zip-lêer sal nou geleë wees in die gids waar die lambda-lêergids was en sal "skill-code.zip" genoem word.

'N Opmerking oor die koste van gasheer op AWS: Hierdie tutoriaal vereis dat u 'n AWS -rekening het (gratis om te skep). Lambda -funksies kos wel geld, maar hul huidige prys in die N. Virginia -omgewing is $ 0,000000208 per 100 ms gebruik met 128 MB geheue. Ter verwysing, elke oproep van my vaardigheid kos ongeveer 800 ms se gebruik op hierdie vlak. Om 'n rekening van $ 1,00 USD op te betaal, moet u ongeveer 600 000 keer na hierdie funksie roep, wat (as dit u 5 sekondes per aanroeping neem) meer as 34 dae sou neem om u funksie te bel. Koste behoort nie 'n groot probleem te wees nie, tensy u u vaardigheid publiseer en 'n groot aantal mense dit begin gebruik. As u bekommerd is oor die ontvangs van rekeninge op AWS, kan u oorweeg om alarms op te stel wat u in kennis stel as die gebruik 'n bepaalde drempel bereik.

Die volgende is 'n beskrywing van die nodige stappe. Ek het 'n ekwivalente video gemaak wat wys hoe om al hierdie stappe te doen. U kan óf óf albei gebruik om hierdie stap te voltooi.

  1. Gaan na https://aws.amazon.com/ en meld aan by die konsole of skep 'n gratis rekening as u nie een het nie
  2. Soek en klik op Lambda onder dienste
  3. Klik op "Skep funksie"
  4. Kies 'Skrywer van nuuts af', gee dit 'n naam en kies die nuutste weergawe van Python 3 vir tydsduur
  5. Verander "wysig kode inlyn" na "laai 'n.zip -lêer op" en kies die.zip -lêer wat hierbo geskep is
  6. Navigeer in 'n nuwe venster na https://developer.amazon.com/alexa/console/ask en meld aan
  7. Klik op "Skep vaardigheid"
  8. Merk dit, kies 'Aangepaste' model en 'Stel u eie voor' en klik op 'Skep vaardigheid'
  9. Klik op "Begin van voor af" en klik op "Kies"
  10. Klik onder "Voornemens" op "Voeg by"
  11. Skep 'n pasgemaakte bedoeling genaamd "alexa_to_pi" en vul "skryf {persoon}" in as 'n voorbeelduitspraak
  12. Maak 'n opsetgleuf genaamd 'persoon' met die tipe 'AMAZON. Person'
  13. Skep 'n pasgemaakte bedoeling genaamd "pi_to_alexa" en vul in "kontroleer die temperatuur van sensor {sensor_num}
  14. Maak 'n opsetgleuf genaamd "sensor_num" met die tipe "AMAZON. NUMBER"
  15. Skakel onder 'Interfaces' 'Custom Interface Controller' aan
  16. Onder 'Endpoint', kies 'AWS Lambda ARN' en kopieer die 'Your Skill ID'
  17. Gaan terug na die AWS -konsole
  18. Klik op "Voeg sneller by"
  19. Kies "Alexa Skills Kit", merk "Aktiveer" onder vaardigheids -ID -verifikasie, plak die vaardigheids -ID in wat u pas gekopieer het en klik op add
  20. Kopieer die Lambda ARN in die regter boonste hoek
  21. Navigeer terug na die Alexa Developer Console en plak die Lambda ARN in die veld "Standaardstreek"
  22. Stel onder Naam aanroeping die vaardigheidsaanroepingsnaam in as "my gadget"
  23. Klik op "Stoor model" en dan op "Bou model"
  24. Klik op "Toets" in die boonste oortjies en verander die keurder van "Uit" na "Ontwikkeling"
  25. Let daarop dat logs vir die Lambda -funksie gevind word in die "CloudWatch" -diens op AWS.

Stap 4: Stel die kode op u Framboos Pi op

Vir u Raspberry Pi om met die Alexa -toestel te kommunikeer, benodig hy 'n paar kode om inligting oor bluetooth te vergemaklik en die verbinding te behou, benewens 'n paar ander lêers. Die maklikste manier om aan die gang te kom met die nuutste lêers van Amazon, is om hul Raspberry Pi Gadgets-bewaarplek te kloon. Gaan na die gids van u huidige projek en voer dit uit

git-kloon

Dit laai hul hele bewaarplek met al die nodige kode op u Pi. Dit bevat 'n paar voorbeeldprojekte wat 'n paar funksies van Alexa Gadgets toon. As u meer inligting wil hê, sien die leesbrief op hul Github -bladsy.

Begin hul opsetfunksie om alles op te stel.

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

sudo python3 launch.py -opstel

Volg die aanwysings en reageer "y" as u gevra word of u wil instel met u Gadget -geloofsbriewe. Onthou die Amazon -ID en Gadget -geheime om u gadget op die ontwikkelaarkonsole op te stel, aangesien dit hier gevra sal word. Ek het die "bt" transmissiemodus gekies vir my Raspberry Pi Zero W. BLE word nie deur alle ouer Echo -toestelle ondersteun nie, maar u kan kyk wat u hardeware kan doen. As u u Pi in die lessenaarmodus gebruik, beveel Amazon aan dat u met die rechtermuisknop op die Bluetooth-ikoon regs bo klik en op 'Verwyder' Bluetooth 'van die paneel klik' om verbindingsprobleme te vermy.

Let wel: hierdie stap kan 'n rukkie neem, afhangende van hoeveel geïnstalleer moet word.

Nou het u al die nodige ondersteuningslêers om na u projek terug te keer en die funksies by te voeg om kommunikasie met u Echo moontlik te maak.

As u kies, kan u die gids "voorbeelde" in "Alexa-Gadgets-Raspberry-Pi-Samples/src" verwyder

U kan u projekkode hê waar u wil, maar ek maak 'n gids in die tuisgids daarvoor, of u kan die gids met die kode van my Github aflaai, maar pas die.ini -lêers soos hieronder beskryf.

cd /huis /pi

mkdir my_project cd my_project raak my_gadget.py raak my_gadget.ini

Ek het nou twee lêers in 'n gids met die naam "my_project" geskep. Die.ini -lêer is belangrik. Maak seker dat dit die volgende bevat en vervang in u Amazon ID en Gadget Secret:

[GadgetSettings]

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

Kom ons kyk nou na die python -lêer voordat ons in die besonderhede ingaan:

invoer json

van agt invoer AlexaGadget

klas MyGadget (AlexaGadget):

def _init _ (self):

super ()._ init _ ()

def on_custom_mygadget_alexatopi (self, richtlijn):

payload = json.loads (directive.payload.decode ("utf-8")) print ("Data ontvang:" + str (payload)) write_text (str (payload ['data'] ['persoon'] ['waarde ']))

def on_custom_mygadget_pitoalexa (self, richtlijn):

payload = json.loads (directive.payload.decode ("utf-8")) print ("Ontvangde data:" + str (loonvrag)) laai = {'data': "Die sonde lees" + str (get_temp (loonvrag) ['data'] ['sensor_num'] ['waarde'])) + "grade."} self.send_custom_event ('Custom. MyGadget', 'PiToAlexa', laai) MyGadget (). main ()

Eerstens sal u agterkom dat dit twee funksies noem: write_text () en get_temp (). In my kode definieer ek hierdie funksies in dieselfde lêer, maar dit is afhanklik van my hardeware, so ek het gekies om dit weg te laat. Ek het hierdie lêer aangeheg met die funksies wat gedefinieer is om net data te druk en terug te gee as u hierdie presiese kode wil gebruik. Ek stel voor om met hierdie presiese kode te toets voordat u dit verander om met u projek te werk. Ek het ook die.ini -lêer aangeheg, maar maak seker dat u die ID en gadgetgeheim verander. Die topfunksie ontvang data wat deur die Alexa deurgegee word. Die onderste funksie ontvang data in dieselfde formaat, maar die Alexa -toestel sal vyf sekondes wag totdat 'n gebeurtenis met sy eie vrag teruggestuur word. Hierdie vrag is spesiaal omdat die Alexa -toestel die inhoud daarvan sal spreek.

Sodra u hierdie lêers het, gaan u na die "my_project" -map en voer die python -lêer uit.

sudo herlaai

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

As dit die eerste keer is dat u die program gebruik, moet u dit aan u Echo -toestel koppel. Maak seker dat u Echo -toestel naby die Raspberry Pi is, aangesien ons 'n Bluetooth -verbinding moet moontlik maak.

Klik in die Alexa -app op u mobiele toestel op 'toestelle' in die regter onderste hoek.

Klik op "Echo & Alexa" links bo.

Klik op u Echo -toestel.

Tik onder "DRAADLOOS" op "Bluetooth -toestelle".

Tik op 'PAAR' N NUWE TOESTEL ', en u toestel moet op die lys verskyn.

Tik op jou gadget. U moet die Pi -verslag sien dat dit suksesvol gekoppel is.

Probeer 'n stemopdrag aan die Echo gee terwyl u na die uitvoer van u Pi kyk:

U: "Alexa, vra my toestel om die temperatuur van sensor een te kontroleer"

As alles reg werk, moet u hoor:

Echo: "Die sonde lees 120.505 grade."

Jy: "Alexa, vertel my toestel om George Washington te skryf."

Die Pi moet druk:

Ontvangde data: {'data': {'persoon': {'naam': 'persoon', 'waarde': 'George Washington', 'confirmStatus': 'NONE'}}}

George Washington"

Stap 5: Inpak

Die video wat hier getoon word, is 'n voorbeeld van die gadget wat werk met die lees van die temperatuur (dieselfde sonde in F vs C) en die skryf van name op 'n eenvoudige skerm.

Noudat u hopelik iets aan die werk het, moet u probeer om dit aan te pas om u eie projek bekwamer te maak. Onthou dat u die voornemens in die Alexa Developer Console maklik kan wysig en dat al die gleuwe wat u gebruik, in die laai vrag aan u Pi oorgedra sal word. Boonop kan u Alexa alles laat sê wat u wil, deur die loonvrag wat u in die geval van u Raspberry Pi -kode afgee, te wysig.

Let daarop dat hierdie tutoriaal nie die finale oplossing is vir al die funksies wat u met 'n Alexa Gadget wil hê nie. Dit is doelbewus beperk om u twee eenvoudige funksies te gee om data in elke rigting tussen Alexa en 'n gadget deur te gee. As u belangstel om meer gesofistikeerde interaksiemodelle te bou, raai ek u aan om al die readme-lêers in https://github.com/alexa/Alexa-Gadgets-Raspberry-P… te lees en al die voorbeelde wat hulle verskaf, te probeer. Ek stel ook voor dat u die dokumentasie vir die Alexa Gadgets Toolkit en die Alexa Skills Kit lees.

Aanbeveel: