Google Calendarの予定が始まる15分前にGoogle Homeから音声でリマインドを送る
最近リモートワークで働く割合が増えてきました。 集中していると会議などを忘れそうになるので、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への通知を行った