Google Homeでプレステ4を操作できるようにしてみた

Google Homeでプレステ4を操作できるようにしてみた

コチラの記事を参考にさせていただき、Google Home から PS4 を起動できるようにしてみました。
nodejs アプリのソースもコチラを参考にして、我が家向けに改修させていただいています。

# はじめに(https://qiita.com/miso_develop/items/c2008235cb4a8567cfa9)にて赤外線モジュール([...

 

初めてラズパイで Node.js を扱ったこともあり、疑問が湧くポイントがありました。
私なりのメモとして残しておきたいと思います。

また、参考にさせていただいた記事では、PS4 以外にも家電を動かすスマートリモコンとしての役割がありました。
我が家では Nature remo を使っているため、PS4 を動作させるためだけの設定に限定しました。

 

トルネなどを起動できますが、トルネ起動後はやはりリモコンが必要だと思います。
上とか下をわざわざ言葉で操作するのは大変です。
PlayStation4 起動 → Torne 起動 → PlayStation4スタンバイ の一連の流れは問題なくできました。

 

この機能を実装するためには以下が必要です。

  • Google Firebase の登録(無料)
  • IFTTT の登録(無料)
  • Raspberry Pi 3
  • スマートフォンまたはタブレット

 

ラズパイ(Raspberry Pi 3) の導入はコチラを参考にしてください。

これからラズパイを始めたい人向けに情報をまとめてみました。私は今回ケース付きを『Raspberry Pi 3 モデル B』を購入しました。『Raspberry Pi 3 モデル B』とケース、ヒートシンクがセットになっているので、オススメです。このセットは、ケースが 7色から選ぶことができます。 Raspberry Pi3 Model B ボード&ケースセット 3ple Decker対応 (Element14版, Clear)-Physical Computing Labposted with カエレバTechShareAmazon楽天市場 『Raspberry Pi 3 モデル B』は Wi-Fi や Bluetooth を使用でき、CPU も『Raspberry P...

事前に node.js と npm をインストールしておく必要があります。

Google Home から IFTTT を介してラズパイを操作する際に Node.js と npm が必要になったので、古い Node.js をアンインストール後に最新版をインストールしました。その時のインストール方法をメモとして残しています。 文字化けを防ぐために環境変数設定export LANG=C git がインストールされていることを確認$ git --versiongit version 2.11.0 古い node.js をアンインストール$ sudo apt-get autoremove nodejs node.jsa インストール先を作成$ sudo mkdir /usr/local/nvm$ sudo chmod 777 /usr/local/nvm&am...

 

ps4-waker の設定

ps4-waker はネットワークから PS4 を操作するモジュールです。
まずは ps4-waker をラズパイにインストールします。

  1. ps4-waker インストール

    sudo npm install -g ps4-waker

  2. ps4-waker を実行

    sudo ps4-waker


    PS4 を起動していないと失敗します。

    hoge@raspberrypi:~ $ sudo ps4-wakerDevice must be awake for initial registration. Please turn it on manually and try again.

  3. “No credentials; Use the PS4 Second Screen App and try to connect to PS4-Waker” が表示されたことを確認

    hoge@raspberrypi:~ $ sudo ps4-wakerNo credentials; Use the PS4 Second Screen App and try to connect to PS4-Waker

  4. スマホに PlayStation App をインストール
    ‎PlayStation App
    Price: Free
     
    PlayStation App
    Price: Free
  5. アプリを起動して [PSN にサインイン] する
    アプリを起動して [PSN にサインイン] する
  6. PSN にログインする
    PSN にログインする
  7. [次へ] を 2回タップして [始める] をタップ
    [次へ] を 2回タップして [始める] をタップ
    はじめようをタップ
  8. プレステのマークをタップ
    プレステのマークをタップ
  9. [セカンドスクリーン] をタップ
    [セカンドスクリーン] をタップ
  10. ストアに移動をタップして、セカンドスクリーンをダウンロードする
    ストアに移動をタップして、セカンドスクリーンをダウンロードする
  11. [“ユーザ名” として続ける] をタップしてログインする
    ["ユーザ名" として続ける] をタップしてログインする
  12. [PS4-Wakaer] をタップ
    [PS4-Wakaer] をタップ
    ※ここまで行うとラズパイの ps4-waker が接続されます。

    hoge@raspberrypi:~ $ sudo ps4-waker

    No credentials; Use the PS4 Second Screen App and try to connect to PS4-Waker

    Got credentials! { ‘client-type’: ‘i’,
    ‘auth-type’: ‘C’,
    ‘user-credential’: ‘8d4b8bfdfa242d17801d8cd9250bfa7c4aca7bc0839190d4adf743d142cdaaee’ }
    Go to ‘Settings -> PlayStation(R) App Connection Settings -> Add Device’ on your PS4 to obtain the PIN code.
    Pin code>
    Pin is required

    “Logged into device! Future uses should succeed” と表示されれば成功です。

  13. プレステ4 で [設定]-[PlayStation App接続設定]-[機器を登録する] を選択すると PINコードが表示される
    [設定]-[PlayStation App接続設定]-[機器を登録する] を選択すると PINコードが表示される
  14. ラズパイで PIN コードを入力
    [pin-code] はテレビに表示されてた PIN コード に置き換えて実行してください。

    sudo ps4-waker –pin [pin-code]

    ここまで行うとラズパイからコマンドを実行するとプレステ4 が操作できます。

 

ここまで行うとラズパイからコマンドを実行するとプレステ4 が操作できます。
2018/03/04 時点で起動やスタンバイ、トルネの起動がコマンドで実行できました。

PS4 起動

sudo ps4-waker

PS スタンバイ

sudo ps4-waker standby

トルネ起動

sudo ps4-waker start CUSA00442

※CUSA00442 は torne の ID

PlayStation4 の起動、スタンバイ、Torne 起動以外にも、操作キー、Enter、戻るなどの操作が可能です。

 

Firebase 初期設定

Firebase のデータベース機能を使って IFTTT で入力した単語を格納します。
そして Firebase のデータベースが格納(更新)された場合に、ラズパイへ操作に該当する単語を送るために使います。

  1. Firebase 公式ページにアクセス
  2. [使ってみる] をクリック
    [使ってみる] をクリック
  3. [プロジェクトを追加] をクリック
    [プロジェクトを追加] をクリック
  4. [プロジェクト名]を入力して、[国/地域] を選択。最後に [プロジェクト作成] をクリック
    ※仮にプロジェクト名 “SmartHome” とします
    ※プロジェクト ID が漏洩すると第三者が DB に書き込めるようになるため取扱に気をつけましょう
    [プロジェクト名]を入力して、[国/地域] を選択。最後に [プロジェクト作成] をクリック
  5. プロジェクト作成後 [次へ] クリック
    [ウェブアプリに Firebase を追加] をクリック
  6. [ウェブアプリに Firebase を追加] をクリック
    [ウェブアプリに Firebase を追加] をクリック
  7. [コピー] をクリック
    [コピー] をクリックコピーした firebase confing は後ほど使うので控えておきます。

    <script src=”https://www.gstatic.com/firebasejs/4.10.1/firebase.js”></script>
    <script>
    // Initialize Firebase
    var config = {
    apiKey: “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”,
    authDomain: “smarthome-12345.firebaseapp.com”,
    databaseURL: “https://smarthome-12345.firebaseio.com”,
    projectId: “smarthome-12345”,
    storageBucket: “smarthome-12345.appspot.com”,
    messagingSenderId: “xxxxxxxxxxxxxx”
    };
    firebase.initializeApp(config);
    </script>

 

Firebase プロジェクト作成

  1. [Database]-[使ってみる] をクリック
    [使ってみる] をクリック
  2. [スタードガイド] をクリック
    [スタードガイド] をクリック
  3. [ルールタブ] をクリックして以下の内容に書き換えて [公開] をクリック
    [ルールタブ] をクリックして以下の内容に書き換えて [公開] をクリック

    1. {
         “rules”: {
         “.read”: true,
         “.write”: true
         }
      }

     

  4. [データ] タブを開いて、プロジェクトの [+] をクリック
    [データ] タブを開いて、プロジェクトの [+] をクリック
  5. 名前を適当に入力し [+] をクリック
    名前を適当に入力し [+] をクリック
  6. 名前と初期データの値に “” を入力して [追加] をクリック
    ※ここでは以下のように定義しました
    smarthome-xxxx
    |_googlehome
    |_words名前と初期データの値に "" を入力して [追加] をクリック

 

Firebase Listener 設定

  1. ホームディレクトリの下にプロジェクト用ディレクトリを作成

    cd
    mkdir firebase-listener
    cd firebase-listener

  2. プロジェクトを作成する

    npm init

    ※ひとまず全て [Enter] を教えて最後に “yes” を入力。
    プロジェクト作成する

  3. firebase モジュールをグローバルインストールする

    npm install -g firebase –save

  4. PS4 起動アプリを作成する

    vi index.js

    ※apiKey、authDomain、databaseURL、projectId、storageBucket、messagingSenderId は [スタードガイド] てコピーした値に置き換えてください(Firabase 初期設定の “7” を参照)
    ※getJsonData の中で定義された単語と IFTTT の $ に渡された言葉があった場合に任意の動作を行います。

    var firebase = require(“firebase”);

    //firebase config
    var config = {
    apiKey: “xxxxxxxxxxxxxxxxxxxxxxx”,
    authDomain: “xxxxxxxx-xxxxx.firebaseapp.com”,
    databaseURL: “https://xxxxxxxx-xxxxx.firebaseio.com”,
    projectId: “xxxxxxxx-xxxxx”,
    storageBucket: “xxxxxxxx-xxxxx.appspot.com”,
    messagingSenderId: “xxxxxxxxxxxxxxxx”
    };
    firebase.initializeApp(config);

    //database更新時
    const path = “/googlehome”;
    const key = “words”;
    const db = firebase.database();
    db.ref(path).on(“value”, function(changedSnapshot) {
    //値取得
    const value = changedSnapshot.child(key).val();
    if (value) {
    console.log(value);

    //コマンド生成
    const command = getJsonData(value.split(” “)[0], {

    //PS4
    “ps4”: () => {
    const command = “sudo ps4-waker “;
    let word = value.split(” “)[1];
    if (word == “4”) word = value.split(” “)[2];
    const option = getJsonData(word, {
    “起動”: ” “,
    “つけ”: ” “,
    “オン”: ” “,
    “スタンバイ”: “standby”,
    “消し”: “standby”,
    “けし”: “standby”,
    “止め”: “standby”,
    “とめ”: “standby”,
    “停止”: “standby”,
    “ホーム”: “remote ps”,
    “メニュー”: “remote ps”,
    “エンター”: “remote enter”,
    “選択”: “remote enter”,
    “バック”: “remote back”,
    “戻る”: “remote back”,
    “戻って”: “remote back”,
    “オプション”: “remote options”,
    “上”: “remote up”,
    “うえ”: “remote up”,
    “下”: “remote down”,
    “した”: “remote down”,
    “左”: “remote left”,
    “右”: “remote right”,
    “一時停止”: “emote enter”,
    “再生”: “emote enter”,
    “トルネ”: “sudo ps4-waker start CUSA00442”,
    “アマゾン”: “sudo ps4-waker start CUSA03099”,
    “default”: false
    });
    return option ? command + option : option;
    },

    //template
    “xxx”: () => {
    return getJsonData(value.split(” “)[1], {
    “xxx”: “xxx”,
    “default”: false
    });
    },

    //default
    “default”: () => false,

    })();
    console.log(command);

    //コマンド実行
    if (command) {
    const exec = require(‘child_process’).exec;
    exec(command);

    //firebase clear
    db.ref(path).set({[key]: “”});
    }

    }
    });

    //jsonからvalueに一致する値取得
    function getJsonData(value, json) {
    for (let word in json) if (value == word) return json[word]
    return json[“default”]
    }

     

 

IFTTT マイプレット作成

  1. IFTTT の Applet へアクセス
  2. [New Applet] をクリック
    [New Applet] をクリック
  3. [this] をクリック
    [this] をクリック
  4. “Google Assistant” で検索を行い [Google Assistant] をクリック
    "Google Assistant" で検索を行い [Google Assistant] をクリック
  5. [Say a phrase with a text ingredient] をクリック
    [Say a phrase with a text ingredient] をクリック
  6. [What do you want to say?] に “プレステ $”、What’s another way to say it? (optional) に “ぷれすて $” を入力
    ※What do you want to say? は Google Homeが認識する言葉になります。好きなフレーズを入力してください。
    ※$ は任意の言葉が入力され、この後 Firebase へ入力を渡し、最終的にラズパイで受け取ります。
    ※$ には「起動」「停止」などが入力されることを想定しています。
    [What do you want to say?] に "プレステ $"、What's another way to say it? (optional) に "ぷれすて $" を入力
  7. [What do you want the Assistant to say in response?] に “プレステフォーを操作します” と入力し、[Language] を “Japanese” にする
  8. [Create trigger] をクリック
    ※What do you want the Assistant to say in response? はIFTTTの入力があった時に Google Home が喋る言葉を指定します。
  9. [that] をクリック
    [that] をクリック
  10. “Webhooks” で検索を行い [Webhooks] をクリック
    "Webhooks" で検索を行い [Webhooks] をクリック
  11. [Make a web request] をクリック
    [Make a web request] をクリック
  12. 以下のように入力して [Create action] をクリック
    ※[URL] は Firabase 初期設定の “7” でメモした内容を参照してください

    URLhttps://smarthome-xxxxx.firebaseio.com/googlehome/words.json
    MethodPUT
    Content Typeapplication/json
    Body“ps4 {{TextField}}”

    以下のように入力して [Create action] をクリック
    以下のように入力して [Create action] をクリック

  13. [Finish] をクリック
    [Finish] をクリック

 

動作確認

  1. ラズパイで index.js を実行
    ※Ctrl + C で終了します

    node index.js

  2. Google Home で「プレステ 起動」や「プレステ スタンバイ」に反応すれば完成です。
    Google Home で「プレステ 起動」や「プレステ スタンバイ」に反応すれば完成です。

 

index.js を forever を使ってバックグラウンドで永続的に実行しておきましょう。

forever の使い方はコチラを参照してください。

ラズパイに PS4 を GoogleHome から起動できるアプリを導入しました。導入したアプリを forever を使ってバックグラウンドで永続的に起動するように設定しました。 永続起動したいアプリが "app.js" だった場合、簡単な流れとしては以下の 2点だけです。 forever モジュールインストール forever start app.js でバックグラウンドで永続起動 forever のインストール forever モジュールのインストール※"-g" を点けない場合はアプリ単位でインストールが必要ですnpm install -g forever forever ...

 

2018/03/10:Firebase の認証を追加しました。

先日 PS4 をGoogle Home から操作できるように設定を行いました。https://584homes.com/it/raspberry-pi/googlehome-ps40307.html%20= しかし、Firebase のプロジェクトの読み書きが自由に行える状態のため、Webhook で実行している URL が第三者にバレてしまうと、誰でもアクセスできてしまいます。セキュリティ的にも良くないので、ひとまず認証を追加しました。今回追加した設定は firebase 的にはレガシーとなっていますが、何もセキュリティ対策が無いよりはあったほうが良いでしょう。設定自体は数分で完了しました。 ...