hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

東京電力電力供給状況API と Google Chart API で 電力使用状況グラフ

前回は「Yahoo!電力使用状況API と Google Chart API で 電力使用状況グラフ」というエントリを書きました。
今回は「Yahoo!電力使用状況API」ではなく、@ssci さんが公開されている「東京電力電力供給状況API」を使ってみました。

プラスで、前回は画像として出力していましたが、今回はHTMLで出力するようにしてブログパーツ的な使い方が出来るようにしてみました。

作成にあたっては、「PHP言語とWebAPIを利用した自作ブログパーツの紹介」と 「PHP5.1で、JSONを使う(PHP5.2未満編) - Beyond prep」を参考にさせていただきました。

使用した物(Web API)

「電力使用状況グラフ」を作成するのに、

を使いました。

Google Chart API」は言わずと知れた Google のグラフ表示のためのAPIです。
東京電力電力供給状況API」は、@ssci さん が公開している電力の最大供給量と使用量を取得できるAPIです。

電力使用状況API(Yahoo!デベロッパーネットワーク) は データをXMLで受け取っていましたが、東京電力電力供給状況API では JSON 形式で提供されています。

f:id:mrgoofy33:20110412062627p:image:w400

東京電力電力供給状況API

PHP5.1系では json_decode が使えない

PHP で JSON をパースするときは「json_decode」が便利なのですが、PHP5.2.0 以上からしか使えません。
CentOSなどで公式に提供されているのはPHP5.1系のため、今回は「Zend_Json」を使ってみました。

「Zend_Json」を使うに当たっては、PHP5.1で、JSONを使う(PHP5.2未満編) - Beyond prep を参考にさせていただきました。

Zend_Json をインストール

ということで、さっそく「Zend_Json」をインストールします。
手順としては、

まず、Zend Frameworkをダウンロードする。Zendは一つ一つのライブラリが独立しているので、必要なものだけ、必要なときに使えばよいようになっている。

そこで、ダウンロードしたライブラリの中から「lib/Zend/Json」フォルダと「lib/Zend/Json.php」ファイルを抜き出して、適当なフォルダにコピー。で、適当にincludeして、Json.phpを使えるようにそれば以下の方法でjson_decodeと同じ機能をもったファンクションを呼び出すことが出来る

PHP5.1で、JSONを使う(PHP5.2未満編) - Beyond prep

になります。

実際のインストールするときのコマンドは以下のようになるかと思います。

$ wget http://framework.zend.com/releases/ZendFramework-1.11.5/ZendFramework-1.11.5.zip
$ unzip ZendFramework-1.11.5.zip
$ mkdir $PHP_CLASSPATH/Zend
$ mv Zend/Json.php $PHP_CLASSPATH/Zend/
$ mv Zend/Json $PHP_CLASSPATH/Zend/
$ rm -rf ZendFramework-1.11.5

ひとつ注意点としては、「Json.php」などのファイルからの別ファイルへの参照が「Zend/〇〇〇.php」の形で記述されているので、PHPのパスが通っているディレクトリ以下に「Zendディレクトリ」を作成して、そこに Zend_Json 関連のファイルを格納する必要があります。

HTML で出力 & iframe で表示

PHP言語とWebAPIを利用した自作ブログパーツの紹介」を参考にさせていただき、ブログパーツ的にしてみました。

前回は、以下のように画像として出力していましたが、

<?php
header("Content-type: image/png");
echo $response;

今回は、以下のようにして HTML として出力させています。

<?php
echo <<<HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">

呼び出し側の HTML では以下のようにして「iframe」を使用して、作成した PHP ファイルを実行してグラフを表示させます。

ほげほげ<br />
<iframe src="json_parts.php" frameborder="0" scrolling="no" width="300" height="500"></iframe>
hogehoge

サンプルコード(全部)

PHPソースコードは以下のようになります。

<?php

// Zend Framework の Json ライブラリ のインクルード
// ※PHP5.2.00以上では「json_decode」が使用可のため不要
require_once("Zend/Json.php");

// URLからデータ(xmlなど)を取得
function cUrl($request){
    $session = curl_init($request);
    curl_setopt($session, CURLOPT_HEADER, false);
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

    // プロキシの認証が必要な場合は以下をコメントアウトして設定
    # curl_setopt($session, CURLOPT_PROXY, 'your-proxy:portno');
    # curl_setopt($session, CURLOPT_PROXYUSERPWD, 'user_id:password');

    $response = curl_exec($session);
    curl_close($session);
    return $response;
}

// 東京電力電力供給状況API からのJSON取得→配列に変換
// リクエストURL:http://tepco-usage-api.appspot.com/latest.json
function tepcoApiLatest(){
    $url = "http://tepco-usage-api.appspot.com/latest.json";
    $json = cUrl($url);
    return Zend_Json::decode($json);

    // PHP5.2.0以上の場合は以下で実装可能
    // return json_decode($json);
}

// Google Chart Tools API 用の URL生成
// 円グラフ
function googleChartApi($capacity_rate,
                        $usage_rate,
                        $capacity_zan,
                        $usage ){
    return 'http://chart.apis.google.com/chart?chs=300x225'
        . '&cht=p&chd=t:' . ceil($capacity_rate) . ',' . ceil($usage_rate)  
        . '&chdl=%E6%AE%8B%E4%BE%9B%E7%B5%A6%E8%83%BD%E5%8A%9B|%E4%BD%BF%E7%94%A8%E9%87%8F'
        . '&chdlp=t&chl=' . ceil($capacity_zan) . 'Kw|' . ceil($usage) . 'Kw'
        . '&chtt=%E6%9D%B1%E4%BA%AC%E9%9B%BB%E5%8A%9B%E3%81%AE%E9%9B%BB%E5%8A%9B%E4%BD%BF%E7%94%A8%E7%8A%B6%E6%B3%81';
}

// 東京電力電力供給状況API へのリクエスト
$tepco = tepcoApiLatest();

//残供給量
$capacity_zan = $tepco['capacity'] - $tepco['usage'];
//使用率
$usage_rate = round($tepco['usage'] / $tepco['capacity'] * 100);
//残供給率
$capacity_rate = 100 - $usage_rate;
 
// Google Chart Tools API の URL生成
$chartUrl = googleChartApi($capacity_rate, $usage_rate, $capacity_zan, $tepco['usage']);

// HTML出力用のデータセット
$site['title'] = "電力使用量サンプル";
$site['mojicode'] = "UTF-8";
$site['bgcolor'] = "#fff";
$site['usage_rate'] = $usage_rate;
$site['usage'] = $tepco['usage'];
$site['capacity'] = $tepco['capacity'];
$site['charturl'] = $chartUrl;

// HTMLの出力
echo <<<HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset={$site['mojicode']}">
<title>{$site['title']}</title>
</head>
<body bgcolor="{$bgcolor}">
<span style="font-size:{$fontsize};">
<p>使用率:{$site['usage_rate']}</p>
<p>使用量:{$site['usage']}</p>
<p>供給能力 :{$site['capacity']}</p>
<img src="{$site['charturl']}">
</span>
<body></html>
HTML;

今回参考にしたページ

東京電力電力供給状況API
http://tepco-usage-api.appspot.com/

PHP言語とWebAPIを利用した自作ブログパーツの紹介
http://kommy.s254.xrea.com/parts/

PHP5.1で、JSONを使う(PHP5.2未満編) - Beyond prep
http://www.b-prep.com/blog/?p=238

Zend_Json - わくわく技術ランド.htm
http://wadslab.net/wiki/index.php?Zend_Json