RRDtoolその2
さて、仕上げはグラフの作成です。グラフ作成については、多数のオプションがあって判断に迷いました。またまた、satospoさんのサイトや久保田 拓朗さんの書かれたRRDtoolを使うや、その他たくさんのサイトを閲覧しまくって、ようやく完成しました。ありがとうございました。
#!/bin/sh
RRDFILE=’/***PATH1***/radiation.rrd’
GRAPHPATH=’/***PATH2***’
DATE=`LANG=C date | sed ‘s/:/\\\\:/g’`
rrdtool graph ${GRAPHPATH}/グラフ名1.png \
--start -24h –end now \
--vertical-label “CPM” \
--imgformat PNG \
--slope-mode –width 600 –height 200 \
--title “SBM-20 Gamma Radiation Monitoring ” \
DEF:cpm=${RRDFILE}:CPM:AVERAGE \
VDEF:avg=cpm,AVERAGE \
LINE1:cpm#0000FF \
HRULE:avg#ff0000 \
GPRINT:cpm:AVERAGE:”Average\:%7.1lf CPM ” \
COMMENT:”Last update\: $DATE”

5分間隔でCPM値を表示したところです
さてさて、一段落です。しかしRRDtoolの機能を調べてみると保存してあるデータに計算を施し、グラフにするCDEFインストラクションという機能があるみたいです。CPMだけではなく、CPMをシーベルトに変換したグラフを書くことができそうです。さっそく挑戦です。
最初に目に付いたRrdtool-Cdef-Tutorial-jpで勉強しました。が!・・・・・う~ん、ちょっとむずかしいようです。頭がダウンしそうです。逆ポーランド表記でつまづきました。しかしここでひるんではいられません。おとくいの”検索しまくり術”で、この難局面の打開を図ります。
以下の事柄はrpntutorialにかかれている内容を、中学校卒業時点で止まってしまった私の英語力で解読した結果です。
逆ポーランド表記 1,2,3,+,+ を計算します。
1) 1,2,3,+,+ eval is 2,3,+ = 5 result is 1,5,+
2) 1,5,+ eval is 1,5,+ = 6 result is 6
3) 6
1)数式は左から右へ向かって見て行き、最初の演算子に注目します。この場合1番目の+です。このプラスの計算は、その直前の2つの項を加算します。2+3=5ですから1)式の 2,3,+ の3つの項は5に置き換わります。
置き換わった式
1,5,+
2)上記で置き換わった式を同じように計算します。1)と同様+の前の2つの項を加算します。1+5=6
3)答え6 と出ました。
つづいて
3,2,1,+,* を計算します。
左から数えて最初に現れる演算子が+ですから、その前の2つの項を加算します。2+1=3ですから、それらを3に置き換えます
3,3,*
置き換わった式は、最初に現れる演算子が*です。加算と同様に前の2つの項を乗算します
答え9 となります。
いゃ~、そんなに難しくないですね。(でも、本当は私がここまで到達できるまでかなりの時間を要しています)
さて、このチュートリアルではさらなる理論の拡張が書かれています。理論比較演算子(LT,LE,GT,GE それぞれ <,≦,>,≧)を考えます。たとえば
2,1,GT
この式は、2は1より大きいか?
という表現でして、その答えは正解ですから真(true)ですね。この場合1を返すことになっています。つまり計算式 2,1,GT は、それを1に置き換えることができます。続いて
2,1,LE
この式は、2は1以下か?という表現ですので、その答えは偽(false)です。この場合0を返すことになっています。
つづいてIFです。IFは次のように表現されます
X,Y,Z,IF
この式は、Xが真(true)ならばY,偽(false)ならばZという値になる事をあらわします。IF X then Y else Z です。では、次の式を考えてみます。
1,10,100,IF
Xに対応する値が1です。論理式での1は真(ture)を表し、IF true then 10 else 100 と同じですので
答え10 となります。
0,10,100,IF は 上記とは逆になりますので、答えは 100になります。ちなみに1だけでなく0以外の数字は全て真(true)と判断されるみたいです。
さて、練習です。
128,8,*,7000,GT,7000,128,8,*,IF を計算します
左から数えて最初に現れる演算子は*ですので 128,8,* の部分は128×8=1024,1024に置き換えます。
1024,7000,GT,7000,128,8,*,IF
置き換えた式で最初にあらわれる演算子はGTですので、1024,7000,GT を計算します。1024 は 7000 より小さいので、この3項は0に置き換えます。
0,7000,128,8,*,IF
置き換えた式で最初にあらわれる演算子は*です、128,8,* を 128×8=1024 1024に置き換えます。
0,7000,1024,IF
IFの3つ前の項が0(false)なので、最終的な答えは1024になります。
答え 1024
やりました。ビクトリーです。でも,どっと疲れがでてきました。なぜこのような表記法をするのでしょうか。さきほどのWebに答えが書いてありました。
逆ポーランド表記(RPN)は通常使われている算術表記よりプログラムするのが簡単で、バグも少なくすることが出来るそうです。数式を「( )」カッコを使わないで表現するのがポイントなんですね。「計算式を作る人が頑張ってください」と私は解釈しました。
RRDtoolの逆ポーランド表記はさらに、「最大、最小」「並べ替え」や「平均」、「予測値」なども表現出来るみたいです。
さて、以上をふまえてCDEFに挑戦です。SV(シーベルト)を定義してみましょう。教えていただいたようにガイガーミューラー管 SBM-20では、だいたい
(CPM値-13)÷132=μSV値
ですから
CDEF:SV=cpm,13,-,132,/
これでよさそうです。間違い無い!早速グラフを描いてみました。しかし結果は不成功でした。

CPMが0以下の部分ができてしまいました
CPM値がかなり変動して13を下回ることもあるので、SVがマイナスになってしまう箇所ができてしましました。
マクロ的にトータルで考えれば、これはこれで良いかもしれませんが、グラフを予備知識なしで見てくれる人に説明するのが恐ろしく厄介です。きっと私の言語能力では人を納得させられる満足な説明は出来ないでしょう。これでは失敗です。
そこで、グラフがマイナスになった時は、強制的に0にするようにIFを使って表示し直しです。少々ズルですが、背に腹はかえられません。まぁ、善意の嘘といったところでしょう。
SV値= IF「cpm,13,-,132,/」が 0 以下ならば 0 それ以外は 「cpm,13,-,132,/ 」
表現はおかしいですが、考え方的には、こんな感じでしょう。先ほど勉強したIFとLEをあてはめます。
CDEF:SV=cpm,13,-,132,/,0,LE,0,cpm,13,-,132,/,IF
やっとできました。
rrdtool graph ${GRAPHPATH}/グラフ名2.png \
--start -24h –end now \
--vertical-label “μSv/hr” \
--imgformat PNG \
--slope-mode –width 600 –height 200 \
--units-exponent 0 –upper-limit 0.5 \
--lower-limit 0 \
--title “SBM-20 Gamma Radiation Monitoring\
DEF:cpm=${RRDFILE}:CPM:AVERAGE \
CDEF:SV=cpm,13,-,132,/,0,LE,0,cpm,13,-,132,/,IF \
VDEF:avg=SV,AVERAGE \
LINE1:SV#00FF00 \
HRULE:avg#ff0000 \
GPRINT:SV:AVERAGE:”Average\:%7.2lf μSv” \
COMMENT:”Last update\: $DATE”
20分ごとにcronでスクリプトを走らせて作成したグラフ名1(2).pngファイルをWebの公開ディレクトリーにコピーします。
データが集まってくればスタート時間をもっと前に設定してグラフを描くことが可能です。ようやく目的のモニタリングポスト(2011/12/31現在 計測中)が完成しました。