Use Case(ユースケース)
Yahoo Japan防災速報の情報を利用します。YahooのIoTプラットフォームである「myThings」の利用も考えたのですが、トリガー登録の単位が細かすぎたりと煩雑だったので、防災速報のメール登録を行い、メール受信をトリガーにライン通知とGoogle Homeからのアナウンスを実現しております。Yahooからの防災速報メールの着信監視とメールの簡単な加工はMicrosoft Flowを利用しております。
前提条件
- (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の利用設定を実施している
- Microsoft Flowの利用登録が実施済みである (YahooJapan防災速報メール受信をトリガー出来たらば別の方法で問題ないです)
全体の流れ
- Yahoo Japan防災速報のメール版に登録
「通知先の設定(メールアドレス)」「地域の設定」および「通知する情報を選択」 - 今回は、GoogleのGmailを用いたので、Microsoft Flowを用いて、Yahoo Japan防災速報のメールをトラップします
- Yahoo Japan防災速報のメールタイトルのみを自分自身の防災速報専用のツイッタアカウントに発信します
- IFTTTのTwitterで自分自身の発信した防災速報情報をトラップし、防災速報情報受信時のアクションを実行(Raspberry PiのWEB APIへ発信)
- WEB APIよりLINEへメッセージ送信
- Google Homeスピーカーでアナウンス(Google Home Notifier経由)
トリガー
Yahoo Japan防災速報のメールをトラップし、Twitterで発信
MicrosoftFlowのGmailで準備されている「新しいメールが届いたとき」のトリガーに、「開始」にYahoo Japan防災速報が送付されてくるメールアドレスを登録します。
「alerts-emg@mail.yahoo.co.jp」
メールにはID情報などが含まれているため、メールの件名をツイートします。
Tweetをトリガーに設定
トリガー(this)に自分のTweetを受信した際をトリガーとします。「New tweet by you」のトリガーを選択します。
アクション
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=Weather
- text=" {{Text}}"
APIKEY=apikey&KEY=UrgentInfo&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 'UrgentInfo':
logger("Start info from tweet","INFO");
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;
}
}