【Raspberry Pi】子供への通知はGoogle Homeさんに任せた

はじめに

毎朝、子供に「やれ準備は終わったか」だの「そろそろ出発の時間だぞ」など言ってるのが疲れるので、Google Homeさんにお願いすることにした。彼女ならスマートスピーカーの名の通り、スマートにお知らせしてくれることだろう。きっと。

先日、Raspberry Pi Zero Wも手に入れたし、node.js使って定刻通知をする仕組みを作ってみる。

用意したもの

  • Google Home
  • 彼女がいないと今回の話は始まらない。頑張ってくれたまへ。

  • Raspberry Pi Zero W
  • 主役その2。今回のシステムは常時稼働が条件なので、省エネ型のZeroをチョイスした。

実現方法

メッセージファイルはスプレッドシートを使うことにした。どこからでも手軽に書き換えられるし、夫婦で共有管理もできるので便利である。

  1. 特定の時間になったらスプレッドシートから該当メッセージを読み込む
  2. 取得したメッセージを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みたいに見出しの名前を使って問い合わせができるので、見出しの名前を間違えないように注意が必要

Google Home Reminder設定ファイル
Google Home Reminder設定ファイル

  • 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]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です