from db_connect import DatabaseConnect from flask import Flask, abort, session from jinja2 import FileSystemLoader, Template import plotly.express as px from plotly.subplots import make_subplots import plotly.graph_objects as go import logging from os import sep import datetime import templating app = Flask(__name__) db = DatabaseConnect() Flask.jinja_options["loader"] = FileSystemLoader("web") env = app.create_jinja_environment() DISPLAYEDTYPES = 2 TDLATE = datetime.timedelta(hours=8) # before and after TYPEUNITS = [ "°C", "%" ] @app.route("/") def index(): # no user handling yet so we get user of ID 1 (not logged in) active_user = 1 #populate userinfo user_info = templating.UserInfo(id=active_user, name=db.username_from_id(active_user)[0]) rooms_info = [] for room in db.view_valid_rooms(active_user): sensor_info = [] sensors_avail = db.get_sensors_in_room_id(room[2]) for i in range(DISPLAYEDTYPES): sensors_with_type = [x for x in sensors_avail if x[1] == i] # TODO: handle more than one sensor in one room if sensors_with_type: reading = db.get_sensorsinfo_by_sensorid(sensors_with_type[0][0]) if reading is None: sensor_info.append(templating.SensorInfo(2,None, None, "")) continue reading = templating.SensorInfo(1 if reading.timestamp + TDLATE < datetime.datetime.now() else 0, reading.type, reading.timestamp, f"{reading.reading}{TYPEUNITS[i]}") sensor_info.append(reading) else: sensor_info.append(templating.SensorInfo(2,None, None, "")) rooms_info.append(templating.RoomInfo(room[0], room[1], sensor_info)) out_html = templating.LandingPage(env, user_info,rooms_info) return out_html.render() @app.route('/room/') def room_page(room_name=None): if not db.user_has_room_perms(1,room_name): abort(403) sensor_list = db.get_sensors_in_room_shortname(room_name) fig = make_subplots(rows=1, cols=len(sensor_list)) for idx, sensorID in enumerate(sensor_list): lst = [x for x in db.get_sensor_data(sensorID)] fig.add_trace( go.Scatter( x = [x[0] for x in lst], y = [x[1] for x in lst], name=db.get_sensor_type(sensorID)), row = 1, col = idx + 1 ) fig.update_layout(title_text=f"Available Devices in room {room_name}:") template_path = f'web{sep}room_template.html' px_jinja_data = {"fig":fig.to_html(full_html=False)} with open(template_path,'r') as template_file: j2_template = Template(template_file.read()) return j2_template.render(px_jinja_data) if __name__ == "__main__": app.run(debug=True)