M5 Atome Lite・Atom Matrixでおうちハック! ECHONET Lite対応の空気清浄機を動かす
関連ページ
1. やりたいこと
Atom Lite、Atom MatrixでECHONET Lite対応の空気清浄機を操作する
Atom Lite/Marix から UDP通信でECHONET Liteコマンドを投げて制御
空気清浄機を ON/OFF
2. ポイント
照明では DEOJ が 0x02,0x90,0x01 でしたが、空気清浄機では空気清浄器クラス 0x01,0x35,0x01 を指定します。
ON/OFFは機器共通の動作状態プロパティ EPC=0x80 を使います。 EDT=0x30 でON、EDT=0x31でOFF。
下記がECHONET Lite電文の例です
code:ECHONET Lite電文
1081 # EHD(ECHONETヘッダ)← "1081"で固定
0001 # TID(トランザクションID)← 何でもよい
05FF01 # SEOJ(送信元)← 自分コントローラー(グループ 0x05+クラス0xFF+インスタンス0x01)
013501 # DEOJ(宛先)← 空気清浄機(空気清浄器クラス0x01+ 0x35+インスタンス 0x01)
60 # ESV(ECHONET Lite サービス)← プロパティを SetI0x60に設定)
01 # OPC(処理プロパティ数)← 1個に設定
0x80 # EPC(機器共通の動作状態プロパティ:EPC=0x80)
01 # PDC(データ長:1バイト)
30 # EDT(データ:ON = 0x30, OFF = 0x31)
code:ECHONET Lite電文(UDP/IPテストツール用)
<10><81><00><00><05><FF><01><01><35><01><60><01><80><01><30>
電文作成の詳細は下記を参照:
3.2.4 空気清浄器クラス規定 pp.143 (3-98)
https://gyazo.com/75b207b2c29ddbc3f14d734205e17b2f
3. 対象機器
シャープ KI-EX100(E204 オール電化実験システム室) ※神奈川工科大学 電気電子情報工学科の施設です
code:構成
Atom Lite/Matrix (Wifi/UDP) ────── フェミニティ(アクセスポイントモード)
└──空気清浄機 KI-EX100(シャープ) 192.168.0.21 /3610
4. Atom LiteからECHONET Lite電文を送信
実際にArduinoコードで電文を構築し、UDPで送信してみましょう。
サンプル構成:
M5 Atom Lite→ Wi-Fi → UDP電文送信
家電(空気清浄機)受信 → 状態変更
code:ECHONET_Lite_sample.ino
const char* ssid = "YOURSSID"; //自分の環境に合わせて書き換える
const char* password = "YOURPASSWORD"; //自分の環境に合わせて書き換える
WiFiUDP udp;
IPAddress deviceIP(192, 168, 0, 21); // 宛先(空気清浄機)
const int echonetPort = 3610;
bool lightOn = false; // 空気清浄機のON/OFF(関数名は照明まま。手抜きですみません)
bool lastButton = false;
void sendECHONET(bool powerOn) {
byte echonetFrame[] = {
0x10, 0x81, // EHD
0x00, 0x01, // TID
0x05, 0xFF, 0x01, // SEOJ
0x01, 0x35, 0x01, // DEOJ
0x60, // ESV (SetC)
0x01, // OPC
0x80, // EPC (動作状態)
0x01, // PDC
powerOn ? 0x30 : 0x31 // EDT (0x30: ON, 0x31: OFF)
};
udp.beginPacket(deviceIP, echonetPort);
udp.write(echonetFrame, sizeof(echonetFrame));
udp.endPacket();
Serial.printf("ECHONET Lite電文を送信しました(%s)\n", powerOn ? "ON" : "OFF");
}
void setup() {
M5.begin(true, false, true); // LED使用のためI2C無効化(M5 Atom用)
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting...");
}
Serial.println("Connected!");
// WiFi接続成功時にLEDを白色に点灯
M5.dis.drawpix(0, 0xFFFFFF);
}
void loop() {
M5.update();
bool button = M5.Btn.isPressed();
if (button && !lastButton) {
// ボタン押下時のみトグル処理(チャタリング防止)
lightOn = !lightOn;
sendECHONET(lightOn);
// LED表示切替
uint32_t color = lightOn ? 0x00FF00 : 0xFF0000; // 緑 or 赤
M5.dis.drawpix(0, color);
}
lastButton = button;
delay(20); // ポーリング間隔
}
解説
Wi-Fi接続したM5 Atomを使って、ECHONET Lite形式のON/OFF電文をUDPで送信します。
内蔵ボタンを押すたびに照明のON/OFFを切り替え、その状態をLEDの色(緑=ON、赤=OFF)で表示します。
table:動作結果
ボタンを押す ON/OFFの状態を切り替える
ONのとき ON電文送信 (EDT=0x30)LED緑 点灯
OFFのとき OFF電文送信(EDT=0x31)LED赤 点灯
ONとOFFを区別するために、ECHONET Lite電文の最後の EDT(データ本体)部分だけが変わります。
ON:0x30(=動作状態ON)
OFF:0x31(=動作状態OFF)
この切り替えは、 三項演算子(条件 ? 真の場合 : 偽の場合)を使って以下のように書いています。
code:powerOn
powerOn ? 0x30 : 0x31
//powerOn(sendECHONETの引数) が true(=ON状態)なら 0x30、そうでなければ 0x31(=OFF)
Pythonの三項演算子とはやや表記が異なるので補足で説明しました。
https://gyazo.com/71c7de59f100448c29cdb7f29fbd171b