Google Home + Nature Remoでエアコンタイマー

#はじめに
Nature Remo、便利ですよね。
IFTTTと連携して、「電気を消して」や「エアコンを〇〇度に設定」が誰でも出来ますし、
現在では単体でシーン設定もできるようになりました。

でも、タイマー機能がないんです。
「1.5時間後にエアコンを消す」ことはIFTTTと連携してもできません。

ですが、Google Home→IFTTT→Heroku→Nature Remoとしてやれば、
そんな機能も実装することができます。

#手順
###1. Node.js/npmをインストール
ローカルPCにNode.js/npmをインストールします。
ここでは詳しく説明しません。
Windows : [Node.js / npmをインストールする（for Windows）](https://qiita.com/taiponrock/items/9001ae194571feb63a5e)
Mac : [MacにNode.jsをインストール](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)

###2. Herokuアカウントを作成
こちらも詳しくは説明しません。
[Heroku初心者がHello, Herokuをしてみる](https://qiita.com/Arashi/items/b2f2e01259238235e187)
リンクを参照し、Herokuアカウントを作成してください。

###3. アプリ作成
まず、作業用のディレクトリを作成します。
次に、Procfileを以下の内容で保存します。

```Bash:Procfile
web: node app.js
```

次に、本体であるapp.jsを以下の内容で作成します。

```javascript:app.js
var express = require('express');
var request = require('request');
var app = express();
var bodyParser = require('body-parser');

app.set('port', (process.env.PORT || 5000));
app.use(express.static(__dirname + '/public'));

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());

var ACCESS_KEY = process.env.ACCESS_KEY;
var AUTH_KEY = process.env.AUTH_KEY;
var AIRCON_ID = process.env.AIRCON_ID;
var WAITING_TIME = Number(process.env.WAITING_TIME);

// Nature Remoに送信
function postMessage(bodyStr){
    var request = require('request');
		var headers = {
    'Authorization': 'Bearer ' + AUTH_KEY
		};
		var options = {
		    url: 'https://api.nature.global/1/appliances/' + AIRCON_ID + '/aircon_settings',
		    method: 'POST',
		    headers: headers,
				form: {
					"button": "power-off"
				}
		};
    request.post(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body);
        }else{
            console.log('error: '+ response.statusCode);
        }
    });
}

app.post('/input', function(req, res){
    res.set('Content-Type', 'application/json');
    console.log('---------- input');
    console.log(req.body);
    if(req.body.accesskey == ACCESS_KEY){
        // アクセスキーが一致すれば送信
        setTimeout(function(){
        postMessage(req.body.message);
        },WAITING_TIME);
        res.send("{'request':'OK'}");
    } else {
        // NG
        res.send("{'request':'ERROR'}");
    }
});

app.get('/', function(request, response) {
    response.send('Hello, World!');
});

app.listen(app.get('port'), function() {
    console.log('Node app is running on port', app.get('port'));
});
```

その後、以下コマンドで必要なパッケージをインストールします。

```bash
npm init
npm install express --save
npm install request --save
npm install body-parser -—save
```

次にHerokuへデプロイします。

```bash
git init
git add .
heroku create
git push heroku master
```

その後、Herokuで環境変数を設定します。

```bash
heroku config:set ACCESS_KEY="任意のアクセスキー"
heroku config:set AUTH_KEY="Nature Remoのアクセストークン"
heroku config:set AIRCON_ID="エアコンのAppliance ID"
heroku config:set WAITING_TIME="タイマーの待ち時間(ミリ秒)"
```
Nature Remoのアクセストークンの取得方法は、以下の記事を参照してください。
[Nature Remoの公式APIの使い方](https://qiita.com/sohsatoh/items/b710ab3fa05e77ab2b0a)

また、テストのため、まずタイマーは短く設定し、その後上記コマンドで再設定したほうが良いかと思います。
単位がミリ秒なので、一時間の場合は3600000ミリ秒です。

最後に

```bash
heroku open
```

ブラウザが立ち上がり、Hello,World!と表示されたら成功です。

###4. IFTTT側の設定
以下の画像のように設定してください。
<img src=https://qiita-image-store.s3.amazonaws.com/0/185096/05eaa6b0-acdd-4dd9-9398-afd4e4cbd8a7.png height="800px">

URL：<アプリのURL>/input
Body:{"accesskey":"上で設定したアクセスキー"}

#最後に
この方法だと、Raspberry Piなどがなくても、簡単にエアコンタイマーの実装が可能です。
Node.jsはリファレンスにある方のものを改変しただけなので、冗長的な部分もあるかとは思いますが、お許しいただけると幸いです。
(Javascript自体触ったことが殆どないため、編集リクエストもお待ちしております)

#Reference(s)
[Heroku NodeJSでIFTTT(Maker Channel)のDo NoteからChatWorkへ送る仕組みを作るメモ](https://www.1ft-seabass.jp/memo/2015/07/02/heroku-ifttt-chatwork/)