
Kontrolowanie ESP przez Google Assistant
Wstęp
Całość kursu na YouTube w języku angielskim, wszystkie kroki będą opisane w tym kursie.
W tym prostym przykładzie będziemy przez Asystanta Google sterować:
- diodą led – włączanie/wyłączanie czyli poprostu przesyłanie wartości boolean z Asystanta Google do ESP
- serwo mechanizmem – po komendzie głosowej serwo mechanizm przesunie się na odpowiednią pozycję – czyli przesyłaną wartość liczbową z Asystanta Google do ESP
Założenia
Wykorzystamy IFTTT i RemoteMe. W IFTTT możemy w łatwy sposób dodać komendy głosowe do swojego Asystenta Google, który wywoła “triggera” w IFTTT, a ten wywoła zapytanie http do zmiany zmiennej w RemoteMe. Zamiana RemoteMe zostanie przekazana do nasłuchującego urządzenia ESP, a to wykona odpowiednią czynność bazując na otrzymanej zmiennej.
Zaczynamy
RemoteMe
Asystant Google będzie sterował dwoma zmiennymi
- typu boolean – do diody LED
- typu integer – do servo Mechanizmu
Po dodaniu zmiennych ESP będzie je “obserwować” czyli każda zmiana zmiennej dokonana przez Asystant Google będzie wywoływała odpowiednie funkcje na ESP.
Dodawanie zmiennych:
Nazwa zmiennej Boolean to RELAY_01 – taka zmienna pozwoli później sterować zmienną przez aplikacja na anrdoidzie. Więcej o zmiennych tutaj
Identycznie tworzymy zmienną serwo o nazwie “servo” i typie integer. Po dodaniu otrzymamy:
Teraz musimy zaimplementować obsługę zmiennych po stronie ESP
ESP
Połączenia
- Anoda diody do D5 katoda przez opornik do masy
- Serwo Mechanizm
- zasilanie 5V
- masa do masy ESP
- przewód kontrolujący do D1 (upewnij się, że Wasze serwo może być podpięte do ESP, które ma 3.3V, jeżeli nie – zastosuj konwerter stanów)
po stronie ESP, gdy zmienimy zmienną RELAY_01 albo servo, ESP wysteruje odpowiednio diodę albo serwomechanizm.
Zaczniemy od wygenerowania kodu z potrzebnymi funkcjami do obsługi funkcji.
Aby dodać urządzenie do RemoteMe, przechodzimy do zakładki “Devices” następnie “New Device” i “New Network Device” w oknie wpisujemy:
i klikamy Submit. Więcej o urządzeniach tutaj
Aby, wygenerować kod klikamy Burger Menu i “Code Generator Wizard”:
W pierwszym kroku zaznaczamy wszystkie zmienne, wygeneruje to odpowiedni kod gdzie będą utworzone funkcję do obługi zmeinnych ( w szczególności funkcje które zostaną wywołane po zmianie wartości zmiennych) więcej o kreatorze tutaj
W kroku drugim wpisujemy nazwę naszej sieci i hasło do niej (możemy nic nie wpisywać i uzupełnić potem w kodzie).
W ostatnim kroku wyświetlamy wygenerowany kod i wklejamy do Arduino IDE. Poniżej kod uzupełniony o implementację sterowania serwo mechanizmu i diodą led.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#define WIFI_NAME "nameofwidi" #define WIFI_PASSWORD "wifi password" #define DEVICE_ID 1 #define DEVICE_NAME "ESP" #define TOKEN "token" #include <RemoteMe.h> #include <RemoteMeSocketConnector.h> #include <ESP8266WiFi.h> #include <Servo.h>//ADDED uint8_t LEDpin = D5;//ADDED Servo myservo; //ADDED RemoteMe& remoteMe = RemoteMe::getInstance(TOKEN, DEVICE_ID); //*************** CODE FOR CONFORTABLE VARIABLE SET ********************* inline void setRELAY_01(boolean b) {remoteMe.getVariables()->setBoolean("RELAY_01", b); } inline void setServo(int32_t i) {remoteMe.getVariables()->setInteger("servo", i); } //*************** IMPLEMENT FUNCTIONS BELOW ********************* void onRELAY_01Change(boolean b) { digitalWrite(LEDpin,b?HIGH:LOW);//ADDED } void onServoChange(int32_t i) { myservo.write(i);//ADDED } void setup() { WiFi.begin(WIFI_NAME, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(100); } remoteMe.getVariables()->observeBoolean("RELAY_01" ,onRELAY_01Change); remoteMe.getVariables()->observeInteger("servo" ,onServoChange); remoteMe.setConnector(new RemoteMeSocketConnector()); remoteMe.sendRegisterDeviceMessage(DEVICE_NAME); myservo.attach(D1);//ADDED pinMode(LEDpin, OUTPUT);//ADDED digitalWrite(LEDpin, LOW);//ADDED } void loop() { remoteMe.loop(); } |
Nowe linie zaznaczone //ADDED
1 |
#include <Servo.h> |
biblioteka do sterowania serwo mechanizmem — musi być wcześniej dodana, tak samo jak bilbioteki do RemoteMe więcej tutaj
1 2 3 4 5 6 |
void onRELAY_01Change(boolean b) { digitalWrite(LEDpin,b?HIGH:LOW); } void onServoChange(int32_t i) { myservo.write(i); } |
Funkcja wywoływane, gdy Asystant Google zmieni nasze zmienne.
1 2 3 |
myservo.attach(D1); pinMode(LEDpin, OUTPUT); digitalWrite(LEDpin, LOW); |
ustawienie odpowiednio serwo mechanizmu i pinów do kontrolowania diodą led.
Tak zmodyfikowany kod wgrywamy do naszego ESP.
Testowanie
Nasze ESP po wgraniu kodu połączy się z RemoteMe:
a po przejściu do zakładki zmienne ( variables ) i rozwinięciu ich:
ESP – w zmiennych oznacza, że nasze urządzenie nasłuchuje na zmiany zmiennych.
zmieńmy zatem zmienne i zobaczmy czy dioda i serwo mechanizm zareaguje odpowiednio. Z burger menu wybieramy opcje “Set…”
I w oknie które się pojawi zmieniamy wartość zmiennej i klikamy Submit. Nasza dioda i serwo mechanizm zareaguje.
Generowanie linków do zmiany zmiennych
IFTTT będzie podobnie jak zrobilismy to funkcją “Set…” zmieniać wartość zmiennej, jednak IFTTT będzie to robić poprzez odpowiednie wywołanie zapytania http. Wygenerujmy prosty link do wywołania metodą GET:
Z burger menu zmiennej klikamy na “Generate Set Variable Link” :
wygenerowany link :
1 |
https://app.remoteme.org/api/~155_D49LDj@aBFhK./rest/v1/variable/set/variableValue/RELAY_01/BOOLEAN/false/ |
Po skopiowaniu linku i otwarciu go w przeglądarce (nawet w trybie incognito – gdzie nie jesteśmy zalogowani nasza dioda zgaśnie, w URL jest jeden z naszych tokenów dlatego działa nawet wtedy, gdy nie jesteśmy zalogowani)
Żeby wygenerować link do zaświecenia diodą – zmieniamy “boolean” na włączony i klikamy “Generate” dostaniemy link po wywołaniu którego nasza dioda się zaświeci.
IFTTT
Stwórzmy zatem Applet do sterowania głosowego
- dodanie Asystant Google z komendą “turn light on”
- dodanie połączonego “Webhooka”, który wywoła odpowiednie zapytanie na RemoteMe, podobnie jak linki z przykładu powyżej włączy diodę.
w IFTTT przechodzimy do My Applets, następnie New Applet, po kliknięciu na “+this”
wybieramy Google Assistant:
A następnie “Say a simple phrase”, uzupełniamy:
(Uwaga frazy takie jak “turn light on” mogą być już przypisane do domyślnej komendy w Asystencie Google- więc gdy po wywołaniu komendy głosowej otrzymamy inna odpowiedź niż “OK preforming action” musimy wybrać inna komendę głosową )
i klikamy create trigger, następnie klikamy “+ that” i wybieramy webhooks:
i “Make a web Request” i uzupełniamy danymi wygenerowanymi z RemoteMe
wygenerujmy link :
w tym przypadku wybraliśmy opcje “use Post Method” (metoda POST jest bardziej elegancka do zmiany stanów zmiennych niż metoda GET ) i wygenerowaliśmy link i zawartość zapytania POST, który włączy diodę led
po wklejeniu do naszego webhook powinien on wyglądać następująco:
(nie zzapomnijciezmienić Method na POST i Content Type na application/json)
klikamy create action i finish. Po chwili, gdy nasze konto na Google Assistant się zaktualizuję, możemy wypowiadając “ok google, turn on ligh” włączyć naszą diodę.
Identycznie tworzymy akcje dla słowa “turn off light” pamiętając o wygenerowaniu linka w remoteMe z opcją “boolean” ustawioną na false. Teraz możemy włączać i wyłączać diodę za pomocą Asystanta Google.
IFTTT – servo
Podobnie jak diodę możemy wygenerować komendę do sterowania serwo mechanizmem, w tym jednak przypadku będziemy wypowiadali w komendzie numer, który będzie odpowiednio rozpoznawany.
Tworzymy nowy applet podobnie jak poprzednio, ale teraz w google assystant wybieramy “Say Phrase with a number” i uzupełniamy:
w komendzie “Set servo to #” zamiast # powiemy liczbę, która zostanie rozpoznana. Wstawmy URL, modyfikując “body” wygenerowane przez RemoteMe odpowiednim “znacznikiem” po wklejeniu webhook powinen wyglądać następująco:
IFTTT zastąpi w wywołanym jsonie {{NumberField}} przez liczbę wypowiedzianą przez nas do Asystenta Google.
Nasze Applety wyglądają następująco:
i z poziomy Asystenta Google możemy zmieniać naszą diodę i położenie serwo mechanizmu. Na filmie od 10:40 pokazane jest działanie:
Bonus — sterowanie przez stronę internetową
Bardzo łatwo możemy też stworzyć stronę internetową — hostowaną w chmurze RemoteMe do sterowania naszym ESP,
Wybieramy “new Device” , “New WebPage”, uzupełniamy
Po dodaniu rozwijamy stronę internetową, klikamy na index.html i wybieramy “Edit With wizard”
następnie klikamy na Insert Component i uzupełniamy:
właściwość name najlepiej wybrać klikając “lupkę” zminimalizujemy pomyłkę przy wpisywaniu nazwy zmiennej. Po kliknięciu “Insert” dodajmy komponent do sterowania serwo mechanizmem:
po dodaniu zamykamy “wizarda” , klikamy na index.html i wybieramy “Open in new Tab”
przesuwając przełącznikiem włączamy wyłączamy naszą diodę led, a przesuwając sliderem zmieniamy pozycje serwo mecahnizmu.
Stronę internetową możemy otworzyć na telefonie komórkowym, najprościej zeskanować kod, klikając na index.html -> “Get anymous link” i klikając ikonkę QR kodu, po wyświetleniu QR kodu skanujemy go smartphonem i mamy dostęp do sterowania stroną internetową
Bonus – sterowanie przez aplikacje mobilną
Istnieje aplikacja – dostarczona przez Nguyễn Duy Hiếu dostępna tutaj
Która po podłączeniu do naszego konta umożliwia sterowanie naszą diodą — z zakładki Relays (oczywiście pod warunkiem, że na początku nazwaliśmy naszą zmienna diody RELAY_01)
Podsumowanie
Ten prosty kurs pokazuje podstawy wywoływania zapytań http do zmienienia stanów zmiennych poprzez dowolne aplikacje , czyli np IFTTT.
Zachęcam do stworzenia własnych przykładów 🙂