センサーデータを30分くらいで可視化したった

記事タイトルとURLをコピーする

「Windowsはゲーム専用OS」と信じている竹永です。 あっ、やめて。そんな怖い顔しないで。

前回の記事では値をセンサーから引っ張りだしました。

せっかく引っ張りだした値も、数字を見て「へー」で終わるのはおもしろくないので、
Amazon Elasticsearch Service(Amazon ES)を使ってとっとと可視化します。

つかうもの

  • Amazon Elasticsearch Service
  • 前の記事でつくったやつ

Amazon ESを起動する

Amazon ESの起動手順はこちらをご覧ください。

起動には10分ほどかかるので、この間にElasticsearchに値を飛ばす準備をします。

コードをいじくる

前回作ったコードをちょちょいと弄るだけで、Elasticsearchに値を格納できます。

まず、ElasticsearchとはHTTP(S)で通信するので、そのへんのライブラリを require します。

// 使うライブラリを require する
var Util = require('util');
var Async = require('async');
var SensorTag = require('sensortag');
/* ↓の行を追加 */
var Https = require('https');

次はAmazon ESにPOSTする関数を追加します。
require の下あたりに置いておけばきっと動いてくれます。

hostnameにはAmazon ESのEndpointを入力してください。

function postData(json_text) {
  var https_options = {
    /* ここは環境に合わせて書き換える↓ */
    hostname: 'search-hogehogera-xxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com',
    port: 443,
    path: '/sensordata/sensortag/',
    method: 'POST',
    headers: { 'Content-Length': Buffer.byteLength(json_text) }
  };

  var post_req = Https.request(https_options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function(chunk) { Util.log('Response: ' + chunk); });
  });

  Util.log('POST: ' + json_text);
  post_req.write(json_text);
  post_req.end();
}

次に、センサーが吐き出すデータに時刻情報をくっつけます。
やっぱりこういうデータは時系列で見たいですよね。

function readSensorsValue(sensorTag) {
  Util.log('Reading sensors value: ' + sensorTag);
  sensorData = {};
  /* これ↓を追加 */
  sensorData.timestamp = new Date().toISOString();

最後に、センサーの値をAmazon ESに飛ばすようなコードを追加します。

    function(callback) {
      // 集めたセンサーの値をコンソールに出力
      Util.log(sensorData);
      /* これ↓を追加 */
      postData(JSON.stringify(sensorData));

あとは実行すれば値が飛んでいきます。

# node sensor.js
19 Feb 18:37:57 - discoverAll
19 Feb 18:38:26 - Discovered: {"id":"xxxxxxxxxxxx","type":"cc2650"}
19 Feb 18:38:26 - enableIrTemperature
19 Feb 18:38:26 - enableHumidity
19 Feb 18:38:38 - Reading sensors value: {"id":"xxxxxxxxxxxx","type":"cc2650"}
19 Feb 18:38:39 - { timestamp: '2016-02-19T09:38:38.969Z',
  ambTemp: 27.71875,
  humidity: 58.917236328125 }
19 Feb 18:38:39 - POST: {"timestamp":"2016-02-19T09:38:38.969Z","ambTemp":27.71875,"humidity":58.917236328125}
19 Feb 18:38:40 - Response: {"_index":"sensordata","_type":"sensortag","_id":"AVL45UPldmnhkxPNoD9g","_version":1,"created":true}
19 Feb 18:38:48 - Reading sensors value: {"id":"xxxxxxxxxxxx","type":"cc2650"}
19 Feb 18:38:49 - { timestamp: '2016-02-19T09:38:48.977Z',
  ambTemp: 27.65625,
  humidity: 58.209228515625 }
19 Feb 18:38:49 - POST: {"timestamp":"2016-02-19T09:38:48.977Z","ambTemp":27.65625,"humidity":58.209228515625}
19 Feb 18:38:50 - Response: {"_index":"sensordata","_type":"sensortag","_id":"AVL45WhYdmnhkxPNoD9h","_version":1,"created":true}
...

Kibanaで値を見る

Amazon ESにはKibanaがプリインストールされているので、可視化もすぐにできます。

Management Consoleに書いてあるKibanaのリンクをクリックしましょう。
Kibana

リンクをクリックした後、Kibanaを初めて使う場合はたぶん下図のような画面がでてくるので、IndexとTime-fieldの設定をします。
今回作成したコードだと、下図のまんまで設定すれば大丈夫です。
Index設定

設定が終わったらDiscoverタブで値が見えるはずです。
Discover

さらにさらに、VisualizeタブでLine chartを選び…
Visualization作成

下図のような設定をすれば温度の履歴が見れます。
Visualizationサンプル

直感的に使いやすいツールではありますが、ググると他の使い方がみれて楽しいです。

おわり

以上、Amazon ESとちょっとのコード変更だけで可視化してみました。
センサー1台、温度と湿度だけ、可視化はKibanaのシンプルな構成ではありますが、可視化のおもしろさが伝われば幸いです。

この調子でいろいろなものを可視化してみてはどうでしょうか。