2012年11月28日水曜日

Linuxで温度計測してMRTGへ表示させる


USB温度計ってのがAmazonで売ってたので、これを使って室温を計測する。
ただ計測できるだけならつまんないので、MRTG使って温度もグラフ化してみる。

対象はCentOS 6(VM)です。

USB温度計のセットアップ


まずUSB温度計をPCに繋ぐ。
ただ、普通につないでもVMware上の仮想マシンは認識してくれない(かも)ので、設定でUSBを認識させます。(今回の設定はVMware5を利用してます。)
[仮想マシン設定]を開いて、デバイスの[USBコントロール]を選択して、設定画面で[すべてのUSB入力デバイス]がチェック入りにする。
これで、ツールバーにUSBデバイスがアイコンで表示されます。今回買ったUSB温度計を繋いだら、「Microdia TEMPer1V1.2」が表示されてます。

CentOS側でも確認してみると、次のように表示されてました。
# dmesg | grep TEMP
input: RDing TEMPer1V1.2 as /class/input/input4
input,hidraw0: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:02:00.0-2.1
hiddev96,hidraw96: USB HID v1.10 Device [RDing TEMPer1V1.2] on usb-0000:02:00.0-2.1
認識されたら、必要なパッケージをインストールします。
# yum -y install libusb-devel  git
gitは温度測定コマンドのソースコードが、githubで公開されているのを利用するために使います。
パッケージのインストールが終わったら、ソースコードのチェックアウトをします。
# git clone git://github.com/bitplane/temper.git
これで現在のディレクトリにtemperディレクトリがチェックアウトされます。
次にソースコードをカスタマイズします。
# vi ./temper/temper.c

以下のように編集。
44行目の utc = gmtime(&t); を utc = localtime(&t); に
47行目の strftime(dt, 80, “%d-%b-%Y %H:%M”, utc); を strftime(dt, 80, “%Y-%m-%d %H:%M:%S”, utc); に

/ *
 * Standalone temperature logger
 *
 */
#include <stdio .h="">
#include <time .h="">
#include "pcsensor.h"
/* Calibration adjustments */
/* See http://www.pitt-pladdy.com/blog/_20110824-191017_0100_TEMPer_under_Linux_perl_with_Cacti/ */
static float scale = 1.0287;
static float offset = -0.85;
int main(){
  int passes = 0;
  float tempc = 0.0000;
  do {
    usb_dev_handle* lvr_winusb = pcsensor_open();
    if (!lvr_winusb) {
      /* Open fails sometime, sleep and try again */
      sleep(3);
    } else {
      tempc = pcsensor_get_temperature(lvr_winusb);
      pcsensor_close(lvr_winusb);
    }
    ++passes;
  }
  /* Read fails silently with a 0.0 return, so repeat until not zero
   or until we have read the same zero value 3 times (just in case
   temp is really dead on zero */
  while ((tempc &gt; -0.0001 &amp;&amp; tempc &lt; 0.0001) || passes &gt;= 4);
    if (!((tempc &gt; -0.0001 &amp;&amp; tempc &lt; 0.0001) || passes &gt;= 4)) {
      /* Apply calibrations */
      tempc = (tempc * scale) + offset;
      struct tm *utc;
      time_t t;
      t = time(NULL);
      /*utc = gmtime(&amp;t); */
      utc = localtime(&amp;t);
      char dt[80];
      /* strftime(dt, 80, "%d-%b-%Y %H:%M", utc); */
      strftime(dt, 80, "%Y-%m-%d %H:%M:%S", utc);
      printf("%s,%f\n", dt, tempc);
      fflush(stdout);
      return 0;
    } else {
      return 1;
    }
  }
}


あとはmakeしたら、コマンドができます。
# cd ./temper
# make

温度計の動作確認

上で作ったコマンドの動作確認です。
makeしたディレクトリにコマンドが生成されているので、実行するとこんな感じになります。
# ./temper
2012-10-15 22:01:48,27.825012
このコマンドを使って、MRTGへのグラフ出力までやってみます。
長くなってしまったので、次の記事にまとめます。

参考:http://www.infiniteloop.co.jp/blog/2012/10/linuxthermometer/

0 件のコメント:

コメントを投稿