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