IoTっぽい温度ロガーを作った

BLEとIntel EdisonとBaaS使って温度ロガーを作った話

暑い日が続きますね。朝、オフィスに一番に乗り込んだ時の、クーラーが入る前のムワッとした暑さに、「これ、人がいない時どんな温度変化があるのだろう?」と気になることはありませんか?

私は非常に気になりまして、過去にはUSB接続の温湿度計を常時稼働しているFreeBSDサーバに接続して、rrdtools などで常時グラフに可視化したりしてました。しかしもろもろの、特にUSBドライバなど関連ソフトウェアのメンテナンスがめんどくさくなって、最近では止めていたんです。ただ技術的には常に気にしていました。

そんな中、つい先日もあまりの暑さに、何か簡単に面白く温度ログを残せる機器はないかなーって探していたところ、BLE温度センサー BLECAST_TM を見つけてしまいました。このBLECAST_TMが面白いのは、アドバタイズパケット(=Bluetooth機器を接続時に、親側へ発見してもらうために発信し続けているデータ)に温度データを潜りこませて、1秒に1回送り続けてるって点です。さらにボタン電池1つで半年も持つ。つまり温度データを読むのに完全にワイヤレスで良いので、部屋のドコにでも置いておけるってことですね。

さてBLEで送られてくる温度データを、ただ常設のサーバで受けても面白くありません。そこで思いついたのが引き出しで眠っていた Intel Edison ! まぁ、この業界にいれば使いみちを思いつかなかった Edison の1つや2つ、引き出しに眠っていてもおかしくないですよね。Edison は BLE も WiFi も喋れるので、温度データはこいつで受けて、インターネットのどこかに中継することにしました。

試作環境の整備とBLECAST_TMの読み取り

Edison の強みは、これがただのi386 Linux マシンで NodeJS が動くってことです。つまり、Linuxデスクトップで試作がほぼほぼできるってことです。ということで早速、手元のXubuntuデスクトップで試作を開始しました。

私の Xubuntu には最新の NodeJS がインストール済み。ということは、NodeJSから BLE (Bluetooth) が使えれば良いので、BLE の親側(=central) になれるライブラリ noble (ソース) を使います。事前にBluetooth関連のOSパッケージが必要ですが、noble のドキュメントに従えば難なくインストールできます。

で、noble を使って BLECAST_TM 用のモジュール blecat_tm (ソース) を書きました。この blecast_tm を使うと、以下のような簡単なプログラムで温度のログを見ることができます。

var BlecastTM = require('blecast_tm');
 
var monitor = new BlecastTM();
 
monitor.on('data', function(data) {
  console.log('data:', data);
});

ここで幾つか注意点。まずBLEのデータを見るには、なにもしなければ root 権限が要ります。これを避ける(一般ユーザでも読めるようにする)には一手間必要で、noble や blecast_tm のドキュメントにも書いてありますが、以下を実行してください。

find -path '*noble*Release/hci-ble' -exec sudo setcap cap_net_raw+eip '{}' \;

これでデータを読み取るための実行ファイルに、必要な権限が付与できます。

次に、blecast_tm を使う場合に、このままではデータを盛大に取りこぼします。具体的には80%近くです。これは BLECAST_TM がアドバタイズパケットを送るしかしないので、本来ならあるハズのその後の接続処理を noble が期待していると、その間にもアドバタイズパケットが降ってきて処理できない…そういう感じです。これを避けるには、以下のような環境変数を1つ設定してあげます。

export NOBLE_REPORT_ALL_HCI_EVENTS=1

注意点は以上です。

試作:KiiCloud へのロギング

こうして blecast_tm で読み取ったデータはEdisonに貯めて置いても良いのですが、それでは昔やったのとさほど変わらないということで面白くありません。せっかく Edison には Wi-Fi があるのですから、インターネットにアップロードしてみましょう。データの受け先として選んだのは、私が普段使い慣れた KiiCloud です。IoT 向けの API もありますしね。

KiiCloud での準備は簡単で、開発者コンソール でサインアップ・ログインしてアプリを作りアクセスキーを取得するだけ。ここでAPP IDとAPP KEY、それにサイト(JPで作るのがオススメ)をメモしておきます。

さて…そんなこんなで温度ロギング用のアプリ thermal-monitor を作りました。以下の手順で実際に試せます。

$ git checkout https://github.com/koron/thermal-monitor.git
$ cd thermal-monitor
$ npm install
$ find -path '*noble*Release/hci-ble' -exec sudo setcap cap_net_raw+eip '{}' \;
$ cp example/app.json example/thing.json ./

ここで app.json と thing.json を編集します。app.json には先ほどメモした IDKEY それにサイト(SITE)を記述します。これは KiiCloud のドコに保存するかを指定するためのものですね。thing.json は、VENDOR_ID を適当に一意になるようにするのと、PASSWORD を適当に。これはデバイス(=Thing)の一意性と、データの改竄を防ぐためのパスワードになります。

あとはBluetoothデバイスが動作していることを確認して、以下を実行すると、KiiCloudへ15秒に1回データがアップロードされるという具合です。

$ NOBLE_REPORT_ALL_HCI_EVENTS=1 node main.js

こうしてアップロードしたデータですが…まだグラフ化するところは作っていません。ただし KiiCloud の開発者コンソールにはデータブラウザがあるので、生データを見ることはできます。こんな感じで。

KiiCloudを使った生データ表示

管理者コンソールでデータブラウザを開いて、Thingsを選び、VENDOR_ID を選択して入力、適切なバケツを選択するとアップロードされた生データが表示されるという具合です。データは1時間に1つのオブジェクトとして記録され、オブジェクトの中には1分毎の値が配列として格納されています。

Intel Edison 実機へのインストール

試作環境で動作することがわかったら、いよいよ Edison の実機にインストールです。Edison のファーム は予め最新(執筆時点では2.1)にアップデートしておきましょう。買ってきたばかりの Edison からだと、アップデートがちょっと面倒なので注意が必要でした。私の場合はいきなり 2.1 には上げられず、2.0 をUSB経由で入れた後は、ネットワークアップデートという感じです。

Edison へのインストールには curl を使ってしまいましょう。以下の手順でセットアップまで完了です。

$ curl -L https://github.com/koron/thermal-monitor/archive/master.zip -o thermal-monitor.zip
$ unzip -q thermal-monitor.zip
$ mv thermal-monitor-master thermal-monitor
$ cd thermal-monitor
$ npm install
$ /usr/sbin/rfkill unblock bluetooth

(npm install の前に opkg install bluez5-dev が必要かと思っていたら、もともと入っていた)

あとは試作環境と同じで app.json と thing.json をコピーして編集します。このとき thing.json の VENDOR_IDPASSWORD は試作環境とは異なるようにします。

これでインストール作業は完了です。試しに起動して、15秒経過後に、KiiCloud にデータがアップロードされているか確認してみましょう。

$ NOBLE_REPORT_ALL_HCI_EVENTS=1 node main.js

アップロードが確認できたら、あとは Edison の起動時にロガー/モニターが起動するように、以下の手順で設定してしまいます。これは systemd のサービスとして登録して有効化しています。

$ cd ~/
$ mkdir bin
$ cp thermal-monitor/edison/start-thermal-monitor bin/
$ chmod 0744 bin/start-thermal-monitor
$ cp thermal-monitor/edison/thermal-monitor.service /lib/systemd/system
$ systemctl enable thermal-monitor

これで Edison の電源を入れると、自動的に温度がインターネット上にロギングされるようになりました。

上がEdison、下がBLECAST_TM

すごくスッキリした感じのするシステムでしょう?

まとめと展望

BLEとIntel EdisonとBaaS使って温度ロガーを作りました。ワイヤレスで、デバイスで測定したデータをインターネットまで手軽に届けられる、良い時代になったものです。

IoT/M2M 的な視点では、Edisonを ゲートウェイ に見立ててインターネット(BaaS)へデータをアップロードするモデルとして最小構成になっており、面白いサンプルができたと言えます。

プログラミング的には、既存ライブラリを良い感じでハックしたり、Promise を多用することで現実的な問題に柔軟に対応しているのですが、本記事では解説をばっさりカットしました。興味があればソースを読んでみてください。

BLECAST_TM は、秋葉原の秋月電子で購入してきました。オフィスの近所ですぐ買えたってことも、これをやってみた大きな理由の1つです。

Intel Edison は自宅に1つ、オフィスに1つ引き出しの中に入っていました。なお、その後、デモ用として持ち歩くためにもう1つ買ったりw

未着手の可視化の部分は、HTML5 で作って static サイト(gh-pages)でホストしちゃおうと考えています。が、私にとっては技術的に目新しいものが特にないので、未着手のままかもしれませんね。

以上、BLEとIntel EdisonとBaaS使った温度ロガーの紹介でした。

変更履歴

2016/01/25

systemd のサービスとして登録する手順に、以下を追加しました。

$ chmod 0744 bin/start-thermal-monitor