Alexaでスマートホーム化した話

この記事はFJCTアドベントカレンダー2018 6日目の記事です。
冬になり寒さが厳しくなってきたこの頃、いかがお過ごしでしょうか。
私はエアコンの頻繁に使うようになったのですが、いつもリモコンがどこにあるかわからなくなって探し回っています。
そういう時間がもったいないのでリモコン無しで、家にある家電を音声操作できるようにしてみました。

### 導入したものと構成

本当は照明やテレビなども操作したいのですが、
あいにく我が家には、赤外線で操作する家電はエアコンしかありませんでした。
せめてテレビ代わりに使っているPS4を操作できるようにしてみました。
エアコンの設定はかなり簡単だったのですが、PS4に関しては少し工夫が必要だったのでした。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/312112/7a84f96f-b838-de72-818f-daa4e2e96f59.png)

### Node-RED Alexa Home Skill Bridge の設定

Node-RED Alexa Home Skill Bridge はAmazon Echoで動作する独自の「デバイス」を作成して、
Node-REDと連携して様々なものを音声で制御できるようにするサービスです。　
[ここ](https://alexa-node-red.bm.hardill.me.uk/) でアカウントを登録し、 `PS4` という名前でデバイスを作成します。　
今回はOn/Off操作のみなのでActionsのon/offのみをチェックします。

![add-devices.PNG](https://qiita-image-store.s3.amazonaws.com/0/312112/7d6b9b8f-219b-e3ad-021f-4b59347592ab.png)


これで、Alexaアプリに `PS4` デバイスが登録できるようになります。

### Amazon Echo の設定
Alexaアプリで Node-RED スキルを有効にします。
有効にすると先程 Node-RED Alexa Home Skill Bridgeで登録した `PS4` デバイスが検出できると思うので追加します。 
この時点では登録のみで操作はできません。 


### PS4-Waker 導入
ps4-waker を導入していきます。
これを利用するには Playstation App を利用した登録が必要です。
Playstation App による登録方法は 公式の [モバイルアプリ接続設定](https://manuals.playstation.net/document/jp/ps4/settings/app.html) で確認できます。 
上記の方法を進めるとPS4の画面に PIN Code が表示されるので `ps4-waker` を実行した際に入力してあげると登録完了です。 
これで、ps4-waker コマンドで PS4を操作できるようになります。

```
$ sudo npm install -g ps4-waker
$ 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': 'credentials' }
Go to 'Settings -> Mobile App Connection Settings -> Add Device' on your PS4 to obtain the PIN code.
Pin code> xxxxxxx
Logged into device! Future uses should succeed
```

ゲームを起動したい場合は `start` 、　スタンバイにしたい場合は `standby` で操作します。

```
$ sudo ps4-waker start titleid
$ sudo ps4-waker standby
```

また titleid はPS4でアプリやゲームを起動した状態で `search` すると確認できます。

```
$ sudo ps4-waker search
{
  "type": "device",
  "statusLine": "200 Ok",
  "statusCode": "200",
  "status": "Ok",
  "host-id": "BC60A7E5FA2A",
  "host-type": "PS4",
  "host-name": "PS4-203",
  "host-request-port": "997",
  "device-discovery-protocol-version": "00020020",
  "system-version": "06020001",
  "running-app-name": "Overwatch",
  "running-app-titleid": "CUSA04065",
  "address": "192.168.1.5"
}
```


### Node-RED の設定
Node－REDを[Node-RED Document](https://nodered.jp/docs/hardware/raspberrypi) を参考にセットアップします

セットアップできたら http://127.0.0.1:1880/ でアクセスしてNode-REDの画面へ行きます。
Node-RED Alexa Home Skill Bridgeと連携するためのパレットを登録する必要があるため、
右上メニュー -> パレット から以下のように検索してパレットを追加します。

![palette.png](https://qiita-image-store.s3.amazonaws.com/0/312112/eead3757-fc60-01d0-3e28-67b9f6b597fb.png)


### PS4操作フローの作成
Alexa -> Node-RED -> PS4 と操作するフローを作成します。 
出来上がったものがこちらです。
![flow.png](https://qiita-image-store.s3.amazonaws.com/0/312112/cccb9100-6e58-0bd9-e7c0-5c095be8645c.png)

各ノードの設定についてみていきます。
homeノードではNode-RED Alexa Home Skill Bridgeで登録したアカウントとデバイスを選択します。
![home.png](https://qiita-image-store.s3.amazonaws.com/0/312112/7a1b46ae-134b-7ae6-6839-63a71a570111.png)



switchノードではAlexaで呼び出したアクションによって条件を分岐します。
ここではOn/Offのみ扱うので以下のような設定になっています。
使えるアクションの詳細は[こちら](https://alexa-node-red.bm.hardill.me.uk/docs#buildFlows)
![switch.png](https://qiita-image-store.s3.amazonaws.com/0/312112/37602e12-f1ac-7e7b-e15b-ed440fbb69ca.png)

changeノードでは分岐した条件で代入する値を指定できます。
![change.png](https://qiita-image-store.s3.amazonaws.com/0/312112/65d9b38a-87be-fed9-5268-5053ab85d1b0.png)


execノードで以下のようなシェルスクリプトを起動するように設定すれば

```
#!/bin/bash

case $1 in
  start)
      eval "ps4-waker start CUSA04065" ;;
  standby)
      eval "ps4-waker standby" ;;
  *)
    echo "unknown command $1" ;;
  esac
```

![exec.png](https://qiita-image-store.s3.amazonaws.com/0/312112/6362d5d6-b128-b44a-3523-cf06ecd38fa7.png)


これでPS4も操作できるようになります。
「Alexa、PS4をつけて」「Alexa、PS4を消して」と言うことで、PS4の起動/停止を操作できるようになりました。


## 最後に
自宅にあるものをできる限り音声操作できるようにしてみました。 
思っていた以上に簡単で、できることも多いなと言う印象でした。 
わかってはいましたが単純な入力を音声のみでできるため、かなり便利です。 
私は一人暮らしの狭い家ですが、家が広かったりいろんな家電があるご家庭だとさらなる効率化が図れそうです。 
スマートホーム化今年のうちに済ませておくのも良いのではないでしょうか。

7日目は、@tunakyonnのクラウドストレージからオブジェクトストレージに移行した話です。