コンテンツへスキップ

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サーバの公開設定が終わっている
  • IFTTTサービスの利用登録が実施済みである
  • IFTTTサービスにおいて、Webhooksが利用可能である IFTTT(イフト)でWebhooksの利用
  • IFTTTサービスにおいて、LINE Notifyの利用設定を実施している
  • Microsoft Flowの利用登録が実施済みである (YahooJapan防災速報メール受信をトリガー出来たらば別の方法で問題ないです)

全体の流れ

  1. Yahoo Japan防災速報のメール版に登録
    「通知先の設定(メールアドレス)」「地域の設定」および「通知する情報を選択」
  2. 今回は、GoogleのGmailを用いたので、Microsoft Flowを用いて、Yahoo Japan防災速報のメールをトラップします
  3. Yahoo Japan防災速報のメールタイトルのみを自分自身の防災速報専用のツイッタアカウントに発信します
  4. IFTTTのTwitterで自分自身の発信した防災速報情報をトラップし、防災速報情報受信時のアクションを実行(Raspberry PiのWEB APIへ発信)
  5. WEB APIよりLINEへメッセージ送信
  6. 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通知

IFTTT(イフト)でWebhooksの利用

  • 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(イフト)でWebhooksの利用

//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;
	}
}

 

if(less(variables('ThisMonth'),4),'3Q',if(less(variables('ThisMonth'),7),'1Q',if(less(variables('ThisMonth'),10),'2Q','3Q')))

現在時刻取得

convertTimeZone(utcNow(),'GMT Standard Time','Tokyo Standard Time','u')
月Monthを取得 variables('ThisMonth')
variables('ThisMonth'):
   int(formatDateTime(convertTimeZone(utcNow(),'GMT Standard Time','Tokyo Standard Time','u'),'MM'))

日付フォーマット

タイムゾーン名、タイムゾーンID

  • GMT Standard Time
  • Tokyo Standard Time

Summary


The table below lists out the Microsoft Time Zone Index Values.

More Information


Index (hex)Name of Time ZoneTime
0Dateline Standard Time(GMT-12:00) International Date Line West
1Samoa Standard Time(GMT-11:00) Midway Island, Samoa
2Hawaiian Standard Time(GMT-10:00) Hawaii
3Alaskan Standard Time(GMT-09:00) Alaska
4Pacific Standard Time(GMT-08:00) Pacific Time (US and Canada); Tijuana
AMountain Standard Time(GMT-07:00) Mountain Time (US and Canada)
DMexico Standard Time 2(GMT-07:00) Chihuahua, La Paz, Mazatlan
FU.S. Mountain Standard Time(GMT-07:00) Arizona
14Central Standard Time(GMT-06:00) Central Time (US and Canada)
19Canada Central Standard Time(GMT-06:00) Saskatchewan
1EMexico Standard Time(GMT-06:00) Guadalajara, Mexico City, Monterrey
21Central America Standard Time(GMT-06:00) Central America
23Eastern Standard Time(GMT-05:00) Eastern Time (US and Canada)
28U.S. Eastern Standard Time(GMT-05:00) Indiana (East)
2DS.A. Pacific Standard Time(GMT-05:00) Bogota, Lima, Quito
32Atlantic Standard Time(GMT-04:00) Atlantic Time (Canada)
37S.A. Western Standard Time(GMT-04:00) Georgetown, La Paz, San Juan
38Pacific S.A. Standard Time(GMT-04:00) Santiago
3CNewfoundland and Labrador Standard Time(GMT-03:30) Newfoundland
41E. South America Standard Time(GMT-03:00) Brasilia
46S.A. Eastern Standard Time(GMT-03:00) Georgetown
49Greenland Standard Time(GMT-03:00) Greenland
4BMid-Atlantic Standard Time(GMT-02:00) Mid-Atlantic
50Azores Standard Time(GMT-01:00) Azores
53Cape Verde Standard Time(GMT-01:00) Cape Verde Islands
55GMT Standard Time(GMT) Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London
5AGreenwich Standard Time(GMT) Monrovia, Reykjavik
5FCentral Europe Standard Time(GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague
64Central European Standard Time(GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb
69Romance Standard Time(GMT+01:00) Brussels, Copenhagen, Madrid, Paris
6EW. Europe Standard Time(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
71W. Central Africa Standard Time(GMT+01:00) West Central Africa
73E. Europe Standard Time(GMT+02:00) Minsk
78Egypt Standard Time(GMT+02:00) Cairo
7DFLE Standard Time(GMT+02:00) Helsinki, Kiev, Riga, Sofia, Tallinn, Vilnius
82GTB Standard Time(GMT+02:00) Athens, Bucharest, Istanbul
87Israel Standard Time(GMT+02:00) Jerusalem
8CSouth Africa Standard Time(GMT+02:00) Harare, Pretoria
91Russian Standard Time(GMT+03:00) Moscow, St. Petersburg, Volgograd
96Arab Standard Time(GMT+03:00) Kuwait, Riyadh
9BE. Africa Standard Time(GMT+03:00) Nairobi
9EArabic Standard Time(GMT+03:00) Baghdad
A0Iran Standard Time(GMT+03:30) Tehran
A5Arabian Standard Time(GMT+04:00) Abu Dhabi, Muscat
AACaucasus Standard Time(GMT+04:00) Baku, Tbilisi, Yerevan
AFTransitional Islamic State of Afghanistan Standard Time(GMT+04:30) Kabul
B4Ekaterinburg Standard Time(GMT+05:00) Ekaterinburg
B9West Asia Standard Time(GMT+05:00) Tashkent
BEIndia Standard Time(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi
C1Nepal Standard Time(GMT+05:45) Kathmandu
C3Central Asia Standard Time(GMT+06:00) Astana, Dhaka
C8Sri Lanka Standard Time(GMT+06:00) Sri Jayawardenepura
C9N. Central Asia Standard Time(GMT+06:00) Almaty, Novosibirsk
CBMyanmar Standard Time(GMT+06:30) Yangon (Rangoon)
CDS.E. Asia Standard Time(GMT+07:00) Bangkok, Hanoi, Jakarta
CFNorth Asia Standard Time(GMT+07:00) Krasnoyarsk
D2China Standard Time(GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi
D7Singapore Standard Time(GMT+08:00) Kuala Lumpur, Singapore
DCTaipei Standard Time(GMT+08:00) Taipei
E1W. Australia Standard Time(GMT+08:00) Perth
E3North Asia East Standard Time(GMT+08:00) Irkutsk, Ulaanbaatar
E6Korea Standard Time(GMT+09:00) Seoul
EBTokyo Standard Time(GMT+09:00) Osaka, Sapporo, Tokyo
F0Yakutsk Standard Time(GMT+09:00) Yakutsk
F5A.U.S. Central Standard Time(GMT+09:30) Darwin
FACen. Australia Standard Time(GMT+09:30) Adelaide
FFA.U.S. Eastern Standard Time(GMT+10:00) Canberra, Melbourne, Sydney
104E. Australia Standard Time(GMT+10:00) Brisbane
109Tasmania Standard Time(GMT+10:00) Hobart
10EVladivostok Standard Time(GMT+10:00) Vladivostok
113West Pacific Standard Time(GMT+10:00) Guam, Port Moresby
118Central Pacific Standard Time(GMT+11:00) Magadan, Solomon Islands, New Caledonia
11DFiji Islands Standard Time(GMT+12:00) Fiji, Kamchatka, Marshall Is.
122New Zealand Standard Time(GMT+12:00) Auckland, Wellington
12CTonga Standard Time(GMT+13:00) Nuku'alofa
80000040Azerbaijan Standard Time(GMT-03:00) Buenos Aires
80000041Middle East Standard Time(GMT+02:00) Beirut
80000042Jordan Standard Time(GMT+02:00) Amman
80000043Central Standard Time (Mexico)(GMT-06:00) Guadalajara, Mexico City, Monterrey - New
80000044Mountain Standard Time (Mexico)(GMT-07:00) Chihuahua, La Paz, Mazatlan - New
80000045Pacific Standard Time (Mexico)(GMT-08:00) Tijuana, Baja California
80000046Namibia Standard Time(GMT+02:00) Windhoek
80000047Georgian Standard Time(GMT+03:00) Tbilisi
80000048Central Brazilian Standard Time(GMT-04:00) Manaus
80000049Montevideo Standard Time(GMT-03:00) Montevideo
8000004AArmenian Standard Time(GMT+04:00) Yerevan
8000004BVenezuela Standard Time(GMT-04:30) Caracas
8000004CArgentina Standard Time(GMT-03:00) Buenos Aires
8000004DMorocco Standard Time(GMT) Casablanca
8000004EPakistan Standard Time(GMT+05:00) Islamabad, Karachi
8000004FMauritius Standard Time(GMT+04:00) Port Louis
80000050UTC(GMT) Coordinated Universal Time
80000051Paraguay Standard Time(GMT-04:00) Asuncion
80000052Kamchatka Standard Time(GMT+12:00) Petropavlovsk-Kamchatsky