Androidのメモとか

ポキオの日記です。今日も遅延してない。

Amazon Dash Buttonが押されたらESP8266経由でIFTTTのWebhookを叩いて幸せになる

幸せになるんだ・・・!

Amazon Dash Button ESP8266 IFTTT Webhook

前回までの話

relativelayout.hatenablog.com

ESP8266はAP+STAモードで使えるということを確認しました。これはつまり、Amazon Dash Buttonの接続先をESP8266のAPにしてしまって、そのイベントを受けて、ESP8266(STA)が接続しているAP経由で、IFTTTを叩いて何かしてみようと思いました。

大切なことは、この辺に全部書いてあります。

qiita.com

relativelayout.hatenablog.com

まずはコーディング

基本的に、前回のコードに少し毛が生えたレベルです。ポイントは以下のとおりです。

  • Wi-Fiのイベントを受けて、ソースのデバイスMACアドレスを確認する
  • ターゲットのAmazon Dash Buttonと同じMACアドレスか比較する
  • 同じだったらWebAPIをPOSTしてIFTTTのWebhookを叩く
  • Wi-Fiのイベントは制限していないが、チャタるのでスリープを挟んでいる
  • STAの設定より前にAPの設定をすると、上手くAmazon Dash ButtonWi-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にメッセージを送るように設定してみました。

Amazon Dash Button ESP8266 IFTTT Webhook

こんな感じ。ちゃんと動いてそうです。IFTTTのTriggerを叩ければ、その先はノンプログラミングで実装できるので、簡単にトリガーに対するアウトプットを変更することが出来ます。これで、かなり夢が広がりますね。

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。