この記事は ギフティ Advent Calendar 2019 22日目のエントリーです。
はじめに
最近自室のスマート化にハマってます。
スマートリモコンと Alexa を連携してエアコンや照明を声だけで操作できるようにしたり、Slackへの通知を行ったり…。
今回は簡単な設定でできることから少し踏み込んで、かねてより使ってみたかった RaspberryPi (以下、ラズパイ) を使ってさらなるスマート化にチャレンジしてみたと思います。
要件
私の自宅ではテレビの構成が特殊で、
nasne(torne) -> PS4 -> PCモニター
といった感じになっています。
この構成だとテレビをつけようとすると、モニターの電源ON PS4の電源ON トルネを起動 の3ステップを踏む必要があるため非常に面倒です。
そこで今回はラズパイとスマートスピーカー(AmazonEcoh)を使って「Alexa, テレビを点けて」と発話すると
- ラズパイへ通信
-
PS4電源ON -
torne起動
といった流れでテレビを点けることができるように頑張ってみたいと思います。
設計
実はPS4はWiFi経由でのリモートからの操作に標準で対応しており、スマホアプリ等から簡単にアクセスすることができます。
しかし、現時点では Alexa からのアクセスには対応していないため、Alexa と PS4 の間に何かしら処理をかませてあげる必要があります。
「何かしらの処理」について今回は以下のような構成を考えています。
他にも IFTTT から Firebase function をフックしてラズパイを操作するアプローチもあるのですが、その場合「Alexa、〇〇をトリガー」と話しかければならず、ダサさが勝ったので Node-Red を使用しました。
用意するもの
今回はこちらの機器を使用します。
- Amazon Echo 第3世代
- Raspberry Pi3 B+ コンプリートスターターキット
- PS4 Pro
- nasne(PS4用TVチューナー)
実装
Node-Red Alexa Home Skill Bridge の設定
まず Alexa とラズパイの連携を可能にする Node-RED Alexa Home Skill Bridge のアカウント作成からデバイス作成までを行います。
【公式ドキュメント】https://alexa-node-red.bm.hardill.me.uk/docs
- TOP画面の
Registerからアカウントを登録 -
DeviceタブのAdd Deviceを押下
3. `Add New Device` ポップアップの`Name`, `Actions`を設定する
- `Name` - Alexaに話しかける際にトリガーとなる言葉。「Alexa、PS4を〇〇して」
- `On, Off` - Deviceを操作するアクション。「Alexa、〇〇を点けて」「Alexa、〇〇を消して」など
Amazon Echo の設定
ここまで設定できたら登録したデバイスがAlexaで認識できるようになります。
- Alexaアプリでスキルnode-redを有効にする
- 有効後に
node-redアカウントでのログインを求められるので、「Node-Red Alexa Home Skill Bridge の設定」で登録したアカウントでログインする - Alexa「デバイスの検出」で先程
Node-Red Alexa Home Skill Bridgeで登録したDeviceが検出できるので登録しておく
※この時点ではデバイスの登録だけで操作はできません。
ラズパイの設定

今回は Raspberry Pi3 B+ コンプリートスターターキット を購入しました。写真は購入したラズパイちゃん。
ラズパイは最初に Raspbian というラズパイ専用OSをSDカードに突っ込んでインストールする必要があるのですが、スターターキットだとプリインストールされたSDカードも付属するので初期設定が楽でおすすめです(おうちに大量のSDカードがある人はそれ使ったほうがいいかも)。
※ RaspberryPi の初期設定や Raspbian(OS)の導入方法は割愛します。
ラズパイが起動したらコンソールを開き、 Node-RED をインストールしていきます。
【公式ドキュメント】https://nodered.jp/docs/getting-started/raspberrypi
Node-RED の導入
Node-REDは公式のインストール用スクリプトをダウンロードして実行します。
※ スクリプトはこちら
$ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
スクリプトを実行すると進行状況が表示されます。
Running Node-RED install for user pi at /home/pi on raspbian
This can take 20-30 minutes on the slower Pi versions - please wait.
Stop Node-RED ✔
Remove old version of Node-RED ✔
Remove old version of Node.js -
Leave existing Node.js - Node v12.14.0 Npm 6.13.4
Clean npm cache -
Install Node-RED core
Move global nodes to local
Install extra Pi nodes
Npm rebuild existing nodes
Add shortcut commands
Update systemd script
Any errors will be logged to /var/log/nodered-install.log
実はラズパイには Node-RED と Node.js が標準でインストールされているのですがこのスクリプトを実行して最新のバージョンをインストールしています。
※ npm はインストールされていないので本スクリプトで初めてインストールされます。
ps4-waker の導入
ps4-waker とはネットワーク経由でコンソール上からPS4を操作できる npm パッケージです。
こちらのインストールは npm を使用します。(Node-RED 導入時に npm がインストールされているのでここでは npm 自体をインストールする必要はありません)
$ npm install -g ps4-waker
ダウンロードできたら早速実行します。
$ ps4-waker
No credentials; Use Playstation App and try to connect to PS4-Waker
クレデンシャルがねぇよ!!と怒られるので、スマホアプリの「PS4 Second Screen」(iOS , Android) を使用してクレデンシャル情報を取得します。
「PS4-Waker」をタップするとコンソール側に以下のクレデンシャル情報が表示され、PS4から出力されたPINコードを打ち込むよう要求されます。
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> xxxxxxx
PS4の 設定 -> モバイルアプリ接続設定 -> 機器を登録する で表示されたPINコードを入力。

Pin code> #[your ps4 pin code]
Logged into device! Future uses should succeed
上記メッセージが表示されれば PS4-Waker でPS4を操作する準備が整った証拠です。
実際にPS4をスタンバイモードにしてラズパイ側で操作してみましょう。
$ ps4-waker start
standby でスタンバイモードへ
$ ps4-waker standby
ps4-waker でできること
ps4-waker では起動、スタンバイモード以外に色々なことが実行できます。
| コマンド | 実行内容 | 備考 |
|---|---|---|
| start | スタンバイモードから起動 | |
| start [titleID] | 特定のアプリを起動 | PS Store のURL等から取得 |
| remote [key-name...] | [key-name]に対応した操作を行う |
up(上キー)、ps(PSボタン)など |
| search | 起動しているアプリの情報を表示する | |
| standby | スタンバイモードへ |
上記以外にも様々なことができますが、詳しくは 公式のREADME を参照ください。
今回はスタンバイ状態からトルネを起動するため、トルネの titleID を start コマンドに付与してあげます。
$ ps4-waker start CUSA00442
titleID は PS Store のURL等から取得できます。
https://store.playstation.com/ja-jp/product/JA0003-CUSA00442_00-TORNEPS400000000
これでスタンバイ状態からトルネを起動させる準備が整いました。
Node-RED の実行
次に Node-RED を起動させておきます。
ラズパイの少ないメモリを素早く開放するため、 node-red-pi コマンドを利用し、かつ --max-old-space-size として未使用メモリ開放の最大サイズを引数として渡してあげます。
$ node-red-pi --max-old-space-size=256
これでラズパイ側の設定は完了です。
Node-RED エディタで処理フローを作成する
さて、機器側の設定が完了したので最後に Node-RED で【Alexaで「トルネをつけて」と発話したらPS4を起動してトルネを実行する】という処理フローを作成していきます。
Node-REDはGUIで処理フローを作成できます。
エディタはラズパイのブラウザで Node-RED 起動時に表示されているポートにアクセスすると開くことができます。
Server now running at http://127.0.0.1:1880/
ラズパイ側ではなく別途用意してあるPCから操作したい場合はラズパイのIPを指定してアクセスできます。
http://<ip-address>:1880
ラズパイ側のIPアドレスを調べる際は hostname -I を実行しましょう。
$ hostname -I
192.168.X.XX XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
http://192.168.X.XX:1880
アクセスすると下記エディターが表示されます。

今回は以下のようなフローを作成しました。
PS4起動フロー
1. 「Alexa、PS4をつけて」または「Alexa、PS4を消して」と発話する
2. 「つけて」「消して」の発話の違いによって `ps4-waker` で実行するコマンドを変更する
3. 変更されたコマンドを付与して `ps4-waker` を実行する
トルネ起動フロー
1. 「Alexa、トルネをつけて」または「Alexa、トルネを消して」と発話する
2. 「つけて」「消して」の発話の違いによって `ps4-waker` で実行するコマンドを変更する
3. 「つけて」の場合はトルネの `titleID` である `CUSA00442` も付与する
4. 変更されたコマンドを付与して `ps4-waker` を実行する
2つの違いは入力のデバイス名の違いとトルネの場合に titleID を付与するかどうかだけです。
トルネのフローを応用すればプレイしたいゲームを即座に起動させることもできます。
各チャネルの詳細
せっかくなので各ノードの設定を説明していきます。
Alexa Home ノード
Node-Red Alexa Home Skill Bridge で登録、 Alexa アプリ でデバイス登録した機器を取り扱うノードです。
「Alexa、〇〇(登録機器名)を〇〇(登録したアクション名)。」と発話すると処理がスタートします。
こちらのノードを取り扱うには以下の初期設定が必要です。
-
Node-RED本体にnode-red-contrib-alexa-home-skillノードを追加 - ノードの設定にて
Node-Red Alexa Home Skill Bridgeのアカウントを設定 - Alexaに登録してあるデバイスの一覧を取得する
まず、右上の メニュー(≡) -> 設定 からユーザー設定を開き、 パレット タブ -> ノードを追加 タブを選択。
node-red-contrib-alexa-home-skill を追加します。

メニューを閉じ、左のノード一覧から alexa home をドラッグしてエディタ上に置きます。
置かれたノードをダブルクリックして設定画面を開きます。

👆Accountのえんぴつマークを押下してアカウント情報を設定する画面に遷移。

👆Node-Red Alexa Home Skill Bridge で登録したユーザの Username , Password を入力して「追加」ボタンを押下する。

👆Device のリフレッシュマークを押下してデバイス一覧を取得する。
上記設定を行い、デバイスを選択すると無事発話したデバイスのフローが作成できるようになります。
switch ノード
直前のノードから渡されたパラメータによって処理を分岐させます。
今回はAlexaに発話した際のアクションが入る msg.command の文字列によって分岐させています。
簡単に「ON、OFF」のみのアクションなので TurnOnRequest , TurnOffRequest のみの分岐。

※ Node-Red Alexa Home Skill Bridge による msg.command の文字列は 公式ドキュメント を参照。
change ノード
渡された値に代入したり、削除したり、置換したりすることができるノードです。
今回は switch ノードの分岐から処理が走るので、 msg.payload に ps4-waker のコマンドを代入しています。
msg.payload に代入した値は次のノードにより以下のように実行されます。
$ ps4-waker <msg.payload>
トルネを起動する場合などは `start` の後に`titleID`を記述してあげましょう。
$ ps4-waker start CUSA00442
exec ノード
シェルのコマンドを実行します。
引数に標準で msg.payload を与えることができるので、 change ノードで代入した値をそのままコマンドとして使えます。

以上で Node-RED の処理フローの作成が完了しました。
エディター右上の「デプロイ」を押してラズパイにデプロイしましょう!

Node-RED の自動起動設定
いちいちラズパイ起動後にコンソールで Node-RED を起動するのは面倒なので自動起動の設定をしておきます。
sudo systemctl enable nodered.service
これでラズパイの電源を入れると自動で Node-RED が起動するようになりました。
デモ
ついでにデスストも立ち上がるようにしてみました。アプリ→アプリのスイッチングにも対応してます。 pic.twitter.com/p0w0drXcUd
— ごはん (@okomeshino) December 22, 2019
![]()
さいごに
今回特に難しい技術は利用しておらず、比較的簡単に Alexa , Raspberry Pi の連携ができました ![]()
お部屋のスマート化はモチベーションに繋がりやすいので是非挑戦してみたください。
ただ、今回の Node-RED を使用するやり方だだといちいちデバイスを1から登録する必要があるため、トルネ以外のアプリケーションも立ち上げようとした際にとても面倒です。
このあたりは Alexa のスキルを作成したり Firebase などを利用して動的にコマンドを変えることもできそうなので、試行錯誤して再チャレンジしてみたいと思います。
参考
偉大なる先人たちの知恵に感謝 ![]()


