ずっと取り組んでいた、AmazonEchoで発話して、自宅のエアコンを操作する件ができた*1。経路は以下
[Echo]->[Alexa]->[Lambda]->[AWS IoT Core] V (MQTT) V [MQTT Client(AWS IoT Device SDK) on LaspberryPi] [家電制御ライブラリ on LaspberryPi] V (Echonet Lite) V [エアコン]<---[メディアコンバータ(無線ゲートウエイ)]
以下はラズパイ上のMQTT Client(AWS IoT Device SDKベース)の表示とエアコンに送付したEchonetLite電文の内容
Received message from topic topic_1 {'device': 'エアコン', 'operation': '止めて'} エアコン 止めて 1081000105FF010130096001800131 Received message from topic topic_1 {'device': 'エアコン', 'operation': 'つけて'} エアコン つけて 1081000105FF010130096001800130 Received message from topic topic_1 {'device': 'エアコン', 'operation': '止めて'} エアコン 止めて 1081000105FF010130096001800131
以下はラズパイ上の家電制御ライブラリ(EchonetLite電文を作ってUDPで送信するプログラム)
エアコンのOn/Offしかできない。IPや機器オブジェクトも固定で書いているので必要に応じて修正必要。
#!/usr/bin/python3 import socket TARGET_IP = "192.168.10.XXX" ECHONET_PORT = 3610 EOJ_AIRCON = '013009' EOJ_Controller = '05FF01' # Echonet Services ESV_SET = '60' ESV_SETC = '61' ESV_GET = '62' INF_REQ = '63' # Aircon Class (0x01/0x30/0x01-0x7F) EPC_AC_ST = '80' EDT_AC_ST_ON = '30' EDT_AC_ST_OFF = '31' #------------------------- def ac_ctrl(on_off): EHD1 = '10' HED2 = '81' TID = '0001' SEOJ = EOJ_Controller DEOJ = EOJ_AIRCON ESV = ESV_SET OPC = '01' EPC1 = EPC_AC_ST PDC1 = '01' if on_off == 'on': EDT1 = EDT_AC_ST_ON else: EDT1 = EDT_AC_ST_OFF msg = EHD1 + HED2 + TID + SEOJ + DEOJ + ESV + OPC + EPC1 + PDC1 + EDT1 print(msg) msg = bytes.fromhex(msg) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto(msg, (TARGET_IP, ECHONET_PORT)) sock.close()
■今後の取り組み
AWS Greengrassを使うとプログラミングレスでIoTシステムが組めるらしいので、Greengrassを使って同様の仕組みを作ってみたい。あと、機器状態をキャッシュしてくれるシャドー機構を使ってみるべし。
*1:今回試作したソース一式はGoogleDriveに置くつもりなので、興味があったらご参照ください。