#!/usr/bin/python # Sample RRDtool Script. Used to produce sample graph for blog. # The data here is completely contrived. # For my blog: thepiandi.blogspot.com # Martin Lyon - Sept. 5, 2013 from datetime import datetime from pyrrd.rrd import DataSource, RRA, RRD # Calculate number of seconds between now and January 1, 1970 UTC # Since the step size = 60 seconds, the base time will be a multiple # of 60 seconds. timenow=datetime.utcnow() secondssince = (timenow-datetime(1970, 1, 1)).total_seconds() secondssince = int((secondssince + 30.5)/60)*60 print secondssince - 60 print secondssince + 1000 # SENSOR 1 SETUP: # Heartbeat is the maximum time between measurements allowed before a result is considered unknown sen1_file = '/home/pi/Documents/PythonProjects/RRDtool/DataFiles/Sensor_1.rrd' dataSources = [] roundRobinArchives = [] dataSource = DataSource(dsName='Sensor1', dsType='GAUGE', heartbeat=90) dataSources.append(dataSource) roundRobinArchives.append(RRA(cf='AVERAGE', xff=0.5, steps=2, rows=24)) roundRobinArchives.append(RRA(cf='LAST', xff=0.5, steps=1, rows=24)) sen1 = RRD(sen1_file, step=60, ds=dataSources, rra=roundRobinArchives, start=(secondssince-60)) sen1.create(debug=False) # SENSOR 2 SETUP: sen2_file = '/home/pi/Documents/PythonProjects/RRDtool/DataFiles/Sensor_2.rrd' dataSources = [] roundRobinArchives = [] dataSource = DataSource(dsName='Sensor2', dsType='GAUGE', heartbeat=90) dataSources.append(dataSource) roundRobinArchives.append(RRA(cf='AVERAGE', xff=0.5, steps=2, rows=24)) roundRobinArchives.append(RRA(cf='LAST', xff=0.5, steps=1, rows=24)) sen2 = RRD(sen2_file, step=60, ds=dataSources, rra=roundRobinArchives, start=(secondssince-60)) sen2.create(debug=False) # SENSOR DATA: sen1.bufferValue(secondssince, '72.4') sen2.bufferValue(secondssince, '82.4') sen1.bufferValue(secondssince+60, '71.8') sen2.bufferValue(secondssince+60, '81.8') sen1.bufferValue(secondssince+120, '69.7') sen2.bufferValue(secondssince+120, '79.7') sen1.bufferValue(secondssince+180, '68.2') sen2.bufferValue(secondssince+180, '78.2') sen1.bufferValue(secondssince+240, '65.1') sen2.bufferValue(secondssince+240, '75.1') sen1.bufferValue(secondssince+300, '64.5') sen2.bufferValue(secondssince+300, '74.5') sen1.bufferValue(secondssince+360, '62.9') sen2.bufferValue(secondssince+360, '72.9') sen1.bufferValue(secondssince+420, '60.7') sen2.bufferValue(secondssince+420, '70.7') sen1.bufferValue(secondssince+480, '61.2') sen2.bufferValue(secondssince+480, '71.2') sen1.bufferValue(secondssince+540, '61.9') sen2.bufferValue(secondssince+540, '71.9') sen1.bufferValue(secondssince+600, '62.7') sen2.bufferValue(secondssince+600, '72.7') sen1.bufferValue(secondssince+660, '63.4') sen2.bufferValue(secondssince+660, '73.4') sen1.bufferValue(secondssince+720, '65.1') sen2.bufferValue(secondssince+720, '75.1') sen1.bufferValue(secondssince+780, '66.7') sen2.bufferValue(secondssince+780, '76.7') sen1.bufferValue(secondssince+840, '68.2') sen2.bufferValue(secondssince+840, '78.2') sen1.bufferValue(secondssince+900, '70.4') sen2.bufferValue(secondssince+900, '80.4') sen1.update(debug=False) sen2.update(debug=False) # GRAPH IT from pyrrd.graph import DEF, CDEF, VDEF, LINE, AREA, GPRINT, COMMENT # SENSOR 1 GRAPH: sen1_def1 = DEF(rrdfile=sen1_file, vname='Sen1data', dsName='Sensor1', cdef='LAST') sen1_line = LINE(defObj=sen1_def1, color='#00FF00', legend='Sensor 1') sen1_aver = VDEF(vname='Sens1aver', rpn='%s,AVERAGE' % sen1_def1.vname) sen1aver_line = LINE(defObj=sen1_aver, color='#0000FF', legend='Sensor 1 Average') # SENSOR 2 GRAPH: sen2_def1 = DEF(rrdfile=sen2_file, vname='Sensor_2', dsName='Sensor2', cdef='LAST') sen2_line = LINE(defObj=sen2_def1, color='#FF0000', legend='Sensor 2') sen2_aver = VDEF(vname='Sens2aver', rpn='%s,AVERAGE' % sen2_def1.vname) sen2aver_line = LINE(defObj=sen2_aver, color='#FFFF00', legend='Sensor 2 Average') # GPTINTS AND COMMENTS cmt = COMMENT('\tRun Date\: September 2, 2013') sen1aver_val = GPRINT(sen1_aver, 'Sensor 1 Average Temperature: %6.2lf Degrees F') sen2aver_val = GPRINT(sen2_aver, 'Sensor 2 Average Temperature: %6.2lf Degrees F') # DEFINE SOME COLORS from pyrrd.graph import ColorAttributes ca = ColorAttributes() ca.back = '#000000' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#0000AA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' # NOW LET'S GRAPH IT from pyrrd.graph import Graph graphfile = "/home/pi/Documents/PythonProjects/RRDtool/DataFiles/PhonyTemp.png" g = Graph(graphfile, start = secondssince-60, end = secondssince+900, color = ca, vertical_label='Degrees/ F', width=600, height=400, title='Temperature/ Readings') g.data.extend([sen1_def1, sen1_line, sen1_aver, sen1aver_line]) g.data.extend([sen2_def1, sen2_line, sen2_aver, sen2aver_line]) g.data.extend([sen1aver_val, sen2aver_val, cmt]) g.write()