Das beigefügte Texteintrag listet verschiedene Dateien und Dateipfade auf, die in einem Backend-System geändert wurden. Hier ist eine Zusammenfassung der Änderungen:
This commit is contained in:
1
backend/docs/fix-http500-printer-status.md
Normal file
1
backend/docs/fix-http500-printer-status.md
Normal file
@@ -0,0 +1 @@
|
||||
|
@@ -1 +1,128 @@
|
||||
|
||||
# PrinterMonitor HTTP 500 Error Fix
|
||||
|
||||
## 🔧 Problem
|
||||
|
||||
Der PrinterMonitor JavaScript-Code erhält einen HTTP 500 Fehler beim Aufruf von `/api/printers/status`:
|
||||
|
||||
```javascript
|
||||
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:**
|
||||
```python
|
||||
from utils.hardware_integration import tapo_controller as tapo_ctrl
|
||||
tapo_controller = tapo_ctrl # Überschreibt die Variable
|
||||
```
|
||||
|
||||
**Nachher:**
|
||||
```python
|
||||
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:
|
||||
```bash
|
||||
cd backend
|
||||
python app.py
|
||||
```
|
||||
|
||||
### 2. API testen:
|
||||
```javascript
|
||||
// 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:
|
||||
```json
|
||||
{
|
||||
"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:
|
||||
|
||||
```python
|
||||
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:
|
||||
|
||||
```python
|
||||
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.
|
@@ -1 +1,145 @@
|
||||
|
||||
# PrinterMonitor - Vollständige Fehlerbehebung
|
||||
|
||||
## 🔧 Gelöste Probleme
|
||||
|
||||
### 1. HTTP 500 Error bei `/api/printers/status`
|
||||
|
||||
**Problem:**
|
||||
```javascript
|
||||
printer_monitor.min.js:13 ❌ Fehler beim Abrufen des Drucker-Status: Error: HTTP 500:INTERNAL SERVER ERROR
|
||||
```
|
||||
|
||||
**Ursache:**
|
||||
- Falscher Import des `tapo_controller` mit Alias, der die Variable überschrieb
|
||||
|
||||
**Lösung:**
|
||||
```python
|
||||
# Vorher (falsch):
|
||||
from utils.hardware_integration import tapo_controller as tapo_ctrl
|
||||
tapo_controller = tapo_ctrl # Überschreibt die Variable
|
||||
|
||||
# Nachher (korrekt):
|
||||
from utils.hardware_integration import tapo_controller
|
||||
# Direkte Verwendung ohne Alias
|
||||
```
|
||||
|
||||
### 2. Falscher API-Endpoint in printer_monitor.js
|
||||
|
||||
**Problem:**
|
||||
- printer_monitor.js versuchte `/api/printers/monitor/live-status` aufzurufen
|
||||
- Dieser Endpoint existiert nicht
|
||||
|
||||
**Lösung:**
|
||||
```javascript
|
||||
// Vorher:
|
||||
const response = await fetch(`/api/printers/monitor/live-status?use_cache=${this.useCache}`, {
|
||||
|
||||
// Nachher:
|
||||
const response = await fetch(`/api/printers/status`, {
|
||||
```
|
||||
|
||||
### 3. Inkompatible Response-Verarbeitung
|
||||
|
||||
**Problem:**
|
||||
- printer_monitor.js erwartete ein Objekt, erhielt aber ein Array von Druckern
|
||||
|
||||
**Lösung:**
|
||||
```javascript
|
||||
// Vorher:
|
||||
if (printersData && typeof printersData === 'object') {
|
||||
Object.values(printersData).forEach(printer => {
|
||||
|
||||
// Nachher:
|
||||
if (printersData && Array.isArray(printersData)) {
|
||||
printersData.forEach(printer => {
|
||||
```
|
||||
|
||||
## 📋 Durchgeführte Änderungen
|
||||
|
||||
### 1. **backend/app.py**
|
||||
- Import-Statement für tapo_controller korrigiert
|
||||
- Robustere Fehlerbehandlung bereits implementiert
|
||||
|
||||
### 2. **backend/static/js/printer_monitor.js**
|
||||
- API-Endpoint von `/api/printers/monitor/live-status` zu `/api/printers/status` geändert
|
||||
- Response-Verarbeitung für Array-Struktur angepasst
|
||||
- Flexible Datenextraktion für verschiedene Response-Formate
|
||||
|
||||
## 🚀 Test-Anleitung
|
||||
|
||||
### 1. Server neu starten:
|
||||
```bash
|
||||
cd backend
|
||||
python app.py
|
||||
```
|
||||
|
||||
### 2. Browser-Konsole öffnen und testen:
|
||||
```javascript
|
||||
// Manueller Test des API-Endpoints
|
||||
fetch('/api/printers/status', {
|
||||
credentials: 'include'
|
||||
})
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
console.log('API Response:', data);
|
||||
console.log('Drucker gefunden:', data.count);
|
||||
});
|
||||
|
||||
// PrinterMonitor testen
|
||||
if (window.printerMonitor) {
|
||||
window.printerMonitor.stop(); // Falls bereits läuft
|
||||
window.printerMonitor.start(); // Neu starten
|
||||
|
||||
// Callback für Updates registrieren
|
||||
window.printerMonitor.onUpdate((data) => {
|
||||
console.log('PrinterMonitor Update:', data);
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Erwartete Ausgabe:
|
||||
```
|
||||
✅ Tapo-Controller erfolgreich importiert: <class 'utils.hardware_integration.TapoController'>
|
||||
✅ API: Status für 3 Drucker abgerufen
|
||||
🖨️ PrinterMonitor initialisiert
|
||||
🚀 Starte PrinterMonitor
|
||||
✅ 3 Drucker erfolgreich verarbeitet
|
||||
🔄 Drucker-Status aktualisiert: 3 Drucker
|
||||
```
|
||||
|
||||
## 📊 Response-Format
|
||||
|
||||
Der `/api/printers/status` Endpoint liefert jetzt:
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"printers": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Prusa i3 MK3S+",
|
||||
"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:45:00"
|
||||
}
|
||||
```
|
||||
|
||||
## ✅ Status
|
||||
|
||||
Alle Fehler wurden behoben:
|
||||
1. ✅ HTTP 500 Error behoben
|
||||
2. ✅ API-Endpoint korrigiert
|
||||
3. ✅ Response-Verarbeitung angepasst
|
||||
4. ✅ PrinterMonitor funktioniert wieder korrekt
|
||||
|
||||
Das System sollte nun ohne Fehler funktionieren und die Drucker-Status live aktualisieren.
|
Reference in New Issue
Block a user