M5 Atome Lite・Atom Matrixでおうちハック! ECHONET Lite対応の空気清浄機を動かす
※このページは、神奈川工科大学 コミュニケーションロボティクス研究室および 電気電子工学科/ホームエレクトロニクス開発学科の実習用チュートリアル用のページです。
関連ページ
M5 Atome Lite・Atom Matrixでおうちハック! ECHONET Lite によるスマートハウス操作 入門編
M5 Atome Lite・Atom Matrixでおうちハック! ECHONET Lite によるスマートハウス操作 実践編
M5 Atome Lite・Atom Matrixでおうちハック! ECHONET Lite対応の電動ブラインドを動かす
※ECHONET Liteの基本に関しては、 M5 Atome Lite・Atom Matrixでおうちハック! ECHONET Lite によるスマートハウス操作 入門編を、電文の作成の詳細に関しては、M5 Atome Lite・Atom Matrixでおうちハック! ECHONET Lite対応の電動ブラインドを動かすを参照してください。
1. やりたいこと
Atom Lite、Atom MatrixでECHONET Lite対応の空気清浄機を操作する
Atom Lite/Marix から UDP通信でECHONET Liteコマンドを投げて制御
空気清浄機を ON/OFF
2. ポイント
M5 Atome Lite・Atom Matrixでおうちハック! ECHONET Lite によるスマートハウス操作 入門編で照明を操作したコードをもとに、DEOJを照明から空気清浄機に変更します。
照明では 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>
電文作成の詳細は下記を参照:
ECHONET Liteの電文 作成方法( https://qiita.com/miyazawa_shi/items/725bc5eb6590be72970d )
APPENDIX ECHONET機器オブジェクト詳細規定Release R (PDF 7.2MB)( https://echonet.jp/wp/wp-content/uploads/pdf/General/Standard/Release/Release_R/Appendix_Release_R.pdf )
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
#include <WiFi.h>
#include <WiFiUdp.h>
#include <M5Atom.h> // M5 Atom専用ライブラリ
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の三項演算子とはやや表記が異なるので補足で説明しました。
学内のスマートハウス環境で実際に動かす際は、M5 Atome Lite・Atom Matrixでおうちハック! ECHONET Lite によるスマートハウス操作 実践編を参考にしてください。
#ECHONET-Lite #スマートハウス #IoT #ものづくりプロジェクトII
https://gyazo.com/71c7de59f100448c29cdb7f29fbd171b
Communication Robotics Lab.