雨が降り出す前に通知①Google Homeスピーカーとライン通知
Use Case(ユースケース)
約2−3週間利用してみてのベストプラクティスです。
YahooのYOLP(地図)気象情報APIを利用し、緯度経度で指定した地点の10分間隔の天気予報を定期的にチェックし、トリガーとします。(日本ならではの細かなWEBサービスを利用します)
天候が「Rain(雨)」に変化した際に、Webhooks経由でトリガーを受け、LINEに通知および、トリガー発生時間(日中)を判定しGoogle Homeスピーカーで雨が降り出す旨のアナウンスを実行します。Google Homeスピーカーは就寝時間などには音声を出させたくないので、時間判定を入れました。
前提条件
- Yahoo! JAPANのアプリケーションID Yahoo!JAPANアプリケーションの管理
アプリケーションIDはYahoo! JAPAN IDをお持ちの方ならどなたでも登録できます。アプリケーションIDは、各リクエスト送信時に必要で、開発者自身ではなく、アプリケーションを特定します。 - (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サービスにおいて、LINE Notifyの利用設定を実施している
全体の流れ
- Weather.phpファイルの準備
- Weather.phpの定期実行設定、雨を検知した時点でWEB APIへトリガー
- WEB APIよりLINEへメッセージ送信
- Google Homeスピーカーでアナウンス(Google Home Notifier経由)
Weather.phpファイルの準備
Weather.phpの定期実行
Synologyの「コントロールパネル」「タスクスケジューラー」で10分毎の実行で、以下のコマンドラインを登録して、定期実行しております。
/usr/local/bin/php72 /var/services/homes/user/weather.php
トリガー
Weather.phpよりRaspberry PiのWEB APIへ直接トリガーされます。3つのパラメータを設定します。
- APIKEY=apikey
- KEY=Weather
- text="$text"
APIKEY=apikey&KEY=Weather&text="$text"
アクション
以下が、準備したサンプルの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@"); //IFTTT用webhookパラメータ define("IFTTT_POST_API_KEY","/with/key/@IFTTT_POST_API_KEY@"); define("IFTTT_POST_API_BASE","https://maker.ifttt.com/trigger/"); //IFTTT用puchLINE define("IFTTT_LINE_KEY","pushLINE"); //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 pushLINE($value1, $value2) { logger("Start pushLINE value1={$value1},value2={$value2}","INFO"); $url = IFTTT_POST_API_BASE.IFTTT_LINE_KEY.IFTTT_POST_API_KEY; $data = array( 'value1' => $value1, 'value2' => $value2 ); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, TRUE); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); // jsonデータを送信 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($curl); $result = json_decode($response, true); curl_close($curl); return $result; } 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","INFO"); if(isset($_POST['KEY']) && strcmp($_POST['APIKEY'], HOME_API_KEY) == 0) { logger("KEY : ".$_POST['KEY'],"INFO"); logger("TEXT : ".$_POST['TEXT'],"INFO"); $text = $_POST['TEXT']; switch ($_POST['KEY']) { case 'Weather': logger("Start Weather","INFO"); //Rain alert pushLine('【天気情報】',$text); if(checkTime('7:00','19:00')) { announce(GOOGLE_HOME_2, $text); announce(GOOGLE_HOME_3, $text); } if(checkTime('6:00','23:00')) { announce(GOOGLE_HOME_1, $text); } break; default: logger("This is private API. (in Default)","ERROR"); } }else{ logger("This is private API. (in else)","ERROR"); }
アクション1
LINE送信のアクションを設定します。すでに、他ユースケースなどでIFTTT側にLINE送信のレシピを導入されている方は、アクション2の定義に進んで下さい。
アクション1:トリガー
アクセスキーなどの初期設定値は、IFTTTより取得して下さい。
//IFTTT用webhookパラメータ
define("IFTTT_POST_API_KEY","/with/key/アクセスキー");
define("IFTTT_POST_API_BASE","https://maker.ifttt.com/trigger/");
//IFTTT用puchLINE
define("IFTTT_LINE_KEY","pushLINE");
function pushLINE($value1, $value2) {
$url = IFTTT_POST_API_BASE.IFTTT_LINE_KEY.IFTTT_POST_API_KEY;
$data = array(
'value1' => $value1,
'value2' => $value2
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); // jsonデータを送信
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
$result = json_decode($response, true);
curl_close($curl);
return $result;
}
アクション1:IFTTTでのトリガー
Webhooksを{event}:pushLINEで設定します。
アクション1:アクション
LINE送信のアクションを定義します。
Recipientでラインの送付先を指定します。すでに作成しているLINEのグループにも送信することが出来ます。
Message部分は、自由に変更出来ます。今回は、PHPより2つの引数を渡しているので、2つの引数をMessageに入れております。pushLine('【テスト】',$text);
アクション2
Google Home Notifier経由で、Google Homeからアナウンスを流します。「google-home-notifier」導入
//@GOOGLE_HOME_1@ http://192.168.0.200:9081 などgoogle home notifier向けのURL define("GOOGLE_HOME_1",'@GOOGLE_HOME_1@'); 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; } announce(GOOGLE_HOME_1, $text);
時間判定について checkTime関数
対象時間の開始と終了を指定して、true, falseを戻り値とする関数を準備しました。
日付を跨る設定などは考慮しておりません。
checkTime('6:00','23:00')とすれば、朝6時から夜23時まで「True」となります。
このチェック関数を用いて、Google Homeのアナウンス対象時間か否かを確認しています。
function checkTime($startTime, $endTime) { $currentTime = date('H:i'); if(strtotime($startTime) <= strtotime($currentTime) and strtotime($currentTime) <= strtotime($endTime)) { return true; }else{ return false; } }