Help us understand the problem. What is going on with this article?

FreeBSDで作るデーターロガー

More than 3 years have passed since last update.

FreeBSDで作るデーターロガー

by yamori813
1 / 12

MIPSなルーターをデータロガーに仕立ててみました。FreeBSDのビルドはZRouterで行っています。

IMGP0253.JPG


ZRouterでビルドするFreeBSDのミニマムイメージはたいてい4Mに収まりますが、処理のためのコマンドをいくつか追加するとあふれるので8M以上のFlashが必要です。このイメージをターゲットに焼いておきます。


ロギングしたデータはSDRAM上のメモリディスク(md)に作成して、flashにコピーして電源が切れても保持できるようにします。

このためhintsに以下を設定してkernelをビルドしてgeom_mapでflash内にデータ保存用の領域を確保します。

hint.map.5.at="flash/spi0"
hint.map.5.start="0x007e0000"
hint.map.5.end=0x007fffff
hint.map.5.name="storage"

上記の設定では領域(/dev/map/storage)を128K確保しているのですが、なぜか後半の64Kを読み書きするとエラーになるので先頭の64Kだけ使う事にします。何が原因かは調べていません。


まずはターゲットの時間を合わせておきます。

# ntpdate ntp.nict.jp

ロギングするデータをファイルに書き込みflashに保存するshスクリプト。mrubyでスマートメーターのスクリプトを修正してスマートメーターの指示数のデータを取得しています。

#!/bin/sh

VAL=`mruby /tmp/smtest.rb`
DAY=`date "+%Y/%m/%d"`
TIME=`date "+%H:%M:%S"`

echo ${DAY},${TIME},${VAL} >> /tmp/sm.log

xz -c /tmp/sm.log > /tmp/sm.log.xz

dd if=/tmp/sm.log.xz of=/dev/map/storage bs=65536 count=1 conv=sync

保存領域のブロックデバイスに直接ファイルをコピーする事はできないので、圧縮してddでコピーしています。


これをcronで5分おきに起動します。

*/5 * * * * /tmp/getmeter.sh

sm.logのデータはこんな感じになります。

2016/08/24,11:45:10,392.1
2016/08/24,11:50:10,392.1
2016/08/24,11:55:10,392.2
2016/08/24,12:00:19,392.2
2016/08/24,12:05:39,392.2
2016/08/24,12:10:10,392.2
2016/08/24,12:15:18,392.3
2016/08/24,12:20:18,392.3
2016/08/24,12:25:19,392.3
2016/08/24,12:30:10,392.4

flashからデータを読み出すのは下記のようにします。

# dd if=/dev/map/storage of=/tmp/last.log.xz bs=65536 count=1
# xz -d /tmp/last.log.xz

当初データ取得のスクリプトがハングする事があって、cronから多重起動になりリソースを食い尽くしてしまったのか、pingには反応するが入れなくなりました。このようなシステムでは、データを確実に取る事よりもハングしてリソースを枯渇させない事を注意した方が良いです。

いろいろいじって1ヶ月くらいは無事に動いていましたが、また入れなくなりました。kern.maxprocperuidを小さめにして、スクリプトをnobodyで動かすようにしてみました。


10万回の書き込み保証だと、上記のように5分に1回書いていると1年くらいで寿命になってしまいますね。。。I2CのEEPROMだと100万回くらいの書き込みができるようなの、ちょっと長く保証されますがたかだか10倍ですね。

本当に5分に一回の保存が必要なのか考えてみるのが良いのかもしれません。


せっかくなのでロギングしたデータをMacのMjoGraphでグラフ化してみました。もちろんクラウドとか使わずに堅実にawkで処理します。

sh-3.2$ awk 'BEGIN{FS=",";s=0;i=0}/09\15/{if(i == 0){s=$3} else {print i "," $3-s} i+=5}' sm.log > 0915.csv

meter2.png


1kWh/22円で表示するとこんな感じです。

sh-3.2$ awk 'BEGIN{FS=",";s=0;i=0}/09\15/{if(i == 0){s=$3} else {print i "," ($3-s)*22} i+=5}' sm.log > 0915yen.csv

meter1.png

就寝中の0時から6時(360min)までで10円くらいになっています。これはほぼほぼ冷蔵庫の消費と考えられます。24時間にすると40円となり全消費の半分近くになってしまっています。15年以上前の古い冷蔵庫を使っているためかもしれません。冷蔵庫の設定は中の弱くらいで、周りはスペースを確保して換気は良くしているのですが。。。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした