aqi_monitor/backend/flask/app/views.py

125 lines
3.7 KiB
Python

import configparser
import json
from flask import request
from flask_httpauth import HTTPBasicAuth
from apscheduler.schedulers.background import BackgroundScheduler
from app import app
from app import aqi_parser
from app import weather
from app import graph
from app import graph_pm
from app import table_export
from app import graph_monthly
from app.db_connect import db_insert
def get_config():
""" read out config file """
# parse
config_parser = configparser.ConfigParser()
config_parser.read('config')
# build dict
config = {}
config["authUsername"] = config_parser.get('aqi_monitor', "authUsername")
config["authPassword"] = config_parser.get('aqi_monitor', "authPassword")
config["api_key"] = config_parser.get('openweathermap', "api_key")
config["lat"] = config_parser.get('openweathermap', "lat")
config["lon"] = config_parser.get('openweathermap', "lon")
# db
config["db_host"] = config_parser.get('postgres', "db_host")
config["db_database"] = config_parser.get('postgres', "db_database")
config["db_user"] = config_parser.get('postgres', "db_user")
config["db_password"] = config_parser.get('postgres', "db_password")
return config
# start up
auth = HTTPBasicAuth()
config = get_config()
weather.handle_weather(config)
graph.create_current(config)
graph_pm.rebuild_pm_bar(config)
graph.rebuild_3days(config)
graph.rebuild_7days(config)
graph_pm.rebuild_hour_bar(config)
table_export.rebuild_table(config)
graph_monthly.create_monthly(config)
# build username / pw dict for basic auth
USER_DATA = {}
USER_DATA[config['authUsername']] = config['authPassword']
# start scheduler
scheduler = BackgroundScheduler()
scheduler.add_job(
weather.handle_weather, args=[config], trigger="interval", name='weather_api', seconds=900
)
scheduler.add_job(
graph.create_current, args=[config], trigger="cron", minute='*/5', name='current_graph'
)
scheduler.add_job(
graph.rebuild_3days, args=[config], trigger="cron", day='*', hour='1', minute='1', name='3_days'
)
scheduler.add_job(
graph.rebuild_7days, args=[config], trigger="cron", day='*', hour='1', minute='2', name='7_days'
)
scheduler.add_job(
graph_pm.rebuild_pm_bar, args=[config], trigger="cron", day='*', hour='1', minute='3', name='pm_bar'
)
scheduler.add_job(
graph_pm.rebuild_hour_bar, args=[config], trigger="cron", day='*', hour='1', minute='4', name='hour_bar'
)
scheduler.add_job(
table_export.rebuild_table, args=[config], trigger="cron", day='*', hour='1', minute='6', name='rebuild_table'
)
scheduler.add_job(
graph_monthly.create_monthly, args=[config], trigger="cron", day='*', hour='1', minute='7', name='create_monthly'
)
scheduler.start()
@auth.verify_password
def verify(username, password):
if not (username and password):
return False
return USER_DATA.get(username) == password
# ingest
@app.route('/ingest', methods=['POST'])
@auth.login_required
def ingest():
data = request.json
if data:
# populate data dict
json_dict, error_found = aqi_parser.input_process(data)
if error_found:
print('pm25 read failed')
print(json_dict)
else:
# save to db
time_stamp = db_insert(config, json_dict)
print(f'db insert done at {time_stamp}')
# save to webserver
data = json.dumps(json_dict)
with open('dyn/air.json', 'w') as f:
f.write(data)
print(data)
return 'ingest'
# output
@app.route('/')
def home():
try:
with open('dyn/air.json', 'r') as f:
data = f.read()
except FileNotFoundError:
# will get regeneratod on next run
data = '{}'
return data