あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

PHPでごりごり書いた東京電力の電力使用状況取得スクリプト

先ほどのエントリー( http://d.hatena.ne.jp/Akkiesoft/20110325/1301026377 )で作ったボットの、東京電力の電力使用状況を取得するスクリプトを公開します。MITライセンスでご自由にどうぞ。
電力使用状況は毎時15分〜30分ごろに更新されるとのことなので、35分ぐらいに実行されるようにすると良いでしょう。
しかしなんだ、東京電力電力供給状況API( http://tepco-usage-api.appspot.com/ )というイマドキ風なベンリモノが登場したようなので、(ただでさえ薄いはずの)需要は薄そうですな(笑)。

スクリプト(2011/3/26 3:00版)

(2011/3/26 3:00追記)東電のHTMLとCSVが変更されたため、スクリプトを更新しました。
古いスクリプトはこちら: http://d.hatena.ne.jp/Akkiesoft/20000111

/* warningが出るので宣言する */
$time		= '';
$tstart		= '';
$tend		= '';
$tstat		= '';

$data = getFile('http://www.tepco.co.jp/forecast/index-j.html');
$cnt = 0;
foreach($data as $line) {
	if ($line) {
		if (strstr($line, 'class="heading-04"') !== FALSE) {
			if (strstr($data[$cnt-1], '-->') === FALSE) {
				/* このheading-04クラスはコメントアウトされている */
				$cnt++;
				continue;
			}
			$time = strip_tags($line);
			$time = mb_convert_kana($time, 'ns');
			if (preg_match_all('/([0-9]+)\:([0-9]+)/', $time, $match)) {
				$tstart = $match[0][0];
				$tend   = $match[0][1];
				$tstat  = $tstart.'〜'.$tend."\n停電実施グループの確認は東京電力ホームページを確認して下さい。";
			} else if (strstr($time, '実施いたしません') !== FALSE) {
				$tstat = '実施されません';
			} else {
				$tstat = '取得に失敗しました';
			}
			break;
		}
	}
	$cnt++;
}

$time = strftime('%H', strtotime("-1 hour"));
$time = intval($time);

$csv = getFile('http://www.tepco.co.jp/forecast/html/images/juyo-j.csv');
/* ピーク時供給力 */
$peakData = explode(',', $csv[2]);
$peak = $peakData[0];
$peakTime = $peakData[1];
$peakUpdate = '('.$peakData[2].' '.$peakData[3].'現在)';
/* 次のパースに邪魔になるので消えてもらう */
array_splice($csv, 0, 4);
/* 電力実績取得 */
foreach($csv as $line) {
	if (preg_match('/'.$time.'\:00/', $line)) {
		$param = explode(',', $line);
		break;
	}
}

/* 使用率計算 */
$parcent = round($param[2] / $peak * 100, 2);

if ($param[2] == '0') {
	print $time.'時台の使用量はまだCSVに記録されていないようです';
	exit;
}

print <<<EOM
{$time}時台の使用量: {$param[2]}万kW (昨日の同時間帯: {$param[3]}万kW)
本日のピーク時供給力{$peakUpdate}: {$peakTime}に{$peak}万kW供給可能
使用率: {$parcent}%
本日の計画停電実施予定: {$tstat}
EOM;

function getFile($url) {
/*
   URLのファイルを取得→UTF-8に変換→行ごとに配列にして返す
   取得失敗は考慮していない
*/
	$data = file_get_contents($url);
	$data = mb_convert_encoding($data, 'utf-8', 'shift_jis');
	$data = preg_replace('/(\r\n|\r|\n)/', "\n", $data);
	$data = explode("\n", $data);
	return $data;
}

23時台の結果を反映したCSVはどうなるか

こちらは別件で、個人的に23時台の更新時(0:30ごろ更新)のCSVがどうなるのか気になっていたのですが、全ての項目が埋まる形になるようです。この次はきっと前日実績が消えて、当日実績が右にシフトするんではないかと思います。

2011/3/25 23:30 UPDATE
DATE,TIME,当日実績(万kW),前日実績(万kW)
2011/3/25,0:00,2990,2920
2011/3/25,1:00,2850,2780
2011/3/25,2:00,2770,2690
2011/3/25,3:00,2710,2630
2011/3/25,4:00,2700,2610
2011/3/25,5:00,2830,2750
2011/3/25,6:00,3100,3060
2011/3/25,7:00,3350,3290
2011/3/25,8:00,3500,3540
2011/3/25,9:00,3580,3730
2011/3/25,10:00,3490,3720
2011/3/25,11:00,3440,3670
2011/3/25,12:00,3220,3440
2011/3/25,13:00,3330,3530
2011/3/25,14:00,3320,3480
2011/3/25,15:00,3300,3410
2011/3/25,16:00,3390,3420
2011/3/25,17:00,3450,3480
2011/3/25,18:00,3480,3590
2011/3/25,19:00,3280,3430
2011/3/25,20:00,3340,3490
2011/3/25,21:00,3260,3440
2011/3/25,22:00,3240,3410
2011/3/25,23:00,3080,3230