Spisu treści:

Dodaj niestandardową kontrolę Alexa do projektu Raspberry Pi: 5 kroków
Dodaj niestandardową kontrolę Alexa do projektu Raspberry Pi: 5 kroków

Wideo: Dodaj niestandardową kontrolę Alexa do projektu Raspberry Pi: 5 kroków

Wideo: Dodaj niestandardową kontrolę Alexa do projektu Raspberry Pi: 5 kroków
Wideo: JetHome JetHub H1 kontroler inteligentnego domu, instalacja Supervised Home Assistant, zigbee2mqtt 2024, Lipiec
Anonim
Dodaj niestandardową kontrolę Alexa do projektu Raspberry Pi
Dodaj niestandardową kontrolę Alexa do projektu Raspberry Pi

Ten projekt jest przeznaczony dla każdego, kto ma projekt Raspberry Pi używający Pythona, który chce dodać sterowanie głosowe za pośrednictwem istniejących urządzeń Amazon Echo. Nie musisz być doświadczonym programistą, ale powinieneś swobodnie korzystać z wiersza poleceń i dostosowywać istniejący kod do swoich potrzeb.

Początkowo zacząłem projekt, aby umożliwić sterowanie głosem mojego Raspberry Pi za pomocą Alexy, aby mógł podgrzać wodę w czajniku do określonej temperatury. Chociaż interakcja, której chciałem, była dość prosta (przekaż jeden numer z Alexy do Raspberry Pi), zajęło mi dużo pracy, aby uzyskać ten stan z istniejących samouczków. Mam nadzieję, że ten samouczek sprawi, że ten proces będzie jak najszybszy dla innych.

W moim przykładzie zaczynam od Raspberry Pi Zero W z Raspbianem. Mam program Python3 na moim Pi, który jest w stanie zapisywać tekst na wyświetlaczu SPI, i mam sondę termometru, którą mogę odczytać. Dla ciebie ten program może być prawie wszystkim, ale pomysł jest taki, że możesz mieć urządzenia wejściowe, które chcesz czytać za pośrednictwem Alexy i/lub niektóre urządzenia wyjściowe, którymi chcesz sterować za pomocą Alexy.

Celem jest przejście z podstawowego programu, takiego jak ten opisany powyżej, do urządzenia, którym można łatwo sterować za pomocą mojego Echo. Zakładając, że masz już ten sprzęt, ten projekt nie powinien Cię kosztować. W końcu dojdziesz do momentu, w którym będziesz mógł powiedzieć takie rzeczy jak:

Ja: „Alexa, poproś mój gadżet o sprawdzenie temperatury na czujniku 1.”

Odpowiedź Alexy: „Sonda odczytuje 72,31 stopnia”.

lub

Ja: „Alexa, powiedz mojemu gadżetowi, żeby napisał George Washington”

Odpowiedź: Wyświetlacz podłączony do mojego Raspberry Pi wyświetla teraz „George Washington”

W następnej sekcji opiszę, co musi się wydarzyć za kulisami, aby to zadziałało. Jeśli chcesz, aby to zadziałało w swoim projekcie i nie obchodzi Cię, jak to działa, możesz to pominąć (chociaż może to utrudnić, jeśli coś pójdzie nie tak).

Krok 1: Tło

Tło
Tło

Na tym obrazie (kredyt: https://developer.amazon.com/en-US/docs/alexa/alex… widzimy ogólną architekturę gadżetów Alexa.

Kiedy mówisz coś do urządzenia Echo, wysyła ono dźwięk do chmury Alexa, gdzie jest przetwarzany i gdzie generowana jest odpowiedź, aby odpowiedzieć. Kiedy pytasz, jaka jest pogoda, komunikują się tylko te dwie osoby. Załóżmy teraz, że chcesz dodać sterowanie głosowe do jednego ze swoich małych projektów na Raspberry Pi. Przetwarzanie wszystkiego na pokładzie wymagałoby znacznego sprzętu i bardzo wyrafinowanej bazy kodu, aby wszystko działało. Lepszym rozwiązaniem byłoby wykorzystanie chmury Alexa, która jest bardzo wyrafinowana i bardzo dobrze radzi sobie ze złożonymi wzorcami mowy. Gadżety Alexa zapewniają dobry sposób, aby to zrobić.

Gadżet Alexa komunikuje się z urządzeniem Echo za pomocą bluetooth. Po nawiązaniu tego połączenia oba przekazują sobie nawzajem komunikaty przy użyciu kodowania UTF-8. Kiedy Echo przekazuje coś do gadżetu, nazywa się to dyrektywą. Drugi kierunek nazywany jest wydarzeniem. Zanim przejdziemy do dokładnego przebiegu tego wszystkiego, powinniśmy wprowadzić kolejny kluczowy element: niestandardowe umiejętności Alexa.

Alexa pozwala programistom tworzyć własne niestandardowe umiejętności, co pozwala im projektować własne interakcje i zachowania do użytku na wszystkich urządzeniach Echo. Na przykład programista może stworzyć niestandardową umiejętność informującą o odległości między dwoma lotniskami w USA. Użytkownik powiedziałby: „Alexa, zapytaj mój niestandardowy kalkulator odległości, jaka jest odległość między LAX a JFK”, a może odpowiedzieć „2475 mil”. Jak to się robi? Kiedy programista tworzy niestandardową umiejętność, definiuje tak zwane „intencje niestandardowe” z „przykładowymi wypowiedziami” zawierającymi „sloty”. Na przykład w tej umiejętności mogę mieć zamiar "calc_dist", aby obliczyć odległość między dwoma punktami. Przykładowa wypowiedź brzmi: „jaka jest odległość między {slot1} a {slot2}” lub „jak daleko między {slot1} a {slot2}”. Szczeliny pokazane w nawiasach mają określone typy. W tym przypadku będą to kody lotnisk takie jak LAX, JFK, BOS, ATL. Gdy użytkownik prosi o niestandardową umiejętność, Alexa Cloud próbuje dopasować to, co mówi użytkownik, do niestandardowej intencji, korzystając z dostarczonych przykładowych wyrażeń i próbuje znaleźć prawidłowe wartości slotów dla tego żądania. W tym przykładzie okazałoby się, że użytkownik chciał mieć intencję „calc_dist” i że slot1 to LAX, a slot2 to JFK. W tym momencie Alexa Cloud przekazuje pracę własnemu kodowi programisty. Zasadniczo mówi programistom, jakie intencje otrzymali i jakie były wszystkie wartości slotów, między innymi.

Deweloper może zdecydować, gdzie znajduje się jego kod, ale bardzo popularną opcją jest użycie funkcji AWS Lambda. Jeśli nie wiesz, co to jest, jest to zasadniczo usługa, która pozwala przesłać kod, który można uruchomić w dowolnym momencie, a następnie pobiera opłatę tylko za czas uruchomienia kodu. Jeśli będziemy kontynuować nasz przykład, kod programisty może być funkcją Pythona, która odbiera dwa kody lotnisk, wyszukuje ich lokalizacje, oblicza odległości, a następnie wysyła odpowiedź z powrotem do Alexa Cloud, aby przekazać coś użytkownikowi. Alexa Cloud wysyłała następnie te informacje o mowie z powrotem do urządzenia użytkownika, a oni otrzymywali odpowiedź.

Teraz możemy wrócić do gadżetu. Możemy tworzyć niestandardowe umiejętności, które są zaprojektowane do pracy z gadżetami. Programista może napisać umiejętność, która wysyła dyrektywę do podłączonego gadżetu. Ta dyrektywa ma ładunek, którego można użyć, jednak jest to potrzebne gadżetowi. Ta umiejętność może również wysłać polecenie, a następnie nasłuchiwać zdarzenia z gadżetu, aby kod umiejętności miał dostęp do informacji wysyłanych z gadżetu.

Ustanowienie tego przepływu pozwala stworzyć bardzo potężne narzędzie, ponieważ niedrogie gadżety mogą komunikować się z kodem w chmurze i reagować na polecenia głosowe przy użyciu jednych z najlepszych dostępnych funkcji rozpoznawania głosu.

Należy zauważyć, że większość umiejętności pozwala na różne sposoby interakcji z nimi. Na przykład użytkownik może od razu przejść do intencji, mówiąc „Alexa, zapytaj mój niestandardowy kalkulator odległości, jaka jest odległość między LAX a JFK” (nazywane jednorazowym wywołaniem) lub może po prostu użyć intencji uruchomienia: „Alexa, otwórz mój niestandardowy kalkulator odległości . Po tym ostatnim przykładzie Alexa odpowiada, prosząc o więcej informacji. Ten samouczek celowo pomija obsługę tego drugiego. Mówiąc dokładniej, bez modyfikowania funkcji Lambda, można wywołać umiejętność tylko za pomocą jednokrotnego wywołania. Ten wybór projektu sprawia, że model jest prostszy (nie musi obsługiwać intencji uruchamiania ani przepływu konwersacji) i stwierdziłem, że zwykle i tak chcę wchodzić w interakcję z moimi gadżetami za pomocą wywołań jednorazowych, ponieważ są one zwykle szybsze.

Krok 2: Zarejestruj gadżet w konsoli programisty usługi Alexa Voice Service

Poniżej znajduje się opis niezbędnych kroków. Stworzyłem równoważny film, który pokazuje, jak wykonać wszystkie te kroki. Aby ukończyć ten krok, możesz użyć jednego lub obu.

  1. Przejdź do
  2. Jeśli nie masz jeszcze darmowego konta, załóż je
  3. Kliknij "Produkty"
  4. Wypełnij etykiety i wybierz „Alexa Gadget”
  5. Wypełnij co chcesz w pozostałych polach
  6. Kliknij Zakończ

Krok 3: Utwórz funkcję AWS Lambda i niestandardową umiejętność

Twórz niestandardowe umiejętności w konsoli programisty Alexa Skills Kit

Kod do tego samouczka można znaleźć tutaj

Przed wykonaniem tego kroku musisz utworzyć plik.zip, który zawiera pakiet wdrożeniowy dla funkcji AWS Lambda, jak pokazano w samouczku tutaj.

  1. Pobierz folder "lambda" z mojego Github, który zawiera "lambda_function.py" i "requirements.txt"
  2. Otwórz terminal i zmień bieżący katalog, aby znajdował się w tym folderze.
  3. Uruchom następującą sekwencję:

pip install -r wymagania.txt -t skill_env

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

Twój plik.zip będzie teraz znajdował się w katalogu, w którym znajdował się folder lambda i będzie nosił nazwę „skill-code.zip”.

Uwaga na temat kosztów hostingu na AWS: Ten samouczek wymaga posiadania konta AWS (do utworzenia za darmo). Funkcje lambda kosztują, jednak ich aktualna cena w regionie N. Virginia wynosi 0,000000208 USD za 100 ms użycia przy 128 MB pamięci. Dla porównania, każde wywołanie moich umiejętności kosztuje około 800 ms użytkowania na tym poziomie. Aby zebrać rachunek w wysokości 1,00 USD, musiałbyś wywołać tę funkcję około 600 000 razy, co (jeśli zajmuje ci to 5 sekund na wywołanie) zajęłoby ci ponad 34 dni ciągłego wywoływania funkcji. Koszt nie powinien być znaczącym problemem, chyba że opublikujesz swoje umiejętności i ogromna liczba osób zacznie z nich korzystać. Jeśli martwisz się o rachunki za AWS, rozważ ustawienie alarmów użytkowania, które informują Cię, jeśli użycie przekroczy określony próg.

Poniżej znajduje się opis niezbędnych kroków. Stworzyłem równoważny film, który pokazuje, jak wykonać wszystkie te kroki. Możesz użyć jednego lub obu, aby ukończyć ten krok.

  1. Wejdź na https://aws.amazon.com/ i zaloguj się do konsoli lub utwórz darmowe konto, jeśli go nie masz
  2. Wyszukaj i kliknij Lambda pod usługami
  3. Kliknij „Utwórz funkcję”
  4. Wybierz „Autor od podstaw”, nadaj mu nazwę i wybierz najnowszą wersję Pythona 3 do uruchomienia
  5. Zmień „edytuj kod inline” na „prześlij plik.zip” i wybierz plik.zip utworzony powyżej
  6. W nowym oknie przejdź do https://developer.amazon.com/alexa/console/ask i zaloguj się
  7. Kliknij „Utwórz umiejętność”
  8. Oznacz go, wybierz model „Niestandardowy” i „Dostarcz własny” i kliknij „Utwórz umiejętność”
  9. Kliknij „Rozpocznij od podstaw” i kliknij „Wybierz”
  10. W sekcji „Intencje” kliknij „Dodaj”.
  11. Utwórz niestandardową intencję o nazwie „alexa_to_pi” i wypełnij „write {person}” jako przykładową wypowiedź
  12. Utwórz boks intencji o nazwie „osoba” z typem „AMAZON. Person”
  13. Utwórz własną intencję o nazwie "pi_to_alexa" i wypełnij "sprawdź temperaturę z czujnika {sensor_num}
  14. Utwórz boks intencji o nazwie „sensor_num” z typem „AMAZON. NUMBER”
  15. W obszarze Interfejsy włącz „Niestandardowy kontroler interfejsu”
  16. W punkcie końcowym wybierz „AWS Lambda ARN” i skopiuj „Twój identyfikator umiejętności”
  17. Wróć do konsoli AWS
  18. Kliknij „Dodaj wyzwalacz”
  19. Wybierz „Alexa Skills Kit”, zaznacz „Włącz” w obszarze weryfikacji identyfikatora umiejętności, wklej właśnie skopiowany identyfikator umiejętności i kliknij dodaj
  20. Skopiuj Lambda ARN w prawym górnym rogu
  21. Przejdź z powrotem do konsoli programisty Alexa i wklej Lambda ARN w polu „Region domyślny”
  22. W sekcji Inwokacja ustaw nazwę wywołania umiejętności na „mój gadżet”
  23. Kliknij „Zapisz model”, a następnie „Zbuduj model”
  24. Kliknij „Test” w górnych zakładkach i zmień selektor z „Wyłącz” na „Rozwój”
  25. Zauważ, że logi dla funkcji Lambda znajdują się w usłudze „CloudWatch” na AWS.

Krok 4: Skonfiguruj kod na swoim Raspberry Pi

Aby Twoje Raspberry Pi mogło komunikować się z urządzeniem Alexa, potrzebuje trochę kodu, aby ułatwić przekazywanie informacji przez bluetooth i utrzymywanie tego połączenia, oprócz kilku innych plików. Najłatwiejszym sposobem na rozpoczęcie korzystania z najbardziej aktualnych plików z Amazon jest sklonowanie repozytorium gadżetów Raspberry Pi. Przejdź do katalogu bieżącego projektu i uruchom

git klon

Spowoduje to załadowanie całego ich repozytorium z całym niezbędnym kodem do twojego Pi. Ma kilka przykładowych projektów, które pokazują niektóre możliwości gadżetów Alexa. Jeśli chcesz uzyskać więcej informacji, zobacz readme na ich stronie Github.

Uruchom ich funkcję konfiguracji, aby wszystko skonfigurować.

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

sudo python3 launch.py --setup

Postępuj zgodnie z wyświetlanymi instrukcjami i odpowiedz „y” na pytanie, czy chcesz skonfigurować przy użyciu danych logowania gadżetu. Przypomnij sobie identyfikator Amazon ID i tajny gadżet gadżetu podczas konfigurowania gadżetu na konsoli programisty, ponieważ zostanie on tutaj poproszony. Wybrałem tryb transmisji "bt" dla mojego Raspberry Pi Zero W. BLE nie jest obsługiwany przez wszystkie starsze urządzenia Echo, ale możesz sprawdzić, do czego jest zdolny twój sprzęt. Jeśli używasz Pi w trybie pulpitu, Amazon zaleca kliknięcie prawym przyciskiem myszy ikony Bluetooth w prawym górnym rogu i kliknięcie „Usuń „Bluetooth” z panelu”, aby uniknąć problemów z łącznością.

Uwaga: ten krok może chwilę potrwać w zależności od tego, ile trzeba zainstalować.

Teraz będziesz mieć wszystkie niezbędne pliki wsparcia, aby wrócić do swojego projektu i zacząć dodawać funkcje umożliwiające komunikację z Echo.

Jeśli chcesz, możesz usunąć folder „przykłady” w „Alexa-Gadgets-Raspberry-Pi-Samples/src”

Możesz mieć swój kod projektu, gdziekolwiek chcesz, ale stworzę dla niego folder w katalogu domowym, alternatywnie możesz pobrać folder z kodem z mojego Github, po prostu pamiętaj, aby edytować pliki.ini, jak opisano poniżej.

cd /home/pi

mkdir my_project cd my_project dotknij my_gadget.py dotknij my_gadget.ini

Utworzyłem teraz dwa pliki w folderze o nazwie „mój_projekt”. Plik.ini jest ważny. Upewnij się, że zawiera on następujące elementy i zastępuje je w Twoim identyfikatorze Amazon i tajnym gadżecie:

[Ustawienia gadżetu]

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

Teraz przyjrzyjmy się plikowi Pythona, zanim przejdziemy do szczegółów:

importuj json

z agt import AlexaGadget

klasa MyGadget(AlexaGadget):

def _init_(self):

super()._init_()

def on_custom_mygadget_alexatopi(self, dyrektywa):

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

def on_custom_mygadget_pitoalexa(self, dyrektywa):

payload = json.loads(directive.payload.decode("utf-8")) print("Otrzymane dane: " + str(payload)) payload = {'data': "Sonda odczytuje " + str(get_temp(payload) ['data'] ['sensor_num']['value'])) + " stopnie."} self.send_custom_event('Custom. MyGadget', 'PiToAlexa', payload) MyGadget().main()

Najpierw zauważysz, że wywołuje dwie funkcje: write_text() i get_temp(). W moim kodzie definiuję te funkcje w tym samym pliku, ale są one zależne od mojego sprzętu, więc zdecydowałem się je pominąć. Załączyłem ten plik z funkcjami zdefiniowanymi do drukowania i zwracania fikcyjnych danych na wypadek, gdybyś chciał uruchomić ten dokładny kod. Sugerowałbym przetestowanie tego dokładnego kodu, zanim zmodyfikujesz go do pracy z twoim projektem. Załączyłem również plik.ini, ale upewnij się, że wchodzisz i zmieniasz identyfikator i sekret gadżetu. Funkcja top odbiera dane przekazywane z Alexy. Dolna funkcja odbiera dane w tym samym formacie, ale urządzenie Alexa będzie czekać pięć sekund na przekazanie zdarzenia z własnym ładunkiem. Ten ładunek jest wyjątkowy, ponieważ urządzenie Alexa wypowiada swoją zawartość.

Po uzyskaniu tych plików przejdź do folderu „my_project” i uruchom plik Pythona.

ponowne uruchomienie sudo

cd /home/pi/mój_projekt sudo python3./my_gadget.py

Jeśli uruchamiasz program po raz pierwszy, musisz sparować go z urządzeniem Echo. Upewnij się, że Twoje urządzenie Echo znajduje się w pobliżu Raspberry Pi, ponieważ musimy umożliwić połączenie Bluetooth.

W aplikacji Alexa na urządzeniu mobilnym kliknij „urządzenia” w prawym dolnym rogu.

Kliknij „Echo i Alexa” w lewym górnym rogu.

Kliknij swoje urządzenie Echo.

W sekcji „BEZPRZEWODOWE” dotknij „Urządzenia Bluetooth”.

Dotknij "SPARUJ NOWE URZĄDZENIE" i powinieneś zobaczyć swój gadżet na liście.

Stuknij w swój gadżet. Powinieneś zobaczyć raport Pi, że został pomyślnie sparowany.

Oglądając dane wyjściowe na swoim Pi, spróbuj wydać polecenie głosowe Echo:

Ty: "Alexa, poproś mój gadżet o sprawdzenie temperatury z czujnika pierwszego"

Jeśli wszystko działało poprawnie, powinieneś usłyszeć:

Echo: „Sonda odczytuje 120,505 stopnia”.

Ty: „Alexa, powiedz mojemu gadżetowi, żeby napisał George Washington”.

Pi powinno wydrukować:

„Otrzymane dane: {'data': {'person': {'name': 'person', 'value': 'George Washington', 'confirmationStatus': 'NONE'}}}

Jerzego Waszyngtona”

Krok 5: Podsumowanie

Pokazany tutaj film jest przykładem gadżetu pracującego z odczytem temperatury (ta sama sonda w F vs. C) i zapisywaniem nazw na prostym wyświetlaczu.

Teraz, gdy miejmy nadzieję, że coś działa, powinieneś spróbować dostosować to, aby Twój własny projekt był bardziej wydajny. Pamiętaj, że możesz łatwo edytować intencje w konsoli programisty Alexa i że wszystkie używane sloty zostaną przekazane do twojego Pi w ładunku. Co więcej, możesz poprosić Alexę o powiedzenie wszystkiego, co chcesz, po prostu edytując ładunek, który przekazujesz w zdarzeniu z kodu Raspberry Pi.

Pamiętaj, że ten samouczek nie ma być ostatecznym rozwiązaniem dla wszystkich możliwości, jakie możesz chcieć od gadżetu Alexa. Celowo ogranicza się do udostępnienia dwóch prostych funkcji przekazywania danych w każdym kierunku między Alexą a gadżetem. Jeśli jesteś zainteresowany budowaniem bardziej wyrafinowanych modeli interakcji, zachęcam do przeczytania wszystkich plików readme na https://github.com/alexa/Alexa-Gadgets-Raspberry-P… i wypróbowania wszystkich dostarczanych przez nie przykładów. Sugerowałbym również zapoznanie się z dokumentacją Alexa Gadgets Toolkit i Alexa Skills Kit.

Zalecana: