mirror of
https://github.com/bbilly1/aqi_monitor.git
synced 2024-08-02 16:03:33 +00:00
115 lines
3.3 KiB
Python
115 lines
3.3 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.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)
|
|
|
|
# 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.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
|