Inhoudsopgave:

Aangepaste Alexa-besturing toevoegen aan Raspberry Pi Project - Ajarnpa
Aangepaste Alexa-besturing toevoegen aan Raspberry Pi Project - Ajarnpa

Video: Aangepaste Alexa-besturing toevoegen aan Raspberry Pi Project - Ajarnpa

Video: Aangepaste Alexa-besturing toevoegen aan Raspberry Pi Project - Ajarnpa
Video: Wifi Relais met Python Gui 2024, Juli-
Anonim
Aangepaste Alexa-besturing toevoegen aan Raspberry Pi Project
Aangepaste Alexa-besturing toevoegen aan Raspberry Pi Project

Dit project is bedoeld voor iedereen die een Raspberry Pi-project heeft dat Python gebruikt en spraakbesturing wil toevoegen via hun bestaande Amazon Echo-apparaten. U hoeft geen ervaren programmeur te zijn, maar u moet vertrouwd zijn met het gebruik van de opdrachtregel en het aanpassen van bestaande code aan uw behoeften.

Ik begon in eerste instantie aan een project om mijn Raspberry Pi spraakgestuurd te maken met Alexa, zodat hij water in een waterkoker tot een bepaalde temperatuur kon verwarmen. Hoewel de interactie die ik wilde vrij eenvoudig was (één nummer doorgeven van Alexa aan de Raspberry Pi), kostte het veel werk om vanuit de bestaande tutorials in die staat te komen. Ik hoop dat deze tutorial dat proces voor anderen zo snel mogelijk zal maken.

In mijn voorbeeld begin ik met een Raspberry Pi Zero W met Raspbian. Ik heb een Python3-programma op mijn Pi dat tekst kan schrijven naar een SPI-display, en ik heb een thermometersonde die ik kan lezen. Voor jou kan dit programma bijna alles zijn, maar het idee is dat je misschien een aantal invoerapparaten hebt die je via Alexa wilt lezen en/of een aantal uitvoerapparaten die je wilt bedienen met Alexa.

Het doel is om van een basisprogramma zoals hierboven beschreven naar een apparaat te gaan dat je eenvoudig kunt bedienen met mijn Echo. Ervan uitgaande dat u deze hardware al heeft, zou dit project u geen geld moeten kosten. Uiteindelijk kom je op het punt dat je dingen kunt zeggen als:

Ik: "Alexa, vraag mijn gadget om de temperatuur op sensor 1 te controleren."

Alexa's reactie: "De sonde leest 72,31 graden."

of

Ik: "Alexa, vertel mijn gadget om George Washington te schrijven"

Reactie: op het display dat op mijn Raspberry Pi is aangesloten, staat nu "George Washington"

In de volgende sectie zal ik beschrijven wat er achter de schermen moet gebeuren om dit te laten werken. Als je dit gewoon aan je project wilt laten werken en het je niet uitmaakt hoe het werkt, kun je het gerust overslaan (hoewel het misschien moeilijker wordt als er iets misgaat).

Stap 1: Achtergrond

Achtergrond
Achtergrond

In deze afbeelding (credit: https://developer.amazon.com/en-US/docs/alexa/alex… zien we de algemene architectuur voor de Alexa Gadgets.

Wanneer je iets tegen je Echo-apparaat zegt, stuurt het de audio naar de Alexa Cloud, waar het wordt verwerkt en waar een reactie wordt gegenereerd om op je te reageren. Als je vraagt wat voor weer het is, zijn het alleen deze twee in communicatie. Stel nu dat je spraakbesturing wilt toevoegen aan een van je kleine projecten op een Raspberry Pi. Om alles aan boord te verwerken, zou aanzienlijke hardware en een zeer geavanceerde codebase nodig zijn om dingen op gang te krijgen. Een betere oplossing zou zijn om gebruik te maken van de Alexa Cloud, die zeer geavanceerd is en erg goed is geworden in het omgaan met complexe spraakpatronen. Alexa Gadgets bieden een goede manier om dit te doen.

Een Alexa Gadget communiceert met een Echo-apparaat via bluetooth. Zodra deze verbinding tot stand is gebracht, geven de twee elkaar berichten door met UTF-8-codering. Wanneer de Echo iets aan de gadget doorgeeft, wordt dit een richtlijn genoemd. De andere richting wordt een gebeurtenis genoemd. Voordat we ingaan op de exacte stroom van dit alles, moeten we een ander belangrijk element introduceren: aangepaste Alexa Skills.

Met Alexa kunnen ontwikkelaars hun eigen aangepaste vaardigheden creëren, waardoor ze hun eigen interacties en gedrag kunnen ontwerpen voor gebruik op alle Echo-apparaten. Een ontwikkelaar kan bijvoorbeeld een aangepaste vaardigheid maken om u de afstand tussen twee luchthavens in de VS te vertellen. Een gebruiker zou zeggen: "Alexa, vraag mijn aangepaste afstandscalculator wat de afstand is tussen LAX en JFK" en het zou kunnen antwoorden met "2475 mijl". Hoe doet het dit? Wanneer een ontwikkelaar een aangepaste vaardigheid maakt, definiëren ze wat 'aangepaste intenties' worden genoemd met 'voorbeelduitingen' die 'slots' bevatten. In deze vaardigheid kan ik bijvoorbeeld de bedoeling hebben "calc_dist" om de afstand tussen twee punten te berekenen. Een voorbeelduiting zou zijn "wat de afstand is tussen {slot1} en {slot2}" of "hoe ver tussen {slot1} en {slot2}". De sleuven die tussen haakjes worden weergegeven, hebben specifieke typen. In dit geval zijn dat luchthavencodes zoals LAX, JFK, BOS, ATL. Wanneer een gebruiker om de aangepaste vaardigheid vraagt, probeert de Alexa Cloud wat de gebruiker zegt te matchen met een aangepaste intentie met behulp van de meegeleverde voorbeelduitingen en probeert geldige slotwaarden voor dat verzoek te vinden. In dit voorbeeld zou de gebruiker de intentie "calc_dist" willen hebben en dat slot1 LAX is en slot2 JFK. Op dit punt geeft de Alexa Cloud het werk door aan de eigen code van de ontwikkelaar. Kortom, het vertelt de ontwikkelaarscode welke intentie het heeft ontvangen en wat alle slotwaarden waren, naast andere details.

De ontwikkelaar mag beslissen waar hun code zich bevindt, maar een zeer populaire optie is om een AWS Lambda-functie te gebruiken. Als u niet weet wat dat is, is het in wezen een service waarmee u code kunt uploaden die op elk moment kan worden uitgevoerd en die u vervolgens alleen in rekening brengt voor de tijd dat uw code wordt uitgevoerd. Als we doorgaan met ons voorbeeld, kan de code van de ontwikkelaar een Python-functie zijn die de twee luchthavencodes ontvangt, hun locaties opzoekt, de afstanden berekent en vervolgens een reactie terugstuurt naar de Alexa Cloud om iets tegen de gebruiker te zeggen. De Alexa Cloud zou die spraakinformatie vervolgens terugsturen naar het apparaat van de gebruiker en zij zouden het antwoord krijgen.

Nu kunnen we terug naar de gadget. We kunnen aangepaste vaardigheden creëren die zijn ontworpen om specifiek met gadgets te werken. Een ontwikkelaar kan een vaardigheid schrijven die een instructie stuurt naar een aangesloten gadget. Die richtlijn heeft een nuttige lading die kan worden gebruikt, maar die de gadget nodig heeft. Die vaardigheid kan ook een instructie sturen en vervolgens luisteren naar een gebeurtenis van de gadget, zodat de vaardigheidscode toegang heeft tot informatie die door de gadget wordt verzonden.

Door deze stroom tot stand te brengen, wordt een zeer krachtig hulpmiddel gecreëerd, omdat goedkope gadgets de mogelijkheid kunnen hebben om met code in de cloud te communiceren en te reageren op spraakopdrachten met behulp van enkele van de beste beschikbare spraakherkenning.

Opgemerkt moet worden dat de meeste vaardigheden verschillende manieren van interactie mogelijk maken. Een gebruiker kan bijvoorbeeld meteen in een intentie springen door te zeggen "Alexa, vraag mijn aangepaste afstandscalculator wat de afstand is tussen LAX en JFK" (een eenmalige aanroep genoemd) of ze kunnen gewoon een startintentie gebruiken: "Alexa, open mijn aangepaste afstandscalculator". Dit laatste voorbeeld wordt meestal gevolgd door Alexa die reageert met een vraag om meer informatie. In deze tutorial wordt met opzet ondersteuning voor de laatste weggelaten. Meer specifiek, zonder de Lambda-functie te wijzigen, kun je de vaardigheid alleen aanroepen met een eenmalige aanroep. Door deze ontwerpkeuze kan het model eenvoudiger zijn (hoeft geen lanceringsintenties of gespreksstroom te ondersteunen), en ik heb gemerkt dat ik meestal toch met mijn gadgets wil communiceren door middel van eenmalige aanroepingen, omdat ze meestal sneller zijn.

Stap 2: Registreer de gadget op de Alexa Voice Service Developer Console

Hieronder volgt een beschrijving van de benodigde stappen. Ik heb een gelijkwaardige video gemaakt die laat zien hoe al deze stappen moeten worden uitgevoerd. U kunt een van beide of beide gebruiken om deze stap te voltooien.

  1. Navigeer naar
  2. Als je nog geen gratis account hebt, maak er dan een
  3. Klik op "Producten"
  4. Vul labels in en selecteer "Alexa Gadget"
  5. Vul voor de rest van de velden in wat je wilt
  6. Klik op Voltooien

Stap 3: Maak een AWS Lambda-functie en aangepaste vaardigheid

Maak een aangepaste vaardigheid op de Alexa Skills Kit-ontwikkelaarsconsole

Code voor deze tutorial is hier te vinden

Voordat u deze stap voltooit, moet u een.zip-bestand maken dat het implementatiepakket voor de AWS Lambda-functie bevat, zoals weergegeven in de zelfstudie hier.

  1. Download de map "lambda" van mijn Github die "lambda_function.py" en "requirements.txt" bevat
  2. Open de terminal en wijzig de huidige map in deze map.
  3. Voer de volgende reeks uit:

pip install -r requirements.txt -t skill_env

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

Uw.zip-bestand bevindt zich nu in de map waar de lambda-map stond en zal "skill-code.zip" heten.

Een opmerking over de kosten van hosting op AWS: deze tutorial vereist dat je een AWS-account hebt (gratis te maken). Lambda-functies kosten geld, maar hun huidige prijs in de regio N. Virginia is $ 0,000000208 per 100 ms gebruik met 128 MB geheugen. Ter referentie: elke aanroep van mijn vaardigheid kost ongeveer 800 ms aan gebruik op dit niveau. Om een rekening van $ 1,00 USD te verdienen, zou u deze functie ongeveer 600.000 keer moeten aanroepen, wat (als het u 5 seconden per aanroep kost) meer dan 34 dagen zou kosten om uw functie non-stop te bellen. De kosten zouden geen groot probleem moeten zijn, tenzij u uw vaardigheid publiceert en een groot aantal mensen het gaat gebruiken. Als u zich zorgen maakt over het ontvangen van facturen op AWS, overweeg dan om gebruiksalarmen in te stellen die u waarschuwen als het gebruik een bepaalde drempel overschrijdt.

Hieronder volgt een beschrijving van de benodigde stappen. Ik heb een gelijkwaardige video gemaakt die laat zien hoe je al deze stappen kunt uitvoeren. U kunt een van beide of beide gebruiken om deze stap te voltooien.

  1. Navigeer naar https://aws.amazon.com/ en log in op de console of maak een gratis account aan als je er nog geen hebt
  2. Zoek en klik op Lambda onder services
  3. Klik op "Functie maken"
  4. Selecteer "Author from scratch", geef het een naam en kies de nieuwste Python 3-versie voor runtime
  5. Wijzig "code inline bewerken" in "upload een.zip-bestand" en selecteer het.zip-bestand dat hierboven is gemaakt
  6. Navigeer in een nieuw venster naar https://developer.amazon.com/alexa/console/ask en log in
  7. Klik op "Vaardigheid maken"
  8. Label het, kies "Aangepast" model en "Voorzie je eigen" en klik op "Vaardigheid maken"
  9. Klik op "Van nul beginnen" en klik op "Kiezen"
  10. Klik onder "Intenties" op "Toevoegen"
  11. Maak een aangepaste intentie met de naam "alexa_to_pi" en vul "write {person}" in als voorbeelduiting
  12. Maak een intentie-slot met de naam "person" met het type "AMAZON. Person"
  13. Maak een aangepaste intentie met de naam "pi_to_alexa" en vul in "controleer de temperatuur van sensor {sensor_num}
  14. Maak een intentie-slot genaamd "sensor_num" met het type "AMAZON. NUMBER"
  15. Schakel onder Interfaces "Custom Interface Controller" in
  16. Selecteer onder Endpoint "AWS Lambda ARN" en kopieer de "Your Skill ID"
  17. Navigeer terug naar de AWS-console
  18. Klik op "Trigger toevoegen"
  19. Selecteer "Alexa Skills Kit", vink "Inschakelen" aan onder Skill ID-verificatie, plak de Skill ID die u zojuist hebt gekopieerd en klik op toevoegen
  20. Kopieer de Lambda ARN in de rechterbovenhoek
  21. Navigeer terug naar de Alexa Developer Console en plak de Lambda ARN in het veld "Default Region"
  22. Stel onder Invocation de Skill Invocation Name in op 'mijn gadget'
  23. Klik op "Model opslaan" en vervolgens op "Model bouwen"
  24. Klik op "Test" in de bovenste tabbladen en verander de selector van "Uit" naar "Ontwikkeling"
  25. Merk op dat logs voor de Lambda-functie te vinden zijn in de "CloudWatch"-service op AWS.

Stap 4: Stel de code in op uw Raspberry Pi

Om je Raspberry Pi te laten communiceren met het Alexa-apparaat, heeft hij naast een paar andere bestanden wat code nodig om informatie via bluetooth door te geven en die verbinding te onderhouden. De eenvoudigste manier om met de meest actuele bestanden van Amazon aan de slag te gaan, is door hun Raspberry Pi Gadgets-repository te klonen. Navigeer naar de map van uw huidige project en voer. uit

git kloon

Hiermee wordt hun hele repository met alle benodigde code op je Pi geladen. Het heeft enkele voorbeeldprojecten die enkele van de mogelijkheden van Alexa Gadgets laten zien. Als je meer informatie wilt, bekijk dan de readme op hun Github-pagina.

Voer hun setup-functie uit om alles geconfigureerd te krijgen.

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

sudo python3 launch.py --setup

Volg de aanwijzingen en antwoord "y" wanneer u wordt gevraagd of u wilt configureren met uw Gadget-inloggegevens. Roep de Amazon-ID en het gadgetgeheim op van het instellen van uw gadget op de ontwikkelaarsconsole, aangezien hier om wordt gevraagd. Ik koos voor de "bt"-transmissiemodus voor mijn Raspberry Pi Zero W. BLE wordt niet door alle oudere Echo-apparaten ondersteund, maar je kunt opzoeken waar je hardware toe in staat is. Als je je Pi in Desktop-modus gebruikt, raadt Amazon aan om met de rechtermuisknop op het Bluetooth-pictogram in de rechterbovenhoek te klikken en op "Bluetooth" uit paneel verwijderen" te klikken om verbindingsproblemen te voorkomen.

Opmerking: deze stap kan even duren, afhankelijk van hoeveel er moet worden geïnstalleerd.

Nu heb je alle benodigde ondersteuningsbestanden om terug te gaan naar je project en de functies toe te voegen om communicatie met je Echo mogelijk te maken.

Als u ervoor kiest, kunt u de map "voorbeelden" in "Alexa-Gadgets-Raspberry-Pi-Samples/src" verwijderen

Je kunt je projectcode hebben waar je maar wilt, maar ik zal er een map voor maken in de homedirectory, of je kunt de map met de code downloaden van mijn Github, zorg er wel voor dat je de.ini-bestanden bewerkt zoals hieronder beschreven.

cd /home/pi

mkdir mijn_project cd mijn_project touch my_gadget.py touch my_gadget.ini

Ik heb nu twee bestanden gemaakt in een map met de naam "my_project". Het.ini-bestand is belangrijk. Zorg ervoor dat het het volgende bevat en vervang het in je Amazon ID en Gadget Secret:

[Gadget-instellingen]

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

Laten we nu het python-bestand eens bekijken voordat we ingaan op de details:

import json

van agt import AlexaGadget

klasse MyGadget (AlexaGadget):

def _init_(zelf):

super()._init_()

def on_custom_mygadget_alexatopi(zelf, richtlijn):

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

def on_custom_mygadget_pitoalexa(zelf, richtlijn):

payload = json.loads(directive.payload.decode("utf-8")) print("Ontvangen data: " + str(payload)) payload = {'data': "De probe leest " + str(get_temp(payload) ['data'] ['sensor_num']['value'])) + " graden."} self.send_custom_event('Custom. MyGadget', 'PiToAlexa', payload) MyGadget().main()

Eerst zul je merken dat het twee functies aanroept: write_text() en get_temp(). In mijn code definieer ik deze functies in hetzelfde bestand, maar ze zijn afhankelijk van mijn hardware, dus ik heb ervoor gekozen ze weg te laten. Ik heb dit bestand bijgevoegd met de functies die zijn gedefinieerd om alleen dummy-gegevens af te drukken en terug te sturen voor het geval u deze exacte code wilt uitvoeren. Ik zou willen voorstellen om met deze exacte code te testen voordat u deze aanpast om met uw project te werken. Ik heb ook het.ini-bestand bijgevoegd, maar zorg ervoor dat je naar binnen gaat en de ID en het gadgetgeheim wijzigt. De topfunctie ontvangt gegevens die zijn doorgegeven van de Alexa. De onderste functie ontvangt gegevens in hetzelfde formaat, maar het Alexa-apparaat wacht vijf seconden totdat een gebeurtenis wordt doorgegeven met zijn eigen payload. Deze payload is speciaal omdat het Alexa-apparaat de inhoud ervan uitspreekt.

Zodra u deze bestanden hebt, navigeert u naar de map "my_project" en voert u het python-bestand uit.

sudo reboot

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

Als dit de eerste keer is dat u het programma uitvoert, moet u het koppelen aan uw Echo-apparaat. Zorg ervoor dat uw Echo-apparaat zich in de buurt van de Raspberry Pi bevindt, omdat we een Bluetooth-verbinding moeten toestaan.

Klik in de Alexa-app op je mobiele apparaat op 'apparaten' in de rechterbenedenhoek.

Klik linksboven op "Echo & Alexa".

Klik op uw Echo-apparaat.

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

Tik op "EEN NIEUW APPARAAT KOPPELEN" en je gadget zou in de lijst moeten verschijnen.

Tik op je gadget. U zou het Pi-rapport moeten zien dat het succesvol is gekoppeld.

Terwijl je naar de uitvoer op je Pi kijkt, probeer je een spraakopdracht aan de Echo te geven:

Jij: "Alexa, vraag mijn gadget om de temperatuur van sensor één te controleren"

Als alles goed werkte, zou je moeten horen:

Echo: "De sonde leest 120,505 graden."

Jij: "Alexa, vertel mijn gadget om George Washington te schrijven."

De Pi zou moeten afdrukken:

Gegevens ontvangen: {'data': {'person': {'name': 'person', 'value': 'George Washington', 'confirmationStatus': 'NONE'}}}

George Washington"

Stap 5: Afronden

De video die hier wordt getoond, is een voorbeeld van het gadget dat werkt met het lezen van de temperatuur (dezelfde sonde in F versus C) en het schrijven van namen naar een eenvoudig display.

Nu je hopelijk iets hebt dat werkt, moet je proberen dit aan te passen om je eigen project capabeler te maken. Onthoud dat je de intenties eenvoudig kunt bewerken in de Alexa Developer Console en dat alle slots die je gebruikt, worden doorgegeven aan je Pi in de payload. Bovendien kun je Alexa alles laten zeggen wat je maar wilt door gewoon de payload te bewerken die je teruggeeft in het geval van je Raspberry Pi-code.

Houd er rekening mee dat deze tutorial niet bedoeld is als de definitieve oplossing voor alle mogelijkheden die je zou willen met een Alexa Gadget. Het is opzettelijk beperkt om u twee eenvoudige functies te geven voor het doorgeven van gegevens in elke richting tussen Alexa en een gadget. Als je geïnteresseerd bent in het bouwen van meer geavanceerde interactiemodellen, raad ik je aan om alle leesmij-bestanden in https://github.com/alexa/Alexa-Gadgets-Raspberry-P te lezen en alle voorbeelden te proberen die ze bieden. Ik zou ook willen voorstellen dat je de documentatie voor de Alexa Gadgets Toolkit en de Alexa Skills Kit leest.

Aanbevolen: