自室環境モニタシステム
自室の環境モニタシステムを作製中なので、現時点までにやったことをメモ。
やろうとしていること
- 自室の環境 (温度、湿度、気圧、照度、消費電力など) をモニタリングするシステムを作りたい。
- これらのデータを記録することで、例えば以下のような応用が考えられる:
- 温度・湿度・気圧データ => 熱中症や乾燥などへの注意喚起、体調との相関関係の調査
- 温度・湿度・照度データ => 在室状況や行動推定 (在室 or 不在、起床 or 睡眠くらいは区別できるかも?)
- 消費電力データ => サーバの監視
- また、これまでに使ったことのない種類のセンサ (気圧センサなど) やバス (I2C, SPI) などに触ってみて勉強する、という目的もある。
↑環境モニタシステムの試作機の一部。ブレッドボード中央の緑色が温度・湿度・気圧センサ BME280。このままではブレッドボード上のスペースも余っているし、もう少しセンサを追加したい……
システムの概要
- 各種センサを Raspberry Pi に繋ぎ、データを収集する
- I2C, SPI などのバスでセンサを接続する。
- データを蓄積する
- 収集・蓄積したデータを可視化する
- データのグラフを確認できるようにする。
- データの応用については、ひとまず本システムでは考えないことにする (応用を考える場合、本システムはそのためのインフラとして位置づけられる)。
検討事項と現在の試作状況
いまのところ、システムの試作を行っていて、ハードウェアは試作機が用意済み、ソフトウェアはこれから、という状況。その上で検討(した|これからする)事柄について書く。
収集するデータの種類と、利用するセンサについて
- センサの種類としては、いまのところ以下のものを試用している。
- 温度・湿度・気圧センサ: BME280
- 電流センサ: CTL-10-CLS
- 本当はもっと安いやつ (1000円未満の) でいいんだけど、試作段階ではそのへんに転がっていたやつを利用。
- また、以下のセンサについても購入および使用を検討中。
消費電力データの収集とリアルタイム処理について
- 消費電力データ (電圧[V]・電流[A]・有効電力[W]・皮相電力[VA]) を収集するためには、電圧・電流の瞬時値を用いた計算が必要なため、少なくとも数百Hz*1のサンプリングレートが必要になる。この実現にはリアルタイム処理が必要になる。
- Raspberry Pi でリアルタイム処理を行うには、(1)リアルタイムカーネルを利用する、(2)外付けのリアルタイム処理ユニットを追加する、の2種類の方法がある。
(1) リアルタイムカーネルを利用する場合
たとえば EMLID の Raspberry Pi 向けリアルタイムカーネルなどを利用して、 Raspberry Pi 自身にリアルタイム処理を行わせる方法。
利点
- 外付けユニットが不要で低コスト
- 欠点
- Raspberry Pi の OS カーネルに手を入れる必要がある
- ある程度 (数10usec程度) のジッタを防げない
(2) 外付けリアルタイム処理ユニットを利用する場合
- Raspberry Pi 自体には手を加えず、リアルタイム処理ユニットとして適当なマイコン (Arduino や mbed など) を外付けする方法。
この場合、理想的には水晶発振子のジッタ程度しか気にしなくてよい……はず (不勉強のため嘘を言っているかもしれないが……)。
利点
- Raspberry Pi 側の OS カーネルはそのままでよい
- ジッタはほとんど意識する必要がない (はず)
- 欠点
- 外付けユニットが必要で高コスト
結局どうするか
- Raspberry Pi のカーネルをいじりたくなかったので、試作時点では arduino を利用したリアルタイム処理ユニットを外付けした。
- また今回は消費電力データ収集という目的があり、AC100Vの商用電源を引き込んだ回路を作る。このため感電防止と機器保護の観点から、Raspberry Pi とGPIOで直結する回路でAC100Vを扱いたくない、という事情もある。
データの保存形式について
- いまのところ、温度[℃]、湿度[%]、気圧[hPa]、消費電力 (電圧[V]、電流[A]、有効電力[W]、皮相電力[VA]) のデータを1分に1度収集して、CSV に保存している。
- 仮にこの「1分に1度」という頻度でデータを収集して、1度のデータが100Byte*3だとすると、1年分のデータは 100 * 60 * 24 * 365 ~= 53MB ということになる。このくらいだとギリギリ CSV や JSON でも良さそう。
- データ収集頻度を1Hzとかにすると、1年分のデータは3.2TBということになってしまって、こうなるとテキストフォーマットは明らかに不向き。
- とりあえずこのまま CSV でやって、時間があればちゃんとした DB を導入したい。
Raspberry Pi のストレージについて
- Raspberry Pi のストレージは microSD なので、ここにデータを追記しまくるとすぐにぶっ壊れる。microSD への書き込み回数をできるだけ減らすため、一時ファイルを ramdisk (tmpfs) に保存 + 定期的にファイルサーバに転送、としている。
データの可視化について
- ここは一切未実装で、現状では CSV ファイルを読むしかモニタリングの方法がない。これはさすがに不便すぎるのでなんとかする。
- 既存の家庭内サーバですでに munin が動いているため、データ収集用 Raspberry Pi を munin-node にしてしまうつもり。
- munin-node の参考資料 (自分向けメモ)
今後
- いろいろと書いたが、11月中にいったん完成させて、自室の環境を外からでもモニタリングできるようにしたい。