🎉 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:
112
backend/app.py
112
backend/app.py
@@ -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.
|
||||
|
Reference in New Issue
Block a user