我輩はブロガーではない。ネタもまだない

SASとかDelphiあたりの人様の役に立たないネタを提供します

google homeに喋らせるお話(Windows only)

久方ぶりの更新です。

楽勝ぶっこいてたら、開発が遅れて+新しい仕事が入ってきててんやわんやです。

さて、今日はもう目新しくもなんともない、google homeのお話。
我が家にはgoogle home miniが4つほどあるのですが、使うことと言ったら
「タイマーセットして」
「起こして」
「ケータイ探して」
「電気とテレビ消して」
「ブロードキャスト、ご飯だよ」
くらいで、なんとも面白みのないガジェットでありました。

しかしながら、ようやく重い腰を上げ、新しい使い方に着手しました。




下の子が通う幼稚園えでは、送迎バスの状況をアプリのプッシュで「遅れている」もしくは「まもなく到着」と教えてくれます。
朝は忙しくていちいち通知を見てられないので、google home miniに喋らせられたら便利だな、というところがスタートです。
(バスの通知システムはバスキャッチ。スマホアプリからの通知はプッシュ通知かメール)
https://www.buscatch.com/solution/kindergarten/func/index.html


条件は以下の通り
スマホアプリ上、プッシュ通知か、メール通知どちらか。
→プッシュ通知は残したいので、別の家族を追加してメール通知を監視することに
(残念ながらIFTTTとGMAILの連携がなくなってしまったため、なかなか手間がかかりました)
・ラズパイ等のガジェットはないので、手持ちのWindowsマシンで運用
→Windows Home Server2011があるのでそちらで稼働させました。CPUがAtomなのでしんどい。



まず、準備としてバスキャッチで新しい家族を追加します。
gmailではメールアドレスに+で文字列を追加することで、エイリアスとしてサブメールアドレスを作成できます。
hogehoge+notify@gmail.com
というメールを作成し、エイリアスとして登録します。
(hogehoge@gmail.comで受信できます)
後は、システムへの登録メールを作成したメールエイリアスから送信すればOK。


続いて、Windows Home Serverの設定です。
http://kghr.blog.fc2.com/blog-entry-118.html
に従って
node.jsのインストール
windows-build-toolsのインストール
node-gypのインストール
BonjourSDK for Windows
(Bonjour Print Services for Windowsはインストールせず)
google-home-notifierのインストール

躓いたのは、BonjourSDKをインストールしなければいけないのに、Bonjourをインストールしていたことですね。
BonjourSDKが正しくないと、google-home-notifierのインストール時に「fatal error C1083:」というビルドのエラーが大量に出ます。
こういう場合には、きちんとBonjourSDKをインストール→環境変数に追加→コマンドプロンプトを再起動してから再度インストールしてみましょう。

さて、サンプルを元にGoogle homeに喋らせるためのスクリプト(hoge.js)を作成します

var googlehome = require('google-home-notifier');
var language = 'ja'; // ここに日本語を表す ja を設定
var message = 'こんにちは';

// ネットワーク内からGoogle Homeを見つけてくれる
googlehome.device('Google Home', language); 

googlehome.notify(message, function(res) {
  console.log(res);
});

これで、コマンドプロンプトでnode hoge.jsを実行すればドゥルン という通知音とともに、家中のgoogle home miniが「こんにちは」と喋ります。

ただ、我が家のgoogle home miniは全てGoogle nest wifi(192.168.86.0/24)に接続されていて、スクリプトはその上位ネットワーク(192.168.1.0/24)にいるので、仕方なく通知専用のgoogle home miniを192.168.1.xに接続させてリビンクに仮置しています。(nest wifiはベーシックなルーティング機能が欠落しているので、買い替え機器選定中です)


続いて、トリガーです。
先程も書きましたが、IFTTTのGMAILトリガーが使えなくなっているということで、諦めてDelphiで受信モジュールを自作しました。

要件としては
・1日3回(朝の迎え、半日保育の送り、一日保育の送り)起動する
→タスクスケジューラで対応
・起動したら40分もしくは通知を2回受信したら終了する(2回以上来ることはない)
→アプリケーション側でコントロール
・メールは1分間隔でチェックする
→アプリケーション側でコントロール
gmailには数千件のメールがあり、POP3で受信フラグを立てるのは現実的ではないので、最新メールのみチェックする
→アプリケーション側でコントロール
・通知メールを受信したら、jsを実行する
→アプリケーション側でコントロール

注意点は
Gmail側でPOPを有効にしておくこと
Gmailの認証用ユーザ名に「recent:」をつけること(これで最新のメールだけを受信するようになります)
Gmailのパスワードはアカウントのパスワードではなく、アプリパスワードを生成し、それを指定すること
Gmailばっかだな…

あとは、メールの件名の通りにつぶやくだけです。

// ShellExecuteで件名hoge.jsにぶん投げる
ShellExecute(0, nil, 'cmd.exe', PChar('/C node "hoge.js" "' +Msg.Subject + '"'), nil, SW_HIDE);


なお、喋る内容はパラメータを使いたいので

var message = process.argv[2]

のように修正しておきます。

あとはWindowsでタスクスケジューラに登録するだけ。


時間になったら「バスが遅れています」「まもなくバスが到着します」と喋りました。
メデタシメデタシ