Nature RemoとNode-REDでテレビを操作する

# はじめに
## やりたいこと
* Nature Remo(スマートリモコン)とNode-REDをつないで、フローの中で家電を操作したい
    * ちなみに我が家は古く、最新のIoT機器はないので、Nature Remoを挟んで赤外線家電を操作する

## Node-REDのまとめ記事
* [Node-RED系の記事のまとめ](https://qiita.com/kazutxt/items/8c72448eefcba56dabef)


## 動作環境
* IBM bluemix Node-RED : v0.20.5

## 免責事項
* 検証をして確実と思われる情報を載せておりますが、誤っている可能性もゼロではないので、参考程度にご利用ください

# 本編
TVとエアコンと照明をつないでいますが、いずれも同じことなので、代表例としてTVで紹介します。

## 全体の流れ
1. Nature Remoを購入し、テレビ、エアコン、照明の3つの赤外線を学習させる
2. Nature RemoのTokenを払い出して、WebAPIからOn/Offなどのボタン操作をできるようにする
3. Node-REDのフローを作成し、任意の処理の中で家電を操作する

## Nature Remoとは
* [本家サイト](https://nature.global/)
* 赤外線家電を学習させて、信号を代わりに送ってくれるスマートリモコン
    * 要は様々なリモコンを1台で行ってくれて、スマホアプリやWebAPIもあるすごいやつ

## 操作フロー(TVの場合)
* 基本的な操作は以下のようなもの、1は普通の使い方。2,3はメーカーの想定利用。4が実現したいこと

1. リモコン -> TV
2. スマホ -> Nature Remo -> TV
3. AmazonAlexa/GoogleHome/IFTTT -> Nature Remo -> TV
4. 任意のイベント -> Node-RED -> Nature Remo(WebAPI) -> Nature Remo -> TV


## Step1 Nature Remoに赤外線を学習させる
インターネット上にたくさんの情報があるので省略

* 何はともあれ、Nature Remoを購入しないと始まりません。
* miniもあるので、センサー類に若干の差はありますが、基本機能に差はないのでminiでも大丈夫かと思います。
    * 私は将来的には人感センサーとか使いたいので、通常版を買いました。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/1607c266-fab5-c1a3-3833-8c6121bda041.jpeg" width="50%">

* スマホアプリを入れて、初期化し赤外線をNature Remoに学習させる
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/2c5e7dd7-0eec-b9d4-6eac-662b93d1ba2a.png" width="50%">

## step2 Tokenの払い出し
インターネット上にたくさんの情報があるので、やっぱり省略

* [APIはこちら] (https://developer.nature.global/)
* [tokenの払い出しはこちら] (https://home.nature.global/)
* [参考にしたサイト] (https://dev.classmethod.jp/etc/nature-remo-api/)

流れ
1. まずサイトにログインをしてtokenを払い出す
2. https://api.nature.global/1/appliances にtoken付きで問い合わせをして、applianceIDを確認する
3. applianceIDとtokenと操作コマンドを送って、家電を操作する

## step3 Node-REDのフローを作成
### センサ情報の取得
* 人感センサはないっぽい？
![pic3_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/fad78e0f-cdc8-c104-831c-a1a8c9da6ee9.png)
![pic3_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/fa4b5ec2-0cad-6289-ca2f-bcaec60faa11.png)

``` js:RemoTokenノード
msg.headers = {
    "accept" : "application/json",
    "Authorization": "Bearer {token}"
};
return msg;
```

httpノードは、GETメソッドで、https://api.nature.global/1/devicesにアクセス

``` js:出力情報ノード
msg.payload = 
"温度は" + msg.payload[0].newest_events.te.val + "℃です\n" 
+ "湿度は" + msg.payload[0].newest_events.hu.val + "%です\n"
+ "照度は" + msg.payload[0].newest_events.il.val + "/256です\n"
return msg;
```


### TVの操作
![pic4_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/b6289f6f-ac1a-9f0a-6a1d-cf7aa77c8fbd.png)


``` js:RemoTokenノード
msg.headers = {
    "Content-Type":"application/x-www-form-urlencoded", 
    "accept" : "application/json",
    "Authorization": "Bearer {token}"
};

msg.payload = {
    "button" : "power"
}
return msg;
```


httpノードは、POSTメソッドで、https://api.nature.global/1/appliances/{applianceID}/tvにアクセス

## 補足
* httpノードの認証のチェックは外してください
* 異なるtokenを使ってapplianceIDを確認しましたが同じでした。
* TV操作時において、APIドキュメントにはtokenに関してなにも記載がないので、いらないのかと思いましたが、認証エラーになるので足したら動きました
* どんなボタンの種類があるかは、appliances を取得した時の応答に書いてあるので、そちらでご確認ください。

## 感想
* 対応機器がないと家電は操作できないものだと思っていののですが、今あるテレビでできるのはすごい
* 自分のプログラムの中で、テレビの電源がついたりけしたりできるのは面白い