myThingsをはじめよう - Part6: 「IDCF」のトリガーからHTTPで「Gmail」のアクションを実行する

「IDCF」チャンネルを使うと、Raspberry Piと環境センサーが計測した気温が27度を超えたときなど閾値を監視して、myThingsのトリガーを作成することができます。[前回](http://qiita.com/masato/items/e7edac534d9aa95d8fb8)はアクションを作成するサンプルでしたが、今回はトリガーを作成するサンプルになります。

![スクリーンショット 2015-09-10 18.05.47.png](https://qiita-image-store.s3.amazonaws.com/0/51786/29fb966c-b935-7e63-5ad6-862af244ec75.png)

## myThingsアプリ

### 「Gmail」チャンネルの承認

myThingsのトリガーに「Gmail」チャンネルを使います。myThingsアプリを開きチャンネル一覧から選択して認証します。

![gmail-channel.png](https://qiita-image-store.s3.amazonaws.com/0/43745/e9377266-38eb-7ff2-e1b3-42fe4487bd19.png)


### 組み合わせの作成

ホーム画面から右上のプラスボタンをタップします。

![mythings-home.png](https://qiita-image-store.s3.amazonaws.com/0/43745/bd8fc02c-d437-2b65-c9db-eedb7e15bf31.png)

組み合わせ作成画面ではトリガーとアクションのチャンネルをプラスボタンをタップして選択します。

![recipe.png](https://qiita-image-store.s3.amazonaws.com/0/43745/beac50b0-4873-1450-1dc1-252b439502ca.png)


### 「IDCF」トリガー

トリガーのプラスボタンをタップして、チャンネル一覧から「IDCF」をトリガーに選択します。「IDCF」チャンネルの認証をまだしていない場合は、[myThingsをはじめよう - Part4: 「IDCF」チャンネルを認証する](http://qiita.com/masato/items/3d958b4b427020b83b94)の手順で認証します。


![idcf-trigger.png](https://qiita-image-store.s3.amazonaws.com/0/43745/a6ef55d2-f107-bfb5-ed32-f16f9c4a7cac.png)

「条件を満たしたら」のリストボックスから、`trigger-1`を選択します。

![idcf-trigger-selected.png](https://qiita-image-store.s3.amazonaws.com/0/43745/a7bc80d6-4776-ae8f-30da-84ecb7fd60df.png)


OKボタンをタップすると組み合わせの作成画面に戻ります。

![recipe-trigger.png](https://qiita-image-store.s3.amazonaws.com/0/43745/f11f4e79-996e-17cd-6ccb-9c27f6a2ec94.png)

### 「Gmail」アクション

アクションのプラスボタンをタップして、チャンネル一覧から「Gmail」をアクションに選択します。

![gmail-action.png](https://qiita-image-store.s3.amazonaws.com/0/43745/1c4c610c-5d92-2034-3ef3-2323f85c1bda.png)

アクションの選択画面で「メールを送信する」をタップします。

![gmail-action-mail.png](https://qiita-image-store.s3.amazonaws.com/0/43745/08fe2a93-5c00-5229-c660-13a2727c1b8d.png)

送信先メールアドレス、件名、本文はすべて必須項目です。

![gmail-action-detail.png](https://qiita-image-store.s3.amazonaws.com/0/43745/639f77d8-23dc-3842-831d-6285dac0838f.png)


アクションの詳細設定が終わったらOKボタンをタップすると、組み合わせの作成画面に戻ります。


とりあえず「実行タイミング」と「曜日指定」はデフォルトのまま、「作成」ボタンをタップして終了します。

![gmail-action-created.png](https://qiita-image-store.s3.amazonaws.com/0/43745/97dbdd91-332d-93a5-9476-348cf067657f.png)


組み合わせの作成が完了して組み合わせ一覧画面に戻ります。


## 「IDCF」チャンネルサーバー

### トリガーのURLとデータの保存

myThingsサーバーは一定間隔でメッセージの受信を確認しています。「IDCF」チャンネルをトリガーに使う場合は、myThingsサーバーが非同期でメッセージを取得できるようにデータを保存しておく必要があります。

HTTPを使う場合は、`/data/{triggerのuuid}`にメッセージをPOSTすると「IDCF」チャンネルのデータベースにデータが保存されます。myThingsサーバーは新しいデータが取得できると、トリガー条件を満たしてアクションを実行します。


### trigger-1デバイスの確認

最初に「IDCF」チャンネルサーバーをインストールしたIDCFクラウドの仮想マシンにログインします。myThingsアプリのアクションに選択した`trigger-1`のuuidとtokenを確認します。

```bash
$ cd ~/iot_apps/meshblu-compose
$ docker-compose run --rm iotutil show -- -k trigger-1

> iotutil@0.0.1 start /app
> node app.js "show" "-k" "trigger-1"

┌───────────┬──────────┬──────────────────────────────────────┐
│ keyword   │ token    │ uuid                                 │
├───────────┼──────────┼──────────────────────────────────────┤
│ trigger-1 │ d74ebedf │ 21c83792-b25e-4ae7-a627-714af57a1a4b │
└───────────┴──────────┴──────────────────────────────────────┘
```

### curlコマンドでトリガーをだし、動作をかくにんする

確認したデバイス情報を使ってcurlコマンドを実行します。URLの`data`の後ろに`trigger-1`のuuidを指定します。また、HTTPヘッダの認証情報にmyThingsアプリのトリガーに指定した`trigger-1`のuuidとtokenを指定します。

* URL: 「IDCF」チャンネルに割り当てたIPアドレス + '/data/' + uuid
* データ: 任意(現在このデータをアクションに渡す事はできません)
* meshblu_auth_uuid: trigger-1のuuid
* meshblu_auth_token: trigger-1のtoken

```bash
$ curl -X POST \
  "http://210.140.162.58/data/21c83792-b25e-4ae7-a627-714af57a1a4b" \
  -d 'temperature=over' \
  --header "meshblu_auth_uuid: 21c83792-b25e-4ae7-a627-714af57a1a4b" \
  --header "meshblu_auth_token: d74ebedf"
```

### Raspberry Pi上で動作するPythonからトリガーをだす


スイッチサイエンスから発売されている[myThingsをはじめようキット](https://www.switch-science.com/catalog/2366/)にも同梱されている[BME280](https://www.switch-science.com/catalog/2236/)の環境センサーを使ったサンプルコードです。リポジトリは[こちら](https://github.com/IDCFChannel/bme280-meshblu-py/blob/master/bme280_data.py)です。５秒間隔で計測した気温がconfig.pyに定義した閾値の27度を超えたら、「IDCF」チャンネルサーバーにHTTP POSTします。

```python:bme280_data.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
from time import sleep
import json
import bme280
import requests
from config import conf

def sensing():
    return bme280.readData()

def main():
    # HTTP
    url = "http://{0}/data/{1}".format(conf["IDCF_CHANNEL_URL"],
                                       conf["TRIGGER_1_UUID"])
    headers = {
        "meshblu_auth_uuid": conf["TRIGGER_1_UUID"],
        "meshblu_auth_token": conf["TRIGGER_1_TOKEN"]
    };
    payload = {"trigger":"on"}

    while True:
        sleep(5)
        retval = sensing()
        if retval:
             if float(retval["temperature"]) > conf["THRESHOLD"]:
                 r = requests.post(url, headers=headers, data=payload)

if __name__ == '__main__':
    main()
```

設定ファイルには、「IDCF」チャンネルサーバーのパブリックIPアドレス、`trigger-1`のuuidとtokenも指定します。

```python:config.py
conf = {
     "IDCF_CHANNEL_URL": "210.140.162.58",
     "TRIGGER_1_UUID": "21c83792-b25e-4ae7-a627-714af57a1a4b",
     "TRIGGER_1_TOKEN": "d74ebedf",
     "THRESHOLD": 27.0
}
```

依存関係にある[requests](https://pypi.python.org/pypi/requests)パッケージをインストールします。

```bash
$ sudo pip install requests
```

プログラムの実行にはroot権限が必要です。

```bash
$ chmod +x bme280_data.py
$ sudo ./bme280_data.py
```

### データの確認

IDCFクラウドの仮想マシンにログインして「IDCF」チャンネルをインストールしたディレクトリに移動してMongoDBのレコードを確認してみます。

```bash
$ cd ~/iot_apps/meshblu-compose
$ docker exec -it meshblucompose_mongo_1 mongo skynet
> db.data.find().sort({ $natural: -1 }).limit(1)
{ "_id" : ObjectId("55e55ba8a9f3a50f0013bcee"), "temperature" : "over", "ipAddress" : "210.168.36.155", "uuid" : "21c83792-b25e-4ae7-a627-714af57a1a4b", "timestamp" : "2015-09-01T08:02:48.465Z" }
>
```

## 手動実行でテスト

myThingsサーバ側からの状態確認は15分毎なので、myThingsアプリをつかって、手動で強制的にmyThingsサーバからIDCFチャンネルサーバに状態を確認しにいかせます。

myThingsアプリから組み合わせ一覧を開きます。

![recipe-list.png](https://qiita-image-store.s3.amazonaws.com/0/43745/bec6ef0d-bf92-baa6-3032-f993c46c918f.png)


IDCFとGmailの組み合わせをタップして詳細画面に移動します。

![gmail-action-created.png](https://qiita-image-store.s3.amazonaws.com/0/43745/7df7b646-88ad-e6bc-2007-ca0055f7a261.png)


「手動実行」ボタンをタップすると、デフォルトで15分間隔の実行タイミングを待たなくても、すぐに組み合わせを実行することができます。

![recipe-executed.png](https://qiita-image-store.s3.amazonaws.com/0/43745/ac860945-4d83-c550-7fd5-fdc0772ac8fb.png)


「タイムライン」画面に移動すると、手動実行の履歴が表示されています。

![recipe-history.png](https://qiita-image-store.s3.amazonaws.com/0/43745/cd25fd03-2875-eb3a-cbda-b0e40404886b.png)


Gmailアプリの受信トレイを開くと、myThingsのアクションからメールが届きました。

![gmail-received.png](https://qiita-image-store.s3.amazonaws.com/0/43745/48abf0d5-913a-f781-d4a3-c6bcb67b16d8.png)