Power Usage'; print ''; print ''; 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 '
'.date('M jS - H:i').'WattsKWh
'; 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 "\"graph\""; 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; } ?>