2011/10/10

linuxでUSBRHで温度を測る


先日,計算機室のクーラーが停止して室温が50度くらいまで上がって,マシンが熱暴走した.その為,室温を計測して緊急メールを出すというシステムを作る必要があった.


それで,PCに接続可能な温度計があればなぁと思っていたら,見つけた!
USBRH (http://strawberry-linux.com/catalog/items?code=52002) という温度計はUSBでPCに接続して温度と湿度を得ることができる.
付属のライブラリとソフトウエアはウインドウズ用だけど,libusbがあればlinuxでも使用可能.

linuxで使うには,yumでlibusb-develを入れて,http://www.dd.iij4u.or.jp/~briareos/soft/usbrh.html にある usbrh-0.05.tar.gz をダウンロード&解凍&makeすれば使える.

ただし,230行目あたりの
if((rc = usb_set_configuration(dh, dev->config->bConfigurationValue))<0){ 
if( rc = usb_detach_kernel_driver_np(dh, dev->config->interface->altsetting->bInterfaceNumber)<0 ){
に変更しなければならない.


ちなみに,usbrh-0.05はアプリケーションで,ドライババージョンの usbrh-0.08 (http://green-rabbit.sakura.ne.jp/usbrh/)もあるけど,ドライバ関係は苦手だし,後輩君たちも分からないと思うので,アプリバージョンを選択した.


さらに問題があって,あるマシンでusbrhを実行すると,
Temperature: -40.00 C
Humidity: -4.25 %
となり,温度が正しく表示されない.
この-40.00と-4.25という値は初期値で,温度を取得できていないことを意味している.
ソースをみてみると,usbrh_main.c の
usb_bulk_read(dh, 1, buff, 7, 5000);
の呼び出しは成功を示す返り値が返ってきているのだが,buffに値が入っていない...

google先生に聞いてみると,ちらほらそういう事例があるようで,例えば
http://d.hatena.ne.jp/oxon/20101205/1291499466
では,二回に一回読取が出来ないらしい.
うちの環境では,読取が出来ないマシンでは,一切読み取れないけれど.

この問題は,恐らくOSが原因で,ドライバの読み込まれる順序が悪いんじゃないかなと思っている.



ひとまず,正常に計測できるマシンに2つのUSBRHをさして,
cronで 
usbrh -f1 > log1
usbrh -f2 > log2
を実行させている.
そしてtwitter botで最新の温度を読み取って,昼間の時間体だけ室温をつぶやかせて,
設定した閾値を超えたらスタッフにメールするようにした.



0 件のコメント: