センサーデータにタイムスタンプを付けてCloudantに保管する流れを、Node-REDを使ってセンサーデータをCloudantに格納するに書きました。
今回は、Cloudantに保管したデータを利用する方法について書きます。
Node-REDを使ってHTTP GETリクエストを受け付けるフローを作成し、この中でCloudantからセンサーデータを取得するようにします。
前提
Node-REDを使ってセンサーデータをCloudantに格納するのフローをBluemix上のNode-REDにデプロイ済みであることとします。
作業の流れ
- CloudantにSearchIndexを作成する
- Node-REDを使って、HTTP GETリクエストを受け付けるフローを作成する
- 動作確認
1. CloudantにSearchIndexを作成する
Cloudantには、以下の形式でデータが保管されています。Cloudant保管時に任意に付けられる*_idがキーとなっています。
今回は、タイムスタンプで検索ができるようにtimestamp*をキーとするCloudantのSearch Indexを作成します。Search Indexを利用することで、Luceneの書式で検索できるようになります。
{
"_id": "07f647f960d8f2cba14221f96646df60",
"_rev": "1-26ae484039d6ad18c39f1ce0117c6634",
"timestamp": "2015-04-23 07:52:21",
"temp": 15,
"humidity": 76,
"objectTemp": 24
}
Cloudantの管理コンソールでデータベースsensordataを選択した状態で、All Design Docsの右にある+ボタンをクリックします。続いてNew Search Indexをクリックします。
Save to Design Documentの**_design/**の後ろにIndex、Index nameにIndexByTimestampを入力します。Search index functionには、以下を入力します。これにより、Cloudantに格納したデータの中のtimestamp要素をキーとしたインデックスが生成されます。
function(doc){
index("timestamp", doc.timestamp, { "store": true });
}
TypeとしてKeywordを選択し、最後にSave & Build Indexをクリックします。これでSearch Indexが完成しました。
2. Node-REDを使って、HTTP GETリクエストを受け付けるフローを作成する
Node-REDでは、HTTPリクエストを受け付けるノードが用意されています。これを利用して、ブラウザやプログラムからHTTP GETリクエストを受け付けるフローを作成します。
GETリクエストのクエリーパラメーターは以下のとおりとします。
パラメータ名 | 用途 | 書式 |
---|---|---|
start | センサーデータのタイムスタンプの検索開始日時 | yyyy-mm-ddThhssZ |
end | センサーデータのタイムスタンプの検索終了日時 | yyyy-mm-ddThhssZ |
リクエストの例です。
http://sample.mybluemix.net/sensordata?start=2015-04-22T19:40:00Z&end=2015-04-22T19:40:00Z
それではフローを作成します。Node-REDのフローエディターを使って、以下のフローを作成します。
以下の5つのノードを利用しています。
ノード | 用途 | |
---|---|---|
httpノード | HTTPリクエストの受付 | |
functionノード | リクエストパラメータからCloudant検索用文字列の生成 | |
Cloudantノード | Cloudantからのデータ取得 | |
http responseノード | クライアントへレスポンス送信 | |
Debugノード | 出力結果確認 |
httpノードの構成
httpノードは、以下のとおり構成しています。HTTPのGETメソッドを利用し、URLのパスを*/sensordataとしています。ここで設定したパスを含むURLは、Node-REDフローエディターのFQDNにパスを加えたものとなります。
たとえば、フローエディターのURLがhttp://sample.mybluemix.net/red/*の場合、ここで設定するGETリクエストのURLは、*http://sample.mybluemix.net/sensordata*となります。
functionノードの構成
Cloundantの検索に使用する文字列を生成します。以下のJSON形式のデータをCloudantの検索に使用します。
{
"query": "[ start_date TO end_date ]",
"limit": 200
}
queryの部分にLuceneの記法の検索文字列を入力します。今回は、start_dateとend_dateの部分が、HTTP GETリクエストのクエリーパラメーターで受け取る値を使用するようにします。
Search Indexのクエリー結果は、デフォルトで25件までしか返さないようになっています。この制限を変更するために、limitを200としています。残念ながら、制約として、200を超える結果を返すことはできません。
functionノードに登録するスクリプトは、以下のとおりです。
msg.payload = {
"query": "timestamp:[" + msg.payload.start + " TO " + msg.payload.end + "]",
"limit": 200
}
return msg;
Cloudantノードの構成
Cloudantノードの設定は以下のとおりです。
設定項目 | 内容 |
---|---|
Service | Bluemix上に作成されたCloudantのサービス名を選択します |
Database | Cloudantに作成したデータベース名であるsensordataを入力します |
Search by | search indexを選択します。対象のIndexとして、Search Indexの作成で作成してIndexを指定します。 |
Name | ノードに付ける名前です。任意の値で問題ありません。 |
http responseノードの構成
http responseノードは、ノードの名前以外に設定項目はありません。任意の名前をつけてください。
(参考)サンプルフローのインポート
以下のJSONを、Node-RED小ワザ集の小ワザ1. フローのインポートの方法を使ってインポートすることで、サンプルフローを復元できます。
[{"id":"8adf6400.6d175","type":"http in","name":"Get Sensor Data","url":"/sensordata","method":"get","x":125,"y":359,"z":"56be2dc6.6f2e4c","wires":[["bce3b962.ddd648"]]},{"id":"5a004193.4e4b7","type":"cloudant in","service":"IoTFSample-cloudantNoSQLDB","cloudant":"","name":"Get Sensor Data from Cloudant","database":"sensordata","search":"_idx_","design":"Index","index":"IndexByTimestamp","x":367,"y":439,"z":"56be2dc6.6f2e4c","wires":[["43775b51.c3a424","7b27b5c9.f5f754"]]},{"id":"43775b51.c3a424","type":"http response","name":"Response to Client","x":636,"y":439,"z":"56be2dc6.6f2e4c","wires":[]},{"id":"7b27b5c9.f5f754","type":"debug","name":"Check Output","active":false,"console":"false","complete":"payload","x":560,"y":361,"z":"56be2dc6.6f2e4c","wires":[]},{"id":"bce3b962.ddd648","type":"function","name":"Create Query","func":"msg.payload = {\n \"query\": \"timestamp:[\" + msg.payload.start + \" TO \" + msg.payload.end + \"]\",\n \"limit\": 200\n}\n\nreturn msg;","outputs":1,"valid":true,"x":318,"y":359,"z":"56be2dc6.6f2e4c","wires":[["5a004193.4e4b7"]]}]
フローのデプロイ
以上でフローの作成は完了です。フローエディター右上の をクリックして、フローをデプロイします。
3. 動作確認
ブラウザを利用して、動作を確認します。クエリーパラメーターとして検索開始日時のstartと検索終了日時のendを指定して、httpノードを構成した際に入力したURLにアクセスします。
アクセスするURLの例です。
http://sample.mybluemix.net/sensordata?start=2015-04-22T19:30:00Z&end=2015-04-22T19:36:00Z
以下のレスポンスを取得することができました。
[
{
"_id": "40384c3ef6fb489997adc0530819e2d3",
"_rev": "1-6033dce739fee18f34063d7345fe61ed",
"timestamp": "2015-04-22T19:30:15Z",
"temp": 44,
"humidity": 51,
"objectTemp": 32
},
{
"_id": "38ab698d4e8f3c6e5e4f011db2cb5082",
"_rev": "1-c3118a250f8f40f56c23b27472403f1f",
"timestamp": "2015-04-22T19:30:41Z",
"temp": 44,
"humidity": 51,
"objectTemp": 32
},
{
"_id": "9f84503729658d77f5d28fd3c4a782a2",
"_rev": "1-c6a3a5e68e8aebff97e5f289925e2460",
"timestamp": "2015-04-22T19:30:47Z",
"temp": 44,
"humidity": 51,
"objectTemp": 32
},
{
"_id": "0f3c227bbc36bbec8e31b2eb877bdcd1",
"_rev": "1-4826ef6ded531287516107891033eee7",
"timestamp": "2015-04-22T19:31:13Z",
"temp": 44,
"humidity": 51,
"objectTemp": 32
}
]