| Home |
過去に実装していた「Google Home Mini」と「eRemote RJ-3」を使って家電を音声操作する為の中継サーバー。
Linuxパッケージのアップデートは頻繁に実施していたんですが、実装時以来触ってなかったNode.jsモジュールもアップデートをしてみようかとふと思い立って実施しました。
しましたらハマりました。(Node.js自体は悪くないんですが。)
というわけで備忘録的なメモです。
Linuxパッケージのアップデートは頻繁に実施していたんですが、実装時以来触ってなかったNode.jsモジュールもアップデートをしてみようかとふと思い立って実施しました。
しましたらハマりました。(Node.js自体は悪くないんですが。)
というわけで備忘録的なメモです。
アップデート前のnodeとnpmのバージョン。
アップデート可能なバージョンの確認。
結構出てるなぁ・・・
一気に上げるのも怖いので現状のv8台の最新に留めておく事に。
v8.16.0をインストールします。
インストールしたv8.16.0を使用するよう指定します。
npmをアップデート。
バージョンが更新された事を確認。
ここでNode.jsのバージョンが変わるとnode配下に配置されたパッケージがいなくなってて一瞬焦りました。
「.nodebrew/current/」でアクセスしてたけど、実際にはバージョン毎にディレクトリが作られてて、currentはnodebrew useで指定したバージョンのシンボリックリンクになってるとは。
というわけで関係するものをインストールし直します。
なお、ホームディレクトリ直下にあるものはもちろんの事ですが影響を受けていないので特に操作等不要です。
ついでに、ngrokは最新が落ちてくるわけではないようでUpdateしろって出てたのでこっちもアップデートします。
これでバージョンは2.3.28になりました。(ここが最大のハマりポイントになったけど。)
で、これまで通りngrokをバックグラウンド起動したところで前述の通りハマりました。
curlコマンドでIFTTTからアクセスする用のURL確認しようとしたところ表示されなくて。
うまく動いてないのかと切り分けしてみたけど全く見当付かずで元に戻そうかとも考えたところで、試しにフォアグラウンドで起動してみると特に問題なく動作してる・・・
という事は確認の仕方がダメなだけなんだろうなと更に粘って調べてみました。
で、結局のところ、仕様が変わってました。
ステータス表示のパスが変更になってます。
多分、バージョン上げたせいかなーと。
というわけで、長々と出てきますがこれで出てきます。
curlコマンドのオプションとsedコマンドで加工するとFQDN(URL部分)だけ抽出できます。
結果的には元に戻ったので良かった良かった。
ngrokの仕様変更は鬼門だなぁ。
【関連記事】
Google Home 関連記事一覧。
■閉じる■
$ node -v v8.9.2 $ npm -v 6.4.1
アップデート可能なバージョンの確認。
$ nodebrew ls-remote v0.0.1 v0.0.2 v0.0.3 v0.0.4 v0.0.5 v0.0.6 v0.1.0 v0.1.1 v0.1.2 v0.1.3 v0.1.4 v0.1.5 v0.1.6 v0.1.7 v0.1.8 v0.1.9 v0.1.10 v0.1.11 v0.1.12 v0.1.13 v0.1.14 v0.1.15 v0.1.16 v0.1.17 v0.1.18 v0.1.19 v0.1.20 v0.1.21 v0.1.22 v0.1.23 v0.1.24 v0.1.25 v0.1.26 v0.1.27 v0.1.28 v0.1.29 v0.1.30 v0.1.31 v0.1.32 v0.1.33 v0.1.90 v0.1.91 v0.1.92 v0.1.93 v0.1.94 v0.1.95 v0.1.96 v0.1.97 v0.1.98 v0.1.99 v0.1.100 v0.1.101 v0.1.102 v0.1.103 v0.1.104 v0.2.0 v0.2.1 v0.2.2 v0.2.3 v0.2.4 v0.2.5 v0.2.6 v0.3.0 v0.3.1 v0.3.2 v0.3.3 v0.3.4 v0.3.5 v0.3.6 v0.3.7 v0.3.8 v0.4.0 v0.4.1 v0.4.2 v0.4.3 v0.4.4 v0.4.5 v0.4.6 v0.4.7 v0.4.8 v0.4.9 v0.4.10 v0.4.11 v0.4.12 v0.5.0 v0.5.1 v0.5.2 v0.5.3 v0.5.4 v0.5.5 v0.5.6 v0.5.7 v0.5.8 v0.5.9 v0.5.10 v0.6.0 v0.6.1 v0.6.2 v0.6.3 v0.6.4 v0.6.5 v0.6.6 v0.6.7 v0.6.8 v0.6.9 v0.6.10 v0.6.11 v0.6.12 v0.6.13 v0.6.14 v0.6.15 v0.6.16 v0.6.17 v0.6.18 v0.6.19 v0.6.20 v0.6.21 v0.7.0 v0.7.1 v0.7.2 v0.7.3 v0.7.4 v0.7.5 v0.7.6 v0.7.7 v0.7.8 v0.7.9 v0.7.10 v0.7.11 v0.7.12 v0.8.0 v0.8.1 v0.8.2 v0.8.3 v0.8.4 v0.8.5 v0.8.6 v0.8.7 v0.8.8 v0.8.9 v0.8.10 v0.8.11 v0.8.12 v0.8.13 v0.8.14 v0.8.15 v0.8.16 v0.8.17 v0.8.18 v0.8.19 v0.8.20 v0.8.21 v0.8.22 v0.8.23 v0.8.24 v0.8.25 v0.8.26 v0.8.27 v0.8.28 v0.9.0 v0.9.1 v0.9.2 v0.9.3 v0.9.4 v0.9.5 v0.9.6 v0.9.7 v0.9.8 v0.9.9 v0.9.10 v0.9.11 v0.9.12 v0.10.0 v0.10.1 v0.10.2 v0.10.3 v0.10.4 v0.10.5 v0.10.6 v0.10.7 v0.10.8 v0.10.9 v0.10.10 v0.10.11 v0.10.12 v0.10.13 v0.10.14 v0.10.15 v0.10.16 v0.10.17 v0.10.18 v0.10.19 v0.10.20 v0.10.21 v0.10.22 v0.10.23 v0.10.24 v0.10.25 v0.10.26 v0.10.27 v0.10.28 v0.10.29 v0.10.30 v0.10.31 v0.10.32 v0.10.33 v0.10.34 v0.10.35 v0.10.36 v0.10.37 v0.10.38 v0.10.39 v0.10.40 v0.10.41 v0.10.42 v0.10.43 v0.10.44 v0.10.45 v0.10.46 v0.10.47 v0.10.48 v0.11.0 v0.11.1 v0.11.2 v0.11.3 v0.11.4 v0.11.5 v0.11.6 v0.11.7 v0.11.8 v0.11.9 v0.11.10 v0.11.11 v0.11.12 v0.11.13 v0.11.14 v0.11.15 v0.11.16 v0.12.0 v0.12.1 v0.12.2 v0.12.3 v0.12.4 v0.12.5 v0.12.6 v0.12.7 v0.12.8 v0.12.9 v0.12.10 v0.12.11 v0.12.12 v0.12.13 v0.12.14 v0.12.15 v0.12.16 v0.12.17 v0.12.18 v4.0.0 v4.1.0 v4.1.1 v4.1.2 v4.2.0 v4.2.1 v4.2.2 v4.2.3 v4.2.4 v4.2.5 v4.2.6 v4.3.0 v4.3.1 v4.3.2 v4.4.0 v4.4.1 v4.4.2 v4.4.3 v4.4.4 v4.4.5 v4.4.6 v4.4.7 v4.5.0 v4.6.0 v4.6.1 v4.6.2 v4.7.0 v4.7.1 v4.7.2 v4.7.3 v4.8.0 v4.8.1 v4.8.2 v4.8.3 v4.8.4 v4.8.5 v4.8.6 v4.8.7 v4.9.0 v4.9.1 v5.0.0 v5.1.0 v5.1.1 v5.2.0 v5.3.0 v5.4.0 v5.4.1 v5.5.0 v5.6.0 v5.7.0 v5.7.1 v5.8.0 v5.9.0 v5.9.1 v5.10.0 v5.10.1 v5.11.0 v5.11.1 v5.12.0 v6.0.0 v6.1.0 v6.2.0 v6.2.1 v6.2.2 v6.3.0 v6.3.1 v6.4.0 v6.5.0 v6.6.0 v6.7.0 v6.8.0 v6.8.1 v6.9.0 v6.9.1 v6.9.2 v6.9.3 v6.9.4 v6.9.5 v6.10.0 v6.10.1 v6.10.2 v6.10.3 v6.11.0 v6.11.1 v6.11.2 v6.11.3 v6.11.4 v6.11.5 v6.12.0 v6.12.1 v6.12.2 v6.12.3 v6.13.0 v6.13.1 v6.14.0 v6.14.1 v6.14.2 v6.14.3 v6.14.4 v6.15.0 v6.15.1 v6.16.0 v6.17.0 v6.17.1 v7.0.0 v7.1.0 v7.2.0 v7.2.1 v7.3.0 v7.4.0 v7.5.0 v7.6.0 v7.7.0 v7.7.1 v7.7.2 v7.7.3 v7.7.4 v7.8.0 v7.9.0 v7.10.0 v7.10.1 v8.0.0 v8.1.0 v8.1.1 v8.1.2 v8.1.3 v8.1.4 v8.2.0 v8.2.1 v8.3.0 v8.4.0 v8.5.0 v8.6.0 v8.7.0 v8.8.0 v8.8.1 v8.9.0 v8.9.1 v8.9.2 v8.9.3 v8.9.4 v8.10.0 v8.11.0 v8.11.1 v8.11.2 v8.11.3 v8.11.4 v8.12.0 v8.13.0 v8.14.0 v8.14.1 v8.15.0 v8.15.1 v8.16.0 v9.0.0 v9.1.0 v9.2.0 v9.2.1 v9.3.0 v9.4.0 v9.5.0 v9.6.0 v9.6.1 v9.7.0 v9.7.1 v9.8.0 v9.9.0 v9.10.0 v9.10.1 v9.11.0 v9.11.1 v9.11.2 v10.0.0 v10.1.0 v10.2.0 v10.2.1 v10.3.0 v10.4.0 v10.4.1 v10.5.0 v10.6.0 v10.7.0 v10.8.0 v10.9.0 v10.10.0 v10.11.0 v10.12.0 v10.13.0 v10.14.0 v10.14.1 v10.14.2 v10.15.0 v10.15.1 v10.15.2 v10.15.3 v11.0.0 v11.1.0 v11.2.0 v11.3.0 v11.4.0 v11.5.0 v11.6.0 v11.7.0 v11.8.0 v11.9.0 v11.10.0 v11.10.1 v11.11.0 v11.12.0 v11.13.0 v11.14.0 v11.15.0 v12.0.0 v12.1.0 v12.2.0
結構出てるなぁ・・・
一気に上げるのも怖いので現状のv8台の最新に留めておく事に。
v8.16.0をインストールします。
$ nodebrew install-binary v8.16.0
インストールしたv8.16.0を使用するよう指定します。
$ nodebrew use v8.16.0
npmをアップデート。
$ npm update -g npm
バージョンが更新された事を確認。
$ node -v v8.16.0 $ npm -v 6.9.0
ここでNode.jsのバージョンが変わるとnode配下に配置されたパッケージがいなくなってて一瞬焦りました。
「.nodebrew/current/」でアクセスしてたけど、実際にはバージョン毎にディレクトリが作られてて、currentはnodebrew useで指定したバージョンのシンボリックリンクになってるとは。
というわけで関係するものをインストールし直します。
なお、ホームディレクトリ直下にあるものはもちろんの事ですが影響を受けていないので特に操作等不要です。
$ npm install -g forever $ npm install -g ngrok
ついでに、ngrokは最新が落ちてくるわけではないようでUpdateしろって出てたのでこっちもアップデートします。
これでバージョンは2.3.28になりました。(ここが最大のハマりポイントになったけど。)
$ ngrok update
で、これまで通りngrokをバックグラウンド起動したところで前述の通りハマりました。
curlコマンドでIFTTTからアクセスする用のURL確認しようとしたところ表示されなくて。
うまく動いてないのかと切り分けしてみたけど全く見当付かずで元に戻そうかとも考えたところで、試しにフォアグラウンドで起動してみると特に問題なく動作してる・・・
という事は確認の仕方がダメなだけなんだろうなと更に粘って調べてみました。
で、結局のところ、仕様が変わってました。
ステータス表示のパスが変更になってます。
多分、バージョン上げたせいかなーと。
というわけで、長々と出てきますがこれで出てきます。
$ curl http://127.0.0.1:4040/api/tunnels
curlコマンドのオプションとsedコマンドで加工するとFQDN(URL部分)だけ抽出できます。
$ curl --silent --show-error http://127.0.0.1:4040/api/tunnels | sed -nE 's/.*public_url":"https:..([^"]*).*/\1/p'
結果的には元に戻ったので良かった良かった。
ngrokの仕様変更は鬼門だなぁ。
【関連記事】
Google Home 関連記事一覧。
■閉じる■
2018.04.21
いつの間にかアカウント登録無しでのngrok利用にセッション時間制限が設定されてた。
「Google Home Miniで家電を操作。パート2.Google AssistantをIFTTT連携させて音声操作。」で実装していた「Google Home Mini」と「eRemote RJ-3」を使って声での家電操作。
それが数日前から気付いたら反応しないようになり、宅内サーバー側を再起動してサービスを立ち上げ直すと直後はきちんと動作するのに、気付いたらまた無反応に。
最初はファイアウォール(Sophos XG Firewall)を疑ってログ調べたりポリシーいじってみたりもしたけど結局解消せずで。
再起動すれば直るけど、フリー使用の為にngrokで払い出されるURLが毎回ランダムで変わって、そのURLをIFTTT側で書き換えにゃならんので自動的再起動を仕込んだところでどうしようもないし。
で、とりあえずngrokで払い出された公開用URLに試しにアクセスしてみたら・・・
こんなエラー出た・・・

それが数日前から気付いたら反応しないようになり、宅内サーバー側を再起動してサービスを立ち上げ直すと直後はきちんと動作するのに、気付いたらまた無反応に。
最初はファイアウォール(Sophos XG Firewall)を疑ってログ調べたりポリシーいじってみたりもしたけど結局解消せずで。
再起動すれば直るけど、フリー使用の為にngrokで払い出されるURLが毎回ランダムで変わって、そのURLをIFTTT側で書き換えにゃならんので自動的再起動を仕込んだところでどうしようもないし。
で、とりあえずngrokで払い出された公開用URLに試しにアクセスしてみたら・・・
こんなエラー出た・・・

Tunnel Expired This tunnel expired 16 hours, 24 minutes ago. Sign up for a free account so that your tunnels don't time out or you can restart ngrok to get a new tunnel. Anybody can use ngrok without an account, but there are limits on how long tunnels can stay open and how much bandwidth they can process. Sign up for a free account so your tunnel don't time out and also get more bandwidth, http basic auth, tcp tunnels, custom subdomains and more. The error encountered was: ERR_NGROK_708
まあ、要約するとトンネル(セッション)の期限が切れたのでngrokに登録するか再起動しろって事のようで。
期限ってなんだろうと思って試しに普段バックグラウンド起動してたngrokを一度コンソール上で起動してみたら
$ ngrok http --region ap 1234 ngrok by @inconshreveable (Ctrl+C to quit) Session Status online Session Expires 7 hours, 59 minutes Version 2.2.8 Region Asia Pacific (ap) Web Interface http://127.0.0.1:4040 Forwarding http://xxxxxxxx.ap.ngrok.io -> localhost:1234 Forwarding https://xxxxxxxx.ap.ngrok.io -> localhost:1234 Connections ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00
見事に「Session Expires」なんて項目が出てる。
どうやら8時間で強制的に切られるようで。
導入した時はなかったはずなので(利用できてたし)、ここ数日で変更されたんだろうか。
事象が出始めた直前にメンテナンスで再起動していたのでその時に反映されたのかもしれないけど。
で、ngrokアカウントにサイアンアップして利用を推奨してきてたので登録してみる事に。 無料利用に登録の有無で何か違いがあるんだろうかと半信半疑だったけど。
登録はこちらから。「ngrok SIGN UP」
登録完了後に認証させる手順が表示されます。
手順はngrokをダウンロードして解凍し、直接実行ファイルを指定する内容になっているけど、今回はインストール済みでパスも通っているので若干異なります。
なのでコマンド1行だけです。
Authtokenは登録直後に表示される「Explore ngrok」にコマンドが記載されているのでそちらから。
もしくはメニューの「Auth」にYour Tunnel Authtokenとして記載されています。
$ ngrok authtoken (Authtoken)
実行すると自動的に設定ファイル「ngrok.yml」にauthtokenが書き込まれ、プロセス起動時にこれを利用して認証されるよう。
まあ、手動で書いてもいいとは思うけど。
今回は実行ユーザーのホームディレクトリ配下に隠しディレクトリ「.ngrok2」が作成され、その中にファイルが作成されていました。
authtokenが書かれた「ngrok.yml」が用意された後、再度ngrokを一度コンソール上で起動。すると、
$ ngrok http --region ap 1234 ngrok by @inconshreveable (Ctrl+C to quit) Session Status online Account xxxx (Plan: Free) ← アカウント登録時に入力したユーザー名が表示される。 Version 2.2.8 Region Asia Pacific (ap) Web Interface http://127.0.0.1:4040 Forwarding http://xxxxxxxx.ap.ngrok.io -> localhost:1234 Forwarding https://xxxxxxxx.ap.ngrok.io -> localhost:1234 Connections ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00
「Session Expires」が消え、代わりに「Account」情報が表示されるように。
これで期限は消えたって事でいいんだろうか。
まあ、少し様子見です。(変わってなければ8時間で分かると思うけど。)
ちなみに、ngrokのアカウントコンソールDashboardで「Status」を見ると、こんな感じでTunnels Onlineが確認できます。

【関連記事】
Google Home 関連記事一覧。
■閉じる■
「Google Home Miniで家電を操作。パート1」に続いて、パート2です。
今度こそGoogle Home Miniからスマートリモコン「eRemote RJ-3」を使って家電を操作させます。
家電操作には様々なサービス間を繋いで連携させるサービス、IFTTT(イフト)を使用してGoogle Assistantと連携させます。
流れとしては[Google Home]→[IFTTT]→[ngrok]→[Broadlink RM server for IFTTT]→[eRemote]のようになります。
今度こそ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」の部分を選択します。

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

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

トリガー作成画面になるので、以下のように設定していきます。
「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」を選択します。

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

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

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

アクション作成画面になるので、以下のように設定していきます。
「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」を選択します。

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

これで全ての設定が問題なくできていればGoogle Homeに喋りかけて家電の操作ができるはずです。
色んな家電を操作したい場合は必要分の「Broadlink RM server for IFTTT」の「commands.js」への定義の記載と、IFTTTのアプレット作成を行います。
なお、ngrokを無償利用の場合は前述の通り、起動の度にURLが変わるので、その都度IFTTTのアプレットのURLを書き換えてやる必要があるのでお忘れなく。
またAndroidしかない環境でも取得する方法とかはおまけとして別途時間ができたら書きます。
とりあえず、Google Home Mini購入当初の目的は果たせました。
2台も買ってしまったのは血迷ったから、ではなく、ベッドから届く範囲と、玄関に設置して就寝時や帰宅時に手が塞がっていても簡単に電気のオン/オフが出来るってもんです。
ここまでパワーかけてする事だったのかというのは否めないですが(笑)
【関連記事】
Google Home 関連記事一覧。
■閉じる■
先日、Google Home Miniでスマートスピーカーデビューしたわけですが。(しかも2台も。)
使い道を見出すのにやりたい事としてはやっぱり、声で家電操作したいに行き着いたわけで。
とはいえ、大掛かりなスマートホーム構築まではしたくない。
割と簡易に導入できるものとして、Google Homeを公式にサポートしている代表的なところではスマートリモコンの「Nature Remo」とか、ライトだけだけど「Philips Hue」とか。
それでも割とお値段は張ります。
使い道を見出すのにやりたい事としてはやっぱり、声で家電操作したいに行き着いたわけで。
とはいえ、大掛かりなスマートホーム構築まではしたくない。
割と簡易に導入できるものとして、Google Homeを公式にサポートしている代表的なところではスマートリモコンの「Nature Remo」とか、ライトだけだけど「Philips Hue」とか。
それでも割とお値段は張ります。
そこで、我が家にはスマートリモコン「eRemote RJ-3」があるので、こちらを「OK, Google」から操作させようと。
とはいってもeRemoteシリーズは現状、Amazon Alexaには対応しているものの、Google Homeには未対応となります。
まあ、AlexaもLinkJapanがリリースしているコントロールアプリ「eHome」が必要になるのですが、現状では対応しているのが今年に入ってからの出荷ロットにのみ適用できるファームウェアのみ。(古いファームは「e-Control」アプリにしか対応していない。)
我が家のはホント出たてでモニター価格で売られてた時に買ったものなのでどの道、正規の方法では使えません。
なので、サーバーを用意して、IFTTT連携で操作する環境構築をやっちゃおうと。
という事で試行錯誤していました。まあ、かなりハマって時間がかかっちゃったんですが。
ネットでは結構同じような事やってる人多いですが、前提条件が分かってて当然だよね的に書かれていなかったり不親切な記事が多すぎて手探りでやるしかなかったので。
また、最終的にはインターネット側から命令が飛ぶ事もあって、LAN内とは切り離した方が安全かなーとサーバーをDMZに置こうしたのが間違いでした。
ファイアウォールで最低限ポート開けとけばいいかとか思ってたけど、どうもマルチキャストで通信してるっぽく、この後の実装した方法ではどうやっても拾えませんでした。
Sophos XG Firewallで相互のDestination NAT入れたり、マルチキャストルート書いてみたり色々やりすぎてよく分からない状態になってしまったので諦めてLAN内に置くことで落ち着いています。
前置きが長くなりましたが、はじめていきます。
と言いつつ、赤外線信号の取得がてら、まずはiOSのHomeKitに対応させてSiriから操作させてみました。
ちなみに、ネットで調べるとRaspberry Piで実装しているのがほとんどでしたが、VM上にCentOS7でサーバ立てて実装しています。
Node.jsなんて触った事もなかったのでここから四苦八苦でした。
Node.jsを単体で導入してもいいんですが、バージョン管理が簡単に出来るnodebrewと言うのを入れてそこからNode.jsを導入します。
これは完全に好みです。今後、他に色々したくなった時にあった方がいいかなー程度の考えでうちでは入れました。
まずは必要なパッケージ類をインストール。他にmakeが必要です。
Node.js動かす用にユーザー作成。既存のユーザーでもOKです。
作ったユーザーにスイッチします。
nodebrewのインストール。正常にインストールされたら以下のようにメッセージが続きます。
メッセージ内にパスをexportするように書かれているので実施します。これでnode系コマンドにパスが通ります。
とは言っても、exportコマンドはログオフすれば消えてしまうのでログイン時にパスが通るように「.bash_profile」にも買いておきます。
インストール可能なnodeバージョンの確認。nodeのバージョンはメンテナンスバージョン(3オクテット目)が偶数が安定バージョン、奇数が開発バージョンとなるようです。
nodeをインストールします。うちではv8の一番新しい安定版にしています。
使用するnodeバージョンを指定します。1つしかインストールしてなくてもここは必須です。
nodeのバージョン確認。
一緒に導入されるnpm(Node Packaged Modules)のバージョン確認。
これでNode.js環境の準備は完了です。
まず、rootユーザーに戻って必要なパッケージを追加します。
CentOS7では以下が必要。
インストールできたらnode用ユーザーに再度スイッチし、npmでhomebridgeをインストールします。
インストールが無事できたら一度homebridgeを起動してみます。これでホームディレクトリに「.homebridge」ディレクトリが作成されるはずです。
続いてeRemote用のモジュールを導入します。
インストールできたらeRemoteのMACアドレスを調べます。すでに分かっている場合は不要です。
homebridge-broadlink-rmに同梱されているgetDevice.jsを使用します。
homebridge用のコンフィグを作成します。
コンフィグサンプルです。
nameはHomeKit上に表示されるのでお好みで。
usernameは先程取得したMACアドレスを。ただし、アルファベットは大文字で。
portはデフォルトでいいかと。
pinはiOSのHomeアプリに登録する時に使うものなのでお好みで3-2-3桁で記載します。
accessories内のnameは呼びかける時に使うデバイス名等になります。
typeのswitchはオン/オフのみを定義するタイプの指定になります。
on/offにはこの後赤外線信号を取得して記載するので、ここでは空でOKです。
作成できたら改めてhomebridgeを起動します。
コンソールにQRコードが表示されるのでiPhoneで「ホーム」アプリを起動して読み込み、アクセサリとして登録します。
各項目はデフォルトでOKですが、「よく使う項目に含める」はお好みでオフに。
ホームタブの「よく使うアクセサリ」欄に載せるかどうかになります。
「Learn」と「Scan Frequency」は基本的に普段は使わないですし。(「Scan Frequency」は使い道がそもそも分かってない。)
とは言いつつ、赤外線信号を取得する為にその「Learn」を使います。
「Learn」をタップしてオンにするとeRemote側のランプが光るので、eRemoteに向かって調べたいリモコンのキーを押します。
すると「learned hex code:」に続いて数字とアルファベットの組み合わせの長い文字羅列が表示されるのでそれを記録しておきます。
取得できたら「config.json」の「"on": ""」や「"off": ""」にその取得したコードを記述します。
オン/オフが同一ボタンの場合は両方に同じコードを記述します。
記述したらhomebridgeを起動し直せばオン/オフが操作できるようになっているかと思います。
ボタンが効くのが確認できたら「Hey! Siri! ○○○(accessories内のname)をオン」とか呼びかけると声でも操作できると思います。
注意点は、iOSのHomeKitは対象のデバイスに対して最後に出した命令を覚えていて、同一命令を連続で処理してくれません。
なので、オン/オフが同一コードのボタンを操作する場合でも、オンを2回言ってもそもそも命令を飛ばしてくれません。
そして一番問題になるのは別のリモコンで操作したないようは当たり前ですが知っていないので、HomeKit上のステータスとずれが生じる場合もあり割と面倒です。
(あくまでSiriで音声操作する場合で、ホームアプリ上のボタンから操作する場合はそこまで気にする事ではないですが。)
まあ、これで一旦は目的は達成です。
なので、バックグラウンドで動作させるようにします。
バックグラウンド動作にはforeverを使用します。
まずはforeverの導入。
インストールできたらforeverでhomebridgeを起動します。
動作しているかを確認するにはlistオプションで確認します。
インストールできたらforeverでhomebridgeを起動します。
注意点は、foreverで起動した場合は内部の認識が変わるからか、「ホーム」アプリで再登録する必要があります。
バックグラウンド起動した事によってQRコードが画面上に出てこないですが、「config.json」に記述したpinを使えば楽に登録しなおせます。
なお、後からリモコン学習したい時でもコードがコンソールに表示されなくなるのですが、listオプションで確認した際に使用しているログファイル「.forever/xxxx.log」が記載されているので、そのファイルを確認すれば対象のコンソールログ等が全て記録されています。(QRコードもここで確認する事も可能です。)
かなり長くなってしまいましたが、次回は本来の目的のGoogle Home Miniで操作を実装したいと思います。
また、今回の方法はiOS環境でしかコード取得できないので、Androidしかない環境でも取得する方法も書こうかなと。
【関連記事】
Google Home 関連記事一覧。
■閉じる■
とはいってもeRemoteシリーズは現状、Amazon Alexaには対応しているものの、Google Homeには未対応となります。
まあ、AlexaもLinkJapanがリリースしているコントロールアプリ「eHome」が必要になるのですが、現状では対応しているのが今年に入ってからの出荷ロットにのみ適用できるファームウェアのみ。(古いファームは「e-Control」アプリにしか対応していない。)
我が家のはホント出たてでモニター価格で売られてた時に買ったものなのでどの道、正規の方法では使えません。
なので、サーバーを用意して、IFTTT連携で操作する環境構築をやっちゃおうと。
という事で試行錯誤していました。まあ、かなりハマって時間がかかっちゃったんですが。
ネットでは結構同じような事やってる人多いですが、前提条件が分かってて当然だよね的に書かれていなかったり不親切な記事が多すぎて手探りでやるしかなかったので。
また、最終的にはインターネット側から命令が飛ぶ事もあって、LAN内とは切り離した方が安全かなーとサーバーをDMZに置こうしたのが間違いでした。
ファイアウォールで最低限ポート開けとけばいいかとか思ってたけど、どうもマルチキャストで通信してるっぽく、この後の実装した方法ではどうやっても拾えませんでした。
Sophos XG Firewallで相互のDestination NAT入れたり、マルチキャストルート書いてみたり色々やりすぎてよく分からない状態になってしまったので諦めてLAN内に置くことで落ち着いています。
前置きが長くなりましたが、はじめていきます。
と言いつつ、赤外線信号の取得がてら、まずはiOSのHomeKitに対応させてSiriから操作させてみました。
ちなみに、ネットで調べるとRaspberry Piで実装しているのがほとんどでしたが、VM上にCentOS7でサーバ立てて実装しています。
Node.js環境構築
今回導入するモジュール類がNode.js環境で動くものという事でまずはその環境構築です。Node.jsなんて触った事もなかったのでここから四苦八苦でした。
Node.jsを単体で導入してもいいんですが、バージョン管理が簡単に出来るnodebrewと言うのを入れてそこからNode.jsを導入します。
これは完全に好みです。今後、他に色々したくなった時にあった方がいいかなー程度の考えでうちでは入れました。
まずは必要なパッケージ類をインストール。他にmakeが必要です。
# yum install perl gcc-c++
Node.js動かす用にユーザー作成。既存のユーザーでもOKです。
# useradd xxxxxxx # passwd xxxxxxx
作ったユーザーにスイッチします。
# su - xxxxxxx
nodebrewのインストール。正常にインストールされたら以下のようにメッセージが続きます。
$ curl -L git.io/nodebrew | perl - setup % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 89 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 100 24507 100 24507 0 0 2975 0 0:00:08 0:00:08 --:--:-- 5626 Fetching nodebrew... Installed nodebrew in $HOME/.nodebrew ======================================== Export a path to nodebrew: export PATH=$HOME/.nodebrew/current/bin:$PATH ========================================
メッセージ内にパスをexportするように書かれているので実施します。これでnode系コマンドにパスが通ります。
$ export PATH=$HOME/.nodebrew/current/bin:$PATH
とは言っても、exportコマンドはログオフすれば消えてしまうのでログイン時にパスが通るように「.bash_profile」にも買いておきます。
$ vi .bash_profile最後尾に追記。
export PATH=$HOME/.nodebrew/current/bin:$PATH
インストール可能なnodeバージョンの確認。nodeのバージョンはメンテナンスバージョン(3オクテット目)が偶数が安定バージョン、奇数が開発バージョンとなるようです。
$ nodebrew ls-remote
nodeをインストールします。うちではv8の一番新しい安定版にしています。
$ nodebrew install-binary v8.9.2 Fetching: https://nodejs.org/dist/v8.9.2/node-v8.9.2-linux-x64.tar.gz ######################################################################## 100.0% Installed successfully
使用するnodeバージョンを指定します。1つしかインストールしてなくてもここは必須です。
$ nodebrew use v8.9.2 use v8.9.2
nodeのバージョン確認。
$ node -v v8.9.2
一緒に導入されるnpm(Node Packaged Modules)のバージョン確認。
$ npm -v 5.5.1
これでNode.js環境の準備は完了です。
Homebridgeの導入
iOSのHomeKitとなるサーバモジュールであるHomebridgeを導入します。まず、rootユーザーに戻って必要なパッケージを追加します。
CentOS7では以下が必要。
# yum install avahi avahi-compat-libdns_sd avahi-compat-libdns_sd-devel
インストールできたらnode用ユーザーに再度スイッチし、npmでhomebridgeをインストールします。
$ npm install -g --unsafe-perm homebridge
インストールが無事できたら一度homebridgeを起動してみます。これでホームディレクトリに「.homebridge」ディレクトリが作成されるはずです。
$ homebridgeコンソールに色々と表示されたらCtrl+Cで抜けます。
続いてeRemote用のモジュールを導入します。
$ npm install -g homebridge-broadlink-rm
インストールできたらeRemoteのMACアドレスを調べます。すでに分かっている場合は不要です。
homebridge-broadlink-rmに同梱されているgetDevice.jsを使用します。
$ node .nodebrew/current/lib/node_modules/homebridge-broadlink-rm/helpers/getDevice.js Discovered Broadlink RM device at xx.xx.xx.xx (aa:aa:aa:aa:aa:aa)
homebridge用のコンフィグを作成します。
$ cd .homebridge/ $ vi config.json
コンフィグサンプルです。
nameはHomeKit上に表示されるのでお好みで。
usernameは先程取得したMACアドレスを。ただし、アルファベットは大文字で。
portはデフォルトでいいかと。
pinはiOSのHomeアプリに登録する時に使うものなのでお好みで3-2-3桁で記載します。
accessories内のnameは呼びかける時に使うデバイス名等になります。
typeのswitchはオン/オフのみを定義するタイプの指定になります。
on/offにはこの後赤外線信号を取得して記載するので、ここでは空でOKです。
{ "bridge":{ "name":"Homebridge", "username": "AA:AA:AA:AA:AA:AA", "port":51826, "pin":"XXX-XX-XXX" }, "description":"Homebridge", "platforms": [ { "platform": "BroadlinkRM", "name": "Broadlink RM", "accessories": [ { "name": "○○(名前)", "type": "switch", "data": { "on": "", "off": "" } } ] } ] }
作成できたら改めてhomebridgeを起動します。
$ homebridge
コンソールにQRコードが表示されるのでiPhoneで「ホーム」アプリを起動して読み込み、アクセサリとして登録します。
各項目はデフォルトでOKですが、「よく使う項目に含める」はお好みでオフに。
ホームタブの「よく使うアクセサリ」欄に載せるかどうかになります。
「Learn」と「Scan Frequency」は基本的に普段は使わないですし。(「Scan Frequency」は使い道がそもそも分かってない。)
とは言いつつ、赤外線信号を取得する為にその「Learn」を使います。
「Learn」をタップしてオンにするとeRemote側のランプが光るので、eRemoteに向かって調べたいリモコンのキーを押します。
すると「learned hex code:」に続いて数字とアルファベットの組み合わせの長い文字羅列が表示されるのでそれを記録しておきます。
取得できたら「config.json」の「"on": ""」や「"off": ""」にその取得したコードを記述します。
オン/オフが同一ボタンの場合は両方に同じコードを記述します。
記述したらhomebridgeを起動し直せばオン/オフが操作できるようになっているかと思います。
ボタンが効くのが確認できたら「Hey! Siri! ○○○(accessories内のname)をオン」とか呼びかけると声でも操作できると思います。
注意点は、iOSのHomeKitは対象のデバイスに対して最後に出した命令を覚えていて、同一命令を連続で処理してくれません。
なので、オン/オフが同一コードのボタンを操作する場合でも、オンを2回言ってもそもそも命令を飛ばしてくれません。
そして一番問題になるのは別のリモコンで操作したないようは当たり前ですが知っていないので、HomeKit上のステータスとずれが生じる場合もあり割と面倒です。
(あくまでSiriで音声操作する場合で、ホームアプリ上のボタンから操作する場合はそこまで気にする事ではないですが。)
まあ、これで一旦は目的は達成です。
Homebridgeバックグラウンド起動
が、このままだとhomebridgeがフロントで動作していて、コンソールが占拠されています。なので、バックグラウンドで動作させるようにします。
バックグラウンド動作にはforeverを使用します。
まずはforeverの導入。
$ npm install -g forever
インストールできたらforeverでhomebridgeを起動します。
$ forever start ~/.nodebrew/current/bin/homebridgeこれで起動すればバックグラウンドで動作するので、プロンプトも返ってきます。
動作しているかを確認するにはlistオプションで確認します。
$ forever list
インストールできたらforeverでhomebridgeを起動します。
$ forever stop(restart) ididはlistオプションで表示されるidで、psコマンドで表示されるpidと同一になります。
注意点は、foreverで起動した場合は内部の認識が変わるからか、「ホーム」アプリで再登録する必要があります。
バックグラウンド起動した事によってQRコードが画面上に出てこないですが、「config.json」に記述したpinを使えば楽に登録しなおせます。
なお、後からリモコン学習したい時でもコードがコンソールに表示されなくなるのですが、listオプションで確認した際に使用しているログファイル「.forever/xxxx.log」が記載されているので、そのファイルを確認すれば対象のコンソールログ等が全て記録されています。(QRコードもここで確認する事も可能です。)
かなり長くなってしまいましたが、次回は本来の目的のGoogle Home Miniで操作を実装したいと思います。
また、今回の方法はiOS環境でしかコード取得できないので、Androidしかない環境でも取得する方法も書こうかなと。
【関連記事】
Google Home 関連記事一覧。
■閉じる■
| Home |