先日のAmazonプライムデーにて新型のスマートスピーカー「Echo Spot」が半額になっており
思わず衝動買いしてしまったのですが、
このスマートスピーカー(以下Alexa)を使って何か面白いことをできないかと思い
今回Alexaから自身のPCを操作することに挑戦しました!
本記事の最終目標
本記事ではwindows導入編としてwindowsPCとAlexaをAPI経由で繋いだ上で
音声でPCをシャットダウンすることを目標にしました。
「アレクサ、パソコンを切って」と指示を出すと自動でPCがシャットダウンする感じです。
上記の内容をハンズオン形式で以下の手順に沿って進めていきます。
- Node-RED(IoTデバイスを操作するためのツール)の導入
- Node-REDの自動実行に関する設定
- Node-RED Alexa Home Skill Bridgeへの登録
- Alexaにスキルを導入
- Node-REDでシステムを構築
Node-REDの導入
導入を進める前にNode.jsのインストールが必要になるので
公式ページから最新のLTS版をダウンロードしておきましょう。
(この辺りの作業については省略します)
https://nodejs.org/en/
AlexaからWindowsPCを操作するためにはNode-REDと呼ばれる開発ツールが必要になります。
コマンドプロンプトから以下のコマンドを使ってインストールを実施しましょう。
npm install -g --unsafe-perm node-red
特にエラーが出なければインストール完了です。
コマンドnpm list -g
を実行して
node-redがリストに表示されるか確認しておきましょう。
続けてLAN内における接続を許可するために下記のコマンドを実行します。
netsh advfirewall firewall add rule name="node.js" dir=in action=allow protocol=TCP localport=1880
※もしコマンドの実行が上手くいかないときは管理者権限で実行してみてください
Node-REDの自動実行設定
続けてwindowsPC起動時にNode-REDが自動的に起動するように設定を行います。
(windowsのタスクスケジューラとvbScriptを使用します)
下記の内容をboot-node-red.vbs
として任意の場所に保存しておきましょう。
今回はCドライブ内のC:\Windows\System32
中にnode-redフォルダを作成して、
その中に保存します。
Set ws = CreateObject("Wscript.Shell") ws.run "cmd /c %APPDATA%\npm\node-red.cmd", 0
続けてWindowsキー+Rで「ファイル名を指定して実行」を開きtaskschd.msc
と入力して実行します。
するとタスクスケジューラが開くので、こちらで設定を行っていきます。
ウィンドウ左部に「タスクスケジューラライブラリ」という項目があるので
こちらを右クリックして「タスクの作成」をクリックします。
以下の形で設定を行いましょう。
「全般」タブ
「名前」に「node-red」と入力
「トリガー」タブ
「新規」ボタンを押して「新しいトリガー」ウィンドウを開く
「タスクの開始」で「ログイン時」を選択しそのままOKをクリック
「操作」タブ
「新規」ボタンを押して「新しい操作」ウィンドウを開く
「プログラム/スクリプト」に「wscript.exe」と記入
「引数の追加」に先ほどのboot-node-red.vbsのパス
(C:\Windows\System32\node-red\boot-node-red.vbs)を記入
最後に「node-redのプロパティ」画面でOKをクリック。
こんな感じで「node-red」というタスクが作成されていればOKです。
今回はタスクを作成した直後なので
「node-red」を右クリックして「実行する」をクリックしておきましょう。
Node-RED Alexa Home Skill Bridgeへの登録
Node-REDの導入の他に、こちらのサイトで登録が必要になります。
https://alexa-node-red.bm.hardill.me.uk
画面上部のRegisterを押したらアカウントの登録画面に遷移するので
ユーザー名及びパスワードを設定して登録を行いましょう。
サービスは無料で使用することができます。
登録、ログインが完了すると以下のようなトップページへ遷移します。
「Add Device」ボタンを押してデバイスの追加を行います。
「Name」ではデバイス名を設定します。
今回はパソコンのシャットダウンが目的なのでそのまま「パソコン」としておきましょう。
「Description」ではデバイスの詳細を記載することができます。
簡単に「シャットダウン用」と記載しておきます。
「Actions」の項目はOffだけにチェック、
「Application Type」はSWITCHにチェックを入れます。
ちょっと補足ですが、
ここで設定した内容がAlexaに対して話しかける言葉と連動します。
今回「アレクサ、パソコンを切って」と指示を出すことで
PCをシャットダウンするようにシステムを作成するのですが、
この時の「パソコン」がデバイス名、「切って」という操作が
Application Typeの「SWITCH」とActionsの「Off」に対応しています。
Alexaの設定
Alexaの方ではスキルの導入が必要になります。
タブレットからAmazon Alexaのアプリケーションを起動して
フッターの「その他」を選択、「スキル・ゲーム」を選択しましょう。
※今回はタブレットよりAlexaアプリを起動しています
スキルの検索画面へ遷移するのでここで「node-RED」スキルを探します。
見つかったら「有効にして使用する」を押しましょう。
この時、先ほどNode-RED Alexa Home Skill Bridgeで作成した
ユーザー情報でログインを求められるので入力しましょう。
その後、デバイスの検出が自動で行われて
先ほど作成したデバイス(パソコン)が画面に表示されるようになります。
システムの実装
ここからいよいよNode-REDを用いた実装に入っていきます。
まずブラウザでhttp://localhost:1880
にアクセスしましょう。
Node-REDの設定画面を開くことができます。
Node-REDでは画面左部に表示されているノードをつないでシステムを構築していくのですが、
デフォルトではAlexa用のノードが用意されていない状態なので
こちらを追加するところから進めます。
画面右上のメニューから「パレットの管理」を選択します。
「ノードを追加」タブを選び
「node-red-contrib-alexa-home-skill」で検索すると同名の項目が
絞り込まれるので右下の「ノードを追加」ボタンを押します。
先ほどの画面に戻って
対象のノードが2つ追加されていれば大丈夫です。
「alexa-home」のノード(alexaカテゴリ内の灰色ノード)を画面中央部にドラッグ&ドロップして
ダブルクリックすることでアカウントとデバイスを設定します。
ここは先ほどNode-RED Alexa Home Skill Bridgeで作成した
アカウント情報とデバイス情報を設定します。
一方でPCのシャットダウンに使用するバッチファイルを作成しておきましょう。
以下のコマンドをバッチファイルshutdown.batとしてC:\Alexa\command
下に保存します。
※任意の場所で問題ありません
shutdown /s /f /t 0
httpリクエスト経由で上記のバッチ処理を呼び出せるようにします。
「http in」のノード(ネットワークカテゴリ内の黄緑色ノード)をドラッグ&ドロップしてダブルクリック、
ここでAPIのURLを決められるので今回はGETメソッドの/shutdownとしておきます。
続けて「exec」のノード(機能カテゴリ内の濃橙色ノード)をドラッグ&ドロップ、ダブルクリックします。
ここのコマンドで実行するバッチファイルを指定してあげます。
コマンド以外の設定はそのままで大丈夫です。
その後こんな感じでノードを繋いであげるとAPIが呼び出された
タイミングでバッチファイルが実行されるようになります。
引き続きAlexaからデバイスを操作する際にAPIリクエストが呼ばれるようにします。
「http request」のノード(ネットワークカテゴリ内の黄緑色ノード)をドラッグ&ドロップしてダブルクリック、
URLの項目に先ほどのAPIの情報(GETメソッド, http://localhost:1880/shutdown)を設定します。
こちらも他の部分については特に変更しなくて大丈夫です。
こちらのノードは「alexa-home」のノードと繋いであげます。
実装内容を反映するためには右上のデプロイボタンを押す必要があります。
「デプロイが成功しました」と表示されれば問題ありません。
この状態でAlexaに対して「アレクサ、パソコンを切って」と話しかけると…
音声だけでパソコンをシャットダウンすることができました!
一切手を触れずにPCを操作できるのでなかなか感動します笑
まとめ
今回Alexaを使って音声から簡単なPC操作を行うシステムを構築してみました。
今後も身の回りの作業で自動化を図ることができないか色々と試してみたいと考えています。