ESP-WROOM-32 Arduino アレクサ経由によるエアコン制御 「外部からのエアコン制御」への道 その5

今回、いきなりですが「エアコンの外部からの制御」は完成しました。

というか、あっけなかったのです。

というのも、外部からのON、OFFをどうやって行うかを考えた場合、WebページでON、OFFボタン作って、それを反映させようかと思ってました。

ですが、アマゾンのアレクサを使う方法もあることに気が付きました。

で、早速、エアコンのONとOFFの赤外線データを取得して、試したところON、OFFできてしまいました。

とは言え、後々の自分の為にも、どうやって順を追って行ったかくらいは残しておきましょう。

参考にさせて頂いたサイト↓

正直、最終的なコードは参考にさせて頂いたサイトほぼそのままに近いです。

1.エアコンの赤外線データを受信

IRremoteESP8266ライブラリを追加します。

追加に関して詳しいサイトはこちら↓

サンプルプログラムのIRrecvDumpV2にて赤外線受信を行う。

これ、大量の赤外線を受信できます。

最初、IRremoteライブラリを使ってみましたが、途中までしかデータが受信できないので、困ったなぁ。。となりました。

で、調べると、IRremoteESP8266ライブラリのほうが扱えるデータ量が多いことが分かりました。

2.Espalexaにて制御

エアコンのリモコンの冷房スイッチ(うちのは富士通ノクリア)をONとOFFした時の赤外線データを受信できましたので、ESP32へコードを書いて行きたいと思います。

初めにEspalexaライブラリを追加します。

コードは以下です。

参考にさせて頂いたサイトではLEDを表示させるようにしていましたが、自分は使わないので削除しました。

****** 追記です。 *******

やっぱりWifiが切れるので、Wifiを監視して切れたら、復活させるようにしました。

******************************

#include <Arduino.h>

// IR Remote
#include <IRremoteESP8266.h>
#include <IRsend.h>

// Espalexa
#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include <Espalexa.h>

// prototypes
boolean connectWifi();
boolean wifiConnected = false;
const char* ssid = "Jinsinnolan";
const char* password = "asuka672";

//callback functions
void airconPowerOnOff(EspalexaDevice* dev);

// IR  ( Serial 4 pin )
const uint16_t IR_LED_PIN = 4;
IRsend irsend(IR_LED_PIN);

// LED ( M5Stick-C 10 pin )
const uint16_t LED_PIN = 10;

// Air conditioner power on
uint16_t rawData_on[291]  = {3288, 1632,  420, 396,  420, 394,  420, 1210,  420, 396,  420, 1212,  420, 394,  420, 396,  420, 396,  420, 1210,  420, 1210,  420, 394,  420, 394,  420, 394,  420, 1212,  420, 1210,  420, 394,  420, 396,  420, 394,  420, 394,  420, 394,  420, 396,  420, 394,  420, 394,  420, 394,  420, 394,  420, 396,  420, 396,  420, 396,  420, 1212,  420, 396,  420, 394,  420, 396,  420, 394,  420, 396,  420, 396,  420, 396,  420, 1212,  418, 396,  420, 396,  420, 396,  420, 394,  420, 1210,  420, 1212,  420, 1212,  420, 1210,  420, 1210,  420, 1212,  420, 1212,  418, 1210,  420, 1212,  420, 394,  420, 1212,  420, 394,  420, 394,  420, 394,  420, 394,  420, 1212,  420, 396,  420, 394,  420, 396,  420, 396,  420, 396,  420, 1212,  420, 396,  420, 1210,  422, 394,  420, 396,  420, 394,  420, 1210,  420, 396,  420, 394,  420, 1212,  420, 1210,  420, 394,  420, 394,  420, 394,  420, 396,  420, 394,  420, 394,  420, 394,  420, 394,  420, 396,  420, 394,  420, 394,  420, 394,  422, 394,  420, 394,  422, 394,  424, 392,  424, 390,  396, 420,  396, 418,  398, 416,  458, 358,  430, 384,  462, 354,  464, 352,  498, 316,  498, 316,  502, 314,  474, 340,  508, 308,  474, 342,  472, 342,  496, 318,  470, 344,  470, 346,  468, 328,  486, 346,  466, 348,  466, 350,  466, 350,  464, 350,  464, 352,  464, 350,  464, 352,  490, 326,  464, 350,  490, 326,  490, 324,  490, 324,  490, 1142,  488, 328,  484, 330,  482, 1150,  454, 360,  452, 362,  452, 364,  450, 364,  450, 366,  450, 366,  450, 366,  448, 366,  446, 368,  446, 368,  446, 370,  444, 1186,  444, 1186,  420, 394,  420, 1212,  418, 1212,  418, 396,  418, 396,  418, 398,  418};  // FUJITSU_AC
// Air conditioner power off 
uint16_t rawData_off[115] = {3288, 1632,  440, 376,  420, 396,  420, 1212,  420, 396,  418, 1212,  418, 396,  420, 396,  420, 396,  418, 1212,  418, 1212,  418, 396,  418, 396,  420, 396,  418, 1212,  418, 1212,  418, 396,  420, 396,  418, 396,  418, 396,  418, 396,  418, 396,  418, 396,  418, 396,  420, 396,  418, 398,  418, 396,  420, 396,  420, 396,  420, 1212,  418, 396,  420, 396,  418, 396,  418, 396,  418, 396,  420, 394,  420, 396,  420, 1210,  420, 396,  420, 396,  418, 396,  420, 396,  418, 1212,  420, 396,  418, 396,  420, 396,  418, 396,  420, 396,  420, 396,  420, 1212,  420, 396,  418, 1212,  420, 1212,  420, 1212,  418, 1212,  418, 1212,  418, 1212,  418};  // FUJITSU_AC

Espalexa espalexa;

void setup()
{
  irsend.begin();
  Serial.begin(115200);

  // Initialise wifi connection 
  while (!wifiConnected) {
      wifiConnected = connectWifi();
      if(wifiConnected){
          Serial.println("Successful connection!");
          // Define the required devices. 
          espalexa.addDevice("FUJITSU AC", airconPowerOnOff, EspalexaDeviceType::onoff); 
          espalexa.begin();
      } else {
          Serial.println("Cannot connect to WiFi. Please check data and reset the ESP.");
          delay(2500);
      }
  }
}
 
void loop()
{
   // WiFi Lan の監視をします。
   wifi_lan_check();
   espalexa.loop();
   delay(1);
}

// Function to turn on / off the power of the air conditioner
void airconPowerOnOff(EspalexaDevice *d) {
    if (d == nullptr) return;
    Serial.println(d->getValue());
    if (d->getValue()) {
        Serial.println("Power On");
        irsend.sendRaw(rawData_on, 291, 38);
    } else {
        Serial.println("Power Off");
        irsend.sendRaw(rawData_off, 115, 38);
    }
}

// connect to wifi – returns true if successful or false if not
boolean connectWifi(){
  boolean state = true;
  int i = 0;
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");
  Serial.println("Connecting to WiFi");

  // Wait for connection
  Serial.print("Connecting...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (i > 20){
      state = false; break;
    }
    i++;
  }
  Serial.println("");
  if (state){
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  }
  else {
    Serial.println("Connection failed.");
  }
  return state;
}

/*
 * void wifi_lan_check()
 *   WiFi Lan の監視をします。
 */
void wifi_lan_check(){
  int i;
  if(WiFi.status() !=3){
  }
  if(WiFi.status() != WL_CONNECTED){
    WiFi.disconnect();
    delay(50);
    WiFi.begin(ssid, password);
    i=50;
    while (WiFi.status() != WL_CONNECTED) {
      delay(250);
      i--;
      if(i<0){
        delay(250);
        ESP.restart();
      }
    }
  }
}

これでコードは終わり。

3.アレクサのデバイスとして追加します

デバイスの追加を行っていくと簡単に繋がります。

詳細は参考にさせて頂いたサイトが良いと思います。

ということで、簡単にアレクサデバイスになったのでした。

ん~。。他力本願、、こんなことで良いのか。。という感じでもあります。

4.テスト

で、実際にON、OFFさせて見たところ、まず、近くないとON、OFFできなかったです。

有効距離はちょっとわかりませんが、自分の場合、エアコンの下に棚があるので、そこに置いてやったらON、OFFしました。

30cmくらいですかね。反応はいいですけど。。

どこかの記事に有効距離を伸ばすためには・・・という記事があったと思いますが、探してもどこへいったのか。。

ということで一応外部からのエアコン制御(ON、OFF)が出来るようになりました。

Webページを介してとか考えてる場合じゃないですね。

ホント、色々ツールあるんだなぁ。と考えさせられる記事でした。