この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
最近リモートワークで働く割合が増えてきました。 集中していると会議などを忘れそうになるので、Google HomeからGoogle Calendarに登録しているスケジュールを音声で通知出来るようにしました。
前提条件
- Google Homeをセットアップ済みであること
- Google Homeと同じLAN内にNode.jsが実行できるサーバがあること(Raspberry Pi 3 Model Bを利用しました)
動作環境
- Node.js:v8.11.1
- npm:6.2.0
- OS:Raspbian GNU/Linux 9
構成
簡単な動作の流れは以下のような感じです。
- IFTTTでGoogle Calendarをトリガー
- IFTTTからngrok経由で公開したサーバのURLを叩く
- サーバがgoogle-home-notifierを実行し、Google Homeから音声が流れる
やってみる
google-home-notifierのインストール
$ npm install google-home-notifier
$ git clone https://github.com/noelportugal/google-home-notifier
$ cd google-home-notifier/
$ npm install
テスト実行
example.jsを編集し、IPアドレスを利用しているGoogle Homeのものに切り替えます。 IPアドレスはGoogle Homeアプリのデバイス→利用するGoogle Homeの設定から確認できます。
$ vi example.js
$ git diff example.js
**diff --git a/example.js b/example.js**
**index 43454e6..1a8e0d3 100644**
**--- a/example.js**
**+++ b/example.js**
@@ -6,7 +6,7 @@ var app = express();
const serverPort = 8091; // default port
var deviceName = 'Google Home';
-var ip = '192.168.1.20'; // default IP
+var ip = '192.168.0.5'; // default IP
var urlencodedParser = bodyParser.urlencoded({ extended: false });
サーバーを起動します。
$ node example.js
Endpoints:
http://192.168.0.5:8091/google-home-notifier
https://xxxxxx.ngrok.io/google-home-notifier
GET example:
curl -X GET https://xxxxxx.ngrok.io/google-home-notifier?text=Hello+Google+Home
POST example:
curl -X POST -d "text=Hello Google Home"
https://xxxxxx.ngrok.io/google-home-notifier
出力された例に合わせてコマンドを入力し、Google Homeから音声が出力されることを確認します。
$ curl -X GET https://xxxxxx.ngrok.io/google-home-notifier?text=Hello+Google+Home
サーバの用意
今回はexample.js同様、ngrok経由でサーバへのアクセスをしますが、example.jsそのままだとURLを知っていれば誰でもアクセスできてしまうので一応Basic認証をかけます。また、言語設定を日本語に変更しました。
この際、ngrokのトークンが必要となるためngrok.comからngrokにサインアップし、こちらからトークンを取得します。
example.jsで起動したサーバーをngrokに接続している部分を以下のように書き換えます。
$ git diff example.js
**diff --git a/example.js b/example.js**
**index 43454e6..28eff37 100644**
**--- a/example.js**
**+++ b/example.js**
@@ -6,7 +6,7 @@ var app = express();
const serverPort = 8091; // default port
var deviceName = 'Google Home';
-var ip = '192.168.1.20'; // default IP
+var ip = '192.168.0.5'; // default IP
var urlencodedParser = bodyParser.urlencoded({ extended: false });
@@ -21,7 +21,7 @@ app.post('/google-home-notifier', urlencodedParser,
function (req, res) {
ip = req.query.ip;
}
- var language = 'pl'; // default language code
+ var language = 'ja'; // default language code
if (req.query.language) {
language;
}
@@ -96,7 +96,7 @@ app.get('/google-home-notifier', function (req, res) {
})
app.listen(serverPort, function () {
- ngrok.connect(serverPort, function (err, url) {
+ ngrok.connect({addr:serverPort,authtoken:"xxxxx",auth:"user:pwd"},
function (err, url) {
console.log('Endpoints:');
console.log(' http://' + ip + ':' + serverPort + '/google-home-notifier');
console.log(' ' + url + '/google-home-notifier');
authtokenの値は先ほど取得したngrokのトークンに書き換えます。また、auth:"user:pwd"のuser,pwdの値がそれぞれBasic認証のユーザ名、パスワードになるので任意の値に書き換えます。
Basic認証のテスト
$ curl -X GET https://xxxxx.ngrok.io/google-home-notifier?text=Hello+Google+Home
Authorization Failed
$ curl -X GET -u "user:pwd"
https://xxxxx.ngrok.io/google-home-notifier?text=Hello+Google+Home
Google Home will say: Hello Google Home
Basic認証のユーザ名、パスワード指定時のみサーバへのアクセスができることを確認できました。
サーバを起動
$ sudo npm install -g forever
$ forever start example.js
foreverのログからngrokのURLをメモしておきます。
$ forever list
$ cat /pi/.forever/Lyqg.log
IFTTTの設定
IFTTTのMy Applets→NEW AppletからAppletを新規設定します。
thisにGoogle Calendarを指定します。
Any event startsを指定します。
Time before event startsに、イベントの何分前に通知を行うか指定します。
thatにWebhooksを指定します。
リクエストに以下を設定します。
- URL:
https://user:pwd@xxxxxx.ngrok.io/google-home-notifier
- Method:
POST
- Content Type:
application/x-ww-form-url
- Body:
text=15分後に{{Title}}が始まります
URLにはBasic認証のユーザ名、パスワードおよび、サーバの起動時に取得したngrokのURLを指定します。
これでIFTTTの設定が完了しました。
Google Calendarに登録したイベントが近づくと、IFTTTからWebhook経由でgoogle-home-notifierのサーバへアクセスし、Google Homeから音声で通知が行われます。
まとめ
- google-home-notifierはLAN内からGoogle Homeへpush通知を行うことができる
- ngrokはローカルで起動しているサーバを、インターネットに公開できる
- Google Calendarは予定がはじまるX分前にIFTTTでトリガーできる
- 本記事では以上を踏まえて、Google Calendar→ITFFF→ngrok→ローカルのサーバ→google-home-notifier→Google Homeといった流れでGoogle Homeへの通知を行った