chakokuのブログ(rev4)

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

MQTT経由でエアコンを制御する

まぁ出尽くしたネタではあるが、、MQTTに投稿されたら、Node-REDでMQTTを読んでエアコンを制御するサンプルを実装
MQTTのトピックスは以下とした

<ホームID>/<デバイスID>/control

messageのPayloadはJSON形式で以下

{"control" : "pw_on"}  or {"control" : "pw_off"}

shiftrはID/PWDで認証するので、Node-REDでもMQTT購読設定時、ID/PWDを設定する


MQTTをウオッチして、制御が投稿されたらエアコンを制御するフローの例

状況を考慮せず、ひたすらエアコンのOn/Offを投げ続けるテストプログラム

#!/usr/bin/python3 

import paho.mqtt.client as mqtt
import json
import pdb

HOST = "rainXXXX.cloud.shiftr.io"
ID ="rainXXXX"
PWD ="NhXXXXXXXX0a"
DEV_NAME = "controller00"

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("control/#")

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client(DEV_NAME)
client.username_pw_set(ID, password = PWD)
client.on_connect = on_connect
client.on_message = on_message
client.tls_set()

client.connect(HOST, 8883, 60)
client.loop_start()


import time
count = 0

homeID = 'home0123'
deviceID = 'ac0123'

message = {'control' : 'pw_on',}      # 機器制御は、pw_on,pw_offを指定

topic = f"{homeID}/{deviceID}/control"

power_sw = False
while True:
   print("wait...")
   time.sleep(1)   
   if count % 5 == 0:
       if power_sw :
          message['control'] = 'pw_on'
       else:
          message['control'] = 'pw_off'
       client.publish(topic,json.dumps(message))
       print(json.dumps(message))
       power_sw =  not power_sw
   count += 1       

client.loop_stop()
client.disconnect()

補足:制御対象は、ECHONET-Liteで制御できる機器を想定
shiftrのコンソール画面(MQTTでPublishして機器制御している状態)


■追記
HTTPSで投稿する方法
shiftrではHTTPSで記事を投稿することも可能であった。mqttでは認証とかかなり苦労したのだが。。HTTPSなら一発で動く。

curl -X POST 'https://<id>:<passwd>@rainXXXXX.cloud.shiftr.io/broker/home123/dev456/control' -d 'power_on'

HTTPSで投げ込めるので、Alexa --> IFTTT --> shiftr の経路でMQTTがポストできる

■参考URL
Topicの命名
MQTT Topic and Payload Design Notes