ゆべねこの足跡

IT系のはなしを残しておく場所です

IFTTTのWebhooksをトリガーとしてArduinoから実行する

ArduinoEthernet Shieldを買ってみたのでIFTTTとの連携をしてみようと思いました。最初と最後でハマったので、それについても書いていきます。

目次

使用したもの

全て秋月で購入できるものです。また、Ethernet Shieldを使うにはLANケーブルも必要です。

Maker Channelの代わりにWebhooksを使う

最初のハマりポイント。どこの情報を見てもMaker Channelを使ってやっているんですよね。しかしいくらIFTTTの利用できるサービスで検索してもヒットしない...なんでや...

いろいろ調べてみたら、どうやらMaker Channelの代わりにWebhooksを使うということが判明しました。Webhooksの使い方についてはこちらを見ると分かりやすいかと思います。

回路を作る

今回はタクトスイッチを押したらWebhooksにイベント情報を送って、スマホに通知を送るという流れにします。回路はよくあるタクトスイッチを使った回路です。

f:id:yubeshineko:20180910195928j:plain

アプレットを作る

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がうまく動作しないときはアプレットの再接続をしてみる

これでローカルなトリガーによりネットワーク上でアクションを起こせるようになりました。次はネットワーク上のトリガーによってローカルでアクションを起こせるようにしたいですね。