以前のエントリーの続きになります。今回はAmazon Echo
の音声認識を使用してNode-RED
の処理を行います。
Node-RED
でAmazon Echo
を使用するノードは実は80番ポートでしか待機ができないようになっています(昔は別ポートでもできたみたいな感じ?)そのため、ポート80を別のプロセスで使用していると使用できないという状況のようです。そのため、もし80番ポートを使用しているプロセスが既にあるようであれば、そちらの使用ポートを変更することが妥当かと思います。(最近はhttpsでなければ公開できないことが多いですが、ローカルのプログラムでは割とhttpをつかっていることもあるのでそのための対応と思ってください。)
以下のエントリも参考にさせていただいております。
参考
AmazonEchoからRaspberryPiのコマンドを実行する(node-red-contrib-amazon-echo): パソコン鳥のブログ
そこで、以前行ったネットワークインターフェースに複数のIPアドレスを設定し、さらにポートフォワードを行うことで対応を行っていきます。ポート80番が使用できるのであればこんな方法を使用する必要はないです。
今回の手順
かなり手順が多いので先に手順をまとめておきます。
- ネットワークの設定
- Node-REDの拡張をインストール
- フローを作成
- Amazon Echo側の設定
- 動作テスト
では、この順番に設定を行っていきます。
ネットワークの設定(セカンダリーIPの設定)
先ほどの参考エントリーを使って、セカンダリIPを無線ネットワークのインターフェースに設定をしていくようにします。
今回使用するIPアドレスのレンジは192.168.0.*/24
です。その中の192.168.0.100
をセカンダリIPとして使用します。
もし、参考にされる場合には適宜IPアドレスを読み替えて行ってください。
ネットワークの設定スクリプトを以下のように記述します。node-red-contrib-amazon-echo
というのは後述する、Amazon Echo
を使用するNode-RED
のパッケージ名になります。
設定スクリプト…【start_node-red-contrib-amazon-echo.sh】
#!/bin/bash ## IPが含まれるかどうか調べる if [ "`hostname -I | grep '192.168.0.100'`" ]; then echo "設定済のため処理終了" else echo "未設定のため設定実行" sudo /sbin/ip addr add 192.168.0.100/24 dev wlan0 sudo /usr/sbin/iptables -A PREROUTING -t nat -p tcp -m tcp -d 192.168.0.100 --dport 80 -j REDIRECT --to-port 8000 fi
スクリプトができたら、実行権限を与えます。個人的な好みで権限は数値で指定しています。
設定スクリプトに実行権限を与える
$ chmod 755 start_node-red-contrib-amazon-echo.sh
Node-REDの使用前に以下を実行
$ ./start_node-red-contrib-amazon-echo.sh
または.bashrc
などに以下のような処理を追加してもよいのですが、設定したIPがセカンダリ側にならないようなので、手動で起動するほうが安心かもしれません。
.bashrc
に追加する処理
#!/bin/bash if [ -f ~/start_node-red-contrib-amazon-echo.sh ]; then ./start_node-red-contrib-amazon-echo.sh fi
これでネットワーク部分の設定ができました。
Amazon Echo
からのアクセスはセカンダリIPである192.168.0.100:80でアクセス待ちをします。
Node-REDの拡張をインストール
続いてはNode-RED
からAmazon Echo
の音声認識を使用するための拡張ノードのインストールになります。拡張ノードのインストールはこれまでのものを大きくは変わりません。インストールする拡張ノードの名前はnode-red-contrib-amazon-echo
となります。
では拡張ノードをインストールしていきます。フローエディタの右上にある【三】ボタンをクリックしてプルダウンメニューを開き【パレットの管理】を選択します。
ユーザ設定のウインドウが開いたら、【ノードを追加】タブをクリックします。
追加するノードを検索する表示になるので
検索の入力ボックスにamazon-echo
と入力すると、今回インストールするnode-red-contrib-amazon-echo
が候補として表示されます。表示を確認して、【ノードを追加】ボタンをクリックします。
インストールを確認するダイアログが表示されるので、さらに【追加】ボタンをクリックして作業を進めます。
するとインストール作業が進みます。途中経過が気になるようであれば、【ログを確認】ボタンをクリックするとインストール作業の様子を確認することもできます。
インストールが完了すると以下のような表示が行われます。正常にインストールが行われパレットに拡張ノードが追加されました。作業が終わったら、【閉じる】ボタンをクリックして終了します。
パレットの一覧の入力カテゴリーの中にamazon echo hub
とamazon echo device
の2つが追加されていれば正常にインストールは行われています。
フローを作成
では、node-red-contrib-amazon-echo
を使用したフローを作成してみます。
Amazon Echo Hubノード
はAmazon Echoデバイス
からのアクセスを担い、
Amazon Echo Deviceノード
はAmazon Echoデバイス
から来た入力の処理を行います。
単純なフローは以下のような形式になると思います。各ノードをマウスを使ってドラッグ&ドロップして、端子を接続してフローを作っていきます。最後はAmazon Echoデバイス
から得られた状態を表示するためにdebugノード
をフローの最後に配置しておきます。
続いては配置したノードのプロパティを編集していきます。amazon-echo-hubノード
をダブルクリックしてプロパティ画面を開きます。ここで編集するのはPort
の値となります。今回は、セカンダリIPからルーティングされてきた8000番ポートの設定します。値としては8000
を入力します。入力が終わったら【完了】ボタンをクリックします。
次にamazon-echo-deviceノード
をダブルクリックしてプロパティ画面を開きます。ここで編集するのはName
の値となります。これはAmazon Echoデバイス
で呼びかけられたデバイス名になります。好きな名前にすればよいのですが、今回は処理
とすることにしました。値としては処理
を入力します。入力が終わったら【完了】ボタンをクリックします。
Echoデバイスへ話かける際は「アレクサ、処理をONにして」「アレクサ、処理をOFF」などといえば反応をしてくれます。
これでシンプルなフローの設定ができました。あとは【デプロイ】ボタンをクリックしてフローを完成させます。
解説
この拡張ノードはプロパティで指定したIPアドレスの8000番ポートに来たデータをトリガーとして処理するようになります。
Amazon Echo
デバイスはネットワーク内の80番ポートにブロードキャストして、見つかったデバイスを使用するようになっています。今回の例ではブロードキャストされたデータは先ほど設定したRaspberry Pi
のセカンダリIPである192.168.0.100
の80番が受信することになります。受信されたデータはルーティングされて、オリジナルのIPアドレスである192.168.0.7
にの8000番ポートで受信待ちをしているNode-RED
のAmazon-Echo-Hubノード
にデータが送られて処理が行われます。
データの流れ
Amazon Echoデバイス → Raspberry Pi(192.168.0.100:80)→ (ルーティング)→Raspberry Pi(192.168.0.7:8000)→ Node-RED(Amazon Echo Hubノード)→後続のフロー処理
Node-REDの処理部分は1つの連携した(連携可能なPhilips Hueなどと同様の)デバイスとして扱われると思えば簡単かもしれません。
Amazon Echoアプリ
の設定
制御されるデバイス(Node-RED
の処理)ができたので後はAmazon Echo
側の連携を行っていきます。この設定を行わないと先ほどのフローは動作しませんのであしからず。
設定はスマートフォンのアプリを使用します。自分はAndroidを使用しているのでそちらのアプリで設定しますが、基本的にはiPhoneでも大きくは変わらないと思いますが、アプリのバージョンによって表示が少し変わっている可能性もありますので、ご注意ください。
※以降の画面表示は2020年10月13日現在(バージョンは2.2.367265.0)のものになるので、今後同じ表示ではないかもしれません。
まずは、Amazon Alexaアプリ
をインストールしておいてください。その後、アプリを起動します。起動後に画面の下にあるデバイスアイコンをタッチし、
デバイス画面に表示が変わったら、画面上方にある+ボタンをタッチします。
すると、画面下部から以下のように表示が伸びてきます。ここで、【デバイスの追加】をタッチします。
セットアップするデバイスの種類が表示されるのですが、もちろん今回Node-REDで作成したデバイスは一覧には表示されません。そこで、デバイスの検出を行っていきます。デバイスリストをスクロールしていき
【その他】をタッチして選択します。
すると、デバイスの検出して、Alexaに接続する画面に切り替わります。ここで【デバイスを検出】ボタンをタッチします。
すると、デバイス検出の処理が行われます。
すると以下のような表示が行われます。照明?と思うかもしれませんがこれで問題はありません。Node-REDで作成されたデバイスは照明デバイスをエミュレーションしたものになるので、このような表示になります。 あとは【デバイスをセットアップ】ボタンをタッチして、セットアップ処理を行います。
セットアップ処理が終わるとデバイスをグループに追加するかどうか尋ねられます。今回はグループに追加するのはスキップするので、【スキップ】をタッチします。グループに登録する場合は【グループを選択】ボタン側をタッチしていってください。
これで設定は完了するのですが、デバイス名が文字化けしています。実はこのままではNode-REDとの連携はうまくいきません。そこで、一度処理を完了して、デバイス名を変更していきます。【完了】ボタンをタッチします。
【完了】ボタンを押すとデバイスの画面になります。検出直後は検出したデバイスの表示ができるので【表示】をタッチしますが、【すべてのデバイス】ボタンをタッチしても同じ画面に移動できます。
移動すると、文字化けしたデバイスが見つかるので、それをタッチします。(照明デバイスなので照明のアイコンのものになっているかも確認するといいかもしれません)
タッチするとデバイスの画面に移動します。そこで画面の右上にある歯車のアイコンをタッチします。このアイコンで設定画面に移動します。
一番上にデバイス名が表示されていますが、見事に文字化けしています。下にある【名前の編集】をタッチして名前を変更します。
Node-RED側で処理
としているのでこちらも同じ名前にします。
これでアプリ側の設定も変更して、Node-RED
と連携ができるようになりました。
動作テスト
では、動画を行ってみます。文字化けのまま進めたのが以下になります。デバイスが見つからないというエラーが発生してしまいます。
【Node-RED】デバイス名が文字化け状態での実行…失敗(node-red-contrib-amazon-echo)
デバイスの名前を修正すると以下のようになります。
【Node-RED】デバイス名を正常にして実行…成功(node-red-contrib-amazon-echo)
Node-RED
側はデバイス名のあとの言葉であるONやOFFなどをdebugノード
で取得できます。例えばこれをGPIOのピンに設定することができればLEDのON/OFFを行えます。(ONを1とし、OFFを0にするなどの変化は必要になります)
おわりに
いろいろありましたが、Node-RED
からAmazon Echo
の音声認識を使用してノードなど(プログラム)実行できるようになりました。基本的にはNode-RED
で使用できる処理は使用できます。
音声認識時に本当に処理をするかの確認をさせられるので、一瞬で起動できるわけではないのでそのあたりは少し思ったのとは違うかなという印象です。
ただお手軽に音声認識を使用して、処理を行えるのは楽しいと思います。ただ、リレーのON/OFFぐらいであればスマートプラグを使用するほうがいいかなとは思いますが、音声認識、REST API、判断、処理というような一連の処理があるのであればこの方法が向いているかなと思います。