印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
Perl 電力使用状況のデータ更新が停滞するのは東京電力が原因だった

東京電力のデータから Zabbix でグラフを描いたところ,データ更新が滞っているのはオリジナルのデータだということが分かった。

■ ■ ■

先日,東京電力の電力使用状況を Zabbix でグラフ化した。すると,一部で電力消費量が一定になってしまう時間帯があることが分かった (nlog(n): Zabbix 2.4 で電力使用状況をグラフ化してみたら UserParameter の謎仕様にぶち当たった)。

電力使用状況10月4日のグラフ
電力使用状況10月4日のグラフ


これは,東京電力電力供給状況APIから取得した最新データから作成したグラフである。0時台はデータに変化がない。

データの取得ログを見てみると,次のようになっていた。API には5分毎にアクセスしている。

23:40,2997,4757
23:45,2989,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757
23:50,2959,4757

1:10,2652,4984
1:15,2632,4984

23:55〜1:05 のデータが,すべて 23:50 のデータになっている。東京電力が公開しているデータ (CSV) には,この時間帯のデータに変化がある。

そこで,東京電力の CSV データから直接最新データを取得することにした。quick.txt を出力する Perl スクリプトは以下の通り。

#!/usr/bin/perl
use strict;
use WWW::Mechanize;
use Text::CSV_XS;

my $mech = WWW::Mechanize->new();
$mech->get('http://www.tepco.co.jp/forecast/html/images/juyo-j.csv') or die;
my $content = $mech->{content};

open my $fh, '<', \$content or die;

my $csv = Text::CSV_XS->new({binary => 1});
my ($capacity, $str);
while (my $row = $csv->getline($fh)) {
    my @fields = @{$row};
    $capacity = $fields[0] if 3 .. 3;
    if ($fields[2] =~ /[0-9]/) {
        $str = sprintf("%s,%d,%d\n", $fields[1], $fields[2], $capacity);
    }
}
print $str;

電力供給量は3行目の第1フィールド (インデックスは0),電力消費量のうち最新のものは第3フィールドが数字になっているもの (インデックスは2) を $str に上書きしていって,最後に残ったものとしている。これを cron で5分おきに起動するようにした。

電力使用状況10月7日のグラフ
電力使用状況10月7日のグラフ


そして,このデータをもとにしてグラフを重ね描きしたものが上のグラフである。若干の値の違いはあるものの,データの更新が停滞する時間帯は同一であることが分かった。

まとめ

東京電力の電力使用状況グラフが停滞するのは,API が原因ではなく,東京電力が公開している元データの更新が停滞しているのが原因であることが分かった。毎日0時台のデータは1時過ぎになってからババッと更新されるのである。Zabbix はリアルタイムのグラフしか描けないので,その時間帯のデータを反映するのは不可能なのだった。

Posted by n at 2016-10-07 22:57 | Edit | Comments (0) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?