知的好奇心 for IoT

IoT関連の知的好奇心を探求するブログです

Google Assistantで中二病的にSmart Homeを実現してみた

日本語版のGoogle Assistantが提供開始されたというニュースを見て、前回のAlexaに続いて何とかして使えないかと、また、Google先生を質問攻めしていたら、かなりいい感じの記事を見つけました。

この記事を参考に今回考えた仕組みはこんな感じです。

f:id:IntellectualCuriosity:20170605184535p:plain

Node-REDから後はAlexaの時と同様なので、聞きなれないdataplicityから調べてみました。

 

dataplicity

dataplicityはRaspberry Piにブラウザからリモートアクセスできるようにするサービスで、1台だけなら無料で利用することができます。

操作画面はこんな感じで、何処からでもブラウザでリモートシェルが使えます。

f:id:IntellectualCuriosity:20170605140532p:plain

プライベートアドレスでもインターネットからアクセスできる理由は、Raspberry Piにアウトゴーイングのコネクションを保つモジュールをインストールしているからです。

モジュールのインストールはこんな感じです。コードはバイスアカウント毎に発行されます。

f:id:IntellectualCuriosity:20170605142549p:plain

ただ、今回利用するのはリモートシェルではなく、ワームホールという機能です。緑枠内に表示されているhttps://xxxxxx.dataplicity.ioへのアクセスが、Raspberry Piへのアクセスとなるので、簡単に部屋のRaspbbery Piサーバーをインターネットから使えるようになるんです!すごーい!

この機能を使ってRaspberry PiのNode-REDにインターネットからアクセスできるようにします。

Node-REDはデフォルトで1880ポートを使っていて、80ポートに変更するにはルート権限でNode-REDを動作させなければいけないそうなので、リダイレクトで対応することにしました。

sudo iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 1880

このコマンドで、80ポートへのアクセスを1880ポートにリダイレクトしてくれます。

 

IFTTT

IFTTTはメジャーなので説明の必要は無いと思いますが、簡単に言うとサービスとサービスを結びつけるサービスです。

このIFTTTにGoogle Assistantのカスタムボイスコマンドを作る機能が追加されていました。

f:id:IntellectualCuriosity:20170605153606p:plain

「Connect」をクリックして接続するGoogleアカウントを選択します。

f:id:IntellectualCuriosity:20170605154214p:plain

作ったアプレットは次の4つです。

f:id:IntellectualCuriosity:20170605154807p:plain

  • "Let therer be light"で照明オン    中二病訳:光あれ!
  • "Let therer be darkness"で照明オフ 中二病訳:闇よあれ!
  • "Create a strom"でエアコン・オン  中二病訳:嵐よ起これ!
  • "Leave a storm"でエアコン・オフ   中二病訳:嵐よ去れ!

日本語の入力も可能なのですがGoogle Assistantがまだ日本語に対応していないので英語で我慢しました...。

 

照明オン用のアプレットの設定です。

f:id:IntellectualCuriosity:20170605161352p:plain

3つまで言い方を登録できて、Assistantの答え方も登録できます。中二病的にAssisantにはサーバント的な役割を与えてみました。

Assitantがボイスコマンドを認識すると、ウェブリクエストを飛ばすようにしています。リクエスト先はNode-REDでhttp inノードとして設定しています。

「Content Type」はデフォルトの「Please select」のままでいいのですが、一度変更すると「Please select」に戻せなくなったのでこのようになっています...。

 

Node-RED

Node-REDもメジャーなので説明の必要は無いと思いますが、簡単に言うとフローベースのIoT向けプログラミングツールです。

IFTTTで作成した4つのアプレットのウェブリクエストを処理するフローはこんな感じになりました。

f:id:IntellectualCuriosity:20170605163713p:plain

/order?target=light&ctrl=onという形態のリクエストが来たら、switch1でtargetの内容、switch2でctrlの内容で分岐してpython-broadlinkのコマンドを実行しています。

レスポンスは何が来ても一律「OK」を返しています。

●「[get] /order」の内容

f:id:IntellectualCuriosity:20170605165520p:plain

●「switch1」の内容

f:id:IntellectualCuriosity:20170605165922p:plain

リクエストパラメータの名前はmsg.payload.xxxで指定します。値は文字列として扱います。

「switch2」の内容

f:id:IntellectualCuriosity:20170605170215p:plain

「LIGHT.on」の内容

f:id:IntellectualCuriosity:20170605170458p:plain

rmはシェルスクリプトで、python-broadlinkのコマンドを実行しています。

#!/bin/sh
cd /home/pi/python-broadlink/cli
./broadlink_cli --device @RM.device --send @$1

python-broadlinkについては前回のAlexaの記事を見てくださいね。

「debug」の内容

f:id:IntellectualCuriosity:20170605172413p:plain

デバッグ情報としてリクエストパラメータの値を表示するようにしています。

「response」の内容

f:id:IntellectualCuriosity:20170605173251p:plain

単純に大きなOKを返しています。

 

Google Assistant

実は今回最も苦労したのがGoogle Assistantです。最初AlloのGoogle Assistantが使えないかとやってみたんですがダメでした。IFTTTのGoogle Assistant画面にPixelかGoogle Homeにしか対応していないとしっかり書いてあったのを見逃していました。

f:id:IntellectualCuriosity:20170605190438p:plain

まぁ、Andoid 6以上に配信される予定のGoogle AssistantならPixelでなくても使えるのでしょうが、ぼくはAndroid 5の携帯しか持っていないんです!

新しい携帯を買おうかと本気で探しもしたのですが、やっぱりお金は使いたくないし結局直ぐには使えない。

で、最終的に取った手段がAndroid 7.1.1のLineageOSというカスタムROMを焼くことでした。ただ、それだけではGoogle Assistantが動かなかったのでxdaで見つけたGoogle Assistantのモジュールも焼きました。この苦労話は別記事でお知らせしたいと思います。

音声が無いと何とも味気がないのですが、動作画面がこれです。Google Assistantの"Master"の発音がよくって、中二病心をくすぐります。

f:id:IntellectualCuriosity:20170605194900p:plain

今は携帯の言語を英語にしないとGoogle Assistantが動かないのですが、日本語対応したら三節詠唱に挑戦したいと思います!