"feat: Enhanced error handling in COMMON_ERRORS.md and app.py"

This commit is contained in:
2025-05-26 12:56:10 +02:00
parent 4245f48caa
commit 2643ef1814
2 changed files with 71 additions and 39 deletions

View File

@@ -2,6 +2,70 @@
Dieses Dokument enthält häufig auftretende Fehler und deren Lösungen für das MYP-3D-Druck-Management-System.
## Drucker-Status-Check mit 7-Sekunden-Timeout
### Implementierung (2024-12-19)
**Problem:** Drucker-Status wurde nur basierend auf hardkodierten Konfigurationen bestimmt, ohne echte Netzwerk-Überprüfung.
**Lösung:** Implementierung eines echten Ping-basierten Status-Checks mit 7-Sekunden-Timeout:
#### Backend-Änderungen:
1. **Neue Funktionen in `app.py`:**
- `check_printer_status(ip_address, timeout=7)`: Überprüft einzelnen Drucker via Ping
- `check_multiple_printers_status(printers, timeout=7)`: Parallel-Check mehrerer Drucker
2. **Aktualisierte API-Endpunkte:**
- `/api/printers`: Verwendet jetzt echten Status-Check
- `/api/printers/status`: Spezieller Endpunkt für Status-Überprüfung
3. **Features:**
- 7-Sekunden-Timeout pro Drucker
- Parallel-Ausführung mit ThreadPoolExecutor
- Windows- und Unix-kompatible Ping-Befehle
- Detailliertes Logging der Status-Checks
- Automatische Datenbank-Aktualisierung
#### Frontend-Änderungen:
1. **Erweiterte Drucker-Seite (`templates/printers.html`):**
- Funktionsfähiger "Aktualisieren"-Button
- Loading-States mit Timeout-Information
- Status-Nachrichten mit Erfolgs-/Fehler-Feedback
- Zeitstempel der letzten Überprüfung
2. **Neue JavaScript-Funktionen:**
- `refreshPrinters()`: Vollständiger Status-Check mit UI-Feedback
- `loadPrintersWithStatusCheck()`: Erweiterte Lade-Funktion
- `showStatusMessage()`: Toast-Nachrichten für Benutzer-Feedback
- `formatTime()`: Relative Zeitanzeige für Status-Checks
#### Benutzer-Erfahrung:
- **Vor dem Update:** Drucker-Status basierte nur auf Konfiguration
- **Nach dem Update:**
- Echter Ping-Test mit 7-Sekunden-Timeout
- Visuelles Feedback während der Überprüfung
- Erfolgs-/Fehler-Nachrichten
- Zeitstempel der letzten Überprüfung
- Button-Deaktivierung während des Checks
#### Technische Details:
- **Timeout:** 7 Sekunden pro Drucker (konfigurierbar)
- **Parallel-Verarbeitung:** Bis zu 10 gleichzeitige Checks
- **Plattform-Unterstützung:** Windows (`ping -n 1 -w 7000`) und Unix (`ping -c 1 -W 7`)
- **Fehlerbehandlung:** Graceful Fallback auf "offline" bei Timeouts oder Fehlern
- **Logging:** Detaillierte Protokollierung aller Status-Checks
#### Konfiguration:
```python
# Timeout kann in den API-Aufrufen angepasst werden
status_results = check_multiple_printers_status(printer_data, timeout=7)
```
#### Fehlerbehebung:
1. **Timeout-Probleme:** Timeout kann in der Funktion angepasst werden
2. **Netzwerk-Probleme:** Logs in `logs/printers/printers.log` prüfen
3. **Performance:** Bei vielen Druckern ThreadPool-Größe anpassen
## Job-Scheduler und Steckdosensteuerung
### Steckdose kann nicht eingeschaltet werden

View File

@@ -718,57 +718,25 @@ def finish_job(job_id):
@app.route("/api/printers", methods=["GET"])
@login_required
def get_printers():
"""Gibt alle Drucker mit aktuellem Status zurück (mit Ping-Check und 7-Sekunden-Timeout)."""
"""Gibt alle Drucker zurück - ohne Status-Check für schnelleres Laden."""
db_session = get_db_session()
try:
printers = db_session.query(Printer).all()
# Drucker-Daten für Status-Check vorbereiten
printer_data = []
for printer in printers:
printer_data.append({
'id': printer.id,
'name': printer.name,
'ip_address': printer.ip_address,
'location': printer.location
})
# Status aller Drucker parallel überprüfen mit 7-Sekunden-Timeout
printers_logger.info(f"Starte Drucker-Status-Check für {len(printer_data)} Drucker")
status_results = check_multiple_printers_status(printer_data, timeout=7)
# Drucker-Liste mit aktuellem Status erstellen
# Drucker-Liste ohne Status-Check erstellen (für schnelleres Laden)
printer_list = []
for printer in printers:
if printer.id in status_results:
status, active = status_results[printer.id]
# Mapping für Frontend-Kompatibilität
if status == "online":
frontend_status = "available"
else:
frontend_status = "offline"
else:
# Fallback falls kein Ergebnis vorliegt
frontend_status = "offline"
active = False
# Status in der Datenbank aktualisieren
printer.status = frontend_status
printer.active = active
printer_data = printer.to_dict()
printer_data["status"] = frontend_status
printer_data["active"] = active
printer_data["last_checked"] = datetime.now().isoformat()
# Verwende den gespeicherten Status oder setze auf "offline" als Standard
printer_data["status"] = printer.status if printer.status else "offline"
printer_data["active"] = printer.active if printer.active is not None else False
printer_data["last_checked"] = None # Wird beim Status-Check gesetzt
printer_list.append(printer_data)
# Speichere Updates
db_session.commit()
db_session.close()
online_count = len([p for p in printer_list if p["status"] == "available"])
printers_logger.info(f"Drucker-Status-Check abgeschlossen: {online_count} von {len(printer_list)} Drucker verfügbar")
printers_logger.info(f"Drucker-Liste geladen: {len(printer_list)} Drucker")
return jsonify({
"printers": printer_list