Amazon Echoで「○○をつけて」と言って家電を操作する

## はじめに

Amazon Echo + Nature Remoで照明やテレビなどの家電を操作できるようにしました。スマートスピーカーやスマートリモコンは発展途上のため、まだ呼び出し方法にクセがありますが、試行錯誤の上でいい感じに操作できるようになりました。そこで、考え方ややり方を情報共有します。

![AmazonEcho.jpg](https://qiita-image-store.s3.amazonaws.com/0/15802/6b58307a-9cf9-3774-49e0-be5193973736.jpeg)

ここではスマートリモコンとしてNature Remoを使っていますが、他のスマートリモコンでも応用できそうです。スマートスピーカーが成熟するとこのような工夫は不要になるでしょうが、逆にハックする楽しみを味わえるのは今ならではです。

最終的に、Node-RED Alexa Home Skill Bridgeという仕組みを使いました。詳しくは後述します。

![Node-RED.png](https://qiita-image-store.s3.amazonaws.com/0/15802/15d624e3-f01e-5f07-83c0-f229196d57b3.png)

### 操作する家電

 * リモコン操作のシーリングライト (On/Off, 明暗操作可)
 * テレビ (Bravia)
 * PlayStation4 (torne)

### 用意するもの

 * Amazon Echo
 * Nature Remo (赤外線リモコン、照明操作用)
 * MacBook Pro (PS4およびテレビ操作用、Raspberry Piでも可)

### できること

自然な呼びかけで家電を操作できます。

* 照明の制御
  * 「アレクサ、電気をつけて」で照明をONにする
  * 「アレクサ、電気をけして」で照明をOFFにする
  * 「アレクサ、電気を暗くして」、「アレクサ、電気を明るくして」で照明の明るさを変える
* テレビの制御
  * 「アレクサ、テレビをつけて」でTVの電源を入れる
  * 「アレクサ、テレビをけして」でTVの電源を消す
  * 「アレクサ、テレビを○にして」でTVのチャンネルを変える（○には数字が入る）
* PS4の制御
  * 「アレクサ、トルネをつけて」でPS4の電源を入れてtorneを立ち上げる
  * 「アレクサ、トルネをけして」でPS4をスリープする
 
## Amazon Echoで家電を操作する方法

結論を知りたい方はこの節は読み飛ばしてもらってかまいません。Amazon EchoとNature Remoを使って機器を操作する方法はいくつかあり、それぞれ一長一短です。「アレクサ、○○をトリガー」という呼び掛け方法が気にならないのであれば、IFTTTを使う方法がシンプルです。「アレクサ、テレビをつけて」と自然に呼び掛けたいのであれば、Node-RED Alexa Home Skill Bridgeを使う方法が（それなりに）お手軽です。

### 方法1. Amazon Echo → IFTTT → Nature Remo → 各種機器

スマートスピーカーを拡張する方法の定番であるIFTTTを使います。Nature RemoはIFTTTから呼び出せるため、スマホだけでも設定できます。

* 操作方法: 「アレクサ、テレビをトリガー」
* メリット: 仕組みがシンプル
* デメリット: IFTTTを起動するために「○○をトリガー」と呼び掛けないといけない。Google Homeだと自然に呼び出せるのに…。

> alexaからIFTTTの「特定のフレーズ」を使う場合、日本語では「アレクサ、◯◯（を）トリガー」と言う必要がある（英語なら "alexa, trigger xxxxx."）。

[比べてわかった、Google HomeとAmazon Echoの大きな違い - Qiita](https://qiita.com/monoqlo/items/6d1b628291a5e3c26c79)

参考サイト

* [Amazon Echoから日本語で家電を操作 — Nature](http://nature.global/jp/ifttt-setup/2017/11/23/amazon-echo)* 

### 方法2. Amazon Echo → Nature Remo (カスタムスキル) → Nature Remo → 各種機器

Nature Remoが提供するスキルを使う方法です。まだエアコンにしか対応していませんが、いずれはこの方法が主流になるでしょう（なってほしい）。

* 操作方法: 「アレクサ、リモでエアコンをつけて」
* メリット: 仕組みがシンプル
* デメリット: 「リモで」とスキル名をつけて呼び掛けないといけない。Nature Remoスキルは2017年12月時点でエアコンのみ対応のため、テレビや照明は操作できない。

参考サイト

* [Amazon Echoと直接連携してエアコンを操作できるようになりました！！ — Nature](http://nature.global/jp/blog/2017/12/20/amazon-echo)

### 方法3. Amazon Echo → Alexa Skills Kit (カスタムスキル) → AWS lambda  → AWS IoT → RaspberryPi → 各種機器

Nature Remoスキルがエアコン以外に対応していないなら自分で作ってしまえという訳で、自作スキルを作る方法。Amazon Echoはスキルを手軽に作れるのがよいですね。[公式ドキュメント](https://developer.amazon.com/ja/alexa-skills-kit)が日本語かつ分かりやすいのも素晴らしいです。

* 操作方法: 「アレクサ、リモコンでテレビをつけて」、「アレクサ、リモコンでテレビを4にして」
* メリット: 柔軟に動作を制御できる。
* デメリット: 「リモコンで」とスキル名をつけて呼び掛けないといけない。スキル作成が少し手間。ローカルでの制御機器 (RaspberryPi) が必要。

参考サイト

* [Amazon Echo で TVリモコン操作への道 (RPizero & AWSIoT & Lambda & AlexaSkill) 前編 - Qiita](https://qiita.com/toguma/items/57d6faed119c41bd4332)
* [Amazon Echo で TVリモコン操作への道 (RPizero & AWSIoT & Lambda & AlexaSkill) 後編 - Qiita](https://qiita.com/toguma/items/4ae98442ccc1f0fc5b93)

### 方法4. Amazon Echo → Alexa Skills Kit (スマートホームスキル) → AWS lambda  → AWS IoT → RaspberryPi → 各種機器

Alexaにはカスタムスキルとスマートホームスキルがあります（通知用のフラッシュブリーフィングスキルもあるがここでは省略）。カスタムスキルは柔軟に動作を指定できる反面、呼び掛けにスキル名を含める必要があります。スマートホームスキルはその名の通りスマートホーム用のAPIのため、「アレクサ、照明をつけて」のように自然な呼びかけで操作できます。

2017年12月時点で日本語に対応しているのが[照明およびスイッチのみ](https://developer.amazon.com/ja/docs/smarthome/develop-smart-home-skills-in-multiple-languages.html#decide-languages)であり、エアコンやテレビ（エンターテイメント端末）は日本語に未対応です。そのため、テレビのチャンネルや音量操作には工夫が必要です。今後の成熟に期待です。

参考サイト

* [Amazon Echo(Alexa)で今できないことを雑にまとめてみた - sparkgene’s blog](http://sparkgene.hatenablog.com/entry/2017/12/08/080000)
* [スキルの種類について | ASK](https://developer.amazon.com/ja/docs/ask-overviews/understanding-the-different-types-of-skills.html)


### 方法5. Amazon Echo → Node-RED Alexa Home Skill Bridge (スマートホームスキル) → Node-RED (ローカル) → Nature Remo → 各種機器

「アレクサ、照明をつけて」という自然な呼びかけを実現するには、スマートホームスキルに対応したスマートリモコンを購入するか、自分専用のスマートホームスキルを1から作るか、Google Homeを買い足すか…と考えていたところ、[Node-RED Alexa Home Skill Bridge](https://alexa-node-red.bm.hardill.me.uk)を使うことでスマートホームスキルを簡単に使うことができました。Node-REDはIoT向けのデータ処理ツールで、Yahoo! PipesやPlaggerのように処理をパイプでつなげてデータフローを作れるのが特徴のようです。

![Node-RED](https://qiita-image-store.s3.amazonaws.com/0/15802/51420231-bce2-a24c-f8f8-da415101e087.png)

Node-RED Alexa Home Skill BridgeはAlexaのスマートホームスキルとNode-REDを繋げてくれるブリッジです。面倒なAlexaスマートホームスキル周りの処理を書く必要がなくなります。
また、Alexaのスキル呼び出しは基本的にインターネットに公開されたサーバ で受け取るため、自宅のローカル環境でデータを受け取るにはAWS IoTやFirebaseやngrokを経由するなどの工夫が必要なのですが、Node-RED Alexa Home Skill Bridgeはこのインターネット→ローカル環境へのデータやりとりも担当してくれます。
Node-RED Alexa Home Skill Bridgeを使えば、Node-REDだけでAmazon Echoへの呼び掛けに対応する仕組みを作ることができます。ネットでは、Node-RED Alexa Home Skill Bridgeは日本語に未対応との情報がでてきますが、最近日本語にも対応したようです。

参考サイト

* [とうとうAlexaが家電をコントロール。Raspberry PiでBroadlink RM mini 3がちゃんと使えた。](http://dolls.orz.hm/?p=13447)
* [Echosim.ioを使うと日本でもAlexaでSmart Homeを実現できるので、安価なBlack Beanで照明やエアコンを制御してみた - 知的好奇心 for IoT](http://intellectualcuriosity.hatenablog.com/entry/2017/05/12/201643)
* [Amazon Echoとラズパイで、音声で照明をon/offする - Qiita](https://qiita.com/kikuzo/items/753b5065dde9633bda18)
* [Node-RED Alexa Home Skill Bridge](https://alexa-node-red.bm.hardill.me.uk)


## Amazon Echo + Macbook Pro + Nature Remoで家電を操作するための設定手順

Node-REDとNode-RED Alexa Home Skill Bridgeを使って、Amazon Echoから家電を操作する仕組みを設定していきます。

### 手順1. Node-RED Alexa Home Skill Bridgeのセットアップ

Node-RED Alexa Home Skill Bridgeにユーザ登録し、操作したい家電情報を追加していきます。手順は、以下サイトの説明が分かりやすいです。

[【IoT】４．Node-REDの設定をしてみる - そこらへんのパパの独り言](http://sokora.hatenablog.com/entry/2017/12/13/%E3%80%90IoT%E3%80%91%EF%BC%94%EF%BC%8ENode-RED%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)

1. [Node-RED Alexa Home Skill Bridge](https://alexa-node-red.bm.hardill.me.uk)にアクセスし、Registerからユーザ登録する
2. Devices → Add Deviceで新しい機器を登録する

![Node-RED_Alexa_Home_Skill_Bridge.png](https://qiita-image-store.s3.amazonaws.com/0/15802/e8e75f41-e564-27ed-b447-8ad74d81f5f4.png)

機器の登録ではNameとDescriptionに（自分が）分かりやすい名前をつけます。ここでつけた名前は、Amazon Alexaアプリのスマートホームデバイスと、Node-REDの呼び出しで使われます。Amazon Echoから呼び掛けるときに使う名前は、後からAmazon Alexaアプリで変えられるのでここで気にする必要はありません。

Actionsは機器の操作方法に応じて指定します。「照明をつけて」、「照明をけして」だけであれば、On, Offにチェックを入れます。「照明を明るくして」、「照明を暗くして」のように明るさまで操作したい場合は、+%, -%にもチェックを入れます。もちろん、照明やスマートリモコンが明るさの操作に対応していることが前提です。また、前述の通り、現時点では日本語で使えるスマートホームスキルは限られているため、エアコンの温度設定や温度取得のActionは使えません。

ここでは、照明、テレビ、torneの3つのデバイスを登録しました。テレビのActionに明るさ設定 (%, +%, -%) を設定しているのは、テレビのチャンネルや音量を（むりやり）操作するためです。

![Node-RED_Alexa_Home_Skill_Bridge 2.png](https://qiita-image-store.s3.amazonaws.com/0/15802/2a614fb7-92d6-2ab1-8614-e00c8cf39968.png)

### 手順2. スマートホームスキル (Node-RED) とデバイスを追加する

スマホのAmazon Alexaアプリか https://alexa.amazon.co.jp/ を使って、先ほど登録したデバイスを有効にします。

1. スキルで「Node-RED」を検索
2. 「スキルを有効にする」を選択
3. Node-RED Alexa Home Skill Bridgeのログイン画面が表示されるので、手順1で登録したIDとパスワードでログイン

これで先ほど登録した照明、テレビ、torneがAmazon Alexaアプリからも見えるようになります。

<img width="375" alt="IMG_F157CDB91730-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/15802/dd9ebda7-e037-be1e-bfdd-467b8838f85c.jpeg">

この時点で、Amazon Echoへ「アレクサ、照明をつけて」と呼び掛けることができるようになります。まだローカル環境を作っていないので、呼び掛けてもテレビがつくわけではありません。

### 手順3. ローカル環境にNode-REDをインストールする

Amazon Echoに「アレクサ、照明をつけて」と呼び掛けたときの処理を作っていきます。ここからはクラウドではなく、ローカル環境にNode-REDをインストールして作業していきます。お手軽にいつも使っているパソコン (ここではmacOS 10.13, High Sierra) を使いました。省電力で常に起動するなら、Raspberry Piを別途用意してもいいでしょう。

[Node-RED日本ユーザ会  : インストール](https://nodered.jp/docs/getting-started/installation)の手順を参照しながら、npmを使ってnode-redをインストールします。

```
$ brew install npm
$ sudo npm install -g --unsafe-perm node-red
```

node-redコマンドを実行すると、node-redが起動します。

```
$ node-red
31 Dec 17:30:15 - [info]

Welcome to Node-RED
===================

31 Dec 17:30:15 - [info] Node-RED version: v0.17.5
31 Dec 17:30:15 - [info] Node.js  version: v9.3.0
31 Dec 17:30:15 - [info] Darwin 17.3.0 x64 LE
31 Dec 17:30:15 - [info] Loading palette nodes
31 Dec 17:30:17 - [warn] ------------------------------------------------------
31 Dec 17:30:17 - [warn] [rpi-gpio] Info : Ignoring Raspberry Pi specific node
31 Dec 17:30:17 - [warn] ------------------------------------------------------
31 Dec 17:30:17 - [info] Settings file  : /Users/machu/.node-red/settings.js
31 Dec 17:30:17 - [info] User directory : /Users/machu/.node-red
31 Dec 17:30:17 - [info] Flows file     : /Users/machu/.node-red/flows_macbookpro.local.json
31 Dec 17:30:17 - [info] Server now running at http://127.0.0.1:1880/
31 Dec 17:30:17 - [info] Starting flows
31 Dec 17:30:17 - [info] Started flows
```

`Server now running at http://127.0.0.1:1880/` と出力されているとおり、MacのWebブラウザで http://127.0.0.1:1880/ にアクセスするとNode-REDの画面がでてきます。

次に、Node-RED Alexa Home Skill Bridgeと連携するためのパレット（プラグイン）をインストールします。

1. 右上のハンバーガーメニューから「パレットの管理」→「Palette」→「ノードの追加」を選択
2. 「alexa-home」で検索し「node-red-contrib-alexa-home-skill」が表示されたら「ノードの追加」を選択

![Node-RED 4.png](https://qiita-image-store.s3.amazonaws.com/0/15802/5e27b691-6f44-dba1-e029-788d645a378c.png)

これで画面右下にalexa用のパレットが追加されます。

### 手順4. Node-REDで家電操作のフローを作成する

引き続き、[【IoT】４．Node-REDの設定をしてみる - そこらへんのパパの独り言](http://sokora.hatenablog.com/entry/2017/12/13/%E3%80%90IoT%E3%80%91%EF%BC%94%EF%BC%8ENode-RED%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)の手順を参考。

Amazon Echoからの呼び出しをNode-REDで受け取って、照明を操作するコマンドを実行するフローを作ります。最終的に作ったフローはこちらです。

![Node-RED 5.png](https://qiita-image-store.s3.amazonaws.com/0/15802/db05a9a9-c3fa-8c24-40a0-c8a5a10e44dd.png)

Amazon Echoからの呼び出しを受け取り、Actionの内容（つける、消す、明るくする、暗くする）で分岐させて、シェルスクリプトに渡す引数を設定しています。Node-REDを使うのは初めてでしたが、直感的に作ることができました。

alexa-homeノードの設定です。Accountの右のペンアイコンをクリックすると、Node-RED Alexa Home Skill Bridgeへログインできます。ログインすると、Node-RED Alexa Home Skill Bridgeに登録したデバイス一覧がDeviceに表示されます。照明を操作するフローを作りたいので、Deviceは照明を選択します。

![Node-RED 6.png](https://qiita-image-store.s3.amazonaws.com/0/15802/74c9c673-ec1f-8d43-99bd-8452793b984c.png)

Auto Acknowledgeにチェックを入れています。これは、Amazon Echoへ自動で応答を返すためです。[公式ドキュメント](https://alexa-node-red.bm.hardill.me.uk/docs#buildFlows)を読むと、alexa home respを使うことで応答をカスタマイズできるようです。

次のswitchノードは、Amazon Echoで呼び出したActionによって処理を分岐します。Actionの種類は、msg.commandというプロパティに格納されています。TurnOnRequest, TurnOffRequest, IncrementPercentageRequest, DecrementPercentageRequestは、手順1でNode-RED Alexa Home Skill Bridgeに登録したOn, Off, +%, -%に対応しています。使えるActionは[公式ドキュメント](https://alexa-node-red.bm.hardill.me.uk/docs#buildFlows)参照のこと。

![Node-RED 7.png](https://qiita-image-store.s3.amazonaws.com/0/15802/55ddec21-3477-2ae5-504d-6eeb92878934.png)

次のchangeノードでは、後続のシェルスクリプト (この場合はlight.sh) に渡す引数を、msg.payloadとして設定しています。照明をつけるTurnOnRequestの場合は、msg.payloadにonを代入しています。この値はシェルスクリプトの仕様に合わせて決めていきます。

![Node-RED 8.png](https://qiita-image-store.s3.amazonaws.com/0/15802/72676ca5-473c-d598-1beb-c15db369a618.png)

最後にシェルスクリプトを実行します。後述しますが、light.shはNature Remoを使って照明をつけるスクリプトです。引数に指定しているmsg.payloadは、直前のchangeノードで値を代入していましたね。

![Node-RED 9.png](https://qiita-image-store.s3.amazonaws.com/0/15802/17fe3b0d-1d1a-ca42-03c4-a4a4af7e0595.png)

これで、Amazon Echoに「照明をつけて」と呼び掛けると、light.shにon引数をつけて実行する仕組みができました。同じ仕組みで「照明をけして」と呼び掛けると、off引数付きでlight.shが実行されます。

今回はNode-REDを使って分岐や引数の設定をしましたが、Rubyなりnode.jsなりPythonなり、普段使い慣れている環境でプログラムを書いてもよいでしょう。

#### テレビのチャンネルを変更できるようにする

照明と同じ要領でテレビとtorneのフローも作りました。

![Node-RED.png](https://qiita-image-store.s3.amazonaws.com/0/15802/308075ae-c5b8-68fa-3125-f9605ed35403.png)

ひとつ工夫したのは、TVのチャンネル切り替えを実現するためにSetPercentageRequestを使っているところです。本来は「照明の明るさを40%にして」のように使うものですが、「テレビを4にして」と呼び掛けても動きました。そこで、SetPercentageRequestを使ってチャンネル指定をしています。IncrementPercentageRequestとDecrementPercentageRequestも本来は「照明を明るくして/暗くして」のように使うものですが、音量の上げ下げに使っています。こちらは「テレビを明るくして/暗くして」という呼びかけになるのでイマイチです。

![Node-RED 10.png](https://qiita-image-store.s3.amazonaws.com/0/15802/1e8754be-179b-1542-3ca2-9437f4b55a23.png)

### 手順5. シェルスクリプトからNature Remoを使って照明をつける

スマートリモコンの[Nature Remo](http://nature.global)はスマホアプリやIFTTT経由のインタフェースしかなく、APIもまだ公開されていません。ただし、内部ではIRKit相当のAPIを持っているようです。

[IRKit - Open Source WiFi Connected Infrared Remote Controller](http://getirkit.com)

Nature Remoは本体内にはリモコンのデータを保持していません。そのため、IRKitのAPIを使ってNature Remoを操作する場合は、リモコンデータを送信側から指定します。

1. Nature RemoのIPアドレスを取得する
2. リモコンの赤外線情報をNature Remoを使って取得する
3. 取得した赤外線情報をNature Remo経由で送信する

IRKitとは、IPアドレスの取得方法が少し違います。IRKitは `_irkit._tcp` ですが、Nature Remoは `_remo._tcp` となります。

```
$ dns-sd -B _remo._tcp
```

ちょっと雑ですが、引数に合わせて赤外線情報を送るシェルスクリプトをこんな感じで作りました。このスクリプトを手順4のNode-REDから呼び出すことで、照明のON/OFFが可能です。

```bash
#!/bin/bash

case $1 in
  on)
    # 照明ON
    curl -i "http://192.168.1.21/messages" -H "X-Requested-With: curl" -d '{"format":"us","freq":36,"data":[3409,1790,（中略）,1352,382]}';;
  off)
    # 照明OFF
    curl -i "http://192.168.1.21/messages" -H "X-Requested-With: curl" -d '{"format":"us","freq":35,"data":[3408,1790,（中略）,497,375]}';;
  bright)
    # 明るくする
    curl -i "http://192.168.1.21/messages" -H "X-Requested-With: curl" -d '{"format":"us","freq":36,"data":[3413,1787,（中略）,490,389]}';;
  dark)
    # 暗くする
    curl -i "http://192.168.1.21/messages" -H "X-Requested-With: curl" -d '{"format":"us","freq":36,"data":[3413,1789,（中略）,1333,390]}';;
  *)
    echo "unknown command $1"
esac
```

### 手順6. テレビやtorneを遠隔から操作できるようにする

基本的な考え方は照明のときと同じです。テレビは照明と同じくNature Remoで操作しても良いのですが、うちのテレビ (Sony Bravia) はネットワーク経由でも操作可能でした。そこで、[alanreid/bravia: Control your Sony Bravia TV using nodejs](https://github.com/alanreid/bravia)を使って操作するようにしました。

```javascript
#!/usr/bin/env node

var bravia = require('bravia');
// Accepts two parameters: IP and PSKKey
bravia('192.168.1.47', 'PSKKey', (client) => {
  var command = process.argv[2];
  // console.log(command);
  if (command == "help" || command == null) {
    // List available commands
    client.getCommandNames((list) => {
      console.log(list);
    });
  } else if (command == "VolumeUp" || command == "VolumeDown") {
    for (var i = 0; i < 3; ++i) {
      console.log(`Exec ${command}`);
      client.exec(command);
    }
  } else {
    console.log(`Exec ${command}`);
    client.exec(command);
  }
});
```

PS4のtorneを起動するには、[dhleong/ps4-waker: Wake your PS4 over LAN](https://github.com/dhleong/ps4-waker)を使います。以下のコマンドでtorneを起動できるので、これをNode-REDから指定します。

```
$ ps4-waker start CUSA00442
```

参考: [Google Homeに話しかけてPS4を操作してみる - Qiita](https://qiita.com/miso_develop/items/0175c5f45a1e90464234)

## まとめ

有料βで発展途上のAmazon Echoですが、工夫することで「○○をつけて」という自然な呼びかけで家電を操作できるようになりました。ほとんどがNode-RED Alexa Home Skill Bridgeのおかげです。現時点ではGoogle Home + IFTTTを使う方が楽でしょうが、こうやって自分でいろいろ使ってみるのも楽しいですね。Amazon Echoはハードウェア的にはなかなか良いので、これからのソフトウェアの発展に期待です。

作ったスクリプト類はGitHubにおきました。 → [machu/smarthome](https://github.com/machu/smarthome)

続きを書きました。
[Amazon Echoに「アレクサ、NHK」、「アレクサ、日テレ」と呼び掛けてテレビのチャンネルを変える - Qiita](https://qiita.com/machu/items/4cb2654eb60b9e1e5c3f)