前の記事の続き。
スマートメーターからリアルタイムに消費電力を取得する - Okiraku Programming
前回の記事ではArduinoで電力を取れるようにしたわけですが、ログを取って統計処理したり、Webでリアルタイムに見れるようにしようとすると、やっぱりLinuxの方が便利なので、Linuxマシン(今回はPCduino3を使いましたが、RaspberryPiでも全く同様にできるはず)に移植しました。
前回の記事のスケッチを移植・改造した電力取得・ログ記録プログラム(C++) → WebSocketサーバ(Node.js) → ブラウザ上で動的にグラフ描画(Highcharts) という構成です。こんな感じのメーターがリアルタイム(5秒ごとくらい)にピコピコ動きます。
履歴も秒オーダー/分オーダー/時〜日オーダーで変化が見れたりします。
ソース
https://gist.github.com/NeoCat/73f8ed86db468dd005a2
- smart_meter.cpp: 前回のスケッチを適当にLinuxに移植したもの。前回はシリアル通信速度を9600bpsにしましたが、デフォルトの115200bpsで問題ありません。/tmp/power.log に10分毎の時刻・平均電力を記録するほか、/tmp/power.sockというソケット経由でリアルタイムの瞬時電力値(2分間のヒストリ付き)と過去2時間分の分毎の平均電力をとれます(-cオプションでソケットから読み出し)。ややマルチスレッドのロック処理を端折ってるので高頻度で接続を繰り返すと稀に変なデータが出てくるかも。あとログファイルは無限に追記されていくので、別途logrotateなどをかます必要があります。
- power_ws.js: WebSocketサーバ。 node.js用のコードです。別途websocket.ioをnpmで導入する必要があります。
- power.html: WebSocketサーバに接続してHighchartsでリアルタイムにグラフ描画します。ローカルファイルをブラウザで開くだけで実行できます。ファイル中でWebSocketサーバのIPアドレス指定が必要です。
実行
## smart_meter.cpp内にID、パスワードを設定 % g++ -Os smart_meter.cpp -o smart_meter -pthread ## ttyS1(シリアル)を有効化 % sudo sh -c 'echo 3 > /sys/devices/virtual/misc/gpio/mode/gpio0' % sudo sh -c 'echo 3 > /sys/devices/virtual/misc/gpio/mode/gpio1' % ./smart_meter &
## https://nodejs.org/en/download/ から node.js 4.2.4 ARMv7 バイナリをダウンロードして/usr/local/以下にインストール。
% npm install websocket.io
% node power_ws.js &
あとはpower.htmlにIPアドレスを指定して、Webブラウザで開けばOKです。