スマートスピーカー の Google アシスタンス や Amazon Alexa から壁コンを操作できるようにしてみました。 スマートスピーカーとの相性を確かめるテストなので実現手法は強引ですが、とても便利だということがわかりました!
先ずこちらを御覧ください。
【動画】
実は使い始めて3ヶ月くらい経過しているのですが、コレはとても便利です!
スマートホーム x スマートスピーカー がこんなに相性が良いとは! って感じです!
技術的に分かってる方向けに何をやったのか 先に明らかにすると、 ルーターの静的アドレス変換を使って ESP8266 のWEBサーバーを外向きに大公開し、 Alexa や Google Assistant から IFTTT の Webhook 経由で叩く。 というダイナミックな方法です。 認証も暗号化もされていないため、セキュリティは意識されていない実装ですので注意してください。
将来的に 認証・暗号のかかる MQTT で AWS IoT に接続して Alexa から操作したいと思います。
詳しい説明
あああ
壁コンに使われている ESP8266 は Wi-Fi機能を内蔵しているので、インターネットに接続することが可能です。 しかし、ESP8266 はルーターを通してホームネットワーク内で使用しているため、インターネット側から 通信することが出来ません。
通常ルーターを設置したホームネットワークのローカルIPアドレスはローカル内でしか使えず、インターネット側からアクセスすることはできないのです。
今回の方法では 静的アドレス変換 (静的IPマスカレード、 ポートフォワーディング 等とも呼ばれる) 機能を使って、ルーターの持つグローバルIPアドレスにポートを複数開け、それぞれのESP8266 に振り分ける事で実現しています。
ちなみに、この方法では ルーターのIPアドレスとポートが他者に特定されると アクセスされ放題になるので注意してください。
また、グローバルIPは特別な契約をしないと何かのタイミングで変化する事があるので、急に使えなくなったりする事があります。
静的アドレス変換の設定
ルーターによって 静的アドレス変換 の方法は異なります。
例としてBUFFALO社製ルーターのポート変換の仕方ページを使って紹介します。
手順は上記ページに従ってもらい、設定箇所として、 “12345” とした外側ポートはユニークなポートを指定します。
LAN側IPアドレス は 壁コンのローカルIPアドレスを入力し、 LAN側ポートは 80 を指定します。
この設定は 壁コン それぞれで行い、 Internet側 のポートは全てバラバラに指定する必要があります。
IFTTT の設定
Google assistant や Amazon Alexa からは IFTTT サービスを中継して 壁コンを操作します。
IFTTT は 様々なWEBサービスとWEBサービスを指定した条件等で繋げることが出来るサービスです。
難しいプログラミング言語を使わずにスマホやパソコンから条件を指定するだけでオリジナルのサービスを作ることが出来ます。
まず右上のサインアップから始めます。
サインアップページから お好きな方法でアカウントを作成します。
サインアップが完了したら、右上のアイコンの横からメニューを出し、New Applet を開きます。
画面中央の if [+]this then that の真ん中、 [+]this をクリックします。
たくさんのトリガーサービスの中から、今回は Google Assistant を選択します。
Amazon Alexa を選ぶ場合もこちらから探して選択します。 基本は一緒です。
Google Assistant の中のトリガーをメニューの中から選びます。
今回は シンプルフェーズを選びます。 数値を取り出して使ったりすると部屋の温度を変えたりと言ったサービスも作る事ができます。ここでは トリガーとなる Google Assistant の設定をします。
いくつかのワードを登録できますが、このワードとちょっとでも違うと起動してくれないので、登録と使用の際に気をつけましょう。
次にトリガーを受けて実行されるサービスを設定していきます。
if [Google Assistant] then [+]that と来たので、 [+]that を選択します。
実行されるサービスとして、WebHooks を選択します。
WebHooks サービスには 1種類のアクションしかありません。
Make a web request を選択します。
WebHooks では HTTPリクエストを送ることが出来ます。
ここで、ルーターに設定された グローバルIPと外側に指定したポート番号とESP8266側のURLの後ろ側を指定します。
以下の例では、グローバルIPとして 123.456.78.9 とし、外側のポート番号12345 で 壁コンの /on を呼び出すように設定しました。
リクエストは GET にして コンテンツタイプ text/plain ボディーは abc としましたが、特に呼び出すだけなので、なんでも問題ありません。
Create action を押すと以下のように確認画面が表示されて設定は完了です。初めて設定する場合は Google Assistant をつなぐときにアカウント登録等が出たと思いますが、私はすでに完了させてしまっているので出ませんでした。
この方法だと簡単に 音声アシスタントで壁コンを操作できるようになりますが、グローバルIPが変更されるたびに設定が必要だったり、グローバルIP とポート番号が判明すると外からやりたい放題になってしまうのでセキュリティ的に良くないと思います。
今後は 暗号化と認証のかかる MQTTを使用して安定的に使用できるように壁コンと一緒にアップデートしたいと思っています。