# CurrentCost page by Ben Smithurst - http://www.bensmithurst.com/currentcost/
/* set these */
define('RRDTOOL', '/usr/local/bin/rrdtool');
define('RRD', '/usr/local/currentcost/trunk/backend/powertemp.rrd');
define('SQLITE', '/usr/local/currentcost/trunk/backend/sqlite.db');
$sqlite = new PDO('sqlite:'.SQLITE);
if (!$sqlite)
die("SQLite error: $err");
print '
Power Usage
';
print '';
print '| '.date('M jS - H:i').' | Watts | KWh |
';
print_stat('current', 'current power usage', 'SELECT watts FROM readings ORDER BY id DESC LIMIT 1');
print_stat('last hour', 'average power over last hour', "SELECT AVG(watts), SUM(joules) FROM readings WHERE ts >= DATETIME('now','localtime','-60 minute')");
print_stat('last 3 hours', 'average power over last 3 hours', "SELECT AVG(watts), SUM(joules) FROM readings WHERE ts >= DATETIME('now','localtime','-180 minute')");
print_stat('last 24 hours', 'average power over last 24 hours', "SELECT AVG(watts), SUM(joules) FROM readings WHERE ts >= DATETIME('now','localtime','-24 hour')");
print_stat('last week', 'average power over last week', "SELECT AVG(watts), SUM(joules) FROM readings WHERE ts >= DATETIME('now','localtime','-7 day')");
print '
';
print_image('Power usage over last 10 minutes', 10, 'Power');
print_image('Power usage over last 60 minutes', 60, 'Power');
print_image('Power usage over last 3 hours', 3*60, 'Power');
print_image('Power usage over last 24 hours', 24*60, 'Power');
print_image('Power usage over last week', 7*24*60, 'Power');
print_image('Temperature over 24 hours', 24*60, 'Temperature');
function print_stat($short_label, $label, $query) {
global $sqlite;
$result = $sqlite->query($query);
if (!$result) {
print_r($sqlite->errorInfo());
return;
}
$ref = $result->fetch();
if (ppc_width())
$label = $short_label;
if (isset($ref[1]) && $ref[1] !== null)
printf("| %s: | %d | %.1f |
\n", $label, $ref[0], $ref[1] / 3600000);
else
printf("| %s: | %d |
\n", $label, $ref[0]);
}
function ppc_width() {
if (ereg('^([0-9]+)x', @$_SERVER['HTTP_UA_PIXELS'], $m))
return $m[1];
if (eregi('sonyericsson', $_SERVER['HTTP_USER_AGENT']))
return 230;
return null;
}
function print_image($label, $val, $field) {
$fn = generate_image($val, false, $field);
print "$label:
\n";
if (ppc_width()) {
$fnfull = generate_image($val, true, $field);
print "";
}
print "
";
if (ppc_width()) {
print "";
}
print "
\n";
ob_flush();
flush();
}
function generate_image($mins, $full = false, $field = null) {
if (!$full && ($width = ppc_width()))
$width -= 100;
else
$width = 700;
$mins = intval($mins);
$filename = "images/{$width}_{$mins}_{$field}.png";
$stat = @stat($filename);
$col = ($field == 'Power') ? '0000FF' : 'FF0000';
$vlabel = ($field == 'Power') ? 'Watts' : 'Degrees C';
$max_age = 60;
if (!$stat || $stat['mtime'] + $max_age < time()) {
# RRDtool command lines taken from http://www.jibble.org/currentcost/
# because I know very little about it myself :-)
$lowlimit = ($field == 'Power') ? '--lower-limit 0' : '';
if ($width <= 320) {
$vlabel = '';
} else {
$vlabel = "--vertical-label '$vlabel'";
}
if ($mins < 24*60) {
# less than a day
$cmd = RRDTOOL." graph $filename ".
"--start end-{$mins}m --width $width --end now --slope-mode ".
"--no-legend $vlabel $lowlimit ".
"--alt-autoscale-max --alt-y-grid ".
"DEF:$field=".RRD.":$field:AVERAGE ".
"LINE1:$field#$col:\"Average\" 2>&1";
} else {
# more than a day
$cmd = RRDTOOL." graph $filename ".
"--start end-{$mins}m --width $width --end now --slope-mode ".
"--no-legend $vlabel $lowlimit ".
"--alt-autoscale-max --alt-y-grid ".
"DEF:{$field}=".RRD.":{$field}:AVERAGE ".
"DEF:{$field}Min=".RRD.":{$field}:MIN ".
"DEF:{$field}Max=".RRD.":{$field}:MAX ".
"CDEF:{$field}Range={$field}Max,{$field}Min,- ".
"LINE1:{$field}Min: ".
"AREA:{$field}Range#{$col}11:\"Error Range\":STACK ".
"LINE1:{$field}Min#{$col}33:\"Min\" ".
"LINE1:{$field}Max#{$col}33:\"Max\" ".
"LINE1:{$field}#{$col}:\"Average\" 2>&1";
}
error_log("Generating CurrentCost image: $cmd");
exec($cmd, $output, $ret);
if ($ret != 0) {
print "rrdtool error: ".join(" ", $output)."
\n";
} else {
error_log("Output: ".join(" ", $output));
}
}
return $filename;
}
?>