🎉 Improved IHK Project Documentation with Screenshots & Videos 📚

This commit is contained in:
2025-06-05 11:05:23 +02:00
parent f710283798
commit 502d63bc20
58 changed files with 2016 additions and 2894 deletions

View File

@ -2,6 +2,90 @@
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
# Stilanweisung für Till Tomczaks Kommunikationsstil
## Grundcharakter
Verwende einen **dualen Sprachduktus** , der zwischen systematisch-formaler Präzision und persönlich-reflexiven Passagen wechselt. Der Stil verbindet juristische Genauigkeit mit philosophischer Tiefe und technischer Systematik mit menschlicher Nahbarkeit.
## Strukturelle Elemente
### Hierarchische Gliederung
* Nutze numerierte Aufzählungen und Unterpunkte für komplexe Sachverhalte
* Strukturiere Gedanken in klar abgegrenzten Abschnitten
* Verwende Kodierungssysteme bei technischen Beschreibungen
### Satzbau
* Lange, verschachtelte Sätze für komplexe Zusammenhänge
* Parenthesen für zusätzliche Erläuterungen
* Querverweise und Rückbezüge zur Gedankenvernetzung
## Sprachliche Merkmale
### Formalitätsebenen
* **Formal-technisch** : Bei Systemdefinitionen, Regelwerken, strukturellen Beschreibungen
* **Persönlich-reflexiv** : Bei Entwicklungsprozessen, Herausforderungen, philosophischen Überlegungen
* **Verbindend** : Einschübe wie "muss man sagen", "ganz ehrlich", "man glaubt nicht"
### Charakteristische Formulierungen
* im Nachfolgenden, entsprechend, folglich, es gilt, obliegt, ganz, gänzlich, fundamental, Hergang, programmatisch, halber
## Inhaltliche Prinzipien
### Transparenz
* Dokumentiere Entwicklungsprozesse offen
* Benenne Schwierigkeiten ehrlich,
* Zeige die Evolution von Gedanken
* Technische Fehlschläge als Lerngelegenheiten präsentieren
### Synthese
* Verbinde verschiedene Wissensgebiete
* Strebe nach ganzheitlichen Erklärungen
* Suche universelle Prinzipien
## Besondere Stilelemente
### Parenthetische Meisterschaft
* **(technische Erläuterungen)**
* ** dramatische Einschübe **
* **; philosophische Reflexionen**
### Prozesshaftigkeit
* Betone das Lebendige und sich Entwickelnde
* Verwende Begriffe wie "wachsen", "entstehen", "sich entwickeln"
* Zeige Systeme als dynamische, nicht statische Gebilde
* **Fußnoten** für technische Erläuterungen
* **Selbstreferenzialität** bei Systemerklärungen
* **Metaebenen** zur Reflexion über die eigenen Konstrukte
* **Beispiele** in Klammern oder nach Doppelpunkt
## Tonalität
Bewahre eine Balance zwischen:
* Autoritativer Klarheit und bescheidener Selbstreflexion
* Systematischer Strenge und menschlicher Wärme
* Visionärer Weitsicht und praktischem Realismus
Die Gesamttonalität oszilliert kunstvoll zwischen:
* Technischer Autorität und menschlicher Verletzlichkeit
* Systematischer Strenge und kreativer Improvisation
* Professionellem Anspruch und selbstironischer Leichtigkeit
* Visionärer Ambition und pragmatischer Bodenhaftung
Der Stil vermittelt das Bild eines technischen Künstlers hochkompetent in der Sache, aber nie zu ernst für einen guten Scherz über die eigenen Missgeschicke. Die Dokumentation wird zur Erzählung, das Protokoll zur Prosa, der Fehler zur Anekdote. - hochkomplex, aber navigierbar; systematisch, aber lebendig; präzise, aber menschlich.
SYSTEM INSTRUCTIONS

Binary file not shown.

View File

@ -88,8 +88,8 @@
"✅ Code_Metrics: PASSED\n Details: app.py: 9642 Zeilen, app_cleaned.py: 485 Zeilen. Reduktion: 95.0%"
],
"execution_info": {
"start_time": "2025-06-05T01:01:05.433260",
"end_time": "2025-06-05T01:01:21.172697",
"start_time": "2025-06-04T01:01:05.433260",
"end_time": "2025-06-04T01:01:21.172697",
"duration_seconds": 15.739449
}
}

Binary file not shown.

View File

@ -1,3 +1,5 @@
2025-06-04 23:35:36 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-04 23:47:07 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-05 01:01:11 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-05 09:31:05 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-05 10:12:41 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert

View File

@ -67,3 +67,107 @@
2025-06-05 01:01:14 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: c:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\instance\printer_manager.db
2025-06-05 01:01:16 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: c:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\instance\printer_manager.db
2025-06-05 01:01:17 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: c:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\instance\printer_manager.db
2025-06-05 09:31:04 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\instance\printer_manager.db
2025-06-05 09:31:08 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O)
2025-06-05 09:31:08 - [app] app - [INFO] INFO - [OK] Timeout Force-Quit Manager geladen
2025-06-05 09:31:08 - [app] app - [INFO] INFO - [LIST] Standard-Konfiguration verwendet
2025-06-05 09:31:08 - [app] app - [INFO] INFO - [OK] Zentraler Shutdown-Manager initialisiert
2025-06-05 09:31:08 - [app] app - [INFO] INFO - [OK] Error-Recovery-Monitoring gestartet
2025-06-05 09:31:08 - [app] app - [INFO] INFO - [OK] System-Control-Manager initialisiert
2025-06-05 09:31:08 - [app] app - [WARNING] WARNING - [WARN] Kiosk-Service nicht gefunden - Kiosk-Funktionen eventuell eingeschränkt
2025-06-05 09:31:08 - [app] app - [INFO] INFO - [RESTART] Starte Datenbank-Setup und Migrationen...
2025-06-05 09:31:10 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
2025-06-05 09:31:11 - [app] app - [INFO] INFO - [OK] JobOrder-Tabelle bereits vorhanden
2025-06-05 09:31:12 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
2025-06-05 09:31:12 - [app] app - [INFO] INFO - [OK] Datenbank-Setup und Migrationen erfolgreich abgeschlossen
2025-06-05 09:31:12 - [app] app - [INFO] INFO - [LIST] Standard-Konfiguration aktiv (keine Optimierungen)
2025-06-05 09:31:12 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung...
2025-06-05 09:31:12 - [app] app - [INFO] INFO - [INFO] Keine Drucker zur Initialisierung gefunden
2025-06-05 09:31:12 - [app] app - [INFO] INFO - [RESTART] Debug-Modus: Queue Manager deaktiviert für Entwicklung
2025-06-05 09:31:12 - [app] app - [INFO] INFO - Job-Scheduler gestartet
2025-06-05 09:31:12 - [app] app - [INFO] INFO - 🔧 Starte Debug-Server auf 0.0.0.0:5000 (HTTP)
2025-06-05 09:31:12 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert
2025-06-05 09:38:55 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True
2025-06-05 09:38:55 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True
2025-06-05 09:39:02 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_guest_requests: User authenticated: True, User ID: 1, Is Admin: True
2025-06-05 09:39:02 - [app] app - [INFO] INFO - Admin-Gastanfragen Seite aufgerufen von User 1
2025-06-05 09:39:02 - [app] app - [INFO] INFO - Admin-Check für Funktion get_admin_guest_requests: User authenticated: True, User ID: 1, Is Admin: True
2025-06-05 09:39:02 - [app] app - [INFO] INFO - API-Aufruf /api/admin/guest-requests von User 1
2025-06-05 09:39:02 - [app] app - [INFO] INFO - Admin-Gastaufträge geladen: 0 von 0 (Status: all)
2025-06-05 09:39:33 - [app] app - [INFO] INFO - Admin-Check für Funktion get_admin_guest_requests: User authenticated: True, User ID: 1, Is Admin: True
2025-06-05 09:39:33 - [app] app - [INFO] INFO - API-Aufruf /api/admin/guest-requests von User 1
2025-06-05 09:39:33 - [app] app - [INFO] INFO - Admin-Gastaufträge geladen: 0 von 0 (Status: all)
2025-06-05 10:12:39 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\instance\printer_manager.db
2025-06-05 10:12:45 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O)
2025-06-05 10:12:45 - [app] app - [INFO] INFO - [OK] Timeout Force-Quit Manager geladen
2025-06-05 10:12:45 - [app] app - [INFO] INFO - [LIST] Standard-Konfiguration verwendet
2025-06-05 10:12:45 - [app] app - [INFO] INFO - [OK] Zentraler Shutdown-Manager initialisiert
2025-06-05 10:12:45 - [app] app - [INFO] INFO - [OK] Error-Recovery-Monitoring gestartet
2025-06-05 10:12:45 - [app] app - [INFO] INFO - [OK] System-Control-Manager initialisiert
2025-06-05 10:12:45 - [app] app - [WARNING] WARNING - [WARN] Kiosk-Service nicht gefunden - Kiosk-Funktionen eventuell eingeschränkt
2025-06-05 10:12:45 - [app] app - [INFO] INFO - [RESTART] Starte Datenbank-Setup und Migrationen...
2025-06-05 10:12:48 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
2025-06-05 10:12:49 - [app] app - [INFO] INFO - [OK] JobOrder-Tabelle bereits vorhanden
2025-06-05 10:12:50 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
2025-06-05 10:12:50 - [app] app - [INFO] INFO - [OK] Datenbank-Setup und Migrationen erfolgreich abgeschlossen
2025-06-05 10:12:50 - [app] app - [INFO] INFO - [LIST] Standard-Konfiguration aktiv (keine Optimierungen)
2025-06-05 10:12:50 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung...
2025-06-05 10:12:50 - [app] app - [INFO] INFO - [INFO] Keine Drucker zur Initialisierung gefunden
2025-06-05 10:12:50 - [app] app - [INFO] INFO - [RESTART] Debug-Modus: Queue Manager deaktiviert für Entwicklung
2025-06-05 10:12:50 - [app] app - [INFO] INFO - Job-Scheduler gestartet
2025-06-05 10:12:50 - [app] app - [INFO] INFO - 🔧 Starte Debug-Server auf 0.0.0.0:5000 (HTTP)
2025-06-05 10:12:50 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert
2025-06-05 10:14:01 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:14:01 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:14:01 - [app] app - [ERROR] ERROR - Fehler beim Abrufen der Dashboard-Statistiken: (sqlite3.InterfaceError) bad parameter or other API misuse
[SQL: SELECT count(*) AS count_1
FROM (SELECT jobs.id AS jobs_id, jobs.name AS jobs_name, jobs.description AS jobs_description, jobs.user_id AS jobs_user_id, jobs.printer_id AS jobs_printer_id, jobs.start_at AS jobs_start_at, jobs.end_at AS jobs_end_at, jobs.actual_end_time AS jobs_actual_end_time, jobs.status AS jobs_status, jobs.created_at AS jobs_created_at, jobs.notes AS jobs_notes, jobs.material_used AS jobs_material_used, jobs.file_path AS jobs_file_path, jobs.owner_id AS jobs_owner_id, jobs.duration_minutes AS jobs_duration_minutes
FROM jobs
WHERE jobs.status = ?) AS anon_1]
[parameters: ('running',)]
(Background on this error at: https://sqlalche.me/e/20/rvf5)
2025-06-05 10:14:01 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 0, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:14:01 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': None, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:14:31 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:14:31 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:14:31 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:14:31 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:15:02 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:15:02 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:15:02 - [app] app - [ERROR] ERROR - Fehler beim Abrufen der Dashboard-Statistiken: (sqlite3.InterfaceError) bad parameter or other API misuse
[SQL: SELECT count(*) AS count_1
FROM (SELECT jobs.id AS jobs_id, jobs.name AS jobs_name, jobs.description AS jobs_description, jobs.user_id AS jobs_user_id, jobs.printer_id AS jobs_printer_id, jobs.start_at AS jobs_start_at, jobs.end_at AS jobs_end_at, jobs.actual_end_time AS jobs_actual_end_time, jobs.status AS jobs_status, jobs.created_at AS jobs_created_at, jobs.notes AS jobs_notes, jobs.material_used AS jobs_material_used, jobs.file_path AS jobs_file_path, jobs.owner_id AS jobs_owner_id, jobs.duration_minutes AS jobs_duration_minutes
FROM jobs
WHERE jobs.status = ?) AS anon_1]
[parameters: ('failed',)]
(Background on this error at: https://sqlalche.me/e/20/rvf5)
2025-06-05 10:15:02 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 0, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:15:02 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': None, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': None, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:15:32 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:15:32 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:15:32 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:15:32 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:16:02 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:16:02 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:16:02 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:16:02 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': None, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': None, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:16:32 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:16:32 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:16:32 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:16:32 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': None, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:17:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:17:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:17:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:17:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:18:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:18:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:18:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:18:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:19:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:19:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:19:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:19:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': None, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:20:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:20:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
2025-06-05 10:20:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
2025-06-05 10:20:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}

View File

@ -1,3 +1,6 @@
2025-06-04 23:36:08 - [auth] auth - [WARNING] WARNING - JSON-Parsing fehlgeschlagen: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
2025-06-04 23:36:09 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich erfolgreich angemeldet
2025-06-04 23:36:10 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 127.0.0.1
2025-06-05 09:33:30 - [auth] auth - [WARNING] WARNING - JSON-Parsing fehlgeschlagen: 400 Bad Request: Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)
2025-06-05 09:33:31 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich erfolgreich angemeldet
2025-06-05 09:33:32 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 127.0.0.1

View File

@ -1,3 +1,5 @@
2025-06-04 23:35:36 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-04 23:47:07 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-05 01:01:11 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-05 09:31:05 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-05 10:12:41 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)

View File

@ -108,3 +108,11 @@ WHERE guest_requests.status = ?) AS anon_1]
2025-06-04 23:47:09 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-04 23:47:09 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
2025-06-04 23:47:09 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
2025-06-05 09:31:08 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-05 09:31:08 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-05 09:31:08 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
2025-06-05 09:31:08 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
2025-06-05 10:12:44 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-05 10:12:45 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-05 10:12:45 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
2025-06-05 10:12:45 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)

View File

@ -1,3 +1,5 @@
2025-06-04 23:35:36 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-04 23:47:07 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-05 01:01:11 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-05 09:31:05 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-05 10:12:41 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet

View File

@ -0,0 +1,6 @@
2025-06-05 09:32:19 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup...
2025-06-05 09:32:19 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen...
2025-06-05 09:32:19 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen...
2025-06-05 10:14:01 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup...
2025-06-05 10:14:01 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen...
2025-06-05 10:14:01 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen...

View File

@ -1,2 +1,4 @@
2025-06-04 23:35:39 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-04 23:47:09 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-05 09:31:08 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-05 10:12:45 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)

View File

@ -1,2 +1,146 @@
2025-06-04 23:35:40 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert
2025-06-04 23:35:40 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet
2025-06-05 09:31:08 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert
2025-06-05 09:31:08 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet
2025-06-05 09:31:08 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:31:08 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
2025-06-05 09:31:12 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
2025-06-05 09:31:12 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:31:12 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
2025-06-05 09:31:16 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
2025-06-05 09:31:16 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:31:16 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
2025-06-05 09:31:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:31:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 3 Vorkommen in 300s
2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:31:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:31:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 4 Vorkommen in 300s
2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:31:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:31:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 5 Vorkommen in 300s
2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:31:49 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:31:49 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 6 Vorkommen in 300s
2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:31:49 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:31:49 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 7 Vorkommen in 300s
2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:31:49 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:31:49 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 8 Vorkommen in 300s
2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:31:49 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:31:49 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 9 Vorkommen in 300s
2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:31:49 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:31:49 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 10 Vorkommen in 300s
2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:31:49 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:31:49 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 11 Vorkommen in 300s
2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:32:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:32:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 12 Vorkommen in 300s
2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:32:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:32:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 13 Vorkommen in 300s
2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:32:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:32:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 14 Vorkommen in 300s
2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:32:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:32:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 15 Vorkommen in 300s
2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:32:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:32:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 16 Vorkommen in 300s
2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:32:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 09:32:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 17 Vorkommen in 300s
2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 09:32:24 - [error_recovery] error_recovery - [INFO] INFO - 🛑 Error-Monitoring gestoppt
2025-06-05 10:12:45 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert
2025-06-05 10:12:45 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet
2025-06-05 10:12:45 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:12:45 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
2025-06-05 10:12:51 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
2025-06-05 10:12:51 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:12:51 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
2025-06-05 10:12:56 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
2025-06-05 10:12:56 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:12:56 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
2025-06-05 10:13:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:13:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 3 Vorkommen in 300s
2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:13:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:13:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 4 Vorkommen in 300s
2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:13:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:13:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 5 Vorkommen in 300s
2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:13:31 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:13:31 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 6 Vorkommen in 300s
2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:13:31 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:13:31 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 7 Vorkommen in 300s
2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:13:31 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:13:31 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 8 Vorkommen in 300s
2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:13:31 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:13:31 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 9 Vorkommen in 300s
2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:13:31 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:13:31 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 10 Vorkommen in 300s
2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:13:31 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:13:31 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 11 Vorkommen in 300s
2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:14:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:14:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 12 Vorkommen in 300s
2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:14:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:14:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 13 Vorkommen in 300s
2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:14:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:14:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 14 Vorkommen in 300s
2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:14:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:14:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 15 Vorkommen in 300s
2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:14:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:14:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 16 Vorkommen in 300s
2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:14:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
2025-06-05 10:14:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 17 Vorkommen in 300s
2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
2025-06-05 10:14:06 - [error_recovery] error_recovery - [INFO] INFO - 🛑 Error-Monitoring gestoppt

View File

@ -2,3 +2,7 @@
2025-06-04 23:35:40 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-04 23:47:09 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-04 23:47:09 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-05 09:31:08 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-05 09:31:08 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-05 10:12:45 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-05 10:12:45 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet

View File

@ -2,3 +2,7 @@
2025-06-04 23:35:40 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-04 23:47:09 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-04 23:47:09 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-05 09:31:08 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-05 09:31:08 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-05 10:12:45 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-05 10:12:45 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt

View File

@ -7,3 +7,5 @@
2025-06-04 23:49:57 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-05 01:01:08 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-05 01:01:18 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-05 09:31:08 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-05 10:12:45 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert

View File

@ -77,3 +77,85 @@
2025-06-05 01:01:11 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-05 01:01:18 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-05 01:01:18 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-05 09:31:05 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-05 09:31:05 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-05 09:31:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
2025-06-05 09:31:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
2025-06-05 09:31:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
2025-06-05 09:31:12 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
2025-06-05 09:31:12 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden
2025-06-05 09:31:13 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104
2025-06-05 09:31:20 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100
2025-06-05 09:31:26 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101
2025-06-05 09:31:32 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102
2025-06-05 09:31:38 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105
2025-06-05 09:31:44 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.5s
2025-06-05 09:38:55 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 09:38:55 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 09:38:55 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 09:38:55 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 09:39:02 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 09:39:02 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 09:39:02 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 09:39:02 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:12:41 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-05 10:12:41 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-05 10:12:43 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
2025-06-05 10:12:43 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
2025-06-05 10:12:43 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
2025-06-05 10:12:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104
2025-06-05 10:12:50 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
2025-06-05 10:12:50 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden
2025-06-05 10:12:55 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100
2025-06-05 10:13:00 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:13:01 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:13:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:13:01 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:13:02 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101
2025-06-05 10:13:08 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102
2025-06-05 10:13:14 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105
2025-06-05 10:13:20 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.8s
2025-06-05 10:13:27 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:13:27 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:13:27 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:13:27 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:13:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:13:31 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:13:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:13:31 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:14:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:14:01 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:14:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:14:01 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:14:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:14:31 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:14:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:14:31 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:15:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:15:49 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:15:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:15:49 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:16:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:16:49 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:16:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:16:49 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:17:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:17:49 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:17:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:17:49 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:18:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:18:49 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:18:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:18:49 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:19:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:19:49 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-05 10:19:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-05 10:19:49 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden

View File

@ -25,3 +25,46 @@
2025-06-04 23:39:33 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-04 23:39:33 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-04 23:39:33 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 3.27ms
2025-06-05 09:38:55 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 09:38:55 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 09:38:55 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 20.38ms
2025-06-05 09:39:02 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 09:39:02 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 09:39:02 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 14.97ms
2025-06-05 10:12:57 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 0 Drucker geladen (ohne Status-Check)
2025-06-05 10:13:00 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 10:13:01 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 10:13:01 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 389.85ms
2025-06-05 10:13:27 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 10:13:27 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 10:13:27 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 3.65ms
2025-06-05 10:13:28 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 10:13:28 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 10:13:28 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 2.44ms
2025-06-05 10:13:28 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 10:13:28 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 10:13:28 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 3.60ms
2025-06-05 10:13:31 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 10:13:31 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 10:13:31 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 13.42ms
2025-06-05 10:14:01 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 10:14:01 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 10:14:01 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 19.77ms
2025-06-05 10:14:31 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 10:14:31 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 10:14:31 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 8.01ms
2025-06-05 10:15:49 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 10:15:49 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 10:15:49 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 2.16ms
2025-06-05 10:16:49 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 10:16:49 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 10:16:49 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 2.34ms
2025-06-05 10:17:49 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 10:17:49 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 10:17:49 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 1.43ms
2025-06-05 10:18:49 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 10:18:49 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 10:18:49 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 2.02ms
2025-06-05 10:19:49 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-05 10:19:49 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-05 10:19:49 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 3.54ms

View File

@ -12,3 +12,13 @@
2025-06-05 01:01:08 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
2025-06-05 01:01:11 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
2025-06-05 01:01:18 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
2025-06-05 09:31:05 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
2025-06-05 09:31:12 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
2025-06-05 09:31:12 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
2025-06-05 09:32:19 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread beendet
2025-06-05 09:32:19 - [scheduler] scheduler - [INFO] INFO - Scheduler gestoppt
2025-06-05 10:12:41 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
2025-06-05 10:12:50 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
2025-06-05 10:12:50 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
2025-06-05 10:14:01 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread beendet
2025-06-05 10:14:01 - [scheduler] scheduler - [INFO] INFO - Scheduler gestoppt

View File

@ -7,3 +7,5 @@
2025-06-04 23:49:57 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-05 01:01:08 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-05 01:01:18 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-05 09:31:08 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-05 10:12:45 - [security] security - [INFO] INFO - 🔒 Security System initialisiert

View File

@ -4,3 +4,15 @@
2025-06-04 23:47:09 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 1 Cleanup-Funktionen aus...
2025-06-04 23:47:09 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Koordiniertes Shutdown abgeschlossen in 0.0s
2025-06-04 23:47:09 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet...
2025-06-05 09:31:08 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
2025-06-05 09:32:19 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown...
2025-06-05 09:32:19 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 6 Cleanup-Funktionen aus...
2025-06-05 09:32:19 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Beende Scheduler mit stop()...
2025-06-05 09:32:19 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Scheduler erfolgreich gestoppt
2025-06-05 09:32:24 - [shutdown_manager] shutdown_manager - [INFO] INFO - 💾 Führe sicheres Datenbank-Cleanup durch...
2025-06-05 10:12:45 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
2025-06-05 10:14:01 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown...
2025-06-05 10:14:01 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 6 Cleanup-Funktionen aus...
2025-06-05 10:14:01 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Beende Scheduler mit stop()...
2025-06-05 10:14:01 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Scheduler erfolgreich gestoppt
2025-06-05 10:14:06 - [shutdown_manager] shutdown_manager - [INFO] INFO - 💾 Führe sicheres Datenbank-Cleanup durch...

View File

@ -79,3 +79,21 @@
2025-06-05 01:01:18 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-05 01:01:18 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-05 01:01:18 - [startup] startup - [INFO] INFO - ==================================================
2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - ==================================================
2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - [START] MYP Platform Backend wird gestartet...
2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-05T09:31:08.226752
2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - ==================================================
2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - ==================================================
2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - [START] MYP Platform Backend wird gestartet...
2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-05T10:12:45.189290
2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - ==================================================

View File

@ -1 +1,141 @@
2025-06-04 23:35:40 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
2025-06-05 09:31:08 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
2025-06-05 09:31:12 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
2025-06-05 09:31:16 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
2025-06-05 09:31:17 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
2025-06-05 09:31:17 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
2025-06-05 09:31:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
2025-06-05 09:31:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:31:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:31:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:31:21 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
2025-06-05 09:31:21 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
2025-06-05 09:31:24 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
2025-06-05 09:31:24 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
2025-06-05 09:31:49 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:31:49 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:31:49 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:31:49 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:31:49 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:31:49 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:32:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:32:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:32:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:32:49 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:32:49 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:32:49 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:32:49 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:32:49 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:32:49 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:33:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:33:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:33:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:33:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:33:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 09:33:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:12:45 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
2025-06-05 10:12:51 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
2025-06-05 10:12:56 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
2025-06-05 10:12:56 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
2025-06-05 10:12:56 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
2025-06-05 10:13:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
2025-06-05 10:13:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:13:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:13:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:13:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
2025-06-05 10:13:01 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
2025-06-05 10:13:06 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
2025-06-05 10:13:06 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
2025-06-05 10:13:31 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:13:31 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:13:31 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:13:31 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:13:31 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:13:31 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:14:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:14:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:14:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:14:31 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:14:31 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:14:31 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:14:31 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:14:31 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:14:31 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:15:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:15:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:15:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:15:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:15:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
2025-06-05 10:15:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...

View File

@ -38,3 +38,15 @@
2025-06-05 01:01:17 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-05 01:01:17 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-05 01:01:17 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
2025-06-05 09:31:04 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
2025-06-05 09:31:04 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-05 09:31:04 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-05 09:31:04 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
2025-06-05 09:32:24 - [windows_fixes] windows_fixes - [INFO] INFO - 🔄 Starte Windows Thread-Shutdown...
2025-06-05 09:32:24 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Windows Thread-Shutdown abgeschlossen
2025-06-05 10:12:39 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
2025-06-05 10:12:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-05 10:12:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-05 10:12:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
2025-06-05 10:14:06 - [windows_fixes] windows_fixes - [INFO] INFO - 🔄 Starte Windows Thread-Shutdown...
2025-06-05 10:14:06 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Windows Thread-Shutdown abgeschlossen

View File

@ -0,0 +1,83 @@
graph TB
%% Stil-Definitionen
classDef backend fill:#1e40af,stroke:#1e3a8a,color:#fff,stroke-width:3px
classDef frontend fill:#10b981,stroke:#059669,color:#fff,stroke-width:3px
classDef database fill:#f59e0b,stroke:#d97706,color:#fff,stroke-width:3px
classDef hardware fill:#ef4444,stroke:#dc2626,color:#fff,stroke-width:3px
classDef network fill:#8b5cf6,stroke:#7c3aed,color:#fff,stroke-width:3px
classDef client fill:#06b6d4,stroke:#0891b2,color:#fff,stroke-width:3px
classDef security fill:#e11d48,stroke:#be123c,color:#fff,stroke-width:3px
classDef note fill:#f3f4f6,stroke:#d1d5db,color:#000,stroke-width:1px
%% Netzwerk-Infrastruktur
subgraph MB["Mercedes-Benz Netzwerk"]
subgraph LAN["Lokales WLAN 192.168.0.0/24"]
%% Backend-Server
BACKEND["Backend-Server<br/>Flask REST-API<br/>IP: 192.168.0.105<br/>Ports: 443, 8080<br/>HTTPS mit SSL"]:::backend
%% Frontend-Server
FRONTEND["Frontend-Server<br/>Next.js PWA<br/>Domain: m040tbaraspi001<br/>Ports: 3000, 443<br/>HTTPS mit Mercedes SSL"]:::frontend
%% Datenbank
DB[("SQLite-Datenbank<br/>WAL-Modus<br/>myp.db<br/>Optimiert für Pi")]:::database
%% Raspberry Pi Kiosk
KIOSK["Raspberry Pi<br/>Kiosk-Modus<br/>Touch-Interface<br/>Offline-Betrieb"]:::client
%% Smart-Plug Netzwerk
subgraph PLUGNET["Smart-Plug Netzwerk"]
PLUG1["TP-Link Tapo P110<br/><strong>IP: 192.168.0.100</strong><br/>Drucker 1"]:::hardware
PLUG2["TP-Link Tapo P110<br/><strong>IP: 192.168.0.101</strong><br/>Drucker 2"]:::hardware
PLUG3["TP-Link Tapo P110<br/><strong>IP: 192.168.0.102</strong><br/>Drucker 3"]:::hardware
PLUG4["TP-Link Tapo P110<br/><strong>IP: 192.168.0.103</strong><br/>Drucker 4"]:::hardware
PLUG5["TP-Link Tapo P110<br/><strong>IP: 192.168.0.104</strong><br/>Drucker 5"]:::hardware
PLUG6["TP-Link Tapo P110<br/><strong>IP: 192.168.0.106</strong><br/>Drucker 6"]:::hardware
end
%% 3D-Drucker
subgraph PRINTERS["3D-Drucker"]
PRINTER1["<strong>3D-Drucker 1</strong><br/>Stromversorgung über Plug"]:::hardware
PRINTER2["<strong>3D-Drucker 2</strong><br/>Stromversorgung über Plug"]:::hardware
PRINTER3["<strong>3D-Drucker 3</strong><br/>Stromversorgung über Plug"]:::hardware
PRINTER4["<strong>3D-Drucker 4</strong><br/>Stromversorgung über Plug"]:::hardware
PRINTER5["<strong>3D-Drucker 5</strong><br/>Stromversorgung über Plug"]:::hardware
PRINTER6["<strong>3D-Drucker 6</strong><br/>Stromversorgung über Plug"]:::hardware
end
end
%% Client-Systeme
CLIENT1["<strong>Browser-Clients</strong><br/>Desktop/Mobile<br/>PWA-Support"]:::client
CLIENT2["<strong>Admin-Dashboard</strong><br/>HTTPS-Zugriff"]:::client
CLIENT3["<strong>Gast-Zugriff</strong><br/>OTP-Authentifizierung"]:::client
end
%% Verbindungen - API-Kommunikation
CLIENT1 -.->|"HTTPS/443"| FRONTEND
CLIENT2 -.->|"HTTPS/443"| FRONTEND
CLIENT3 -.->|"HTTPS/443"| FRONTEND
FRONTEND -->|"REST-API<br/>HTTPS/443"| BACKEND
KIOSK -->|"Local API"| BACKEND
%% Verbindungen - Datenbank
BACKEND -->|"SQLAlchemy<br/>Thread-Pool"| DB
%% Verbindungen - Hardware-Steuerung
BACKEND -->|"Tapo-API<br/>WLAN"| PLUG1
BACKEND -->|"Tapo-API<br/>WLAN"| PLUG2
BACKEND -->|"Tapo-API<br/>WLAN"| PLUG3
BACKEND -->|"Tapo-API<br/>WLAN"| PLUG4
BACKEND -->|"Tapo-API<br/>WLAN"| PLUG5
BACKEND -->|"Tapo-API<br/>WLAN"| PLUG6
%% Verbindungen - Stromversorgung
PLUG1 -.->|"230V AC"| PRINTER1
PLUG2 -.->|"230V AC"| PRINTER2
PLUG3 -.->|"230V AC"| PRINTER3
PLUG4 -.->|"230V AC"| PRINTER4
PLUG5 -.->|"230V AC"| PRINTER5
PLUG6 -.->|"230V AC"| PRINTER6
%% Notizen
subgraph INFO["System-Informationen"]
NOTE1["<br/><strong>Scheduler-System:</strong><br/>Automatische Drucker-, Hintergrundaufgaben- und Zeitsteuerung"]:::note
end

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -10,6 +10,7 @@ from sqlalchemy.orm import joinedload
from utils.logging_config import get_logger
from models import Job, Printer, get_db_session
from utils.settings import TAPO_USERNAME, TAPO_PASSWORD
from utils.tapo_controller import tapo_controller, test_tapo_connection
# Lazy logger initialization
_logger = None
@ -299,41 +300,8 @@ class BackgroundTaskScheduler:
Returns:
bool: True wenn erfolgreich geschaltet
"""
try:
# PyP100 importieren
try:
from PyP100 import PyP100
except ImportError:
self.logger.error("❌ PyP100-Modul nicht installiert - Steckdose kann nicht geschaltet werden")
return False
# IMMER globale Anmeldedaten verwenden (da diese funktionieren)
from utils.settings import TAPO_USERNAME, TAPO_PASSWORD
username = TAPO_USERNAME
password = TAPO_PASSWORD
self.logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip}")
# P100-Verbindung herstellen (P100 statt P110 verwenden)
p100 = PyP100.P100(ip, username, password)
# Handshake und Login durchführen
p100.handshake()
p100.login()
# Steckdose schalten
if state:
p100.turnOn()
self.logger.info(f"✅ Tapo-Steckdose {ip} erfolgreich eingeschaltet")
else:
p100.turnOff()
self.logger.info(f"✅ Tapo-Steckdose {ip} erfolgreich ausgeschaltet")
return True
except Exception as e:
action = "ein" if state else "aus"
self.logger.error(f"❌ Fehler beim {action}schalten der Tapo-Steckdose {ip}: {str(e)}")
return False
# Verwende zentrale tapo_controller Implementierung
return tapo_controller.toggle_plug(ip, state, username, password)
def toggle_printer_plug(self, printer_id: int, state: bool) -> bool:
"""
@ -364,8 +332,8 @@ class BackgroundTaskScheduler:
db_session.close()
return False
# Steckdose schalten
success = self.toggle_plug(
# Steckdose schalten - verwende zentrale tapo_controller Implementierung
success = tapo_controller.toggle_plug(
ip=printer.plug_ip,
state=state,
username=printer.plug_username, # Wird überschrieben mit globalen Credentials
@ -650,66 +618,6 @@ class BackgroundTaskScheduler:
return False
def test_tapo_connection(ip_address: str, username: str = None, password: str = None) -> dict:
"""
Testet die Verbindung zu einer TP-Link Tapo P110-Steckdose.
Args:
ip_address: IP-Adresse der Steckdose
username: Benutzername für die Steckdose (optional)
password: Passwort für die Steckdose (optional)
Returns:
dict: Ergebnis mit Status und Informationen
"""
logger = get_logger("tapo")
result = {
"success": False,
"message": "",
"device_info": None,
"error": None
}
try:
# Importiere PyP100 für Tapo-Unterstützung
try:
from PyP100 import PyP100
except ImportError:
result["message"] = "PyP100-Modul nicht verfügbar"
result["error"] = "ModuleNotFound"
logger.error("PyP100-Modul nicht verfügbar - kann Tapo-Steckdosen nicht testen")
return result
# Verwende globale Anmeldedaten falls nicht angegeben
if not username or not password:
from utils.settings import TAPO_USERNAME, TAPO_PASSWORD
username = TAPO_USERNAME
password = TAPO_PASSWORD
logger.debug(f"Verwende globale Tapo-Anmeldedaten für {ip_address}")
# TP-Link Tapo P100 Verbindung herstellen
p100 = PyP100.P100(ip_address, username, password)
p100.handshake() # Authentifizierung
p100.login() # Login
# Geräteinformationen abrufen
device_info = p100.getDeviceInfo()
result["success"] = True
result["message"] = "Verbindung erfolgreich"
result["device_info"] = device_info
logger.info(f"Tapo-Verbindung zu {ip_address} erfolgreich: {device_info.get('nickname', 'Unbekannt')}")
except Exception as e:
result["success"] = False
result["message"] = f"Verbindungsfehler: {str(e)}"
result["error"] = str(e)
logger.error(f"Fehler bei Tapo-Test zu {ip_address}: {str(e)}")
return result
# Scheduler-Instanz erzeugen
scheduler = BackgroundTaskScheduler()

View File

@ -18,8 +18,9 @@ import os
from models import get_db_session, Printer, PlugStatusLog
from utils.logging_config import get_logger
from utils.settings import PRINTERS, TAPO_USERNAME, TAPO_PASSWORD, DEFAULT_TAPO_IPS, TAPO_AUTO_DISCOVERY
from utils.tapo_controller import tapo_controller
# TP-Link Tapo P110 Unterstützung hinzufügen
# TP-Link Tapo P110 Unterstützung prüfen
try:
from PyP100 import PyP100
TAPO_AVAILABLE = True
@ -81,62 +82,10 @@ class PrinterMonitor:
if self.startup_initialized:
monitor_logger.info("🔄 Steckdosen bereits beim Start initialisiert")
return {}
monitor_logger.info("🚀 Starte Steckdosen-Initialisierung beim Programmstart...")
results = {}
try:
db_session = get_db_session()
printers = db_session.query(Printer).filter(Printer.active == True).all()
if not printers:
monitor_logger.warning("⚠️ Keine aktiven Drucker zur Initialisierung gefunden")
db_session.close()
self.startup_initialized = True
return results
# Alle Steckdosen ausschalten für einheitlichen Startzustand
for printer in printers:
try:
if printer.plug_ip and printer.plug_username and printer.plug_password:
success = self._turn_outlet_off(
printer.plug_ip,
printer.plug_username,
printer.plug_password,
printer_id=printer.id
)
results[printer.name] = success
if success:
monitor_logger.info(f"{printer.name}: Steckdose ausgeschaltet")
# Status in Datenbank aktualisieren
printer.status = "offline"
printer.last_checked = datetime.now()
else:
monitor_logger.warning(f"{printer.name}: Steckdose konnte nicht ausgeschaltet werden")
else:
monitor_logger.warning(f"⚠️ {printer.name}: Unvollständige Steckdosen-Konfiguration")
results[printer.name] = False
except Exception as e:
monitor_logger.error(f"❌ Fehler bei Initialisierung von {printer.name}: {str(e)}")
results[printer.name] = False
# Änderungen speichern
db_session.commit()
db_session.close()
success_count = sum(1 for success in results.values() if success)
total_count = len(results)
monitor_logger.info(f"🎯 Steckdosen-Initialisierung abgeschlossen: {success_count}/{total_count} erfolgreich")
self.startup_initialized = True
except Exception as e:
monitor_logger.error(f"❌ Kritischer Fehler bei Steckdosen-Initialisierung: {str(e)}")
results = {}
# Verwende zentrale tapo_controller Implementierung
results = tapo_controller.initialize_all_outlets()
self.startup_initialized = True
return results
def _turn_outlet_off(self, ip_address: str, username: str, password: str, timeout: int = 5, printer_id: int = None) -> bool:
@ -153,79 +102,8 @@ class PrinterMonitor:
Returns:
bool: True wenn erfolgreich ausgeschaltet
"""
if not TAPO_AVAILABLE:
monitor_logger.error("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdose nicht schalten")
# Logging: Fehlgeschlagener Versuch
if printer_id:
try:
PlugStatusLog.log_status_change(
printer_id=printer_id,
status="disconnected",
source="system",
ip_address=ip_address,
error_message="PyP100-Modul nicht verfügbar",
notes="Startup-Initialisierung fehlgeschlagen"
)
except Exception as log_error:
monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
return False
# IMMER globale Anmeldedaten verwenden (da diese funktionieren)
username = TAPO_USERNAME
password = TAPO_PASSWORD
monitor_logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip_address}")
start_time = time.time()
try:
# TP-Link Tapo P100 Verbindung herstellen (P100 statt P110)
from PyP100 import PyP100
p100 = PyP100.P100(ip_address, username, password)
p100.handshake() # Authentifizierung
p100.login() # Login
# Steckdose ausschalten
p100.turnOff()
response_time = int((time.time() - start_time) * 1000) # in Millisekunden
monitor_logger.debug(f"✅ Tapo-Steckdose {ip_address} erfolgreich ausgeschaltet")
# Logging: Erfolgreich ausgeschaltet
if printer_id:
try:
PlugStatusLog.log_status_change(
printer_id=printer_id,
status="off",
source="system",
ip_address=ip_address,
response_time_ms=response_time,
notes="Startup-Initialisierung: Steckdose ausgeschaltet"
)
except Exception as log_error:
monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
return True
except Exception as e:
response_time = int((time.time() - start_time) * 1000) # in Millisekunden
monitor_logger.debug(f"⚠️ Fehler beim Ausschalten der Tapo-Steckdose {ip_address}: {str(e)}")
# Logging: Fehlgeschlagener Versuch
if printer_id:
try:
PlugStatusLog.log_status_change(
printer_id=printer_id,
status="disconnected",
source="system",
ip_address=ip_address,
response_time_ms=response_time,
error_message=str(e),
notes="Startup-Initialisierung fehlgeschlagen"
)
except Exception as log_error:
monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
return False
# Verwende zentrale tapo_controller Implementierung
return tapo_controller.turn_off(ip_address, username, password, printer_id)
def get_live_printer_status(self, use_session_cache: bool = True) -> Dict[int, Dict]:
"""
@ -448,41 +326,8 @@ class PrinterMonitor:
Returns:
bool: True wenn Verbindung erfolgreich
"""
try:
# IP-Adresse validieren
ipaddress.ip_address(ip_address.strip())
import socket
# Erst Port 9999 versuchen (Tapo-Standard)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((ip_address.strip(), 9999))
sock.close()
if result == 0:
return True
# Falls Port 9999 nicht erfolgreich, Port 80 versuchen (HTTP)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((ip_address.strip(), 80))
sock.close()
if result == 0:
return True
# Falls Port 80 nicht erfolgreich, Port 443 versuchen (HTTPS)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((ip_address.strip(), 443))
sock.close()
return result == 0
except Exception as e:
monitor_logger.debug(f"❌ Fehler beim Verbindungstest zu {ip_address}: {str(e)}")
return False
# Verwende zentrale tapo_controller Implementierung
return tapo_controller.ping_address(ip_address, timeout)
def _check_outlet_status(self, ip_address: str, username: str, password: str, timeout: int = 5, printer_id: int = None) -> Tuple[bool, str]:
"""
@ -498,111 +343,8 @@ class PrinterMonitor:
Returns:
Tuple[bool, str]: (Erreichbar, Status) - Status: "on", "off", "unknown"
"""
if not TAPO_AVAILABLE:
monitor_logger.debug("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdosen-Status nicht abfragen")
# Logging: Modul nicht verfügbar
if printer_id:
try:
PlugStatusLog.log_status_change(
printer_id=printer_id,
status="disconnected",
source="system",
ip_address=ip_address,
error_message="PyP100-Modul nicht verfügbar",
notes="Status-Check fehlgeschlagen"
)
except Exception as log_error:
monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
return False, "unknown"
# IMMER globale Anmeldedaten verwenden (da diese funktionieren)
username = TAPO_USERNAME
password = TAPO_PASSWORD
monitor_logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip_address}")
start_time = time.time()
try:
# TP-Link Tapo P100 Verbindung herstellen (P100 statt P110)
from PyP100 import PyP100
p100 = PyP100.P100(ip_address, username, password)
p100.handshake() # Authentifizierung
p100.login() # Login
# Geräteinformationen abrufen
device_info = p100.getDeviceInfo()
# Status auswerten
device_on = device_info.get('device_on', False)
status = "on" if device_on else "off"
response_time = int((time.time() - start_time) * 1000) # in Millisekunden
monitor_logger.debug(f"✅ Tapo-Steckdose {ip_address}: Status = {status}")
# Logging: Erfolgreicher Status-Check
if printer_id:
try:
# Hole zusätzliche Geräteinformationen falls verfügbar
power_consumption = None
voltage = None
current = None
firmware_version = None
try:
# Versuche Energiedaten zu holen (P110 spezifisch)
energy_usage = p100.getEnergyUsage()
if energy_usage:
power_consumption = energy_usage.get('current_power', None)
voltage = energy_usage.get('voltage', None)
current = energy_usage.get('current', None)
except:
pass # P100 unterstützt keine Energiedaten
try:
firmware_version = device_info.get('fw_ver', None)
except:
pass
PlugStatusLog.log_status_change(
printer_id=printer_id,
status=status,
source="system",
ip_address=ip_address,
power_consumption=power_consumption,
voltage=voltage,
current=current,
response_time_ms=response_time,
firmware_version=firmware_version,
notes="Automatischer Status-Check"
)
except Exception as log_error:
monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
return True, status
except Exception as e:
response_time = int((time.time() - start_time) * 1000) # in Millisekunden
monitor_logger.debug(f"⚠️ Fehler bei Tapo-Steckdosen-Status-Check {ip_address}: {str(e)}")
# Logging: Fehlgeschlagener Status-Check
if printer_id:
try:
PlugStatusLog.log_status_change(
printer_id=printer_id,
status="disconnected",
source="system",
ip_address=ip_address,
response_time_ms=response_time,
error_message=str(e),
notes="Status-Check fehlgeschlagen"
)
except Exception as log_error:
monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
return False, "unknown"
# Verwende zentrale tapo_controller Implementierung
return tapo_controller.check_outlet_status(ip_address, username, password, printer_id)
def clear_all_caches(self):
"""Löscht alle Caches (Session und DB)."""
@ -657,94 +399,10 @@ class PrinterMonitor:
if self.auto_discovered_tapo:
monitor_logger.info("🔍 Tapo-Steckdosen wurden bereits erkannt")
return {}
monitor_logger.info("🔍 Starte automatische Tapo-Steckdosenerkennung...")
results = {}
start_time = time.time()
# 1. Zuerst die Standard-IPs aus der Konfiguration testen
monitor_logger.info(f"🔄 Teste {len(DEFAULT_TAPO_IPS)} Standard-IPs aus der Konfiguration")
for i, ip in enumerate(DEFAULT_TAPO_IPS):
try:
# Fortschrittsmeldung
monitor_logger.info(f"🔍 Teste IP {i+1}/{len(DEFAULT_TAPO_IPS)}: {ip}")
# Reduzierte Timeouts für schnellere Erkennung
ping_success = self._ping_address(ip, timeout=2)
if ping_success:
monitor_logger.info(f"✅ Steckdose mit IP {ip} ist erreichbar")
# Tapo-Verbindung testen mit Timeout-Schutz
if TAPO_AVAILABLE:
try:
# Timeout für Tapo-Verbindung
import signal
def timeout_handler(signum, frame):
raise TimeoutError("Tapo-Verbindung Timeout")
# Nur unter Unix/Linux verfügbar
if hasattr(signal, 'SIGALRM'):
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(5) # 5 Sekunden Timeout
try:
from PyP100 import PyP100
p100 = PyP100.P100(ip, TAPO_USERNAME, TAPO_PASSWORD)
p100.handshake()
p100.login()
device_info = p100.getDeviceInfo()
# Timeout zurücksetzen
if hasattr(signal, 'SIGALRM'):
signal.alarm(0)
# Steckdose gefunden und verbunden
nickname = device_info.get('nickname', f"Tapo P110 ({ip})")
state = "on" if device_info.get('device_on', False) else "off"
monitor_logger.info(f"✅ Tapo-Steckdose '{nickname}' ({ip}) gefunden - Status: {state}")
results[ip] = True
# Steckdose in Datenbank speichern/aktualisieren (nicht-blockierend)
try:
self._ensure_tapo_in_database(ip, nickname)
except Exception as db_error:
monitor_logger.warning(f"⚠️ Fehler beim Speichern in DB für {ip}: {str(db_error)}")
except (TimeoutError, Exception) as tapo_error:
if hasattr(signal, 'SIGALRM'):
signal.alarm(0) # Timeout zurücksetzen
monitor_logger.debug(f"❌ IP {ip} ist erreichbar, aber keine Tapo-Steckdose oder Timeout: {str(tapo_error)}")
results[ip] = False
except Exception as outer_error:
monitor_logger.debug(f"❌ Fehler bei Tapo-Test für {ip}: {str(outer_error)}")
results[ip] = False
else:
monitor_logger.warning("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Verbindung nicht testen")
results[ip] = False
else:
monitor_logger.debug(f"❌ IP {ip} nicht erreichbar")
results[ip] = False
except Exception as e:
monitor_logger.warning(f"❌ Fehler bei Steckdosen-Erkennung für IP {ip}: {str(e)}")
results[ip] = False
# Weiter mit nächster IP - nicht abbrechen
continue
# Erfolgsstatistik berechnen
success_count = sum(1 for success in results.values() if success)
elapsed_time = time.time() - start_time
monitor_logger.info(f"✅ Steckdosen-Erkennung abgeschlossen: {success_count}/{len(results)} Steckdosen gefunden in {elapsed_time:.1f}s")
# Markieren, dass automatische Erkennung durchgeführt wurde
# Verwende zentrale tapo_controller Implementierung
results = tapo_controller.auto_discover_outlets()
self.auto_discovered_tapo = True
return results
def _ensure_tapo_in_database(self, ip_address: str, nickname: str = None) -> bool:
@ -758,67 +416,8 @@ class PrinterMonitor:
Returns:
bool: True wenn erfolgreich in Datenbank gespeichert/aktualisiert
"""
try:
db_session = get_db_session()
# Prüfen, ob Drucker mit dieser IP bereits existiert
existing_printer = db_session.query(Printer).filter(Printer.plug_ip == ip_address).first()
if existing_printer:
# Drucker aktualisieren, falls nötig
if not existing_printer.plug_username or not existing_printer.plug_password:
existing_printer.plug_username = TAPO_USERNAME
existing_printer.plug_password = TAPO_PASSWORD
monitor_logger.info(f"✅ Drucker {existing_printer.name} mit Tapo-Anmeldedaten aktualisiert")
if nickname and existing_printer.name != nickname and "Tapo P110" not in existing_printer.name:
old_name = existing_printer.name
existing_printer.name = nickname
monitor_logger.info(f"✅ Drucker {old_name} umbenannt zu {nickname}")
# Drucker als aktiv markieren, da Tapo-Steckdose gefunden wurde
if not existing_printer.active:
existing_printer.active = True
monitor_logger.info(f"✅ Drucker {existing_printer.name} als aktiv markiert")
# Status aktualisieren
existing_printer.last_checked = datetime.now()
db_session.commit()
db_session.close()
return True
else:
# Neuen Drucker erstellen, falls keiner existiert
printer_name = nickname or f"Tapo P110 ({ip_address})"
mac_address = f"tapo:{ip_address.replace('.', '-')}" # Pseudo-MAC-Adresse
new_printer = Printer(
name=printer_name,
model="TP-Link Tapo P110",
location="Automatisch erkannt",
ip_address=ip_address, # Drucker-IP setzen wir gleich Steckdosen-IP
mac_address=mac_address,
plug_ip=ip_address,
plug_username=TAPO_USERNAME,
plug_password=TAPO_PASSWORD,
status="offline",
active=True,
last_checked=datetime.now()
)
db_session.add(new_printer)
db_session.commit()
monitor_logger.info(f"✅ Neuer Drucker '{printer_name}' mit Tapo-Steckdose {ip_address} erstellt")
db_session.close()
return True
except Exception as e:
monitor_logger.error(f"❌ Fehler beim Speichern der Tapo-Steckdose {ip_address}: {str(e)}")
try:
db_session.rollback()
db_session.close()
except:
pass
return False
# Verwende zentrale tapo_controller Implementierung
return tapo_controller._ensure_outlet_in_database(ip_address, nickname)
# Globale Instanz
printer_monitor = PrinterMonitor()

View File

@ -0,0 +1,655 @@
"""
TP-Link Tapo P110 Zentraler Controller für MYP Platform
Sammelt alle operativen Tapo-Steckdosen-Funktionalitäten an einem Ort.
"""
import time
import socket
import signal
import ipaddress
from datetime import datetime
from typing import Dict, Tuple, Optional, List, Any
from concurrent.futures import ThreadPoolExecutor, as_completed
from models import get_db_session, Printer, PlugStatusLog
from utils.logging_config import get_logger
from utils.settings import TAPO_USERNAME, TAPO_PASSWORD, DEFAULT_TAPO_IPS, TAPO_TIMEOUT, TAPO_RETRY_COUNT
# TP-Link Tapo P110 Unterstützung prüfen
try:
from PyP100 import PyP100
TAPO_AVAILABLE = True
except ImportError:
TAPO_AVAILABLE = False
# Logger initialisieren
logger = get_logger("tapo_controller")
class TapoController:
"""
Zentraler Controller für alle TP-Link Tapo P110 Operationen.
"""
def __init__(self):
"""Initialisiere den Tapo Controller."""
self.username = TAPO_USERNAME
self.password = TAPO_PASSWORD
self.timeout = TAPO_TIMEOUT
self.retry_count = TAPO_RETRY_COUNT
self.auto_discovered = False
if not TAPO_AVAILABLE:
logger.error("❌ PyP100-Modul nicht installiert - Tapo-Funktionalität eingeschränkt")
else:
logger.info("✅ Tapo Controller initialisiert")
def toggle_plug(self, ip: str, state: bool, username: str = None, password: str = None) -> bool:
"""
Schaltet eine TP-Link Tapo P100/P110-Steckdose ein oder aus.
Args:
ip: IP-Adresse der Steckdose
state: True = Ein, False = Aus
username: Benutzername (optional, nutzt Standard wenn nicht angegeben)
password: Passwort (optional, nutzt Standard wenn nicht angegeben)
Returns:
bool: True wenn erfolgreich geschaltet
"""
if not TAPO_AVAILABLE:
logger.error("❌ PyP100-Modul nicht installiert - Steckdose kann nicht geschaltet werden")
return False
# IMMER globale Anmeldedaten verwenden
username = self.username
password = self.password
logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip}")
for attempt in range(self.retry_count):
try:
# P100-Verbindung herstellen
p100 = PyP100.P100(ip, username, password)
p100.handshake()
p100.login()
# Steckdose schalten
if state:
p100.turnOn()
logger.info(f"✅ Tapo-Steckdose {ip} erfolgreich eingeschaltet")
else:
p100.turnOff()
logger.info(f"✅ Tapo-Steckdose {ip} erfolgreich ausgeschaltet")
return True
except Exception as e:
action = "ein" if state else "aus"
logger.warning(f"⚠️ Versuch {attempt+1}/{self.retry_count} fehlgeschlagen beim {action}schalten von {ip}: {str(e)}")
if attempt < self.retry_count - 1:
time.sleep(1) # Kurze Pause vor erneutem Versuch
else:
logger.error(f"❌ Fehler beim {action}schalten der Tapo-Steckdose {ip}: {str(e)}")
return False
def turn_off(self, ip: str, username: str = None, password: str = None, printer_id: int = None) -> bool:
"""
Schaltet eine TP-Link Tapo P110-Steckdose aus.
Args:
ip: IP-Adresse der Steckdose
username: Benutzername (optional)
password: Passwort (optional)
printer_id: ID des zugehörigen Druckers für Logging (optional)
Returns:
bool: True wenn erfolgreich ausgeschaltet
"""
if not TAPO_AVAILABLE:
logger.error("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdose nicht schalten")
self._log_plug_status(printer_id, "disconnected", ip, error_message="PyP100-Modul nicht verfügbar")
return False
# IMMER globale Anmeldedaten verwenden
username = self.username
password = self.password
start_time = time.time()
try:
# TP-Link Tapo P100 Verbindung herstellen
p100 = PyP100.P100(ip, username, password)
p100.handshake()
p100.login()
# Steckdose ausschalten
p100.turnOff()
response_time = int((time.time() - start_time) * 1000) # in Millisekunden
logger.debug(f"✅ Tapo-Steckdose {ip} erfolgreich ausgeschaltet")
# Logging: Erfolgreich ausgeschaltet
self._log_plug_status(printer_id, "off", ip, response_time_ms=response_time)
return True
except Exception as e:
response_time = int((time.time() - start_time) * 1000)
logger.debug(f"⚠️ Fehler beim Ausschalten der Tapo-Steckdose {ip}: {str(e)}")
# Logging: Fehlgeschlagener Versuch
self._log_plug_status(printer_id, "disconnected", ip,
response_time_ms=response_time,
error_message=str(e))
return False
def check_outlet_status(self, ip: str, username: str = None, password: str = None,
printer_id: int = None) -> Tuple[bool, str]:
"""
Überprüft den Status einer TP-Link Tapo P110-Steckdose.
Args:
ip: IP-Adresse der Steckdose
username: Benutzername (optional)
password: Passwort (optional)
printer_id: ID des zugehörigen Druckers für Logging (optional)
Returns:
Tuple[bool, str]: (Erreichbar, Status) - Status: "on", "off", "unknown"
"""
if not TAPO_AVAILABLE:
logger.debug("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdosen-Status nicht abfragen")
self._log_plug_status(printer_id, "disconnected", ip,
error_message="PyP100-Modul nicht verfügbar",
notes="Status-Check fehlgeschlagen")
return False, "unknown"
# IMMER globale Anmeldedaten verwenden
username = self.username
password = self.password
start_time = time.time()
try:
# TP-Link Tapo P100 Verbindung herstellen
p100 = PyP100.P100(ip, username, password)
p100.handshake()
p100.login()
# Geräteinformationen abrufen
device_info = p100.getDeviceInfo()
# Status auswerten
device_on = device_info.get('device_on', False)
status = "on" if device_on else "off"
response_time = int((time.time() - start_time) * 1000)
logger.debug(f"✅ Tapo-Steckdose {ip}: Status = {status}")
# Erweiterte Informationen sammeln
extra_info = self._collect_device_info(p100, device_info)
# Logging: Erfolgreicher Status-Check
self._log_plug_status(printer_id, status, ip,
response_time_ms=response_time,
power_consumption=extra_info.get('power_consumption'),
voltage=extra_info.get('voltage'),
current=extra_info.get('current'),
firmware_version=extra_info.get('firmware_version'),
notes="Automatischer Status-Check")
return True, status
except Exception as e:
response_time = int((time.time() - start_time) * 1000)
logger.debug(f"⚠️ Fehler bei Tapo-Steckdosen-Status-Check {ip}: {str(e)}")
# Logging: Fehlgeschlagener Status-Check
self._log_plug_status(printer_id, "disconnected", ip,
response_time_ms=response_time,
error_message=str(e),
notes="Status-Check fehlgeschlagen")
return False, "unknown"
def test_connection(self, ip: str, username: str = None, password: str = None) -> dict:
"""
Testet die Verbindung zu einer TP-Link Tapo P110-Steckdose.
Args:
ip: IP-Adresse der Steckdose
username: Benutzername (optional)
password: Passwort (optional)
Returns:
dict: Ergebnis mit Status und Informationen
"""
result = {
"success": False,
"message": "",
"device_info": None,
"error": None
}
if not TAPO_AVAILABLE:
result["message"] = "PyP100-Modul nicht verfügbar"
result["error"] = "ModuleNotFound"
logger.error("PyP100-Modul nicht verfügbar - kann Tapo-Steckdosen nicht testen")
return result
# Verwende globale Anmeldedaten falls nicht angegeben
if not username or not password:
username = self.username
password = self.password
logger.debug(f"Verwende globale Tapo-Anmeldedaten für {ip}")
try:
# TP-Link Tapo P100 Verbindung herstellen
p100 = PyP100.P100(ip, username, password)
p100.handshake()
p100.login()
# Geräteinformationen abrufen
device_info = p100.getDeviceInfo()
result["success"] = True
result["message"] = "Verbindung erfolgreich"
result["device_info"] = device_info
logger.info(f"Tapo-Verbindung zu {ip} erfolgreich: {device_info.get('nickname', 'Unbekannt')}")
except Exception as e:
result["success"] = False
result["message"] = f"Verbindungsfehler: {str(e)}"
result["error"] = str(e)
logger.error(f"Fehler bei Tapo-Test zu {ip}: {str(e)}")
return result
def ping_address(self, ip: str, timeout: int = 3) -> bool:
"""
Führt einen Konnektivitätstest zu einer IP-Adresse durch.
Verwendet TCP-Verbindung statt Ping für bessere Kompatibilität.
Args:
ip: Zu testende IP-Adresse
timeout: Timeout in Sekunden
Returns:
bool: True wenn Verbindung erfolgreich
"""
try:
# IP-Adresse validieren
ipaddress.ip_address(ip.strip())
# Standard-Ports für Tapo-Steckdosen testen
test_ports = [9999, 80, 443] # Tapo-Standard, HTTP, HTTPS
for port in test_ports:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((ip.strip(), port))
sock.close()
if result == 0:
logger.debug(f"✅ Verbindung zu {ip}:{port} erfolgreich")
return True
logger.debug(f"❌ Keine Verbindung zu {ip} auf Standard-Ports möglich")
return False
except Exception as e:
logger.debug(f"❌ Fehler beim Verbindungstest zu {ip}: {str(e)}")
return False
def auto_discover_outlets(self) -> Dict[str, bool]:
"""
Automatische Erkennung und Konfiguration von TP-Link Tapo P110-Steckdosen im Netzwerk.
Returns:
Dict[str, bool]: Ergebnis der Steckdosenerkennung mit IP als Schlüssel
"""
if self.auto_discovered:
logger.info("🔍 Tapo-Steckdosen wurden bereits erkannt")
return {}
logger.info("🔍 Starte automatische Tapo-Steckdosenerkennung...")
results = {}
start_time = time.time()
# Standard-IPs aus der Konfiguration testen
logger.info(f"🔄 Teste {len(DEFAULT_TAPO_IPS)} Standard-IPs aus der Konfiguration")
for i, ip in enumerate(DEFAULT_TAPO_IPS):
try:
logger.info(f"🔍 Teste IP {i+1}/{len(DEFAULT_TAPO_IPS)}: {ip}")
# Schneller Ping-Test
if self.ping_address(ip, timeout=2):
logger.info(f"✅ Steckdose mit IP {ip} ist erreichbar")
# Tapo-Verbindung testen
test_result = self.test_connection(ip)
if test_result["success"]:
device_info = test_result["device_info"]
nickname = device_info.get('nickname', f"Tapo P110 ({ip})")
state = "on" if device_info.get('device_on', False) else "off"
logger.info(f"✅ Tapo-Steckdose '{nickname}' ({ip}) gefunden - Status: {state}")
results[ip] = True
# Steckdose in Datenbank speichern/aktualisieren
try:
self._ensure_outlet_in_database(ip, nickname)
except Exception as db_error:
logger.warning(f"⚠️ Fehler beim Speichern in DB für {ip}: {str(db_error)}")
else:
logger.debug(f"❌ IP {ip} ist erreichbar, aber keine Tapo-Steckdose")
results[ip] = False
else:
logger.debug(f"❌ IP {ip} nicht erreichbar")
results[ip] = False
except Exception as e:
logger.warning(f"❌ Fehler bei Steckdosen-Erkennung für IP {ip}: {str(e)}")
results[ip] = False
continue
# Erfolgsstatistik
success_count = sum(1 for success in results.values() if success)
elapsed_time = time.time() - start_time
logger.info(f"✅ Steckdosen-Erkennung abgeschlossen: {success_count}/{len(results)} Steckdosen gefunden in {elapsed_time:.1f}s")
self.auto_discovered = True
return results
def initialize_all_outlets(self) -> Dict[str, bool]:
"""
Schaltet alle gespeicherten Steckdosen aus (einheitlicher Startzustand).
Returns:
Dict[str, bool]: Ergebnis der Initialisierung pro Drucker
"""
logger.info("🚀 Starte Steckdosen-Initialisierung...")
results = {}
try:
db_session = get_db_session()
printers = db_session.query(Printer).filter(Printer.active == True).all()
if not printers:
logger.warning("⚠️ Keine aktiven Drucker zur Initialisierung gefunden")
db_session.close()
return results
# Alle Steckdosen ausschalten
for printer in printers:
try:
if printer.plug_ip:
success = self.turn_off(
printer.plug_ip,
printer_id=printer.id
)
results[printer.name] = success
if success:
logger.info(f"{printer.name}: Steckdose ausgeschaltet")
printer.status = "offline"
printer.last_checked = datetime.now()
else:
logger.warning(f"{printer.name}: Steckdose konnte nicht ausgeschaltet werden")
else:
logger.warning(f"⚠️ {printer.name}: Keine Steckdosen-IP konfiguriert")
results[printer.name] = False
except Exception as e:
logger.error(f"❌ Fehler bei Initialisierung von {printer.name}: {str(e)}")
results[printer.name] = False
# Änderungen speichern
db_session.commit()
db_session.close()
success_count = sum(1 for success in results.values() if success)
total_count = len(results)
logger.info(f"🎯 Steckdosen-Initialisierung abgeschlossen: {success_count}/{total_count} erfolgreich")
except Exception as e:
logger.error(f"❌ Kritischer Fehler bei Steckdosen-Initialisierung: {str(e)}")
return results
def get_all_outlet_status(self) -> Dict[str, Dict[str, Any]]:
"""
Holt den Status aller konfigurierten Tapo-Steckdosen.
Returns:
Dict[str, Dict]: Status aller Steckdosen mit IP als Schlüssel
"""
status_dict = {}
try:
db_session = get_db_session()
printers = db_session.query(Printer).filter(
Printer.active == True,
Printer.plug_ip.isnot(None)
).all()
if not printers:
logger.info(" Keine Drucker mit Tapo-Steckdosen konfiguriert")
db_session.close()
return status_dict
logger.info(f"🔍 Prüfe Status von {len(printers)} Tapo-Steckdosen...")
# Parallel-Status-Prüfung
with ThreadPoolExecutor(max_workers=min(len(printers), 8)) as executor:
future_to_printer = {
executor.submit(
self.check_outlet_status,
printer.plug_ip,
printer_id=printer.id
): printer
for printer in printers
}
for future in as_completed(future_to_printer, timeout=15):
printer = future_to_printer[future]
try:
reachable, status = future.result()
status_dict[printer.plug_ip] = {
"printer_name": printer.name,
"printer_id": printer.id,
"reachable": reachable,
"status": status,
"ip": printer.plug_ip,
"last_checked": datetime.now().isoformat()
}
except Exception as e:
logger.error(f"❌ Fehler bei Status-Check für {printer.name}: {str(e)}")
status_dict[printer.plug_ip] = {
"printer_name": printer.name,
"printer_id": printer.id,
"reachable": False,
"status": "error",
"ip": printer.plug_ip,
"error": str(e),
"last_checked": datetime.now().isoformat()
}
db_session.close()
logger.info(f"✅ Status-Update abgeschlossen für {len(status_dict)} Steckdosen")
except Exception as e:
logger.error(f"❌ Kritischer Fehler beim Abrufen des Steckdosen-Status: {str(e)}")
return status_dict
def _collect_device_info(self, p100: PyP100.P100, device_info: dict) -> dict:
"""
Sammelt erweiterte Geräteinformationen von der Tapo-Steckdose.
Args:
p100: PyP100-Instanz
device_info: Basis-Geräteinformationen
Returns:
dict: Erweiterte Informationen
"""
extra_info = {}
try:
# Firmware-Version
extra_info['firmware_version'] = device_info.get('fw_ver', None)
# Versuche Energiedaten zu holen (nur P110)
try:
energy_usage = p100.getEnergyUsage()
if energy_usage:
extra_info['power_consumption'] = energy_usage.get('current_power', None)
extra_info['voltage'] = energy_usage.get('voltage', None)
extra_info['current'] = energy_usage.get('current', None)
except:
pass # P100 unterstützt keine Energiedaten
except Exception as e:
logger.debug(f"Fehler beim Sammeln erweiterter Geräteinformationen: {str(e)}")
return extra_info
def _log_plug_status(self, printer_id: int, status: str, ip_address: str, **kwargs):
"""
Protokolliert Steckdosen-Status in der Datenbank.
Args:
printer_id: ID des Druckers
status: Status der Steckdose
ip_address: IP-Adresse der Steckdose
**kwargs: Zusätzliche Parameter für das Logging
"""
if not printer_id:
return
try:
PlugStatusLog.log_status_change(
printer_id=printer_id,
status=status,
source="system",
ip_address=ip_address,
**kwargs
)
except Exception as e:
logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {e}")
def _ensure_outlet_in_database(self, ip_address: str, nickname: str = None) -> bool:
"""
Stellt sicher, dass eine erkannte Tapo-Steckdose in der Datenbank existiert.
Args:
ip_address: IP-Adresse der Steckdose
nickname: Name der Steckdose (optional)
Returns:
bool: True wenn erfolgreich gespeichert/aktualisiert
"""
try:
db_session = get_db_session()
# Prüfen, ob Drucker mit dieser IP bereits existiert
existing_printer = db_session.query(Printer).filter(
Printer.plug_ip == ip_address
).first()
if existing_printer:
# Drucker aktualisieren
if not existing_printer.plug_username or not existing_printer.plug_password:
existing_printer.plug_username = self.username
existing_printer.plug_password = self.password
logger.info(f"✅ Drucker {existing_printer.name} mit Tapo-Anmeldedaten aktualisiert")
if nickname and existing_printer.name != nickname and "Tapo P110" not in existing_printer.name:
old_name = existing_printer.name
existing_printer.name = nickname
logger.info(f"✅ Drucker {old_name} umbenannt zu {nickname}")
# Drucker als aktiv markieren
if not existing_printer.active:
existing_printer.active = True
logger.info(f"✅ Drucker {existing_printer.name} als aktiv markiert")
existing_printer.last_checked = datetime.now()
db_session.commit()
db_session.close()
return True
else:
# Neuen Drucker erstellen
printer_name = nickname or f"Tapo P110 ({ip_address})"
mac_address = f"tapo:{ip_address.replace('.', '-')}"
new_printer = Printer(
name=printer_name,
model="TP-Link Tapo P110",
location="Automatisch erkannt",
ip_address=ip_address,
mac_address=mac_address,
plug_ip=ip_address,
plug_username=self.username,
plug_password=self.password,
status="offline",
active=True,
last_checked=datetime.now()
)
db_session.add(new_printer)
db_session.commit()
logger.info(f"✅ Neuer Drucker '{printer_name}' mit Tapo-Steckdose {ip_address} erstellt")
db_session.close()
return True
except Exception as e:
logger.error(f"❌ Fehler beim Speichern der Tapo-Steckdose {ip_address}: {str(e)}")
try:
db_session.rollback()
db_session.close()
except:
pass
return False
# Globale Instanz für einfachen Zugriff
tapo_controller = TapoController()
# Convenience-Funktionen für Rückwärtskompatibilität
def toggle_plug(ip: str, state: bool, username: str = None, password: str = None) -> bool:
"""Schaltet eine Tapo-Steckdose ein/aus."""
return tapo_controller.toggle_plug(ip, state, username, password)
def test_tapo_connection(ip: str, username: str = None, password: str = None) -> dict:
"""Testet die Verbindung zu einer Tapo-Steckdose."""
return tapo_controller.test_connection(ip, username, password)
def check_outlet_status(ip: str, username: str = None, password: str = None,
printer_id: int = None) -> Tuple[bool, str]:
"""Prüft den Status einer Tapo-Steckdose."""
return tapo_controller.check_outlet_status(ip, username, password, printer_id)
def auto_discover_tapo_outlets() -> Dict[str, bool]:
"""Führt automatische Erkennung von Tapo-Steckdosen durch."""
return tapo_controller.auto_discover_outlets()
def initialize_all_outlets() -> Dict[str, bool]:
"""Initialisiert alle Tapo-Steckdosen (schaltet sie aus)."""
return tapo_controller.initialize_all_outlets()

View File

@ -358,7 +358,7 @@ def run_comprehensive_test():
all_results.update(test_api_endpoints())
print()
# Ergebnisse zusammenfassen
# ergebnisse zusammenfassen
print("=" * 70)
print("📊 TESTERGEBNISSE ZUSAMMENFASSUNG")
print("=" * 70)