Edison につないだセンサーのデータを簡単にグラフ化したかったんですが、Mackerel が使えるんじゃないかなと思って試してみました。Linux だし動くよね?
機器構成
以下の記事とほぼ同じ機器構成なので、デバイスのセットアップや mraa ライブラリのアップデートなどはそちらを参考に。Intel Edison Board for Arduino を使うと、Arduino 用の周辺デバイスをそのまま使うことができますし、Arduino 用のプログラムをそのまま動かすこともできます(この記事では Arduino 用のプログラムは使っていません)。
Edisonを使ってセンサデータをAmazon Kinesisにあげてみる【前編】
以下の写真のように、温度センサーを A0 ポートに接続しています。
mackerel-agent のビルド (Mac 上でクロスコンパイル)
mackerel-agent は Go 言語で書かれているのでクロスコンパイルが可能です。Edison 上に Go 環境をセットアップすることもできると思いますが、ここでは Mac 上でクロスコンパイルして Edison 用のバイナリをビルドします。Edison の CPU は 32bit なので linux/386 向けにビルドします。
まずは linux 32bit 向けのビルドができるように準備します。
$ cd /usr/local/go/src/
$ sudo GOARCH=386 GOOS=linux /usr/local/go/src/make.bash
...
---
Installed Go for linux/386 in /usr/local/go
Installed commands in /usr/local/go/bin
$
次に mackerel-agent をビルドします。適当なディレクトリでソースを clone してビルドします。
$ git clone https://github.com/mackerelio/mackerel-agent
$ cd mackerel-agent
$ GOARCH=386 GOOS=linux make build
作成されたバイナリを見ると 32bit のバイナリであることがわかります。
$ file build/mackerel-agent
build/mackerel-agent: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped
mackerel-agent の起動
前項で作成したバイナリを scp 等で Edison 上にコピーします。今回は /usr/local/bin ディレクトリを作成して、そこに配置しました。
次に mackerel-agent の設定ファイルを準備します。Mackerel の方で調べた apikey を設定します。
apikey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
これで準備ができたので mackerel を起動します。
# mackerel-agent
2014/12/20 01:25:59 INFO main Starting mackerel-agent version:0.13.0, rev:2074674
2014/12/20 01:26:00 INFO command Start: apibase = https://mackerel.io, hostName = eharaedison, hostId = XXXXXXXXXXX
問題なく起動しました!しばらくまって Mackerel のページを見ると、edison のホストが追加されています。
Mackerel プラグインの作成
Mackerel の設定はできたので、センサーデータを取得するプラグインを追加します。
AO ポートに接続した温度センサーからアナログ値を取得し、それを温度に変換して Mackerel プラグイン形式で出力するプログラムを Node.js で作成します。
var m = require('mraa');
function value2temp(value) {
var B = 3975;
var r = (1023-value)*10000/value;
var temp = 1/(Math.log(r/10000)/B+1/298.15)-273.15;
return temp;
}
var value = new m.Aio(0).read();
var temp = value2temp(value);
var time = Math.round(new Date()/1000);
console.log(["temperature", temp, time].join('\t'));
センサーから取得される 0〜1023 の値を摂氏温度に変換する式は、利用しているセンサーの製品ページで調べました。
このプログラムを単体で実行して、値が出力されることを確認します。
# node /etc/mackerel-agent/temperature.js
temperature 15.324009428797353 1419039532
Mackerel プラグインの設定
プラグインを作成したので、これをカスタムメトリックとして Mackerel に送信するよう mackerel-agent.conf に設定を追加します。
apikey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
[plugin.metrics.temperature]
command = "node /etc/mackerel-agent/temperature.js"
設定を追加して mackerel-agent を再起動すると、温度データが Mackerel に送信されるようになります。簡単ですね!
これは3日間くらい計測しつづけた状態のグラフです。センサーをエアコンの近くに置いていたので、エアコンをつけたタイミングで大きく上振れしてしまっています。エアコンを常時付けている状態だと、ちゃんと20度超の状態で安定していることがわかります。