MQTTベースのおうち制御システムをAmazon Echo対応した話

今年もなんだか目が回るようで色々なことをさせていただいたわけですが、2年前くらいから運用し続けているおうち制御システムは今でも元気です。

* [MQTTでIRKitやPhilips Hueの状況確認・操作を集約](https://qiita.com/yacchin1205/items/703677e2fc6015535a54)
* [MQTTでiTunesとコレクションケースのHueを連携してみる](https://qiita.com/yacchin1205/items/8368b7fbc1408e50764f)
* [MQTTベースのおうち環境にMESHを追加する](https://qiita.com/yacchin1205/items/29d31707a535eeb85a96)

今年はあまり手を入れるつもりはなかったのですが、**会社の忘年会で音声アシスタントデバイスを持っていないのが自分だけであることが判明した**というのもあり、いいタイミングでAmazon Echoの招待も来たのでAlexaさんがおうちシステムを制御できるようにしてみました。

# TL;DR

MQTTベースのシステムを手軽に音声対応するには[IFTTT](https://ifttt.com)と[Beebotte](https://beebotte.com/)の組み合わせが便利。
しかしながら、IFTTTにどんなフレーズを指定するかはちょっと試行錯誤が必要かも。

# おうちシステムの構成

[去年の記事](https://qiita.com/yacchin1205/items/29d31707a535eeb85a96)の通り、我が家にはMQTTベースのおうち制御システムが稼働しており、スマホや各種センサーによる照明制御やエアコン、TV等の機器制御を行っています。

すでに[MESH](http://meshprj.com/jp/)とつなぐためにIFTTT対応していたので、連携自体はAmazon EchoをIFTTTにつなぐのみ。Amazon Echo統合後のシステム構成としては以下のような感じです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28770/4998ecf5-aa02-bb49-6f65-4cfb3da72e94.png)

Amazon Echo Plusはスマートホームハブを内蔵しているので、そこに完全に寄せるという手もないわけではないのですが・・・非対応デバイスもおうちにはあり、元気に稼働してしまっています。**今年もおうちシステム全面リプレースの予算はおりませんでした**ので、当面の対応として、現在のシステムを活かしながら音声アシスタント対応をすることにします。

# IFTTTの設定

IFTTTには[Amazon Alexa Service](https://ifttt.com/amazon_alexa) があるので簡単にAmazon Echoに話しかけることで、IFTTTのAppletを実行することができます。

Alexa Serviceでは、「xxx をトリガー」という形の指示を受け入れてくれるので、今回は、**「机照明をトリガー」と話すことで、BeebotteのREST APIを介してMQTT経由でHueとLED照明を点灯**できるようにしてみます。

1. IFTTTで [My Applets] から [New Applet] を選択する
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/28770/595ee87f-2b67-bad8-5d31-d8f98d75a988.png)

2. [+this] を選択する
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/28770/5fa4743f-85ac-3d92-dca0-1b5807b418f0.png)

3. Serviceとして [Amazon Alexa]の[Say a specific phrase]を選択する
    初回実行時のアカウントひも付けなどはNature Remoの[Amazon Echoから日本語で家電を操作](http://nature.global/jp/ifttt-setup/2017/11/23/amazon-echo)を参考にしました。
4. Phraseに、「机照明」と指定し、[Create trigger]を押す
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/28770/ce501ca2-29c3-4af8-efc3-c8da84fa9935.png)
    これで、「Alexa, 机照明をトリガー」としゃべるとこのAppletが起動するようになる
5. [+that] を選択する
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/28770/4e6fface-6459-7f86-3acb-1021522c93e8.png)

6. Actionとして、[Webhooks]の[Make a web request]を選択する
7. Beebotte上の制御したいチャンネルとリソース、POSTしたいデータを入力する
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/28770/2b9a214b-c9a9-6eae-8063-52b9920b8773.png)
    詳しくは、 [MQTTベースのおうち環境にMESHを追加する#Beebotteのアカウント作成](https://qiita.com/yacchin1205/items/29d31707a535eeb85a96#beebotte%E3%81%AE%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E4%BD%9C%E6%88%90) を参考にしてください
8. [Create action]を選択し、必要に応じてApplet名を変更して [Finish] を選択する

これで、「Alexa, 机照明をトリガー」と話しかけると、Echoが「イフトに送信します」と応じてBeebotteのREST APIに指示を投げてくれます。この指示がMQTT経由で各家電に伝わり、制御が実行されることになります。

# トリガーとするフレーズの選択

以上のような感じで非常に簡単にAmazon Echoでおうちの家電を制御できるようになりました。

とりあえず1日遊んだ感覚ですが、別のスキルと誤認されるキーワードがいくつかあるようです。

* 「消して」 ... カレンダーの予定削除と誤認するよう。「照明消して トリガー」などというと、「そのような予定はありません」と返す
* 「リビング」「照明」 ... スマートホームハブの「ホームハブが設定されていません」と返す場合がある

きちんと検証したわけではないですが、これらの誤認識をする場合は「トリガー」という言葉が認識されていなかった感じがします。IFTTTによるAlexa連携はお手軽ですが、「トリガー」という部分を必ず認識させなければならない(であろう)という点で、他の専用スキルに比べて認識可能な範囲が狭まっている感じがしています。

Pepperのフレーズ選択でも、他のアプリとかぶらないように色々苦労した記憶があるわけですが、誤認識を減らせるような工夫として、全体のフレーズ設計というのはまだまだあるのかなあという感じでした。