IFTTTのWebhooksをトリガーとしてArduinoから実行する
ArduinoのEthernet Shieldを買ってみたのでIFTTTとの連携をしてみようと思いました。最初と最後でハマったので、それについても書いていきます。
目次
使用したもの
全て秋月で購入できるものです。また、Ethernet Shieldを使うにはLANケーブルも必要です。
Maker Channelの代わりにWebhooksを使う
最初のハマりポイント。どこの情報を見てもMaker Channelを使ってやっているんですよね。しかしいくらIFTTTの利用できるサービスで検索してもヒットしない...なんでや...
いろいろ調べてみたら、どうやらMaker Channelの代わりにWebhooksを使うということが判明しました。Webhooksの使い方についてはこちらを見ると分かりやすいかと思います。
回路を作る
今回はタクトスイッチを押したらWebhooksにイベント情報を送って、スマホに通知を送るという流れにします。回路はよくあるタクトスイッチを使った回路です。
アプレットを作る
thisのところをWebhooksにします。イベントの名前は今回はButtonPlessedとでもしておきましょう。thatはNotificationsにします。また、このときにWebhooksのシークレットキーを確認しておきます。確認の仕方はこちらを参考にするとよいです。
コードを書く
Webhooksはウェブリクエストを送ってやるとイベントを発火させられるようです。ここではこちらのサイトのコードを参考にしてタクトスイッチが押されたらGETメソッドを使ってウェブリクエストを行うという処理を書いていきます。MACアドレスはEthernet Shieldを買ったときにシールドの裏面についているシールに書かれています。また、コンパイルする際はEthernet2ライブラリのインストールをしてからにしてください。
ちなみに、ArduinoIDEのバージョンは1.8.5です。
#include <SPI.h> #include <Ethernet2.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192, 168, 1, 177); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 0, 0); EthernetClient client; char server[] = "maker.ifttt.com"; // IFTTT strings char eventName[] = "ButtonPlessed"; // イベント名 char secretKey[] = "****************"; // シークレットキー char s[128];//リクエストメッセージ保持用配列 const int buttonPin = 2; int lastButtonState = LOW; void setup() { Serial.begin(9600); while (!Serial) { } Serial.println("Trying to get an IP address using DHCP"); if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); Ethernet.begin(mac, ip, gateway, subnet); } Serial.print("My IP address: "); Serial.println(Ethernet.localIP()); Serial.println (); pinMode(buttonPin, INPUT); } void loop() { int buttonState = digitalRead(buttonPin); if (lastButtonState == LOW && buttonState == HIGH) { Serial.println("ButtonPressed!"); if ( client.connect(server, 80) ) { Serial.println("connected"); // Make a HTTP GET request sprintf(s, "GET http://maker.ifttt.com/trigger/%s/with/key/%s HTTP/1.1", eventName, secretKey); client.println(s); client.print("Host: "); client.println(server); client.println("Connection: close"); client.println(); Serial.println("Sent message"); delay( 1000 ); } else { Serial.println("Error: Could not make a TCP connection"); } } lastButtonState = buttonState; while (client.available()) { char c = client.read(); Serial.print(c); } if (!client.connected()) { client.stop(); } }
コードをコンパイルしてボードに書き込み、LANケーブルを繋げば準備は完了です。タクトスイッチを押すとスマホに通知が飛ぶようになるはずです。
飛ぶはずです...
あれ...飛ばない...?
謎のエラー
第二のハマりポイント。私の場合ですが、何度やっても通知が来ませんでした。でもシリアルモニタを確認すると
Congratulations! You've fired the ButtonPlessed eventButtonPressed!
とか書いてあるからうまくいってるはずなんだけどなぁ...
ネットで調べてみるとこちらの記事を発見。記事によると、「Webhooks」のページから[Settings]をクリックし、飛んだ先のページの[Edit connection]をクリックしてやると改善するらしいです。この通りにやってみて再トライしてみると通知が飛ぶようになりました。
まとめ
- Maker Channelの代わりにWebhooksを使う
- ウェブリクエストを送ってやるとWebhooksのイベントが発火させられる
- Webhooksがうまく動作しないときはアプレットの再接続をしてみる
これでローカルなトリガーによりネットワーク上でアクションを起こせるようになりました。次はネットワーク上のトリガーによってローカルでアクションを起こせるようにしたいですね。