Amazon Echoとラズパイで、音声で照明をon/offする

### はじめに (Alexaで家の任意の機器を制御したい)

Amazonのスマートスピーカー、Echo (やEcho Showなど)は、音声で家電などを制御できて非常に未来的な感じで楽しいのですが、操作できるのは基本的には対応デバイスだけです。

ですが、APIは公開されているので、対応機器以外でも操作できるようにする方法はあるだろうと思っていました。そして探してみたらやっぱりありました。

[Echosim.ioを使うと日本でもAlexaでSmart Homeを実現できるので、安価なBlack Beanで照明やエアコンを制御してみた](http://intellectualcuriosity.hatenablog.com/entry/2017/05/12/201643)

キモは[Node-RED Alexa Home Skill Bridge](https://alexa-node-red.bm.hardill.me.uk)で、これが**Node-REDで記述可能な、Alexaから操作できるデバイスを定義してくれるサービス**です。このサービスを使えば、家の任意のデバイスをAlexa(Echo)上に見せられるのです！！

上の例では、このサービスと赤外線リモコンとしてRM Mini 3を組み合わせて使っていますが、ここでは、RM Mini 3の代わりに**大宮技研の[irMagician](http://www.omiya-giken.com/?page_id=837)**を使って実現してみます。

使った機材などは以下の通り。

- Amazon Echo (機種はどれでも大丈夫)
- Raspberry Pi (今回実際に使ったのはRaspberry Pi Zero W)
- irMagician ([適当なショップ](http://www.omiya-giken.com/?page_id=1790)で4000円弱)
- Node-RED (OSS。ラズパイ上で動かします)

その他、接続ケーブルや無線LAN環境などが必要です。

設定の順番としては大体以下の通り。辻褄が合っていれば下記の通りやらなくても大丈夫なはず。

1. ラズパイとNode-RED環境のセットアップ
2. Node-RED Alexa Home Skill Bridgeの設定
3. Node-REDと赤外線モジュール(irMagician)の設定
4. Amazon Echoでの設定

では以下に。

### 1. ラズパイとNode-RED環境のセットアップ

まず、ラズパイの設定から。

今回はあんまり関係ないけど、一応パッケージリストを最新にしておきます。

```$ sudo apt-get update```

OSはRaspbian Jessie Liteを使っている場合はデフォルトではNode-RED入ってないので、以下のコマンドでNode-RED環境をセットアップします。

```
$ bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)
```

Raspberry Pi Zero Wでうちの環境だと40分かかりました。終わったら、リブートしてもNode-REDが自動起動するように設定しておきます。

```
$ sudo systemctl enable nodered.service
```

なお、Node-REDのセットアップについては([このあたり](https://nodered.jp/docs/hardware/raspberrypi#upgrading))を参照してください。

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

一旦ラズパイから離れて、[Node-RED Alexa Home Skill Bridge](https://alexa-node-red.bm.hardill.me.uk)でアカウントを作成し、更にデバイスを作成します。ここで(仮想的な)デバイスを作っておくと、そのデバイスがEchoから見えるようになります。

アカウント作成は、画面左上の「Register」から。

アカウントを作成し終わったら、デバイスを作成します。どういうデバイス設定にしたらAlexaで何が出来るようになるのかが、ちょっとわかりにくいのですが(おそらく、Alexa Home Skillsに精通していれば分かるのでしょう)、

- 対象デバイスをon/offしたい → ActionsのOn/Offのチェックボックスをチェック
- 対象デバイスの加減を少しずつ変更したい → Actionsの%,+%,-%をチェック

です。照明に関してはこれでOK。その他、色温度とかロックとかも使えるようなので、スマートロックとかも操作できるように設定できそうです(未トライ)。

![skillbridge1.PNG](https://qiita-image-store.s3.amazonaws.com/0/172921/ceae816c-032f-927f-77fa-16802a7b3bfa.png)

このサイトでの設定はこれで終わり。

### 3. Node-REDと赤外線モジュール(irMagician)の設定

再びラズパイ上の設定に戻ります。

#### irMagicianの設定

まず、Node-RED抜きに、赤外線デバイスだけで使えるような状態にします。

基本的には、[ここ](http://www.omiya-giken.com/?page_id=889)と[ここ](http://www.omiya-giken.com/?page_id=1231)に書いてあるとおりですが、

- on/offさせたい照明の赤外線パターンを学習してファイルに落としておく
- ファイルを読み込んでon/offパターンの赤外線を送信するコマンド(1ライナー)を作る

です。私は、上記の大宮技研のページにある、cap.py, play.py, saveIrMagician.py, playIrMagicianLocal.pyをそれぞれ持ってきて適当なディレクトリにセーブし、

```
$ python ./cap.py
(ここでリモコンの「点灯」ボタンを押す)
(リモコンボタンで照明を消灯する)
$ python ./play.py (再生させて、正しく点灯するか確認)
$ python ./saveIrMagician.py on.dat (学習したパターンをon.datというファイル名でセーブ)
```
(ログ取り忘れたのでうろ覚えですが、実行するのにsudo必要かも...)

というような感じで実行・学習させ、on.dat(点灯), off.dat(消灯), dim.dat(減光)を作成しました。なお照明機器はNEC製のものです。

なお、irMagicianはシリアルポート上に見えるので、それぞれのコマンドを実行させるには、pyserialというpythonパッケージをインストールする必要があります。

```
$ sudo apt-get install python-pip
$ sudo pip install pyserial
```

これで、こんな感じでラズパイから照明をつけたり消したり出来るようになります。

```
$ python ./playIrMagicianLocal.py on.dat (点灯する場合)
$ python ./playIrMagicianLocal.py off.dat (消灯する場合)
$ python ./playIrMagicianLocal.py dim.dat (減光する場合)
```

なお、playIrMagicianLocal.pyは、大宮技研のサイトに載っているコードはネットワークにデータを読みに行くようになっているので、ローカルのファイルを読む場合は、該当箇所(7, 19, 20行目)のコメントアウトの入れ替えが必要です。

#### Node-REDの設定

赤外線コマンドが使えるようになったら、Alexaからの指示を受けてNode-Redがそのコマンドを呼び出すように設定します。

まずラズパイ上で

```
$ node-red-start
```

としてnode-REDを起動させ、ブラウザで、http://xxx.xxx.xxx.xxx:1880/ にアクセスします(xxxの部分はラズパイのIPアドレス)。

素のNode-REDはもちろんAlexaからの指示を受け付けられません。そこでNode-RED Alexa Home Skill Bridgeと対になる「node-red-contrib-alexa-home-skill」をNode-RED上でインストールします。(このあたりは冒頭でご紹介した記事に詳しいので割愛します。)

その上で、作成したフローはこんな感じ。

![nodered-config3.PNG](https://qiita-image-store.s3.amazonaws.com/0/172921/221d719f-eb98-9a22-c7f1-ad3378f8fcc8.png)

フローの左側、スタート部分の「Light」の部分が、Node-RED Alexa Home Skill Bridgeに接続しコネクションを張った状態にして、Echoからの指示をHome Skill
 Bridge経由で受け付けます。受け付けた指示を「Switch」部分で判定し、内容に応じてon/off/dimを実行するexecノードに接続します。

冒頭紹介の記事に対して「減光(dim)」の処理を付け加えている「switch」の設定はこうです。

![nodered-config4.PNG](https://qiita-image-store.s3.amazonaws.com/0/172921/c2f3e4a0-4b31-c17c-c213-fffaf6aa9724.png)

Echo上で「Dim the light(暗くして！)」と発話したときは「-25」という数値が落ちてくるので、それを判定しています。ちなみに「+25」は「Brighten the light(明るくして！)」です。

(なお、この条件式を見れば分かりますが、本来Dimコマンドは「現状から25%少なく(暗く)する」というコマンドです。Brightenも同様に「現状から25%増やす」という意味です。ですが私はそのような相対値での利用はせずに、単純にDimを「減光する(豆電球にする)」という意味で、Brightenを「明るくする(フルパワーの明るさにする)」という意味で使っています。このあたりは照明機器の使い方なども考慮しながら決めていくと良いでしょう。)

Node-REDの設定の最後は、判定結果から、実際に赤外線を光らせるコマンドを実行する「execノード」の設定です。

![nodered-config5.PNG](https://qiita-image-store.s3.amazonaws.com/0/172921/c0a89a4e-0012-d087-bff0-66f6db066792.png)

on(点灯)の場合の例です。`/home/pi/irMagician/turn-on.sh` を実行しています。このシェルスクリプトは以下のような内容です。

```shell-session
#!/bin/sh
/home/pi/irMagician/playIrMagicianLocal.py /home/pi/irMagician/on.dat
```

はまりポイントとして、Node-REDのexecノードで実行できるコマンドはシェルスクリプトに限るようです。私は最初ここでpythonスクリプト(１ライナー)を直接実行させようとしてハマりました。なので、シェルスクリプトにラップしています。

off/dimについてもほぼ同じようにすればOKです。(turn-off.sh, dim.shというものを作ります。)

これでNode-REDでの設定は終わり。変更したらDeployするのを忘れないようにして下さい。

### 4. Amazon Echoでの設定

最後にEchoでの設定です。スマホのAlexaアプリでskillのメニューを選択し、「Node-RED」を検索してインストール・設定すればOKです。

さあ、これで、設定が完了しました！

### テスト

テストは、ラズパイのNode-REDの画面を表示させておくのが良いと思います。
その状態でEchoに対して「Turn on the Light!」と発話すると「OK!」と返ってきて照明が点いたり(消えたり)すれば成功です。このときNode-REDの画面上では、コマンドが落ちてくる様子が見えるので動作がよくわかると思います。

### 完成動画

恥ずかしい発音ですが、動いているところの動画です。なおこの動画撮影時はRaspberry Pi 3で作っていますが、この記事を書くに当たってRaspberry Pi Zero Wに載せ替えています。どちらでも問題なく動いています。

<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">Amazon Echoとラズパイで、音声で照明をon/offする。 <a href="https://t.co/yaJdZoaaP8">pic.twitter.com/yaJdZoaaP8</a></p>&mdash; kikuzokikuzo (@kikuzokikuzo) <a href="https://twitter.com/kikuzokikuzo/status/926812576368824320?ref_src=twsrc%5Etfw">2017年11月4日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

寝るときに枕元にリモコンを置いたり、起きるときにリモコンを探したり、ということが無くなったので大変便利です。音声認識バンザイ。

Have a Fun!!