Use Case(ユースケース)
Google音声コマンド経由で別のGoogle Homeデバイスにメッセージ送信を行います。(Google Home Notifier経由)
前提条件
- (Raspberry Piの)Google Home Notifier導入が終わっている「google-home-notifier」導入
- (Raspberry Piの)PHPが動作するWEBサーバがセットアップされている
- (Raspberry Piの)WEBサーバの公開設定が終わっている
- DNSで名前解決ができる、固定IPやダイナミックDNSを利用 SynologyでValueDomain向けのDDNS設定方法
- ルーターのNAT / Port Foward / Virtual Serverの設定が出来ており、インタネットからWEBサーバにアクセスできる API連携プラットフォーム
- (Raspberry Piの)https経由(SSL証明書)が設定済み
- IFTTTサービスの利用登録が実施済みである
- IFTTTサービスにおいて、Webhooksが利用可能である IFTTT(イフト)でWebhooksの利用
全体の流れ
- IFTTTのGoogle Assistantより指定スピーカーへの音声コマンドをトリガートリガー登録
- IFTTTのWebhooksでPCシャットダウン時の音声コマンド受領時のアクションを実行(Raspberry PiのWEB APIへ発信)
- Google Homeスピーカーでアナウンス(Google Home Notifier経由)
トリガー
トリガー(this)にGoogle Assistantを選択し「Say a phrase with a text ingredient」のトリガーを選択します。これで、コマンドに加えて、不定形のテキストメッセージを追加出来ます。
音声コマンドを登録します。
「リビングにアナウンス $」
「リビングに連絡 $」などを登録します。
$部分が、不定形のテキスト部分となります。
コマンド受付時のGoogle Homeからのレスポンスも登録します。
「リビングにアナウンスします」
Lanuguage(言語)は、Japanese(日本語)を選択します。
アクション
IFTTTのWebhooksよりRaspberry PiのWEB APIへPUSH通知
- URL:準備したAPIのURLを指定します。外部からWEBアクセス可能なURLを指定する必要があります。また、APIトークンを送信するので、https:// での指定を強くオススメします。
- Method:今回は、POST受信に対応したPHPを用いるので、POSTを指定します。
- Content Type:
application/x-www-form-urlencoded
: キーと値は、その間に'='
がある形でキーと値の組になり、'&'
で区切られてエンコードされます。キーや値の英数字以外の文字は、パーセントエンコーディングされます。 - Body:準備したPHPの仕様に合わせて、3つのパラメータを設定します。
- APIKEY=apikey
- KEY=ExecAnnounce1 3台のスピーカーがあり、リビングを1としています。ExecAnnounce2を子供1、ExecAnnounce3を子供2としているので、それぞれ別のレシピとして登録します。
- text={{TextField}} 不定形テキスト「$」部分となります。
APIKEY=apikey&KEY=ExecAnnounce1&text= {{TextField}}
以下が、準備したサンプルのPHPスクリプトとなります。
//@HOME_API_LOG_NAME@ ログファイル名、書き込み権限が必要です //@HOME_API_KEY@ POST受信時の簡易的なAPI-KEYのトークン確認を行います //@IFTTT_POST_API_KEY@ IFTTTのWebhooks用API-KEY //@GOOGLE_HOME_1@ http://192.168.0.200:9081 などgoogle home notifier向けのURL //@GOOGLE_HOME_2@ google home notifier向けのURL //@GOOGLE_HOME_3@ google home notifier向けのURL //各種設定 //ログのファイル名 define("HOME_API_LOG_NAME","@HOME_API_LOG_NAME@"); //home-api-key define("HOME_API_KEY","@HOME_API_KEY@"); //google-home-notifier define("GOOGLE_HOME_1",'@GOOGLE_HOME_1@'); define("GOOGLE_HOME_2",'@GOOGLE_HOME_2@'); define("GOOGLE_HOME_3",'@GOOGLE_HOME_3@'); function checkTime($startTime, $endTime) { $currentTime = date('H:i'); if(strtotime($startTime) <= strtotime($currentTime) and strtotime($currentTime) <= strtotime($endTime)) { return true; }else{ return false; } } function announce($api_url, $text) { logger("Start announce target={$api_url},text={$text}","INFO"); $message = 'text='.$text; $data = array( 'text' => "$text" ); $path = '/google-home-notifier'; $url = $api_url.$path; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, TRUE); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 証明書の検証を行わない curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl_execの結果を文字列で返す curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); // jsonデータを送信 $response = curl_exec($curl); $result = json_decode($response, true); curl_close($curl); return $result; } function logger($text, $level) { $datetime = date('Y-m-d H:i:s'); $date = date('Ym'); $file_name = __DIR__ . "/log/log-home-{$date}.log"; $text = "{$datetime} [{$level}] {$text}" . PHP_EOL; echo $text; if(!(file_exists($file_name))){ touch($file_name); chmod($file_name, 0777); } return error_log(print_r($text, TRUE), 3, $file_name); } logger("Start API KEY=".$_POST['KEY'],"INFO"); if(isset($_POST['KEY']) && strcmp($_POST['APIKEY'], HOME_API_KEY) == 0) { if(isset($_POST['TEXT'])){ $text = $_POST['TEXT']; } switch ($_POST['KEY']) { case 'ExecAnnounce1': //Living logger("Start ExecAnnounce1","INFO"); if(checkTime('6:00','22:00')) { announce(GOOGLE_HOME_1, $text); } break; case 'ExecAnnounce2': //Son logger("Start ExecAnnounce2","INFO"); if(checkTime('6:00','22:00')) { announce(GOOGLE_HOME_2, $text); } break; case 'ExecAnnounce3': //Doughter logger("Start ExecAnnounce3","INFO"); if(checkTime('6:00','22:00')) { announce(GOOGLE_HOME_3, $text); } break; default: logger("This is private API. (in Default)","ERROR"); } }else{ logger("This is private API. (in else)","ERROR"); }
アクション
準備したPHPファイルより「@GOOGLE_HOME_1@ http://192.168.0.200:9081 などgoogle home notifier向けのURL」に設定したgoogle home notifier経由で対象スピーカーよりアナウンスを実施します。
夜間に音を出したくないので、checkTime($startTime, $endTime)関数を用いて、実行時の時間を確認しています。