ぶていのログでぶログ

思い出したが吉日

SabaBox (mackerel-agent on M5Stack) を作った

この記事はMackerel Advent Calendar 2018の13日目の記事です。


みなさん、IoTしてますか! 今年のMackerel Advent Calendarのテーマは IoTとMackerel ということで[要出典]、私も作ってみました! それがこのSabaBoxです!

拡大したところ

Mackerelのロゴをドット打ちしたのがこだわりポイントです!*1

M5Stackとは

この真ん中にあるTFTディスプレイがついた箱がM5Stackです。 ESP32というWiFiBluetoothを持ったマイコンを搭載した便利な開発ボードです。 機能を拡張する基板をスタックしていくので、この名前がついているようです。 開発はArduino互換なので、慣れていればすぐにプロダクト開発ができるのがよいですね!

そして、なんとこのM5StackではMicroPythonが動くファームウェアが公式に配布されているのです*2

github.com

今回はLL言語でサクッと実装したかったので、このMicroPythonを使って実装しました。

SabaBoxのインストール

前述しましたがSabaBoxはMicroPythonを使って実装されているので、M5StackにMicroPythonファームウェアを予めインストールしておく必要があります。 なお、オンライン版とオフライン版がありますが、どちらでも動くはず…たぶん(オンライン版での動作は未確認)。

次にソースをコピーします。SabaBoxのソースは以下のリポジトリにあります。

github.com

ソースをコピーしたら、settings.json.sampleをコピーしsettings.jsonを作成します。 settigns.jsonには、Mackerel APIKey、SSIDとパスワードを設定します。 また、センサープラグインも指定する必要がありますが、サンプルではfetchごとにカウンターをインクリメントするだけのcounterプラグインが指定されています。

// settings.json.sample
{
    "mackerel": {
        "apikey": "<APIKEY>"
    },
    "wifi": {
        "<SSID>": "<PASSWORD>"
    },
    "plugins": [
        "counter"
    ],
    "autodisplayoff": 20
}

つぎに、SabaBoxのソースをインストールします。 インストールには、install.shを使うとちょっと便利です。 install.shは内部的にampyを使うので、事前にインストールしておきます。

$ pip install ampy

ampyをインストールしたらinstall.shの引数にはM5StackのUSBポートとSabaBoxにインストールプラグインファイルを指定します。 ここでは例として/dev/ttyUSB0とsample/counter.pyを指定しています。

$ cd /path/to/SabaBox
$ ./install.sh /dev/ttyUSB0 sample/counter.py

インストールが完了したら、M5Stackを再起動すればSabaBoxが起動するはずです。

SabaBoxで温度と湿度を計測する

サンプルのカウンターでは面白くないので、今回はスイッチサイエンスで買ったM5Stack用プロトキット(温湿度センサ付き)についてきた、温度湿度センサーを使ってグラフ化してみました。

f:id:buty4649:20181213232846p:plain
SabaBox(温度湿度のグラフ)

なんかそれっぽくなっている出ていますね!!!

課題

それっぽいグラフが出来ていますが、これをちょっと拡大してみます。

f:id:buty4649:20181213233114p:plain
SabaBox(温度湿度のグラフ)を拡大

なんか歯抜けになっていますね・・・・・・・・。 原因はわかっていないのですが、SabaBoxを稼働させていると10分ごとくらいにCPUパニックによる再起動がかかるのが原因です。 1分ごとのトリガーでセンサーのフェッチを行っているのですが、それとWiFiの接続状態とNTPのシンクタイミングでなんか死んでるのかなぁという予想をしています…が特定できてないです。 センサーくらいであればちょっと歯抜けてても問題ないだろうと思っているのでv1.0.0ではこのままリリースしました。 まぁ、本番のサーバで歯抜けが置きていたら大問題ですがね!!!!!!! HAHAHAHA

最後に

M5StackのMicroPythonを使ってmackerel-agentを作ってみました。 M5Stackのファームウェアがよく出来ているというのもありますが、MackrelのAPIもシンプルでドキュメントもしっかりしていて、SabaBoxのようなプロダクトを簡単に作れるのが良かったです。。

今回はM5StackにUSBケーブルを刺してそこから給電して動かしていましたが、M5Stackには標準でバッテリーパックが搭載されていたり、また、拡張用のバッテリーパックが売っていたりします。 拡張用のバッテリーパックを使って動作させると、9時間半くらい動作しました。 WiFiも電源もない場所に、SabaBoxをおいてデータだけ記録させ、ある程度蓄積したらWiFiのある場所に移動してデータをアップロードするみたいな使い方ができたら面白そうだなぁっと思っております。

*1:ロゴのアレがあれだったら修正します 🙏

*2:MicroPythonとは組み込み向けの小型のPython3ランタイム