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/') @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)