ElasticsearchとKibanaを使ってArduinoからのセンサ情報を可視化


## Elasticsearch・Kibanaとは？
Elasticsearchは全文検索エンジンです。
Elasticsearchについては以下の記事が参考になります。

[知識ゼロからElasticsearchを実践で使えるようになろう！ - $shibayu36->blog;](http://blog.shibayu36.org/entry/2016/09/05/110000)

今回は全文検索に利用するのではなく、センサデータの保存に利用します。
その理由は、httpリクエストで容易にデータの登録が可能であり、また複雑な条件のクエリを非常に簡単に取得できるからです。

Kibanaとは、Elasticsearchの検索の結果の可視化ツールで、様々なグラフ表示が可能です。
どのような可視化ができるのかは、KibanaでGoogle画像検索をしてみると参考になります。

[kibana - Google 検索](https://www.google.co.jp/search?q=kibana&espv=2&biw=960&bih=983&source=lnms&tbm=isch&sa=X&ved=0ahUKEwisnY_zz6fPAhVBNZQKHfZiCyoQ_AUICCgB)

今回は、このElasticsearchとKibanaを使ってセンサ情報を可視化しようと思います。

## 準備
macOS環境を対象にします。
他のOSの場合は適宜読み替えてください。

ElasticsearchとKibanaはbrewで入れられますが、バージョンの違いなどにハマるのは時間の無駄もいいところなので、さくっと`docker`で準備します。

`docker-compose.yml`を用意します。

```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を用意します。

```map.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](http://qiita.com/akameco/items/1ff87b2ca368fd76d780)

上記のほかにElasticsearchにデータを投げるためにクライアントライブラリを利用します。

```
$ npm install --save elasticsearch
```

以下のコードを実行します。

```index.js
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`と入力します。

![スクリーンショット 2016-09-24 18.15.08.png](https://qiita-image-store.s3.amazonaws.com/0/15319/f3849abe-689a-693d-bfb6-3b044d2b53ff.png)


Y-AxisにAverage、X-AxisにDate Histogramを設定します。
更新間隔や表示時間の設定はわかりずらいですが、右上から設定可能です。

![スクリーンショット_2016-09-24_18_16_25.png](https://qiita-image-store.s3.amazonaws.com/0/15319/bca223d0-3afc-4b99-a7da-a98822657322.png)


以上で、リアルタイムのグラフ描画ができました。

![スクリーンショット 2016-09-24 18.19.54.png](https://qiita-image-store.s3.amazonaws.com/0/15319/2cc8bec6-8705-ebe6-4da9-62d79a4d630a.png)

このグラフはiframeとして出力可能なので、自分のサイトにも簡単に埋め込めます。
また、複数のセンサ情報をダッシュボードで表示するのもよさそうです。

## おわりに
ElasticsearchとKibanaを使うことで、センサデータを簡単に可視化できました。一つのセンサー情報だけでなく、様々な時系列データを表示も簡単にできそうです。また、AWS IoTなどと連携すればクラウドで管理することも簡単にできるでしょう。