chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

AmazonEchoで自宅のエアコンを操作

ずっと取り組んでいた、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に置くつもりなので、興味があったらご参照ください。