家から離れたらエアコンをオフにする

 おうちサーバとRM MINI3とiftttを組み合わせて、エネルギー食いまくりの暖房を切り忘れても大丈夫なように設定してみた。

 仕組みとしては

  • 自宅から離れたらgmailから自宅サーバにメールを送るようiftttで設定。
  • 自宅サーバは届いたメールをチェックし、在不在ステイタスを変更する。
  • cronで10分に1回在不在ステイタスとエアコンステイタスをチェックし、不在だったらエアコンを切リ、エアコンステイタスを停止にする。
  • 自宅のwifiに接続したらgmailから自宅サーバにメールを送るようiftttで設定。
  • 自宅サーバは届いたメールをチェックし、在不在ステイタス、エアコンステイタスを変更する。

 まずは最初の「自宅から離れたら」のトリガーがちゃんと働くかしばらく確認。どうやら信頼に足りると判断。

 メールサーバはpostfixなので、受信内容をパイプでphpスクリプトに渡すようmain.cfを修正。スクリプトは以下。

<?php
error_reporting('ALL');
$contents = file_get_contents("php://stdin");

require_once("ReceiptMailDecoder.class.php"); #http://d.hatena.ne.jp/ya--mada/20080415/1208318475 をphp7対応修正
chdir(dirname(__FILE__));

$decoder = new ReceiptMailDecoder($contents);

$to = $decoder->getToAddr();
$from =  $decoder->getFromAddr();
$subject =  $decoder->getDecodedHeader( 'subject' ); 

echo "$to\n$from\n$subject\n";

if(アドレスとかをチェック){ #特定メールの判別
	if(subjectをチェック){ #外出メールの場合
		file_write(0);
	}
	if(subjectをチェック){ #帰宅メールの場合
		file_write(1);
		file_put_contents(__DIR__."/status/aircon.txt",1);	#エアコンステイタスを「ついているかも」に。
	}
}else{
	echo "no match\n";
}

function file_write($flag){
	$file = __DIR__ . "/status/athome.txt";
	$logfile = __DIR__ . "/log/athome.log";
	$date = date("Y/m/d_H:i:s");
	$unix_time = time();
	file_put_contents($file, $flag);
	file_put_contents($logfile, "$date	$flag\t$unix_time\n",FILE_APPEND);
}
?>

 cronで動かすスクリプトは以下の通り。

<?php
$athomefile = __DIR__."/status/athome.txt";
$airconfile = __DIR__."/status/aircon.txt";
$logfile = __DIR__."/log/aircon.log";
$cmd = "python /home/kazz/python-broadlink/BlackBeanControl/BlackBeanControl.py -c aircon_off";
$athomeflag = rtrim(file_get_contents($athomefile));	#家にいたら1
$airconflag = rtrim(file_get_contents($airconfile));	#「ついているかも」で1

if ($athomeflag == 0 && $airconflag == 1){
	system($cmd);
	file_put_contents($airconfile,0);	#オフにしたので0
}
	file_put_contents($logfile,date("Y/m/d H:i:s")."\t$athomeflag\t$airconflag\n",FILE_APPEND);

?>


 エアコンのon/offはトグルではなく独立しているので、お構いなしに10分おきにoff信号を送り続けてもええねんけど、あまりスマートではないので。

 ところが、この仕組みを導入してからなぜかiftttの位置トリガーの動作が怪しくなる。なんでやねん。トリガーが動作したときにはちゃんと止まっている。