Google Home でイベントスケジュールを自動アナウンス

著者名:三宅 智子(サイボウズ株式会社)

目次

概要

Google HomeNode-REDkintone を使って、イベントスケジュールを音声で自動アナウンスするプログラムを実装します。
Node.js 環境が必要なため、 下準備 を参考に Node.js をインストールしてください。

シナリオ

kintone に登録しているイベントのタイムテーブルデータを一定時間おきにチェックして、今から 10 分後までに始まるセッションを Google Home でお知らせします。

  • 10 分後までに始まるセッションがある場合は、そのセッション名をお知らせ
  • 10 分後までに始まるセッションがない場合は、その他のコンテンツをお知らせ

Node-RED とは

ハードウェアデバイス、API およびオンラインサービスを接続するためのツールです。
ブラウザーベースのエディタによってパレットに並ぶ多種多様なノードを結び付けて簡単にフローを作成でき、さらにシングルクリックで実行環境にデプロイできます。

Rasberry Pi や Arduino などのデバイスをはじめ、IBM Cloud、AWS、Azure などのクラウドサービス上に立てることもできますが、今回はローカルにインストールして実行します。
Node-RED サイト (External link) より一部抜粋)

kintone アプリ作成

イベントのタイムテーブルを登録するための kintone アプリとして「セッション管理アプリ」を作成します。

  1. 以下のフィールドを配置したアプリを作成します。

    フィールドタイプ フィールド名 フィールドコード
    日付 日付 date
    時刻 開始 startTime
    時刻 終了 endTime
    文字列(1行) セッション名 sessionName
  2. サブドメイン名アプリID をメモしておきます。
    メモした情報は、のちほど Node-RED エディタでフロー構築 で使用します。

    例:URL が https://sample.cybozu.com/k/10/ の場合、「sample」がサブドメイン名、「10」がアプリ ID です。

  3. いくつかテスト用にレコードを追加しておきます。

これで kintone の設定は完了です。

Google Home アプリのインストールと設定

次は、Google Home を使うための初期設定です。
Google Nest または Google Home のスピーカーやディスプレイをセットアップする (External link) 等に手順が載っているので、参考にしながら進めてください。

  1. 電源ケーブルを Google Home デバイスに差し込みます。
  2. 電源アダプターをコンセントに差し込みます。
  3. モバイルやタブレットで Google Home アプリをダウンロードして開きます。
  4. Google Home デバイスとの接続設定をします。
  5. 設定が完了したら、アプリ内のデバイスメニューより、今回使いたい Google Home デバイスを選択し、IPアドレス を確認しメモしておきます。
    のちほど Node-RED エディタでフロー構築 でデバイス指定をする時に利用します。

アナウンスの言語を変更する場合は、 Google アシスタントの言語を変更する (External link) を参考にしてください。

Node-RED の設定

続いて、処理フローを定義する Node-RED をインストールし、設定します。
ここでは Mac OS での手順のみ記載します。
Windows の方は別途ドキュメントサイトを確認してください。
参考: Node-RED User Group Japan のドキュメント (External link)

下準備

ローカル環境に Node-RED をインストールするためには サポートされている Node のバージョン (External link) が必要です。

  1. Node.js をインストールします。
    参考: Node.js のインストールガイド(macOS) (External link)
  2. 日付処理のための Moment.js をインストールします。
    参考: Moment.js サイト (External link)

Node-RED のインストール

  1. ターミナルより、npm コマンドでインストールします。
    参考:「 ローカルで Node-RED を実行する (External link)

    1
    2
    3
    4
    5
    6
    
    $ sudo npm install -g --unsafe-perm node-red
    
    --- 中略 ---
    + node-red@0.20.6
    added 364 packages from 350 contributors and audited 1493 packages in 16.606s
    found 0 vulnerabilities
  2. node-red コマンドを使って Node-RED を起動します。
    Ctrl-C もしくは、ターミナルウィンドウを閉じることで Node-RED を停止できます 。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    $ node-red
    
    Welcome to Node-RED
    ===================
    
    25 Mar 22:51:09 - [info] Node-RED version: v0.20.5
    25 Mar 22:51:09 - [info] Node.js  version: v10.15.3
    25 Mar 22:51:09 - [info] Loading palette nodes
    25 Mar 22:51:10 - [warn] ------------------------------------------
    25 Mar 22:51:10 - [warn] [rpi-gpio] Info : Ignoring Raspberry Pi specific node
    25 Mar 22:51:10 - [warn] ------------------------------------------
    25 Mar 22:51:10 - [info] Settings file  : /home/nol/.node-red/settings.js
    25 Mar 22:51:10 - [info] Context store  : 'default' [module=localfilesystem]
    25 Mar 22:51:10 - [info] User Directory : /home/nol/.node-red
    25 Mar 22:51:10 - [warn] Projects disabled : set editorTheme.projects.enabled=true to enable
    25 Mar 22:51:10 - [info] Server now running at http://127.0.0.1:1880/
    25 Mar 22:51:10 - [info] Creating new flows file : flows_noltop.json
    25 Mar 22:51:10 - [info] Starting flows
    25 Mar 22:51:10 - [info] Started flows

Node-RED エディタでフロー構築

  1. http://localhost:1880 にアクセスして、Node-RED エディタを開きます。

  2. 右上の「≡」をクリックして、「パレットの管理」を選択します。

  3. 「ノードを追加」タブをクリックして、以下 3 つのノードを追加します。
    追加すると、エディタ左のノードメニューから選択できます。

  4. エディタ左のノードメニューから右へドラッグ&ドロップして、フローを作成します。
    それぞれ以下のとおり設定してください。

    ノード ノード名 詳細設定
    inject RepeatExecution
    • ペイロード:日時
    • Node-RED 起動後 0.1 秒後、以下を行う(チェックをいれる)
    • 繰り返し:指定した時間間隔(10 分)
    • 名前:RepeatExecution
    kintone GetSessions
    • 名前:GetSessions
    • 設定:鉛筆アイコンをクリックして以下を指定
      • 名前:Config
      • ドメイン:ご自身の環境のドメインを指定
      • ログイン名:ご自身のものを指定
      • パスワード:ご自身のものを指定
      • Basic 認証:(必要あれば指定)
    • メソッド:GET
    • アプリ ID: kintone アプリ作成 で作成した kintone アプリの「アプリID」を入力
    • クエリ:date = TODAY()
    debug msg.payload
    function npm GetNextSessions
    debug msg.payload
    cast PlayGoogleHome
  5. 右上の「デプロイ」ボタンをクリックして、環境にデプロイします。

サンプルコード

「function npm ノード」に次のコードを入力します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
 * Google Home sample program
 * Copyright (c) 2019 Cybozu
 *
 * Licensed under the MIT License
 * https://opensource.org/license/mit/
 */

// moment.js のインストール
const moment = require('moment');

// 現在時刻
const now = moment().format('HH:mm');

// 10分後の時刻
const afterTenMins = moment().add('minutes', 10).format('HH:mm');

// GET リクエストでエラーが発生した場合
if (msg.payload.message) {
  msg.payload = msg.payload.message;
  return msg;
}

// GET リクエストが成功した場合
// kintone から取得したレコード情報
const sessions = msg.payload.records;

// レコードがなかった場合
if (sessions.length === 0) {
  msg.payload = 'kintone にセッション情報がありません。';
  return msg;
}

// レコードがあった場合
// 直近のセッション情報を取得
const sessionArray = [];
sessions.forEach((session) => {
  const startTime = session.startTime.value;
  const sessionName = session.sessionName.value;
  if (now <= startTime && startTime <= afterTenMins) {
    sessionArray.push(sessionName);
  }
});

// 10分以内に始まるセッションがない場合
if (sessionArray.length === 0) {
  msg.payload = '10分以内に始まるセッションはありません。お時間があれば、ブースなどをお楽しみください。';
  return msg;
}

// 10分以内に始まるセッションがある場合
msg.payload = '次のセッションは、' + sessionArray.join('、と') + 'です。楽しんで!';
return msg;

動作確認

デプロイできたら、「RepeatExecution ノード」の左横の角ブロックをクリックして実行します。
Google Home からの発話があれば成功です!
右側のデバッグマークをクリックすると、実行結果を表示しながらデバッグが可能です。

おわりに

Node-RED のタイムスタンプを使うことで、Google Home へのプッシュ通知を可能にしているのがこの Tips のポイントです!
今回はローカルで実行していますが、いろんなイベントで使い回すことを考えると、移行が楽な Docker や AWS などのクラウド上で実行環境を整えるのが便利です。
ぜひ他の方法でもチャレンジしてみてください。

information

この Tips は、2019 年 7 月時点の kintone と Google Chrome ブラウザーで動作を確認しています。