Google Homeにreminder機能を搭載してみる

# まえがき
ほんとはね、Amaz○n d○tsを手にいれようと思ってたんです。
けども、招待メール届かなくて悲しくなってたときに
Google Homeの半額キャンペーン!!
速攻買いにいきましたね。

あとここが重要です。**この記事だけで完結しませんでした、週末に続きを書きます:bow:**

# なぜリマインダー？
Google Homeにはリマインダー機能はありません。今だとこういう返しがきます。

================

:sunglasses: わし 「ねぇ、Google。明日朝の7時にゴミだしするようにリマインドして」
:cry: Google Home 『すいません、リマインダーの作成にはまだ対応していません』

================

↓それをこうしたい

================

:sunglasses: わし 「ねぇ、Google。明日朝の7時にゴミ出しするようにリマインドして」
:angel: Google Home 『わかりました』

〜次の日のAM７:00〜
:angel: Google Home 『7時になりました、ゴミ出しをしてください』
わし:smile:「はーい」

================

完全に自己満ですし、誰かとネタ被ってそうで怖いですね。
ですが、やっていきます！

# 技術要素

## 使用するサービス
使用するサービスごとに、今回使う機能をまとめてみました！

### Actions on Google
- プロジェクトの管理
- Google Homeのシミュレーター

### Dialogflow(api.ai)
- ユーザーの発言をトリガーにしたアクション登録
- アクションで使用する外部サービス連携の登録

### google-home-notifier
- Node.jsのスクリプトをトリガーにGoogle Homeに発言をさせる

### GCP（細かい選定は未定）
- リマインダーの管理
- リマインダー登録、実行、DBへのInsert/Deleteを行う

# 構成（想定）
さらにシーンに落としていくと、以下のようになります

## リマインダーの登録
:smiley: 「ねぇ、Google。明日の朝7時にゴミだしするようにリマインドして」
:angel: 「わかりました」

ユーザーの発言をトリガーに、リマインダーとして「**REST API経由でDB登録**」と「**Google Homeが発言**」をする２つのアクションを発生させます。

そのためトリガーについての設定は「Dialogflow」を使っていきます。

### トリガー：ユーザーの発言
ユーザーの発言をトリガーにGoogle Homeに話させたり、スクリプトを動かしたりできます。

### アクション：REST API経由でDB登録
**[Dialogflow: Intents > Events]**
ユーザーの発言から取得した情報を、用意したスクリプトを使ってwebアプリへ受け渡します

### アクション：Google Homeが発言 
**[Dialogflow: Intents > Response]**
Google Homeに発言してほしい言葉を登録します

## リマインダーの実行
〜次の日のAM７:00〜
:angel: Google Home 『7時になりました、ゴミ出しをしてください』
わし:smile:「はーい」

webサーバー上でタイマーを仕掛けて、時間になったらwebアプリからGoogle Homeへ発言させるアクションを起こします。

### トリガー： タイマー
node-cronなどを使って、タイマーを仕掛けようと考えて居ます

### アクション： Node.jsのスクリプトからGoogle Homeへ発言させる

**[webアプリ: google-home-notifier]**
Google Homeに発言してほしい言葉を送信します

# 試したことメモ

## 新規でプロジェクトを作って、ユーザーの発言ををトリガーにGoogle Homeに発言させる

参考：[Actions on Googleでapi.aiを使ってGoogle Homeに何か言わせてみる](https://qiita.com/syarihu/items/53ea1a65f481f8121109)

実機テストのやめ方がわからなかったのですが、「やめて」といえばいいみたいですね。
（時間経過でも止まります）

## NodeからGoogle Homeに発言させる

参考： [Google Home開発入門 / google-home-notifier解説](https://qiita.com/SatoTakumi/items/c9de7ff27e5b70508066)

```shell
$ mkdir reminder; cd $_
$ vim main.js
```
```js:main.js
const googlehome = require('google-home-notifier')
const language = 'ja';

googlehome.device('Google-Home', language);

googlehome.notify('こんにちは。私はグーグルホームです。', function(res) {
	  console.log(res);
});
```

このスクリプトを実行すると、Google Homeの名前とIPが取得できます。
使うことがあるので、この取得方法は覚えておくと便利です。
（Google Homeアプリ内に載ってるらしいのですが、見つけれていないです・・・）

```shell
$ node main.js
# ちょっと書き換えてます
Device "Google-Home-e85~4e240" at 192.168.100.103:8009
Device notified
```

# 参考記事（未分類）
- [Dialogflow入門](https://qiita.com/kenz_firespeed/items/0979ceb05e4e3299f313)
- [Google Home開発入門 / google-home-notifier解説](https://qiita.com/SatoTakumi/items/c9de7ff27e5b70508066)
- [Dialogflow と Firebase Cloud Functions で Actions On Google 作り](https://qiita.com/doki_k/items/11f8a23d71dce59409da)

他にも参考にさせていただいてる記事がたくさんあるので、追記していきます！

# あとがき
なぜ終わらなかったか、という~~いいわけ~~話ですが
**google-home-notifier**を見つけるまで、**Dialogflow > Intents > Events**が
スクリプトからGoogle Homeに発言させることができる機能だと勘違いしていたからです。
ドキュメントをきちんと読まずにそれっぽいcurlのサンプルを見つけてしまったので盛大に勘違いして時間を無駄にしてしまいましたorz

実装方針が固まってきたので今週中に記事にします！本編は、しばしお待ちを・・・:bow: