M5stackとNatureRemoで照明を操作する
内容
M5PaperでNatureRemoを制御しようとした所、意外にArduino+HTTPSのセンサ取得(Get)の記事はあるけど送信(POST)の記事がなかったため照明の操作をサンプルとしてメモに残してみる。UI Flowで作りました。※2021/03/7詳細を追記しました
設定に必要な情報
・Nature Remoのアクセスtoke
・AppliancesID/ボタン名
・WebAPIのURL
情報①Nature Remoのアクセスtokeの作成
以下にアクセスしてアクセスTokenを作成する
https://home.nature.global/
(参考サイト:https://blog-and-destroy.com/12297)
情報②AppliancesID/ボタン名の取得
NatureRemoのWebAPIを使用して各機器ごとにつけられたAppliances IDを取得する。curlを使用して取得しても良いが個人的にはPostmanを使用して取得するのがお勧め。
curl場合
$ curl -X GET "https://api.nature.global/1/appliances" -H "Authorization: Bearer <アクセスToken>"
Postman場合
WebAPIを簡単にテストすることができるサイト(アプリもあり): https://web.postman.co/home
簡単に変更して色々試せて便利。保存もできる。
(1)NatureRemoの認証タイプOAuth2.0を設定
(2)アドレスを指定して結果を取得
[
{
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", <= ライトのAppliances ID
"device": {
"name": "Remo",
"id": "xxx", <=RemoのID
"created_at": "2020-11-29T13:16:12Z",
"updated_at": "2021-03-06T23:49:06Z",
"mac_address": "",
"serial_number": "",
"firmware_version": "Remo/1.0.79-gbbcb0e8",
"temperature_offset": 0,
"humidity_offset": 0
},
"model": {
"id": "xxxx",
"country": "JP",
"manufacturer": "panasonic",
"remote_name": "tottara-ch-b",
"name": "Panasonic LIGHT 302",
"image": "ico_light"
},
"type": "LIGHT",
"nickname": "ライト",
"image": "ico_light",
"settings": null,
"aircon": null,
"signals": [],
"light": {
"buttons": [
{
"name": "on", <= ONのButton名
"image": "ico_on",
"label": "Light_on"
},
{
"name": "off", <= OFFのButton名
"image": "ico_off",
"label": "Light_off"
},
{
"name": "on-100",
"image": "ico_light_all",
"label": "Light_all"
},
{
"name": "on-favorite",
"image": "ico_light_favorite",
"label": "Light_favorite"
},
{
"name": "onoff",
"image": "ico_io",
"label": "Light_onoff"
},
{
"name": "bright-up",
"image": "ico_arrow_top",
"label": "Light_bright"
},
{
"name": "bright-down",
"image": "ico_arrow_bottom",
"label": "Light_dark"
}
],
"state": {
"brightness": "100",
"power": "off",
"last_button": "off"
}
}
}
]
情報③ WebAPIのURLの生成
以下のNatureRemoのWebAPIのswaggerサイトでサンプルを生成する
https://swagger.nature.global/#/default/post_1_appliances__appliance__light
使用したいデバイス種別を選択Try it outを押してAppliancesIDとButtonを入力すると適切なURLを発行してくれる
取得した情報をM5stack UI flowに設定する
上記までで取得した情報をUI FlowのHttp Requestに設定する
■URLの指定
url= https://api.nature.global/1/appliances/<Appliances ID>/light?button=off
■Headersに記載する項目
・Authorization : Bearer <token>
・Host : api.nature.global
UI Flow画面
コード例(UI Flowによる自動生成)
from m5stack import *
from m5ui import *
from uiflow import *
import urequests
import wifiCfg
import time
from m5stack import touch
remoteInit()
setScreenColor(15)
x = None
n = None
x_y_s_status = None
i = None
wifiCfg.doConnect('xxxxxxx', 'xxxxxxxx')
OFF_Button = M5Circle(96, 719, 60, 14, 0)
ON_Button = M5Circle(277, 726, 60, 14, 0)
line0 = M5Line(M5Line.PLINE, 0, 381, 530, 381, 0)
Remocon = M5Title(title="MyRemocon", x=3, fgcolor=15, bgcolor=0)
ON_Label = M5TextBox(258, 713, "ON", lcd.FONT_DejaVu24, 0, rotate=0)
OFF_Label = M5TextBox(72, 707, "OFF", lcd.FONT_DejaVu24, 0, rotate=0)
# 照明OFFの関数
def off():
global x, n, x_y_s_status, i
try:
req = urequests.request(method='POST', url='https://api.nature.global/1/appliances/<Appliances ID>/light?button=off',json={}, headers={'Authorization':'Bearer <Token>','Host':'api.nature.global'})
except:
pass
# 照明ONの関数
def on():
global x, n, x_y_s_status, i
try:
req = urequests.request(method='POST', url='https://api.nature.global/1/appliances/<Appliances ID>/light?button=on',json={}, headers={'Authorization':'Bearer <Token>','Host':'api.nature.global'})
except:
pass
def _remote_SwitchName():
global x, n, x_y_s_status, i, off, on
pass
lcd.show()
while not (wifiCfg.wlan_sta.isconnected()):
wait_ms(300)
lcd.print('Wifi Connected', 0, 0, 0)
x = 0
n = 0
while not (btnMID.isPressed()):
if touch.status():
x = 0
x_y_s_status = touch.read()
for i in x_y_s_status:
lcd.print(str(i), x, 100, 0)
x = x + 150
lcd.print(n, 0, 200, 0)
if 250 > x_y_s_status[0]:
off()
lcd.print('1', 0, 0, 0)
else:
lcd.print('2', 100, 0, 0)
if 250 < x_y_s_status[0]:
on()
lcd.print('3', 200, 0, 0)
else:
lcd.print('4', 300, 0, 0)
n = n + 1
else:
pass
lcd.show()
UI Flowの設定方法はまた気が向いたら別途記事書こうと思います