IoT

SensorTagのデータをBeagleBone BlackのInfluxDB +Grafanaで可視化

BeagleBone Black の Node-RED と Docker を使って、SensorTag のデータを InfluxDB +Grafana で可視化してみました。

Stretch IoT (non-GUI) for BeagleBone

OSはnon-GUIのDebian 9.2を使いました。

https://beagleboard.org/latest-images
Stretch IoT (non-GUI) for BeagleBone and PocketBeagle via microSD card

Docker

まずは、dockerをインストール

1
2
$ curl -sSL https://get.docker.com/ | sh
$ sudo usermod -aG docker debian

InfluxDB

InfluxDBをdockerで起動

1
$ docker run -d -p 8086:8086 influxdb

“mydb”という名前のDATABASEを作成

1
$ curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb"

Retention Policy設定はとりあえず、1日分だけ残すことにしました。

1
$ curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE RETENTION POLICY one_day_only ON mydb DURATION 1d REPLICATION 1"

Node-RED

Node-REDはdockerではなく、ホストで起動しているものを使いました。

SensorTagとInfluxDBのNodeを追加

SensorTagノードは、今回ほんの少しカスタマイズを入れています。

1
2
3
$ sudo npm install -g https://github.com/yagitsawa/node-red-contrib-sensortag.git
$ sudo npm install -g node-red-contrib-influxdb
$ sudo service node-red restart

flow例

1
[{"id":"de5494a3.eabc28","type":"function","z":"10a1da09.e70b46","name":"function","func":"payload = [\n msg.payload.json_data,\n{\n\tuuid: msg.payload.uuid,\n\tsensor: msg.payload.sensor\n}];\nmsg.payload = payload;\nreturn msg;","outputs":1,"noerr":0,"x":220,"y":180,"wires":[["bcbff807.c28c38"]]},{"id":"9713acf5.956ea","type":"sensorTag","z":"10a1da09.e70b46","name":"sensorTag","devices":[],"temperature":true,"humidity":true,"pressure":true,"magnetometer":true,"magnetometerPeriod":1000,"accelerometer":true,"accelerometerPeriod":1000,"gyroscope":true,"gyroscopePeriod":1000,"luxometer":true,"luxometerPeriod":1000,"keys":true,"x":198,"y":85,"wires":[["de5494a3.eabc28"]]},{"id":"bcbff807.c28c38","type":"influxdb out","z":"10a1da09.e70b46","influxdb":"c1e8a9d8.4b1688","name":"influxdb out","measurement":"sensorTag","precision":"","retentionPolicy":"","x":242,"y":270,"wires":[]},{"id":"c1e8a9d8.4b1688","type":"influxdb","z":"","hostname":"localhost","port":"8086","protocol":"http","database":"mydb","name":"mydb","usetls":false,"tls":""}]

function node

functionノードの内容は以下の通りです。

今回カスタマイズで追加したuuidとsensorNameを、payloadに追加しています。

これが後で役に立つことになるはずです。

1
2
3
4
5
6
7
8
payload = [
msg.payload.json_data,
{
uuid: msg.payload.uuid,
sensor: msg.payload.sensor
}];
msg.payload = payload;
return msg;

influxdb out node

influxdb outノードは以下のとおり設定

  • Server: mydb
  • Measurement: sensorTag

Server設定は以下の通り

  • Host: localhost
  • Port: 8086
  • Database: mydb
  • ユーザ名: root
  • パスワード: root
  • 名前: mydb

ここまでの設定でデプロイすると、InfluxDBにSensorTagのデータが蓄積されていくようになりました。

Grafana

Grafanaの公式イメージはarmhfに対応していないため、以下のイメージを使いました。
https://hub.docker.com/r/fg2it/grafana-armhf/

ポート番号3000はホストのCloud9に使われているので、3030を利用しました。

1
$ docker run -d -p 3030:3000 --name grafana fg2it/grafana-armhf:v4.6.1

http://beaglebone.local:3030 に、admin/adminでログイン

Edit data source

データソースの設定をします。

  • Name: SensorDB(ここはなんでもよいです)
  • Type: InfluxDB

HTTP settings

InfluxDB Details

  • Database: mydb
  • User: root
  • Password: root

Dashboard

ダッシュボードに各センサ用のグラフを追加していきます。

pressure の設定を例として以下に書きます。

  • FROM default sensortag WHERE sensor = pressure

    複数のsensorTagを使う場合はWHEREにuuidの条件も追加すればよいはずです。

  • SELECT field(pressure) mean()
  • GROUP BY time($_interval) fill(null)
  • FORMAT AS Time series
  • ALIAS BY pressuer

すべてのセンサのグラフをダッシュボードに設定にすると、以下のようになりました。

非常に簡単に見栄えの良い可視化ができました。

この他にInfluxDBとGrafanaはユーザ/パスワードの設定などを行うほうがよいはずですが、今回はここまでとします。