Date: 2018.01.15
Home / Android/Google. / Google Home Miniで家電を操作。パート2.Google AssistantをIFTTT連携させて音声操作。
Google Home Miniで家電を操作。パート1」に続いて、パート2です。
今度こそGoogle Home Miniからスマートリモコン「eRemote RJ-3」を使って家電を操作させます。

家電操作には様々なサービス間を繋いで連携させるサービス、IFTTT(イフト)を使用してGoogle Assistantと連携させます。
流れとしては[Google Home]→[IFTTT]→[ngrok]→[Broadlink RM server for IFTTT]→[eRemote]のようになります。




Broadlink RM server for IFTTT導入

IFTTT(イフト)からの命令をeRemoteに受け渡す為のモジュール「Broadlink RM server for IFTTT」を導入します。
まずはBroadlink RM server for IFTTTをGithubから導入する為、rootユーザーでgitパッケージをインストールします。
# yum install git

node用ユーザーにスイッチし、Broadlink RM server for IFTTT用のディレクトリを作成、移動します。
$ mkdir .broadlinkrm-ifttt
$ cd .broadlinkrm-ifttt

Githubからモジュールをインストールします。
$ npm install git+https://github.com/jor3l/broadlinkrm-ifttt.git

この時、npmが古いと怒られる場合があります。その場合はnpmのアップデートを実施します。
v5.6.0になっていれば問題ありません。
$ npm update -g npm
$ npm -v
5.6.0

本体があるディレクトリへ移動します。
$ cd node_modules/BroadLinkServer/

一度、正常に起動するか試しておきます。停止するにはCtrl+Cで。
Server runningの行で待ち受けのポートが確認できます。
$ npm start
> BroadLinkServer@0.0.1 start /home/xxxxxx/.broadlinkrm-ifttt/node_modules/BroadLinkServer
> node server.js

Server running, go to http://localhost:1880

この待ち受けポートを変更するには「server.js」を編集します。
$ vi server.js

2行目の「const PORT」行を変更します。
"use strict";
const PORT = process.env.PORT || xxxx; ←xxxxがポート番号

次にコマンドを編集します。前回で取得した赤外線信号もここで使用します。
$ vi commands.js

デフォルトでは最初の方は例とかが買いてあって、「module.exports = [{」移行がコマンドリストになります。
サンプルで色々記載されているので不要なものを削除したうえで記載します。
1セットは以下の構成になります。複数コマンドを記載していくには",(カンマ)"で続けます。
 {
  "command": "任意のコマンド名",
  "secret": "任意のシークレットコード、IFTTT側で使います",
  "mac": "eRemoteのMACアドレス",
  "data": "赤外線信号コード"
 },
 {
  "command": "任意のコマンド名",
・
・
・
ここまでできたら準備は完了です。

Broadlink RM server for IFTTTバックグラウンド起動

Homebridge同様に、foreverでバックグラウンド起動させます。
が、こっちはちょっとやっかいです。
まず、必ずモジュール本体があるディレクトリに移動しておく必要があります。
また、試し起動した時に分かるように、「npm start」を打つのみになります。
この場合、foreverに「-c」オプションでコマンドとして渡して上げる必要があります。
また、最後に「./」をつけるのがポイントになります。
$ cd ~/.broadlinkrm-ifttt/node_modules/BroadLinkServer/
$ forever start -c "~/.nodebrew/current/bin/npm start" ./

forever listで起動しているか確認を。
$ forever list

ngrok導入

続いてngrokを導入します。
ngrokは固定IPアドレスやドメインを用意しなくても簡単に外部公開を行えるサーバモジュールです。
簡単に公開はできますが、欠点ももちろんあります。
ngrok側のサーバと常時セッションを貼って、外部からのリクエストはngrok側のサーバで受けてセッションを受け取る仕組みになります。
なのでセキュリティ対策が取りづらくなります。
また、ngrok自体は無償で利用できますが、無償プランだと機能がかなり制限され、特に公開用のURLがランダムになり、ngrok起動の度に変わるのでここは特に面倒かも。
有償プランに入れば固定URLも使えるようにはなりますが・・・。
ここはお好みで。

とりあえず、無償プラン前提で進めていきます。
まずはngrokのインストール。
$ npm install -g ngrok

インストールできたらngrokを起動します。
「xxxx」にはBroadlink RM server for IFTTTで設定したポート番号を入力します。
これで正常に起動できれば画面上にURLが表示されます。
$ ngrok http xxxx

起動時に使用する地域を設定する事も可能です。
「--region」に続いて地域を入力しますが、「ap」でアジア(Asia Pacific)になります。
地域を指定すると、URLも変わり、この場合サブドメインに「ap」がつきます。
$ ngrok http --region ap xxxx

ngrokバックグラウンド起動

ngrokもバックグラウンドで起動を行います。
こっちは更にやっかいで、なかなかうまくいきませんでした。

その理由の1つが、foreverが使えなかった事。
foreverはあくまでnodeで起動するものにしか使えず、ngrokはnpmでインストールしているにも関わらず、起動時にはnodeを使用していないのが原因でした。

なので、Linuxの標準的な方法(&付ける)でバックグラウンド起動を試みたのですが、なかなかうまくいかず、試行錯誤した結果が以下の方法になります。
ポイントはどこでもいいけど適当なファイルにリダイレクトを挟む事でした。細かい理由は分かりませんが・・・
まあ、これでバックグラウンドで動いてくれます。
$ ngrok http --region ap xxxx > 適当なファイル &

で、バックグラウンドで起動すると払い出されたURLが分からないのですが、curlコマンドでローカルホストに接続して調べる事が可能です。
$ curl localhost:4040/status | grep ngrok.io

これでも文字列が大量に出力されるので、更に手を加えてこれで最終行にURLだけが表示されます。
$ curl localhost:4040/status | grep ngrok.io | cut -d"/" -f3 | cut -d"\\" -f1

ここまできたらサーバ側の準備は完了です。

IFTTTアプレット作成

最後にIFTTTのアプレットを作成します。
アカウント作成が必要なのでまずは作成しておきます。

上部の「My Applets」を選択し、「New Applet」を選択します。
「New Applet」画面が開くので、「+this」の部分を選択します。
IFTTT New Applet

「Choose a service(サービスの選択)」になるので、「Search services」に「Google」あたりを入力して「Google Assistant」を選択します。
初めて連携する場合はGoogleのアカウントへのログインを求められるのでGoogle Homeで使用しているアカウントでログインします。
IFTTT Choose aservice

「Choose trigger(トリガーの選択)」になるので、「Say a simple phrase」を選択します。
IFTTT Choose trigger

トリガー作成画面になるので、以下のように設定していきます。
「What do you want to say?」にはGoogle Homeに「OK! Google!」の後、呼びかける命令になります。日本語入力できます。ちなみに、「ライトをオン」とかだと、Google Homeが正式にサポートしている機器への命令としてデフォルトで登録されていて使えないというか、そっちを実行しようとしてしまうので注意が必要です。
「What's another way to say it? (optional)」は上の命令以外に呼びかけ方を必要に応じて入力します。例では漢字で入れた命令を念の為、ひらがなでも入れています。
「And another way? (optional)」は更に他に命令内容があれば入力します。
「What do you want the Assistant to say in response?」は命令が受け付けられた際にGoogle Homeに喋らせたい内容を入力します。何も入れないとデフォルトの「OK、アクションを実行します。」と喋ります。
「Language」はそのまんま、言語の指定ですので日本語の場合は「Japanese」で。
設定できたら一番下の「Create trigger」を選択します。
IFTTT Complete trigger fields

「New Applet」画面に戻るので、続いて「+that」の部分を選択します。
IFTTT New Applet2

「Choose action service(アクションサービスの選択)」になるので、「Search services」に「Web」を入力して「Webhooks」を選択します。
IFTTT Choose action service

「Choose action(アクションの選択)」になるので、「Make a web request」を選択します。
IFTTT Choose action

アクション作成画面になるので、以下のように設定していきます。

「URL」には「http(s)://xxxxxxxx.(ap.)ngrok.io/command/XXXX(Broadlink RM server for IFTTTで設定したcommand名)」の形式で入力します。httpでもhttpsでもOKです。xxxxxxxxはngrokのURL、.apは起動時に指定していたら入力します。XXXXはBroadlink RM server for IFTTTで設定したcommand名を入力します。
「Method」は「POST」を選択します。
「Content Type (optional)」は「application/json」を選択します。
「Body (optional)」は「{"secret":"xxxxxxx"}」を入力します。xxxxxxxはBroadlink RM server for IFTTTで設定したsecretです。
設定できたら一番下の「Create action」を選択します。

IFTTT Complete action fields

最後にアプレット名の入力(任意)と、「Receive notifications when this Applet runs」でアプレット実行時に通知を行うかの指定をします。
通知をオンにしていると、スマホにIFTTTアプリを入れている場合等には実行される度にプッシュ通知が届きますが、実行の度に通知がされるので切っておいた方がいいかなと。
設定できたら「Finish」を選択します。
なお、ここまでの全ての設定は後からでも変えれます。
IFTTT Review and finish

これで全ての設定が問題なくできていればGoogle Homeに喋りかけて家電の操作ができるはずです。
色んな家電を操作したい場合は必要分の「Broadlink RM server for IFTTT」の「commands.js」への定義の記載と、IFTTTのアプレット作成を行います。

なお、ngrokを無償利用の場合は前述の通り、起動の度にURLが変わるので、その都度IFTTTのアプレットのURLを書き換えてやる必要があるのでお忘れなく。

またAndroidしかない環境でも取得する方法とかはおまけとして別途時間ができたら書きます。

とりあえず、Google Home Mini購入当初の目的は果たせました。
2台も買ってしまったのは血迷ったから、ではなく、ベッドから届く範囲と、玄関に設置して就寝時や帰宅時に手が塞がっていても簡単に電気のオン/オフが出来るってもんです。
ここまでパワーかけてする事だったのかというのは否めないですが(笑)

【関連記事】
Google Home 関連記事一覧。


Secret

TrackBackURL
→https://000dandelion000.blog.fc2.com/tb.php/273-5518e993