おうちサーバと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の位置トリガーの動作が怪しくなる。なんでやねん。トリガーが動作したときにはちゃんと止まっている。