●
Webページ作成スクリプト(ondo.cgi)
graph.bsh によって所定期間の温度グラフが指定ファイル(ondo.png)に吐き出されます。Webブラウザでこのファイルを見れば事は足りるのですが、ブラウザに対して表示データの自動更新もさせたいところです。 単に HTML 記述でなく、この CGI が必要になった経緯については、理由を後述してあります。
#! /bin/sh
TEMP=`/home/k-wada/program/ondo/ds18s20M2`;
ONDO=`(echo -n $TEMP | /usr/bin/awk '/\./ gsub("\.", ":") gsub("-", "A") {print $1}')`
echo "Content-type: text/html";
echo
echo "<head><meta http-equiv=Refresh content=300;URL=ondo.cgi></head>"
echo "<body>"
/bin/date
echo "<br><img src=ondo.png>"
echo -n "
<div id=\"layer1\" style=\"DISPLAY: block;POSITION:absolute;LEFT:290;TOP:30;\" class=\"close\">
<table height=100 border=1>
<tr><td valign=bottom>
<img src=\"/mrtg/Count.cgi?image=asterisk.gif&dd=ondo&lit=$ONDO\">
</td></tr></table></body>"
#EOF
このスクリプトの内容を若干補足します。
初めに、温度センサ(DS18S20)からプログラムにて取得した温度値を ONDO という変数に格納しておきます。その後、この値を Count.cgi へ画像として表示するようにパラメータを渡し、その画像部分をレイヤ構造として見せるように指示します。
そして、全体的には同ページが 5分ごとに更新(Refresh=300)するような HTML としてブラウザに吐き出しています。
●
マイナス温度が表示可能に
とりあえず、マイナス側の温度測定が可能になったかを調べたグラフです。うまく値が取れているようですね。これで一安心です。
前述した graph.bsh は、スクリプト中に oneday=86400 という設定値があって、これが1日分の図生成(1日分前の時間から現在時間まで)を意味します(1日分の数値は秒数で、60秒*60分*24時間から 86400となる)。

何日分前からグラフ化するのか、という値を変えさえすれば1週間分とか、1ヵ月分のグラフ化ができることになるので、以下(の赤字)のようにすれば、1週間分の図が作成されます(graphw.bsh)。
#! /bin/sh
RRD="/usr/bin/rrdtool graph"
RRA="/var/www/mrtg/ondo.rrd"
GRP="/var/www/mrtg/ondow.png"
date="/bin/date"
END=`$date +%s`
D=`$date +"%F"`
T=`$date +"%H\:%M"`
oneday=604800
START=`expr $END - $oneday `
$RRD $GRP \
--start $START \
--end $END \
--imgformat PNG \
--title Temperature \
--width 600 \
--height 200 \
--lower-limit -10 \
--upper-limit 40 \
--vertical-label dig. \
DEF:temp=$RRA:ondo:AVERAGE \
LINE2:temp#00CC00:UPDATE \
COMMENT:$D \
COMMENT:$T \
#--x-grid MINUTE:360:HOUR:6:HOUR:1:0:%H \
#GPRINT:temp:MAX:"MAX\:%2.1lf"
●
1ヵ月のグラフを作成するには これも上記同様、
oneday=2678400
のように1か月分の秒数と、新しい出力画像ファイル名に変更したスクリプトを用意すれば、1か月分のグラフも簡単に生成できました。

●
現在値を表示させるとコアを吐いてしまう
ところで、グラフ作成を確認した時点で温度の現在値を表示させるべく、その設定を記述したのですが、なぜかコアを吐いて rrdtool
プログラムが死んでしまいます。いろいろと試したものの PRINT:
の記述が存在するとダメなようでした。
そこで逃げの一手として、COMMENT:
で観測時間だけは表示させることにして、現在値については後述するような、まったく別の方法で対応することにしました。
......
......
COMMENT:$D \
COMMENT:$T \
#GPRINT:temp:MAX:"MAX\:%2.1lf"
なお、以上のスクリプトについては、ダウンロード用として、ここに
tar ファイルを用意しました。
●
現在値表示の代替案
最高温度、最低温度、平均温度などが表示されないのはまだしも、現在値が"数字表示"されないのは使い勝手がよくありません。そこでない知恵を絞って、Web カウンタの機能で表示を考えてみることにしました。
- Count.cgi を流用してディジタル画像として表示させる。
- レイヤを作成してグラフ上に重ねて見せる。
このようにして、1日分の温度グラフと、現在値をディジタル表示させたところを下記に示します。

このディジタル画像の種類や表示位置も自由に設定できますし、別々のページに表示させることも可能ですね。
●
温度表示用画像の作成
Webブラウザでみる温度グラフには、ディジタル温度表示(画像)があります。上で述べたように、これは Web カウンタ(Count.cgi)を利用しています。一般的な画像としては、マイナス("-")やドット(".")は含まれていませんから、"PM"などの画像を改造して流用します。こうして作り変えた Count.cgi 用の画像(strip.gif)がこれです。

Count.cgi はパラメータ指定に従って、これらの画像から必要なものを抜き出し、合成して表示します。 また、Count.cgi には修飾をさせるための画像も指定できるので、これも活用してみました。
このために用意すべき画像の様子を下に示します。Count.cgi が実際に必要とするのは strip.gif あるいは、おまけとしての"背景用画像"だけです。
以前の記事でオリジナル・カウンタ画像の作り方の説明をするとしてましたので、ここで、上記のフォルダ内の画像名を利用し宿題提出をしておきます。
その記事内容に従って、make mkstrip を実行すると、mkstrip というカウンタ画像を結合するプログラムが作られるのですが、このコマンドを利用して、必要なすべての画像(0~9までの数字など)を順番に指定します。
mkstrip [0-9]FDG.GIF DFDG.GIF PFDG.GIF > strip.gif

したがって、一般の時間表示が可能な strip.gif ファイルの構造はこうなっていると思います。

さて、ここで温度の話に戻って、マイナス("-")記号の表示とか、少数点(".")の表示が必要なので、一部の画像を作り直したのが、上述の strip.gif だった訳です。
ondo.cgi では、温度データにおいて数字でない"-"と"."が含まれていたら、これらをそれぞれを Count.cgi が理解できるように、"A"と":"に置き換える処理もしています。
....
ONDO=`(echo -n $TEMP | /usr/bin/awk '/\./ gsub("\.", ":") gsub("-", "A") {print $1}')`
....
カウンタの設定方法はここを参照されてください。"AM/PM"の指定方法やカウンタ画像の"背景画像"の設定の仕方も説明されています(指定 strip.gif と同一場所に"背景画像"ファイルも入れておく)。
上記で利用しているカウンタ画像を参考のために
ondoGIF.tarとしてまとめました。
●
rrdtool の強み 温度の観測が無事にスタートしましたが、rrdtool の強みの一つとして、負の値が扱えるほかにグラフ表示期間を事由に設定できることが挙げられるでしょう。また、データ格納がラウンドロビンでありコマンドによって、値の参照、修正、書き出し、書き戻しができることも、非常に魅力的です。読者の皆さんも一度体験されることをお勧めします。
<和田 好司>
コメントする