NatureRemoAPIを使用してRESTで家電を操作する

# 目的
NatureRemoを買ってみたのはいいけどアプリの起動が遅く直接電源を入れたほうが早い。
インターフェースだけ作っておけばいろいろ遊べそう。

# 利用サービス・言語
- NatureRemo&NatureRemoAPI(https://developer.nature.global/)
    - 記憶式の赤外線リモコン、テレビやエアコンの信号を記憶してこの端末から赤外線信号を送ることができます。
- GoogleAppsScript(https://developers.google.com/apps-script/)
    - Googleの提供するGoogleサーバ上で動作するスクリプトでJavaScriptをベースにGoogleのアレンジが加わっています(以下GAS)。 

# tl;dr
- NatureRemoにリモコンを登録
- アクセストークン取得
-  https\://api.nature.global/1/signals/[デバイスID]/send にPOST

# NatureRemoに信号を登録
公式のチュートリアルを確認してください。
https://nature.global/jp/gettingstarted/

私は照明を一番使用しているので照明を例にしたいと思います。
スマホアプリの画面では↓のようになっています。
<img src="https://qiita-image-store.s3.amazonaws.com/0/169001/cd15a8f3-f224-68c0-e875-b6a5998a20e3.jpeg" width=30%>

ここまででスマホアプリから家電が動作することを確認しておいてください。


# アクセストークン取得
https://home.nature.global/
にアクセスしてログインすると↓の画面に飛びます。
<img width="942" alt="token_kiritori.png" src="https://qiita-image-store.s3.amazonaws.com/0/169001/651ef63a-5c7e-7916-0375-9036b1221dbe.png">

+Gererate access tokenをクリックして表示されたトークンを控えておいてください。
POSTするときの認証情報に使用します。
このトークンは**絶対に流出しないよう管理**してください。

# NatureRemoにRESTでアクセス
### GASの準備
細かい説明は省略します、Googleドライブ→新規→GoogleAppsScript(ない場合はその他→GoogleAppsScript)で新規作成してください。
### デバイスIDの取得
```js:GetDeviceId.js
function GetDeviceId(){
    var url = BASE_URL + "appliances"
    var options = {
      "method" : "get",
      "headers" : {"Authorization" : "Bearer [アクセストークン]"}
    };
    var reply = UrlFetchApp.fetch(url, options);
    Logger.log(reply)
}
```
このコードをGAS上で実行するとログがこんな感じで出ます。

```json
[
  {
    "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "device": {
      "name": "Remo",
      "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "created_at": "2018-03-18T07:16:06Z",
      "updated_at": "2019-01-23T22:38:45Z",
      "mac_address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "serial_number": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "firmware_version": "Remo/1.0.62-gabbf5bd",
      "temperature_offset": 0,
      "humidity_offset": 0
    },
    "model": null,
    "type": "IR",
    "nickname": "リビング照明",
    "image": "ico_light",
    "settings": null,
    "aircon": null,
    "signals": [
      {
        "id": "ここのIDを使用します。",
        "name": "全灯",
        "image": "ico_lightup"
      },
      {
        "id": "ここのIDを使用します。",
        "name": "消灯",
        "image": "ico_off"
      },
      {
        "id": "ここのIDを使用します。",
        "name": "明",
        "image": "ico_arrow_top"
      },
      {
        "id": "ここのIDを使用します。",
        "name": "暗",
        "image": "ico_arrow_bottom"
      }
    ]
  },
  {
  	"_comment":"複数機器登録しているとまだまだ続きます"
  }
]
```

### POSTして電気をつけてみる
GASで下記コードを実行してみてください。
うちの場合は照明のリモコンの全灯ボタンをNatureRemoが送信してくれるため、部屋の明かりがつきます。

```js:POST.js
// 全灯ボタン
function Light_On(){
    var url = "https://api.nature.global/1/signals/[ここに操作したいsignalsのIDを入力]/send"
    var options = {
      "method" : "post",
      "headers" : {"Authorization" : "Bearer [アクセストークン]"}
    };
    var reply = UrlFetchApp.fetch(url, options);
}
```

### APIを公開して外からアクセスできるようにする
エントリ関数がないためGAS側でgetの受け口を作ります。

```js:POST.js
// Rest:Getアクセス時のエントリハンドラ
function doGet(e) {
  Light_On()
  return 0
}
```

getの関数を作ったあとはGASのメニューから**公開→Webアプリケーションをして導入→導入**でAPIを公開することができます。
動作確認用のコードでセキュリティもクソもないのでアクセスユーザは**全員(匿名ユーザー含む)**にしておきます
![gas.png](https://qiita-image-store.s3.amazonaws.com/0/169001/4c9ccb50-f6b3-c2f7-7bc7-e05bda9541b6.png)

これで、現在のウェブアプリケーションのURLにアクセスするとGASが実行され、部屋の明かりをどこでもつけられるようになります。
https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxxxxx/exec

# さいごに
これでLambdaからでもIFTTTからでもLINEやSlackのbotからでもアクセスできますね！
家を魔改造してどんどんハックしていきましょう!!!