自宅のNASにDocker環境を用意してスマートホーム化 #3

アレクサを買ってきました。
とりあえず色々喋らせるようにしてみましょう(連絡ツール的な)

# 必要なもの
* Alexa (たぶんなんでも大丈夫)
* NodeRED環境 ([NASの環境にNodeREDを構築しました](https://qiita.com/tosix13/items/7752b96d68941d8e3ea4))

# 手順
1. [NodeREDで必要なライブラリをインストール](#noderedで必要なライブラリをインストール)
1. [ノードのグローバル設定を行う](#ノードのグローバル設定を行う)
1. [Alexaのログインを実施](#alexaのログインを実施)
1. [RoutineSpeakノードを使ってAlexaを喋らせる](#routinespeakノードを使ってalexaを喋らせる)
1. [Discordに投稿した内容を喋らせる](#discordに投稿した内容を喋らせる)

## NodeREDで必要なライブラリをインストール
下記をNodeREDの設定メニュー"≡"から"パレットの管理"を開き、インストールします。
バージョンはあまり気にしなくてもいいと思います。
* node-red-contrib-alexa-remote2-v2 ver:3.10.5(何か種類がたくさんあります)
* node-red-contrib-discord ver:5.0.0(後半で使用します。Discordと連携)
* node-red-node-twitter ver:1.2.0(この記事では使いません。Twitterと連携)

## ノードのグローバル設定を行う
"Alexa Routine"ノードを配置し、Account設定を行います。
![alexa_routine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478155/848bc282-97f6-9313-2654-90a8ad0d7474.png)

* This IP: \#1から見ている方はNASのIPを入れてください
* Port: そのままでいいですが、\#1から見ている方は注意です！(**※ハマりポイントでした**)
* Service Host: "alexa.amazon.co.jp"
* Page: "amazon.co.jp"
* Language: "ja_JP" (ja-JPじゃないのかな...？)

※ DockerコンテナからNodeREDを起動している場合、**ポートバインドの追加が必要**です。
QTSのContainer StationのOverviewからコンテナを開き、
"Setting" > "Advanced Setting" > "Network" に3456ポートの設定を追加しましょう。クライアント・ホストどちらも同じ番号で大丈夫です(環境によりますが)

## Alexaのログインを実施
デバッグウィンドウに[IP:3456]で認証せよと言われるのでアクセスしログインしましょう
ノードの下に"ready"が出れば問題なしです。
![route_speak.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478155/81d8e30b-953e-46ed-c186-23d3628c00d0.png)

※ 何かライブラリが日本ドメインに対応していないみたいでライブラリを直接いじる必要があるようです。
NASのSSH設定を有効にしてdocker execでコンテナに入り弄りましょう。
ライブラリのバージョンによって修正箇所がまちまちなので私もよくわかりません。
ただ、NodeREDのデプロイを行うたびに[IP:3456]での認証が必要なのは変わらないようです。。。

## RoutineSpeakノードを使ってAlexaを喋らせる
こんな感じでRoutineSpeakノードの設定を行います。
![route_speak_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478155/51ae0975-72dc-661e-14d6-c2bbc03e7bd9.png)

msg.payloadにAlexaに喋らせたい内容を入れて実行してみましょう。
何でも()喋ると思います。

## Discordに投稿した内容を喋らせる
twitterとかでも可能ですが、twitterの拡張機能はどうもAPIの実行間隔が長かったので、Discordにしました。
Discordのボット作成・トークン発行の説明は省きます(結構大変なので...)。
"discordMessage"ノードを配置するとボットが参加しているグループやボット宛てのチャットを受信すると、
このノードから情報が出力されます。
これを使用して、下記のようなフローを作りました。
```json
[{"id":"9270f05d.585e8","type":"debug","z":"f6f2187d.f17ca8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":450,"y":860,"wires":[]},{"id":"5acf515e.3ecc1","type":"discordMessage","z":"f6f2187d.f17ca8","name":"","token":"","x":100,"y":820,"wires":[["823cf7e5.107128"]]},{"id":"823cf7e5.107128","type":"function","z":"f6f2187d.f17ca8","name":"setText","func":"var newMsg = {}\nnewMsg.payload = msg.author.username + \"さんの連絡: \" + msg.payload\nreturn newMsg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":280,"y":820,"wires":[["9270f05d.585e8","7df12269.2c39fc"]]},{"id":"7df12269.2c39fc","type":"alexa-remote-routine","z":"f6f2187d.f17ca8","name":"","account":"","routineNode":{"type":"speak","payload":{"type":"regular","text":{"type":"msg","value":"payload"},"devices":[]}},"x":460,"y":820,"wires":[[]]}]
```
![discord_flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478155/db3d40f5-1518-f075-4366-cbe225494fb3.png)

setTextノードの中身は簡単です。
```javascript
var newMsg = {}
newMsg.payload = msg.author.username + "さんの連絡: " + msg.payload
return newMsg;
```
誰からの連絡かと、メッセージの内容です。これをAlexaに喋らせます。

こんな感じでAlexaにあんなことやこんなことを話させちゃいましょう！(我が家では連絡ツールです)

← PREV: [SwitchBotを実行](https://qiita.com/tosix13/items/b8a2f73617a0d380fc84)
→ NEXT: [Alexaのみのデバイスで自動でPCをつけてもらおう](https://qiita.com/tosix13/items/9df1481e0899d847ca7b)