enebularを使ってみる

数年前にTwitterやFacebookの反応をリアル可視化する「[ソーシャルツリー](http://media.looops.net/kensuke/2013/12/09/socialtree/)」を作りました。このソーシャルツリーはハッシュタグ付きツイートの数をカウントしてLEDでその総量を表現することができるのでイベント等ではWeb上の盛り上がりを表現するのに使ってもらいました。


後にLEDの表現方法を変更したソーシャルスター[[動画]](https://www.youtube.com/watch?v=lGHxk4-QLSI)
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/109992/8a4674f9-5342-62bc-331d-44bdc74c7615.jpeg)

この中身の制御はmbed LPC1768を使っています。ただ直接TwitterAPIをたたいているわけではなく、中間のサーバ経由です。中間サーバでは、指定したハッシュタグを使ってTwitterAPIをたたいて検索し、そのツイート数を数えています。中間サーバにmbedからHTTP GETすると数えた数値が教えてもらえるという仕組みです。
私はWeb側の知識が乏しいので、中間サーバのソフトはWebに詳しい某氏に作ってもらいました。

しかし、Web側も自分でいじれるようになりたかったので、簡単にできないかなと探してみたところ[enebular](https://enebular.com/)というサービスを見つけました。
enebularとは「あらゆるデバイスとクラウドサービスを “つなぐ”IoTのためのデータ連携プラットフォーム」らしいです。

##enebularのセットアップ
enebularを説明するよりも実際にセットアップしてるところを紹介したほうが早いと思うので、紹介します。
初めて触りましたが、直感的に扱えました。

まず[トップページ](https://enebular.com/)の右上の無料サインアップをクリックして、WebサービスのIDかメールアドレスで登録ができます。
次に以下のページが表示されるので、「+New Project」をクリックし、プロジェクト名を入力します。とりあえず「test_prj」にしました。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/109992/a23efca0-e7e2-bf10-d6f5-cb37aebe6e82.png)

次に以下のページが表示されるので「New Flow」をクリックします。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/109992/79add893-c905-5025-bf00-d9bf8ac480e2.png)

次に表示されるのがFlowを作るページです。左の一覧から部品を選んで真ん中の空白の部分に配置していきます。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/109992/48baf98e-ca3a-05a6-588c-171c03a715fc.png)

今回はソーシャルツリーと同じ様にTwitterのハッシュタグ付きツイートを検出して、通知する仕組みにしたいので、Twitterの部品を選んで置きます。
![06.png](https://qiita-image-store.s3.amazonaws.com/0/109992/6f43f6b9-36b2-c885-d661-9c0b95ad8b70.png)

配置したtwitter部品をダブルクリックするとTwitterと接続するための設定ができます。
次の様に設定しました。Twitter IDはログインして認証すれば設定できます。
「for」の部分はサーチしたいハッシュタグを設定します。とりあえずテスト用のハッシュタグをセットしました。
「Name」はフローの画面で表示させたい名前だと思います。
![08.png](https://qiita-image-store.s3.amazonaws.com/0/109992/2daeb338-a5f6-fb82-02a6-87f4093f5b82.png)

mbedとのI/Fは最近Milkcocoaのライブラリを作ったので、outputの中からmilkcocoaを選びました。
twitterとmilkcocoaに変換が必要だと思ったので、functionも配置してます。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/109992/6374b1f9-f524-3c14-f33f-aea7ad8de4e2.png)

ハッシュタグ付きツイートが見つかったときのトリガが取れれば良かったので、milkcocoaにPUSHする内容はとりあえずツイートのタイムスタンプをセットするようにしました。functionの中身は次の様にしています。
![10.png](https://qiita-image-store.s3.amazonaws.com/0/109992/9982a76b-910a-a244-404e-79fc0778e957.png)

milkcocoaの設定は次のようにしました。
「Log in as」のところはApp IDのみ入力してます。
![14.png](https://qiita-image-store.s3.amazonaws.com/0/109992/9bcfd684-cc2c-66c7-5383-9b9c196b0bd8.png)

あとはそれぞれのパーツを繋げてきます。
繋ぎ終わったら右上の「Deploy」をクリックします。
![15.png](https://qiita-image-store.s3.amazonaws.com/0/109992/80ee465f-7025-a40c-3353-bee90176f19f.png)

enebularの準備はこれだけです。

##mbed側の準備
mbedのプログラムはmilkcocoaの[サンプルプログラム](https://developer.mbed.org/users/jksoft/code/MilkcocoaOsSample_Eth/)をベースに次のようにしました。プラットフォームは[mbed LPC1768](https://developer.mbed.org/platforms/mbed-LPC1768/)です。[JBB](http://www.runele.com/ca3/32/p-r-s/)を使ってEthernetに繋ぎます。

```main.cpp
#include "mbed.h"
#include "MQTTInterface.h"
#include "MQTTClient.h"
#include "Milkcocoa.h"
#include "MClient.h"
#include "EthernetInterface.h"

EthernetInterface eth;
RawSerial pc(USBTX,USBRX);

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

#define MILKCOCOA_APP_ID      "...YOUR_MILKCOCOA_APP_ID..."
#define MILKCOCOA_DATASTORE   "mbed_lan"

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

#define MILKCOCOA_SERVERPORT  1883

/************ Global State (you don't need to change this!) ******************/
const char MQTT_SERVER[]  = MILKCOCOA_APP_ID ".mlkcca.com";
const char MQTT_CLIENTID[] = __TIME__ MILKCOCOA_APP_ID;

extern void onpush(MQTT::MessageData& md);

int main() {
    
    pc.baud(9600);
    pc.printf("Milkcocoa mbed os ver demo\n\r\n\r\n\r");
    
    int ret = eth.connect();
    if (ret != 0) {
        printf("\r\nConnection error\r\n");
        return -1;
    }
    pc.printf("\n\rEthernet connected\n\r");
    
    Milkcocoa* milkcocoa = new Milkcocoa(&eth, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID);
    
    milkcocoa->connect();
    
    pc.printf("%d\n\r",milkcocoa->on(MILKCOCOA_DATASTORE, "push", onpush));
    
    milkcocoa->setLoopCycle(1000);
    milkcocoa->start();

    while(1) {
        if(befor_conter != counter) {
            pc.printf("new tweet count[%d]\r\n",counter);
            befor_conter = counter;
        }
        Thread::wait(1000);
    }
}

void onpush(MQTT::MessageData& md)
{
    MQTT::Message &message = md.message;
    DataElement de = DataElement((char*)message.payload);
    pc.printf("onpush\n\r");
    pc.printf("%d\n\r",de.getInt("timestamp_ms"));
    counter++;
}
```

とりあえずmilkcocoaから受け取るとcounterをインクリメントしてシリアルコンソールに表示するようにしています。

##テスト
mbedにプログラムを書き込み、Twitterでハッシュタグ付きでツイートしてみます。
<img width="597" alt="スクリーンショット 2017-02-14 22.32.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/109992/c94f165a-2e03-6ac4-4202-fb44bf315f5a.png">

するとシリアルコンソールに反応が来ました！
<img width="690" alt="スクリーンショット 2017-02-14 22.34.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/109992/f0b6764d-7891-5116-e774-034966803c78.png">

これで、JBBにLEDテープをつなげればソーシャルツリーの様にハッシュタグ付きツイートを検出して、LEDを点灯させられますね。

##最後に
所要時間は30分程度で簡単に確認ができました。
これなら苦手なWebサイドのアプリケーションも簡単に組めそうな感じです。