🎉 Improved IHK Project Documentation with Screenshots & Videos 📚
This commit is contained in:
@ -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
|
||||
|
||||
|
BIN
backend/docs/Testprotokoll_Kompakt_20250605_003014.docx
Normal file
BIN
backend/docs/Testprotokoll_Kompakt_20250605_003014.docx
Normal file
Binary file not shown.
BIN
backend/docs/Testprotokoll_Kompakt_20250605_003014.pdf
Normal file
BIN
backend/docs/Testprotokoll_Kompakt_20250605_003014.pdf
Normal file
Binary file not shown.
@ -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.
Binary file not shown.
@ -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
|
||||
|
@ -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}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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...
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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...
|
||||
|
@ -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 - ==================================================
|
||||
|
@ -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...
|
||||
|
@ -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
|
||||
|
83
backend/netzwerkdiagramm.mmd
Normal file
83
backend/netzwerkdiagramm.mmd
Normal 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
|
1
backend/netzwerkdiagramm.svg
Normal file
1
backend/netzwerkdiagramm.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 40 KiB |
@ -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()
|
||||
|
||||
|
@ -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()
|
655
backend/utils/tapo_controller.py
Normal file
655
backend/utils/tapo_controller.py
Normal 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()
|
@ -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)
|
||||
|
Reference in New Issue
Block a user