Innehållsförteckning:
- Steg 1: Bakgrund
- Steg 2: Registrera gadgeten på Alexa Voice Service Developer Console
- Steg 3: Skapa AWS Lambda -funktion och anpassad skicklighet
- Steg 4: Ställ in koden på din Raspberry Pi
- Steg 5: Förpackning
Video: Lägg till anpassad Alexa -kontroll till Raspberry Pi -projektet: 5 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:42
Detta projekt är avsett för alla som har ett Raspberry Pi -projekt som använder Python som vill lägga till röststyrning via sina befintliga Amazon Echo -enheter. Du behöver inte vara en erfaren programmerare, men du bör vara bekväm med att använda kommandoraden och anpassa befintlig kod för att passa dina behov.
Jag började med ett projekt för att göra min Raspberry Pi att röststyras med Alexa så att den kunde värma vatten i en vattenkokare till en specifik temperatur. Även om den interaktion jag ville ha var ganska enkel (skicka ett nummer från Alexa till Raspberry Pi), tog det mycket arbete att komma till det tillståndet från de befintliga självstudierna. Jag hoppas att denna handledning kommer att göra processen så snabb som möjligt för andra.
I mitt exempel börjar jag med en Raspberry Pi Zero W med Raspbian. Jag har ett Python3 -program på min Pi som kan skriva text till en SPI -display, och jag har en termometersond som jag kan läsa. För dig kan det här programmet vara nästan vad som helst, men tanken är att du kanske har några inmatningsenheter som du vill läsa via Alexa och/eller några utmatningsenheter som du vill styra med Alexa.
Målet är att gå från ett grundläggande program som det som beskrivs ovan till en enhet som du enkelt kan styra med mitt Echo. Förutsatt att du redan har den här hårdvaran bör detta projekt inte kosta dig några pengar. I slutändan kommer du till den punkt där du kan säga saker som:
Jag: "Alexa, be min gadget att kontrollera temperaturen på sensor 1."
Alexas svar: "Sonden läser 72,31 grader."
eller
Jag: "Alexa, berätta för min pryl att skriva George Washington"
Svar: Displayen som är ansluten till min Raspberry Pi läser nu "George Washington"
I nästa avsnitt kommer jag att beskriva vad som måste hända bakom kulisserna för att få detta att fungera. Om du bara vill få detta att fungera på ditt projekt och inte bryr dig om hur det fungerar, hoppa gärna över det (även om det kan göra det svårare om något går fel).
Steg 1: Bakgrund
I den här bilden (kredit: https://developer.amazon.com/en-US/docs/alexa/alex … kan vi se den allmänna arkitekturen för Alexa Gadgets.
När du säger något till din Echo -enhet skickar det ljudet till Alexa Cloud, där det bearbetas och där ett svar genereras för att svara på dig. När du frågar vad vädret är är det bara dessa två i kommunikation. Antag nu att du vill lägga till röststyrning till ett av dina små projekt på en Raspberry Pi. Att bearbeta allt ombord skulle kräva betydande hårdvara och en mycket sofistikerad kodbas för att få saker att gå. En bättre lösning skulle vara att utnyttja Alexa Cloud, som är mycket sofistikerat och har blivit mycket bra på att hantera komplexa talmönster. Alexa Gadgets ger ett bra sätt för dig att göra detta.
En Alexa Gadget kommunicerar med en Echo -enhet med bluetooth. När denna anslutning upprättats skickar de två meddelandena till varandra med hjälp av UTF-8-kodning. När Echo skickar något till prylen kallas det ett direktiv. Den andra riktningen kallas en händelse. Innan vi går in på det exakta flödet av allt detta, bör vi introducera ett annat nyckelelement: anpassade Alexa Skills.
Alexa tillåter utvecklare att skapa sina egna anpassade färdigheter, vilket gör att de kan designa sina egna interaktioner och beteenden för användning på alla Echo -enheter. Till exempel kan en utvecklare skapa en anpassad färdighet för att berätta avståndet mellan två flygplatser i USA. En användare skulle säga: "Alexa, fråga min anpassade avståndskalkylator vad avståndet är mellan LAX och JFK" och det kan svara med "2475 miles". Hur gör det här? När en utvecklare gör en anpassad färdighet definierar de vad som kallas "anpassade avsikter" med "provuttryck" som innehåller "slots". Till exempel, i denna färdighet kan jag ha avsikten "calc_dist" att beräkna avståndet mellan två punkter. Ett exempel är "vad avståndet är mellan {slot1} och {slot2}" eller "hur långt mellan {slot1} och {slot2}". Spåren som visas inom parentes har specifika typer. I detta fall skulle dessa typer vara flygplatskoder som LAX, JFK, BOS, ATL. När en användare frågar efter den anpassade färdigheten försöker Alexa Cloud att matcha vad användaren säger till en anpassad avsikt med hjälp av de medföljande exempeluttrycken och försöker hitta giltiga platsvärden för den begäran. I det här exemplet skulle det upptäcka att användaren ville ha "calc_dist" -avsikten och att slot1 är LAX och slot2 är JFK. Vid denna tidpunkt skickar Alexa Cloud arbetet vidare till utvecklarens egen kod. I grunden berättar det för utvecklarens kod vilken avsikt den fick och vad alla slotvärden var, bland annat.
Utvecklaren får bestämma var deras kod bor, men ett mycket populärt alternativ är att använda en AWS Lambda -funktion. Om du inte vet vad det är, är det i huvudsak en tjänst som låter dig ladda upp kod som kan köras när som helst och sedan debiterar dig bara för den tid som din kod körs. Om vi fortsätter med vårt exempel kan utvecklarens kod vara en Python -funktion som tar emot de två flygplatskoderna, letar upp deras platser, beräknar avstånden och sedan skickar ett svar tillbaka till Alexa Cloud för att tala ut något till användaren. Alexa Cloud skickade sedan tillbaka talinformationen till användarens enhet, och de skulle få svaret.
Nu kan vi komma tillbaka till prylen. Vi kan skapa anpassade färdigheter som är utformade för att fungera specifikt med prylar. En utvecklare kan skriva en färdighet som skickar ut ett direktiv till en ansluten gadget. Det direktivet har en nyttolast som kan användas men det behövs av gadgeten. Den färdigheten kan också skicka ett direktiv och sedan lyssna efter en händelse från gadgeten så att skicklighetskoden kan ha tillgång till information som skickas från gadgeten.
Att etablera detta flöde tillåter skapar ett mycket kraftfullt verktyg eftersom billiga prylar kan ha förmågan att kommunicera med kod i molnet och svara på röstkommandon med några av de bästa röstigenkänningar som finns.
Det bör noteras att de flesta färdigheter tillåter olika sätt att interagera med dem. Till exempel kan en användare hoppa rakt in i en avsikt genom att säga "Alexa, fråga min anpassade avståndsberäknare vad avståndet är mellan LAX och JFK" (kallas en one-shot-anrop) eller så kan de helt enkelt använda en lanseringsavsikt: "Alexa, öppna min anpassade avståndsräknare ". Detta sista exempel följs vanligtvis av att Alexa svarar med en uppmaning om mer information. Denna handledning utesluter avsiktligt stöd för den senare. Mer specifikt, utan att modifiera Lambda-funktionen, kan du bara åkalla färdigheten med hjälp av ett enda skott. Det här designvalet gör att modellen kan vara enklare (behöver inte stödja lanseringsavsikter eller konversationsflöde), och jag har funnit att jag vanligtvis vill interagera med mina prylar med hjälp av one-shot-påkallelser ändå eftersom de vanligtvis är snabbare.
Steg 2: Registrera gadgeten på Alexa Voice Service Developer Console
Följande är en beskrivning av de steg som behövs. Jag har skapat en likvärdig video som visar hur man gör alla dessa steg. Du kan använda antingen eller båda för att slutföra detta steg.
- Navigera till
- Om du inte redan har ett gratis konto, gör ett
- Klicka på "Produkter"
- Fyll i etiketter och välj "Alexa Gadget"
- Fyll i vad du vill för resten av fälten
- Klicka på Slutför
Steg 3: Skapa AWS Lambda -funktion och anpassad skicklighet
Skapa anpassad skicklighet på utvecklarkonsolen för Alexa Skills Kit
Kod för denna handledning hittar du här
Innan du slutför detta steg måste du skapa en.zip -fil som innehåller distributionspaketet för AWS Lambda -funktionen som visas i självstudien här.
- Ladda ner mappen "lambda" från min Github som innehåller "lambda_function.py" och "requirements.txt"
- Öppna terminalen och ändra den aktuella katalogen så att den finns i den här mappen.
- Kör följande sekvens:
pip installera -r krav.txt -t skill_env
cp lambda_function.py skill_env cd skill_env zip -r../../skill-code.zip
Din.zip-fil kommer nu att finnas i katalogen där lambda-mappen var och kommer att kallas "skill-code.zip".
En anteckning om kostnaden för hosting på AWS: Denna handledning kräver att du har ett AWS -konto (gratis att skapa). Lambda -funktioner kostar dock pengar, men deras nuvarande prissättning i N. Virginia -regionen är $ 0.000000208 per 100 ms användning med 128 MB minne. För referens, varje anrop av min skicklighet räknar cirka 800 ms användning på denna nivå. För att få en räkning på $ 1,00USD måste du åberopa den här funktionen cirka 600 000 gånger vilket (om det tar dig 5 sekunder per anrop) skulle ta dig över 34 dagar utan att behöva ringa din funktion. Kostnaden bör inte vara en betydande fråga om du inte publicerar din skicklighet och ett stort antal människor börjar använda den. Om du är orolig för att få räkningar på AWS, överväg att konfigurera användarlarm som meddelar dig om användningen passerar ett definierat tröskelvärde.
Följande är en beskrivning av de steg som behövs. Jag har skapat en likvärdig video som visar hur man gör alla dessa steg. Du kan använda antingen eller båda för att slutföra detta steg.
- Navigera till https://aws.amazon.com/ och logga in på konsolen eller skapa ett gratis konto om du inte har ett
- Sök efter och klicka på Lambda under tjänster
- Klicka på "Skapa funktion"
- Välj "Author from scratch", ge det ett namn och välj den senaste Python 3 -versionen för körning
- Ändra "redigera kod inline" till "ladda upp en.zip -fil" och välj den.zip -fil som skapats ovan
- I ett nytt fönster navigerar du till https://developer.amazon.com/alexa/console/ask och loggar in
- Klicka på "Skapa skicklighet"
- Märk den, välj "Anpassad" modell och "Tillhandahåll din egen" och klicka på "Skapa skicklighet"
- Klicka på "Starta från början" och klicka på "Välj"
- Klicka på "Lägg till" under "Avsikter"
- Skapa en anpassad avsikt som kallas "alexa_to_pi" och fyll i "skriv {person}" som ett exempeluttalande
- Gör en avsiktsplats som heter "person" med typen "AMAZON. Person"
- Skapa en anpassad avsikt som heter "pi_to_alexa" och fyll i "kontrollera temperaturen från sensorn {sensor_num}
- Gör en avsiktsplats som heter "sensor_num" med typen "AMAZON. NUMBER"
- Under gränssnitt, aktivera "Custom Interface Controller"
- Under Endpoint väljer du "AWS Lambda ARN" och kopierar "Ditt skicklighets -ID"
- Navigera tillbaka till AWS -konsolen
- Klicka på "Lägg till utlösare"
- Välj "Alexa Skills Kit", markera "Aktivera" under Skill ID -verifiering, klistra in Skill ID som du just kopierade och klicka på lägg till
- Kopiera Lambda ARN i det övre högra hörnet
- Navigera tillbaka till Alexa Developer Console och klistra in Lambda ARN i fältet "Standardregion"
- Under kallelse, ställ in Skill Invocation Name till "min gadget"
- Klicka på "Spara modell" och sedan "Bygg modell"
- Klicka på "Testa" i de översta flikarna och ändra väljaren från "Av" till "Utveckling"
- Observera att loggar för Lambda -funktionen finns i "CloudWatch" -tjänsten på AWS.
Steg 4: Ställ in koden på din Raspberry Pi
För att din Raspberry Pi ska kunna kommunicera med Alexa -enheten behöver den lite kod för att underlätta överföring av information via bluetooth och bibehålla den anslutningen, förutom några andra filer. Det enklaste sättet att komma igång med de mest uppdaterade filerna från Amazon är att klona deras Raspberry Pi Gadgets-arkiv. Navigera till katalogen för ditt nuvarande projekt och kör
git-klon
Detta kommer att ladda hela deras förråd med all nödvändig kod på din Pi. Den har några exempelprojekt som visar upp några av funktionerna hos Alexa Gadgets. Om du vill ha mer information kan du läsa mer på deras Github -sida.
Kör deras installationsfunktion för att få allt konfigurerat.
cd/home/pi/Alexa-Gadgets-Raspberry-Pi-Samples
sudo python3 launch.py --setup
Följ anvisningarna och svara "y" när du blir tillfrågad om du vill konfigurera med hjälp av dina gadgetuppgifter. Kom ihåg Amazon -ID och Gadget Secret från att konfigurera din gadget på utvecklarkonsolen eftersom det kommer att bli ombedd här. Jag valde "bt" överföringsläge för min Raspberry Pi Zero W. BLE stöds inte av alla äldre Echo -enheter, men du kan leta upp vad din hårdvara kan. Om du använder din Pi i skrivbordsläge rekommenderar Amazon att högerklicka på Bluetooth-ikonen högst upp till höger och klicka på "Ta bort" Bluetooth "från panelen" för att undvika anslutningsproblem.
Obs! Det här steget kan ta ett tag beroende på hur mycket som måste installeras.
Nu har du alla nödvändiga supportfiler för att gå tillbaka till ditt projekt och börja lägga till funktioner för att möjliggöra kommunikation med ditt eko.
Om du väljer kan du ta bort mappen "exempel" i "Alexa-Gadgets-Raspberry-Pi-Samples/src"
Du kan ha din projektkod var du vill, men jag gör en mapp i hemkatalogen för den, alternativt kan du ladda ner mappen med koden från min Github, var noga med att redigera.ini -filerna enligt beskrivningen nedan.
cd /home /pi
mkdir my_project cd my_project touch my_gadget.py touch my_gadget.ini
Jag har nu skapat två filer i en mapp som heter "mitt_projekt".. Ini -filen är viktig. Var säker på att den innehåller följande och ersätt i ditt Amazon -ID och Gadget Secret:
[GadgetSettings]
amazonId = INSERT_AMAZON_ID_HERE alexaGadgetSecret = INSERT_ALEXA_GADGET_SECRET_HERE [GadgetCapabilities] Custom. MyGadget = 1.0
Låt oss nu titta på python -filen innan vi går in på detaljerna:
importera json
från agt importera AlexaGadget
klass MyGadget (AlexaGadget):
def _init _ (själv):
super ()._ init _ ()
def on_custom_mygadget_alexatopi (själv, direktiv):
nyttolast = json.loads (directive.payload.decode ("utf-8")) print ("Mottagna data:" + str (nyttolast)) write_text (str (nyttolast ['data'] ['person'] ['värde '])))
def on_custom_mygadget_pitoalexa (själv, direktiv):
nyttolast = json.loads (directive.payload.decode ("utf-8")) print ("Mottagna data:" + str (nyttolast)) nyttolast = {'data': "Sonden läser" + str (get_temp (nyttolast) ['data'] ['sensor_num'] ['värde'])) + "grader."} self.send_custom_event ('Custom. MyGadget', 'PiToAlexa', nyttolast) MyGadget (). main ()
Först kommer du att märka att det kallar två funktioner: write_text () och get_temp (). I min kod definierar jag dessa funktioner i samma fil, men de är beroende av min hårdvara så jag har valt att utelämna dem. Jag har bifogat den här filen med de funktionerna definierade för att bara skriva ut och returnera dummy -data om du vill köra den exakta koden. Jag föreslår att du testar med denna exakta kod innan du ändrar den för att fungera med ditt projekt. Jag har också bifogat.ini -filen, men se till att du går in och ändrar ID och gadgethemlighet. Den översta funktionen tar emot data som skickas in från Alexa. Den nedre funktionen tar emot data i samma format, men Alexa -enheten väntar i fem sekunder på att en händelse ska skickas tillbaka med sin egen nyttolast. Denna nyttolast är speciell genom att Alexa -enheten talar innehållet.
När du har dessa filer navigerar du till "my_project" -mappen och kör pythonfilen.
sudo starta om
cd/home/pi/my_project sudo python3./my_gadget.py
Om det här är första gången du kör programmet måste du koppla det till din Echo -enhet. Se till att din Echo -enhet är nära Raspberry Pi, eftersom vi måste tillåta en Bluetooth -anslutning.
Klicka på "enheter" i nedre högra hörnet i Alexa -appen på din mobila enhet.
Klicka på "Echo & Alexa" längst upp till vänster.
Klicka på din Echo -enhet.
Under "TRÅDLÖS" trycker du på "Bluetooth -enheter".
Tryck på "KOPPLA EN NY ENHET" så ska du se din gadget på listan.
Klicka på din gadget. Du bör se Pi -rapporten att den lyckades para ihop.
Medan du tittar på utmatningen på din Pi, försök ge ett röstkommando till Echo:
Du: "Alexa, be min gadget att kontrollera temperaturen från sensor ett"
Om allt fungerade korrekt borde du höra:
Eko: "Sonden läser 120.505 grader."
Du: "Alexa, berätta för min pryl att skriva George Washington."
Pi ska skriva ut:
Mottagna data: {'data': {'person': {'name': 'person', 'value': 'George Washington', 'confirmStatus': 'NONE'}}}
George Washington"
Steg 5: Förpackning
Videon som visas här är ett exempel på gadgeten som arbetar med att läsa temperaturen (samma sond i F mot C) och skriva namn till en enkel display.
Nu när du förhoppningsvis har något som fungerar, bör du försöka gå och anpassa detta för att göra ditt eget projekt mer kapabelt. Kom ihåg att du enkelt kan redigera avsikterna i Alexa Developer Console och att alla platser du använder kommer att skickas till din Pi i nyttolasten. Dessutom kan du få Alexa att säga vad du vill genom att bara redigera nyttolasten du skickar tillbaka i händelsen från din Raspberry Pi -kod.
Observera att denna handledning inte är avsedd att vara en slutlig lösning för alla funktioner du kan önska dig med en Alexa Gadget. Det är avsiktligt begränsat att ge dig två enkla funktioner för att skicka data i varje riktning mellan Alexa och en gadget. Om du är intresserad av att bygga mer sofistikerade interaktionsmodeller, skulle jag uppmuntra dig att läsa alla readme-filer i https://github.com/alexa/Alexa-Gadgets-Raspberry-P… och prova alla exempel de ger. Jag skulle också föreslå att du läser dokumentationen för Alexa Gadgets Toolkit och Alexa Skills Kit.
Rekommenderad:
Lägg till Aux till Sonos med Raspberry Pi: 26 steg (med bilder)
Lägg till Aux till Sonos med Raspberry Pi: Jag har alltid varit fascinerad av Raspberry Pi men har aldrig haft ett riktigt behov av en förrän nu. Vi har tre Sonos -komponenter i vårt hus: En Play 5 i vardagsrummet, en Play 3 i sovrummet och en Sonos CONNECT: AMP som driver utomhushögtalare på våra
Lägg till en WIZ820io / USR -ES1 - Wiznet W5500 nätverksport till din Raspberry Pi: 10 steg
Lägg till en WIZ820io / USR -ES1 - Wiznet W5500 nätverksport till din Raspberry Pi .: Dels på grund av mitt intresse för att göra något sådant, och delvis på grund av mitt intresse för Codesys har jag haft det i tankarna ett tag nu att försök att ansluta en andra nätverksgränssnittsport till en Raspberry Pi. Så medan jag gjorde andra projekt har jag varit
Lägg till anpassad funktion i Google Kalkylark: 5 steg
Lägg till anpassad funktion i Google Kalkylark: Jag är säker på att du någon gång i ditt liv måste använda kalkylprogram som Microsoft Excel eller Google Kalkylark. De är relativt enkla och raka att använda men också mycket kraftfulla och lätt utdragbara. Idag kommer vi att titta på Goo
Lägg till en strömknapp till din LibreELEC -installation på en Raspberry Pi: 6 steg
Lägg till en strömknapp till din LibreELEC -installation på en Raspberry Pi: I det följande lär vi oss hur du lägger till en strömknapp till LibreELEC som körs på en Raspberry Pi. Vi kommer att använda en PowerBlock för att inte bara lägga till en strömknapp, utan också en status -LED som indikerar strömstatus för din LibreELEC -installation. För dessa
Lägg till Adafruit's Ring LED Momentary Switch till Raspberry Pi: 3 steg (med bilder)
Lägg till Adafruit's Ring LED Momentary Switch till Raspberry Pi: Som en del av mitt sladdskärningssystem vill jag ha en strömindikator och en återställningsbrytare på ett Raspberry Pi-baserat mediecenter som kör Kodi på OSMC.Jag har provat flera olika momentana switchar. Adafruits robusta metallknapp med blå LED är väldigt cool.