mackerel.ioにRaspberry PiとArduinoを組み合わせてグラフを投稿してみた

Raspberry Piを安く譲ってもらえたので、AndroidとArduinoで自室の温湿度などを監視しているシステムをリプレースしてみた。 自室の温湿度などをグラフ化して監視するの、一度やってみるともはや止められなくなるくらいには便利なので、興味がある人にはぜひやってもらいたい。

また、グラフをつくるにあたってXively(旧Cosm)からmackerel.ioに移行してみた。 割りと簡単にできて、以前よりプログラマブルな環境にすることができたので便利になった。

この記事では、どうやってこのシステムを構築したのか説明しようと思う。

Raspberry PiとArduinoRuby

Raspberry Piのセットアップ自体は公式のドキュメント通りで簡単にうまくいった。 DebianベースのLinuxを採用していて、sshでリモートログインもできるしRubyとかも普通に動いて便利。ファンレスで省電力なので、自室でも運用しやすい。GPIOなどのインターフェイスも備えていて、気軽にLEDとかを制御したりできる。

ただ、CPUがしょぼいのでコンパイルみたいな重たい処理は結構きついし、メインストレージがSDカードなのでIOも遅い。USBポートも2つしか無い。アナログ入力が無いのも罠だと思う。 最近新しいRaspberry Piが発売されたみたいだけど、この辺りがネックなのは変わらなさそう。

Arduinoは普通に配線するだけで、A0にCHS-MSSをつなげてA4, A5のI2C通信ポートにBMP085をつなげた。

Raspberry PiとArduinoの接続はI2Cを利用する方法などもあるようだが、今回はポータビリティを重視してUSBを採用した。 Arduinoに特別なシールドなどは必要なく、USB接続するとシリアル通信デバイスがLinuxに認識される。 Arduino側でシリアル通信経由で各種数値を書き出させて、Raspberry Pi側でRubyスクリプトで読み取って、Sensu形式で書きだした。

シリアル通信はserialportというgemを使うと簡単にできる。ruby-serialportではなくなっていることに注意。ただ、原因はよく知らないが読み始めのデータは大体壊れているので正規表現でチェックするようにした。 Sensu形式は要するに単なるタブ区切りテキストなので難しいことは何もない。 グラフ名をドットで区切るとグラフを分けられるので、今回はtemperature.bed_roomとかにした。 この辺りのソースコードGithubで公開しておいたので、参考にしていただければ幸いである。

https://github.com/shimobayashi/marv2

mackerel.io

mackerel.ioというのははてなが開発している新しいサーバー管理ツールで、クラウドを意識したつくりになっている。 現在はベータ期間中のようで、全機能が無料で使える。 通常であれば大量のサーバーの監視などに使うものだけど、簡単にカスタムメトリクスを投稿できるので試しに採用してみた。 ついでにRaspberry Piのロードアベレージとか監視できて便利。

mackerel.ioへの投稿はmackerel-agentを介して行うわけだが、現在ARMアーキテクチャ向けのバイナリが配布されていないため自前でビルドする必要がある。

mackerel-agentはGo言語で実装されているのでgolangパッケージをRaspberry Piに導入する必要があるわけだが、現状では普通にapt-getすると古いバージョンが入ってしまう。mackerel-agentはgolang-1.3以上でないと動作しないので、こういう方法とかで導入する必要がある。 それさえ済ませればこの辺りの記事を参考に普通にビルドできる。

その後、ヘルプにある通りmackerel-agentの設定ファイルを書き換えて当該のRubyスクリプトからメトリクスを投稿させるようにした。 なお、設定ファイルを書き換えたら有効化するためにmackerel-agentを再起動しなければならない点に注意すること。

まとめ

というわけで、割と簡単に自室監視ソリューションを構築できた。Raspberry PiとArduinoの組み合わせなので今後も必要に応じて柔軟に拡張できるのも良い。

グラフサービスは僕が知るかぎりではあまり良いものがなくて、自前でGrowthforecastなんかをホスティングするのも面倒なので、mackerel.ioで気軽にグラフがつくれて便利だった。 Xivelyはグラフ描画のAPIが非公開になった上にデータ量が多いとすぐにタイムアウトしてしまうので良くなかったのだけど、mackerel.ioに置き換えてグラフを自由に見られるようになって助かった。

今後は赤外線センサーなどを取り付けてエアコンの自動運転などをやってみたい。

Raspberry Pi Type B 512MB

Raspberry Pi Type B 512MB

Raspberry Pi Model B+ (Plus)

Raspberry Pi Model B+ (Plus)

Arduinoをはじめようキット

Arduinoをはじめようキット