見出し画像

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

    (2)アドレスを指定して結果を取得

画像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を発行してくれる

画像3

画像4

取得した情報をM5stack UI flowに設定する

上記までで取得した情報をUI FlowのHttp Requestに設定する

画像5

■URLの指定
url=   https://api.nature.global/1/appliances/<Appliances ID>/light?button=off

■Headersに記載する項目

・Authorization  :  Bearer <token>                                                                    

・Host   :  api.nature.global


UI Flow画面

画像6

コード例(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の設定方法はまた気が向いたら別途記事書こうと思います





この記事が気に入ったらサポートをしてみませんか?