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

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

### 機器構成
----
* Mac
* [Intel Edison Kit for Arduino](http://www.intel.co.jp/content/www/jp/ja/do-it-yourself/edison.html)
* [Grove - Starter Kit v3](http://www.seeedstudio.com/wiki/Grove_-_Starter_Kit_v3)

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

 [Edisonを使ってセンサデータをAmazon Kinesisにあげてみる【前編】](http://qiita.com/KenTamagawa/items/3f2e2bd3bb36a27dc439)

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

![edison_sensor.png](https://qiita-image-store.s3.amazonaws.com/0/41566/b1267adc-e663-63e4-9999-78af0b25f88c.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](https://qiita-image-store.s3.amazonaws.com/0/41566/b1bd4606-ccec-fe0f-b564-b31cacfb12d9.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](http://www.seeedstudio.com/wiki/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](https://qiita-image-store.s3.amazonaws.com/0/41566/95503458-d4ef-0fb2-ef38-9ff4950a81aa.png)

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


### 参考
----

* [Intel Edison Kit for Arduino](http://www.intel.co.jp/content/www/jp/ja/do-it-yourself/edison.html)
* [Grove - Starter Kit v3](http://www.seeedstudio.com/wiki/Grove_-_Starter_Kit_v3)
* [Edisonを使ってセンサデータをAmazon Kinesisにあげてみる【前編】](http://qiita.com/KenTamagawa/items/3f2e2bd3bb36a27dc439)
* [mackerel-agent](https://github.com/mackerelio/mackerel-agent)
* [Go のクロスコンパイル環境構築](http://qiita.com/Jxck_/items/02185f51162e92759ebe)