7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

スマートリモコン「NatureRemo」のAPIの使い方

Last updated at Posted at 2020-11-27

#Nature Remo
Nature RemoはNature Remo 3, Nature Remo miniなどのスマートリモコンを販売しています。
Nature Remo 3は1万円程度で「温度センサー」「湿度センサー」「照度センサー」「人感センサー」「Alexa」「Google Assistant」「Siri(ショートカット)」に対応しています。

##API
Nature Remoの商品はAPI「Nature Remo Cloud API」が公開されており「センサーの情報」「リモコン制御」などがプログラミングから可能です。
この記事でAPIの使い方はわかりやすく出ているので、具体的なコードを見なくてもいい人はリンク先からみてください。
自分はPythonを使ってやっていきます。

##プログラミング
nature-remoというPythonのライブラリがあるためそちらを使うのが賢いですが、この後の「iOSのショートカット対応」への理解を深めるためにそちらのライブラリは使用しないでurllib,jsonのライブラリを使って進めていきます。
そちらの方法が見たい方は以下の記事を見てください。
https://qiita.com/morinokami/items/6eb2ac6bed48d2c7534b

#温度, 湿度, 照度、人感センサー情報取得
人感センサーは最後に動きを検出した日付を返してくれるが少し特殊

##実行結果##
温度 : 23度
湿度 : 54%
明るさは : 57度
最後に検知したのは2020-11-15T10:32:01Zです。
from urllib.parse import urlencode
from urllib.request import urlopen, Request
from urllib.error import HTTPError
from json import loads

api_key = "jmgkkDkFTiMp55iRcVGCRiTU5OUg7FqaQfKYDOECUXI.LPVbfXhH9bqcJfzqsyZ-4" # APIアクセストークン

url = "https://api.nature.global/1/devices/"

headers = {
    "accept" :"application/json",
    "Authorization" :"Bearer " + api_key,
}

request = Request(url, headers=headers)

try:
  with urlopen(request) as response:
    data_byte = response.read()
    data= loads(data_byte)
except HTTPError as e:
    print(e)

device_info = data[0]["newest_events"]

print("温度 : "   + str(device_info["te"]["val"]) + "")
print("湿度 : "   + str(device_info["hu"]["val"]) + "%")
print("明るさは : " + str(device_info["il"]["val"]) + "")
print("最後に検知したのは" + str(device_info["mo"]["created_at"]) + "です。")

##人感センサー日付 改良版
上のままでは人感センサーの日付がこのままではわかりずらいので、「〇〇分前」という処理をしたいと思います。
datetimeライブラリを使って日付の差分を出していきます。この処理をすることで2倍ほどのコード量になってしまっているので必要なければ上のを使ってください。
24時間以上検知がないと〇日前、1時間以上検知がないと〇時間前、60分内に収まっていれば〇分前になっています。

##実行結果##
温度 : 22.9度
湿度 : 54%
明るさは : 67度
人感センサー :2日前

from urllib.parse import urlencode
from urllib.request import urlopen, Request
from urllib.error import HTTPError
from json import loads
import datetime

api_key = "jmgkkDkFTiMp55iRcVGCRiTU5OUg7FqaQfKYDOECUXI.LPVbfXhH9bqcJfzqsyZ-4" # APIアクセストークン

url = "https://api.nature.global/1/devices/"

headers = {
    "accept" :"application/json",
    "Authorization" :"Bearer " + api_key,
}

request = Request(url, headers=headers)

try:
  with urlopen(request) as response:
    data_byte = response.read()
    data= loads(data_byte)
except HTTPError as e:
    print(e)

device_info = data[0]["newest_events"]

print("温度 : "   + str(device_info["te"]["val"]) + "")
print("湿度 : "   + str(device_info["hu"]["val"]) + "%")
print("明るさは : " + str(device_info["il"]["val"]) + "")

detect_date_str = str(device_info["mo"]["created_at"]).split("T")[0].split("-")
detect_time_str = str(device_info["mo"]["created_at"]).split("T")[1].split("Z")[0].split(":")

detect_date = [int(n) for n in detect_date_str]
detect_time = [int(n) for n in detect_time_str]

date = datetime.datetime(year=detect_date[0], month=detect_date[1], day=detect_date[2], hour=detect_time[0], minute=detect_time[1], second=detect_time[2])
now = datetime.datetime.now()
difference_time = now - date

if difference_time.days > 0:
  print("人感センサー :{}日前".format(difference_time.days))
elif difference_time.total_seconds > 3600:
  print("人感センサー : {}時間前".format(difference_time.total_seconds/3600))
else:
  print("人感センサー :{}分前".format(int(difference_time.total_seconds()/60)))

#テレビ/ライト操作

  • テレビとライトは同じコードで書けるのでまとめています。(applianceを変えることでテレビ/ライトの切り替えが可能です。)
  • テレビ/ライトの操作だけでなく、テレビ/ライトのIDの取得に1度アクセスしているので、先にID(device_id)をプログラム内に入力してしまうことでアクセス数を減らすことが可能です。
  • ニックネーム(nickname)を指定することで2台同じ家電があっても大丈夫なようにしています。1台であればその処理はいりません。

##必要なもの
appliance:家電を選択(テレビ:TV, ライト: LIGHT)
nickname:操作したい家電のニックネーム(例:Two-Storied-TV)
api_access_key: APIアクセストークン(APIアクセストークンは「https://home.nature.global/」で発行したもの)

##出力結果(テレビ)##
操作するボタンを数字で選んでください。
0 :	TV_power
1 :	TV_source
2 :	TV_schedule
3 :	TV_mute
4 :	TV_terrestrial
⌇
47 : TV_subtitle
48 : TV_exit
49 : TV_rewind_10sec
50 : TV_forward_30sec
入力:48
成功です。
##出力結果(ライト)##
操作するボタンを数字で選んでください。
0 :	Light_on
1 :	Light_off
2 :	Light_all
3 :	Light_night
4 :	Light_bright
5 :	Light_dark
入力:1
成功です。
from urllib.parse import urlencode
from urllib.request import urlopen, Request
from urllib.error import HTTPError
from json import loads

appliance = "TV" #操作する家電の種類["TV", "LIGHT"]
nickname = "Two-Storied-TV"   #テレビ/ライトのニックネーム
#nickname = "Atrium-light"   #ライトのニックネーム
api_access_key = "jmgkkDkFTiMp55iRcVGCRiTU5OUg7FqaQfKYDOECUXI.LPVbfXhH9bqcJfzqsyZ-4" # APIアクセストークン

url = "https://api.nature.global"

headers = {
    "Authorization" :"Bearer " + api_access_key,
    "accept" :"application/json",
    "Content-Type" :"application/x-www-form-urlencoded"
}

#全ての家電情報を取得
request = Request(url + "/1/appliances/", headers=headers) 

try:
  with urlopen(request) as response:
    data = response.read()
    devices = loads(data)
except HTTPError as e:
    print(e)


#デバイスID探索
device_id = "" 

for device in devices:
  if device["type"] == appliance and device["nickname"] == nickname:
    device_id = device["id"]
    buttons = device[appliance.lower()]["buttons"]


#各ボタンの表示
print("操作するボタンを数字で選んでください。")
num = 0
for button in buttons:
  if button["label"] != "":#空白のボタンがあるためif文で処理
    print(str(num) + " :\t"  + button["label"])
    num += 1

selected_button = int(input("入力:"))
signal = buttons[select_button]["name"]

#データ送信
request = Request(url + "/1/appliances/" + device_id + "/" + appliance.lower(), headers=headers)

data = {
    "button": signal
}

data = urlencode(data).encode("utf-8")

try:
  urlopen(request, data)
  print("成功です。")
except HTTPError as e:
    print(e)

#エアコン操作

  • エアコンの操作だけでなく、エアコンのIDの取得に1度アクセスしているので、先にID(AirCon_device_id )をプログラム内に入力してしまうことでアクセス数を減らすことが可能です。
  • ニックネーム(nickname)を指定することで2台エアコンがあっても大丈夫なようにしています。1台であればその処理はいりません。
from urllib.parse import urlencode
from urllib.request import urlopen, Request
from urllib.error import HTTPError
from json import loads

temperature = list(range(16, 31)) #温度
operation_mode = ["cool", "warm", "dry", "blow", "auto"] #モード
air_volume = ["1", "2", "3", "4", "5", "auto"] #風量
air_direction = ["1", "2", "3", "4", "5", "auto"] #風向き
button = ["", "power-off"] #電源 空白は電源オン

nickname = "Two-Stroried-AirCon"   #エアコンのニックネーム
api_key = "jmgkkDkFTiMp55iRcVGCRiTU5OUg7FqaQfKYDOECUXI.LPVbfXhH9bqcJfzqsyZ-4" # APIアクセストークン

url = "https://api.nature.global"

headers = {
    "accept" :"application/json",
    "Authorization" :"Bearer " + api_key,
    "Content-Type" :"application/x-www-form-urlencoded"
}

req = Request(url + "/1/appliances/", headers=headers)

try:
  with urlopen(req) as response:
    data = response.read()
    devices = loads(data)
except HTTPError as e:
    print(e)

AirCon_device_id = "" 

for device in devices:
  if device["type"] == "AC" and device["nickname"] == nickname:
    AirCon_device_id = device["id"]
    buttons = device["aircon"]

request = Request(url + "/1/appliances/" + AirCon_device_id + "/aircon_settings", headers=headers)

data = {
    "temperature": temperature[10],
    "operation_mode": operation_mode[3],
    "air_volume": air_volume[4],
    "air_direction": air_direction[2],
    "button": button[1],
}

data = urlencode(data).encode("utf-8")

try:
  response = urlopen(request, data)
  print("成功です。")
except HTTPError as e:
    print(e)

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?