Created
April 6, 2015 04:08
-
-
Save chrowe/905a53060ec08882a9bb to your computer and use it in GitHub Desktop.
1 Wire scripts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import sqlite3 | |
import os | |
import time | |
import glob | |
# global variables | |
speriod=(15*60)-1 | |
dbname='/var/www/templog.db' | |
# store the temperature in the database | |
def log_temperature(temp): | |
conn=sqlite3.connect(dbname) | |
curs=conn.cursor() | |
curs.execute("INSERT INTO temps values(datetime('now', 'localtime'), (?))", (temp,)) | |
# commit the changes | |
conn.commit() | |
conn.close() | |
# display the contents of the database | |
def display_data(): | |
conn=sqlite3.connect(dbname) | |
curs=conn.cursor() | |
for row in curs.execute("SELECT * FROM temps"): | |
print str(row[0])+" "+str(row[1]) | |
conn.close() | |
# get temerature | |
# returns None on error, or the temperature as a float | |
def get_temp(devicefile): | |
try: | |
fileobj = open(devicefile,'r') | |
lines = fileobj.readlines() | |
fileobj.close() | |
except: | |
return None | |
# get the status from the end of line 1 | |
status = lines[0][-4:-1] | |
# is the status is ok, get the temperature from line 2 | |
if status=="YES": | |
print status | |
tempstr= lines[1][-6:-1] | |
tempvalue=float(tempstr)/1000 * 1.8 + 32 | |
print tempvalue | |
return tempvalue | |
else: | |
print "There was an error." | |
return None | |
# main function | |
# This is where the program starts | |
def main(): | |
# enable kernel modules | |
os.system('sudo modprobe w1-gpio') | |
os.system('sudo modprobe w1-therm') | |
# search for a device file that starts with 28 | |
devicelist = glob.glob('/sys/bus/w1/devices/28*') | |
if devicelist=='': | |
return None | |
else: | |
# append /w1slave to the device file | |
w1devicefile = devicelist[0] + '/w1_slave' | |
# while True: | |
# get the temperature from the device file | |
temperature = get_temp(w1devicefile) | |
if temperature != None: | |
print "temperature="+str(temperature) | |
else: | |
# Sometimes reads fail on the first attempt | |
# so we need to retry | |
temperature = get_temp(w1devicefile) | |
print "temperature="+str(temperature) | |
# Store the temperature in the database | |
log_temperature(temperature) | |
# display the contents of the database | |
# display_data() | |
# time.sleep(speriod) | |
if __name__=="__main__": | |
main() | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import sqlite3 | |
import sys | |
import cgi | |
import cgitb | |
# global variables | |
speriod=(15*60)-1 | |
dbname='/var/www/templog.db' | |
# print the HTTP header | |
def printHTTPheader(): | |
print "Content-type: text/html\n\n" | |
# print the HTML head section | |
# arguments are the page title and the table for the chart | |
def printHTMLHead(title, table): | |
print "<head>" | |
print " <title>" | |
print title | |
print " </title>" | |
print_graph_script(table) | |
print "</head>" | |
# get data from the database | |
# if an interval is passed, | |
# return a list of records from the database | |
def get_data(interval): | |
conn=sqlite3.connect(dbname) | |
curs=conn.cursor() | |
if interval == None: | |
curs.execute("SELECT * FROM temps") | |
else: | |
curs.execute("SELECT * FROM temps WHERE timestamp>datetime('now','-%s hours')" % interval) | |
# curs.execute("SELECT * FROM temps WHERE timestamp>datetime('2013-09-19 21:30:02','-%s hours') AND timestamp<=datetime('2013-09-19 21:31:02')" % interval) | |
rows=curs.fetchall() | |
conn.close() | |
return rows | |
# convert rows from database into a javascript table | |
def create_table(rows): | |
chart_table="" | |
for row in rows[:-1]: | |
rowstr="['{0}', {1}],\n".format(str(row[0]),str(row[1])) | |
chart_table+=rowstr | |
row=rows[-1] | |
rowstr="['{0}', {1}]\n".format(str(row[0]),str(row[1])) | |
chart_table+=rowstr | |
return chart_table | |
# print the javascript to generate the chart | |
# pass the table generated from the database info | |
def print_graph_script(table): | |
# google chart snippet | |
chart_code=""" | |
<script type="text/javascript" src="https://www.google.com/jsapi"></script> | |
<script type="text/javascript"> | |
google.load("visualization", "1", {packages:["corechart"]}); | |
google.setOnLoadCallback(drawChart); | |
function drawChart() { | |
var data = google.visualization.arrayToDataTable([ | |
['Time', 'Temperature'], | |
%s | |
]); | |
var options = { | |
title: 'Temperature' | |
}; | |
var chart = new google.visualization.LineChart(document.getElementById('chart_div')); | |
chart.draw(data, options); | |
} | |
</script>""" | |
print chart_code % (table) | |
# print the div that contains the graph | |
def show_graph(): | |
print "<h2>Temperature Chart</h2>" | |
print '<div id="chart_div" style="width: 900px; height: 500px;"></div>' | |
# connect to the db and show some stats | |
# argument option is the number of hours | |
def show_stats(option): | |
conn=sqlite3.connect(dbname) | |
curs=conn.cursor() | |
if option is None: | |
option = str(24) | |
curs.execute("SELECT timestamp,max(temp) FROM temps WHERE timestamp>datetime('now','-%s hour') AND timestamp<=datetime('now')" % option) | |
# curs.execute("SELECT timestamp,max(temp) FROM temps WHERE timestamp>datetime('2013-09-19 21:30:02','-%s hour') AND timestamp<=datetime('2013-09-19 21:31:02')" % option) | |
rowmax=curs.fetchone() | |
rowstrmax="{0}   {1}F".format(str(rowmax[0]),str(rowmax[1])) | |
curs.execute("SELECT timestamp,min(temp) FROM temps WHERE timestamp>datetime('now','-%s hour') AND timestamp<=datetime('now')" % option) | |
# curs.execute("SELECT timestamp,min(temp) FROM temps WHERE timestamp>datetime('2013-09-19 21:30:02','-%s hour') AND timestamp<=datetime('2013-09-19 21:31:02')" % option) | |
rowmin=curs.fetchone() | |
rowstrmin="{0}   {1}F".format(str(rowmin[0]),str(rowmin[1])) | |
curs.execute("SELECT avg(temp) FROM temps WHERE timestamp>datetime('now','-%s hour') AND timestamp<=datetime('now')" % option) | |
# curs.execute("SELECT avg(temp) FROM temps WHERE timestamp>datetime('2013-09-19 21:30:02','-%s hour') AND timestamp<=datetime('2013-09-19 21:31:02')" % option) | |
rowavg=curs.fetchone() | |
print "<hr>" | |
print "<h2>Minumum temperature </h2>" | |
print rowstrmin | |
print "<h2>Maximum temperature</h2>" | |
print rowstrmax | |
print "<h2>Average temperature</h2>" | |
print "%.3f" % rowavg+"F" | |
print "<hr>" | |
print "<h2>In the last hour:</h2>" | |
print "<table>" | |
print "<tr><td><strong>Date/Time</strong></td><td><strong>Temperature</strong></td></tr>" | |
rows=curs.execute("SELECT * FROM temps WHERE timestamp>datetime('new','-1 hour') AND timestamp<=datetime('new')") | |
# rows=curs.execute("SELECT * FROM temps WHERE timestamp>datetime('2013-09-19 21:30:02','-1 hour') AND timestamp<=datetime('2013-09-19 21:31:02')") | |
for row in rows: | |
rowstr="<tr><td>{0}  </td><td>{1}C</td></tr>".format(str(row[0]),str(row[1])) | |
print rowstr | |
print "</table>" | |
print "<hr>" | |
conn.close() | |
def print_time_selector(option): | |
print """<form action="/cgi-bin/webgui.py" method="POST"> | |
Show the temperature logs for | |
<select name="timeinterval">""" | |
if option is not None: | |
if option == "6": | |
print "<option value=\"6\" selected=\"selected\">the last 6 hours</option>" | |
else: | |
print "<option value=\"6\">the last 6 hours</option>" | |
if option == "12": | |
print "<option value=\"12\" selected=\"selected\">the last 12 hours</option>" | |
else: | |
print "<option value=\"12\">the last 12 hours</option>" | |
if option == "24": | |
print "<option value=\"24\" selected=\"selected\">the last 24 hours</option>" | |
else: | |
print "<option value=\"24\">the last 24 hours</option>" | |
else: | |
print """<option value="6">the last 6 hours</option> | |
<option value="12">the last 12 hours</option> | |
<option value="24" selected="selected">the last 24 hours</option>""" | |
print """ </select> | |
<input type="submit" value="Display"> | |
</form>""" | |
# check that the option is valid | |
# and not an SQL injection | |
def validate_input(option_str): | |
# check that the option string represents a number | |
if option_str.isalnum(): | |
# check that the option is within a specific range | |
if int(option_str) > 0 and int(option_str) <= 24: | |
return option_str | |
else: | |
return None | |
else: | |
return None | |
#return the option passed to the script | |
def get_option(): | |
form=cgi.FieldStorage() | |
if "timeinterval" in form: | |
option = form["timeinterval"].value | |
return validate_input (option) | |
else: | |
return None | |
# main function | |
# This is where the program starts | |
def main(): | |
cgitb.enable() | |
# get options that may have been passed to this script | |
option=get_option() | |
if option is None: | |
option = str(24) | |
# get data from the database | |
records=get_data(option) | |
# print the HTTP header | |
printHTTPheader() | |
if len(records) != 0: | |
# convert the data into a table | |
table=create_table(records) | |
else: | |
print "No data found" | |
return | |
# start printing the page | |
print "<html>" | |
# print the head section including the table | |
# used by the javascript for the chart | |
printHTMLHead("Raspberry Pi Temperature Logger", table) | |
# print the page body | |
print "<body>" | |
print "<h1>Raspberry Pi Temperature Logger</h1>" | |
print "<hr>" | |
print_time_selector(option) | |
show_graph() | |
show_stats(option) | |
print "</body>" | |
print "</html>" | |
sys.stdout.flush() | |
if __name__=="__main__": | |
main() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
SQLite
Web dashboard
http://192.168.1.118/cgi-bin/webgui.py
http://192.168.1.118/cgi-bin/webgui2.py
Scripts
pi1:/usr/lib/cgi-bin/monitor.py
pi1:/usr/lib/cgi-bin/webgui.py
Tutorial followed
http://raspberrywebserver.com/cgiscripting/rpi-temperature-logger/