幸せになるんだ・・・!
前回までの話
ESP8266はAP+STAモードで使えるということを確認しました。これはつまり、Amazon Dash Buttonの接続先をESP8266のAPにしてしまって、そのイベントを受けて、ESP8266(STA)が接続しているAP経由で、IFTTTを叩いて何かしてみようと思いました。
大切なことは、この辺に全部書いてあります。
まずはコーディング
基本的に、前回のコードに少し毛が生えたレベルです。ポイントは以下のとおりです。
- Wi-Fiのイベントを受けて、ソースのデバイスのMACアドレスを確認する
- ターゲットのAmazon Dash Buttonと同じMACアドレスか比較する
- 同じだったらWebAPIをPOSTしてIFTTTのWebhookを叩く
- Wi-Fiのイベントは制限していないが、チャタるのでスリープを挟んでいる
- STAの設定より前にAPの設定をすると、上手くAmazon Dash ButtonのWi-Fiイベントを取得できないので、APの設定を最後に行う
こんな感じ。
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> extern "C" { #include <user_interface.h> } #define AP_SSID "APのSSID" #define AP_PW "APのPW" #define SOFTAP_SSID "SOFT APのSSID" #define SOFTAP_PW "SOFT APのPW" // Dash ButtonのWi-Fi MACアドレス uint8_t targetMac[6] = {255, 255, 255, 255, 255, 255}; // Dash Buttonを検知したらTrueに倒す boolean isFound; void ICACHE_FLASH_ATTR wifi_handle_event_cb(System_Event_t *evt) { uint8_t* foundMac = evt->event_info.ap_probereqrecved.mac; if (memcmp(foundMac, targetMac, sizeof(uint8_t) * 6) != 0) { return; } isFound = true; } void setup() { Serial.begin(115200); Serial.println(""); // AP+STAモードの設定 WiFi.mode(WIFI_AP_STA); // STAとして振る舞うための接続先APのSSIDとPW情報 WiFi.begin(AP_SSID, AP_PW); // APへの接続完了待ち while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.print(". "); } Serial.println("connected!"); // APとして振る舞うためのSSIDとPW情報 WiFi.softAP(SOFTAP_SSID, SOFTAP_PW); // Wi-Fiのイベントを受け取る wifi_set_event_handler_cb(wifi_handle_event_cb); } void loop() { if (isFound) { Serial.println("FOUND"); doHttpPost(); delay(3000); // チャタるので3秒位待つ isFound = false; // 最後にFalseに倒す } } // IFTTTにPOSTする void doHttpPost() { HTTPClient http; // テキトーなJSON String json = "{\"value1\":\"" + String("test") + "\"}"; http.begin("http://maker.ifttt.com/trigger/XXX/with/key/YYY"); http.addHeader("Content-Type", "application/JSON"); http.addHeader("Content-Length", String(json.length())); int httpCode = http.POST(json); String result = http.getString(); http.end(); Serial.println(result); }
Amazon Dash Buttonの設定
Amazon Dash ButtonにEPS8266のSSID/PWを覚えさせなければなりません。
皆さん御存知の通り、スマホアプリでAmazon Dash Buttonの設定を進めて、SSID/PWを設定し終わったらアプリを閉じればOK。…なんですが、ESP8266のAPはネットに接続できず、EPS8266のAPに接続しているAmazon Dash Buttonを完了させられないため、同じSSID/PWのAPを立てて設定だけさせる必要があります。
ボタンを押してみる
ボタンを押しても、たまに接続を検知できないケースもありますが、ほとんど検知出来ました。イベントは必ずしも1回とは限らず、2回呼ばれたり、もっとすごい回数呼ばれたりするので、SW的にチャタリングの制御は必要そうです。
今回は、IFTTTにHTTP-POSTしたあと、LINEにメッセージを送るように設定してみました。
こんな感じ。ちゃんと動いてそうです。IFTTTのTriggerを叩ければ、その先はノンプログラミングで実装できるので、簡単にトリガーに対するアウトプットを変更することが出来ます。これで、かなり夢が広がりますね。