読者です 読者をやめる 読者になる 読者になる

Zabbixで東電のでんき予報データを監視する方法

(追記)
すーばらしい、Zabbixの寺島さんがスクリプト公開してくれてらっしゃる!
Kodai's Blog: Zabbixで電力会社の電力使用状況を監視する
参照:

YahooのAPIを使うほうがサーバが安定してそうだけれども、5分に1回監視する程度なら、東電でもええではないか、ということでメモ。

データ取得

wgetで取得するスクリプトをcronで動かす。(コマンドのパスはCentOS5のもの。curlのほうがいいかしらん)

#!/bin/bash
TMP=`mktemp`
AWK=/bin/awk
WGET=/usr/bin/wget
LATEST=/path_to/電気監視最新.txt
LIMIT=/path_to/電気監視上限.txt

$WGET -O $TMP http://www.tepco.co.jp/forecast/html/images/juyo-j.csv > /dev/null
$AWK -F\, '{if ($3 > 0) {last=$3}}END{print last}' $TMP  > $LATEST
head -3 $TMP | tail -1 | $AWK -F\, "{print \$1}" > $LIMIT
rm -f $TMP

↑のコードで最新の値($LATEST)を拾ってくるところは、5分間隔で更新されているデータのほうから取得している。このあたりが汚いと感じる人はYahooのAPIをお勧めする。ただしJSONとかをparseしないといけない。
たとえば、Android(Java)ではこんなかんじ。Javascriptでやれば全然楽なはずw

package foobar;
// importうんぬんは省略
public class ActivitiyName extends Activity {

	private ProgressDialog progressDialog;
	private TextView output;
	private Button button;
	private CookieStore cookieStore = new BasicCookieStore();
	private final Handler handler = new Handler() {
		public void handleMessage(final Message msg) {
			progressDialog.dismiss();
			String bundleResult = msg.getData().getString("RESPONSE");
			try {
				JSONObject json = new JSONObject(bundleResult);
				JSONObject usage = json.getJSONObject("ElectricPowerUsage");
				JSONObject usageString = usage.getJSONObject("Usage");
				JSONObject capacityString = usage.getJSONObject("Capacity");
				String datestring = usage.getString("Date");
				String hourstring = usage.getString("Hour");
				int usageValue = usageString.getInt("$");
				int capacityValue = capacityString.getInt("$");
				output.setText("as of " + datestring + " " + hourstring + "oclock\n" + 
						       "Usage: " + String.valueOf(usageValue) + "\n" +
						       String.valueOf(capacityValue) + "kW");
				} catch (JSONException e) {
// エラー処理
				}
		}
	};

	/** Called when the activity is first created. */
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		this.output = (TextView) findViewById(R.id.Response);
		this.button = (Button) findViewById(R.id.Button);
		
		this.button.setOnClickListener(new OnClickListener() {
			public void onClick(final View v) {
				output.setText(".....");
				performRequest("YahooのAPIのURL");
			}
		});
	}

	private void performRequest(final String url) {
		final ResponseHandler<String> responseHandler = new ResponseHandler<String> () {
			public String handleResponse(HttpResponse response) {
				HttpEntity entity = response.getEntity();
				String result =null;
				try {
					result = StringUtils.inputStreamToString(entity.getContent());
					Message message = handler.obtainMessage();
					Bundle bundle = new Bundle();
					bundle.putString("RESPONSE", result);
					message.setData(bundle);
					handler.sendMessage(message);
				} catch (Exception e) {
// エラー処理
				}
				return result;
			}
		};

		this.progressDialog = ProgressDialog.show(this, "working . . .",
				"performing HTTP request");

		// do the HTTP dance in a separate thread (the responseHandler will fire
		// when complete)
		new Thread() {
			@Override
			public void run() {
				HttpClient httpclient = new DefaultHttpClient();
				try {

					// Create local HTTP context
					HttpContext localContext = new BasicHttpContext();
					// Bind custom cookie store to the local context
					localContext.setAttribute(ClientContext.COOKIE_STORE,
							cookieStore);

					final HttpPost httppost = new HttpPost(url);

					// Pass local context as a parameter
					String response = httpclient.execute(httppost, responseHandler,localContext);
					
				} catch (Exception e) {
// エラー処理
				}
			}
		}.start();
	}
}

でZabbix側では、、、

サーバ上にファイルとして書き出してしまえば、zabbix_agentd.conf に以下のような記述をするだけでキーとしてアクセスできるようになる。

UserParameter=latest.tepco, cat /path_to/電気監視最新.txt
UserParameter=max.tepco, cat /path_to/電気監視上限.txt

あとはこのキーを使ってアイテムを作り、トリガーを設定する。
たとえば、5分前の使用電力が、供給量の95%を超えたらアラート、とかいうのは以下のようになる。

{サーバ名:latest.tepco.last(#1)}>{サーバ名:max.tepco.last(#1)}*0.95

Zabbixで監視するならそもそもの東電サーバとの導通をみとかなきゃな

そして、依存関係にしとく。(あとでやる)