Elasticsearch・Kibanaとは?
Elasticsearchは全文検索エンジンです。
Elasticsearchについては以下の記事が参考になります。
知識ゼロからElasticsearchを実践で使えるようになろう! - $shibayu36->blog;
今回は全文検索に利用するのではなく、センサデータの保存に利用します。
その理由は、httpリクエストで容易にデータの登録が可能であり、また複雑な条件のクエリを非常に簡単に取得できるからです。
Kibanaとは、Elasticsearchの検索の結果の可視化ツールで、様々なグラフ表示が可能です。
どのような可視化ができるのかは、KibanaでGoogle画像検索をしてみると参考になります。
今回は、このElasticsearchとKibanaを使ってセンサ情報を可視化しようと思います。
準備
macOS環境を対象にします。
他のOSの場合は適宜読み替えてください。
ElasticsearchとKibanaはbrewで入れられますが、バージョンの違いなどにハマるのは時間の無駄もいいところなので、さくっとdocker
で準備します。
docker-compose.yml
を用意します。
elasticsearch:
image: elasticsearch
ports:
- "9200:9200"
- "9300:9300"
hostname: elasticsearch
container_name: elasticsearch
kibana:
image: kibana
ports:
- "5601:5601"
links:
- elasticsearch
container_name: kibana
立ち上げ。
$ docker-compose up -d
これでElasticsearchとKibanaが用意できました。
簡単ですね。
今回はPluginを使いませんが、全文検索エンジンとして使う場合はkuromoji等のプラグインを入れる処理を書く必要があるでしょう。
マッピング
Elasticsearchにどんなデータが飛ぶのか教える必要があります。
今回は簡単なセンサなので、時系列表示のためのDate
情報と一つの値だけあればいいでしょう。
そこで、以下のようなjsonを用意します。
{
"mappings": {
"test": {
"properties": {
"date": {
"type": "date",
"format": "date_time"
},
"value": {
"type": "integer"
}
}
}
}
}
$ curl -XPOST localhost:9200/test -d @map.json
{"acknowledged":true}
これでElasticsearch側の準備は完了です。
センサから入力
ArduinoをMacに繋いでセンサ情報を受け取ります。
ArduinoはNode.jsを利用して操作します。
Arduinoの環境の準備およびセンサ情報の取得については以下の記事を参考にしてください。
【jonny-five】node.jsでArduinoを操作する。Lチカからセンサ入力まで - Qiita
上記のほかにElasticsearchにデータを投げるためにクライアントライブラリを利用します。
$ npm install --save elasticsearch
以下のコードを実行します。
const five = require('johnny-five');
const elasticsearch = require('elasticsearch');
const client = new elasticsearch.Client({
host: 'localhost:9200',
log: 'trace'
});
const board = new five.Board();
const esIndex = 'test';
const esType = 'test';
board.on('ready', () => {
const sensor = new five.Sensor('A0');
sensor.on('change', v => {
client.create({
index: esIndex,
type: esType,
body: {
value: Number(v),
date: new Date()
}
});
});
});
これだけで、アナログインプットが受け取った値をElasticsearchに投げることができます。
Kibanaで可視化
あとはKibanaで表示するだけです。
localhost:5601
を開き、Configure an index pattern
を設定します。
先程、test
という名前のインデックスとtest
という名前のタイプを設定したので、test
と入力します。
Y-AxisにAverage、X-AxisにDate Histogramを設定します。
更新間隔や表示時間の設定はわかりずらいですが、右上から設定可能です。
以上で、リアルタイムのグラフ描画ができました。
このグラフはiframeとして出力可能なので、自分のサイトにも簡単に埋め込めます。
また、複数のセンサ情報をダッシュボードで表示するのもよさそうです。
おわりに
ElasticsearchとKibanaを使うことで、センサデータを簡単に可視化できました。一つのセンサー情報だけでなく、様々な時系列データを表示も簡単にできそうです。また、AWS IoTなどと連携すればクラウドで管理することも簡単にできるでしょう。