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でタスクスケジューラに登録するだけ。
時間になったら「バスが遅れています」「まもなくバスが到着します」と喋りました。
メデタシメデタシ