2019年8月31日土曜日

Actions on Google を Firebase Realtime Database に接続

Actions SDKを使用したAction on GoogleとFirebase Realtime Databaseを接続できるか試しました。

まだかろうじて接続できていることが確認できた段階ですが…

参考にしたページとうまくいった方法のメモ。

Firebaseのドキュメントを読む時、Actions on GoogleはNode.js のウェブアプリと考えて大丈夫そう。

準備

JavaScript でのインストールと設定
https://firebase.google.com/docs/database/web/start

これ↓に沿って進める。

Firebase を JavaScript プロジェクトに追加する
https://firebase.google.com/docs/web/setup

構成情報の入手方法
https://support.google.com/firebase/answer/7015592

こんな感じ

デプロイについてはここら辺も参考になる?
https://firebase.google.com/docs/cli/#deployment

ここ(ウェブでのデータの読み取りと書き込み)ここ(「本気のしりとり」Google Homeアプリを作りました。) を見て色々書いてみるも、 snapshot.val() の値が [object Promise] となってしまってうまくいかない…

↓↓↓

DBからの読み出しができたコード

ここを見て真似したらできた!

データの取得>はじめに
https://firebase.google.com/docs/database/admin/retrieve-data?hl=ja#section-start

やああああっっとできたああああああ

真似したコードはこれ

// Import Admin SDK
var admin = require("firebase-admin");

// Get a database reference to our posts
var db = admin.database();
var ref = db.ref("server/saving-data/fireblog/posts");

// Attach an asynchronous callback to read the data at our posts reference
ref.on("value", function(snapshot) {
  console.log(snapshot.val());
}, function (errorObject) {
  console.log("The read failed: " + errorObject.code);
});

以下、サンプルコードを改変してあいさつの言葉をDBから読みだすようにしたコード。

元コード: actions-on-google/actionssdk-say-number-nodejs: Say a number Actions SDK sample for Actions on Google

改変後

'use strict';

// Firebase App (the core Firebase SDK) is always required and
// must be listed before other Firebase SDKs
var firebase = require("firebase/app");

// Add the Firebase products that you want to use
require("firebase/auth");
require("firebase/database");

const functions = require('firebase-functions');
const {actionssdk} = require('actions-on-google');

const app = actionssdk({debug: true});

// Your web app's Firebase configuration
var firebaseConfig = {
  // Firebase console で取得した構成情報を貼り付け
};

// Initialize Firebase
firebase.initializeApp(firebaseConfig);

// データベースでデータの読み書きを行うには、firebase.database.Reference のインスタンスが必要
// Get a reference to the database service
var database = firebase.database();
var ref = database.ref("greeting/morning");

var greetWord = "Hi!";

// Attach an asynchronous callback to read the data
ref.on("value", function(snapshot) {
  console.log(snapshot.val());
  greetWord = snapshot.val();
}, function (errorObject) {
  console.log("The read failed: " + errorObject.code);
});

app.intent('actions.intent.MAIN', (conv) => {
  conv.ask('<speak>' + greetWord + '<break time="1"/> ' +
  'I can read out an ordinal like ' +
  '<say-as interpret-as="ordinal">123</say-as>. Say a number.</speak>');
});

// 以下、元のサンプルコードと同じ

1回しか読み込まれていない?

けどこのままではfirebase deploy したタイミングでしかDBの変更が反映されない様子。
トリガーのタイミングについてはここら辺?

Realtime Database トリガー
https://firebase.google.com/docs/functions/database-events?hl=ja

こう↓すると、MAIN intent が呼び出される度にDBが読み込まれて、すぐには反映されないけど次の回では反映されてるのが確認できた。
てことはやっぱりPromiseとかCallbackの使い方が間違ってるんだろうな…。

// Attach an asynchronous callback to read the data
function readDb() {
  ref.once("value", function(snapshot) {
    console.log(snapshot.val());
    greetWord = snapshot.val();
  }, function (errorObject) {
    console.log("The read failed: " + errorObject.code);
  });
}

readDb(); // firebase deploy のタイミングで読み込み

app.intent('actions.intent.MAIN', (conv) => {
  readDb();  // MAIN intent のタイミングで読み込み。
  // 次にMAIN intent を呼び出した時には反映されていることが確認できる。

  conv.ask('<speak>' + greetWord + '<break time="1"/> ' +
  'I can read out an ordinal like ' +
  '<say-as interpret-as="ordinal">123</say-as>. Say a number.</speak>');
});

0 件のコメント:

コメントを投稿