AmazonEchoからWindowsマシンのコマンドを実行する(node-red-contrib-amazon-echo)

ALL
スポンサーリンク

AmazonEcho から Windowsマシン上のコマンドを実行する方法です。
アレクサ、に続けて「○○オン」や「○○オフ」で、Windows上のコマンドを実行できます。

本記事での方法は、
・Alexaスキルの導入は不要
・外部のサーバーへのアクセスは不要
となり、自宅内の Windowsマシンへの設定だけで完結します。

ここでは設定例として、「テスト オン」や「テスト オフ」で、Windows上のデスクトップに置いた exec.bat を実行する方法を説明します。

なお、exec.bat 内の記述でGUIプログラムを起動したい場合は、ユーザーはWinodwsマシンにログオンしておく必要があります。
(起動するGUIプログラムの為に、デスクトップ画面が必要だからです)

スポンサーリンク

はじめに制限事項について

コマンドを実行させる際の呼び出しの、「○○オン」「○○オフ」の○○部分は、何でも良いわけでは無いようです。

まず、既存のスキルと競合する名前はできません。スキルの方が起動します。
また、固有名詞もだめなようです。
今回の設定例では「テスト」ですが、当然、この呼び出し名は別のものにしてもOKですが、色々試して、うまく認識する呼び出し名を探す必要があります。

準備

Windowsマシンでの設定

はじめに Node-Red をインストールします。
Windowsで実行する : Node-RED日本ユーザ会 のクイックスタートの手順(1~3)で進めてください。

なお、手順1でダウンロードする Node.js は 推奨版 の方をダウンロードしてください。。

次に管理者権限で PowerShell/コマンドプロンプトを立ち上げて、次のコマンドを実行します。
ファイアウォールのルールが追加されます
8111 は Windowsマシン上で使用していないポート番号を指定します。通常はここでの例の通り、8111 で問題ありません。

netsh advfirewall firewall add rule name="node-red" dir=in action=allow protocol=TCP localport=1880
netsh advfirewall firewall add rule name="node-red" dir=in action=allow protocol=TCP localport=80
netsh advfirewall firewall add rule name="node-red" dir=in action=allow protocol=TCP localport=8111

続けて、次のコマンドを実行します。

netsh interface portproxy add v4tov4 listenport=80 listenaddr=0.0.0.0 connectport=8111 connectaddress=127.0.0.1

なお、これらの設定が不要になった場合は、次のコマンドでルールを削除します。

netsh advfirewall firewall delete rule name="node-red"
netsh interface portproxy delete v4tov4 listenport=80 listenaddr=0.0.0.0

次に Node-RED を起動時に実行するようにします。

タスクスケジューラで設定を行います。
スタートメニューで右クリック - コンピューターの管理 - タスクスケジューラ を選択します。

“タスクの作成” を選択します。

タスクスケジューラ_1.png

現れた画面で、次の設定を行います。
ここで、Windows上で実行するコマンドが GUIプログラムかどうかで、手順がわかれます。
「GUIプログラムを起動する場合」「GUIプログラムを起動しない場合<」それぞれに進んでください。

GUIプログラムを起動する場合

[全般タブ]タブで、”名前”にタスク名(何でもいいです)を入力し、 「ユーザーがログオンしているときのみ実行する」にチェックを付けます。

[トリガー]タブで、[新規]ボタンを押し、現れたダイアログの “タスクの開始” で “ログオン時” を選択して [OK]ボタンを押します。

[操作]タブで、[新規]ボタンを押します。
下の画面が現れるので “プログラム/スクリプト” に wscript.exe 、”引数の追加” に %USERPROFILE%\Desktop\exec_node.vbs と入力して OK を押します。
(exec_node.vbs は後の手順で作成します)

タスクスケジューラ_2.png

[条件]タブで、「コンピューターを AC 電源で使用している場合のみタスクを開始する」のチェックを外します。

最後に[OK]ボタンを押します。
「このタスクを実行するユーザー アカウント情報を入力してください」と出た場合は、ログインパスワードを入力します。

また、デスクトップに exec_node.vbs を作成しておきます。

exec_node.vbs

Set ws = CreateObject("Wscript.Shell") 
ws.run "cmd /c %APPDATA%\npm\node-red.cmd", 0

これで、Node-RED を起動時に実行する設定ができました。この先の「Node-REDでの設定」の手順に進んでください。

GUIプログラムを起動しない場合

[全般タブ]タブで、”名前”にタスク名(何でもいいです)を入力し、「ユーザーがログオンしているかどうかにかかわらず実行する」にチェックを付けます。

[トリガー]タブで、[新規]ボタンを押し、現れたダイアログの “タスクの開始” で “スタートアップ時” を選択して [OK]ボタンを押します。

[操作]タブで、[新規]ボタンを押します。
下の画面が現れるので “プログラム/スクリプト” に %APPDATA%\npm\node-red.cmd を入力します。

タスクスケジューラ_2.png

[条件]タブで、「コンピューターを AC 電源で使用している場合のみタスクを開始する」のチェックを外します。

最後に[OK]ボタンを押します。
「このタスクを実行するユーザー アカウント情報を入力してください」と出た場合は、ログインパスワードを入力します。

Node-REDでの設定

PCから http://xx.xx.xx.xx:1880 (xx.xx.xx.xxはWindowsマシンのIPアドレス)にアクセスします。

次の画面が出ます。

windows_nodered_1.PNG

右側の三本線のアイコンをクリックして、パレットの管理を選択します。

windows_nodered_2.PNG

「ノードを追加」タブを選択し、「node-red-contrib-amazon-echo」と入力します。

node-red-contrib-amazon-echo がヒットするので「ノードを追加」ボタンを押します。

windows_nodered_3.PNG

次の画面 が出た場合は「追加」を押します。

windows_nodered_4.PNG

しばらくすると、追加が完了します。「閉じる」を押します。

windows_nodered_5.PNG

左側のノードを下にスクロールしていくと、[入力]の個所に「amazon echo hub」「amazon echo device」が追加されています。
左側のノードから「amazon echo hub」をフロー(画面中央の領域)にドラッグ&ドロップします。

windows_nodered_6.PNG

ドラッグ&ドロップした「Amazon Echo Hub」をダブルクリックすると、編集画面が出ます。
Port の箇所に、「Windowsマシンでの設定」の箇所で指定したポート番号を指定し、「完了」を押します。
本記事の例では 8111 にします。

この「Amazon Echo Hub」は、フローに1つだけ配置します。

設定例

ここでは、Amazon Echo に「テスト オン」「テスト オフ」というと、Windowsマシン上でコマンドを実行する設定を説明します。

デバイスの追加

Amazon Echo への呼出名と、実行する機能を設定します。

「amazon echo device」をフロー(画面中央の領域)にドラッグ&ドロップします。
「Amazon Echo Hub」のポート(四角いマーク)から、「Amazon Echo Device」のポートまでマウスでドラッグしてワイヤーでつなげます。

windows_nodered_7.PNG

ドラッグ&ドロップした「Amazon Echo Device」をダブルクリックすると、編集画面が出ます。

windows_nodered_8.PNG

“Name” の個所にデバイス名を入力して、完了を押します。
ここで入力した名前が、Amazon Echo を呼ぶときの名前になります。日本語もOKです。
ここではサンプルとしてNameに「テスト」と入力します。

画面の上の方の「デプロイ」を押してデプロイ実行します。

windows_nodered_9.PNG

次に、スマホでAmazonAlexaアプリにアクセスします。

デバイス-すべてのデバイス-画面右上の+をタップ-デバイスを追加とたどり、セットアップするデバイスの種類で[その他]を選択し、[デバイスを検出] を押します。
照明として検出されます。
[デバイスをセットアップ]がありますが、ここは押さずに、このまま、画面右下のデバイスボタンを押します。

これで、デバイスが追加されました。

ただし、追加されたデバイス名は文字化けしていますので、次の手順で修正します。

Alexaアプリで、デバイス-すべてのデバイス とたどります。
デバイス一覧が表示されるので、その中の文字化けしているものを選択します。

画面右上に設定アイコン(歯車)があるのでタップし、”名前を編集” で名前を修正します。

なお、この名前の編集は、PCでブラウザで https://alexa.amazon.co.jp にアクセスする Amazon Alexa のページでは修正できません・・・
ここでの説明のように、Alexaアプリから修正してください。

Node-RED でフロー作成(音声で反応するかの確認まで)

PCからブラウザで http://xx.xx.xx.xx:1880 (xx.xx.xx.xxはWindowsマシンのIPアドレス)にアクセスします。

左側のノードから「debug」をフローにドラッグ&ドロップします。
msg.payload が表示されるので、msg.payloadのポート(四角いマーク)から、「テスト」のポートまでマウスでドラッグしてワイヤーでつなげます。

画面の上の方の「デプロイ」を押してデプロイ実行します。

windows_nodered_10.PNG

これで作成したフローが機能します。
本当に動作するかテストしてみます。

フローの「msg.payload」ノードを選択します。
次に 画面右側にあるデバッグタブを選択します。デバッグタブを選択するには、下の画像のような虫アイコンを選択します。

node-red-contrib-alexa-local_8.JPG

これで、Amazon Echoに「テストオン」や「テストつけて」と言うと、「はい」と反応します。
その際、デバッグタブにメッセージが表示されます。

「~オン」「~つけて」の場合はon、「~オフ」「~けして」の場合はoffが表示されます。

windows_nodered_11.PNG

Node-RED でフロー作成(Windowsでのコマンド実行)

先ほどまでの手順で、指定した名称で Amazon Echo を呼ぶと反応する所まで確認できました。
ここでは、その際に Windows上でコマンドを実行する設定を説明します。

ノードの「その他」から「exec」をフローにドラッグ&ドロップします。

追加されたノードのポート(四角いマーク)から、「テスト」のポートまでマウスでドラッグしてワイヤーでつなげます。

windows_nodered_12.PNG

「exec」で追加されたノードをダブルクリックし、編集画面の [コマンド] で %USERPROFILE%\Desktop\exec.bat と入力します。
ここで指定するコマンドが、Amazon Echo を呼んだ時に実行されます。
(exec.bat は後で作成します)
最後に完了を押します。

次のようになるので、画面の上の方の「デプロイ」を押してデプロイ実行します。

windows_nodered_13.PNG

これでフローは作成できました。

次に、Windowsマシンのデスクトップ上に exec.bat を作成します。
内容は次のようにします。
「~オン(~つけて)」「~オフ(~けして)」と言われた場合の区別は、引数が on か off かで区別できます。

exec.bat

@echo off
if "%1"=="on" (
 echo "ON" > %USERPROFILE%\Desktop\test.txt
)
if "%1"=="off" (
 echo "OFF" > %USERPROFILE%\Desktop\test.txt
)

ここまで出来たら、Amazon Echoに「テストオン」や「テストつけて」と言うと、「はい」と反応します。
また、Windows上で exec.bat が実行されます。
Windowsのデスクトップに test.txt に「テスト オン」で “ON” が出力され、「テスト オフ」で “OFF” が出力されていますので、確認してみましょう。

GUIのプログラムを実行する場合(先の手順「GUIプログラムを起動する場合」での設定が必要)は、exec.bat を次のようにすると、Amazon Echoに「テストオン」や「テストつけて」と言うと、メモ帳が起動します。

この場合は、ユーザーは Windowsにログオンしておいてください。
(起動するGUIプログラムの為に、デスクトップ画面が必要だからです)

exec.bat

@echo off
if "%1"=="on" (
 notepad
)

コメント