というわけで、ダイキンのエアコンのリモコンを解析してみました。
ダイキンのエアコンのリモコンの信号を読んでるなう… pic.twitter.com/CXOOyxoSpY— データセンター金太郎 (@EH500_Kintarou) 2018年8月20日
幸運なことに、世の中のリモコンはだいたい940nmくらいの赤外線を使っており、だいたい38kHzで変調されています。なので、市販の赤外線受信モジュールで読めてしまうのです。
写真に写っているのはDSO touchというオシロスコープで、時間軸方向で8192サンプルのデータを取って保存することができるので、ロジアナとしても使うことができます。
これである程度のデータを集めることができて、物理層としてのフォーマットがわかれば、後はArduinoでもなんでも適当な受信ソフトを作り、リモコンで様々な操作を行って大量のデータを取ればどのようなコマンドを送っているかわかってくるはずです。
物理フォーマット
ズバリ、物理フォーマットはこのようになっています。データはいわゆる「家製協(AEHA)フォーマット」です。詳しくは以下のページが参考になります。
赤外線リモコンの通信フォーマットこのサイトにT=425μs (typ.)と書いてありますが、このリモコンもそれくらいでした。1回のリモコン操作で2つのフレームを送っており、第1フレームが20バイト、第2フレームが19バイトです。第1フレームと第2フレームの間には35.2msの間隔(トレーラー含む)が空いており、第1フレーム開始の30ms前からON/OFF=1T/1T('0'の信号)を5回(+トレーラー)送るようです。
この冒頭の点滅信号は何なのかよくわかりません。我が家のエアコンでは特にこの点滅を送らなくても(いきなり第1フレームを送出しても)ちゃんと受信してくれました。同期信号か何かなんですかね。
データ内容
続いて肝心のデータ内容です。かなりめんどくさいです。それもそのはずです。エアコンにはいろいろな機能がありますが、1回の送信ですべての機能の設定内容を送っています。前回送信分との差分だけ(例えば『設定温度+1℃』のような内容のみ)の送信では、エアコンがリモコンの信号を受信できなかったときに、それ以降のリモコンの表示内容とエアコンの設定との整合性が崩れてしまうからです。
1フレーム目
2フレーム目
フレーム内容はこんな感じです。
AHEAフォーマットではデータは各バイトともLSB→MSBの順に送られている点に注意してください。補足欄に書いている数字はちゃんとMSBが左側になるように書いています。
最初の2バイトはカスタマーコード、3バイト目の下位4bitがカスタマーコード4bitずつをXOR取った値になっています。最後の1バイトはチェックサムで、それまでの送信データをすべて足し合わせた値になります。
なお、1フレーム目の「操作内容」は下表のとおりです。
値 | 操作内容 |
0x02 | 停止 |
0x03 | 設定温度変更 |
0x06 | 風向変更 |
0x07 | 風量変更 |
0x0C | タイマー取消 |
0x0D | 快適自動 |
0x0E | 冷房 |
0x0F | 除湿 |
0x10 | 暖房 |
0x16 | 風向左右変更 |
0x18 | 内部クリーン変更 |
0x1A | 送風 |
0x1C | ランドリー変更 |
0x1E | 入タイマー変更 |
0x1F | 切タイマー変更 |
0x2F | おやすみ変更 |
0x34 | 風ないス変更 |
0x35 | ストリーマ変更 |
何かボタンを押したときは、1フレーム目のText9にそのボタンに対応するこの値が入ります。
また、例えばランドリーモードは自動的に「風向上から2つ目」「切タイマー3時間」が入りますが、1frame目のText12の風向や2frame目のText11, 12の切タイマーはちゃんと風向上から2つ目、切タイマー3時間が入ります。
設定温度(2frame目Text6)はちょっとややこしいですが、絶対値の設定温度(冷房・暖房)の場合はそのままです。例えば25℃なら0b00110010(=50)です。設定温度は0.5℃単位で指定できますから、このように2倍の値を送っているのでしょうね。
相対値の設定温度(快適自動・除湿)の場合は下位5bitを使って設定します。上位3bitは0b110です。ですので、例えば+5℃設定なら0b11001010(下位5bitは0b01010=10)です。-5℃ならば0b11010110(下位5bitは10=0b01010の2の補数(反転させて1を足す)で0b10110)となります。
入タイマー/切タイマー時間は分単位で12bitで表されるので、例えば6時間だったら360分=0b000101101000になります。リモコンでは1時間単位でしか指定できませんが、ここに5分を指定したら本当に5分で止まるんでしょうかね。
それにしても、わざわざ2frameも送って設定をするのは何のためなんでしょうね。最初は昔の機器との互換性かと思っていましたが、大部分の設定内容が2frame目に入っている割には風向は1frame目にしか入っていませんし、すごく片手落ち感がありますよね。何に使っているかわからない(どんなボタンを押しても同じ1/0しか送信しない)ビットもたくさんありますし、1frameに圧縮して全データを送ることはできなかったんでしょうかね…。
参考になります。
返信削除ところで、手持ちのIoTな赤外線リモコンでは、ダイキンように設定しても自動で温度がセ氏表示のままなのですが、そちらの環境で自動でセ氏温度表示だと動作されますか?
コメントありがとうございます。
削除その件ですが、試したことが無いので何とも言えません。うちのエアコンは本体のほうに現在の設定温度等を表示する表示器が付いていないので、仮に送信してみたとしても、それが本当に受かっているかどうかは確認のしようがありません…。