LoginSignup
19
20

More than 5 years have passed since last update.

Edison + Mackerel で室温モニタリング

Posted at

Edison につないだセンサーのデータを簡単にグラフ化したかったんですが、Mackerel が使えるんじゃないかなと思って試してみました。Linux だし動くよね?

機器構成


以下の記事とほぼ同じ機器構成なので、デバイスのセットアップや mraa ライブラリのアップデートなどはそちらを参考に。Intel Edison Board for Arduino を使うと、Arduino 用の周辺デバイスをそのまま使うことができますし、Arduino 用のプログラムをそのまま動かすこともできます(この記事では Arduino 用のプログラムは使っていません)。

Edisonを使ってセンサデータをAmazon Kinesisにあげてみる【前編】

以下の写真のように、温度センサーを A0 ポートに接続しています。

edison_sensor.png

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 を設定します。

/etc/mackerel-agent/mackerel-agent.conf
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-edison.png

Mackerel プラグインの作成


Mackerel の設定はできたので、センサーデータを取得するプラグインを追加します。

AO ポートに接続した温度センサーからアナログ値を取得し、それを温度に変換して Mackerel プラグイン形式で出力するプログラムを Node.js で作成します。

/etc/mackerel-agent/temperature.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 の値を摂氏温度に変換する式は、利用しているセンサーの製品ページで調べました。

Grove - Temperature Sensor

このプログラムを単体で実行して、値が出力されることを確認します。

# node /etc/mackerel-agent/temperature.js 
temperature 15.324009428797353  1419039532

Mackerel プラグインの設定


プラグインを作成したので、これをカスタムメトリックとして Mackerel に送信するよう mackerel-agent.conf に設定を追加します。

/etc/mackerel-agent/mackerel-agent.conf
apikey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

[plugin.metrics.temperature]
command = "node /etc/mackerel-agent/temperature.js"

設定を追加して mackerel-agent を再起動すると、温度データが Mackerel に送信されるようになります。簡単ですね!

mackerel-temprature.png

これは3日間くらい計測しつづけた状態のグラフです。センサーをエアコンの近くに置いていたので、エアコンをつけたタイミングで大きく上振れしてしまっています。エアコンを常時付けている状態だと、ちゃんと20度超の状態で安定していることがわかります。

参考


19
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
20