筆者について
FreeBSDを通じてOSSにささかな貢献を。
- 日本xrdpユーザ会発起人
- xrdp developer
- FreeBSD developer
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