Chcielibyście, aby urządzenie z ESP8266 wysyłało do Was e-maile lub powiadomienia push? Może zastanawialiście się, jak połączyć najnowsze DIY z asystentem głosowym od Google?
Te pozornie trudne zadania można bardzo łatwo rozwiązać za pomocą popularnego IFTTT!
IFTTT (ang. if this, then that) to darmowe narzędzie służące do łączenia ze sobą dwóch serwisów lub urządzeń. Za jego pomocą uzyskujemy możliwość połączenia własnego projektu z takimi usługami jak Asystent Google, Amazon Alexa, Facebook, Twitter czy Dropbox – a to tylko ułamek możliwości. Używanie IFTTT jest bardzo proste i (prawie) nie wymaga umiejętności programowania.
Strona główna IFTTT
Przed połączeniem IFTTT z naszym projektem DIY warto poświęcić chwilę na ogólne zapoznanie się z tą platformą oraz na prosty test. Zacznijmy więc od skonfigurowania testowego projektu, w którym po naciśnięciu przycisku w aplikacji mobilnej IFTTT otrzymamy wiadomość e-mail.
Aby korzystać z dobrodziejstw IFTTT, musimy założyć najpierw konto (możemy użyć także konta Google lub Facebooka). W celu utworzenia pierwszego połączenia wybieramy z głównego menu opcję Create lub przechodzimy bezpośrednio do strony: ifttt.com/create.
Tworzenie nowego połączenia za pomocą IFTTT
Tworzenie połączeń (tzw. apletów) w IFTTT opiera się na zasadzie if this, then that, czyli wybieramy, co ma się wydarzyć, gdy wystąpi dana sytuacja. W pierwszym kroku wskazujemy, kiedy nasze połączenie ma zadziałać, czyli wybieramy wyzwalacz (ang. trigger) dla naszej akcji i ustalamy warunki, jakie muszą zachodzić. Następnie klikamy This i z bardzo długiej listy wybieramy interesujący nas serwis. W tym przypadku będzie to Button Widget, czyli przycisk dostępny w aplikacji IFTTT dla Android oraz iOS.
Lista dostępnych usług i serwisów
Wybór wyzwalacza
Teraz wskazujemy, kiedy wybrany serwis ma zgłosić nam, że warunek został spełniony (dla wybranego Button Widget jest dostępne tylko Button Press, czyli informowanie o wciśnięciu przycisku).
Koniec pierwszej części konfiguracji – IFTTT będzie reagowało na naciśnięcie przycisku
W kolejnym kroku musimy ustawić akcję, czyli to, co ma się dziać po zadziałaniu wyzwalacza. Klikamy w That i wybieramy interesujący nas serwis. Na potrzeby tego przykładu wybrany został Email, czyli usługa, dzięki której można wysyłać tradycyjne wiadomości e-mail. Po wskazaniu usługi przechodzimy do wybrania i konfiguracji akcji – w tym przypadku będzie to wysłanie wiadomości.
Konfiguracja akcji – wysyłanie wiadomości e-mail
Teraz musimy ustalić, co dokładnie ma się zadziać (ustalamy tytuł i treść wiadomości w HTML). Klikając przycisk Add ingredient, możemy dodać do naszej akcji dane zwrócone przez wyzwalacz (dla widgetu przycisku są to lokalizacja i czas). Na koniec klikamy Create action.
Konfiguracja akcji wysyłającej wiadomość e-mail
Na koniec wyświetlone zostanie podsumowanie zbudowanego przez nas połączenia, któremu możemy przypisać własną nazwę. Cały proces zakańczamy, klikając przycisk Finish. Gotowe!
Ekran podsumowujący zbudowanie nowego połączenia
Pierwszy praktyczny test IFTTT
Pora przetestować stworzone połączenie. W tym celu musimy zainstalować na telefonie aplikację IFTTT i umieścić na ekranie widget z utworzonym wcześniej przyciskiem wyzwalającym wybraną akcję.
Aplikacja IFTTT i widget
Kliknięcie w przycisk (widget) powoduje wyzwolenie akcji. Po chwili (5–10 s) powinien do nas przyjść skonfigurowany wcześniej e-mail. Jeśli wszystko działa poprawnie, to możemy już przejść do ciekawszej części, czyli do połączenia z tym systemem naszego DIY.
Podgląd otrzymanej wiadomości
Łączenie z mikrokontrolerem za pomocą Adafruit IO
Teraz pora połączyć układ bazujący na ESP8266, czyli NodeMCU, z IFTTT za pomocą serwisu Adafruit IO. Jest to darmowy (w wersji podstawowej) serwis do obsługi danych w chmurze stworzony z myślą o urządzeniach IoT. Pozwala na łatwą integrację z Arduino, ESP, Raspberry Pi itp.
Strona projektu Adafruit IO
Aby korzystać z Adafruit IO, trzeba założyć darmowe konto. Po zalogowaniu klikamy w zakładkę Feeds. Wybieramy przycisk Action i klikamy Create a new feed.
Wstępna konfiguracja projektu w Adafruit IO
Wpisujemy wybraną nazwę (tutaj, dla przykładu, „Forbot”) i opcjonalny opis. Na koniec klikamy Create.
Nadawanie nazwy i zapisywanie projektu
Od teraz po wybraniu z listy strumienia projektu będziemy widzieć na wykresie dane, które zostały do niego dostarczone. Na razie nic tu nie ma, bo aby zobaczyć efekty, musimy sięgnąć po mikrokontroler.
Podgląd strumienia danych w Adafruit IO
Zgodnie z zapowiedzią pokażę w tym artykule możliwe użycie ESP8266. Do połączenia go z Adafruit IO wykorzystamy przykładowy kod udostępniony przez firmę Adafruit. Najpierw trzeba jednak podłączyć niezbędne peryferia:
przycisk – jedna nóżka do GND, druga do GPIO4,
dioda świecąca – jedna nóżka do GND, druga przez rezystor (np. 510 Ω) do GPIO13.
Numery GPIO nie są zgodne z oznaczeniami na płytce. Warto zawsze sprawdzić w internecie, gdzie na konkretnej płytce znajdują się dokładnie piny GPIO4 i GPIO13.
// Instructables Internet of Things Class sample code
// Circuit Triggers Internet Action
// A button press is detected and stored in a feed
// An LED is used as confirmation feedback
//
// Modified by Becky Stern 2017
// based on the Adafruit IO Digital Input Example
// Tutorial Link: https://learn.adafruit.com/adafruit-io-basics-digital-input
//
// Adafruit invests time and resources providing this open source code.
// Please support Adafruit and open source hardware by purchasing
// products from Adafruit!
//
// Written by Todd Treece for Adafruit Industries
// Copyright (c) 2016 Adafruit Industries
// Licensed under the MIT license.
//
// All text above must be included in any redistribution.
/************************ Adafruit IO Configuration *******************************/
// visit io.adafruit.com if you need to create an account,
// or if you need your Adafruit IO key.
#define IO_USERNAME "YOUR_USERNAME" // <-----ZMIENIĆ
#define IO_KEY "YOUR_KEY" // <-----ZMIENIĆ
/******************************* WIFI Configuration **************************************/
#define WIFI_SSID "YOUR_SSID" // <-----ZMIENIĆ
#define WIFI_PASS "YOUR_PASSWORD" // <-----ZMIENIĆ
#include "AdafruitIO_WiFi.h"
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);
/************************ Main Program Starts Here *******************************/
#include <ESP8266WiFi.h>
#include <AdafruitIO.h>
#include <Adafruit_MQTT.h>
#include <ArduinoHttpClient.h>
#define BUTTON_PIN 4
#define LED_PIN 13
// button state
int current = 0;
int last = 0;
// set up the 'command' feed
AdafruitIO_Feed *command = io.feed("YOUR_FEED"); // <-----ZMIENIĆ
void setup() {
// set button pin as an input
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
// start the serial connection
Serial.begin(115200);
// connect to io.adafruit.com
Serial.print("Connecting to Adafruit IO");
io.connect();
// set up a message handler for the 'command' feed.
// the handleMessage function (defined below)
// will be called whenever a message is
// received from adafruit io.
command->onMessage(handleMessage);
// wait for a connection
while(io.status() < AIO_CONNECTED) {
Serial.print(".");
delay(500);
}
// we are connected
Serial.println();
Serial.println(io.statusText());
}
void loop() {
// io.run(); is required for all sketches.
// it should always be present at the top of your loop
// function. it keeps the client connected to
// io.adafruit.com, and processes any incoming data.
io.run();
// grab the current state of the button.
// we have to flip the logic because we are
// using INPUT_PULLUP.
if(digitalRead(BUTTON_PIN) == LOW)
current = 1;
else
current = 0;
// return if the value hasn't changed
if(current == last)
return;
// save the current state to the 'command' feed on adafruit io
Serial.print("sending button -> ");
Serial.println(current);
command->save(current);
// store last button state
last = current;
}
// this function is called whenever a 'command' message
// is received from Adafruit IO. it was attached to
// the command feed in the setup() function above.
void handleMessage(AdafruitIO_Data *data) {
int command = data->toInt();
if (command == 1){ //light up the LED
Serial.print("received <- ");
Serial.println(command);
digitalWrite(LED_PIN, HIGH);
delay(500);
digitalWrite(LED_PIN, LOW);
} else {
Serial.print("received <- ");
Serial.println(command);
}
}
Zastępujemy:
YOUR_USERNAME nazwą użytkownika z Adafruit IO,
YOUR_KEY kluczem Adafruit IO,
YOUR_SSID nazwą sieci wi-fi,
YOUR_PASSWORD hasłem do sieci wi-fi,
YOUR_FEED nazwą feeda (w tym przykładzie „Forbot”).
Klucz Adafruit IO można sprawdzić, klikając AIO Key w prawym górnym rogu aplikacji.
Miejsce, w którym należy sprawdzić klucz aplikacji
Po wgraniu programu, gdy wciśniemy przycisk do naszego strumienia danych, wysłana zostanie wartość 1. Następnie układ odczyta z feeda tę wartość i włączy na chwilę diodę świecącą. Po puszczeniu przycisku zostanie wysłana wartość 0. Wszystkie te zdarzenia można obserwować na wykresie, który jest generowany w podglądzie strumienia danych. Działanie układu widoczne jest na poniższym filmie:
Dane możemy też dodawać „ręcznie” bezpośrednio w aplikacji Adafruit IO. Wystarczy, że klikniemy Add Data w widoku strumienia danych. Po dodaniu wartości 1 nasz LED zaświeci się.
Adafruit IO mamy już skonfigurowane, teraz pora połączyć układ z IFTTT. Naszego urządzenia możemy używać jako wyzwalacza (na zasadzie „po kliknięciu w przycisk zrób…”) lub jako akcji – gdy coś się dzieje, to do strumienia danych mają być dopisywane nowe informacje.
ESP w roli wyzwalacza IFTTT
Stwórzmy teraz przykład, w którym naciśnięcie przycisku (podłączonego do ESP) sprawi, że zostanie do nas wysłana wiadomość e-mail zawierająca datę i godzinę. W tym celu w IFTTT klikamy opcję Create i jako This wybieramy Adafruit (pierwsze użycie tej opcji wymaga połączenia konta Adafruit).
Wybieramy opcję Monitor a feed on Adafruit IO (chcemy, aby zadziałało dla konkretnej wartości, a nie dla jakiejkolwiek), a potem nazwę naszego strumienia danych. Następnie ustawiamy, że całość ma działać, gdy wartość będzie równa 1 (bo taką informację wysyłamy do sieci po wciśnięciu przycisku).
Ustawienie opcji wyzwalacza
Konfiguracja akcji
Na koniec konfigurujemy akcję. Za That wybieramy e-mail, a następnie konfigurujemy tytuł i treść wiadomości. Potem klikamy Create action oraz Finish i gotowe!
Od teraz za każdym razem, gdy klikniemy przycisk, dostaniemy e-mail. Niestety w tej metodzie może występować małe opóźnienie (~1 min). Druga metoda, pozbawiona opóźnień, została opisana w dalszej części poradnika.
Urządzenie z ESP jako akcja
Teraz trochę bardziej ambitne zadanie. Wykorzystamy Asystenta Google, aby „na nasz znak” zamigał diodą podłączoną do układu. Klikamy Create i jako This wybieramy Google Assistant. Do wyboru mamy 4 możliwości:
wypowiedzenie prostej frazy,
wypowiedzenie frazy z liczbą,
wypowiedzenie frazy z tekstem,
wypowiedzenie frazy z liczbą i tekstem.
Opcje 2, 3 i 4 pozwalają nam wysyłać dane do Adafruit IO. Może być to przydatne, gdy chcemy np. sterować poziomem oświetlenia lub czasem świecenia. W naszym prostym przykładzie wybierzemy prostą frazę, bez przekazywania dodatkowych danych.
Wybór odpowiedniego wyzwalacza dla Asystenta Google
Wpisujemy komendę, po której wypowiedzeniu ma zamigać dioda (możemy wpisać ją na maksymalnie trzy sposoby). Podajemy też odpowiedź, którą ma udzielić asystent, i wybieramy język (niestety na ten moment IFTTT nie obsługuje języka polskiego). Na koniec klikamy Create trigger.
Konfiguracja fraz wyzwalających akcję
Ustawienie akcji w IFTTT
W kolejnym kroku ustawiamy akcję. Za That wybieramy Adafruit i Send data to Adafruit IO. Wybieramy nazwę strumienia danych i wpisujemy wartość, którą chcemy do niego wysłać. Klikamy Create action, Finish i gotowe! Od teraz, gdy powiemy asystentowi komendę, do bazy Adafruit IO zostanie wysłana wartość 1, a dioda świecąca podłączona do ESP zamiga.
Łączenie z mikrokontrolerem za pomocą Webhooków
Drugi sposób polega na pomijaniu pośrednika (np. Adafruit IO) i bezpośrednim kontakcie z IFTTT. Może to wydawać się bardziej skomplikowane, ale za to działa szybciej.
W przypadku testowanych przykładów opóźnienia wynosiły maksymalnie 5 s.
W ramach pierwszego, prostego testu spróbujmy stworzyć urządzenie, które po wciśnięciu przycisku wyświetli powiadomienie push na telefonie (potrzebna będzie aplikacja IFTTT). Na początku tworzymy nowy aplet w IFTTT. Za This wybieramy Webhooks, dalej Receive a web request. W kolejnym kroku wybieramy nazwę zdarzenia – w tym przykładzie jest to „button_pressed”.
Przypisanie nazwy dla nowego wyzwalacza
Z kolei za That wybieramy powiadomienia, czyli Notifications. Dalej mamy do wyboru dwie opcje: powiadomienie podstawowe lub rozbudowane.
Wybór wersji powiadomień generowanych przez IFTTT
Na początek wybieramy podstawowe, czyli klikamy Send a notification from the IFTTT app. Teraz ustalamy, jaka ma być treść powiadomienia. Oprócz zwykłego tekstu, klikając Add ingredient, możemy dodać nazwę zdarzenia oraz wartości do niego dołączone. Jednorazowo możemy wysyłać od zera do trzech wartości. Przechodzimy dalej i klikamy Finish.
Ustawienia powiadomienia wysyłanego przez aplikację
Teraz z menu IFTTT wybieramy zakładkę My services. Z listy serwisów wybieramy Webhooks i klikamy przycisk Documentation w prawym górnym rogu.
Pobieranie unikalnego klucza oraz adresu URL
Na górze wyświetla się nasz indywidualny klucz. Gdy w miejsce opisane jako „{event}” wstawimy nazwę naszego zdarzenia, wtedy na dole pojawi się adres URL, „na który trzeba wejść”, aby wywołać zdarzenie (na razie bez dodatkowych wartości). W podstawowej wersji wygląda on następująco:
Wpiszmy teraz ręcznie ten adres w przeglądarce (dla testu). Powinna pojawić się nam informacja, że udało się uruchomić zdarzenie, a na telefon powinno przyjść ustawione wcześniej powiadomienie.
Ręczny test działania IFTTT
Teraz spróbujmy przesłać dodatkowe wartości. Aby to zrobić, za pomocą adresu URL musimy na końcu dodać ciąg w postaci ?value1=wartość_1&value2=wartość_2&value3=wartość_3 (oczywiście możemy przesłać także mniej niż trzy wartości). Od teraz nasz URL będzie wyglądał tak:
Za te wartości wstawiamy przykładowe wartości i wklejamy w przeglądarkę. Tam wyświetli nam się ten sam komunikat co wcześniej, ale powiadomienie na telefonie będzie już zawierać wpisane wartości (w przykładzie: „123, abc, Ala_ma_kota”).
Ręczny test rozbudowanego adresu URL
Program na ESP, który wykorzystuje Webhooki
Jeżeli już wiemy, jak działa ta metoda, to spróbujmy ją wykorzystać na naszym mikrokontrolerze. Od poprzedniego układu odłączamy diodę (zostaje przycisk: jedna nóżka do GND, a druga do GPIO4).
Teraz nadszedł czas na program. W internecie możemy znaleźć kilka bibliotek ułatwiających pracę z IFTTT: pierwsza nie jest już wspierana przez autora i nie działa (przynajmniej tak było podczas pisania tego poradnika), używając drugiej, można albo wysłać trzy wartości, albo nie wysyłać żadnej, co nie zawsze jest wygodne, z kolei trzecia działa, ale wymaga biblioteki ArduinoJson w wersji 5.x.x (z najnowszą 6.x.x nie działa).
W związku z tym, bawiąc się z IFTTT i ESP8266, przygotowałem własną bibliotekę. Stworzyłem ją co prawda głównie do celów edukacyjnych (to moja pierwsza biblioteka, więc krytyka mile widziana), ale możemy ją teraz wykorzystać. Przed jej użyciem musimy oczywiście pobrać i zaimportować bibliotekę do środowiska. Następnie otwieramy przykładowy kod z tej biblioteki i zmieniamy dane logowania do wi-fi, nazwę zdarzenia i klucz IFTTT.
#include <ESP8266IFTTTWebhook.h>
#include <ESP8266WiFi.h>
/////////////////////////////////////////////////
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
const char* API_KEY = "YOUR_KEY";
const char* WEBHOOK_NAME = "YOUR_EVENT_NAME";
////////////////////////////////////////////////
//button -> GPIO4
#define BUTTON_PIN 4
int current = 0;
int last = 0;
//Create ifttt object
ESP8266IFTTTWebhook ifttt (WEBHOOK_NAME, API_KEY);
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
wifiConnect();
}
void loop() {
if(digitalRead(BUTTON_PIN) == LOW)
current = 1;
else
current = 0;
if(current != last){
last = current;
if (current == 1)
{
ifttt.trigger("1","a","Something"); //3 values
delay(5000);
ifttt.trigger("1"); //1 value
}
}
}
void wifiConnect(){
Serial.print("connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
}
Jak korzystać z powyższej biblioteki? Na początku tworzymy obiekt klasy ESP8266IFTTTWebhook za pomocą instrukcji: „ESP8266IFTTTWebhook ifttt (WEBHOOK_NAME, API_KEY)”. Od teraz możemy wywoływać zdarzenie z użyciem bardzo prostej metody trigger(), przekazując jej argumenty – od zera do trzech: „ifttt.trigger(opcjonalny_argument1, opcjonalny_argument2, opcjonalny_argument3,)”.
Po uruchomieniu programu ESP łączy się z naszą siecią wi-fi i po wciśnięciu przycisku wywołuje zdarzenie z argumentami „1, a, Something”, a po 5 s z jednym argumentem „1”.
Działanie testowego programu widoczne jest poniżej:
Podsumowanie
Powyższe przykłady nie były zbyt rozbudowane, ale realizacja tych zadań miała mieć głównie walory edukacyjne. W IFTTT możemy połączyć wiele różnych serwisów – od rozwiązań automatyki domowej, przez pobieranie danych od NASA, Wikipedii i YouTube, aż po komunikację z siecią pizzerii.
Czy wpis był pomocny? Oceń go:
Średnia ocena 4.9 / 5. Głosów łącznie: 37
Nikt jeszcze nie głosował, bądź pierwszy!
Artykuł nie był pomocny? Jak możemy go poprawić? Wpisz swoje sugestie poniżej. Jeśli masz pytanie to zadaj je w komentarzu - ten formularz jest anonimowy, nie będziemy mogli Ci odpowiedzieć!
Wszystkie te rozwiązania stają się jeszcze bardziej uniwersalne, gdy możemy połączyć je z własnymi projektami. Ogrom możliwości tej platformy widać na stronie IFTTT z przykładowymi rozwiązaniami.
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY na bazie Arduino i Raspberry Pi.
To nie koniec, sprawdź również
Przeczytaj powiązane artykuły oraz aktualnie popularne wpisy lub losuj inny artykuł »
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY z Arduino i RPi.
Trwa ładowanie komentarzy...