はじめに
毎朝、子供に「やれ準備は終わったか」だの「そろそろ出発の時間だぞ」など言ってるのが疲れるので、Google Homeさんにお願いすることにした。彼女ならスマートスピーカーの名の通り、スマートにお知らせしてくれることだろう。きっと。
先日、Raspberry Pi Zero Wも手に入れたし、node.js使って定刻通知をする仕組みを作ってみる。
用意したもの
- Google Home
- Raspberry Pi Zero W
彼女がいないと今回の話は始まらない。頑張ってくれたまへ。
主役その2。今回のシステムは常時稼働が条件なので、省エネ型のZeroをチョイスした。
実現方法
メッセージファイルはスプレッドシートを使うことにした。どこからでも手軽に書き換えられるし、夫婦で共有管理もできるので便利である。
- 特定の時間になったらスプレッドシートから該当メッセージを読み込む
- 取得したメッセージをGoogle Homeにしゃべらせる
これだけである。実に簡単だ。
[amazonjs asin=”B0746H9881″ locale=”JP” title=”Raspberry Pi Zero W Starter Kit”]
実装手順
nodeモジュール入れる
今回、node.jsで機能を実装していくにあたり2つのモジュールが必要になる。
google-spreadsheet
スプレッドシートからデータを取得するためのもの。単純なスプレッドシート操作であれば複雑な認証ステップ不要で繋げられるので便利
google-home-notifier
Google Homeにメッセージを話させるためのもの。いろいろなモジュールがあるらしいが、一番使われてそうな(日本語記事の多そうな)ものを選んだ。
ってことで、インストール
[bash]
$ npm init
$ npm i google-spreadsheet –save
$ npm i google-home-notifier –save
[/bash]
Google認証用サービスアカウント作成
サービスアカウントを使った認証方法はgoogle-spreadsheetのモジュールの説明ページに丁寧に書いてあるので、そちらを参考にするのがいいだろう。
簡単な英語なので大丈夫!怖くない!!
メッセージ管理用スプレッドシート作成
スプレッドシートを新規作成し、1行目に見出しをつける。google-spreadsheetモジュールではSQLみたいに見出しの名前を使って問い合わせができるので、見出しの名前を間違えないように注意が必要

- A列:【h】起動時刻の「時」を設定
- B列:【m】起動時刻の「分」を設定
- C列:【message】Google Homeで話すメッセージを設定
- D列:【note】メモ欄
スクリプト書く
それではいよいよスクリプトを書いていくわけであるが、本記事最下部に全文載せておくので、こちらではパートごとに説明をする
スプレッドシートの取得
サービスアカウント作成時にDLした認証ファイルを読み込みそれを使ってGoogleスプレッドシートを取得する。
シート数分取得できるので、info.worksheets[0]でメッセージを設定したシートを取得する
[javascript highlight=”6″]
const creds = require(‘./google-generated-creds.json’);
var spreadsheet = new GoogleSpreadsheet(‘<<スプレッドシートのIDを設定>>’);
spreadsheet.useServiceAccountAuth(creds, function(err) {
spreadsheet.getInfo(function(err, info) {
// 次の処理へ取得したシートを渡す
callback(err, info.worksheets[0]);
});
});
[/javascript]
メッセージの取得
google-spreadsheetはスプレッドシートをSQLライクに検索ができる。7時40分に起動したければqueryパラメータにh=7 and m=40を渡せばOKだ!すばらしい
[javascript highlight=”3″]
var now = new Date();
sheet.getRows({
query: ‘h=’ + now.getHours() + ‘ and m=’ + now.getMinutes(),
limit: 1
}, function(err, rows) {
if (rows.length >= 1) {
callback(err, rows[0].message);
} else {
callback(err, null);
}
});
[/javascript]
Google Homeへメッセージ送出
そして最後は取得したメッセージをGoogle Homeに送出すればビョロン♪みたいな接続音の後に指定したメッセージが流れる
[javascript]
if (msg !== null) {
googlehome.ip(‘192.168.xxx.xxx’); // Google HomeのIPアドレスを設定
googlehome.device(‘Google Home’, ‘ja’);
googlehome.notify(msg, function(res) {
console.log(res);
});
}
[/javascript]
cronの設定
最後に出来上がったスクリプトをcronで毎分起動設定すれば完成である。
さてさて、我が子はこれでちゃんと動いてくれるようになるのかな??
スクリプト全文
[javascript]
‘use strict’;
const async = require(‘async’);
const GoogleSpreadsheet = require(‘google-spreadsheet’);
const creds = require(‘./google-generated-creds.json’);
const googlehome = require(‘google-home-notifier’);
async.waterfall([
// スプレッドシートの取得
function(callback) {
var spreadsheet = new GoogleSpreadsheet(‘<<スプレッドシートのIDを設定>>’);
spreadsheet.useServiceAccountAuth(creds, function(err) {
spreadsheet.getInfo(function(err, info) {
callback(err, info.worksheets[0]);
});
});
},
// メッセージの取得
function(sheet, callback) {
// 該当時刻のメッセージ検索
var now = new Date();
sheet.getRows({
query: ‘h=’ + now.getHours() + ‘ and m=’ + now.getMinutes(),
limit: 1
}, function(err, rows) {
if (rows.length >= 1) {
callback(err, rows[0].message);
} else {
callback(err, null);
}
});
},
// Google Homeへメッセージ送出
function(msg, callback) {
if (msg !== null) {
googlehome.ip(‘192.168.xxx.xxx’); // Google HomeのIPアドレスを設定
googlehome.device(‘Google Home’, ‘ja’);
googlehome.notify(msg, function(res) {
console.log(res);
});
}
},
function(err) {
if (err) console.log(err);
}
]);
[/javascript]


