この記事は ギフティ 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
を押下
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>
$ 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
などを利用して動的にコマンドを変えることもできそうなので、試行錯誤して再チャレンジしてみたいと思います。
参考
偉大なる先人たちの知恵に感謝