89 lines
2.9 KiB
Python
89 lines
2.9 KiB
Python
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/<room_name>')
|
|
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) |