Google Homeを決まった時間にしゃべらせましたよ

2020年9月 IFTTTが有料サービスを導入しました。結果、いままで無料で使えていたアクションが動作しなくなっています。ここに記載されている方法を利用するには、有料サービスを購入しなければなりません。
現在、GoogleHomeのルーティンを使って実現できることが増えていますので、IFTTTを使わない方法を検討します。

指定した時間に指定したセリフをGoogle Homeにしゃべってもらうことが出来ました。
ポイントは、出来るだけ外部との通信は避けた形で実行できたことでしょうか。

なんちゃってSEの私にしては上出来です。

指定のメッセージをしゃべらせる方法は、ググればソコソコ出てきます。
しかし、トリガーが必要なので、どうしても外部からPOSTを受けなければいけないようです。そのために、ngrok使ったりしますが、そこにはサブドメイン問題があり、安定しない。といったハードルがありました。

外部からのPOSTを受け付けるといったことに、やたらビクビクする臆病な私は、なるべくLAN内で完結させたい。安定した運用にしたい。ということで、今回の方法を思いついたわけです。

使ったモノ

  • Raspberry Pi 3
  • MESH
  • MESH SDK
  • IFTTT(トリガーで必要)
  • iPad(iPhoneでも可)------- いまのところ必須

作業の流れ的には

  1. ラズパイにMESHハブをインストールし、iPadにインストールしたMESHを使ってレシピを作成できるようにします。
  2. ラズパイにgoogle-home-notifierをインストールします。
    curlコマンドで、ローカルアドレスへのPOSTを投げて、Google Homeがしゃべることを確認します。
  3. MESH SDKで新しいタグを作成します。
    しゃべらせたいメッセージと、POST先を指定できるタグを作ります。
  4. IFTTTに新しいアプレットを作ります。ServiceにDate&Time(発火する時間を指定)、ActionにMESH(IFTTTトリガーのEvevtIDを指定)
  5. iPadのMESHからMESHハブに接続し、IFTTTのTagを作成(指定のEventIDを受信したら次へ)します。先ほどMESH SDKで作成したTagを追加し、設置します。
    POST先は、先ほどテストしたローカルIPアドレスとポートを指定します。
  6. 時間になってIFTTTトリガーが届くと、無事「お片付けの時間です!」としゃべってくれました。

手順1.前回記事参照してください MESHを使ってスマートホームしてみる

手順2.相変わらず見よう見まねでインストールしました。

参考URL https://qiita.com/udon11/items/fef44cec7b243f93151b
とか https://qiita.com/azipinsyan/items/db4606aaa51426ac8dac
とか https://qiita.com/ktetsuo/items/8c9cd5714e231aa6ae09
とか https://qiita.com/setouchi/items/437e4b62e4210871496f

てか、参考先はqiitaばっかやね。
インストールできたら一番上の参考URLにあるように

node_modules/mdns/lib/browser.js
google-home-notifier.js

の設定を書き換えます。
ポートについては、替えても替えなくてもどちらでも良いと思います。

で、node example.js とすると、いくつか警告が出てから、起動します。
この警告は回避の仕方がわからないので、放置します。

すると、ここにPOSTしてね的なサンプルが表示されます。

[bash] Endpoints:
http://192.168.0.20:8091/google-home-notifier
undefined/google-home-notifier
GET example:
curl -X GET undefined/google-home-notifier?text=Hello+Google+Home
POST example:
curl -X POST -d "text=Hello Google Home" undefined/google-home-notifier
[/bash]

undefined/google-home-notifierの方は無視します。
http://[ローカルIP:ポート]/google-home-notifier を使います。

例文に従って、ラズパイのgoogle-home-notifierにPOSTして、無事Google HomeがしゃべってくれればOKです。

[bash] curl -X POST -d "text=Hello Google Home" http://192.168.0.20:8081/google-home-notifier
[/bash]

手順3. 前回(MESHを使ってスマートホームしてみる) と同様にMESHアカウントを使います。
MESH SDKを利用するにはアカウントが必要です。というか、MESHハブが、自分のアカウントを使って、MESH SDKで作ったタグをダウンロードして使う感じなのですね。

どんなタグを作るかというと

参考URL https://qiita.com/glory/items/a464872b9655a21e9f2f#_reference-2e741b4be65c6bb1bafa

99%同じものを作らせていただきました。
変更するところは、jsonの後方にあるPOST先のURLです。

[javascript] var endPointURL = \"https://\" + properties.ipAddress + \".ngrok.io/google-home-notifier\";

var endPointURL = \"http://\" + properties.ipAddress + \"/google-home-notifier\";
[/javascript]

参考URL先では、ngrokを使用していますので、ランダムなサブドメインに対応できるようになっていますが、まずngrokは使わないので、その部分を消します。サブドメインを入力できるところは、ラズパイのローカルIPとポートを打ち込めばいいのですが、今後の変更を考慮して、properties.ipAddressのままにしておきます。

MESH SDKの画面で書き換えたjsonをImportします。

問題なければ、新しいタグができあがりますので、Saveして終了。
Custom Tagの画面に今作ったタグが表示されていればOK。

手順4. IFTTTにログインします。New Appletをクリックします。

  • this  -  Date&Time (お好きな時間指定をしてください)
  • that  -  MESH (送信するEventIDを指定します)

手順5. iPadのMESHを立ち上げます。操作する端末をMESHハブに切り替えます。

画面右下にある「カスタム」の「追加」をタップします。すると、先ほどSDKで作ったタグが選択できます。

IFTTT・タグをキャンバスに配置します。ダブルタップするとプロパティが出ますので、「受信したら」を選択して、「EventID」に先ほど設定したIDを入力します。

カスタム・タグをキャンバスに載せて、プロパティを開くと、読み上げるための「text」とPOST先の「Address」がありますので、任意のものを入れます。

IFTTTタグ-カスタムタグをピキーンと繋いだら完成です。

これで、指定した時間に「○○ちゃん、おもちゃを片付け始めてね」と言ってくれるはず。


ちなみに、Google Homeの日本語アクセントが微妙なので、「○○ちゃん、お片付け始めてね」よりも「○○ちゃん、おもちゃを片付けはじめてね」の方が、より自然に聞こえます。

今回の場合は、テレビや遊びに夢中になっている子供に、時間が来たよと教えることが目的でした。

親が言うより、Google Homeが言った方が、注意を引くことが出来るというのは、なんとも・・・(汗

目覚ましのように、時刻設定をよく変更するようなものでなければ、結構使えると思います。
時間指定も、Date&Timeは15分刻みですが、MESHの方でトリガーを受け取ってから○分後に送信というタイマーを噛ませれば、分単位で動かすことができます。

親には反抗的ですが、Google Homeには素直な今時のお子さんにもってこいです(汗


自宅のRaspberry Pi に安全にリモート接続出来る環境があれば。例えばVPNで繋がっているとか。外出先からGoogle Homeをしゃべらせられますね。

ある意味怖いわぁ。

おすすめの記事