diff web/log.py @ 335:1e22eaf93620

work on web interface
author Matt Johnston <matt@ucc.asn.au>
date Tue, 12 Jun 2012 23:27:53 +0800
parents 3b821541657d
children 5e75e08d20ac
line wrap: on
line diff
--- a/web/log.py	Tue Jun 12 00:35:23 2012 +0800
+++ b/web/log.py	Tue Jun 12 23:27:53 2012 +0800
@@ -1,17 +1,58 @@
 import rrdtool
 import os
+import os.path
 import sys
+import glob
+from colorsys import hls_to_rgb
 
 import config
 
 def sensor_rrd_path(s):
     return '%s/sensor_%s.rrd' % (config.DATA_PATH, s)
 
+# returns (path, sensor_name) tuples
+def all_sensors():
+    return [(r, os.path.basename(r[:-4])) 
+        for r in glob.glob('%s/*.rrd' % config.DATA_PATH)]
+
 def create_rrd(sensor_id):
     rrdtool.create(sensor_rrd_path(sensor_id), '-s', '300',
                 'DS:temp:GAUGE:600:-10:100',
                 'RRA:AVERAGE:0.5:1:1051200')
 
+
+# stolen from viewmtn, stolen from monotone-viz
+def colour_from_string(str):
+    def f(off):
+        return ord(hashval[off]) / 256.0
+    hashval = sha.new(str).digest()
+    hue = f(5)
+    li = f(1) * 0.15 + 0.55
+    sat = f(2) * 0.5 + .5
+    return ''.join(["%.2x" % int(x * 256) for x in hls_to_rgb(hue, li, sat)])
+
+def graph_png(start, length):
+    rrds = all_sensors()
+
+    graph_args = []
+    for n, (rrdfile, sensor) in enumerate(rrds):
+        vname = 'temp%d' % n
+        graph_args.append('DEF:%(vname)s=%(rrdfile)s:temp:AVERAGE' % locals())
+        width = config.LINE_WIDTH
+        legend = config.SENSOR_NAMES.get(sensor, sensor)
+        colour = config.SENSOR_COLOURS.get(legend, colour_from_string(r))
+        graph_args.append('LINE%(width)f:%(vname)s#%(colour)s:%(legend)s' % locals())
+
+    tempf = tempfile.NamedTemporaryFile()
+    args = [tempf.name, '-s', str(start),
+        '-e', str(start+length),
+        '-w', config.GRAPH_WIDTH,
+        '--slope-mode',
+        '--imgformat', 'PNG']
+        + graph_args
+    rrdtool.graph(*args)
+    return tempf.read()
+
 def sensor_update(sensor_id, measurements, first_real_time, time_step):
     try:
         open(sensor_rrd_path(sensor_id))