【ずぼら向けIoT】Google HomeでPS4を操作
夫です。
Google Homeに「ねぇ Google、プレステ〇〇」としゃべりかけると、〇〇の部分の操作がPS4に対して行われるよう対応しました。
やろうと思った経緯
我が家ではPS4はLDKに設置した大型ディスプレイに接続されており、ゲームだけでなくNetfilixやYoutubeなどの動作観賞用として起動させています。配置上、ダイニングから見ることもあれば、リビングのソファでも見ることもありますが、PS4操作にはコントローラが必要なので、コントローラがある場所まで移動する必要があります。コントローラなしでどこからでも起動・スタンバイできるよう、声で操作できるようにすれば、便利になると考えました。
以下の記事でこれが実現されていたため参考にさせていただき、私の環境でも実現することが出来ました。
システム構成
システム構成は以下の通りです。IFTTTにて、Google HomeをトリガーにwebhooksでFirebaseのリアルタイムDBを更新するアクションを設定します。さらに、リアルタイムDBの更新を監視するサーバPCを自宅に設け、更新検知をトリガーに、サーバPCがPS4をリモート操作するよう設定しました。
IFTTTについては、以下の記事で紹介しています。
今回のシステムを実現する上で大きな役割を担うのが、Firebaseとwebhooksです。
Firebase
FirebaseとはGoogleが提供するクラウドサービスで、様々な機能がありますが、今回はFirebaseの機能の一つであるリアルタイムDB「Firebase Realtime Database」を使用します。本機能では、クラウド上のデータベースにてリアルタイムにデータを同期することができます。
Webhooks
webhooksは指定のURLにPUTやGETなどのHTTPリクエストを送る仕組みです。FirebaseはGETリクエストを受けるとURLで指定したリアルタイムDBの値を返し、PUTリクエストを受けるとリアルタイムDBの値を更新することができます。つまり、IFTTTでwebhooksをアクションに設定すれば、「IFTTTのトリガーを受けてFirebaseのリアルタイムDBを書き換える」ことが実現できます。
今回は、FirebaseでPS4操作命令指示を格納するリアルタイムDBを立ち上げます。その上で、Google Homeへの命令をトリガーに設定し、webhooksによるリアルタイムDB更新をアクションに設定します。
サーバPCとNode.js
リアルタイムDBの更新を検知するサーバPCは、Node.js(サーバーサイドのJavaScript実行環境)がインストール・動作可能なPC(Windows、mac、Linuxどれでも)であれば何でもOKですが、運用上常時起動しておく必要があるので、消費電力が低いサーバー向けPC(Raspberry Piが安価でおすすめ)を採用することをおすすめします。今回は、ちょうど低消費電力PCが1台余っていたのでそれにUbuntu18.04をインストールし、サーバPCとして運用することにしました。
PCからPS4をネットワーク経由でリモート操作するためのJacaScriptモジュール「 ps4-waker」が公開されているので、これを使用してサーバPCがPS4を操作します。
システム構築手順
事前準備
・Google Homeの初期セットアップを済ませておく必要があります。
※Google Homeの初期セットアップ手順については別途記事作成予定
・IFTTTのアカウント登録も事前に済ませておく必要があります。
未登録の方は以下記事を参考に登録しておいて下さい。
・PS4リモート操作用のモバイルアプリ「PS4 Second Screen」を使用します。
スマートフォンにインストールしておいて下さい。
・さらに今回は、サーバーPCを立ち上げる必要がありますので、
PCのセットアップとNode.jsのインストールは行っておいて下さい。
※各OSにおけるNode.jsインストール手順については別途記事作成予定
・サーバーPC、スマートフォン、PS4は同じネットワーク内にして下さい。
ps4-waker設定
※当方の実行環境はUbuntu18.04ですので、環境によってはコマンドや結果に差異がある可能性があります。ご了承下さい。
まずはサーバPCのコンソールから以下のコマンドを実行してインストールして下さい。
$ sudo npm install -g ps4-waker
その後、以下のコマンドを実行してps4-wakerを起動して下さい。
$ sudo ps4-waker
すると、以下のようなメッセージが表示されます。
No credentials; Use the PS4 Second Screen App and try to connect to PS4-Waker
ここで、事前にインストールしておいた「PS4 Second Screen」を起動し、PSアカウントでサインインして下さい。以下の画面が表示され、「PS4-Waker」が選択できる状態になっていますので、選択して下さい。
これにより、サーバPCのコンソールが以下のようにPin code入力待ちになります。
Got credentials! { 'client-type': 'i', 'auth-type': 'C', 'user-credential': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' } Go to 'Settings -> PlayStation(R) App Connection Settings -> Add Device' on your PS4 to obtain the PIN code. Pin code>
PS4を操作し、「設定」→「モバイルアプリ接続機器」→「機器を登録する」を選択すると、8桁のPINコードが表示されます。これを、サーバPCのコンソールに入力(スペース不要)すると、以下のメッセージが出力され、認証に成功します。
Logged into device! Future uses should succeed
これにより、サーバPCからps4-wakerを使用してのPS4リモート操作が可能になりました。試しに以下コマンドを実行して下さい。
$ sudo ps4-waker standby
PS4がスタンバイ状態になるはずです。その後、以下のコマンドを実行するとPS4が起動すればOKです。
$ sudo ps4-waker
ps4-wakerのインストール・設定はこれにて完了です。
Firebase リアルタイムDB設定
Firebaseログイン・プロジェクト作成
Firebaseのサイト(以下リンク)にアクセスして下さい。
画面右上の「ログイン」をクリックするとGoogleアカウントでログインできますので、ログイン後、「スタートガイド」をクリックして下さい。
以下の画面が表示されるので、「Add project」ボタンをクリックして下さい。
「Project name」に任意のプロジェクト名、「Analytics and billing region」に「Japan」を入力し、「accept the ~」のチェックボックスにチェックを入れて「Create project」をクリックして下さい。
以下の画面が表示されればプロジェクト作成完了です。「Continue」をクリックして下さい。
2-2. FirebaseリアルタイムDB作成
プロジェクトを作成すると以下のような画面が表示され、「Discover Firebase」以下にFirebaseの各機能が列挙されています。今回はリアルタイムDB機能を使用しますので、「Database」タイル内の「Get started」をクリックして下さい。
以下の画面が表示されるので、「Create database」をクリックして下さい。
セキリティルール選択画面が表示されます。「locked mode」と「test mode」が選択可能です。「locked mode」は、外部からの読み書きをすべて禁止するモードで「test mode」は外部からの読み書きをすべて許可するモードになっています。今回は、簡易的に対応するため「test mode」で設定しますが、Project IDが漏洩すると第三者でもアクセス可能となってしまいますので、注意して下さい。
これでデータベースが作成できました。デフォルトだと「Cloud Firestore」が選択されているので、「Realtime Database」を選択して下さい。
データベースの要素を定義します。「+」をクリックすると、子要素を追加できます。今回は、PS4操作用のコマンドを格納するデータを設けるため、以下のように定義しました。初期値は""を入力して「Add」をクリックします。
これで、PS4操作コマンドデータを格納するリアルタイムDBをクラウドに公開し、外部サービスからアクセスできるようになりました。
外部からアクセスするための情報は、最初の画面の「Add Firebase to your web app」で確認できます。
これらの情報は、サーバPCからの監視や、IFTTTの設定で使用するので、控えておいて下さい。
IFTTTアプレット設定
新規アプレットを作成します。
Google Asistantの「Say a phrase with a text ingredient」をトリガーに選択して下さい。
「プレステ〇〇」の命令文で操作できるようにしたいので、以下のように設定し、「Create trigger」をクリックして下さい。
続いて、アクションを設定します。サービスはwebhooksを選択して下さい。
以下のように設定し、「Create Action」をクリックして下さい。URLの部分は、「FirebaseリアルタイムDB作成」の手順でFirebaseのプロジェクト画面から「Add Firebase to your web app」クリックで表示された「databaseURL」を使用して下さい。
「Finish」をクリックすれば、アプレット設定完了です。
この時点で、Google HomeとFirebaseの連携が上手く設定できているか動作確認してみましょう。Google Homeに「プレステ、起動」と話しかけ、PUT先URLに「"起動"」が表示されれば連携成功です。
リアルタイムDB監視モジュール実装
あとは、リアルタイムDBを監視し、更新があれば対応するps4-wakerコマンドを実行するプログラムを実装します。
まず、任意の場所にプロジェクト用ディレクトリを作成し、移動します。
$ mkdir ps4-wake-fromFirebase $ cd ps4-wake-fromFirebase/
以下のコマンドを実行し、プロジェクトを作成します。
$ sudo npm init -y
以下のコマンドを実行し、firebaseモジュールをインストールします。
$ sudo npm install firebase –save
以下のように実装した「index.js」を、プロジェクト用ディレクトリに保存して下さい。
// firebaseコンポーネント取得 var firebase = require("firebase"); //firebase config var config = { apiKey: "xxxxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx", authDomain: "xxxxxxxxxxxxxxxxxxxx.firebaseapp.com", databaseURL: "https://xxxxxxxxxxxxxxxxxxxx.firebaseio.com", projectId: "xxxxxxxxxxxxxxxxxxxx", storageBucket: "xxxxxxxxxxxxxxxxxxxx.appspot.com", messagingSenderId: "xxxxxxxxxxxx" }; firebase.initializeApp(config); // DB要素指定 const path = "/PS4"; const key = "command"; const db = firebase.database(); // DBデータ値更新検知 db.ref(path).on("value", function(changedSnapshot) { //データ値取得 const value = changedSnapshot.child(key).val(); if (value) { console.log("DB Value : " + value); command = ""; switch(value) { case "起動": case "軌道": command ="ps4-waker"; break; case "スタンバイ": case "停止": command ="ps4-waker standby"; break; case "ホーム": command ="ps4-waker remote ps"; break; case "トルネ": command ="ps4-waker start CUSA00442"; break; default: command = false; break; } // コマンド実行 if (command) { console.log(command); const exec = require('child_process').exec; exec(command); }else { console.log("Invalid Command"); } // DBデータ値初期化 db.ref(path).set({[key]: ""}); } });
「firebase config」の部分は、「2-2.FirebaseリアルタイムDB作成」の手順でFirebaseのプロジェクト画面から「Add Firebase to your web app」クリックで表示されたものをコピペして下さい。
torneのコマンド実行時に指定している「CUSA00442」はアプリケーションのIDで、PlayStation StoreのURLから取得できます。torneのURLは以下になっており、「CUSA00442」が指定するIDになります。
https://store.playstation.com/ja-jp/product/JA0003-CUSA00442_00-TORNEPS400000000
実装したindex.jsを実行すると、リアルタイムDB監視モジュールが起動します。
$ node index.js
以上で完成です。Google Homeに「ねぇ Google、プレステ起動」と話しかけるとPS4が起動し、「ねぇ Google、プレステスタンバイ」と話しかけるとPS4がスタンバイモードに移行します。
まとめ
Google HomeとWebhooksをIFTTTで連携させ、FirebaseのリアルタイムDBを更新させることができました。Webhooksを使用すれば、直接IFTTTをサポートしていないWebサービスでも、間接的に連携できることが分かりました。
なお本システムを構築したところ、Youtubeでどの動画を再生するか、などの指定は流石にコントローラを使用した方が速いため、結局は思ったほど便利にはなりませんでした。ただ、今回の対応を通じてスマートホーム構築に欠かせないWebhooks及びFirebaseの使い方を学べたので、他の用途にも応用できると考えて記事にまとめました。