ぶるーすくりーん

ぽんこつプログラマ日記

Google Home から音声で Google Fit にアクティビティを追加する1(Firebase・IFTTT 編)

Google Home から IFTTT、Firebase 経由で◯◯するという記事はすでにいくつかありますが、仕様変更のためか動かなかった部分があったりしたので自分なりにまとめてみました。

以下の記事を参考にさせてもらいました m( )m

qiita.com

qiita.com

できるようになること

Google Home に「OK グーグル!健康体操を開始して!」と「OK グーグル!健康体操を終了して!」と話かけると、Google Fit に健康体操を実施した記録を作成してくれます。

構成

f:id:tajima0111185:20171223121249p:plain

利用するものはすべて無料です。
Firebase は、保存可能なデータ量やダウンロード量などに制限がありますが、個人で Google Home と連携するという目的で使うのみであれば、無料枠で十分です。
詳しくは、Firebase 料金 を参照してください。

やることの流れ

  • Firebase の設定
  • IFTTT の設定
    • Google Home から Firebase へデータ登録
  • Google Fit の設定
  • expresss アプリ作成
    • Firebase のデータ読み込み
    • Google OAuth2 認証
    • Google Fit への登録

Firebase プロジェクト作成

Firebase コンソール を開き、プロジェクトを作成します。

Firebase - Realtime Database の設定

Realtime Database はスキーマレスのデータベースのため、スキーマ定義は不要です。
ただし、認証やバリデートの設定は必要になります。
認証をはしょっている記事が多かったですが、これをしないと誰でもなんでも書き込めるようになってしまいます。

パス & データ構造

今回は、データを以下の形式で格納することとしました。

/google-fit/log/{createdAt に基づくユニークキー}
キー 必須 長さ
text String 1-100 文字 Google Home への会話から取得した値

ルールの作成

Firebase コンソール の該当プロジェクトを開き、Database -> ルール を開き、以下を設定

{
  "rules": {
    // データの読み込みは node.js などの admin 用ライブラリからのみ許可
    ".read": false,

    // データ書き込みは認証済みユーザのみ許可
    ".write": "auth != null",

    "google-fit": {
      "log": {
        // text フィールドは必須、String 型、1-100 文字
        "$key": {
          ".validate": "newData.hasChildren(['text'])",
          "text": {
            ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 101"
          }
        }
      }
    }
  }
}

ルールの細かい設定は、以下のページが参考になりました。

qiita.com

シュミレータ

Firebase コンソールのルールの設定ページにあるシュミレータを利用すると、データに対しどのバリデートルールで OK/NG となるかを確認することができます。
ルールのテストに便利です。

f:id:tajima0111185:20171216124753p:plain

Firebase アプリケーションのシークレット取得

[データベース設定]ページ にアクセスしシークレットを控えておきます。

curl で確認

SECRET=【上記で取得した値】

curl -X POST -d '{
    "text": "開始"
  }' \
  -H "Content-type: application/json" \
  https://refined-byte-188701.firebaseio.com/google-fit/log.json?auth=$SECRET -i

200 OK で name として作成したデータのキーが返却されれば成功です。

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 16 Dec 2017 03:53:20 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 31
Connection: keep-alive
Access-Control-Allow-Origin: *
Cache-Control: no-cache
Strict-Transport-Security: max-age=31556926; includeSubDomains; preload

{"name":"-L0SS5zDUhHS_XXUeJr3"}

Firebase コンソールの データ タブで登録したデータを確認することができます。

f:id:tajima0111185:20171216125438p:plain

IFTTT の設定

New Applet を選択。

f:id:tajima0111185:20171216125634p:plain

this をクリックして Google Assistant を選択します。
すると、トリガー選択画面になるので、Say a simple phrase を選択します。

「開始」用のトリガーを作成します。

f:id:tajima0111185:20171216130353p:plain

that をクリックして Webhooks を選択します。 すると、トリガー選択画面になるので、Make a web request を選択します。

f:id:tajima0111185:20171216132641p:plain

以上で、「開始」用の Applet 作成は完了です。 同様に「開始」を「終了」に変更してもう1つ Applet を作成します。

Google Assistant のトリガーで Say a phrase with a text ingredient を選択すると Google Home に話しかけたテキストを利用することができます。
これを利用して1つの Applet で「開始」「停止」を声から取得する方法もありますが、話しかけ方によって「開始を」や「の開始」など予期しないデータが入ったりするので、今回は使用しませんでした。

Google Home から動作確認

Google Home に向かって「ねぇ Google、健康体操を開始して」「ねぇ Google、健康体操を終了して」とはなしかけてみて、Firebase コンソールでデータがそれぞれ登録されていれば OK です。

次は、express アプリを作成して、Firebase の読み込みや Google Fit への登録を行っていきます。 Google Home から音声で Google Fit にアクティビティを追加する2(nodejs・Google Fit 編)