«前の日記(2011-07-15) 最新 次の日記(2011-07-21)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2011-07-16 パソコン用学習リモコン

パソコン用学習リモコン PC-OP-RS1

自宅のエアコンを外出先から制御するために PC-OP-RS1 を買いました。以前研究室のエアコンを自動制御していたときは、cron で CD トレイをイジェクトして壁に貼りつけたリモコンのボタンを押すというピタゴラスイッチ的な方法で制御していたんですが、自宅ではサーバとエアコンの位置関係上それが難しいのでPC-OP-RS1を買うに至りました。

FreeBSD で PC-OP-RS1 を使うようにするパッチはとうの昔に取り込まれているようで、8.2-RELEASE では挿すだけでシリアルポート /dev/cuaU0 として認識してくれました。

# usbconfig | grep BUFFALO
ugen0.3: <BUFFALO RemoteStation PC-OP-RS1 BUFFALO> at usbus0, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON

そのままでは一般ユーザで使用できないので、自分を dialer グループに入れるか /etc/{devd.conf,devfs.conf} を弄ってパーミッションを適切設定するかします。

crw-rw----  1 uucp  dialer    0, 112  7月 16 04:41 /dev/cuaU0
crw-rw----  1 uucp  dialer    0, 113  7月 16 04:41 /dev/cuaU0.init
crw-rw----  1 uucp  dialer    0, 114  7月 16 04:41 /dev/cuaU0.lock

パーミッションを設定して使えるようになったらを使用して制御しますが、FreeBSD で使用するには少しだけ修正が必要です。デフォルトのデバイス名を書き換えているだけなので必須ではありません。このスクリプトを使用するには comm/p5-Device-SerialPort が必要なのでインストールしておきます。

--- irrc.orig   2011-07-16 04:01:43.000000000 +0900
+++ irrc        2011-07-16 04:01:58.000000000 +0900
@@ -19,7 +19,7 @@
 if ($opt_d) {
     $device = $opt_d;
 } else {
-    $device = "/dev/ttyUSB0";
+    $device = "/dev/cuaU0";
 }
 my $ch = 1;
 if ($opt_c && $opt_c =~ /^[1-4]$/) {

あとは簡単。

$ ./irrc -r
ffffffffff1f000(略)

でリモコンの信号を読み取る。読み取ったら、irrc スクリプトの先頭に読み取った信号を追加します。

# エアコンを自動モードでオン
$Ir{'airconAutoOn'} = [
 pack("H*", "読み取った信号")
];

信号を送出するには、

$ ./irrc airconAutoOn

などとします。PC-OP-RS1 は 240 バイトまでの信号にしか対応していないため、エアコンの機種によっては操作できないようですが自宅で使用している東芝のエアコンは問題なく操作できました。こんな形のリモコンなら大丈夫でしょう。

制御に使っているサーバは HP の ML115 で、こいつは IPMI で吸気温度を測ることができるので外出先で室温を確認して、室温が 30℃ を超えていたら帰宅前にエアコンを入れておくという使い方ができます。前回のエントリで書いた九州電力簡易APIと組み合わせれば電力使用率が 90% を超えたらエアコンを自動的にオフにするとかいう制御も可能です。

参考にしたページ

ML115 で IPMI 経由で室温やCPU温度を取得する

どっかで書いたかもしれないけど、エアコンの制御のために室温を取得する方法を書いておく。

ipmitool をインストールし、カーネルモジュールをロードする。

# portinstall sysutils/ipmitool
# kldload ipmi

起動時に自動的にロードするにはもちろん、

ipmi_load="YES"

と /boot/loader.conf に書いておく。ipmitool コマンドで以下のような情報が取得できる。

# ipmitool sdr
(略)
CPU Diode        | 41.50 degrees C   | ok
Front Ambient    | 23.50 degrees C   | ok
(以下略)

CSV形式が欲しければ -c オプションをつける。

# ipmitool -c  sdr
(略)
Front Ambient,23.500,degrees C,ok
(以下略)

特定のセンサのみ欲しければ get "センサ名" をつける。

# ipmitool -c sdr get "Front Ambient"
Front Ambient,23.500,degrees C,ok,0.0,Unspecified,Temperature,,,,,42.000,35.000,,,,0.000,0.000

Front Ambient の数値のみが欲しければ、cut コマンドなどを使って取り出す。

# ipmitool -c sdr get "Front Ambient" | cut -d, -f2
23.500