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ブラウザーで動作を確認しています。