今回、いきなりですが「エアコンの外部からの制御」は完成しました。
というか、あっけなかったのです。
というのも、外部からの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しました。
どこかの記事に有効距離を伸ばすためには・・・という記事があったと思いますが、探してもどこへいったのか。。
ということで一応外部からのエアコン制御(ON、OFF)が出来るようになりました。
Webページを介してとか考えてる場合じゃないですね。
ホント、色々ツールあるんだなぁ。と考えさせられる記事でした。