Google Calendarの予定が始まる15分前にGoogle Homeから音声でリマインドを送る

最近リモートワークで働く割合が増えてきました。 集中していると会議などを忘れそうになるので、Google HomeからGoogle Calendarに登録しているスケジュールを音声で通知出来るようにしました。
2018.07.17

最近リモートワークで働く割合が増えてきました。 集中していると会議などを忘れそうになるので、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

構成

簡単な動作の流れは以下のような感じです。

  1. IFTTTでGoogle Calendarをトリガー
  2. IFTTTからngrok経由で公開したサーバのURLを叩く
  3. サーバが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への通知を行った

参考