Files
Projektarbeit-MYP/backend/docs/printer-monitor-500-error-fix.md

3.3 KiB

PrinterMonitor HTTP 500 Error Fix

🔧 Problem

Der PrinterMonitor JavaScript-Code erhält einen HTTP 500 Fehler beim Aufruf von /api/printers/status:

printer_monitor.min.js:13  Fehler beim Abrufen des Drucker-Status: Error: HTTP 500:INTERNAL SERVER ERROR

🔍 Ursache

Die api_get_printer_status Funktion in app.py importierte den tapo_controller nicht korrekt:

  1. Der Import verwendete einen Alias, der die globale Variable überschrieb
  2. Bei Fehlern wurde keine robuste Fehlerbehandlung durchgeführt

Lösung

1. Import-Korrektur

Vorher:

from utils.hardware_integration import tapo_controller as tapo_ctrl
tapo_controller = tapo_ctrl  # Überschreibt die Variable

Nachher:

from utils.hardware_integration import tapo_controller
# Direkte Verwendung ohne Alias

2. Verbesserte Fehlerbehandlung

Die Funktion wurde bereits mit robuster Fehlerbehandlung aktualisiert:

  • Tapo-Controller wird nur importiert, wenn Drucker mit Steckdosen vorhanden sind
  • Fehler beim Import werden abgefangen und geloggt
  • Jeder Drucker erhält einen vollständigen Status, auch wenn die Hardware-Integration fehlschlägt
  • Konsistente JSON-Response-Struktur mit success Flag

📝 Test-Schritte

1. Server neu starten:

cd backend
python app.py

2. API testen:

// In der Browser-Konsole:
fetch('/api/printers/status', {
    credentials: 'include'
})
.then(r => r.json())
.then(data => {
    console.log('Status Response:', data);
    console.log('Anzahl Drucker:', data.count);
    data.printers.forEach(p => {
        console.log(`${p.name}: ${p.plug_status || 'no plug'}`);
    });
});

3. Erwartete Response:

{
    "success": true,
    "printers": [
        {
            "id": 1,
            "name": "Drucker 1",
            "status": "offline",
            "location": "Raum 101",
            "model": "Prusa i3",
            "ip_address": "192.168.1.100",
            "active": true,
            "plug_status": "off",
            "plug_reachable": true,
            "plug_ip": "192.168.1.50",
            "has_plug": true
        }
    ],
    "count": 1,
    "timestamp": "2025-01-15T10:30:00"
}

🚀 Weitere Verbesserungen

1. Caching für Hardware-Status

Um die Performance zu verbessern, könnte ein Cache für Steckdosen-Status implementiert werden:

from functools import lru_cache
from time import time

@lru_cache(maxsize=128)
def get_cached_plug_status(plug_ip: str, cache_time: int):
    return tapo_controller.check_outlet_status(plug_ip)

# Verwendung mit 30-Sekunden-Cache:
cache_key = int(time() / 30)
status = get_cached_plug_status(printer.plug_ip, cache_key)

2. Asynchrone Status-Abfragen

Für viele Drucker könnten die Status-Abfragen parallelisiert werden:

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=5) as executor:
    futures = []
    for printer in printers:
        if printer.plug_ip:
            future = executor.submit(
                tapo_controller.check_outlet_status,
                printer.plug_ip
            )
            futures.append((printer, future))

Status

Der HTTP 500 Fehler sollte nun behoben sein. Die API gibt auch bei Hardware-Fehlern eine gültige JSON-Response zurück.