サーバ室の温度管理方法
自宅や大学の研究室でサーバを設置している方は、温度管理に悩まれている方も多いと思います。
サーバの電源にはUPS(無停電装置)を付けていることが多いでしょうが、空調にはUPSをつけていないことが多く、停電により空調が停止してしまいます。
特に、3.11の原発事故以降、停電する確率が明らかに高まっているように思います。
ドコモが提供しているユビキタスモジュールでもできますが、
個人や小さな研究室ではもっと安価に(できれば月々の運用費はタダで)温度管理をしたいと望まれている方は多いでしょう。
ここでは、私が使用している安価で簡単な温度管理方法をご紹介します。
FreeBSD8.0を搭載したサーバーのUSBに接続して、portsが標準装備しているドライバをインストールするだけで温度と湿度を高精度に計測できます。
温度が測定できるようになれば、後はPHPを使用して、ウェブサイトに表示したり、一定温度を超過したらメールを送信したりと、自由自在です。
温度・湿度測定モジュール
温度・湿度測定モジュールの設置例
温度・湿度測定モジュールドライバのインストール
# cd /usr/ports/misc/usbrh-libusb/
# make install clean
これでインストール完了ですが、root以外のユーザでも実行できるよう属性を変更します。
温度・湿度測定プログラムの属性を変更
# chmod 4755 /usr/local/bin/usbrh
温度・湿度測定モジュールをUSBポートに接続し、
"su"コマンドで一般のユーザでログインして温度・湿度測定プログラムを動かしてみましょう。
以下のようにコマンドを入力すると、1秒程度で温度と湿度が表示されます。
温度・湿度測定プログラムの実行例
# /usr/local/bin/usbrh
25.65 63.83
WEBページに温度と湿度を表示する
次に、温度・湿度測定プログラムを実行するコマンドをPHPで用いて、WEBページに温度と湿度を表示してみましょう。
以下のような、HTML + PHPのWEBファイルを作成し、サーバーにアップした後、所定のURLにアクセスしてみましょう。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>コンピュータ室の温度および湿度</title>
</head>
<body>
<font size="7">
<?php
echo exec('/usr/local/bin/usbrh');
?>
</font>
</body>
</html>
そうすると、例えば以下の例のように、温度と湿度が表示されるでしょう。
26.18 55.21
設定温度を超えた時に携帯へメールを送る
温度が異常に高くなった場合、携帯へのメールが欲しいと誰もが思うでしょう。
このような場合には、以下のようなPHPコードを作成すれば良いでしょう。
私自身は、温度が異常に高くなった場合には、Gmailへ送信し、Gmailから携帯へ転送するようにしています。
この温度・湿度測定モジュールと監視システムのお蔭で、安心して外出することができます。
<?php
//メール送信関数
function EmergencyMail( $to, $strMessage )
{
$title = "温度超過メール";
$from = "***@*****.com"; <--- 送信元メールアドレス
mb_send_mail($to, $title, $strMessage, \"From:$from\");
}
// エラー処理:メールを送信する関数
function ErrorTreatment( $strMessage )
{
//メール送信のため内部文字エンコードを設定する
mb_internal_encoding("UTF-8");
//メールを送信する
$to = "XXXX@XXXXX.com" <--- 送信先メールアドレス;
EmergencyMail( $to, $strMessage );
}
//アクセスするURL
$url = "http://***.+++++.com/Temperature/";
// CURLオブジェクトを用意する
$object = curl_init( $url );
// User-Agentの値を指定する
curl_setopt($object, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
//成功した場合に取得結果、失敗した場合に FALSE を返す
curl_setopt($object, CURLOPT_RETURNTRANSFER, true);
//cURL 関数の実行にかけられる時間の最大値(5秒)
curl_setopt($object, CURLOPT_TIMEOUT , 5);
//URLの情報を取得する
$strObject = curl_exec($object);
//cURLが失敗した場合
if( !$strObject ) ErrorTreatment( "コンピュータ室の温度計測に失敗しました。" );
//cURLが成功した場合
else
{
preg_match("/\<font size=\"7\"\>(.*?)\<\/body\>/is , $strObject, $SearchData);
//温度と湿度
$Array = explode( " ", trim($SearchData[1]) );
$Temperature = floatval( $Array[0] );
$Humidity = floatval( $Array[1] );
if( $Temperature > 29.0 ) ErrorTreatment( "コンピュータ室の温度が29℃を超過しました。現在の温度は".$Temperature."℃、湿度は".$Humidity."%です。" );
}
//cURL セッションを閉じ、全てのリソースを開放する
curl_close($object);
?>
最終更新日:2013年7月8日