上海問屋のDNSB-35137など、いくつかの販路で取り扱われているUSB接続の温度計 RDing TEMPerV1.2。
その温度をmuninで計測するためにpluginを作った。
今回考慮が必要だった点
・USB温度計を2つつなぐ
・つなぐUSB BUSが同じであるため、CentOS5上で見分けがつかない
(TEMPerV1.2ではシリアルを含めデバイス内のパラメータが全部一緒で見分ける方法がない)
・2つの温度計の設置位置は違うので、温度差が5度ぐらいある
・pcsensorコマンド実行時、デバイスがオフラインになることが良くある
(参考→USB温度計 TEMPerV1.2は計測ミスが多い)
あまり複雑なことをするのも嫌だったので、単純な実装としました。
・温度が2つ取得できるまで、再試行する
・温度が低い方から順にソートして「usbtemper0」「usbtemper1」としていく
また、内部で使うコマンドは、うちで作成した「pcsensor-1.0.2 for TEMPerV1.2 with multi device support」を使います。
USB温度計を1個しか繋がない人は「my $maxdevice=1;」に書き換えてください。
#!/usr/bin/perl -w
my $options="-d";
my $maxdevice=2;
my $arg=$ARGV[0];
if(!$arg){ $arg=""; }
if("$arg" eq "config"){
print "graph_title USB Temperature Sensor\n";
print "graph_vtitle Celsius\n";
print "graph_category sensors\n";
print "graph_args --base 1000 -l 0\n";
}
my @devlist;
my $count=0;
while($count<$maxdevice){
open(FILE,"/usr/local/bin/pcsensor $options|");
while(my $line=<FILE>){
$line =~ s/\n//ig;
if($line =~ /Temperature/){
my @strs=split(/ /,$line);
my $devnumber=$strs[3] ."-". $strs[5];
my $value=$strs[8];
$value=~ s/C//ig;
#$value=int($value);
$devlist[$count]=$value;
$count++;
}
}
close(FILE);
}
my $counttmp=0;
foreach $value (sort @devlist){
if("$arg" eq "config"){
print "usbtemper".$counttmp.".label USB temper".$counttmp."\n";
}else{
print "usbtemper".$counttmp.".value ".$value."\n";
}
$counttmp++;
}
これ、仕掛けて3時間ぐらいしたら、kernel panic起こしやがった・・・