from random import uniform import datetime import time import configparser import os from flask import Flask, render_template, jsonify, request import flask.json from sqlalchemy import create_engine class JSONEncoder(flask.json.JSONEncoder): def default(self, object): if isinstance(object, datetime.datetime): return object.isoformat() return super().default(object) def parse_datetime(date_str): return datetime.datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%S') app = Flask(__name__) app.json_encoder = JSONEncoder config = configparser.ConfigParser() config.read(os.environ['SEEPARKINI']) apikey = config.get('openweathermap', 'apikey') def open_engine(config): user = config.get('database', 'user') pwd = config.get('database', 'password') host = config.get('database', 'hostname') db = config.get('database', 'database') engine = create_engine('mysql+mysqldb://{}:{}@{}/{}'.format(user, pwd, host, db), echo=False) return engine @app.route('/api//sensors/') def sensors(version): """List all sensors found in the database""" engine = open_engine(config) with engine.connect() as conn: cursor = conn.execute('select distinct sensor_id, sensor_name, value_type from sensors') result = [dict(row) for row in cursor] return jsonify(result) @app.route('/api//sensor/') def sensor(version, sensor_id): """Return all sensor data URL parameters: begin=, optional, format like "2018-05-19T21:07:53" end=, optional, format like "2018-05-19T21:07:53" """ engine = open_engine(config) with engine.connect() as conn: where = ['sensor_id=%s'] sql_args = [sensor_id] if 'begin' in request.args: where.append('timestamp>=%s') sql_args.append(request.args.get('begin', None, parse_datetime)) if 'end' in request.args: where.append('timestamp<=%s') sql_args.append(request.args.get('end', None, parse_datetime)) sql = 'select * from sensors where {} order by id'.format(' and '.join(where)) cursor = conn.execute(sql, *sql_args) result = [dict(row) for row in cursor] return jsonify(result) @app.route('/data/', defaults={'timespan': 1}) @app.route("/data/", methods=['GET']) def data(timespan): granularity = 5 * timespan # (every) minute(s) per day samples = 60/granularity * 24 * timespan # per hour over whole timespan s4m = [] s4m_x = [] s5m = [] s5m_x = [] end = time.time() start = end - samples * granularity * 60 for i in range(int(samples)): s4m.append(uniform(-10,30)) s5m.append(uniform(-10,30)) s4mt = uniform(start, end) s5mt = uniform(start, end) s4m_x.append(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(s4mt))) s5m_x.append(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(s5mt))) data = { '0316a2193bff': s4m, '0316a2193bff_x': s4m_x, '0316a21383ff': s5m, '0316a21383ff_x': s5m_x, } return jsonify(data) @app.route("/") def index(): return render_template('seepark_web.html', apikey=apikey)