IFTTT+LEDで簡単IoT!ESP8266で特定のハッシュタグのツイートがあったらLEDを光らせる

Posted: / Tags: Twitter IFTTT Heroku ESP8266 Node-RED enebular



いざIoTを始めてみたもののLチカで終わってしまった、という人も少なくないかと思います。

「Lチカが出来たところで...」とお思いかもしれませんが、LチカだけでもそのLチカに意味を持たせれば、案外実用的が作れます。

そこで今回は、Twitterで特定のハッシュタグでツイートがあったときに光るものを作成しました。

実はこれは、私個人が、#mlkccaというハッシュタグのツイートがあったら、メール等で通知をするまでもないけど気軽に知らせて欲しいなという願望から作ったものです。

必要なもの

以下、ハード側で必要なものです。高くても3,000円くらいで済みます。

下3つを組み合わせた「抵抗付きLED」の画像が以下です。LEDの片方の足に抵抗をハンダ付けしています。

こうすると以下のように、完成形がすごくコンパクトに収まります(もちろんブレッドボードで配線しても構いません)

※なお、上記vineのESP-WROOM-02は、@wamisnetさんが作った「USBに直で差せるESP8266互換ボード(以下の写真)」です。

構成

構成は、POSTが来たらMilkcocoaにpush()するHerokuアプリをつくっておいて、そのURLにIFTTTでPOSTするといった感じです。

なお、Milkcocoaでは、HTTPのPOSTでpush()等のAPIが利用できる機能の実装を検討中です。そうなると、Herokuは不要になります。

Arduino IDEを使ってESPのプログラムを書く

では、実装方法について説明を始めます。まずは、ESP側のコードです。

まず、Getting Started(Arduino, ESP8266, mbed)の「ESP8266に直接プログラムを書き込む場合」を参考に、Arduino IDE(ver 1.6.x)にMilkcocoaのSDKをインストールして下さい。

インストールが終わったら、以下のコードをスケッチにコピペして、WLAN_SSIDWLAN_PASSMILKCOCOA_APP_IDを自分のものに書き換えます。

twitter-led.ino
#include <ESP8266WiFi.h>
#include <Milkcocoa.h>

/************************* WiFi Access Point *********************************/

#define WLAN_SSID       "...SSID..."
#define WLAN_PASS       "...PASS..."


/************************* Your Milkcocoa Setup *********************************/

#define MILKCOCOA_APP_ID      "...YOUR_MILKCOCOA_APP_ID..."
#define MILKCOCOA_DATASTORE   "esp8266"

/************* Milkcocoa Setup (you don't need to change this!) ******************/

#define MILKCOCOA_SERVERPORT  1883

/************ Global State (you don't need to change this!) ******************/

// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;

const char MQTT_SERVER[] PROGMEM    = MILKCOCOA_APP_ID ".mlkcca.com";
const char MQTT_CLIENTID[] PROGMEM  = __TIME__ MILKCOCOA_APP_ID;

Milkcocoa milkcocoa = Milkcocoa(&client, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID);

const int ledPin =  13;
int ledState = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(115200);
  delay(10);

  Serial.println(F("Milkcocoa SDK demo"));

  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  Serial.println( milkcocoa.on(MILKCOCOA_DATASTORE, "push", onpush) );
  digitalWrite(ledPin, ledState);
};

void loop() {
  milkcocoa.loop();
  delay(200);
};

void onpush(DataElement *elem) {
  for (int i = 0; i < 6; i ++)
  {
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
    digitalWrite(ledPin, ledState);
    delay(200);
  }
};

コードの内容は、ほぼ「スケッチ」>「スケッチの例」>「Milkcocoa ESP8266 SDK」のmilkcocoa_esp8266です。それに、13番ピンの初期設定と、データを受け取ったときに13番ピンを3回HIGHにするというコードを足しただけです。

なお、13番ピンと書いているので、LEDのアノードは13番に差して下さい(カソードはGNDへ)。

ESPに書き込みが終わったら、Node.jsもしくは以下ページでpush()してLEDが光るか確認してみて下さい。

確認が終わったら次に進みます。

Herokuでデプロイ

次にHerokuの設定です。Herokuアカウントをお持ちでない方は、無料ですのでお気軽に登録下さい。

こちらは以前の記事(HTTPでMilkcocoaが使えるHerokuサーバーを気軽に立ち上げられるHeroku Buttonを作りました)で紹介したものを利用します(1ft-seabassさん、ありがとうございます!)。

記事で紹介しているものがGETのみなので、以下にPOSTで利用できるものを作成しました。以下のHerokuボタンを押して、任意のHerokuアプリ名、自分のapp_idとデータストア名にはesp8266と入力してDeployしてください(Regionはどっちでも大丈夫です)。

Deploy

デプロイが終わったら、アプリのURL(https://Herokuアプリ名.herokuapp.com/)を控えておきます。

※「構成」のセクションでも触れたように、現在Milkcocoaでは、APIをHTTPのPOSTを送ることで発行できる機能の実装を検討しています。その場合このステップは不要です。

IFTTTでレシピ作成

次にIFTTTの設定です。IFTTTアカウントをお持ちでない方は、こちらも無料ですのでお気軽に登録下さい。

登録したら、「My Recipes」 > 「Create a Recipe」でレシピを作り始めます。

まずはトリガーの登録です。「Choose Trigger Channel」では「Twitter」を選択します。

「Choose a Trigger」では、「New tweet from search」を選択します。

「Complete Trigger Fields」では検索したい文字を打ちます。

次にアクションの登録です。「Choose Action Channel」では「Maker」を選択します。

「Choose an Action」では一択しかないので「Make a web request」を選び、「Complete Action Fields」には以下のように入力します。

  • URLhttps://Herokuアプリ名.herokuapp.com/
  • Method:POST
  • Content Type:JSON
  • Body:{"v":"{{Text}}"}

{{Text}}の部分は、Inputフィールドの右にあるフラスコのマークをクリックして呼び出せます。

最後に「Create Recipe」を押せば、レシピが作成されます。

動作確認

トリガーに登録した文字をツイートしてみて、光るか確認してみて下さい。

IFTTTのチェックは15分間隔くらいで走るようなので、待ちきれない場合はレシピの「Check Now」を押せばすぐに確認できます。

体験してみて

LEDによる通知は、メールやプッシュ通知とはまた違った感覚でした。光るとついついツイートを見に行ってしまいます(悪い言い方をすると作業の妨害になるとも言えます...)。

ツイートのデータはすべてMilkcocoaに保存されているので、1日の終わりにデータストアを眺めてどういうツイートがあったか把握できます。

ついでに、こういう使い方をしたときの悩みとして、「データが保存されすぎて困る」というのがありますが、実は今ステージング環境でデータの保存期間を指定できる機能を実装しています。

本番環境にデプロイされる日をしばしお待ち下さい。

Node-REDでも使ってみる

実際に使ってみてひとつ残念だったことは、光ったのでツイートを見に行くと大体弊社の人(@bakuonboogie)のツイートだったことです。。

そこで、@bakuonboogieをフィルターすべくNode-REDを使ってみました。

Node-REDを使う場合、HTTPのPOSTを受けてpush()する用のHerokuが不要になります。ただ、Node-REDはどこかにデプロイして使う必要があるので、そのデプロイ先として結局Herokuを使うことになるかと思います。

※Node-REDとは、ブラウザ上のGUIでWeb上の様々なAPIやサービス、デバイスをつなげるNode.js製のソフトウェアです。データの入り口や出口、その間の処理をダイアグラムで自由かつ直感的に作ることができます。簡単に言うと「GUI版の高機能IFTTT」みたいな感じです。

enebularを使う

手っ取り早くNode-REDを使うには、enebularというサービスを使います。

登録後ログインして、「CREATE AGENT」でガイドに従ってAGENTを作成したら(DeployはHerokuへしましょう)、AgentのFlowタブでNode-REDの編集画面が開きます。

右側の「admin」タブから、「node-red-contrib-milkcocoa」をインストールします(実はこのモジュールはちょうど一昨々日、Nore-REDユーザー会の@joeartseaさんに作って頂きました!Milkcocoa Nodeのページはこちら

インストールしたら、以下のようなフローを作成します。

設定画面はノードをダブルクリックしたら開きます。Milkcocoa Nodeを使うにはAPI KeyとAPI Secretが必要なので、管理画面の「認証」タブから作成しておきましょう。

Node-REDのFlowが完成したら、右上の「Deploy」を押せば動き出します。登録した文字をツイートして、確認してみて下さい。

まとめ

ソーシャルの出来事をトリガーにLEDを光らせる方法を紹介しました。

IFTTT、Node-REDともにトリガーの種類はたくさんあるので、色んなタイミングでLEDを光らせることができますね。

LEDだけでも十分実用的なものができることからわかるように、IoTでは技術的には大したことがなくても、アイデア次第で価値のあるものが作れる思っています(技術力があればアイデアの幅が広がることに変わりはないですが)。

このブログでも紹介している、「とりあえずセンサーの値を可視化」みたいなことももちろん良いとは思いますが、もっと身近な生活から出てくるアイデアを元にIoT開発をやってみると、もっと面白くなると思います。

そのアイデアをいち早く実現するために、是非Milkcocoaをお使い下さい。