Mercurial > templog
comparison web/log.py @ 62:68c1e2b26bc5
merge
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Tue, 26 Jun 2012 21:21:09 +0800 |
parents | 62112fc2af21 |
children | 43ec670f1b75 |
comparison
equal
deleted
inserted
replaced
60:2ebe33714989 | 62:68c1e2b26bc5 |
---|---|
23 for r in glob.glob('%s/*.rrd' % config.DATA_PATH)] | 23 for r in glob.glob('%s/*.rrd' % config.DATA_PATH)] |
24 | 24 |
25 def create_rrd(sensor_id): | 25 def create_rrd(sensor_id): |
26 # start date of 10 seconds into 1970 is used so that we can | 26 # start date of 10 seconds into 1970 is used so that we can |
27 # update with prior values straight away. | 27 # update with prior values straight away. |
28 args = [sensor_rrd_path(sensor_id), | 28 if 'voltage' in sensor_id: |
29 '--start', '10', | 29 args = [ 'DS:temp:GAUGE:7200:-1:10', |
30 '--step', '300', | 30 'RRA:AVERAGE:0.9999:1:1051200'] |
31 'DS:temp:GAUGE:600:-10:100', | 31 else: |
32 'RRA:AVERAGE:0.5:1:1051200'] | 32 args = [ 'DS:temp:GAUGE:600:-10:100', |
33 'RRA:AVERAGE:0.5:1:1051200'] | |
33 | 34 |
34 rrdtool.create(*args) | 35 rrdtool.create(sensor_rrd_path(sensor_id), |
36 '--start', '10', | |
37 '--step', '300', | |
38 *args) | |
35 | 39 |
36 # stolen from viewmtn, stolen from monotone-viz | 40 # stolen from viewmtn, stolen from monotone-viz |
37 def colour_from_string(str): | 41 def colour_from_string(str): |
38 def f(off): | 42 def f(off): |
39 return ord(hashval[off]) / 256.0 | 43 return ord(hashval[off]) / 256.0 |
45 | 49 |
46 def graph_png(start, length): | 50 def graph_png(start, length): |
47 rrds = all_sensors() | 51 rrds = all_sensors() |
48 | 52 |
49 graph_args = [] | 53 graph_args = [] |
54 have_volts = False | |
50 for n, (rrdfile, sensor) in enumerate(rrds): | 55 for n, (rrdfile, sensor) in enumerate(rrds): |
51 vname = 'temp%d' % n | 56 if 'avrtemp' in sensor: |
52 graph_args.append('DEF:%(vname)s=%(rrdfile)s:temp:AVERAGE' % locals()) | 57 continue |
58 if 'voltage' in sensor: | |
59 have_volts = True | |
60 vname = 'scalevolts' | |
61 graph_args = ['DEF:rawvolts=%(rrdfile)s:temp:AVERAGE:step=3600' % locals(), | |
62 'CDEF:scalevolts=rawvolts,0.2,/'] + graph_args | |
63 else: | |
64 vname = 'temp%d' % n | |
65 graph_args.append('DEF:%(vname)s=%(rrdfile)s:temp:AVERAGE' % locals()) | |
53 width = config.LINE_WIDTH | 66 width = config.LINE_WIDTH |
54 legend = config.SENSOR_NAMES.get(sensor, sensor) | 67 legend = config.SENSOR_NAMES.get(sensor, sensor) |
55 colour = config.SENSOR_COLOURS.get(legend, colour_from_string(sensor)) | 68 colour = config.SENSOR_COLOURS.get(legend, colour_from_string(sensor)) |
56 graph_args.append('LINE%(width)f:%(vname)s#%(colour)s:%(legend)s' % locals()) | 69 graph_args.append('LINE%(width)f:%(vname)s#%(colour)s:%(legend)s' % locals()) |
57 | 70 |
60 '-e', str(int(start+length)), | 73 '-e', str(int(start+length)), |
61 '-w', str(config.GRAPH_WIDTH), | 74 '-w', str(config.GRAPH_WIDTH), |
62 '-h', str(config.GRAPH_HEIGHT), | 75 '-h', str(config.GRAPH_HEIGHT), |
63 '--slope-mode', | 76 '--slope-mode', |
64 '--border', '0', | 77 '--border', '0', |
78 '--vertical-label', 'Temperature', | |
65 '--y-grid', '1:1', | 79 '--y-grid', '1:1', |
66 '--grid-dash', '1:0', | 80 '--grid-dash', '1:0', |
67 '--color', 'GRID#00000000', | 81 '--color', 'GRID#00000000', |
68 '--color', 'MGRID#aaaaaa', | 82 '--color', 'MGRID#aaaaaa', |
69 '--color', 'BACK#ffffff', | 83 '--color', 'BACK#ffffff', |
84 'VRULE:%d#ee0000' % time.time(), | |
70 '--imgformat', 'PNG'] \ | 85 '--imgformat', 'PNG'] \ |
71 + graph_args | 86 + graph_args |
72 if config.GRAPH_FONT: | 87 if config.GRAPH_FONT: |
73 args += ['--font', 'DEFAULT:11:%s' % config.GRAPH_FONT] | 88 args += ['--font', 'DEFAULT:11:%s' % config.GRAPH_FONT] |
74 print>>sys.stderr, args | 89 if have_volts: |
90 args += ['--right-axis', '0.2:0', # matches the scalevolts CDEF above | |
91 '--right-axis-format', '%.2lf', | |
92 '--right-axis-label', 'Voltage'] | |
93 | |
75 rrdtool.graph(*args) | 94 rrdtool.graph(*args) |
76 return tempf.read() | 95 return tempf.read() |
77 | 96 |
78 def sensor_update(sensor_id, measurements, first_real_time, time_step): | 97 def sensor_update(sensor_id, measurements, first_real_time, time_step): |
79 try: | 98 try: |
80 open(sensor_rrd_path(sensor_id)) | 99 open(sensor_rrd_path(sensor_id)) |
81 except IOError, e: | 100 except IOError, e: |
82 create_rrd(sensor_id) | 101 create_rrd(sensor_id) |
83 | 102 |
84 print>>sys.stderr, sensor_id, measurements, first_real_time, time_step | |
85 | |
86 if measurements: | 103 if measurements: |
87 values = ['%d:%f' % p for p in | 104 values = ['%d:%f' % p for p in |
88 zip((first_real_time + time_step*t for t in xrange(len(measurements))), | 105 zip((first_real_time + time_step*t for t in xrange(len(measurements))), |
89 measurements)] | 106 measurements)] |
90 | 107 |
91 rrdfile = sensor_rrd_path(sensor_id) | 108 rrdfile = sensor_rrd_path(sensor_id) |
92 print>>sys.stderr, values | |
93 # XXX what to do here when it fails... | 109 # XXX what to do here when it fails... |
94 for v in values: | 110 for v in values: |
95 try: | 111 try: |
96 rrdtool.update(rrdfile, v) | 112 rrdtool.update(rrdfile, v) |
97 except Exception, e: | 113 except Exception, e: |
140 | 156 |
141 avr_now = float(entries['now']) | 157 avr_now = float(entries['now']) |
142 avr_first_time = float(entries['first_time']) | 158 avr_first_time = float(entries['first_time']) |
143 time_step = float(entries['time_step']) | 159 time_step = float(entries['time_step']) |
144 | 160 |
161 if 'avrtemp' in entries: | |
162 avrtemp = val_scale(int(entries['avrtemp'])) | |
163 sensor_update('avrtemp', [avrtemp], time.time(), 1) | |
164 | |
165 if 'voltage' in entries: | |
166 voltage = 0.001 * int(entries['voltage']) | |
167 sensor_update('voltage', [voltage], time.time(), 1) | |
168 | |
145 #sqlite | 169 #sqlite |
146 # - time | 170 # - time |
147 # - voltage | 171 # - voltage |
148 # - boot time | 172 # - boot time |
149 | 173 |