まぁ出尽くしたネタではあるが、、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