Alexaで家電を操作するためのあれこれ(Node-RED設定編)

こちらの記事は，[Alexaで家電を操作するためのあれこれ(Raspi設定編)](https://qiita.com/polaris/items/478108c7622b6275aab5)の続きです．

**Node-RED はデバイス，API，オンラインサービスをコードを殆ど書くことなく接続できるプラットフォームのこと．**

今回はその Node-RED を使用してAmazon Echo とRaspberyPiの繋ぎ方，RaspberyPiからNature Remo APIの使い方をメモっておく．

<img width="542" alt="スクリーンショット 2018-12-16 午後3.21.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/249806/1d6c2a42-7249-b9be-45dc-ce632c16cf70.png">


##事前準備
Wi-fi接続が完了し，IPアドレスを固定したRaspberryPi

Amazon Alexa アプリのダウンロード
Amazon Echo Dot のセットアップ
わからない場合は[こちら](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201994280)

##環境
Amazon Echo dot
Raspberry Pi 3 Model B
Nature remo mini

macOs 10.14
Raspbian OS Version October2018

---
本記事では以下の記事を参考にさせていただきました．
[【IoT】４．Node-REDの設定をしてみる](http://sokora.hatenablog.com/entry/2017/12/13/%E3%80%90IoT%E3%80%91%EF%BC%94%EF%BC%8ENode-RED%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)
[Nature Remo APIとAlexaで部屋中の家電を操作する話](https://qiita.com/jutaroi01/items/01bf5ccb1fe33fae8879)

##Node-RED Alexa Home Skill Bridgeに登録する
[こちら](https://alexa-node-red.bm.hardill.me.uk/)のページ画面左上より[Register]を選択し登録を行う．

##デバイスを追加
 ログイン後，[Add Device]をクリックしデバイスを追加する．

<img width="854" alt="スクリーンショット 2018-12-16 午後3.58.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/249806/e72dd6ac-a001-ece3-22e8-c05651d26d29.png">



その際にAlexaに呼びかけたいデバイス名を付ける．**今回はデバイス名を「電気」にする．** ライトのように操作が点灯/消灯に限定されているデバイスは，ON, OFFのみにチェックを入れる．

##Alexaアプリでデバイスを検出
 現状では，Alexaに**「アレクサ，電気付けて」**と話しかけると，**「電気というデバイスを検出できませんでした」**と返ってくる，

そこで，Alexaアプリに「Node-RED」のスキルを追加し，ホーム画面から，[デバイス -> + ボタン -> デバイスを追加 -> その他] より，電気というデバイス検出する. 検出後はアレクサに話しかけると, **「電気から応答がありません」**と言うようになる．

##RaspberryPiに Node.js, npm をインストール
Node-REDを動かす際に必要なNode.js, npmを以下のコマンドでインストールする．
`sudo apt-get update
sudo apt-get install -y nodejs npm
sudo npm cache clean
sudo npm install npm n -g
sudo n stable`

##RaspberryPiに Node-REDをインストール

`sudo apt-get install nodered
update-nodejs-and-nodered`

また，Node-REDが自動で立ち上がるようにするために，以下のコマンドを実行．これによりRaspberryPiに電源を繋げただけでNode-REDが起動する．
`sudo systemctl enable nodered.service`

## Node-REDの起動
`node-red`
または，
`node-red-start`
で起動させる．

サーバは，[http://*******:1880 ]で実行中です

と表示されたら，[http://ラズパイのipアドレス:1880/]をブラウザのアドレスバーに入力する．すると以下のようなNode-REDの画面が表示される．

<img width="1280" alt="スクリーンショット 2018-12-16 午後8.31.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/249806/c38ef9f6-a532-970f-a0a6-27686ff5afd6.png">

##Node-REDでAlexaスキルのためのノード追加
右上の三本線のメニューから

[パレットの管理 -> ノード追加 -> node-red-contrib-alexa-home-skillを検索して追加]

ノード一覧の一番下にalexaのノードが出現する．




##Alexa-home のノードにデバイスを設定
alexa home のノードをフロー上に移動させ，ダブルクリックする．「Node-RED Alexa Home Skill Bridge」で登録したアカウント名を入力し更新すると，追加したデバイス名が表示される．

<img width="510" alt="スクリーンショット 2018-12-16 午後8.58.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/249806/ef0e34b6-3e64-cc4d-422b-4dc56d0d183a.png">


**<デバイス名が出てこない時>**
私の場合は，なかなか出てこなくて詰んでいたので解決したケースを記述．
- alexa home ノード配置後デプロイを押す
- デバイスを新しく作る
- 有線のsshで入る
- OSを入れ直す

などを行うことによりデバイス名が表示されることがあった．
最終的にOSを入れ直すことにより解決しました．なんでだったんだろ．．．

##ノードを追加
Switchノードを以下のように配置する．

<img width="336" alt="スクリーンショット 2018-12-16 午後9.22.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/249806/9a4ea10f-9e4a-9563-66f7-fec26eea0dc0.png">

Switchノードをダブルクリックし，入力が true か false によって分岐するように設定．

<img width="512" alt="スクリーンショット 2018-12-16 午後9.20.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/249806/203ddb67-ba68-599b-73af-595b2c728fba.png">

changeノードを接続

<img width="516" alt="スクリーンショット 2018-12-16 午後9.25.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/249806/0f89dcc2-869c-6f68-1aa9-b1af470a7fea.png">

changeノードをダブルクリックし，プロパティにそれぞれ on と off を設定．

<img width="505" alt="スクリーンショット 2018-12-16 午後9.27.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/249806/ce401f8f-5464-e2e1-9737-d56575a1d8c0.png">

execノードをchangeノードの先に追加する．

<img width="639" alt="スクリーンショット 2018-12-16 午後9.30.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/249806/aeacae2d-f425-85c3-9968-a142d918cb62.png">

execノードをダブルクリックし，コマンド欄に実行ファイルのパスを通す．「アレクサ，電気付けて」と言った際，引数[on]がexecノードに渡され，シェルスクリプトが実行される．

**シェルスクリプトの内容はのちに示す**ので，一旦完了を押しておく．

<img width="510" alt="スクリーンショット 2018-12-16 午後9.34.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/249806/fd40a7e9-8e7c-13a9-a635-83be16ff16ed.png">

debugノードを追加すると，execノードがどんな引数を受け取っているかを確認できる．

<img width="751" alt="スクリーンショット 2018-12-16 午後9.45.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/249806/d6606df2-e480-7945-7398-e4db56be65ba.png">

##Nature Remo の API を利用

Nature Remo は APIが提供されているので，登録した赤外線の送信，センサ情報の取得などができる．

新規アクセストークンの発行は[こちら](https://home.nature.global/)からできるので，発行してメモっておく．

####APIをいじってみる
[API仕様](http://swagger.nature.global/)を参考にAPIをいじってみる．例えば，

```
puts 'curl -X GET "https://api.nature.global/1/appliances" -H "accept: application/json" -H "Authorization: Bearer アクセストークン"'
```
と入力し，自分のメモったアクセストークンを加えると，デバイス名とそれぞれのIDなどが分かる．ただし読みづらいのでjqコマンドを以下のように加えることで見やすくなる．



**電気デバイスのON,OFFのIDがそれぞれ一つずつ表示されるので，両方メモっておく．**

```
puts 'curl -X GET "https://api.nature.global/1/appliances" -H "accept: application/json" -H "Authorization: Bearer アクセストークン" | jq .'
```

<br/>

**次は電気のON, OFFの操作を試る．**
メモった電気デバイス - ON のIDを使ってコマンドを入力すると，電気が点灯する．同様にOFFのIDを使うことで消灯が実現できる．

```
puts 'curl -X POST "https://api.nature.global/1/signals/電気デバイスONのID/send" -H "Authorization: Bearer アクセストークン"'
```

##ON/OFF 操作するシェルスクリプトを作成
Node-REDで true か false が引数($1)に来るように設定したので，これとAPIをいじった際のコマンドを組み合わせてシェルスクリプトを作成する．


```shell:denki.sh
#!/bin/bash

case $1 in
  on)
    curl -X POST "https://api.nature.global/1/signals/電気デバイスONのID/send" -H "Authorization: Bearer アクセストークン"
    ;;
  off)
    curl -X POST "https://api.nature.global/1/signals/電気デバイスOFFのID/send" -H "Authorization: Bearer アクセストークン"
    ;;
  esac
```
スクリプトは私の[Github](https://github.com/kinghomura/alexa)にあげておくので見た人は見てください．

このスクリプトファイルを，先程作成した Node-red で execノードのプロパティに指定する．そして，`chmod +x denki.sh`コマンドで実行権限を与えると準備完了！！

「アレクサ，電気付けて！」と言うと電気が点灯し，「アレクサ，電気消して！」と言うと電気が消灯．あら素敵．

---
今後は，エアコンの操作とそれぞれ操作した時間帯を取得し可視化でもしようかなと．温度もAPIでとってこれるみたいなので，組み合わせると面白いかも？