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


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

必要なもの

手順

  1. NodeREDで必要なライブラリをインストール
  2. ノードのグローバル設定を行う
  3. Alexaのログインを実施
  4. RoutineSpeakノードを使ってAlexaを喋らせる
  5. 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設定を行います。

  • 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"が出れば問題なしです。

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

RoutineSpeakノードを使ってAlexaを喋らせる

こんな感じでRoutineSpeakノードの設定を行います。

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

Discordに投稿した内容を喋らせる

twitterとかでも可能ですが、twitterの拡張機能はどうもAPIの実行間隔が長かったので、Discordにしました。
Discordのボット作成・トークン発行の説明は省きます(結構大変なので...)。
"discordMessage"ノードを配置するとボットが参加しているグループやボット宛てのチャットを受信すると、
このノードから情報が出力されます。
これを使用して、下記のようなフローを作りました。

[{"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":[[]]}]

setTextノードの中身は簡単です。

var newMsg = {}
newMsg.payload = msg.author.username + "さんの連絡: " + msg.payload
return newMsg;

誰からの連絡かと、メッセージの内容です。これをAlexaに喋らせます。

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

← PREV: SwitchBotを実行
→ NEXT: Alexaのみのデバイスで自動でPCをつけてもらおう