#!/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()