🎉 Improved database structure with new files 'myp.db-shm' and 'myp.db-wal', updated documentation to 'STECKDOSENSCHALTZEITEN.md'. Also, refactored logs for better organization. 📝🔍📈

This commit is contained in:
2025-06-02 14:47:37 +02:00
parent 7ee6ce5cae
commit 7bea427bd6
47 changed files with 3194 additions and 598 deletions

View File

@@ -8369,12 +8369,12 @@ def refresh_dashboard():
# ===== STECKDOSEN-MONITORING API-ROUTEN =====
@app.route("/api/admin/plug-monitoring/logs", methods=['GET'])
@app.route("/api/admin/plug-schedules/logs", methods=['GET'])
@login_required
@admin_required
def api_admin_plug_monitoring_logs():
def api_admin_plug_schedules_logs():
"""
API-Endpoint für Steckdosen-Monitoring-Logs.
API-Endpoint für Steckdosenschaltzeiten-Logs.
Unterstützt Filterung nach Drucker, Zeitraum und Status.
"""
try:
@@ -8459,12 +8459,12 @@ def api_admin_plug_monitoring_logs():
"details": str(e) if current_user.is_admin else None
}), 500
@app.route("/api/admin/plug-monitoring/statistics", methods=['GET'])
@app.route("/api/admin/plug-schedules/statistics", methods=['GET'])
@login_required
@admin_required
def api_admin_plug_monitoring_statistics():
def api_admin_plug_schedules_statistics():
"""
API-Endpoint für Steckdosen-Monitoring-Statistiken.
API-Endpoint für Steckdosenschaltzeiten-Statistiken.
"""
try:
hours = request.args.get('hours', default=24, type=int)
@@ -8511,12 +8511,12 @@ def api_admin_plug_monitoring_statistics():
"details": str(e) if current_user.is_admin else None
}), 500
@app.route("/api/admin/plug-monitoring/cleanup", methods=['POST'])
@app.route("/api/admin/plug-schedules/cleanup", methods=['POST'])
@login_required
@admin_required
def api_admin_plug_monitoring_cleanup():
def api_admin_plug_schedules_cleanup():
"""
API-Endpoint zum Bereinigen alter Steckdosen-Logs.
API-Endpoint zum Bereinigen alter Steckdosenschaltzeiten-Logs.
"""
try:
data = request.get_json() or {}
@@ -8530,7 +8530,7 @@ def api_admin_plug_monitoring_cleanup():
SystemLog.log_system_event(
level="INFO",
message=f"Steckdosen-Logs bereinigt: {deleted_count} Einträge gelöscht (älter als {days} Tage)",
module="admin_plug_monitoring",
module="admin_plug_schedules",
user_id=current_user.id
)
@@ -8551,6 +8551,98 @@ def api_admin_plug_monitoring_cleanup():
"details": str(e) if current_user.is_admin else None
}), 500
@app.route("/api/admin/plug-schedules/calendar", methods=['GET'])
@login_required
@admin_required
def api_admin_plug_schedules_calendar():
"""
API-Endpoint für Kalender-Daten der Steckdosenschaltzeiten.
Liefert Events für FullCalendar im JSON-Format.
"""
try:
# Parameter aus Request
start_date = request.args.get('start')
end_date = request.args.get('end')
printer_id = request.args.get('printer_id', type=int)
if not start_date or not end_date:
return jsonify([]) # Leere Events bei fehlenden Daten
# Datum-Strings zu datetime konvertieren
start_dt = datetime.fromisoformat(start_date.replace('Z', '+00:00'))
end_dt = datetime.fromisoformat(end_date.replace('Z', '+00:00'))
db_session = get_db_session()
try:
# Query für Logs im Zeitraum
query = db_session.query(PlugStatusLog)\
.filter(PlugStatusLog.timestamp >= start_dt)\
.filter(PlugStatusLog.timestamp <= end_dt)\
.join(Printer)
# Drucker-Filter
if printer_id:
query = query.filter(PlugStatusLog.printer_id == printer_id)
# Logs abrufen und nach Drucker gruppieren
logs = query.order_by(PlugStatusLog.timestamp.asc()).all()
# Events für FullCalendar formatieren
events = []
for log in logs:
# Farbe und Titel basierend auf Status
if log.status == 'on':
color = '#10b981' # Grün
title = f"🟢 {log.printer.name}: EIN"
elif log.status == 'off':
color = '#f59e0b' # Orange
title = f"🔴 {log.printer.name}: AUS"
elif log.status == 'connected':
color = '#3b82f6' # Blau
title = f"🔌 {log.printer.name}: Verbunden"
elif log.status == 'disconnected':
color = '#ef4444' # Rot
title = f"{log.printer.name}: Getrennt"
else:
color = '#6b7280' # Grau
title = f"{log.printer.name}: {log.status}"
# Event-Objekt für FullCalendar
event = {
'id': f"plug_{log.id}",
'title': title,
'start': log.timestamp.isoformat(),
'backgroundColor': color,
'borderColor': color,
'textColor': '#ffffff',
'allDay': False,
'extendedProps': {
'printer_id': log.printer_id,
'printer_name': log.printer.name,
'status': log.status,
'source': log.source,
'user_id': log.user_id,
'user_name': log.user.name if log.user else None,
'notes': log.notes,
'response_time_ms': log.response_time_ms,
'error_message': log.error_message,
'power_consumption': log.power_consumption,
'voltage': log.voltage,
'current': log.current
}
}
events.append(event)
return jsonify(events)
finally:
db_session.close()
except Exception as e:
app_logger.error(f"Fehler beim Abrufen der Kalender-Daten: {str(e)}")
return jsonify([]), 500
def get_relative_time(timestamp):
"""
Hilfsfunktion für relative Zeitangaben.