【ずぼら向けIoT】Google HomeでPS4を操作

夫です。

Google Homeに「ねぇ Google、プレステ〇〇」としゃべりかけると、〇〇の部分の操作がPS4に対して行われるよう対応しました。

f:id:daredemosmart:20180810222038p:plain

やろうと思った経緯

我が家ではPS4LDKに設置した大型ディスプレイに接続されており、ゲームだけでなくNetfilixやYoutubeなどの動作観賞用として起動させています。配置上、ダイニングから見ることもあれば、リビングのソファでも見ることもありますが、PS4操作にはコントローラが必要なので、コントローラがある場所まで移動する必要があります。コントローラなしでどこからでも起動・スタンバイできるよう、声で操作できるようにすれば、便利になると考えました。

以下の記事でこれが実現されていたため参考にさせていただき、私の環境でも実現することが出来ました。

qiita.com

システム構成

システム構成は以下の通りです。IFTTTにて、Google HomeをトリガーにwebhooksでFirebaseのリアルタイムDBを更新するアクションを設定します。さらに、リアルタイムDBの更新を監視するサーバPCを自宅に設け、更新検知をトリガーに、サーバPCがPS4をリモート操作するよう設定しました。

f:id:daredemosmart:20180810130808p:plain
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(WindowsmacLinuxどれでも)であれば何でも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」が選択できる状態になっていますので、選択して下さい。

f:id:daredemosmart:20180810131307p:plain

これにより、サーバ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のサイト(以下リンク)にアクセスして下さい。

firebase.google.com

画面右上の「ログイン」をクリックするとGoogleアカウントでログインできますので、ログイン後、「スタートガイド」をクリックして下さい。

f:id:daredemosmart:20180810131615p:plain

以下の画面が表示されるので、「Add project」ボタンをクリックして下さい。

f:id:daredemosmart:20180810131712p:plain

「Project name」に任意のプロジェクト名、「Analytics and billing region」に「Japan」を入力し、「accept the ~」のチェックボックスにチェックを入れて「Create project」をクリックして下さい。

f:id:daredemosmart:20180810131751p:plain

以下の画面が表示されればプロジェクト作成完了です。「Continue」をクリックして下さい。

f:id:daredemosmart:20180810131811p:plain

2-2. FirebaseリアルタイムDB作成

プロジェクトを作成すると以下のような画面が表示され、「Discover Firebase」以下にFirebaseの各機能が列挙されています。今回はリアルタイムDB機能を使用しますので、「Database」タイル内の「Get started」をクリックして下さい。

f:id:daredemosmart:20180810131858p:plain

以下の画面が表示されるので、「Create database」をクリックして下さい。

f:id:daredemosmart:20180810131933p:plain

セキリティルール選択画面が表示されます。「locked mode」と「test mode」が選択可能です。「locked mode」は、外部からの読み書きをすべて禁止するモードで「test mode」は外部からの読み書きをすべて許可するモードになっています。今回は、簡易的に対応するため「test mode」で設定しますが、Project IDが漏洩すると第三者でもアクセス可能となってしまいますので、注意して下さい。

f:id:daredemosmart:20180810131953p:plain

これでデータベースが作成できました。デフォルトだと「Cloud Firestore」が選択されているので、「Realtime Database」を選択して下さい。

f:id:daredemosmart:20180810132015p:plain

データベースの要素を定義します。「+」をクリックすると、子要素を追加できます。今回は、PS4操作用のコマンドを格納するデータを設けるため、以下のように定義しました。初期値は""を入力して「Add」をクリックします。

f:id:daredemosmart:20180810132035p:plain

これで、PS4操作コマンドデータを格納するリアルタイムDBをクラウドに公開し、外部サービスからアクセスできるようになりました。

外部からアクセスするための情報は、最初の画面の「Add Firebase to your web app」で確認できます。

f:id:daredemosmart:20180810132054p:plain

これらの情報は、サーバPCからの監視や、IFTTTの設定で使用するので、控えておいて下さい。

f:id:daredemosmart:20180810132113p:plain

IFTTTアプレット設定

新規アプレットを作成します。

f:id:daredemosmart:20180810132331p:plain

Google Asistantの「Say a phrase with a text ingredient」をトリガーに選択して下さい。

f:id:daredemosmart:20180810015708p:plain

「プレステ〇〇」の命令文で操作できるようにしたいので、以下のように設定し、「Create trigger」をクリックして下さい。

f:id:daredemosmart:20180810132348p:plain

続いて、アクションを設定します。サービスはwebhooksを選択して下さい。

f:id:daredemosmart:20180810132412p:plain

以下のように設定し、「Create Action」をクリックして下さい。URLの部分は、「FirebaseリアルタイムDB作成」の手順でFirebaseのプロジェクト画面から「Add Firebase to your web app」クリックで表示された「databaseURL」を使用して下さい。

f:id:daredemosmart:20180810132434p:plain

  「Finish」をクリックすれば、アプレット設定完了です。

この時点で、Google HomeとFirebaseの連携が上手く設定できているか動作確認してみましょう。Google Homeに「プレステ、起動」と話しかけ、PUT先URLに「"起動"」が表示されれば連携成功です。

f:id:daredemosmart:20180810132529p:plain

リアルタイム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の使い方を学べたので、他の用途にも応用できると考えて記事にまとめました。