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

前回はUSB赤外線リモコンアドバンス向けのデータの解析を行いました。

次はエアコンのコマンド部分を見ていきます。このコマンド部分を組み立てて上記の形式に変換して保存、赤外線送信という流れです。

エアコンのコマンドの解析

エアコンのコマンドを16進数で表示する

前回のbitを表示するツールを改造してdump_data.pyというツールを作りました。

こちらはLEADERコードやSTOPコードを含まないデータ部分のみを16進数で表示します。なのでどこがデータ部分かをソースの先頭の方のframesという配列で指定してあります。前回参考にしたサイトを元に3つのFrameの配列を作成しました。

こちらもUSB赤外線リモコンアドバンスで記録したファイルを標準入力から流し込んで使います。

cat aircon_cold_28_wind0_swing.txt | python dump_data.py

なんか出ました。

11 DA 27 00 C5 00 00 D7
11 DA 27 00 42 00 00 54
11 DA 27 00 00 39 38 00 BF 00 00 06 60 00 00 C1 00 00 69

Frameが3つあるので3行出てきます。ポイントとしては8バイト単位でビット順を前後逆にして16進数に変換して出力しています。このDAIKINのコマンドはそういう仕様(LSB First)のようです。

で、これから解析なのですが…実はすでに解析している方がいました。

とはいっても、同じDAIKINとはいえ、うちのエアコンと同じコマンドかどうかは実際に調べないと分かりません。何種類かエアコンのコマンドをUSB赤外線リモコンアドバンスで保存して、上記のサイトと照らし合わせて見ました。すると…ぴったり!

プログラムを作成する

このサイトを参考にコマンドの生成&USB赤外線リモコンアドバンス形式に変換してファイルに保存するプログラムを作成します。daikin.pyという名前にしました。こちらもPython3です。

使い方

使い方は…

usage: daikin.py [-h] [-p POWER] [-f FAN] [-s SWING] [-t TEMPERATURE]
[-m MODE] [-d DELAY]

パラメーターは

-p, –power “on” | “off” 電源オン/オフ
-m, –mode “cold” | “heat” 冷房/暖房
-f, –fan 0〜5 風量0(しずか),風量1〜5
-s, –swing “on” | “off” 風向きスイングオン/オフ
-t, –temperature 18〜30 温度
-d, –delay 1〜 入タイマー
-1〜 切タイマー

例えば冷房で電源をONは

python daikin.py -p on -m cold

温度を27℃にするには

python daikin.py -t 27

風量を2にするには

python daikin.py -f 2

切タイマーを1時間後にセットは

python daikin.py -d -1

といった具合です。実行すると同じフォルダに”daikin.txt”というファイルが保存されます。このファイルを

$ bto_advanced_USBIR_cmd -d `cat daikin.txt`

としてやれば、エアコンがつきます。このコマンドはあくまでもファイルを生成するだけです。

なおエアコンのリモコンは毎回全ての機能の設定を送ります。つまり引数に指定のないパラメータの分も送らないといけません。なので前回送信したデータを、同じフォルダにある”daikin.conf”に格納しておき、引数に指定のない分はその設定ファイルの設定を使用します。

設定ファイルが存在しない最初の送信時はデフォルトで”冷房”、”30℃”、”風向きスイング”になっています。

コマンド送信後はそのファイルに設定を上書きします。当然ですがコマンド送信に失敗したり、別のリモコンを使うと整合性は崩れます。

ソース解説

このソースの流れです。

  1. ”daikin.conf”を読み込み現在のステータスを取得する
  2. 与えられたコマンド引数を処理して上記のステータスを上書きする
  3. エアコンのコマンドを生成する
  4. USBアドバンスリモート形式に変換して”daikin.txt”に保存する
  5. 現在のステータスを”daikin.conf”に書き込む

Frame1とFrame2に関しては常に固定で送信しています。Frame1は”Comfort mode”を使うと変わるようなのですが、私は使ってないので固定にしています。

STOPコードに関しては前回書いたように3種類あるように見えたので、3つ別に作りました。

Bitの0と1の長さは出現回数が多いものを採用しています。

テスト

実際のエアコンのコマンドを記録したファイルと、上記のコマンドで生成したファイルを比較します。なお生のファイルはオンとオフの時間にブレがあるので直接比較はできません。最初に作ったdump_data.pyでエアコンのコマンド部のみを比較して同じかどうか確認します。

これでOKなら実際にコマンドを送信して見ます。

$ bto_advanced_USBIR_cmd -d `cat daikin.txt`

解析してくれてるサイトが既にあったので助かりました。これでかなり時間が短縮できました。

次は我が家のスマートホームシステムにこれを組み込みます。