2020年9月 IFTTTが有料サービスを導入しました。結果、いままで無料で使えていたアクションが動作しなくなっています。ここに記載されている方法を利用するには、有料サービスを購入しなければなりません。
現在、GoogleHomeのルーティンを使って実現できることが増えていますので、IFTTTを使わない方法を検討します。
指定した時間に指定したセリフをGoogle Homeにしゃべってもらうことが出来ました。
ポイントは、出来るだけ外部との通信は避けた形で実行できたことでしょうか。
なんちゃってSEの私にしては上出来です。
指定のメッセージをしゃべらせる方法は、ググればソコソコ出てきます。
しかし、トリガーが必要なので、どうしても外部からPOSTを受けなければいけないようです。そのために、ngrok使ったりしますが、そこにはサブドメイン問題があり、安定しない。といったハードルがありました。
外部からのPOSTを受け付けるといったことに、やたらビクビクする臆病な私は、なるべくLAN内で完結させたい。安定した運用にしたい。ということで、今回の方法を思いついたわけです。
使ったモノ
- Raspberry Pi 3
- MESH
- MESH SDK
- IFTTT(トリガーで必要)
- iPad(iPhoneでも可)------- いまのところ必須
作業の流れ的には
- ラズパイにMESHハブをインストールし、iPadにインストールしたMESHを使ってレシピを作成できるようにします。
- ラズパイにgoogle-home-notifierをインストールします。
curlコマンドで、ローカルアドレスへのPOSTを投げて、Google Homeがしゃべることを確認します。 - MESH SDKで新しいタグを作成します。
しゃべらせたいメッセージと、POST先を指定できるタグを作ります。 - IFTTTに新しいアプレットを作ります。ServiceにDate&Time(発火する時間を指定)、ActionにMESH(IFTTTトリガーのEvevtIDを指定)
- iPadのMESHからMESHハブに接続し、IFTTTのTagを作成(指定のEventIDを受信したら次へ)します。先ほどMESH SDKで作成したTagを追加し、設置します。
POST先は、先ほどテストしたローカルIPアドレスとポートを指定します。 - 時間になって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です。
↓
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をしゃべらせられますね。
ある意味怖いわぁ。