エアコンの「におい除去」をHomeKitから起動する

DIYする

エアコンの「におい除去」や「内部クリーン」と呼ばれる乾燥機能を、ESP32でDIYしたスマートリモコンから起動できるようにしました。これでエアコン乾燥機能をHomeKitから操作し自動化できます。

「におい除去」機能

パナソニックのリモコン(A75C3777)には、「におい除去」というボタンが付いてます。

これを3秒以上長押すと、約20分間「におい除去」運転をして、元の状態に戻ります。電源Off状態で長押しすると、「におい除去」運転の後、電源Offになります。

「におい除去」運転にすると、強い風量の暖房運転の状態になり、エアコン内部を乾燥させ、臭いの発生を防ぎます。動作中は、室温と湿度が上がり、エアコンから臭いが出てきます。なので、1日のエアコン運転を終了した後、部屋を空ける直前に「におい除去」運転を開始していました。夜になっても暑い日が続くので、暖房運転の効率はとても良いはずです。それほど電力を使用せずに、エアコンが乾燥できると期待してます。

ただ、普段はHomeKitからスマートリモコンで操作しているのに、この機能を使う時だけリモコンを探すのが面倒でした。さらには、「人が不在の時間に自動的に実施したら良い機能」ですので、これこそ自動化すべきと思いました。

ということで、ESP32でDIYしたスマートリモコンに、「におい除去」機能を追加します。

IRパターンを調べる

赤外線リモコンについているボタンなので、これも赤外線を発しているはずです。そこで、ESP32でDIYした赤外線パターン記録機能を使って、パターンを取得しました。「におい除去」ボタンは、押した直後には赤外線は何も出ません。3秒間長押しすると、初めて赤外線信号がでます。それをESP32基板の赤外線受光器に向けて記録しました。

「におい除去」ボタンのパターンは、

[3455,1723,396,457,400,1316,404,454,396,456,400,457,392,458,402,456,394,456,401,456,394,456,402,456,370,456,400,457,392,1325,402,455,394,457,402,456,395,455,402,456,392,457,402,456,393,1324,402,1323,395,1323,377,489,394,457,399,1332,396,455,401,448,403,454,401,449,403,455,401,448,401,456,402,449,401,455,402,449,376,482,375,474,401,456,400,449,400,458,401,449,400,457,403,447,376,482,400,451,401,455,401,449,403,455,375,474,401,457,399,450,399,459,400,450,399,459,399,450,375,1350,375,1343,375,483,398,450,376,483,374,476,399,458,399,10001,3418,1780,368,484,374,1352,364,483,375,491,366,484,373,491,367,484,373,491,366,484,374,492,366,484,373,491,366,484,373,1358,366,484,373,478,373,485,373,477,374,485,372,477,373,485,372,1344,374,1352,373,1345,372,485,365,486,371,1357,361,485,372,485,365,486,372,485,365,485,372,485,364,486,371,486,365,485,372,486,364,486,372,485,365,1353,373,485,365,1353,372,486,365,486,371,1352,366,1352,374,479,371,1353,372,478,372,1354,372,477,372,486,372,1346,372,1354,365,485,372,486,365,493,364,1353,365,485,372,1352,365,486,372,1352,366,1353,373,474,371]

でした。数値は、赤外線がOn/Offになる時間をマイクロ秒で計測した結果です。グラフにすると、

という形状でした。前半、後半に分かれていて、それぞれが家電協フォーマットになってます。フォーマットに従って解析すると、それぞれのパートのサイズは8バイトです。前半、後半のデータは、それぞれ

0x0220E00400000006
0x0220E00480B2326A

でした。最後のバイトはチェックサムのようです。

このリモコンの「におい除去」以外の、通常の操作ボタンは、以前に解析しました。こんな感じのパターンです。

やはり、前半、後半に分かれています。このうち、前半は通常ボタンも「におい除去」ボタンもどちらも全く同じです。一方で後半は長さが違います。通常ボタンは19バイトあり、長いです。後半のビットの構成も調べてみましたが、開始部分は似ているものの、かなり異なってました。

いずれにしても、この赤外線パターンを流せば、エアコンは「におい除去」運転をしてくれるはずです。

ESP32でDIYする

そこで、こちらで作成したパナソニック用スマートリモコン用Arduinoプログラムに、「におい除去」ボタン機能を追加します。

赤外線パターンを出す

上記で示した赤外線パターン

0x0220E00400000006
0x0220E00480B2326A

を、ESP32でDIYしたスマートリモコンから送出する関数、cleanAC()を、以下のように作りました。そしれこれを、Panasonic用のスマートリモコンプログラムに追加します。

ここでは、ESP32から任意のリモコン信号を送出するために、IRremoteESP8266ライブラリのIRsendクラスのインスタンスirsendを作ってます。irsendのインスタンスメソッドであるirsend.sendGeneric()を使用して、赤外線パターンを送出します。sendGeneric()は2回呼び出し、それぞれで前半の8バイト、後半の8バイトの赤外線パターンを送出します。

#include <IRremoteESP8266.h>
const uint16_t kIrLed = 4; //GPIO for IR LED.

///////for A/C clean function////////

IRsend irsend(kIrLed); //for sending IR data
//pulse width in micro sec.
const uint16_t kPanasonicHeaderMark = 3456; //Header (on-part)
const uint16_t kPanasonicHeaderSpace = 1728; //Header (off-part)
const uint16_t kPanasonicBitMark = 432; //Bit mark (on)
const uint16_t kPanasonicOneSpace = 1296; //Off for one
const uint16_t kPanasonicZeroSpace = 432; //Off for zero
const uint16_t kPanasonicFooterMark = 432; //Footer (on-part)
const uint16_t kPanasonicFooterSpace = 10000; //Footer (off-part)
const uint16_t kPanasonicCleanDataLength = 8; //clean command length
//cleaning command
const uint8_t kClean1[kPanasonicCleanDataLength]={0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06};
const uint8_t kClean2[kPanasonicCleanDataLength]={0x02, 0x20, 0xE0, 0x04, 0x80, 0xB2, 0x32, 0x6A};

//Cleaning mode on
void cleanAC(void) {
  //section #1
  irsend.sendGeneric(kPanasonicHeaderMark, kPanasonicHeaderSpace, kPanasonicBitMark,
    kPanasonicOneSpace, kPanasonicBitMark, kPanasonicZeroSpace,
    kPanasonicFooterMark, kPanasonicFooterSpace, &kClean1[0], kPanasonicCleanDataLength,
    kPanasonicFreq, false, 0, 50);
  //section #2
  irsend.sendGeneric(kPanasonicHeaderMark, kPanasonicHeaderSpace, kPanasonicBitMark,
    kPanasonicOneSpace, kPanasonicBitMark, kPanasonicZeroSpace,
    kPanasonicFooterMark, kPanasonicFooterSpace, &kClean2[0], kPanasonicCleanDataLength,
    kPanasonicFreq, false, 0, 50);
}

void setup() {
  //略
  irsend.begin(); //Clean button
  //略
}

sendGeneric()にはたくさんの引数があります。主に、赤外線パルスの長さを指定する引数です。以下に図示します。

Markが赤外線Onの幅で、SpaceがOffの幅です。BitMarkがビットを区切るための赤外線Onパルスの幅で、ZeroSpaceとOpneSpaceが、それぞれ0と1を表す赤外線Offの時間幅です。下図の数字は、プログラムで使用した時間幅(マイクロ秒)です。

データの開始と終了を示すために、HeaderとFooterがあり、それぞれMarkとSpaceの対になってます。

sendGeneric()メソッドの引数のうち、FooterSpaceの次以降の引数は、

  • 送出するバイト列へのポインター、
  • その長さ (8) 、
  • 赤外線変調周波数 (36700)、
  • MSBから送出するかどうかのフラグ (false) 、
  • 変調のデューティ比(通常は50%)

です。

MQTTで通信する

「におい除去」機能も、HomeKit、HomebridgeからMQTTメッセージで動作させることにします。そこで、ESP32のスマートリモコンプログラムがMQTTメッセージを受け取っている部分に、以下のように追記しました。

//MQTT: subtopic call back
void onMessageReceived(const String& topic, const String& message) {
  String command = topic.substring(topic.lastIndexOf("/") + 1);
  if (command.equals("Active")) {

  //略

  }else if (command.equals("Clean")) {
    if(message.equalsIgnoreCase("true")) {
      if (pana.getPower() == false) { //AC if off
        cleanAC();
      } else { //if AC is running, do nothing but turn off the button.
        delay(500); //500ms delay
        client->publish("mqttthing/irESP/get/Clean","false");
        }
    } else {
      //if message is false, do nothing
    }
  }
}

このonMessageReceived関数は、”mqttthing/irESP/set/#”というトピックスにメッセージが来た時に呼び出されるように設定しました。なので、mqttthing/irESP/set/Cleanというトピックにtrueメッセージが来た場合に、上記のelse if文が実行されます。

エアコンが動作中に、うっかりボタンを押して「におい除去」が開始すると鬱陶しいと考えました。そこで、エアコンがOffの時だけcleanAC()関数を呼び出します。これで「におい除去」機能が作動します。一方、エアコンがOnの時は、何もせず、HomeKitの表示状態をOffに戻すためにMQTTパブリッシュします。ここでは、”mqttthing/irESP/get/Clean”トピックスにメッセージfalseを送ってます。次に説明するHomebridge設定でこれを受け取ります。

Homebridgeを設定する

Homebridgeでは、Mqttthingプラグインを使用します。これにファンのアクセサリを追加し、「におい除去」機能を呼び出すようにしました。その部分のコンフィグ設定は以下です。

{
  "type": "fan",
  "name": "CleanAC",
  "topics": {
    "setOn": "mqttthing/irESP/set/Clean"
    "getOn": "mqttthing/irESP/get/Clean"
  },
  "turnOffAfterms": 1500000,
  "accessory": "mqttthing"
},

HomeKit内からOn/OffするトピックスsetOnと、HomeKitの外部からOn/OffするトピックスgetOnを指定しました。これは以下のように動作します。

  • HomeKitの操作でOn/OffするとsetOnのトピックスにtrue/falseが流れます。
  • ESP32からgetOnにtrue/falseを流すと、HomeKitの画面表示がOn/Offに切り替わります。

turnOffAftermsは指定したミリ秒後に、ファンを停止する機能です。「におい除去」機能は、約20分で終了するので、ここでは25分後(1500秒後)にOffになるよう設定しました。おそらくはfalseメッセージが送られますが、ESP32のプログラムでは対応していないので、何も動作はしません。ただHomeKit上の表示をOffにしてくれるはずです。

HomeKitから使う

この結果、元々のエアコンのボタンの他に、CleanACというファンのボタンが現れました。

これをクリックしたところ、「におい除去」機能が動作し、エアコンから強い風が出てきました。しばらくすると熱風になり、内部を乾燥した後、20分程度で終了しました。

ホーム.appの表示は、Mqttthingで指定した通り、25分後にOffになりました。

HomeKitのオートメーション機能を使って、指定した時刻に「におい除去」を動作させることも可能です。

他社エアコンの場合

パナソニックの「におい除去」機能と同様な乾燥機能は、他社のエアコンにも付いてます。例えば手元にあるダイキンのエアコンのリモコンARC468A3には、「内部クリーン」というボタンがあります。これを2秒間長押しすると、対応する赤外線信号が送出されるようです。今回と同様に信号を解析し、プログラムを作れば、これにも対応可能です。

まとめ

ESP32でDIYしたエアコン用スマートリモコンに、「におい除去」を動作させる機能を追加しました。HomeKit上にはファンのアイコンで表示されます。HomeKitのオートメーションで起動することも可能です。

Nature RemoやSwitchBot Hubなどの市販のスマートリモコンを使っている場合は、「におい除去」ボタンのパターンを機器として登録すれば、同様のことが可能かと思います。

コメント

タイトルとURLをコピーしました