Watson IoT Platformでルールを使ってみる

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。

# セットアップ
1. [デバイスを登録してセンサーデータを送信する](http://qiita.com/egplnt/items/e9af5d5abeab08f5a455)を参照し、IoT Platformサービスを新たに作成してIoTアプリに接続し、デバイスを登録し、IoTデータを送信できるようにします
2. [アプリを登録してセンサーデータを受信する](http://qiita.com/egplnt/items/552b91210be5d03430b4)を参照し、APIキーを取得して、アプリケーションからpub/sub可能にします (アプリはこのサンプルでは当面使用しませんが、用意しておくと確認作業などでなにかと便利です）
3. ここでは、サンプルとして下記のクライアント（デバイス側）アプリを使用します

```py:devicePub.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import time
import paho.mqtt.client as mqtt
import threading
import random

#Set the variables for connecting to the iot service
broker = ""
username = "use-token-auth"
password = "123456789012345678" #auth-token
organization = "123456" #org_id
deviceType = "device_type_xxx"
deviceSerial = "deviceIdxxx"

topic = "iot-2/evt/status/fmt/json"

#Creating the client connection, set clientID and broker
clientID = "d:" + organization + ":" + deviceType + ":" + deviceSerial
broker = organization + ".messaging.internetofthings.ibmcloud.com"
mqttc = mqtt.Client(clientID)

#Set authentication values, if connecting to registered service
if username is not "":
	mqttc.username_pw_set(username, password=password)

mqttc.connect(host=broker, port=1883, keepalive=60)

#Publishing to IBM Watson IoT Platform
mqttc.loop_start()

while mqttc.loop() == 0:

	temp = random.randrange(-10,40)
	depth = random.randrange(-3,50)
	print "temp = " + str(temp) + ", depth = " + str(depth)
	msg = " {\"d\": {\"temperature\": " + str(temp) +",\"depth\": " + str(depth) + "} }";
	mqttc.publish(topic, payload=msg, qos=0, retain=False)

	print "message published"

	time.sleep(5)
	pass
```

![スクリーンショット 2016-10-04 17.31.04.png](https://qiita-image-store.s3.amazonaws.com/0/125842/8391feaf-3fc3-05f1-dfb9-b8aadb780d23.png)

# デバイスのプロパティの準備
1. 後述のボードやルールで参照するため、デバイスからのデータをプロパティとして登録しておきます
2. Watson IoT Platformの画面左側のメニューから「デバイス」を開き、右端の「スキーマの管理」メニューを選択します
![スクリーンショット 2016-10-04 17.41.21.png](https://qiita-image-store.s3.amazonaws.com/0/125842/d7b89fdb-1247-63a4-ac14-0b3dc23c991d.png)

3. 画面右上の「＋スキーマの追加」を選択します
4. 「デバイスタイプ」として前項で作成したデバイスタイプを選択します
5. 「プロパティ」を選択し、「接続先から」タブを開いたまま、前項のクライアントアプリを稼働させると、Watson IoT Platformへ到達しているデータがプロパティ選択の候補として表示されます
6. ここでは`temperature`と`depth`を選択しています
![スクリーンショット 2016-10-04 18.10.51.png](https://qiita-image-store.s3.amazonaws.com/0/125842/9f1f7a8f-df79-765e-e9f4-65f951568098.png)


# ボードを使ってリアルタイムのグラフを表示
1. IoT Platform画面左側のメニューから、一番上の「ボード」を選択します
![スクリーンショット 2016-10-04 17.32.21.png](https://qiita-image-store.s3.amazonaws.com/0/125842/cd1f7520-dfc0-fc69-7150-e477027d2403.png)

2. 「自分のボード」の画面で、「USAGE OVERVIEW」を開きます
![スクリーンショット 2016-10-04 17.33.47.png](https://qiita-image-store.s3.amazonaws.com/0/125842/9dd99bec-eebb-a358-48ce-8e5838b4492a.png)

3. 画面右上の「＋新しいカードの追加」メニューを選択します
4. 適宜「折れ線グラフ」などを選択します
5. 対象とするデバイスを選択します
![スクリーンショット 2016-10-04 17.34.55.png](https://qiita-image-store.s3.amazonaws.com/0/125842/321c3603-d90b-7e6d-1a41-24ed0610dbe0.png)

6. 「データセットの接続」で前項で準備した`temperature`などを選択します
7. 「次へ」を押して、グラフのサイズ（あとから変更可能です）、グラフの色、などを選択していきます
8. 「送信」ボタンを押し、グラフを作成します。グラフ右上の属性設定メニューからグラフのサイズなどを変更可能です
![スクリーンショット 2016-10-04 18.14.22.png](https://qiita-image-store.s3.amazonaws.com/0/125842/0adfc6b7-dce1-ddc9-25e6-c2ec994c60a8.png)

9. カードの配置はドラッグ＆ドロップで変更可能です

# ルールを作成し、アラートを発行してみます
1. Watson IoT Platform画面左側のメニューから「ルール」を選択します
2. 画面右上の「＋クラウド規則の作成」メニューで、ルール名を指定し、対象とするプロパティを指定します。ここでは`temperature`を選択しています。`d`の左側の下向き三角形をクリックすると`d`配下の選択可能なプロパティが表示されます
![スクリーンショット 2016-10-04 18.16.04.png](https://qiita-image-store.s3.amazonaws.com/0/125842/aa906cdb-d7c4-9593-5e13-558a5738e4ce.png)

3. ルールで判断する閾値を設定します。ここでは、固定値で３０℃以上になったらアラートを発行する、と設定しています
![スクリーンショット 2016-10-04 18.17.54.png](https://qiita-image-store.s3.amazonaws.com/0/125842/6b65fe07-5277-dad5-1089-696a6ac9ac2d.png)

4. アクションを指定します。「アクションの追加」タイルをクリックし、メールの送信などを設定します
![スクリーンショット 2016-10-04 18.19.27.png](https://qiita-image-store.s3.amazonaws.com/0/125842/612fdb8b-8407-3a99-fee1-3b78b70507d2.png)

5. Node-REDへの連携を行う場合、Node-RED側に`HTTP IN`ノードを用意し、そこで指定したURL（例：`/alert`)を追加して、アクションに指定するURLとして`http://IoTアプリ名.mybluemix.net/alert`のように指定します
![スクリーンショット 2016-10-04 18.30.52.png](https://qiita-image-store.s3.amazonaws.com/0/125842/52f3930c-c202-237b-9977-88d1294febce.png)
![スクリーンショット 2016-10-04 18.36.34.png](https://qiita-image-store.s3.amazonaws.com/0/125842/56093428-dff5-2135-9e47-d6ee6850c1ba.png)

6. デバイスからのデータが閾値に達すると、アクションが実行されます
![スクリーンショット 2016-10-04 18.24.28.png](https://qiita-image-store.s3.amazonaws.com/0/125842/8a41fa9a-0050-23c9-8254-2493c3c5de3e.png)
![スクリーンショット 2016-10-04 18.37.01.png](https://qiita-image-store.s3.amazonaws.com/0/125842/df8a6f88-f9f8-3b27-2d73-80f71d0b231c.png)
7. 放っておくとあっという間にメールが大量に届いてしまうので、必要時以外はルールは非アクティブ化しておきます
![スクリーンショット 2016-10-04 18.43.11.png](https://qiita-image-store.s3.amazonaws.com/0/125842/cffe78f1-88e4-e0c9-9cb2-1274e8887ce6.png)