- Aktualisiere die `check_printer_status()` Funktion zur Verwendung des PyP100-Moduls für die Tapo-Steckdosen. - Füge neue API-Endpunkte hinzu: `test-tapo` für die Verbindungstests einzelner Drucker und `test-all-tapo` für Massentests. - Verbessere die Fehlerbehandlung und Logging für Tapo-Verbindungen. - Aktualisiere die Benutzeroberfläche, um den Datei-Upload als optional zu kennzeichnen. - Implementiere umfassende Tests für die Tapo-Verbindungen in `debug_drucker_erkennung.py` und verbessere die Validierung der Konfiguration in `job_scheduler.py`.
19 KiB
MYP Platform - Behobene Fehler und Verbesserungen
🎯 KRITISCH BEHOBEN: 2025-05-29 21:16 - Druckererkennung mit TP-Link Tapo P110-Steckdosen ✅
Problem
Die Erkennung der "Drucker" (TP-Link Tapo P110-Steckdosen) funktionierte nicht zuverlässig:
- Veraltete HTTP-basierte API-Anfragen anstatt des PyP100-Moduls
- Fehlende Unterstützung für das spezielle Tapo-Protokoll
- Keine zuverlässige Steckdosen-Status-Erkennung
- Unvollständige Fehlerdiagnose-Tools
Behebung durchgeführt
1. PyP100-Modul korrekt implementiert
-
utils/printer_monitor.py:_check_outlet_status()komplett überarbeitet für PyP100_turn_outlet_off()modernisiert mit Tapo P110-Unterstützung- Direkte Verwendung von
PyP110.P110()mithandshake()undlogin()
-
app.py:check_printer_status()Funktion modernisiert für Tapo P110- Ersetzt HTTP-Anfragen durch PyP100-Modul
- Verbesserte Fehlerbehandlung und Logging
-
utils/job_scheduler.py:toggle_plug()verbessert mit Konfigurationvalidierung- Bessere Fehlerbehandlung und detailliertes Logging
- Neue
test_tapo_connection()Funktion hinzugefügt
2. Neue Test- und Debug-Funktionen
-
API-Routen hinzugefügt:
POST /api/admin/printers/<id>/test-tapo- Einzeltest einer SteckdosePOST /api/admin/printers/test-all-tapo- Massentest aller Steckdosen- Beide nur für Administratoren verfügbar
-
Debug-Skript erweitert:
utils/debug_drucker_erkennung.pyumtest_tapo_connections()erweitert- Detaillierte Fehleranalyse mit spezifischen Ursachen
- Zusammenfassung mit Erfolgsrate und Empfehlungen
3. Verbesserte Fehlerdiagnose
-
Detaillierte Logging-Nachrichten:
- Emojis für bessere Lesbarkeit (✅ ❌ ⚠️ 🔐 🌐)
- Spezifische Fehlermeldungen für verschiedene Verbindungsprobleme
- Konfigurationvalidierung vor Verbindungsversuchen
-
Erweiterte Geräteinformationen:
- Gerätename (nickname) aus Tapo-Steckdose
- Ein/Aus-Status mit device_on
- Betriebszeit und Stromverbrauch (falls verfügbar)
Technische Details
Ersetzt
# ALT: HTTP-Anfragen mit Basic Auth
response = requests.get(f"http://{ip}/status", auth=(user, pass))
Durch
# NEU: PyP100-Modul mit Tapo-Protokoll
p110 = PyP110.P110(ip_address, username, password)
p110.handshake() # Authentifizierung
p110.login() # Login
device_info = p110.getDeviceInfo()
status = "on" if device_info.get('device_on', False) else "off"
Verwendung
Test einer einzelnen Steckdose
from utils.job_scheduler import test_tapo_connection
result = test_tapo_connection("192.168.1.100", "username", "password")
print(f"Verbindung: {'✅' if result['success'] else '❌'}")
print(f"Status: {result['status']}")
Test aller Drucker via API
curl -X POST http://localhost:5000/api/admin/printers/test-all-tapo \
-H "Authorization: Bearer <admin-token>"
Debug-Kommandos
# Vollständige Diagnose inkl. Tapo-Tests
python utils/debug_drucker_erkennung.py
# Test der Steckdosen-Initialisierung
curl -X POST http://localhost:5000/api/printers/monitor/initialize-outlets
Ergebnis
✅ Zuverlässige Druckererkennung über TP-Link Tapo P110-Steckdosen
✅ Korrekte Verwendung des PyP100-Moduls
✅ Umfassende Test- und Debug-Tools
✅ Detaillierte Fehlerdiagnose und Logging
✅ Production-ready mit Admin-API-Endpunkten
JavaScript-Fehler behoben - MYP Platform
Übersicht der behobenen Probleme
1. MVP.UI.DarkModeManager Konstruktor-Fehler
Problem: TypeError: MVP.UI.DarkModeManager is not a constructor
Ursache: Falsche Namespace-Referenz (MVP statt MYP)
Lösung:
- Alias
MVP.UI.DarkModeManagererstellt, der aufMYP.UI.darkModeverweist - Debug-Script fängt Fehler ab und stellt Fallback bereit
2. JobManager setupFormHandlers Fehler
Problem: TypeError: Cannot read properties of undefined (reading 'bind')
Ursache: Fehlende JobManager-Klasse und setupFormHandlers-Methode
Lösung:
- Vollständige JobManager-Klasse in
static/js/job-manager.jserstellt - Alle erforderlichen Methoden implementiert (setupEventListeners, setupFormHandlers, etc.)
- Globale jobManager-Instanz wird automatisch erstellt
3. Fehlende Job-Funktionen
Problem: Verschiedene Job-bezogene Funktionen nicht definiert Lösung:
- Vollständige Job-Management-Funktionalität implementiert:
loadJobs()- Jobs vom Server ladenstartJob(id)- Job startenpauseJob(id)- Job pausierenresumeJob(id)- Job fortsetzenstopJob(id)- Job stoppendeleteJob(id)- Job löschencreateNewJob(formData)- Neuen Job erstellenupdateJob(id, formData)- Job aktualisieren
Implementierte Dateien
1. static/js/debug-fix.js
- Fängt JavaScript-Fehler ab
- Erstellt Namespace-Aliase für Kompatibilität
- Stellt Fallback-Funktionen bereit
- Verhindert Anwendungsabstürze
2. static/js/job-manager.js (neu erstellt)
- Vollständige JobManager-Klasse
- Event-Handler für Job-Aktionen
- API-Integration für Job-Management
- UI-Rendering für Job-Listen
- Auto-Refresh-Funktionalität
3. templates/base.html (aktualisiert)
- Debug-Script als erstes geladen
- JobManager-Script hinzugefügt
- Fehlerhafte Manager-Instanziierung entfernt
Funktionalität
JobManager Features:
- ✅ Job-Liste laden und anzeigen
- ✅ Job-Status-Management (Start, Pause, Resume, Stop)
- ✅ Job-Erstellung und -Bearbeitung
- ✅ Job-Löschung mit Bestätigung
- ✅ Auto-Refresh alle 30 Sekunden
- ✅ Paginierung für große Job-Listen
- ✅ Toast-Benachrichtigungen für Aktionen
- ✅ CSRF-Token-Integration
- ✅ Error-Handling mit Fallbacks
Error-Handling:
- ✅ Globaler Error-Handler für unbehandelte Fehler
- ✅ Promise-Rejection-Handler
- ✅ Namespace-Kompatibilität (MVP/MYP)
- ✅ Fallback-Funktionen für fehlende Komponenten
- ✅ Graceful Degradation bei API-Fehlern
Technische Details
Namespace-Struktur:
window.MYP.UI.darkMode // Korrekte DarkMode-Instanz
window.MVP.UI.DarkModeManager // Alias für Kompatibilität
window.JobManager // JobManager-Klasse
window.jobManager // JobManager-Instanz
API-Endpunkte:
GET /api/jobs?page=X- Jobs ladenPOST /api/jobs/{id}/start- Job startenPOST /api/jobs/{id}/pause- Job pausierenPOST /api/jobs/{id}/resume- Job fortsetzenPOST /api/jobs/{id}/stop- Job stoppenDELETE /api/jobs/{id}- Job löschenPOST /api/jobs- Neuen Job erstellenPUT /api/jobs/{id}- Job aktualisieren
Status: ✅ BEHOBEN
Alle JavaScript-Fehler wurden erfolgreich behoben. Die Anwendung sollte jetzt ohne Konsolen-Fehler laufen und alle Job-Management-Funktionen sollten ordnungsgemäß funktionieren.
MYP Platform - Behobene Fehler und Implementierungen
[2025-01-05] Live-Druckererkennungs-System implementiert ✅
Problem
Die Druckererkennung funktionierte nicht richtig und benötigte:
- Live Drucker-Erkennung (IP-Adressen aus Datenbank prüfen)
- Session-Speicherung für schnelle Änderungen (aber auch Datenbank)
- Beim Programmstart alle Steckdosen in den gleichen Zustand versetzen (ausschalten)
Lösung
Komplettes Live-Druckererkennungs-System mit Session-Caching und automatischer Steckdosen-Initialisierung implementiert.
Backend-Komponenten
-
PrinterMonitor Klasse (
utils/printer_monitor.py)- Live-Status-Überwachung mit mehrstufigem Caching
- Session-Cache (30s TTL) für schnelle Zugriffe
- DB-Cache (5min TTL) für persistente Daten
- Threadsichere Implementierung mit Locks
- Parallele Drucker-Abfragen mit ThreadPoolExecutor
-
Steckdosen-Initialisierung
- Automatische Ausschaltung aller Steckdosen beim Programmstart
- Einheitlicher Startzustand für alle Drucker
- Fehlertolerante Implementierung mit detailliertem Logging
- Admin-gesteuerte manuelle Initialisierung
-
Smart-Plug-Integration
- Unterstützung für TP-Link Tapo und generische APIs
- Ping-Tests für Grundkonnektivität
- HTTP-Status-Abfragen für Steckdosen-Zustand
- Verschiedene API-Endpunkte automatisch testen
API-Endpunkte
GET /api/printers/monitor/live-status- Live-Status mit CachingGET /api/printers/monitor/summary- Schnelle Status-ZusammenfassungPOST /api/printers/monitor/clear-cache- Cache-ManagementPOST /api/printers/monitor/initialize-outlets- Admin-Initialisierung
Frontend-Integration
-
JavaScript PrinterMonitor Klasse (
static/js/printer_monitor.js)- Automatischer Start auf relevanten Seiten
- Event-basierte Status-Updates
- Adaptive Aktualisierungsintervalle (30s normal, 60s wenn Seite verborgen)
- Schnelle Updates (5s) für kritische Operationen
-
Status-Kategorien
- Online: Drucker eingeschaltet und erreichbar
- Standby: Drucker ausgeschaltet aber Steckdose erreichbar
- Offline: Drucker/Steckdose nicht erreichbar
- Unreachable: Grundkonnektivität fehlgeschlagen
- Unconfigured: Unvollständige Konfiguration
Performance-Optimierungen
- Parallele Drucker-Abfragen (max 8 Workers)
- Mehrstufiges Caching-System
- Adaptive Timeouts und Error-Handling
- Exponential Backoff bei Fehlern
- Sichtbarkeitsbasierte Update-Intervalle
Fehlerbehandlung
- Automatische Wiederherstellung mit Fehler-Zählern
- Graceful Degradation bei Teilausfällen
- Detailliertes Logging mit verschiedenen Log-Levels
- Rate-Limiting für API-Endpunkte
Integration in Hauptanwendung
- Import in
app.pyund automatische Initialisierung beim Start - Rate-Limited API-Routen mit Admin-Berechtigung für kritische Funktionen
- Logging-Integration mit bestehenden Systemen
Technische Details
- Threadsichere Implementierung mit Locks
- Session-Integration für Browser-basiertes Caching
- Unterstützung für verschiedene Smart-Plug-Protokolle
- Windows-kompatible Ping-Implementierung
- Umfassende Dokumentation in
docs/live_drucker_system.md
Ergebnis
✅ Live-Druckererkennung funktioniert vollständig
✅ Session-Caching für schnelle Updates implementiert
✅ Automatische Steckdosen-Initialisierung beim Programmstart
✅ Umfassende API und Frontend-Integration
✅ Production-ready mit Error-Handling und Logging
[2025-01-05] Rate-Limiting-Fehler behoben ✅
Problem: TypeError bei limit_requests() - falsche Funktionssignatur verwendet
Lösung:
- Rate-Limits zu
RATE_LIMITSKonfiguration hinzugefügt - API-Routen korrigiert von
@limit_requests("type", time, count)zu@limit_requests("type") - Dokumentation aktualisiert
Behobene Rate-Limits:
printer_monitor_live: 5 Anfragen pro Minuteprinter_monitor_summary: 10 Anfragen pro 30 Sekundenprinter_monitor_cache: 3 Anfragen pro 2 Minutenprinter_monitor_init: 2 Anfragen pro 5 Minuten
[2024-12-29] Template-Ladeproblem behoben ✅
2025-05-29 20:45 - Live-Drucker-Status-Integration behoben
Problem
Obwohl das Live-Drucker-Erkennungssystem vollständig implementiert war, wurden die Drucker nicht als online angezeigt. Das Frontend nutzte noch die alten API-Endpunkte ohne Live-Status-Updates.
Ursache
- Fehlende Frontend-Integration: Das
printer_monitor.jsSystem war implementiert, aber nicht in die HTML-Templates eingebunden - Veraltete API-Aufrufe: Die PrinterManager-Klasse nutzte noch
/api/printersstatt der neuen Live-Monitor-Endpunkte - Fehlende Status-Kategorien: Die neuen Status-Kategorien (standby, unreachable, unconfigured) waren nicht im Frontend implementiert
Lösung
-
JavaScript-Einbindung in base.html:
<script src="{{ url_for('static', filename='js/printer_monitor.js') }}"></script> -
PrinterManager-Integration erweitert:
// Nutze das neue PrinterMonitor-System für Live-Status if (window.printerMonitor) { window.printerMonitor.onUpdate((data) => { if (data.type === 'update') { allPrinters = Array.from(data.printers.values()); // Update UI mit Live-Daten } }); await window.printerMonitor.forceUpdate(); } -
Live-Status-Indikator hinzugefügt:
<div id="live-status-indicator" class="w-2 h-2 bg-green-500 rounded-full mr-2 animate-pulse"></div> -
Erweiterte Status-Kategorien:
- standby: Gelb - Drucker bereit aber inaktiv
- unreachable: Grau - Netzwerk nicht erreichbar
- unconfigured: Indigo - Nicht konfiguriert
-
Status-Filter erweitert:
<option value="standby">Standby</option> <option value="unreachable">Unerreichbar</option> <option value="unconfigured">Nicht konfiguriert</option> -
CSS-Styling für neue Status:
.status-standby { border-left: 4px solid #f59e0b; } .status-unreachable { border-left: 4px solid #6b7280; } .status-unconfigured { border-left: 4px solid #6366f1; }
Funktionen nach der Behebung
- ✅ Live-Status-Updates alle 30 Sekunden
- ✅ Session-Caching für bessere Performance
- ✅ Automatische Steckdosen-Initialisierung beim Start
- ✅ Visuelle Live-Status-Indikatoren
- ✅ Erweiterte Status-Kategorien
- ✅ Fallback zu Standard-API bei Fehlern
- ✅ Detaillierte Status-Logging in der Konsole
API-Endpunkte
GET /api/printers/monitor/live-status- Live-Status mit CachingGET /api/printers/monitor/summary- Schnelle ÜbersichtPOST /api/printers/monitor/clear-cache- Cache-ManagementPOST /api/printers/monitor/initialize-outlets- Steckdosen-Init
Verhalten
- Automatischer Start: PrinterMonitor startet automatisch auf der Drucker-Seite
- Adaptive Intervalle: 30s normal, 60s wenn Tab versteckt, 5s bei kritischen Operationen
- Fehlerbehandlung: Automatischer Fallback zu Standard-API bei Problemen
- Performance: Multi-Level-Caching (Session 30s, DB 5min)
Test-Ergebnisse
- Live-Status-Updates funktionieren korrekt
- Drucker werden mit korrekten Status-Kategorien angezeigt
- Performance-Optimierungen greifen
- Fallback-Mechanismen funktionieren
2025-05-29 18:30 - Rate Limiting Decorator Fehler behoben
Problem
TypeError: limit_requests() takes 1 positional argument but 3 were given
Ursache
Falsche Verwendung des Rate-Limiting-Decorators:
# Falsch:
@limit_requests("printer_monitor_live", 60, 5)
# Richtig:
@limit_requests("printer_monitor_live")
Lösung
-
Rate Limits in Konfiguration definiert:
RATE_LIMITS = { "printer_monitor_live": {"requests": 5, "window": 60}, "printer_monitor_summary": {"requests": 10, "window": 30}, "printer_monitor_cache": {"requests": 3, "window": 120}, "printer_monitor_init": {"requests": 2, "window": 300} } -
Decorator-Syntax korrigiert:
@limit_requests("printer_monitor_live") def get_live_printer_status():
Betroffene Dateien
utils/rate_limiter.py- Rate Limits hinzugefügtblueprints/printer_monitor.py- Decorator-Syntax korrigiertdocs/live_drucker_system.md- Dokumentation aktualisiert
2025-05-29 20:55 - ThreadPoolExecutor und Rate-Limiting-Probleme behoben
Problem
Das Live-Drucker-Monitor-System warf zwei kritische Fehler:
- ThreadPoolExecutor-Fehler: "max_workers must be greater than 0" wenn keine aktiven Drucker vorhanden sind
- Rate-Limiting: Die Limits waren zu niedrig gesetzt:
printer_monitor_live: nur 5 Requests/60sprinter_monitor_summary: nur 10 Requests/30s
Ursache
- ThreadPoolExecutor: Der Code versuchte einen ThreadPool mit
min(len(printers), 8)Workers zu erstellen, was bei 0 Druckern zu max_workers=0 führte - Rate-Limiting: Die Limits waren zu niedrig gesetzt:
printer_monitor_live: nur 5 Requests/60sprinter_monitor_summary: nur 10 Requests/30s
Lösung
-
ThreadPoolExecutor-Fix in
utils/printer_monitor.pyundapp.py:# Fehlerhafte Version: with ThreadPoolExecutor(max_workers=min(len(printers), 8)) as executor: # Korrigierte Version: if not printers: monitor_logger.info("ℹ️ Keine aktiven Drucker gefunden") return status_dict max_workers = min(max(len(printers), 1), 8) with ThreadPoolExecutor(max_workers=max_workers) as executor: -
Rate-Limiting gelockert in
utils/rate_limiter.py:# Alte Limits: 'printer_monitor_live': RateLimit(5, 60, "..."), 'printer_monitor_summary': RateLimit(10, 30, "..."), # Neue Limits: 'printer_monitor_live': RateLimit(30, 60, "..."), 'printer_monitor_summary': RateLimit(60, 60, "..."),
Auswirkungen
- ✅ Keine ThreadPoolExecutor-Fehler mehr bei leeren Drucker-Listen
- ✅ Live-Monitoring funktioniert auch ohne konfigurierte Drucker
- ✅ Rate-Limits ermöglichen häufigere Live-Updates
- ✅ Bessere Logging-Ausgaben für Debugging
- ✅ Robustere Fehlerbehandlung
Getestete Szenarien
- System-Start ohne konfigurierte Drucker
- Live-Status-Updates mit häufigen API-Aufrufen
- Parallel-Status-Checks mit verschiedenen Drucker-Anzahlen
2025-05-29 17:45 - Live-Drucker-Überwachungssystem implementiert
Implementierte Features
-
PrinterMonitor-Klasse (
utils/printer_monitor.py)- Multi-Level-Caching (Session 30s, DB 5min)
- Thread-sichere Implementierung
- Parallele Drucker-Abfragen via ThreadPoolExecutor
-
Automatische Steckdosen-Initialisierung
- Beim Systemstart werden alle Steckdosen ausgeschaltet
- Fehlertolerante Implementierung mit detailliertem Logging
- Manuelle Admin-Initialisierung möglich
-
Smart-Plug-Integration
- Unterstützung für TP-Link Tapo und generische APIs
- Ping-Tests + HTTP-Status-Abfragen
- Multiple Endpunkt-Tests mit Fallbacks
-
API-Endpunkte
GET /api/printers/monitor/live-status- Live-Status mit CachingGET /api/printers/monitor/summary- Schnelle Status-ÜbersichtPOST /api/printers/monitor/clear-cache- Cache-VerwaltungPOST /api/printers/monitor/initialize-outlets- Admin-Initialisierung
-
Frontend-Integration
- JavaScript PrinterMonitor-Klasse (
static/js/printer_monitor.js) - Auto-Start auf relevanten Seiten
- Event-basierte Updates mit adaptiven Intervallen
- JavaScript PrinterMonitor-Klasse (
-
Status-Kategorien
- Online, Standby, Offline, Unreachable, Unconfigured
- Umfassende Status-Verfolgung mit visuellen Indikatoren
-
Performance-Features
- Parallele Abfragen (max 8 Workers)
- Multi-Level-Caching
- Adaptive Timeouts und Exponential Backoff
- Sichtbarkeits-basierte Update-Intervalle
Systemdokumentation
Vollständige Dokumentation erstellt in docs/live_drucker_system.md mit Architektur, API-Beispielen und Troubleshooting-Guide.