Initial commit

This commit is contained in:
Kristof committed 2026-10-14 12:29:29 +02:00
commit 536ff43ce4
158 files changed
+30355

No files matched your search

+125
View File
@@ -0,0 +1,125 @@
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)