続 CPU 温度を RRDtool でグラフ化

今回は、忘れないうちにスクリプト化したものを、備忘として記載。
RRDtool で rrd ファイルを作成し、そこへデータを追記していくシェルスクリプトと、グラフ化するシェルスクリプトを作成。

やったこと

今回必要になるアプリのインストール。

$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install rrdtool sleepenh apache2


ラウンドロビンデータベース (rrd) の作成。

$ sudo rrdtool create /home/pi/rrd/thermaldata.rrd \
        --start $(date +"%s") \
        --step 60 \
        DS:thermal:GAUGE:600:0:U \
        RRA:AVERAGE:0.5:1:7200


今回は、60秒ごとのデータを、7200 ステップ(60分*24時間*5日)ほど収集する。
その rrd ファイルにデータを追記していくスクリプト thermaladd.sh を作成して、crontab で回す。


で、その crontab に追記した内容はコレ。

# 毎分、データ追記
* * * * * /usr/local/bin/thermaladd.sh


関連するディレクトリを作成して…と。

$ su -
# mkdir ~pi/rrd
# mkdir /var/www/rrd


試しにグラフ化してみると、時折 50℃ を超えていそうな気配がしたので、以前取り付けた CPU ファンを常時回すことに。
そこからしばらく経った現時点では、こんな感じ。


50℃を閾値として見やすくするのに、HRULEをベタ書き。
極端に温度が下がっている部分は、エアダスターの生ガスを吹き付けて強制冷却してたりする(あまりマネはしない方が良いです)。
そこからは、ファンを常時回しているので、それなりに低い温度で安定している模様。
そうそう、定格で 5v 動作のファンを 3.3v で動作させているので、めちゃくちゃ静か。


やっぱりブラウザで表示させると、楽だねぇ

作ったもの

一応、恒常的に使うものは /usr/loca/bin に置いて使っている。


まずは、データを集積するためのスクリプト thermaladd.sh なんだけど、いろいろやろうとして未使用になっている部分は削除。
bc コマンドがあれば実数で、なければ整数でデータ追記。

#!/bin/sh
######################################################################
##
## Script name : thermaladd.sh
##
######################################################################

### Parameter set ####################################################

pBaseDir=/home/pi/rrd
pGraphData="${pBaseDir}/thermaldata.rrd"

type bc > /dev/null 2>&1
if [ "${?}" = "0" ]; then
	pTemp=$(echo "scale=3; $(cat /sys/class/thermal/thermal_zone0/temp) / 1000" | bc)
else
	pTemp=$(( $(cat /sys/class/thermal/thermal_zone0/temp) / 1000 ))
fi

### Function set #####################################################

logput() {
	logger -t "${0##*/}" "$*"
}

fnEnd() {
	case $1 in
		0 | "" ) logput "Normal end";;
		* ) logput "error, unknown.";;
	esac
	logput "### script end (return=${1}) ###"
	exit ${1}
}

### Main process #####################################################
logput "### script start ###"

logput "## make graph data (rrd)"
logput "update ${pGraphData} --template thermal $(date +%s):${pTemp}"
rrdtool update "${pGraphData}" \
    --template thermal \
    $(date +"%s"):${pTemp}
[ "$?" = "0" ] || fnEnd $?

### End process ######################################################

fnEnd 0


集積したデータをグラフ化するためだけの graphrefresh.sh
引数に適当な名前を指定してあげると、その引数.png というファイルが出来る。
引数がなければ、thermal.png というのがデフォルトの名前になっている。

#!/bin/sh
######################################################################
##
## script name : graphrefresh.sh
##
######################################################################

### Parameter set ####################################################

pUser=root
pGraphDir=/var/www/rrd
pGraphTitle="$(uname -n) : CPU Thermal Average"
pGraph="${pGraphDir}/${1:-thermal}.png"
pGraphData="/home/pi/rrd/thermaldata.rrd"
pVerticalLabel="${pGraph##*/}"
pWidth="600"
pUpperLimit="55.0"
pLowerLimit="30"

### Function set #####################################################

logput() {
	logger -t "${0##*/}" "$*"
}

fnEnd() {
	case $1 in
		0 | "" ) logput "Normal end";;
		10 ) logput "error, check to ${2}";;
		11 ) logput "error, read permission, not exsit.";;
		12 ) logput "error, write permission, not exsit.";;
		13 ) logput "error, executive permission, not exsit.";;
		14 ) logput "error, executive user ${pUser} only.";;
		* ) logput "error, unknown.";;
	esac
	logput "### script end (return=${1}) ###"
	exit ${1}
}

### Main process #####################################################
logput "### script start ###"

logput "## environment check"
[ -r "${pGraphData}" ] || fnEnd 11
[ "$(whoami)" = "${pUser}" ] || fnEnd 14

logput "## graph making"
rrdtool graph "${pGraph}" \
	--title "${pGraphTitle}" \
	--vertical-label "${pVerticalLabel}" \
	--width ${pWidth} \
	--upper-limit ${pUpperLimit} \
	--lower-limit ${pLowerLimit} \
	--rigid \
	--imgformat PNG \
	--start end-5d \
        --end now \
	HRULE:50#FF0000:"seperater":dashes=4 \
	DEF:thermal=${pGraphData}:thermal:AVERAGE \
	LINE1:thermal#00FF00:"CPU thermal" \
	GPRINT:thermal:LAST:"cur\: %2.2lf /" \
	GPRINT:thermal:AVERAGE:"ave\: %2.2lf /" \
	GPRINT:thermal:MAX:"max\: %2.2lf /" \
	GPRINT:thermal:MIN:"min\: %2.2lf"
[ "$?" = "0" ] || fnEnd 10 "rrdtool graph"

# index.html create
/usr/local/bin/rrdindex.sh

### End process ######################################################

fnEnd 0

### History ##########################################################

Ver 0.1 - 2015/5/4


でもって、グラフ化したファイルを HTML で表示させるための rrdindex.sh

#!/bin/sh
######################################################################
##
## script name : rrdindex.sh
##
######################################################################

### Parameter setting ################################################

pIndexDir=/var/www/rrd
pHTML=${pIndexDir}/index.html

### Function setting #################################################

### Main process #####################################################

echo "<html>"				>  ${pHTML}
echo " <head>"				>> ${pHTML}
echo "  <title>rrd graph</title>"	>> ${pHTML}
echo " </head>"				>> ${pHTML}
echo " <body>"				>> ${pHTML}

for pPng in $(ls ${pIndexDir}/*.png); do
	printf "  <div><img src=\"./${pPng##*/}\"></div>\n" >> ${pHTML}
done

echo " </body>"				>> ${pHTML}
echo "</html>"				>> ${pHTML}

### End process ######################################################

いずれもヤッツケ感が半端ないw


〜〜 5/9 追記 〜〜
とりあえず、5日間経過したのでグラフを更新。
比較のため、上記と同じものを貼り付け。


次に、5/9 のものを貼り付け。


気温が分からないと、比較しようがない気がしてきた。
それでも45℃を超えた様子がなく、ファンが仕事をしている様子はよくわかるので嬉しい。