はじめに
最近引っ越しを予定しておりまして、古い家電を新しいものに変えようかと家電量販店に向かうのが休日の楽しみなのですが、スマート家電やloT家電対応している家電が増えてきているなぁと感じております。
loT家電はAmazonEchoなど、声で操作できる家電を指しますが、家電自体が対応していないと「アレクサ!テレビつけて!」と言ったところで、テレビは何も反応してもらえません。
声で操作したいからテレビを買い替えようと思ったとしても、そうそう簡単に買い替えるほど安い物でもない訳です。そう!つまり、悩んでいるのです。
その悩みの一部を解決する素晴らしい機器が巷には存在します。
赤外線リモコンで操作できる家電であればlotに対応していない家電でもスマートフォンやアレクサ等から操作できる機器。その名もスマートリモコンです。
スマートリモコン
スマートリモコンはNatureRemoやeRemote5など、さまざまな種類が各メーカーより発売されており、中にはBluetoothで操作ができる家電にも対応したスマートリモコンもあるそうです。気になった方は是非Google先生に聞いてみてください。
今回このようなお話をさせて頂いたのは、自分自身、声で電源ONを操作してみたい機器があるのです。それは「PlayStation4」です。コーヒーを淹れながらエルデンリングを始める準備をしたいじゃないですか!したくなりませんか?!自分はしたい!!
色々調べたものの、どうしてもPlayStation4をloT化するスマートリモコンは見当たらない。ならば出来るようにしてやるのも一つの手ではないかと考えました。
PlayStation4をAlexaで起動
PlayStation4はWiFi経由のリモート操作が出来る機能を持っており、スマートフォンアプリ等でアクセスすることが出来ます。しかし現段階ではAlexaからのアクセスには対応していないため、我が家にあるAmazonEchoShowのAlexaがPlayStation4にアクセスするには、間に入ってくれる物が必要になります。
「RaspberryPi」です。
処理の流れは以下の流れになります。
Alexa -> Node-Red(Webサービス) -> RaspberryPi -> PlayStation4
この流れを実現するシステムを構築したいと思います。
Node-Red Alexa Home Skill Bridge
AlexaでRaspberryPiを連携するために、Node-Redを設定します。Node-Redのアカウント作成からデバイス作成までを定義します
公式サイト:https://alexa-node-red.bm.hardill.me.uk
- 公式サイトからRegisterでアカウントを登録
- Deviceタブを選択し、Add Deviceを選択
- 下図の赤枠に情報を入力して登録する
Name:Alexaに話しかけるときにトリガーになる言葉
Description:このデバイス説明(今回は空欄)
on,off:デバイスの操作アクション 「点けて(on)」「消して(off)」が行える設定

Alexaの設定
次はAlexaアプリが入っているスマートフォンから設定します。
- Alexaアプリでnode-redスキルを検索し、node-redを有効に設定
- 有効にするとNode-Redのログインが求められるので、先程のNode-Redでデバイス登録したアカウントでログイン
- デバイスの検出が行われるので、その後表示されるデバイスから、Node-Redで登録したデバイスを登録
(登録されると以下のように表示されます)

RaspberryPiの設定
RaspberryPiにOSのRaspbianで起動後、Node-Redをインストールします。
インストールは公式サイト(https://nodered.jp/docs/getting-started/raspberrypi)にインストール用スクリプトが公開されているため、そのスクリプトを使用します。実行すると以下のような画面になります。

Ps4-wakerの設定
Ps4-wakerはネットワーク経由でPlayStation4を操作することが出来るパッケージです。
今回こちらのPs4-wakerを使用して、RaspberryPiとPlayStation4を連携させます。
$ npm install -g ps4-waker
上記コマンドでRaspberryPiにインストールを行います。インストールが終了次第、以下コマンドを入力しPs4-wakerを起動します。
$ ps4-waker
Ps4-wakerが起動すると、「クレデンシャルは?!?!」(意訳)と言われてしまうので、スマートフォンアプリの「PS4 Second Screen」を使用してクレデンシャル情報を取得します。
お使いのスマートフォンにPS4 Second Screenがインストールされていない方はインストールしてそのアプリでPlayStation4に一度繋げておきましょう。
スマーフォンアプリのPS4 Second Screenを起動し、接続する端末を検出すると「PS4-Waker」が表示されていると思います。
表示されている「PS4-Waker」をタップするとコンソール側に以下のクレデンシャル情報が表示されます。
Got credentials! { ‘client-type’: ‘i’,
’auth-type’: ‘C’,
’user-credential’: ‘credentials’ }
Go to ‘Settings -> Mobile App Connection Settings -> Add Device’ on your PS4 to obtain the PIN code Pin code>
上記「Pin code> 」にPlayStation4のPinコードを打ち込むよう要求されるので、PlayStation4を起動しPinコードを調べます。
PlayStation4の画面で、
設定 -> モバイルアプリ接続設定 -> 機器を登録する
を選択し表示されたPINコードをコンソールに入力します。Succeedが表示されたら準備は整いました。
一旦ここで動作確認
RaspberryPiのコンソールで以下コマンドを実行します。
$ ps4-waker standby
スタンバイモードになりましたか?では次!
$ ps4-waker
コマンド入力するとPlayStation4が起動すると思います。RaspberryPiとPlayStation4の連携は成功しています。ちなみに、他コマンドとして代表的なのは以下の通りになります。
- start [titleID] 特定のアプリを起動 PS Store のURL等から取得
- remote [key-name…] [key-name]に対応した操作を行う up(上キー)、ps(PSボタン)など
- search 起動しているアプリの情報を表示する
- standby スタンバイモードへ
Node-Red の実行
次に RassberryPiでNode-Red を起動させておきます。
node-red-pi コマンドを利用し、かつ –max-old-space-size で未使用メモリ開放の最大サイズを指定します。
$ node-red-pi –max-old-space-size=256
Node-Red で一連の流れを作成
【発話したらPS4を起動する】という処理フローを作成するため、RaspberryPiのNode-Redにアクセスします。接続先に指定するポート番号は先ほどスタートさせた際に表示されるポート番号になります。おそらく1880になると思います。
http://<RasspberryPiのIPアドレス>:1880
アクセスするとエディタが表示されます。このような画面です。

Node-Red Alexa Home Skill Bridge 登録
Alexa アプリ でデバイス登録した機器を取り扱うノードです。
「アレクサ〇〇(登録機器名)を〇〇(登録したアクション名)。」と発話すると処理がスタートします。
こちらのノードを取り扱うには以下の初期設定が必要です。
エディタの右上にあるハンバーガーを選択すると表示されるメニューを開き、「設定」を選択
(設定ノードではないですよ)

パレットの「ノードを追加」を選択し、検索窓に「alexa」と入力するとnode-red-contrib-alexa-home-skillが結果として表示されます。

上記設定が完了すると下記画面の様にAlexa用コマンドが表示されます。

表示されたAlexaHomeをドラッグして中央のスペースに移動すると

が配置されます。このノードがAlexaの動作トリガーノードになります。ではこのノードをダブルクリックしましょう。

この様な画面が表示されると思いますので、Acountを選択し、アカウント情報を入力すると、Node-Red Alexa Home Skill Bridgeの項目で設定したデバイス名が表示されるのでそのデバイスを選択。その後右上の完了ボタンを選択します。

ノードが選択したデバイスの名称に変わったと思います。これで、「アレクサ!PS4を・・・」までの部分ができました。
続いて、「つけて」「消して」の部分を作成していきます。
switch ノード

左のタブ内にある機能の枠に「switch」があると思います。それを先ほどと同じ様にドラッグしてエディタに配置します。
このノードは直前のノードから渡されたパラメータによって処理を分岐させます。
今回はアクションが入る msg.command の文字列によって分岐させます。

簡単に「ON、OFF」のみのアクションなので TurnOnRequest , TurnOffRequest のみの分岐になります。
change ノード

渡された値に代入したり、削除したり、置換したりすることができるノードです。
今回は switch ノードの分岐から処理が走るので、 msg.payload に ps4-waker のコマンドを代入しています。
msg.payload に代入した値は次のノードにより以下のように実行されます。
Startは特にパラメータが必要ないのでそのまま処理を行います。

スタンバイモードに遷移させる場合は、to the value に「standby」を入力しておきます。

exec ノード

シェルのコマンドを実行します。
引数に標準で msg.payload を与えることができるので、 change ノードで代入した値をそのままコマンドとして使えます。

入力が終わった状態は以下の様になっていると思います。

これを線で繋げていきます。
各ノードの右側にある丸と繋げたい先のノードにドラッグすることで処理がつながります。

switchでは分岐処理をさせるため、丸にカーソルを合わせるとその丸が定義されている内容が見える様になっている為、わかりやすいと思います。

他色々ノードはありますが、今回はPlayStation4の起動・終了だけやりたいので上記で十分です。
以上で Node-RED の処理フローが完成しました。
エディタ右上の「デプロイ」を選択します。
Node-RED の自動起動設定
いちいちRaspberryPi起動後にコンソールで Node-RED を起動するのは面倒なので自動起動の設定をしておきます。
$ sudo systemctl enable nodered.service
これでRasspberryPiの電源を入れると自動で Node-RED が起動するようになります。
出来たはずなので動作確認
「アレクサ!PS4つけて!!」
(アレクサ)はい
(PS4)ピッ
ワーイウゴイタヤッター!!
これで、「よーしゲームやるかー。コーヒー入れよう。あっアレクサ!PS4つけて!!」という方程式を手に入れたのでした。(PlayStation4の電源が入っただけ)
最後に
特に難しい技術を使用することなく実現することができました。今回Node-Redを使用しましたが、1コマンドにつき1デバイスで定義する必要があるため、PlayStation4の電源オンだけではなく、「Youtubeつけて」とか別のアプリ起動をやろうとした際は、再度デバイス登録から作らなければならないという問題もあり、まだまだ調査が必要と感じました。
今回はRassberryPiで実現しましたが、Linux系のOSが動く端末であればどれでも出来る気がします。みなさんも是非挑戦し、面白い使い方を見つけた際は是非教えてください。
スマホデヤレという意見は聞こえないですはい
アレクサPS4つけて!!(ピッ)
※執筆段階では上記、方法で実現できましたがNodeRedの定義方法やPlayStation4のアップデートにより変更が行われる可能性がございます。ご使用する前には公式サイトでご確認ください。