myThingsとTwilioを連携して「好きな地域の明日の天気情報」を電話で知らせるシステムを作ってみる

スポンサーリンク

これは、Twilio Advent Calendar 2015の12月1日の記事です。

【12月1日】myThingsとTwilioを連携して「好きな地域の明日の天気情報」を電話で知らせるシステムを作ってみる
【12月2日】binbin4649さんTwilio Apiを使ってみた話

Twilio Advent Calendar 2015の1日目。張り切って書かせて頂きます。

目的

myThingsTwilioを連携して明日のお天気情報を電話で知らせるシステムを作成する

myThingsとは

myThingsは、Yahoo JAPANが開発したWebサービスやガジェットの機能を組み合わせて利用ができるサービスです。
一般には特集というかたちで、組み合わせのおすすめが毎月配信され、これを選ぶことが多いですが、自分で組み合わせをつくることも可能です。
組み合わせの単位は、チャンネルという単位で定義され、myThingsアプリ上で組み合わせを行うことができます。
チャンネルには動作を実行する条件になるトリガーと、トリガーが発生した場合に実行されるアクションになるものがあります。
トリガーとアクションをmyThingsアプリで設定することで、組み合わせが実行されます。
myThingsとIDCFチャンネルでできることより引用)

Yahoo JAPANさんのサービスやFacebook、Twitter等の有名なwebサービス、ガジェットの機能、IoTプロダクトなどを組み合わせて自分オリジナルのアプリケーションを作成することが可能。この組み合わせの単位をチャンネルと言う。
さらにチャンネルには「トリガー」と「アクション」があり、下記のような関係性がある。

『もし◯◯◯◯(トリガー)が起こったら、△△△△(アクション)を実行する』

今回の場合、もしYahoo!天気・災害を指定時間に受け取ったら(トリガー)Twilioを使って電話でお知らせする(アクション)という組み合わせでアプリケーションを作成します。

Twilioとは

Twilioとはアメリカ合衆国カリフォルニア州サンフランシスコにあるクラウド通信(英語版)(IaaS)企業である。ソフトウェア開発者が自社のWebサービスAPIを使って電話やテキストメッセージの送受信をプログラムすることを可能にしている。自社のサービスはHTTPを使ってアクセスしており、使用状況に応じて請求されるものである。
(wikipediaより引用)

たった数行のコードで電話やSMSを構築することができるクラウドAPIサービス。コチラで詳しくまとめています。

アーキテクチャ

flow.001

myThings Appでは、下記設定を行います。

■ myThings AppとIDCFチャンネルサーバのひも付け
■ 実行タイミングの設定
■「Yahoo!天気・災害」を選択し、通知して欲しい情報(地域、明日の天気、気温、降水確率など)を設定する。

では、設定された実行タイミングにmyThingsサーバから明日のお天気情報のデータをIDCFチャンネルサーバのtrigger-1に送信します。
IDCFチャンネルサーバは、MQTT BrokerとしてmyThingsサーバ(Publisher)とこちらのSever(Subscriber)との中継ぎをし、リアルタイムで通信を行います。
この中継ぎの機能を実現するため、Meshbluというメッセージングプラットフォームを使って相互にブリッジします。

では、IDCFチャンネルサーバのaction-1から明日のお天気情報のデータをMeshubluのJavaScriptライブラリーを使いwebブラウザ上で受信します。

では、受け取った明日のお天気情報をPHPスクリプトへ渡して、TwiMLTwilioのREST APIを使って電話システムを作ります。

明日のお天気情報をアナウンスする電話をかけます。

開発

それでは開発です。

IDCFチャンネルサーバの構築

IDCF Cloudのアカウントを開設し、仮想マシンを作成します。
https://console.idcfcloud.com/signup/?cl=cl_iot
※詳しい方法は、こちらのpdfに書いてました。

ssh root@xxx.xxx.xxx.xxx -i hoge.txt

アカウントと仮想マシンの作成終了後、SSHでサーバにログイン。
xxx.xxx.xxx.xxx:サーバのIPアドレスを入力。
hoge.txt:管理コンソールでSSH Keyを作成した時にダウンロードしたテキストファイルを指定。

mkdir ~/iot_apps && cd ~/iot_apps

ログインしたら適当なディレクトリーを作成し、ディレクトリー内に移動。

git clone --recursive https://github.com/IDCFChannel/meshblu-compose

ディレクトリー内に移動したら、Docker ComposeにまとめたMeshbluをクローン。

cd meshblu-compose
./bootstrap.sh

クローンしたディレクトリー(/meshblu-compose/)に移動してbootstrapのシェルスクリプトを実行。

docker-compose ps

           Name                         Command               State                    Ports                   
--------------------------------------------------------------------------------------------------------------
meshblucompose_meshblu_1     npm start                        Up      0.0.0.0:1883->1883/tcp, 80/tcp           
meshblucompose_mongo_1       /entrypoint.sh mongod            Up      27017/tcp                                
meshblucompose_openresty_1   nginx -c /etc/nginx/nginx.conf   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp 
meshblucompose_redis_1       /entrypoint.sh redis-server      Up      6379/tcp   

docker-compose ps コマンドを入力してインストールが成功しているか、コンテナーが起動しているか確認します。上記のようにmeshblucomposeの一覧が表示されたら成功。

curl --insecure https://localhost/status
{"meshblu":"online"}

curlコマンドからMesubluサーバーが起動していることを確認。onlineであれば成功。
※もしもonlineと出ない場合は起動してない可能性があります。docker-compose up -d openresty とコマンドを打って起動。

docker-compose run --rm iotutil register

> iotutil@0.0.1 start /app
> node app.js "register"

┌─────────┬────────────────────┬──────────────────────────────────────┐
│ keyword │ meshblu_auth_token │ meshblu_auth_uuid                    │
├─────────┼────────────────────┼──────────────────────────────────────┤
│ owner   │ 1a2b3c4d           │ 1a2b3c4d-1a2b-1a2b-1a2b-123abc123abc1│
└─────────┴────────────────────┴──────────────────────────────────────┘

マスターのownerデバイスと、action-*を5つ、trigger-*を5つをregisterコマンドで作成。
※meshblu_auth_tokenとmeshble_auth_uuidは適当な文字列に置き換えてます。

docker-compose run --rm iotutil list

> iotutil@0.0.1 start /app
> node app.js "list"

┌───────────┬──────────┬──────────────────────────────────────┐
│ keyword   │ token    │ uuid                                 │
├───────────┼──────────┼──────────────────────────────────────┤
│ trigger-1 │ aaaa0000 │ aaaaaaaa-0000-aaaa-0000-aaaaaaaaaaaa │
├───────────┼──────────┼──────────────────────────────────────┤
│ trigger-2 │ bbbb1111 │ bbbbbbbb-1111-bbbb-1111-bbbbbbbbbbbb │
├───────────┼──────────┼──────────────────────────────────────┤
│ trigger-3 │ cccc2222 │ cccccccc-2222-cccc-2222-cccccccccccc │
├───────────┼──────────┼──────────────────────────────────────┤
│ trigger-4 │ dddd3333 │ dddddddd-3333-dddd-3333-dddddddddddd │
├───────────┼──────────┼──────────────────────────────────────┤
│ trigger-5 │ eeee4444 │ eeeeeeee-4444-eeee-4444-eeeeeeeeeeee │
├───────────┼──────────┼──────────────────────────────────────┤
│ action-1  │ ffff5555 │ ffffffff-5555-ffff-5555-ffffffffffff │
├───────────┼──────────┼──────────────────────────────────────┤
│ action-2  │ gggg6666 │ gggggggg-6666-gggg-6666-gggggggggggg │
├───────────┼──────────┼──────────────────────────────────────┤
│ action-3  │ hhhh7777 │ hhhhhhhh-7777-hhhh-7777-hhhhhhhhhhhh │
├───────────┼──────────┼──────────────────────────────────────┤
│ action-4  │ iiii8888 │ iiiiiiii-8888-iiii-8888-iiiiiiiiiiii │
├───────────┼──────────┼──────────────────────────────────────┤
│ action-5  │ jjjj9999 │ jjjjjjjj-9999-jjjj-9999-jjjjjjjjjjjj │
└───────────┴──────────┴──────────────────────────────────────┘

実際にtrigger-*とaction-*が作成されているかlistコマンドで確認。それぞれ5個ずつ表示されていたら成功。ここで表示されるtrigger-*とaction-*はmyThings Appとのひも付けに使います。
※meshblu_auth_tokenとmeshble_auth_uuidは適当な文字列に置き換えてます。

これでIDCFチャンネルサーバの構築は完了。

myThings Appsの設定

myThings Appsは下記公式サイトからダウンロード可能。
http://mythings.yahoo.co.jp/
※Google PlayやApp Storeで検索してダウンロードすることも可能。

スマートフォンにインストールすると下記アイコンが確認できます。
IMG_3799

myThings AppとIDCFチャンネルサーバとのひも付け設定

myThings Appのトップ右下にあるネジのアイコンをタップします。
IMG_3818

遷移した先の「チャンネル一覧」をタップします。
IMG_3819

チャンネル一覧下部にある「IDCF」のアイコンをタップします。
IMG_3820

「認証する」をタップします。
IMG_3821

認証画面が開きますので、「IPアドレス」と「認証Token」を入力します。
IPアドレスは、IDCFチャンネルサーバのIPアドレスを入力。
認証Tokenは、ownerのmeshblu_auth_tokenを入力。確認方法はコチラ
入力後、「利用を開始する」ボタンをタップします。
IMG_3824
※ownerのmeshblu_auth_tokenがわからない方向け確認方法※
下記 docker-compose run –rm iotutil owner というownerコマンドをIDCFチャンネルサーバのdocker-compose.ymlファイルがある階層で実行します。

docker-compose run --rm iotutil owner

> iotutil@0.0.1 start /app
> node app.js "owner"

┌─────────┬────────────────────┬──────────────────────────────────────┐
│ keyword │ meshblu_auth_token │ meshblu_auth_uuid                    │
├─────────┼────────────────────┼──────────────────────────────────────┤
│ owner   │ 534c29b3           │ 7f5e5fec-d810-45fb-8c39-b4062c7ef074 │
└─────────┴────────────────────┴──────────────────────────────────────┘


「利用を開始する」ボタンをタップして下記画面が表示されたら成功。
IMG_3825

これでmyThingsとIDCFチャンネルサーバのひも付け設定は完了。

チャンネルの組み合わせ設定

チャンネルの組み合わせをしていきます。右上の+ボタンをタップします。
IMG_3800

+ボタンをタップすると作成画面が表示されます。
まずは「トリガー」の設定をしていきます。
IMG_3801

「トリガーを追加してください」をタップするとチャンネルの選択画面が開きますので「天気・天災」をタップして認証します。
※認証には、Yahoo! JAPAN IDが必要です。
IMG_3804

「天気・天災」のトリガーを選択画面に遷移しますので、「明日の天気予報」をタップします。
IMG_3805

「明日の天気予報」をタップすると、トリガー詳細設定画面が開きます。
明日の天気予報を知りたい地域を選択します。ここでは「福岡市中央区」を選択します。選択後、「OK」をタップします。
IMG_3806

これでトリガーの設定が終わりました。
IMG_3807

次に「アクション」の設定をしていきます。
「アクションを追加してください」をタップするとチャンネルの選択画面が開きますので「IDCF」をタップします。
IMG_3809

下記画面に遷移しますので、「通知する」をタップします。
IMG_3810

「通知する」をタップすると、アクション詳細設定画面が開きます。
先ほどIDCFチャンネルサーバで作成した action-1 を選択します。
IMG_3812

アクションの設定が終わったらメッセージの設定を行います。
メッセージを入力するテキストボックスをタップして入力状態になると、下記のように候補が出るので取得したいお天気情報を選択します。
IMG_3813

選択した画面です。
IMG_3817

さらにここで後々メッセージを加工しやすいように候補と候補の間に「|」という記号を入れておきます。具体的には下記のような画像の状態にします。問題がなければ「OK」をタップ。
※後で「|」をもとに文字列を分割します。
IMG_3815

次に実行タイミングを設定します。
この実行タイミングは、明日のお天気を配信する時間になります。必要であれば曜日の指定も可能。問題なければ「作成」をタップします。
IMG_3827

作成した組み合わせを確認。NEWが付いているものが最新の組み合わせです。
IMG_3828

これでチャンネルの組み合わせ設定は完了。

IDCFチャンネルサーバから明日の天気を取得

IDCFチャンネルサーバから明日の天気を取得します。取得するタイミングはチャンネルの組み合わせで設定した実行タイミングです。

明日の天気情報を受け取るだけのページを作成。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>hoge</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="http://meshblu.octoblu.com/js/meshblu.js"></script>
<script>
	var conn = meshblu.createConnection({
		"uuid": "ffffffff-5555-ffff-5555-ffffffffffff",
		"token": "ffff5555",
		"server": "xxx.xxx.xxx.xxx",
		"port": 80
	});
	conn.on('ready', function(data){
		conn.on('message', function (message) {
			$.ajax({
	            url: 'twilio.php',
	            type: 'post', 
	            data: {message: message}
        	});

		$(".message").prepend(JSON.stringify(message) + '<br />');
		});
	});
</script>
</head>
<body>
	<p>Receive Messages Test</p>
	<div class="message"></div>
</body>
</html>

MeshubluのJavaScriptライブラリーを7行目で読み込んでお天気情報をwebブラウザで受信できるようにする。併せて6行目でJavaScriptのライブラリーであるjQueryを読み込んでおく。

10行目〜13行目で必要な認証情報を設定して、9行目のmeshblu.createConnectionでIDCFチャンネルサーバのaction-1にアクセス。
10行目のuuidには、action-1のuuidを入力。
11行目のtokenには、action-1のtokenを入力。
※action-1のuuidとtokenはlistコマンドを実行することで確認可能です。確認可能はこちら
12行目のserverには、IDCFチャンネルサーバのIPアドレスを入力。
13行目のportには、80番を指定。

15行目からソケット通信を開始。メッセージ(明日のお天気情報)を受信したらajaxでPHPスクリプトへデータを渡す処理を入れる。

23行目ではデータ確認用のdebugとして30行目のdivボックス内にデータを出力するようにする。


それでは、実際に明日のお天気情報のデータを受信して表示することが出来るかどうか試してみます。
試す方法ですが、myThings Appに設定された実行タイミングを待たなくても任意のタイミングで実行する機能があるのでそれを使います。

myThings Appsを起動します。下部にあるブロックのアイコンをタップします。
IMG_3829

データの確認を行いたい組み合わせをタップします。
IMG_3830

「手動実行」をタップすると、そのタイミングで実行することができます。
IMG_3831

「手動実行」をタップした後、先ほど作成した「明日の天気情報を受け取るだけのページ」にアクセスします。
アクセスすると、正常に天気の情報を取得できていることを確認できます。
スクリーンショット_2015-11-26_16_08_31

これで、IDCFチャンネルサーバから明日の天気を取得することは完了。

Twilioで明日の天気を知らせる電話システムを作成

ajaxで送信されたデータを加工し、Twilioを使って電話するシステムを構築していきます。

Twilioのアカウント・Twilio番号発行

TwilioアカウントとTwilio番号の作成をします。
アカウント作成方法はこちらにまとめています。
Twilio番号取得方法はこちらにまとめています。

TwiMLとTwilio REST APIを使って電話システムを構築

明日の天気情報をTwiMLとTwilio REST APIを使って電話で通知するシステムを作っていきます。
TwiML?Twilio REST API?という方はこちらをご参考ください。

お天気の最低気温と最高気温はデータベースに保存するようにします。
下記、weatherテーブルを作成。

create table weather (
id int(11) PRIMARY KEY auto_increment, 
minimumTemperature int(3), 
maximumTemperature int(3), 
date int(11)
);


少し長いですが、下記がTwiMLとREST APIを使ったスクリプトです。

<?php
	// ライブラリーをロード
	require_once('Services/Twilio.php');
 
	$sid = "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
	$token = "◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯"; 
	$client = new Services_Twilio($sid, $token);

	// 送信情報の抽出
	$weatherMessages = $_POST['message']['payload'];
	$weatherMessage  = explode('|', $weatherMessages);
	
	// 地域
	if(isset($_GET['area'])){
		$area = $_GET['area'];
		$area = urlencode($area);
	}else{
		$area = $weatherMessage[0];
		$search = array('(',')');
		$replace = array('県', '市');
		$area = str_replace($search, $replace, $area);
		$area = urlencode($area);
	}

	// 日付
	if(isset($_GET['date'])){
		$date = $_GET['date'];
		$date = urlencode($date);
	}else{
		$date = $weatherMessage[1];
		$date = date("Y年m月d日", strtotime($date));
		$date = urlencode($date);
	}

	// 天気
	if(isset($_GET['weather'])){
		$weather = $_GET['weather'];
		$weather = urlencode($weather);
	}else{
		$weather = $weatherMessage[2];
		$weather = urlencode($weather);
	}

	// 最高気温
	if(isset($_GET['maximumTemperature'])){
		$maximumTemperature = $_GET['maximumTemperature'];
	}else{
		$maximumTemperature = $weatherMessage[3];
	}

	// 最低気温
	if(isset($_GET['minimumTemperature'])){
		$minimumTemperature = $_GET['minimumTemperature'];
	}else{
		$minimumTemperature = $weatherMessage[4];
	}

	// 降水確率
	if(isset($_GET['rain'])){
		$rain = $_GET['rain'];
	}else{
		$rain = $weatherMessage[5];
	}

	// 風向
	if(isset($_GET['wind'])){
		$wind = $_GET['wind'];
		$wind = urlencode($wind);
	}else{
		$wind = $weatherMessage[6];
		$wind = urlencode($wind);
	}

	// パラメーター
	$parameter = '?area='.$area.'&date='.$date.'&weather='.$weather.'&maximumTemperature='.$maximumTemperature.'&minimumTemperature='.$minimumTemperature.'&rain='.$rain.'&wind='.$wind;
	$url = 'http://example.com/api.php'.$parameter;

	if(!empty($_GET['area'])){
		// DB 接続
		// ホスト名、ユーザ名、パスワードを入力
		$connect = mysql_connect('your host', 'username', 'password');
		// データベース名を入力
		mysql_select_db('database name', $connect);

		// お天気情報が既に存在するかどうか?
		$checkWeatherRows = 'select * from weather order by id desc';
		$weatherResult = mysql_query($checkWeatherRows);
		$weatherRows = mysql_num_rows($weatherResult);

		// 今日のタイムスタンプ
		$year = date('Y');
		$month = date('m');
		$day = date('d');
		$now = mktime(0, 0, 0, $month, $day, $year);

		// 初回登録
		if(empty($weatherRows)){
			// お天気情報を追加
			$insertWeather = 'insert into weather set minimumTemperature = "'.$minimumTemperature.'", maximumTemperature = "'.$maximumTemperature.'", date = "'.$now.'"';
			mysql_query($insertWeather);
		}else{
			$date = mysql_result($weatherResult, 0, 'date');

			// 明日のタイムスタンプ
			$year = date('Y', $date);
			$month = date('m', $date);
			$day = date('d', $date);
			$tomorrow = mktime(0, 0, 0, $month, $day+1, $year);

			// 明日の天気を追加
			if(time() > $tomorrow){
				$insertWeather = 'insert into weather set minimumTemperature = "'.$minimumTemperature.'", maximumTemperature = "'.$maximumTemperature.'", date = "'.$now.'"';
				mysql_query($insertWeather);
			}
			$yesterdayMinimumTemperature = mysql_result($weatherResult, 1, 'minimumTemperature');
			$yesterdayMaximumTemperature = mysql_result($weatherResult, 1, 'maximumTemperature');
			$yesterdayRain = mysql_result($weatherResult, 1, 'rain');
		}
		$parameter = '?area='.$area.'&amp;date='.$date.'&amp;weather='.$weather.'&amp;maximumTemperature='.$maximumTemperature.'&amp;minimumTemperature='.$minimumTemperature.'&amp;rain='.$rain.'&amp;wind='.$wind;
		$url = 'http://example.com/api.php'.$parameter;
		echo '<?xml version="1.0" encoding="UTF-8"?>';
?>
	<Response>
		<?php if($_GET['Digits'] == 1):?>
			<Gather action="<?php echo $url;?>" method="GET" numDigits="1" timeout="10">
			<Say language="ja-JP">
				明日の最低気温は、<?php echo $minimumTemperature;?>度。最高気温は、<?php echo $maximumTemperature;?>度です。
				<?php
					// 日中平均温度
					$average = ($minimumTemperature+$maximumTemperature)/2;
					if($average > 25){
						$clothes = '明日は、半袖で十分な天気です。';
					}elseif($average <= 25 && $average >= 21){
						$clothes = '明日は、長袖の着用をおすすめします。';
					}elseif($average <= 20 && $average >= 16 ){
						$clothes = '明日は、カーディガンの着用をおすすめします。';
					}elseif($average <= 15 && $average >= 12){
						$clothes = '明日は、セーターの着用をおすすめします。';
					}elseif($average <= 11 && $average >= 7 ){
						$clothes = '明日は、コートの着用をおすすめします。';
					}else{
						$clothes = '明日は、コートとマフラーの着用をおすすめします。';
					}
					echo $clothes;
				?>

				<?php 
					if($yesterdayMinimumTemperature >= 0 && $yesterdayMaximumTemperature >= 0):

					if(($maximumTemperature-$yesterdayMaximumTemperature) > 0){
						$string = '+';
					}
				?>
				前日差は、最低気温は、<?php echo ($minimumTemperature-$yesterdayMinimumTemperature);?>度。最高気温は、<?php echo $string.($maximumTemperature-$yesterdayMaximumTemperature);?>度です。
				<?php else:?>
				前日の気温データが無いため前日差をアナウンスできません。
				<?php endif;?>
			</Say>
			<Pause length="1" />
			<Say language="ja-JP">終了する場合はシャープを。もう一度明日の気温を聞きたい場合は、1を。明日の降水確率を聞きたい場合は、2を。戻る場合はその他のキーを押してください。</Say>
			</Gather>
			<Say language="ja-JP">終了します。</Say>
		<?php elseif($_GET['Digits'] == 2):?>
			<Gather action="<?php echo $url;?>" method="GET" numDigits="1" timeout="10">
			<Say language="ja-JP">
				明日の降水確率は、<?php echo $rain;?>%です。
				<?php if($rain >= 50):?>
					傘を持って行きましょう。
				<?php elseif($rain <= 49 && $rain >= 30):?>
					なるべく傘を持って行きましょう。
				<?php elseif($rain <= 29 && $rain >= 10):?>
					折りたたみ傘があるといいです。
				<?php else:?>
					いい天気になりそうです。
				<?php endif;?>
			</Say>
			<Pause length="1" />
			<Say language="ja-JP">終了する場合はシャープを。もう一度明日の降水確率を聞きたい場合は、2を。明日の気温を聞きたい場合は、1を。戻る場合はその他のキーを押してください。</Say>
			</Gather>
			<Say language="ja-JP">終了します。</Say>
		<?php else:?>
			<Gather action="<?php echo $url;?>" method="GET" numDigits="1" timeout="10">
				<Say language="ja-JP">
					<?php echo urldecode($_GET['date']);?>の<?php echo urldecode($_GET['area']);?>の天気は、<?php echo $_GET['weather'];?>です。
					明日の気温を知りたい場合は、1を。明日の降水確率を知りたい場合は、2を押してください。
				</Say>
				<Pause length="1" />
				<Say language="ja-JP">終了する場合はシャープを。もう一度聞きたい場合はその他のキーを押してください。</Say>
			</Gather>
			<Say language="ja-JP">終了します。</Say>
		<?php endif;?>
	</Response>
<?php
	}else{
		// コールスクリプト
		$call = $client->account->calls->create(
			"+81xxxxxxxxxx", 
			"+81xxxxxxxxxx", 
			$url,
			array(
	    	)
		);
	}
?>

2行目〜7行目にかけて、ライブラリーを読み込みAccountSIDとAuthTokenを使ってServices_Twilioをインスタンス化。
このあたりは196行目〜202行目で明日のお天気情報を電話でお知らせする時に使います。
こちらの記事でREST APIを使った電話発信について書いてます。

肝心の明日のお天気情報ですが、受け取った情報を「|」で分割してアナウンスの文章を作成します。
電話がかかってきた際の最初のアナウンスは、182行目〜190行目です。gather命令動詞を使って温度を知りたい場合と降水確率を知りたい場合とで振り分けをしてます。

1を押すと、125行目〜162行目が実行されます。
ここで今日の温度と前日差をアナウンスします。日中平均温度を求めて服装を案内するアナウンスをつけてみました。

2を押すと、145行目〜161行目が実行されます。
ここで降水確率をアナウンスします。降水確率の数値を参考に傘の所持のアナウンスも行うようにしてみました。

では実際に指定した番号に電話がかかってアナウンスされるか試してみましょう。上で書いたようにmyThingsの手動実行を走らせて試してみます。明日のお天気情報がアナウンスされたら成功です。

以上で、明日のお天気情報を電話で知らせるシステムの完成です。

終わりに

myThingsは初めて使ったのですが、簡単に色々なサービスの組み合わせが直感的に出来ました。特に「トリガー」・「アクション」の設定はシンプルでとても見やすいUIでした。やっぱりシンプル・イズ・ザ・ベストですね。今回は「Yahoo!天気・災害」と「Twilio」サービスの組み合わせでしたが、デバイス(Raspberry Pi等)と組み合わせてIoT的なプロダクトを作ることも可能のよう。今後チャンネルが増えていくことに期待(※実行タイミングも細かく設定できることにも少し期待)。

Twilioは、電話を掛けてアナウンスを流す処理を数十行程で出来ました。
TwiMLだけでなくREST APIを組み合わせるとより凝ったシステムを構築することができるなぁと改めて思った。
今後はTwilioVideoなる新機能に期待。

※Twilioキニナル!と言う方は下記でイベント情報を配信中。
TwilioJP-UG

参考文献

・TwilioのAPIリファレンス:https://jp.twilio.com/docs/api
・TwiMLのリファレンス:https://jp.twilio.com/docs/api/twiml
・myThingsの開発関連記事:http://qiita.com/tags/mythings
・Meshbluデベロッパーサイト:https://developer.octoblu.com/

スポンサーリンク
スポンサーリンク
スポンサーリンク

フォローする

スポンサーリンク
スポンサーリンク