Use Case(ユースケース)
Nature Remoの室温室温センサーが30℃を超えた時点で、LINEに通知およびPCのシャットダウンを行う。
前提条件
- Nature Remoがセットアップ済み
 - (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の利用設定を実施している
 - シャットダウン対象のPCにSSHサーバがインストールされている必要があります Raspberry Pi 3 B +にPHPのSSH2インストール
 
全体の流れ
- IFTTTのNature Remoより室温30℃以上をトリガートリガー登録
 - IFTTTのWebhooksで天候変化時のアクションを実行(Raspberry PiのWEB APIへ発信)
 - WEB APIよりLINEへメッセージ送信
 - WEB APIよりPCをシャットダウン(SSH2経由でシャットコマンドを実行)
 
トリガー
トリガー(this)にNature Remoをを選択し「Temperature rises above」(室温上昇)のトリガーを選択します。
 トリガーは以下が準備されております。
- Temperature rises above : 室温上昇
 - Temperature drops below : 室温低下
 - Humidity rises above : 湿度上昇
 - Humidity drops below : 湿度低下
 - Becomes brighter : 部屋の照度上昇
 - Becomes darker : 部屋の照度低下
 
対象のNature Remoデバイスを選択
what value でトリガー対象の室温を設定します。今回は、30℃を指定しています。
アクション
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="室温が{{ThresholdValue}}を超えます。現在の {{CreatedAt}}の室温は、 {{Value}}です。"
 
 
APIKEY=apikey&KEY=TemperatureWarn&TEXT=室温が{{ThresholdValue}}を超えます。現在の {{CreatedAt}}の室温は、 {{Value}}です。以下が、準備したサンプルのPHPスクリプトとなります。
//@HOME_API_LOG_NAME@ ログファイル名、書き込み権限が必要です
//@HOME_API_KEY@ POST受信時の簡易的なAPI-KEYのトークン確認を行います
//@IFTTT_POST_API_KEY@ IFTTTのWebhooks用API-KEY
//@WINDOWS_IP@ WindowsのIPアドレス
//@WINDOWS_USER@ Windowsのユーザー名
//@WINDOWS_PASS@ Windowsのパスワード
//各種設定
//ログのファイル名
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");
//Windows PC
define("WINDOWS_IP","@WINDOWS_IP@");
define("WINDOWS_USER","@WINDOWS_USER@");
define("WINDOWS_PASS","@WINDOWS_PASS@");
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 shutdownPC($target_ip, $target_user, $target_pass) {
	logger("Start shutdown target_ip:".$target_ip." target_user:".$target_user,"INFO");
	$shutdown_time = 60;
	$comment = "シャットダウン開始します。キャンセル「-a」";
	$cmd = 'shutdown /s /f /t '.$shutdown_time.' /c '.$comment;
	$connection = ssh2_connect($target_ip);
	ssh2_auth_password($connection, $target_user, $target_pass);
    $stream = ssh2_exec($connection, $cmd);
    $errorstream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);
    stream_set_blocking($stream, true);
    stream_set_blocking($errorstream, true);
    $ok =  stream_get_contents($stream);
   $ng =  stream_get_contents($errorstream); //エラーがあれば表示
   echo $ok;
   echo $ng;
}
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 'TemperatureWarn':
		logger("Start TemperatureWarn","INFO");
		//Over 30
		pushLine('【リビング室温警告】',$text);
		shutdownPC(WINDOWS_IP, WINDOWS_USER, WINDOWS_PASS);
		break;
}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のグループにも送信することが出来ます。
アクション2
準備したPHPファイルより「@WINDOWS_IP@:WindowsのIPアドレス、 @WINDOWS_USER@:Windowsのユーザー名、@WINDOWS_PASS@:Windowsのパスワード 」に設定したPCへSSH2用いてPCへログインし、シャットダウンコマンドを実行します。