GASでNatureRemoのデータ取得や信号の送信

# はじめに
この記事は[SLP KBIT Advent Calendar 2021](https://adventar.org/calendars/6706)、14日目の記事です。
IoTデバイスをパソコンで操作できるようにしてみたいと思って、Nature Remoを使ってセンサーの情報を取得したり、赤外線信号を送信したりしてみました。
Javascriptで書いていこうと思ったのですが、今回はGoogleが提供しているGoogle Apps Sscript（GAS）を使っていきます。GASには便利な機能もあり、前準備も少ないためオススメです。


# 目次
1. Nature RemoのAPIにアクセスするためにAccess tokenを生成する
1. Nature Remoのセンサーからデータを取得する

## １．Access tokenの生成
まずは、[こちら](https://home.nature.global/)からNature Remoのサイトにログインしてください。
下にある **+ Generate access token**を押すと、Access tokenが表示されます。

余談ですが、Access tokenとはNature Remo以外の外部サービスと接続するために生成されるものです。すでにGoogleやAmazonのスマートスピーカーと連帯している方はAccess tokenが生成されていると思います。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355049/5626d387-09f9-e5a7-ec42-b4a3567f926e.png)
これでAccess tokenが生成できました。
生成したAccess tokenはここでしか表示されないため、**Copy**を押して、メモ帳などにコピペしておいてください。

※**アクセストークンは公開しないようにしてください**
公開してしまうと外部から家電を操作されてしまいます（他人事）

コピペし忘れた場合は、前のページに戻り、先ほど生成したAccess tokenのRevokeを押して、新たに生成し直してください。

## ２．センサーのデータを取得
まずはNature Remoのセンサーからデータを取得していきます。
コマンドの参照はhttps://swagger.nature.global で確認できます。
まずはコマンドラインを利用して、以下のコマンドを実行します。

```
curl -X GET "https://api.nature.global/1/devices" -H "accept: application/json" -H "Authorization: Bearer 取得したアクセストークン"
```
実行すると以下のようにNatureRemoのセンサー情報が出力されます。

```JSON
[
  {
    "name":"Nature Remo 2",
    "id":"__________",
    "created_at":"2021-05-18T10:49:51Z",
    "updated_at":"2021-11-15T07:44:11Z",
    "mac_address":"__________",
    "serial_number":"__________",
    "firmware_version":"Remo/1.0.79-gbbcb0e8",
    "temperature_offset":0,
    "humidity_offset":0,
    "users":[
      {
        "id":"__________",
        "nickname":"aiueo700",
        "superuser":true
      }
    ],
    "newest_events":{
      "hu":{
        "val":44,
        "created_at":"2021-11-16T12:36:11Z"
      },
      "il":{
        "val":245,
        "created_at":"2021-11-16T08:11:51Z"
      },
      "mo":{
        "val":1,
        "created_at":"2021-11-14T17:48:10Z"
      },
      "te":{
        "val":26.8,
        "created_at":"2021-11-16T13:37:14Z"
      }
    }
  }
]
```

上からhuが湿度、ilが光度、moが人感センサー、teが温度となっています。

これをGoogle App Scriptで実行していきます。
まずは、[Google Apps Script](https://script.google.com/)にアクセスして、新しいプロジェクトを作ります。
HTTPリクエストの方法についてはこちらを参考にしました。

https://auto-worker.com/blog/?p=2691#toc_id_3_3

Nature Remo Cloud APIを通して、サーバーから情報を取得するために```method```を```'get'```に指定し、承認するために```headers```内にアクセストークンを入れておきます。

```JavaScript
const access_token = '取得したアクセストークン';

function nature_remo() {
  const data = getNatureRemoData();
  Logger.log(data[0].newest_events.te.val);
  Logger.log(data[0].newest_events.hu.val);
  Logger.log(data[0].newest_events.il.val);
  Logger.log(data[0].newest_events.mo.val);
}

function getNatureRemoData() {
  const options = {
    method : 'get', 
    headers : {
      'Authorization': 'Bearer ' + access_token
    }
  };
  const data = JSON.parse(UrlFetchApp.fetch('https://api.nature.global/1/devices', options));
  return data;
}
```
実行する関数をnature_remoに設定して、実行するとそれぞれの値のみ表示されます。
これでデータの取得は完了です。
##信号の送信
まずは信号のデータを取得しておきましょう。以下のコマンドを実行します。

```
curl -X GET "https://api.nature.global/1/appliances" -H "authorization: Bearer アクセストークンを入力"
```

実行すると設定しているリモコン（特にエアコン）の情報がたくさん出てきます。
今回は一番簡単なシーリングライトを操作をしていこうと思うので、出力された一部を抜粋しておきます。

```JSON
{
		"id": "__________",  
		"device": {
                       
		},
		"model": {
			"id": "__________",
			"country": "JP",
			"manufacturer": "panasonic",
			"remote_name": "hk9478-ch2",
			"name": "Panasonic LIGHT 019",
			"image": "ico_light"
		},
		"type": "LIGHT",
		"nickname": "aiueo700",
		"image": "ico_light",
		"settings": null,
		"aircon": null,
		"signals": [],
		"light": {
			"buttons": [
				{
					"name": "on",
					"image": "ico_on",
					"label": "Light_on"
				},
				{
					"name": "off",
					"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": "night",
					"image": "ico_light_night",
					"label": "Light_night"
				},
				{
					"name": "bright-up",
					"image": "ico_arrow_top",
					"label": "Light_bright"
				},
				{
					"name": "bright-down",
					"image": "ico_arrow_bottom",
					"label": "Light_dark"
				},
				{
					"name": "colortemp-down",
					"image": "ico_arrow_right",
					"label": "Light_warm"
				},
				{
					"name": "colortemp-up",
					"image": "ico_arrow_left",
					"label": "Light_cold"
				}
			],
			"state": {
				"brightness": "100",
				"power": "on",
				"last_button": "on"
			}
		}
	}
```
一番上の```id```はappliance_id（家電のID）なので、これもメモっておきます。
※**もちろん公開はしないでください。**

次にコマンドラインで信号を送信してみます。
先ほどメモったappliance_idを付け加え、送信したい信号を入力します。```-d "button=(ボタンのname)"```で実行できます。
今回はシーリングライトをオンにしたいので、```-d "button=on"```と入力します。

```
curl -X POST "https://api.nature.global/1/appliances/(appliance_id)を入力/light" -H "authorization: Bearer アクセストークンを入力" -d "button=on"
```
これでシーリングライトがオンになりました。

では、これをGASで実行させてみたいと思います。
サーバーに情報を送るために、```method```を```'post'```に指定し、```payload```と呼ばれる情報を付け加えます。

```JavaScript
const access_token = 'アクセストークンを入力';
const id = {
  light : '(appliance_id)を入力/light'
}

function nature_remo() {
  const data = getNatureRemoData();
  const setData = {
    te : data[0].newest_events.te.val,
    hu : data[0].newest_events.hu.val,
    il : data[0].newest_events.il.val,
    mo : data[0].newest_events.mo.val
  }
  postNatureRemo(id.light, 'on');
}

function getNatureRemoData() {
  const options = {
    method : 'get', 
    headers : {
      'Authorization': 'Bearer ' + access_token
    }
  };
  const data = JSON.parse(UrlFetchApp.fetch('https://api.nature.global/1/devices', options));
  return data;
}

function postNatureRemo(id, name){
  const url = 'https://api.nature.global/1/appliances/' + id;
  const options = {
    method : 'post',
    headers : {
      'Authorization': 'Bearer ' + access_token
    },
    payload : 'button=' + name
  }
  UrlFetchApp.fetch(url, options);
}
```
これで完成しました。あとは```postNatureRemo()```に任意のコードを入れることで様々な家電を操作することができます。
最後に
今回、GASを使った理由はGoogleのGmailやスプレッドシートなどのサービスと連帯することができるからです。ただ、時間がなかったため今回は断念しました。大変ﾓｼｬﾓｼｬｾﾝ！
記事を書くのも初めてなので、内容が曖昧なところがあります。今後、随時修正していきますのでよろしくお願いします。