Linux からエアコンを操作

以前買っておいたバッファロー製学習リモコンキット「 Remote Station 」を Vine Linux に繋ぎ、エアコンの電源 On/Off 等をできるようにしてみました。
Linux のコンソール上で

./irrc aPowOn

と打つことでエアコンの電源が入ったり、

./irrc aPowOff

と打つことでエアコンの電源を切ったりできるようになりました。
私の場合の手順と方法を書いておきます。
参考にしたサイト
仙石浩明の日記さんのこのページ
http://k-home.no-ip…

OS : Vine Linux 4.2
まず、「仙石浩明の日記」さん作 Perl スクリプトで必要となる CPAN の Device::SerialPort モジュールをインストールしておく。

# perl -MCPAN -e shell
cpan> install Device::SerialPort

参考 : Perlのモジュールをインストールしよう!
Remote Station を PC に繋ぎ、コンソールに以下のコマンドを入力して認識されていることを確認

# cat /proc/bus/usb/devices

ずらずらと出る文字の中に次のようなものがあれば OK 。

T: Bus=04 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 5 Spd=12 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0411 ProdID=00b3 Rev= 4.00
S: Manufacturer=BUFFALO
S: Product=BUFFALO RemoteStation PC-OP-RS1
S: SerialNumber=00000b55
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=500mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms

次に以下のように入力してから再度上記コマンドを入力する。

# /sbin/modprobe ftdi_sio vendor=0x0411 product=0x00b3

T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 5 Spd=12 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0411 ProdID=00b3 Rev= 4.00
S: Manufacturer=BUFFALO
S: Product=BUFFALO RemoteStation PC-OP-RS1
S: SerialNumber=00000b55
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=500mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=ftdi_sio
E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms

上記赤字のようになれば OK 。
次に「仙石浩明の日記」さんの公開している Perl スクリプトを適宜書き換えながら作成する。
私の場合はこんな感じ。

#!/usr/bin/perl
use strict;
use warnings;
use Device::SerialPort;
use Getopt::Std;
my %Ir;
$Ir{‘aPowOn’} = [
pack(“H*”, “ffffffffff1f00000000003e00800f7e00800f00e0031ffc00001ff8c00700f8c10f3e00800f00f0831f00e0031f00c0073f00c00700f001007e00800f00e00300fce00700f8c0073ef8c10f7e00800f00e0831ffc00001f00c0073ff8c1073e00800f00f0830f7c00001f00e0070000000000c0ffffffffff0100000000c00700f8c10700f001007ef0830f00e0031ffc00003ff8c00700f001007ef001007ce00300fce00300f800003f00c00700f001007e00801f7c00001ff8e0073ff8c00700f001007ef0810f00e00300fce0031ff8c00700f801003ef0810f00f003007c000000000000000000000000000000”),
];
$Ir{‘aPowOff’} = [
pack(“H*”, “ffffffffff1f00000000003e00800f7e00800f00e0031ffc00001ff8c00700f8c10f7e00800f00e0831f00e0031f00c00700f801003e00800f7e00800f00e00300fce0073ff8c00700f0c10f7e00800f00e00300fce0031ff8c0073ff8c1073e00800f00f003007c00001f00e0070000000000c0ffffffffff0100000000e00700f8c10700f001007ef0830f00e0031ffc00001ff8c00700f801007ef001007cf00300fc00001f00c00700f8c10700f001007e00800f7ce0031ffc00003ff8c00700f801007e00800f7ce0831ffce0031ff8c00700f801003e00800f00f003007c000000000000000000000000000000”),
];
$Ir{‘aSwing’} = [
pack(“H*”, “ffffffffff1f00000000003e00800f7e00800f00e0031ffc00003ff8c00700f8c10f7e00800f00e0831f00e0031f00c00700f8c10700f0810f00f003007c00001ffce00700f8c00700f0c10f7e00800f00e00300fce0031ff8c0073ff8c10f3e00800f00f003007c00001f00e0070000000000c0ffffffffff0100000000e00700f8c10700f001007ef0830f00e0031ffc00001ff8c00700f801007ef001007cf00300fc00001ff800003ff801003e00800f00f0830f7c00001ffc00003ff8c00700f801007e00800f7ce0831ffce0031ff8c00700f801003e00800f00f003007c000000000000000000000000000000”),
];
our ($opt_v, $opt_r, $opt_d, $opt_c);
getopts(“vrd:c:”) || &help;
my $Verbose = $opt_v;
my $device;
if ($opt_d) {
$device = $opt_d;
} else {
$device = “/dev/ttyUSB0”;
}
my $ch = 1;
if ($opt_c && $opt_c =~ /^[1-4]$/) {
$ch = ord($opt_c) – ord(‘0’);
print STDERR “Ch: $ch¥n” if $Verbose;
}
my $port = &openDev;
&sendData($port, “69”); # LED command
&expect(“4f”, &readData($port, 1));
if ($opt_r) {
my $data = &receive($port);
print unpack(“H*”, $data), “¥n”;
}
while ($_ = shift @ARGV) {
if (defined $Ir{$_}) {
print STDERR “Tx: $_¥n” if $Verbose;
for my $ir (@{$Ir{$_}}) {
&transmit($port, $ch, $ir);
}
} else {
print STDERR “Unknown command: $_¥n”;
}
}
exit 0;
sub openDev {
my $port = new Device::SerialPort($device) || die;
$port->user_msg(1);
$port->error_msg(1);
$port->baudrate(115200);
$port->databits(8);
$port->parity(“none”);
$port->stopbits(1);
$port->handshake(“none”);
$port->read_const_time(100); # 0.1 sec
$port->read_char_time(5);
$port;
}
sub transmit {
my ($port, $ch, $data) = @_;
&sendData($port, “74”); # transmit
&expect(“59”, &readData($port, 1));
&sendData($port, sprintf(“3%d”, $ch % 10));
&expect(“59”, &readData($port, 1));
$port->write($data) || die;
&expect(“45”, &readData($port, 1));
}
sub receive {
my ($port) = @_;
&sendData($port, “72”); # receive
&expect(“59”, &readData($port, 1));
&expect(“53”, &readData($port, 1, -1));
my $data = &readData($port, 240);
&expect(“45”, &readData($port, 1));
$data;
}
sub sendData {
my ($port, $str) = @_;
$port->write(pack(“H*”, $str)) || die;
}
sub readData {
my ($port, $len, $timeout) = @_;
my $i = 0;
my $j = 0;
my $data;
if (! defined $timeout) {
$timeout = 10;
}
while ($i < $len) { my ($l, $d) = $port->read(1);
if ($l > 0) {
$data .= $d;
$i += $l;
$j = 0;
} else {
$j++;
if ($timeout > 0 && $j > $timeout) {
print STDERR “TIMEOUT to read $len byte¥n”;
exit 1;
}
}
}
if ($Verbose) {
print STDERR “read: “, unpack(“H*”, $data), “¥n”;
}
$data;
}
sub expect {
my ($ex, $d) = @_;
my $str = unpack(“H*”, $d);
if ($str ne $ex) {
print STDERR “expect $ex, but got $str¥n”;
exit 1;
}
}
sub help {
print STDERR <
opt: -d set device
-c set channel
-r receive
-v verbose
BUFFALO RemoteStation PC-OP-RS1 操作スクリプト
http://blog.gcd.org…
エアコンON : ./irrc -c2 aPowOn
エアコンOFF : ./irrc -c2 aPowOff
エアコンスイング : ./irrc -c2 aSwing
EOF
print “com: “, join(” “, sort keys %Ir), “¥n”;
exit 1;
}

VIM コマンド一覧 : Vi機能別主要コマンドリファレンス
そして上記スクリプト ( ここでは irrc という名前で保存したとする ) を実行できるようにし、

./irrc -r

と打ってからRemote Station 本体受光部にエアコンのリモコンの送信部をくっつけ、該当のボタンを押してみる。
( 何度か繰り返して同じコードが帰ってくることを確認した方がいい。
場合によってはコードの一部がなぜか異なっていたり、機種によっては電源ボタン1つでも On / Off で別のコードの場合もあります。)
確認できたら上記スクリプト内のアタマの方にある

$Ir{‘引数名’} = [
pack(“H*”, “〜”),
];

というところの引数名とコード部を適宜書き換えて上書き保存する。
そして Remote Station の送信部をエアコンの方に向けてからコンソールに

./irrc 引数名

又は

./irrc -c2 引数名

と打ち動作することを確認する。
後はこれを実行するスクリプトを作る等ごそごそ。
ちなみに送信部は1つのケーブルに2つあり、送信部のケーブルの根元に黄色い目印のある方がチャンネル1でもう片方がチャンネル2。
( Remote Station 本体の A 側にケーブルを挿した場合 )
スイングまで登録してあるのは動作確認のために頻繁にエアコンの電源を On/Off するのはあまりよくないと判断したため。

General · 未分類
いいね!   0
Loading...

関連

コメントを残す

メールアドレスが公開されることはありません。