125 lines
4.3 KiB
Python
125 lines
4.3 KiB
Python
from flask import Blueprint, render_template, redirect, url_for, flash, jsonify, request
|
|
from services.co2_service import CO2Scanner
|
|
from database import execute_query
|
|
from blueprints.auth import login_required
|
|
from rechten import recht_vereist
|
|
from tenancy import per_school
|
|
|
|
co2_sensor_bp = Blueprint('co2_sensor', __name__)
|
|
scanner = per_school(CO2Scanner) # één scanner per school
|
|
|
|
#----------------------------------------------
|
|
# Route voor het CO2 dashboard
|
|
#----------------------------------------------
|
|
|
|
@co2_sensor_bp.route('/dashboard')
|
|
@login_required
|
|
@recht_vereist('co2')
|
|
def dashboard():
|
|
# haalt de meest recente record voor elke ruimte
|
|
query = """
|
|
SELECT lk.Naam AS lokaal, m.ppm, m.Timestamp AS timestamp
|
|
FROM CO2_Metingen m
|
|
JOIN Lokalen lk ON lk.Lokaal_ID = m.Lokaal_ID
|
|
WHERE m.Meting_ID IN (SELECT MAX(Meting_ID) FROM CO2_Metingen GROUP BY Lokaal_ID)
|
|
ORDER BY lk.Naam ASC
|
|
"""
|
|
sensors = execute_query(query)
|
|
return render_template('CO2_sensor.html', sensors=sensors)
|
|
|
|
#---------------------------------------------
|
|
# Routes en Logica
|
|
#----------------------------------------------
|
|
# Verwijderd record ouder dan 7 dagen uit DB
|
|
def perform_cleanup():
|
|
"""Verwijder data ouder dan 7 dagen uit de database."""
|
|
query = "DELETE FROM CO2_Metingen WHERE Timestamp < NOW() - INTERVAL 7 DAY"
|
|
try:
|
|
execute_query(query, commit=True)
|
|
print("Database opruiming voltooid.")
|
|
except Exception as e:
|
|
print(f"Fout bij database opruiming: {e}")
|
|
|
|
|
|
# Toggleknop voor automatisch verwijderen
|
|
@co2_sensor_bp.route('/toggle_auto_delete', methods=['POST'])
|
|
@login_required
|
|
@recht_vereist('co2')
|
|
def toggle_auto_delete():
|
|
"""Schakelt het automatisch verwijderen van oude data aan/uit."""
|
|
data = request.get_json()
|
|
is_active = data.get('active', False)
|
|
|
|
# Hier kun je een variabele in de scanner of een config opslaan
|
|
# Voor nu simuleren we de status-bevestiging
|
|
scanner.auto_delete = is_active
|
|
|
|
if is_active:
|
|
perform_cleanup()
|
|
|
|
return jsonify({'active': scanner.auto_delete})
|
|
|
|
|
|
@co2_sensor_bp.route('/get_cleanup_status')
|
|
@login_required
|
|
@recht_vereist('co2')
|
|
def get_cleanup_status():
|
|
"""Geeft de huidige status van de auto-delete instelling terug."""
|
|
# Zorg dat 'auto_delete' bestaat in je CO2Scanner klasse of gebruik een globale
|
|
status = getattr(scanner, 'auto_delete', False)
|
|
return jsonify({'active': status})
|
|
|
|
|
|
# Eenmalige scan uitvoeren
|
|
@co2_sensor_bp.route('/scan')
|
|
@login_required
|
|
@recht_vereist('co2')
|
|
def scan_co2():
|
|
"""Trigger één handmatige scan-ronde."""
|
|
scanner.perform_scan()
|
|
flash("Handmatige scan voltooid.", "success")
|
|
return redirect(url_for('co2_sensor.dashboard'))
|
|
|
|
# Start herhalende scan
|
|
@co2_sensor_bp.route('/toggle_continuous_scan', methods=['POST'])
|
|
@login_required
|
|
@recht_vereist('co2')
|
|
def toggle_continuous_scan():
|
|
"""Schakelt de achtergrond-thread aan of uit via de website."""
|
|
data = request.get_json()
|
|
if data.get('active'):
|
|
scanner.start()
|
|
else:
|
|
scanner.stop()
|
|
return jsonify({'active': scanner.active})
|
|
|
|
@co2_sensor_bp.route('/get_scan_status')
|
|
@login_required
|
|
@recht_vereist('co2')
|
|
def get_scan_status():
|
|
"""Zorgt dat de switch in de HTML op de juiste stand staat bij laden."""
|
|
return jsonify({'active': scanner.active})
|
|
|
|
|
|
#-----------------------------------------------
|
|
# Opent grafiekvenster met 50 waarden
|
|
#-----------------------------------------------
|
|
@co2_sensor_bp.route('/grafiek/<lokaal>')
|
|
@login_required
|
|
@recht_vereist('co2')
|
|
def grafiek(lokaal):
|
|
# Haal de laatste 50 metingen op (oud → nieuw)
|
|
results = execute_query(
|
|
"SELECT ppm, timestamp FROM ("
|
|
" SELECT m.ppm, m.Timestamp AS timestamp FROM CO2_Metingen m "
|
|
" JOIN Lokalen lk ON lk.Lokaal_ID = m.Lokaal_ID WHERE lk.Naam = %s "
|
|
" ORDER BY m.Timestamp DESC LIMIT 50) x ORDER BY timestamp ASC",
|
|
(lokaal,)
|
|
)
|
|
|
|
# Split de data voor Chart.js
|
|
# We gebruiken ASC zodat de grafiek van links (oud) naar rechts (nieuw) loopt
|
|
labels = [row['timestamp'].strftime("%d-%m %H:%M:%S") if hasattr(row['timestamp'], 'strftime') else str(row['timestamp']) for row in results]
|
|
values = [row['ppm'] for row in results]
|
|
|
|
return render_template('grafiek.html', lokaal=lokaal, labels=labels, data=values) |