Add /api/<version>/sensor/<sensor_id>.
[chrisu/seepark.git] / web / seepark_web.py
1 from random import uniform
2 import datetime
3 import time
4 import configparser
5 import os
6 from flask import Flask, render_template, jsonify
7 import flask.json
8 from sqlalchemy import create_engine
9
10
11 class JSONEncoder(flask.json.JSONEncoder):
12     def default(self, object):
13         if isinstance(object, datetime.datetime):
14             return object.isoformat()
15         return super().default(object)
16
17
18 app = Flask(__name__)
19 app.json_encoder = JSONEncoder
20 config = configparser.ConfigParser()
21 config.read(os.environ['SEEPARKINI'])
22 apikey = config.get('openweathermap', 'apikey')
23
24
25 def open_engine(config):
26     user = config.get('database', 'user')
27     pwd = config.get('database', 'password')
28     host = config.get('database', 'hostname')
29     db = config.get('database', 'database')
30     engine = create_engine('mysql+mysqldb://{}:{}@{}/{}'.format(user, pwd, host, db), echo=False)
31     return engine
32
33
34 @app.route('/api/<version>/sensors/')
35 def sensors(version):
36     """List all sensors found in the database"""
37     engine = open_engine(config)
38     with engine.connect() as conn:
39         cursor = conn.execute('select distinct sensor_id, sensor_name, value_type from sensors')
40         result = [dict(row) for row in cursor]
41         return jsonify(result)
42
43
44 @app.route('/api/<version>/sensor/<sensor_id>')
45 def sensor(version, sensor_id):
46     """Return all sensor data"""
47     engine = open_engine(config)
48     with engine.connect() as conn:
49         cursor = conn.execute('select * from sensors where sensor_id=%s order by id', sensor_id)
50         result = [dict(row) for row in cursor]
51         return jsonify(result)
52
53
54 @app.route('/data/', defaults={'timespan': 1})
55 @app.route("/data/<int:timespan>", methods=['GET'])
56 def data(timespan):
57     granularity = 5 * timespan               # (every) minute(s) per day
58     samples = 60/granularity * 24 * timespan # per hour over whole timespan
59     s4m   = []
60     s4m_x = []
61     s5m   = []
62     s5m_x = []
63     end   = time.time()
64     start = end - samples * granularity * 60
65
66     for i in range(int(samples)):
67         s4m.append(uniform(-10,30))
68         s5m.append(uniform(-10,30))
69         s4mt = uniform(start, end)
70         s5mt = uniform(start, end)
71         s4m_x.append(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(s4mt)))
72         s5m_x.append(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(s5mt)))
73
74     data = {
75         '0316a2193bff':   s4m,
76         '0316a2193bff_x': s4m_x,
77         '0316a21383ff':   s5m,
78         '0316a21383ff_x': s5m_x,
79         }
80
81     return jsonify(data)
82
83
84 @app.route("/")
85 def index():
86     return render_template('seepark_web.html', apikey=apikey)
87