RaspberryPiでスマートホーム 〜赤外線リモコンでエアコン操作 その1〜

ラズパイとUSB赤外線リモコンアドバンスでエアコンの操作に対応させたいと思います。エアコン対応はちょっと面倒くさいです。

エアコンのリモコンは全ての情報を毎回送信しています。どういうことかというと”温度をあげる”ボタンを押すと、例えば今の設定が25℃なら温度26℃の命令と同時に電源ON、冷房、風量1、風向きはスイング、タイマーセットなし…など全機能の情報が同時に送信されています。

なので単純に学習リモコンのように覚えるだけだと、組み合わせが膨大になります。

  • 冷房、温度28℃、風量1、風向きスイング…
  • 冷房、温度28℃、風量2、風向きスイング…
  • 冷房、温度28℃、風量1、風向き固定…
  • 冷房、温度28℃、風量2、風向き固定…

風量2つと風向き変えるだけで4つ。温度を5種類変えたければさらに×5。暖房、冷房、ドライで×3。タイマー使うならさらに…

使う機能をグッと絞って少ないパターンを記憶するのも手ですが、今回は送信するコマンドを解析して自分でコマンドを生成するようにしました。

ちなみにエアコンはDAIKINです。リモコンには”ARC446A3”と書かれています。

USB赤外線リモコンアドバンスのコマンドの解析

USB赤外線リモコンアドバンスには有志の方がメーカー提供のWindows版をLinuxに移植したbto_advanced_USBIR_cmdというプログラムがあり、それを使ってリモコンのコマンドを学習したり、赤外線を送信したりしています。

コマンドを生成するためにはまずこのbto_advanced_USBIR_cmdが学習した内容のファイルがどういう形式なのか調べないといけません。bto_advanced_USBIR_cmdのソースを参考に進めていきます。

このファイルには0xで始まる16進数の数値がカンマ区切りのテキストで並んでいます。

0x00,0x13,0x00,0x10,0x00,0x12,0x00,0x11,0x00,0x12,0x00,0x11,0x00,0x12,0x00,0x11,0x00,0x12,0x00,0x11,0x00,0x12,0x03,0xc0,0x00,0x86,0x00,0x41,0x00,0x13,0x00,0x31,0x00,0x12,0x00,0x11,0x00,0x12,0x00,0x11,0x00,0x12,0x00,0x11,0x00,0x12,0x00,0x31,0x00,0x13,0x00,0x10,0x00,0x13,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x12,0x00,0x11,0x00,0x12,0x00,0x32,0x00,0x12,0x00,0x11,0x00,0x12,0x00,0x31,0x00,0x13,0x00,0x31,0x00,0x12,0x00,0x11,0x00,0x12,0x00,0x32,0x00,0x12,0x00,0x31,0x00,0x13,0x00,(省略)

ソースと照らし合わせながら見て分かったことは…

  • 4バイトで1セット。
  • その4バイトのうち、最初の2バイトで赤外線をONにする長さ、後ろの2バイトで赤外線をOFFにする長さを表している

ということでした。例えば最初の4バイト、”0x00,0x13,0x00,0x10”が意味するところは、まず上位2バイトと下位2バイトをまとめて0x0013と0x0010、それぞれを10進数に直すと19と16。つまりLEDのONが19、LEDのOFFが16。この19,16という数字は実際の長さを周期(38khzの場合は26μs)で割ったもののようです。

赤外線リモコンのフォーマットにはいろいろあるようですが、私が使っているDAIKINのエアコンは家製協フォーマットをベースにしているようです。

赤外線のオンとオフの時間の長さでビットの0か1かが決まります。さらにいうとオンの時間は常に一定でオフの時間が短いと0、長いと1になります。また0か1以外にLEADERコードやSTOPコードと呼ばれる特殊な信号もあります。

上記の情報を元にこのファイルをビットにして表示するプログラムを作りました。Python3です。

dump_bits.pyという名前です。USB赤外線リモコンアドバンで記録したファイルを標準入力から流し込んで使います。

cat aircon_cold_28_wind0_swing.txt | python dump_bits.py

オンとオフの長さは多少ばらつきがありました。最後にそれぞれの数値が何回出現したか表示しています。なお0か1かはオフの長さで判断しますが、以下の基準を使ってます。

  • 45〜55…長い
  • 15〜20…短い

これは実際に記録したコマンドを何個か調べて、この範囲だったからという安直な理由です。

以下のサイトにDAIKINのコマンドの構成がありました。

最初は0が5回続いてSTOPコード、LEADERコードがきて64bitの後にSTOPコード…とサイトの説明通りになっています。LEADERコードは(多少の誤差はあるが)全て同じようです。STOPコードに関しては中2つ以外は誤差とは呼べないくらいの差があるので、3種類あるのでしょうか。

次はデータ部分を解析して見ます。

続く…