aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--schema.sql8
-rw-r--r--sensor.py64
-rw-r--r--static/style.css18
-rw-r--r--templates/layout.html17
-rw-r--r--templates/show_entries.html23
5 files changed, 130 insertions, 0 deletions
diff --git a/schema.sql b/schema.sql
new file mode 100644
index 0000000..7652fe8
--- /dev/null
+++ b/schema.sql
@@ -0,0 +1,8 @@
+drop table if exists weather;
+create table weather (
+ id integer primary key autoincrement,
+ date timestamp,
+ temperature float,
+ humidity float,
+ pressure float
+);
diff --git a/sensor.py b/sensor.py
new file mode 100644
index 0000000..a0123d0
--- /dev/null
+++ b/sensor.py
@@ -0,0 +1,64 @@
+# imports
+import sqlite3
+from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash
+from contextlib import closing
+from datetime import datetime
+
+# configuration
+DATABASE = '/tmp/sensors.db'
+DEBUG = True
+SECRET_KEY = 'development key'
+
+# app creation
+app = Flask(__name__)
+app.config.from_object(__name__)
+# To read from settings file, set SENSOR_SETTINGS in envvar
+#app.config.from_envvar('SENSOR_SETTINGS', slient=True)
+
+# initialize database
+def init_db():
+ with closing(connect_db()) as db:
+ with app.open_resource('schema.sql', mode='r') as f:
+ db.cursor().executescript(f.read())
+ db.commit()
+
+# connect to database
+def connect_db():
+ return sqlite3.connect(app.config['DATABASE'])
+
+# handle requests
+@app.before_request
+def before_request():
+ g.db = connect_db()
+
+@app.teardown_request
+def teardown_request(exception):
+ db = getattr(g, 'bd', None)
+ if db is not None:
+ db.close()
+
+# viewing database
+@app.route('/')
+def show_entries():
+ cur = g.db.execute('SELECT date, temperature, humidity, pressure FROM weather ORDER BY id desc')
+ entries = [dict(date=row[0], temperature=row[1], humidity=row[2], pressure=row[3]) for row in cur.fetchall()]
+ return render_template('show_entries.html', weather=entries)
+
+# adding entries to database
+@app.route('/data', methods=['POST'])
+def add_data():
+ mkey = request.args.get('key')
+ if mkey != SECRET_KEY:
+ abort(401)
+ temp = request.args.get('temp')
+ humidity = request.args.get('humidity')
+ pressure = request.args.get('pressure')
+ now = datetime.now()
+ g.db.execute('INSERT INTO weather (date, temperature, humidity, pressure) VALUES (?, ?, ?, ?)', \
+ [now, temp, humidity, pressure])
+ g.db.commit()
+ return 200
+
+
+if __name__ == '__main__':
+ app.run()
diff --git a/static/style.css b/static/style.css
new file mode 100644
index 0000000..da1cb34
--- /dev/null
+++ b/static/style.css
@@ -0,0 +1,18 @@
+body { font-family: sans-serif; background: #eee; }
+a, h1, h2 { color: #377ba8; }
+h1, h2 { font-family: 'Georgia', serif; margin: 0; }
+h1 { border-bottom: 2px solid #eee; }
+h2 { font-size: 1.2em; }
+
+.page { margin: 2em auto; width: 35em; border: 5px solid #ccc;
+ padding: 0.8em; background: white; }
+.weather { list-style: none; margin: 0; padding: 0; }
+.weather li { margin: 0.8em 1.2em; }
+.weather li h2 { margin-left: -1em; }
+.add-entry { font-size: 0.9em; border-bottom: 1px solid #ccc; }
+.add-entry dl { font-weight: bold; }
+.metanav { text-align: right; font-size: 0.8em; padding: 0.3em;
+ margin-bottom: 1em; background: #fafafa; }
+.flash { background: #cee5F5; padding: 0.5em;
+ border: 1px solid #aacbe2; }
+.error { background: #f0d6d6; padding: 0.5em; }
diff --git a/templates/layout.html b/templates/layout.html
new file mode 100644
index 0000000..0f32195
--- /dev/null
+++ b/templates/layout.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<title>Weather</title>
+<link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">
+<div class=page>
+ <h1>Weather</h1>
+ <div class=metanav>
+ {% if not session.logged_in %}
+ <a href="{{ url_for('login') }}">log in</a>
+ {% else %}
+ <a href="{{ url_for('logout') }}">log out</a>
+ {% endif %}
+ </div>
+ {% for message in get_flashed_messages() %}
+ <div class=flash>{{ message }}</div>
+ {% endfor %}
+ {% block body %}{% endblock %}
+</div>
diff --git a/templates/show_entries.html b/templates/show_entries.html
new file mode 100644
index 0000000..5d9ff1a
--- /dev/null
+++ b/templates/show_entries.html
@@ -0,0 +1,23 @@
+{% extends "layout.html" %}
+{% block body %}
+ {% if session.logged_in %}
+ <form action="{{ url_for('add_entry') }}" method=post class=add-entry>
+ <dl>
+ <dt>Temperature:
+ <dd><input type=number size=30 name=temperature>
+ <dt>Humidity:
+ <dd><input type=number size=30 name=humidity>
+ <dt>Pressure:
+ <dd><input type=number size=30 name=pressure>
+ <dd><input type=submit value=Submit>
+ </dl>
+ </form>
+ {% endif %}
+ <ul class=weather>
+ {% for entry in weather %}
+ <li><h2>{{ entry.date }}</h2>Temp: {{ entry.temperature }}, Humidity: {{ entry.humidity }}, Pressure: {{ entry.pressure }}
+ {% else %}
+ <li><em>No entries here so far</em>
+ {% endfor %}
+ </ul>
+{% endblock %}