3.3 KiB
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:
- Der Import verwendete einen Alias, der die globale Variable überschrieb
- 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.