From cbea4cb76539d822013cbade9c66d4fe9baa9bf3 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Fri, 20 Jun 2025 08:36:07 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=89=20Feature:=20Enhanced=20Admin=20Gu?= =?UTF-8?q?est=20Requests=20API=20&=20Startup=20Initialization=20Documenta?= =?UTF-8?q?tion=20=F0=9F=93=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/DOCS/ADMIN_GUEST_REQUESTS_API_FIX.md | 1 + .../STECKDOSEN_STARTUP_INITIALISIERUNG.md | 1 + backend/app.py | 22 + backend/backend/database/myp.db | Bin 102400 -> 102400 bytes backend/logs/admin/admin.log | 19 + backend/logs/admin_api/admin_api.log | 1 + backend/logs/app/app.log | 562 ++++++++++++++++++ backend/logs/core_system/core_system.log | 12 + .../logs/data_management/data_management.log | 12 + .../drucker_steuerung/drucker_steuerung.log | 5 + .../energy_monitoring/energy_monitoring.log | 7 + .../hardware_integration.log | 76 +++ .../job_queue_system/job_queue_system.log | 21 + .../monitoring_analytics.log | 10 + backend/logs/permissions/permissions.log | 11 + backend/logs/scheduler/scheduler.log | 71 +++ .../logs/security_suite/security_suite.log | 18 + backend/logs/startup/startup.log | 45 ++ .../utilities_collection.log | 16 + backend/logs/windows_fixes/windows_fixes.log | 12 + backend/scripts/diagnose_tapo.py | 281 +++++++++ backend/static/js/admin-guest-requests.js | 23 +- backend/templates/base.html | 4 +- .../hardware_integration.cpython-313.pyc | Bin 20954 -> 29677 bytes .../__pycache__/job_scheduler.cpython-313.pyc | Bin 33809 -> 40801 bytes backend/utils/hardware_integration.py | 292 +++++++-- backend/utils/job_scheduler.py | 183 ++++++ 27 files changed, 1653 insertions(+), 52 deletions(-) create mode 100644 backend/DOCS/ADMIN_GUEST_REQUESTS_API_FIX.md create mode 100644 backend/DOCS/STECKDOSEN_STARTUP_INITIALISIERUNG.md create mode 100644 backend/scripts/diagnose_tapo.py diff --git a/backend/DOCS/ADMIN_GUEST_REQUESTS_API_FIX.md b/backend/DOCS/ADMIN_GUEST_REQUESTS_API_FIX.md new file mode 100644 index 000000000..0519ecba6 --- /dev/null +++ b/backend/DOCS/ADMIN_GUEST_REQUESTS_API_FIX.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend/DOCS/STECKDOSEN_STARTUP_INITIALISIERUNG.md b/backend/DOCS/STECKDOSEN_STARTUP_INITIALISIERUNG.md new file mode 100644 index 000000000..0519ecba6 --- /dev/null +++ b/backend/DOCS/STECKDOSEN_STARTUP_INITIALISIERUNG.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend/app.py b/backend/app.py index 03b45bc63..502cdb7e1 100644 --- a/backend/app.py +++ b/backend/app.py @@ -1946,6 +1946,28 @@ def main(): if scheduler: scheduler.start() app_logger.info("[STARTUP] ✅ Job Scheduler gestartet") + + # Steckdosen beim Systemstart initialisieren + app_logger.info("[STARTUP] Initialisiere Steckdosen (alle auf 'aus' = frei)...") + try: + initialization_results = scheduler.initialize_all_outlets_on_startup() + + if initialization_results: + success_count = sum(1 for result in initialization_results.values() if result.get('success', False)) + total_count = len(initialization_results) + + if success_count == total_count: + app_logger.info(f"[STARTUP] ✅ Alle {total_count} Steckdosen erfolgreich initialisiert") + elif success_count > 0: + app_logger.info(f"[STARTUP] ⚡ {success_count}/{total_count} Steckdosen erfolgreich initialisiert") + else: + app_logger.warning(f"[STARTUP] ⚠️ Keine der {total_count} Steckdosen konnte initialisiert werden") + else: + app_logger.info("[STARTUP] ℹ️ Keine Steckdosen zur Initialisierung gefunden") + + except Exception as e: + app_logger.warning(f"[STARTUP] ⚠️ Fehler bei Steckdosen-Initialisierung: {str(e)}") + else: app_logger.warning("[STARTUP] ⚠️ Job Scheduler nicht verfügbar") diff --git a/backend/backend/database/myp.db b/backend/backend/database/myp.db index 746ff98bc9e610fb56db8ab0d46982745b4c38c9..caeab6b2c1026a94afc28187edc894598a8f45ac 100644 GIT binary patch delta 804 zcmYk4&1(}u7{+&!W}!)&5rZC#U=G$cUz^E%?QBj~Q8daXQUej~7u9GWB&Z-1ly*UK z5Q^6M2kJ$7)e7|_J&GcVEgHd6Ja{u8UV4%`nO3^Dc^{s6=J&qu%rBYqOXia}XfGZ; z4cafJ{#vXtTB@9#ot`POv2&-&GfuTtJzpwa#+B>0Di@1a#AquwcGIoXT-~;3-G*DO z;<0J@G*=iPv_O%Cu;7@ibaKf=Y%pz@k*+Z?7wN)g^n0{8_+Pj|+3`orKj zKwrEcv}!eVykYu_kiY2j7eRj!Sl!8iP&phkhYWZ>x*feEqn{FL1KXjX2h?P@lD$#) zCM%H0+w$bP3y^%go(}T@VU{B(qw>d>63EH?*K|aS0&_!`i3o>%8v!@cq9E2p=azR=VqB4+8ICK4>}qTQbOZkYoNnLk delta 489 zcmZozz}B#UZGtpo;6xc`#=wmUfAvgFy_^H}^8-!I^ir}6e2q-=js429Q;qZVtGoXX%+O%-4Sh`oVFm^UHlBJ0 zo_hX#zI%MWynA@HH#Z7g;pXRW)L`UikT=#=XHaKgkeu8b z`vgMT+|0-rXcH4enmq<2?H;4U12x>-z{t#KQv%Zgp)U+<{3}@bSMWdQzr}x+{{a7% zi4)7VcPTJx@q2T#NOCgf=jCMPrLrNhSy_=dEG$SIW@aP~6B964xj7;FxBu5?WDO8t n<9W=$U&HsEuZZ_8ZwAj}U?`vGVQyqnncRO_ce`*e<69;GFhqrj diff --git a/backend/logs/admin/admin.log b/backend/logs/admin/admin.log index 763e8bd32..aa356f91b 100644 --- a/backend/logs/admin/admin.log +++ b/backend/logs/admin/admin.log @@ -1855,3 +1855,22 @@ jinja2.exceptions.UndefinedError: 'maintenance_info' is undefined 2025-06-20 08:19:36 - [admin] admin - [INFO] INFO - Tapo-Monitoring aufgerufen von admin 2025-06-20 08:19:39 - [admin] admin - [INFO] INFO - Tapo-Monitoring geladen: 6 Steckdosen, 0 online 2025-06-20 08:19:42 - [admin] admin - [INFO] INFO - Admin-Check für Funktion api_admin_tapo_health_check: User authenticated: True, User ID: 1, Is Admin: True +2025-06-20 08:20:20 - [admin] admin - [INFO] INFO - Admin-Check für Funktion tapo_monitoring: User authenticated: True, User ID: 1, Is Admin: True +2025-06-20 08:20:20 - [admin] admin - [INFO] INFO - Tapo-Monitoring aufgerufen von admin +2025-06-20 08:20:20 - [admin] admin - [INFO] INFO - Admin-Check für Funktion tapo_monitoring: User authenticated: True, User ID: 1, Is Admin: True +2025-06-20 08:20:20 - [admin] admin - [INFO] INFO - Tapo-Monitoring aufgerufen von admin +2025-06-20 08:20:23 - [admin] admin - [INFO] INFO - Tapo-Monitoring geladen: 6 Steckdosen, 0 online +2025-06-20 08:20:23 - [admin] admin - [INFO] INFO - Tapo-Monitoring geladen: 6 Steckdosen, 0 online +2025-06-20 08:22:15 - [admin] admin - [INFO] INFO - Admin-Check für Funktion admin_dashboard: User authenticated: True, User ID: 1, Is Admin: True +2025-06-20 08:22:15 - [admin] admin - [INFO] INFO - Admin-Dashboard geladen von admin +2025-06-20 08:22:15 - [admin] admin - [ERROR] ERROR - Fehler beim Laden des Admin-Dashboards: 'dict object' has no attribute 'online_printers' +2025-06-20 08:22:15 - [admin] admin - [INFO] INFO - Admin-Check für Funktion api_admin_live_stats: User authenticated: True, User ID: 1, Is Admin: True +2025-06-20 08:22:15 - [admin] admin - [INFO] INFO - Admin-Check für Funktion get_system_status_api: User authenticated: True, User ID: 1, Is Admin: True +2025-06-20 08:22:16 - [admin] admin - [INFO] INFO - System-Status abgerufen von admin +2025-06-20 08:22:17 - [admin] admin - [INFO] INFO - Admin-Check für Funktion guest_requests: User authenticated: True, User ID: 1, Is Admin: True +2025-06-20 08:22:48 - [admin] admin - [INFO] INFO - Admin-Check für Funktion get_guest_requests_api: User authenticated: True, User ID: 1, Is Admin: True +2025-06-20 08:22:48 - [admin] admin - [INFO] INFO - Gastanfragen abgerufen: 0 Einträge für Admin Administrator +2025-06-20 08:23:18 - [admin] admin - [INFO] INFO - Admin-Check für Funktion get_guest_requests_api: User authenticated: True, User ID: 1, Is Admin: True +2025-06-20 08:23:18 - [admin] admin - [INFO] INFO - Gastanfragen abgerufen: 0 Einträge für Admin Administrator +2025-06-20 08:23:48 - [admin] admin - [INFO] INFO - Admin-Check für Funktion get_guest_requests_api: User authenticated: True, User ID: 1, Is Admin: True +2025-06-20 08:23:48 - [admin] admin - [INFO] INFO - Gastanfragen abgerufen: 0 Einträge für Admin Administrator diff --git a/backend/logs/admin_api/admin_api.log b/backend/logs/admin_api/admin_api.log index 379b9ee06..bd1502eb2 100644 --- a/backend/logs/admin_api/admin_api.log +++ b/backend/logs/admin_api/admin_api.log @@ -704,3 +704,4 @@ 2025-06-20 08:19:42 - [admin_api] admin_api - [ERROR] ERROR - Fehler beim Gesundheitscheck für Drucker 5: 'DruckerSteuerung' object has no attribute 'ping_address' 2025-06-20 08:19:42 - [admin_api] admin_api - [ERROR] ERROR - Fehler beim Gesundheitscheck für Drucker 6: 'DruckerSteuerung' object has no attribute 'ping_address' 2025-06-20 08:19:42 - [admin_api] admin_api - [INFO] INFO - Tapo-Gesundheitscheck abgeschlossen: {'total': 6, 'healthy': 0, 'warning': 0, 'critical': 6} +2025-06-20 08:22:15 - [admin_api] admin_api - [INFO] INFO - Live-Statistiken abgerufen von Admin admin diff --git a/backend/logs/app/app.log b/backend/logs/app/app.log index ec545e1f1..9f3ad7770 100644 --- a/backend/logs/app/app.log +++ b/backend/logs/app/app.log @@ -58774,3 +58774,565 @@ WHERE users.role = ?] 2025-06-20 08:19:39 - [app] app - [DEBUG] DEBUG - Response: 2025-06-20 08:19:42 - [app] app - [DEBUG] DEBUG - Request: 2025-06-20 08:19:42 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:20:14 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: backend/database/myp.db +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [CONFIG] Erkannte Umgebung: +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [CONFIG] Production-Modus: +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [CONFIG] Verwende Development-Konfiguration +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [DEVELOPMENT] Aktiviere Development-Konfiguration +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Konfiguration aktiviert +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Environment: +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Debug Mode: +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ SQL Echo: +2025-06-20 08:20:16 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-20 08:20:16 - [app] app - [WARNING] WARNING - Fehler beim Korrigieren der Admin-Berechtigungen: +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] 🚀 Starte MYP -Umgebung +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] 🏢 +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] 🔒 Air-Gapped: +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] Initialisiere Datenbank... +2025-06-20 08:20:16 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] ✅ Datenbank initialisiert +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] Prüfe Initial-Admin... +2025-06-20 08:20:16 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) wurde angelegt. +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] ✅ Admin-Benutzer geprüft +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] Initialisiere statische Drucker... +2025-06-20 08:20:16 - [app] app - [INFO] INFO - Drucker erstellt: Drucker 1 (192.168.0.100) +2025-06-20 08:20:16 - [app] app - [INFO] INFO - Drucker erstellt: Drucker 2 (192.168.0.101) +2025-06-20 08:20:16 - [app] app - [INFO] INFO - Drucker erstellt: Drucker 3 (192.168.0.102) +2025-06-20 08:20:16 - [app] app - [INFO] INFO - Drucker erstellt: Drucker 4 (192.168.0.103) +2025-06-20 08:20:16 - [app] app - [INFO] INFO - Drucker erstellt: Drucker 5 (192.168.0.104) +2025-06-20 08:20:16 - [app] app - [INFO] INFO - Drucker erstellt: Drucker 6 (192.168.0.106) +2025-06-20 08:20:16 - [app] app - [INFO] INFO - ✅ Statische Drucker-Initialisierung abgeschlossen: 6 erstellt, 0 aktualisiert +2025-06-20 08:20:16 - [app] app - [INFO] INFO - 📍 Alle Drucker sind für Standort 'TBA Marienfelde' konfiguriert +2025-06-20 08:20:16 - [app] app - [INFO] INFO - 🌐 IP-Bereich: 192.168.0.100-106 (außer .105) +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] ✅ Statische Drucker konfiguriert +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] Starte Queue Manager... +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] ✅ Queue Manager gestartet +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] Starte Job Scheduler... +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] ✅ Job Scheduler gestartet +2025-06-20 08:20:16 - [app] app - [INFO] INFO - [STARTUP] 🌐 Server startet auf http://: +2025-06-20 08:20:18 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: backend/database/myp.db +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [CONFIG] Erkannte Umgebung: +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [CONFIG] Production-Modus: +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [CONFIG] Verwende Development-Konfiguration +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [DEVELOPMENT] Aktiviere Development-Konfiguration +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Konfiguration aktiviert +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Environment: +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Debug Mode: +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ SQL Echo: +2025-06-20 08:20:19 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-20 08:20:19 - [app] app - [INFO] INFO - Admin-Berechtigungen beim Start korrigiert: erstellt, aktualisiert +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [STARTUP] 🚀 Starte MYP -Umgebung +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [STARTUP] 🏢 +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [STARTUP] 🔒 Air-Gapped: +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [STARTUP] Initialisiere Datenbank... +2025-06-20 08:20:19 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [STARTUP] ✅ Datenbank initialisiert +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [STARTUP] Prüfe Initial-Admin... +2025-06-20 08:20:19 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [STARTUP] ✅ Admin-Benutzer geprüft +2025-06-20 08:20:19 - [app] app - [INFO] INFO - [STARTUP] Initialisiere statische Drucker... +2025-06-20 08:20:19 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 1 (192.168.0.100) +2025-06-20 08:20:19 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 2 (192.168.0.101) +2025-06-20 08:20:19 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 3 (192.168.0.102) +2025-06-20 08:20:19 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 4 (192.168.0.103) +2025-06-20 08:20:19 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 5 (192.168.0.104) +2025-06-20 08:20:19 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 6 (192.168.0.106) +2025-06-20 08:20:20 - [app] app - [INFO] INFO - ✅ Statische Drucker-Initialisierung abgeschlossen: 0 erstellt, 6 aktualisiert +2025-06-20 08:20:20 - [app] app - [INFO] INFO - 📍 Alle Drucker sind für Standort 'TBA Marienfelde' konfiguriert +2025-06-20 08:20:20 - [app] app - [INFO] INFO - 🌐 IP-Bereich: 192.168.0.100-106 (außer .105) +2025-06-20 08:20:20 - [app] app - [INFO] INFO - [STARTUP] ✅ Statische Drucker konfiguriert +2025-06-20 08:20:20 - [app] app - [INFO] INFO - [STARTUP] Starte Queue Manager... +2025-06-20 08:20:20 - [app] app - [INFO] INFO - [STARTUP] ✅ Queue Manager gestartet +2025-06-20 08:20:20 - [app] app - [INFO] INFO - [STARTUP] Starte Job Scheduler... +2025-06-20 08:20:20 - [app] app - [INFO] INFO - [STARTUP] ✅ Job Scheduler gestartet +2025-06-20 08:20:20 - [app] app - [INFO] INFO - [STARTUP] 🌐 Server startet auf http://: +2025-06-20 08:20:23 - [app] app - [INFO] INFO - Locating template 'admin_tapo_monitoring.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\admin_tapo_monitoring.html') +2025-06-20 08:20:23 - [app] app - [INFO] INFO - Locating template 'base.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\base.html') +2025-06-20 08:20:23 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:20:23 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:20:23 - [app] app - [ERROR] ERROR - Fehler beim Laden des Benutzers : +2025-06-20 08:20:23 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:20:23 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:20:33 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:20:33 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system +2025-06-20 08:20:33 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:20:33 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system +2025-06-20 08:20:33 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:20:33 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system +2025-06-20 08:20:33 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:20:34 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system +2025-06-20 08:20:34 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:20:36 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system +2025-06-20 08:20:36 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:20:36 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system +2025-06-20 08:20:36 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:20:36 - [app] app - [DEBUG] DEBUG - ✅ Status-Updates für Drucker erfolgreich gespeichert +2025-06-20 08:20:36 - [app] app - [INFO] INFO - Locating template 'printers.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\printers.html') +2025-06-20 08:20:36 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:20:37 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:20:37 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:20:44 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:20:44 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system +2025-06-20 08:20:44 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:20:44 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system +2025-06-20 08:20:44 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:20:44 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system +2025-06-20 08:20:44 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:20:45 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system +2025-06-20 08:20:45 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:20:47 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system +2025-06-20 08:20:47 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:20:47 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system +2025-06-20 08:20:47 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:20:47 - [app] app - [DEBUG] DEBUG - ✅ Status-Updates für Drucker erfolgreich gespeichert +2025-06-20 08:20:47 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:20:47 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:20:47 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:20:58 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:20:58 - [app] app - [INFO] INFO - Locating template 'energy_dashboard.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\energy_dashboard.html') +2025-06-20 08:20:58 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:21:11 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:21:11 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:21:11 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:21:11 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:21:15 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:21:15 - [app] app - [INFO] INFO - Locating template 'energy_device_details.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\energy_device_details.html') +2025-06-20 08:21:15 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:21:16 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:21:16 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:21:16 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:21:16 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:21:16 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:21:16 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:21:16 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:21:16 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:21:16 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:21:16 - [app] app - [INFO] INFO - Locating template 'dashboard.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\dashboard.html') +2025-06-20 08:21:16 - [app] app - [INFO] INFO - Locating template 'macros/ui_components.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\macros\\ui_components.html') +2025-06-20 08:21:16 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:21:22 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:21:22 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system +2025-06-20 08:21:22 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:21:22 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system +2025-06-20 08:21:22 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:21:23 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system +2025-06-20 08:21:23 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:21:23 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system +2025-06-20 08:21:23 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:21:25 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system +2025-06-20 08:21:25 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:21:25 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system +2025-06-20 08:21:25 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:21:25 - [app] app - [DEBUG] DEBUG - ✅ Status-Updates für Drucker erfolgreich gespeichert +2025-06-20 08:21:25 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:21:26 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:21:26 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:21:56 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:21:56 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:22:15 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:22:15 - [app] app - [INFO] INFO - Locating template 'admin.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\admin.html') +2025-06-20 08:22:15 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:22:15 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:22:15 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:22:15 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:22:15 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:22:15 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:22:16 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:22:17 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:22:17 - [app] app - [INFO] INFO - Locating template 'admin_guest_requests.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\admin_guest_requests.html') +2025-06-20 08:22:17 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:22:18 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:22:18 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:22:18 - [app] app - [ERROR] ERROR - Fehler beim Laden des Benutzers : +2025-06-20 08:22:18 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:22:18 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:22:18 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:22:18 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:22:18 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:22:18 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:22:18 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:22:18 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:22:30 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:22:30 - [app] app - [INFO] INFO - Not Found (404): +2025-06-20 08:22:30 - [app] app - [INFO] INFO - Locating template 'errors/404.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\errors\\404.html') +2025-06-20 08:22:30 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:22:48 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:22:48 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:22:48 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:22:48 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:23:18 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:23:18 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:23:18 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:23:18 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:23:48 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:23:48 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:23:48 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:23:48 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:24:07 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:24:08 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system +2025-06-20 08:24:08 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:08 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system +2025-06-20 08:24:08 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:08 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system +2025-06-20 08:24:08 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:08 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system +2025-06-20 08:24:08 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:10 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system +2025-06-20 08:24:10 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:10 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system +2025-06-20 08:24:10 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:10 - [app] app - [DEBUG] DEBUG - ✅ Status-Updates für Drucker erfolgreich gespeichert +2025-06-20 08:24:10 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:24:11 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:24:11 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:24:14 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:24:15 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system +2025-06-20 08:24:15 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:15 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system +2025-06-20 08:24:15 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:15 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system +2025-06-20 08:24:15 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:15 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system +2025-06-20 08:24:15 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:17 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system +2025-06-20 08:24:17 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:17 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system +2025-06-20 08:24:17 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:17 - [app] app - [DEBUG] DEBUG - ✅ Status-Updates für Drucker erfolgreich gespeichert +2025-06-20 08:24:17 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:24:18 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:24:18 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:24:30 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:24:31 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system +2025-06-20 08:24:31 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:31 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system +2025-06-20 08:24:31 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:33 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system +2025-06-20 08:24:33 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:34 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system +2025-06-20 08:24:34 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:36 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system +2025-06-20 08:24:36 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:36 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system +2025-06-20 08:24:36 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:24:36 - [app] app - [DEBUG] DEBUG - ✅ Status-Updates für Drucker erfolgreich gespeichert +2025-06-20 08:24:36 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:24:36 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:24:36 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:25:06 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:25:06 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:25:36 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:25:36 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:25:55 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:25:56 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system +2025-06-20 08:25:56 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:25:56 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system +2025-06-20 08:25:56 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:25:56 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system +2025-06-20 08:25:56 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:25:56 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system +2025-06-20 08:25:56 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:25:59 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system +2025-06-20 08:25:59 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:25:59 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system +2025-06-20 08:25:59 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:25:59 - [app] app - [DEBUG] DEBUG - ✅ Status-Updates für Drucker erfolgreich gespeichert +2025-06-20 08:25:59 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:25:59 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:25:59 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:26:29 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:26:29 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:26:33 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:26:33 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system +2025-06-20 08:26:33 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:26:33 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system +2025-06-20 08:26:33 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:26:33 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system +2025-06-20 08:26:33 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:26:33 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system +2025-06-20 08:26:33 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:26:35 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system +2025-06-20 08:26:35 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:26:36 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system +2025-06-20 08:26:36 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:26:36 - [app] app - [DEBUG] DEBUG - ✅ Status-Updates für Drucker erfolgreich gespeichert +2025-06-20 08:26:36 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:26:36 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:26:36 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:27:07 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:27:07 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:31:43 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: backend/database/myp.db +2025-06-20 08:33:20 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: backend/database/myp.db +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [CONFIG] Erkannte Umgebung: +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [CONFIG] Production-Modus: +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [CONFIG] Verwende Development-Konfiguration +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [DEVELOPMENT] Aktiviere Development-Konfiguration +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Konfiguration aktiviert +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Environment: +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Debug Mode: +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ SQL Echo: +2025-06-20 08:33:21 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-20 08:33:21 - [app] app - [INFO] INFO - Admin-Berechtigungen beim Start korrigiert: erstellt, aktualisiert +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [STARTUP] 🚀 Starte MYP -Umgebung +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [STARTUP] 🏢 +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [STARTUP] 🔒 Air-Gapped: +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [STARTUP] Initialisiere Datenbank... +2025-06-20 08:33:21 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [STARTUP] ✅ Datenbank initialisiert +2025-06-20 08:33:21 - [app] app - [INFO] INFO - [STARTUP] Prüfe Initial-Admin... +2025-06-20 08:33:22 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-20 08:33:22 - [app] app - [INFO] INFO - [STARTUP] ✅ Admin-Benutzer geprüft +2025-06-20 08:33:22 - [app] app - [INFO] INFO - [STARTUP] Initialisiere statische Drucker... +2025-06-20 08:33:22 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 1 (192.168.0.100) +2025-06-20 08:33:22 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 2 (192.168.0.101) +2025-06-20 08:33:22 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 3 (192.168.0.102) +2025-06-20 08:33:22 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 4 (192.168.0.103) +2025-06-20 08:33:22 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 5 (192.168.0.104) +2025-06-20 08:33:22 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 6 (192.168.0.106) +2025-06-20 08:33:22 - [app] app - [INFO] INFO - ✅ Statische Drucker-Initialisierung abgeschlossen: 0 erstellt, 6 aktualisiert +2025-06-20 08:33:22 - [app] app - [INFO] INFO - 📍 Alle Drucker sind für Standort 'TBA Marienfelde' konfiguriert +2025-06-20 08:33:22 - [app] app - [INFO] INFO - 🌐 IP-Bereich: 192.168.0.100-106 (außer .105) +2025-06-20 08:33:22 - [app] app - [INFO] INFO - [STARTUP] ✅ Statische Drucker konfiguriert +2025-06-20 08:33:22 - [app] app - [INFO] INFO - [STARTUP] Starte Queue Manager... +2025-06-20 08:33:22 - [app] app - [INFO] INFO - [STARTUP] ✅ Queue Manager gestartet +2025-06-20 08:33:22 - [app] app - [INFO] INFO - [STARTUP] Starte Job Scheduler... +2025-06-20 08:33:22 - [app] app - [INFO] INFO - [STARTUP] ✅ Job Scheduler gestartet +2025-06-20 08:33:22 - [app] app - [INFO] INFO - [STARTUP] Initialisiere Steckdosen (alle auf 'aus' = frei)... +2025-06-20 08:33:40 - [app] app - [WARNING] WARNING - [STARTUP] ⚠️ Keine der 6 Steckdosen konnte initialisiert werden +2025-06-20 08:33:40 - [app] app - [INFO] INFO - [STARTUP] 🌐 Server startet auf http://: +2025-06-20 08:33:41 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: backend/database/myp.db +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [CONFIG] Erkannte Umgebung: +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [CONFIG] Production-Modus: +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [CONFIG] Verwende Development-Konfiguration +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [DEVELOPMENT] Aktiviere Development-Konfiguration +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Konfiguration aktiviert +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Environment: +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Debug Mode: +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ SQL Echo: +2025-06-20 08:33:42 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-20 08:33:42 - [app] app - [INFO] INFO - Admin-Berechtigungen beim Start korrigiert: erstellt, aktualisiert +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] 🚀 Starte MYP -Umgebung +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] 🏢 +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] 🔒 Air-Gapped: +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] Initialisiere Datenbank... +2025-06-20 08:33:42 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] ✅ Datenbank initialisiert +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] Prüfe Initial-Admin... +2025-06-20 08:33:42 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] ✅ Admin-Benutzer geprüft +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] Initialisiere statische Drucker... +2025-06-20 08:33:42 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 1 (192.168.0.100) +2025-06-20 08:33:42 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 2 (192.168.0.101) +2025-06-20 08:33:42 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 3 (192.168.0.102) +2025-06-20 08:33:42 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 4 (192.168.0.103) +2025-06-20 08:33:42 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 5 (192.168.0.104) +2025-06-20 08:33:42 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 6 (192.168.0.106) +2025-06-20 08:33:42 - [app] app - [INFO] INFO - ✅ Statische Drucker-Initialisierung abgeschlossen: 0 erstellt, 6 aktualisiert +2025-06-20 08:33:42 - [app] app - [INFO] INFO - 📍 Alle Drucker sind für Standort 'TBA Marienfelde' konfiguriert +2025-06-20 08:33:42 - [app] app - [INFO] INFO - 🌐 IP-Bereich: 192.168.0.100-106 (außer .105) +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] ✅ Statische Drucker konfiguriert +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] Starte Queue Manager... +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] ✅ Queue Manager gestartet +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] Starte Job Scheduler... +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] ✅ Job Scheduler gestartet +2025-06-20 08:33:42 - [app] app - [INFO] INFO - [STARTUP] Initialisiere Steckdosen (alle auf 'aus' = frei)... +2025-06-20 08:34:00 - [app] app - [WARNING] WARNING - [STARTUP] ⚠️ Keine der 6 Steckdosen konnte initialisiert werden +2025-06-20 08:34:00 - [app] app - [INFO] INFO - [STARTUP] 🌐 Server startet auf http://: +2025-06-20 08:34:00 - [app] app - [INFO] INFO - Locating template 'dashboard.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\dashboard.html') +2025-06-20 08:34:00 - [app] app - [INFO] INFO - Locating template 'base.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\base.html') +2025-06-20 08:34:00 - [app] app - [INFO] INFO - Locating template 'macros/ui_components.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\macros\\ui_components.html') +2025-06-20 08:34:00 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:34:01 - [app] app - [DEBUG] DEBUG - Request: +2025-06-20 08:34:01 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:34:06 - [app] app - [INFO] INFO - ✅ Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system +2025-06-20 08:34:06 - [app] app - [DEBUG] DEBUG - 📊 Auto-Status protokolliert: Drucker -> +2025-06-20 08:34:09 - [app] app - [INFO] INFO - [SHUTDOWN] 🧹 Cleanup wird ausgeführt... +2025-06-20 08:34:09 - [app] app - [INFO] INFO - [SHUTDOWN] ✅ Queue Manager gestoppt +2025-06-20 08:34:09 - [app] app - [ERROR] ERROR - [SHUTDOWN] ❌ Cleanup-Fehler: +2025-06-20 08:34:10 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: backend/database/myp.db +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [CONFIG] Erkannte Umgebung: +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [CONFIG] Production-Modus: +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [CONFIG] Verwende Development-Konfiguration +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [DEVELOPMENT] Aktiviere Development-Konfiguration +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Konfiguration aktiviert +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Environment: +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Debug Mode: +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ SQL Echo: +2025-06-20 08:34:11 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-20 08:34:11 - [app] app - [INFO] INFO - Admin-Berechtigungen beim Start korrigiert: erstellt, aktualisiert +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] 🚀 Starte MYP -Umgebung +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] 🏢 +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] 🔒 Air-Gapped: +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] Initialisiere Datenbank... +2025-06-20 08:34:11 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] ✅ Datenbank initialisiert +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] Prüfe Initial-Admin... +2025-06-20 08:34:11 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] ✅ Admin-Benutzer geprüft +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] Initialisiere statische Drucker... +2025-06-20 08:34:11 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 1 (192.168.0.100) +2025-06-20 08:34:11 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 2 (192.168.0.101) +2025-06-20 08:34:11 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 3 (192.168.0.102) +2025-06-20 08:34:11 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 4 (192.168.0.103) +2025-06-20 08:34:11 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 5 (192.168.0.104) +2025-06-20 08:34:11 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 6 (192.168.0.106) +2025-06-20 08:34:11 - [app] app - [INFO] INFO - ✅ Statische Drucker-Initialisierung abgeschlossen: 0 erstellt, 6 aktualisiert +2025-06-20 08:34:11 - [app] app - [INFO] INFO - 📍 Alle Drucker sind für Standort 'TBA Marienfelde' konfiguriert +2025-06-20 08:34:11 - [app] app - [INFO] INFO - 🌐 IP-Bereich: 192.168.0.100-106 (außer .105) +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] ✅ Statische Drucker konfiguriert +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] Starte Queue Manager... +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] ✅ Queue Manager gestartet +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] Starte Job Scheduler... +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] ✅ Job Scheduler gestartet +2025-06-20 08:34:11 - [app] app - [INFO] INFO - [STARTUP] Initialisiere Steckdosen (alle auf 'aus' = frei)... +2025-06-20 08:34:29 - [app] app - [WARNING] WARNING - [STARTUP] ⚠️ Keine der 6 Steckdosen konnte initialisiert werden +2025-06-20 08:34:29 - [app] app - [INFO] INFO - [STARTUP] 🌐 Server startet auf http://: +2025-06-20 08:34:30 - [app] app - [INFO] INFO - Locating template 'guest_request.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\guest_request.html') +2025-06-20 08:34:30 - [app] app - [INFO] INFO - Locating template 'base.html': + 1: trying loader of application '__main__' + class: jinja2.loaders.FileSystemLoader + encoding: 'utf-8' + followlinks: False + searchpath: + - C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates + -> found ('C:\\Users\\TTOMCZA.EMEA\\Dev\\Projektarbeit-MYP\\backend\\templates\\base.html') +2025-06-20 08:34:30 - [app] app - [DEBUG] DEBUG - Response: +2025-06-20 08:34:30 - [app] app - [ERROR] ERROR - Fehler beim Laden des Benutzers : +2025-06-20 08:34:36 - [app] app - [INFO] INFO - [SHUTDOWN] 🧹 Cleanup wird ausgeführt... +2025-06-20 08:34:36 - [app] app - [INFO] INFO - [SHUTDOWN] ✅ Queue Manager gestoppt +2025-06-20 08:34:36 - [app] app - [ERROR] ERROR - [SHUTDOWN] ❌ Cleanup-Fehler: +2025-06-20 08:34:37 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: backend/database/myp.db +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [CONFIG] Erkannte Umgebung: +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [CONFIG] Production-Modus: +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [CONFIG] Verwende Development-Konfiguration +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [DEVELOPMENT] Aktiviere Development-Konfiguration +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Konfiguration aktiviert +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Environment: +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ Debug Mode: +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [DEVELOPMENT] ✅ SQL Echo: +2025-06-20 08:34:39 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-20 08:34:39 - [app] app - [INFO] INFO - Admin-Berechtigungen beim Start korrigiert: erstellt, aktualisiert +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [STARTUP] 🚀 Starte MYP -Umgebung +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [STARTUP] 🏢 +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [STARTUP] 🔒 Air-Gapped: +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [STARTUP] Initialisiere Datenbank... +2025-06-20 08:34:39 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [STARTUP] ✅ Datenbank initialisiert +2025-06-20 08:34:39 - [app] app - [INFO] INFO - [STARTUP] Prüfe Initial-Admin... +2025-06-20 08:34:40 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-20 08:34:40 - [app] app - [INFO] INFO - [STARTUP] ✅ Admin-Benutzer geprüft +2025-06-20 08:34:40 - [app] app - [INFO] INFO - [STARTUP] Initialisiere statische Drucker... +2025-06-20 08:34:40 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 1 (192.168.0.100) +2025-06-20 08:34:40 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 2 (192.168.0.101) +2025-06-20 08:34:40 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 3 (192.168.0.102) +2025-06-20 08:34:40 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 4 (192.168.0.103) +2025-06-20 08:34:40 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 5 (192.168.0.104) +2025-06-20 08:34:40 - [app] app - [INFO] INFO - Drucker aktualisiert: Drucker 6 (192.168.0.106) +2025-06-20 08:34:40 - [app] app - [INFO] INFO - ✅ Statische Drucker-Initialisierung abgeschlossen: 0 erstellt, 6 aktualisiert +2025-06-20 08:34:40 - [app] app - [INFO] INFO - 📍 Alle Drucker sind für Standort 'TBA Marienfelde' konfiguriert +2025-06-20 08:34:40 - [app] app - [INFO] INFO - 🌐 IP-Bereich: 192.168.0.100-106 (außer .105) +2025-06-20 08:34:40 - [app] app - [INFO] INFO - [STARTUP] ✅ Statische Drucker konfiguriert +2025-06-20 08:34:40 - [app] app - [INFO] INFO - [STARTUP] Starte Queue Manager... +2025-06-20 08:34:40 - [app] app - [INFO] INFO - [STARTUP] ✅ Queue Manager gestartet +2025-06-20 08:34:40 - [app] app - [INFO] INFO - [STARTUP] Starte Job Scheduler... +2025-06-20 08:34:40 - [app] app - [INFO] INFO - [STARTUP] ✅ Job Scheduler gestartet +2025-06-20 08:34:40 - [app] app - [INFO] INFO - [STARTUP] Initialisiere Steckdosen (alle auf 'aus' = frei)... +2025-06-20 08:34:45 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: backend/database/myp.db diff --git a/backend/logs/core_system/core_system.log b/backend/logs/core_system/core_system.log index 79182b777..a2b4aa4ce 100644 --- a/backend/logs/core_system/core_system.log +++ b/backend/logs/core_system/core_system.log @@ -416,3 +416,15 @@ 2025-06-20 08:18:43 - [core_system] core_system - [INFO] INFO - 📊 Massive Konsolidierung: 6 Dateien → 1 Datei (88% Reduktion) 2025-06-20 08:18:46 - [core_system] core_system - [INFO] INFO - ✅ Core System Management Module erfolgreich initialisiert 2025-06-20 08:18:46 - [core_system] core_system - [INFO] INFO - 📊 Massive Konsolidierung: 6 Dateien → 1 Datei (88% Reduktion) +2025-06-20 08:20:14 - [core_system] core_system - [INFO] INFO - ✅ Core System Management Module erfolgreich initialisiert +2025-06-20 08:20:14 - [core_system] core_system - [INFO] INFO - 📊 Massive Konsolidierung: 6 Dateien → 1 Datei (88% Reduktion) +2025-06-20 08:20:17 - [core_system] core_system - [INFO] INFO - ✅ Core System Management Module erfolgreich initialisiert +2025-06-20 08:20:17 - [core_system] core_system - [INFO] INFO - 📊 Massive Konsolidierung: 6 Dateien → 1 Datei (88% Reduktion) +2025-06-20 08:33:20 - [core_system] core_system - [INFO] INFO - ✅ Core System Management Module erfolgreich initialisiert +2025-06-20 08:33:20 - [core_system] core_system - [INFO] INFO - 📊 Massive Konsolidierung: 6 Dateien → 1 Datei (88% Reduktion) +2025-06-20 08:33:41 - [core_system] core_system - [INFO] INFO - ✅ Core System Management Module erfolgreich initialisiert +2025-06-20 08:33:41 - [core_system] core_system - [INFO] INFO - 📊 Massive Konsolidierung: 6 Dateien → 1 Datei (88% Reduktion) +2025-06-20 08:34:10 - [core_system] core_system - [INFO] INFO - ✅ Core System Management Module erfolgreich initialisiert +2025-06-20 08:34:10 - [core_system] core_system - [INFO] INFO - 📊 Massive Konsolidierung: 6 Dateien → 1 Datei (88% Reduktion) +2025-06-20 08:34:37 - [core_system] core_system - [INFO] INFO - ✅ Core System Management Module erfolgreich initialisiert +2025-06-20 08:34:37 - [core_system] core_system - [INFO] INFO - 📊 Massive Konsolidierung: 6 Dateien → 1 Datei (88% Reduktion) diff --git a/backend/logs/data_management/data_management.log b/backend/logs/data_management/data_management.log index 478a464b5..e3019911b 100644 --- a/backend/logs/data_management/data_management.log +++ b/backend/logs/data_management/data_management.log @@ -947,3 +947,15 @@ 2025-06-20 08:18:43 - [data_management] data_management - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) 2025-06-20 08:18:46 - [data_management] data_management - [INFO] INFO - ✅ Data Management Module initialisiert 2025-06-20 08:18:46 - [data_management] data_management - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:20:14 - [data_management] data_management - [INFO] INFO - ✅ Data Management Module initialisiert +2025-06-20 08:20:14 - [data_management] data_management - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:20:18 - [data_management] data_management - [INFO] INFO - ✅ Data Management Module initialisiert +2025-06-20 08:20:18 - [data_management] data_management - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:33:20 - [data_management] data_management - [INFO] INFO - ✅ Data Management Module initialisiert +2025-06-20 08:33:20 - [data_management] data_management - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:33:41 - [data_management] data_management - [INFO] INFO - ✅ Data Management Module initialisiert +2025-06-20 08:33:41 - [data_management] data_management - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:34:10 - [data_management] data_management - [INFO] INFO - ✅ Data Management Module initialisiert +2025-06-20 08:34:10 - [data_management] data_management - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:34:37 - [data_management] data_management - [INFO] INFO - ✅ Data Management Module initialisiert +2025-06-20 08:34:37 - [data_management] data_management - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) diff --git a/backend/logs/drucker_steuerung/drucker_steuerung.log b/backend/logs/drucker_steuerung/drucker_steuerung.log index 821cafdaf..6c00dd64f 100644 --- a/backend/logs/drucker_steuerung/drucker_steuerung.log +++ b/backend/logs/drucker_steuerung/drucker_steuerung.log @@ -62,3 +62,8 @@ 2025-06-20 08:15:03 - [drucker_steuerung] drucker_steuerung - [INFO] INFO - 🖨️ Drucker-Steuerungs-Blueprint (Backend-Kontrolle) geladen 2025-06-20 08:18:44 - [drucker_steuerung] drucker_steuerung - [INFO] INFO - 🖨️ Drucker-Steuerungs-Blueprint (Backend-Kontrolle) geladen 2025-06-20 08:18:47 - [drucker_steuerung] drucker_steuerung - [INFO] INFO - 🖨️ Drucker-Steuerungs-Blueprint (Backend-Kontrolle) geladen +2025-06-20 08:20:16 - [drucker_steuerung] drucker_steuerung - [INFO] INFO - 🖨️ Drucker-Steuerungs-Blueprint (Backend-Kontrolle) geladen +2025-06-20 08:20:19 - [drucker_steuerung] drucker_steuerung - [INFO] INFO - 🖨️ Drucker-Steuerungs-Blueprint (Backend-Kontrolle) geladen +2025-06-20 08:33:21 - [drucker_steuerung] drucker_steuerung - [INFO] INFO - 🖨️ Drucker-Steuerungs-Blueprint (Backend-Kontrolle) geladen +2025-06-20 08:33:42 - [drucker_steuerung] drucker_steuerung - [INFO] INFO - 🖨️ Drucker-Steuerungs-Blueprint (Backend-Kontrolle) geladen +2025-06-20 08:34:11 - [drucker_steuerung] drucker_steuerung - [INFO] INFO - 🖨️ Drucker-Steuerungs-Blueprint (Backend-Kontrolle) geladen diff --git a/backend/logs/energy_monitoring/energy_monitoring.log b/backend/logs/energy_monitoring/energy_monitoring.log index 7eba39c28..8cd19f1af 100644 --- a/backend/logs/energy_monitoring/energy_monitoring.log +++ b/backend/logs/energy_monitoring/energy_monitoring.log @@ -777,3 +777,10 @@ 2025-06-20 08:15:03 - [energy_monitoring] energy_monitoring - [INFO] INFO - ✅ Energiemonitoring-Blueprint initialisiert 2025-06-20 08:18:44 - [energy_monitoring] energy_monitoring - [INFO] INFO - ✅ Energiemonitoring-Blueprint initialisiert 2025-06-20 08:18:47 - [energy_monitoring] energy_monitoring - [INFO] INFO - ✅ Energiemonitoring-Blueprint initialisiert +2025-06-20 08:20:16 - [energy_monitoring] energy_monitoring - [INFO] INFO - ✅ Energiemonitoring-Blueprint initialisiert +2025-06-20 08:20:19 - [energy_monitoring] energy_monitoring - [INFO] INFO - ✅ Energiemonitoring-Blueprint initialisiert +2025-06-20 08:20:58 - [energy_monitoring] energy_monitoring - [INFO] INFO - 🔋 Energiemonitoring-Dashboard aufgerufen von admin +2025-06-20 08:21:15 - [energy_monitoring] energy_monitoring - [INFO] INFO - 🔍 Gerätedetails für ID 4 aufgerufen von admin +2025-06-20 08:33:21 - [energy_monitoring] energy_monitoring - [INFO] INFO - ✅ Energiemonitoring-Blueprint initialisiert +2025-06-20 08:33:42 - [energy_monitoring] energy_monitoring - [INFO] INFO - ✅ Energiemonitoring-Blueprint initialisiert +2025-06-20 08:34:11 - [energy_monitoring] energy_monitoring - [INFO] INFO - ✅ Energiemonitoring-Blueprint initialisiert diff --git a/backend/logs/hardware_integration/hardware_integration.log b/backend/logs/hardware_integration/hardware_integration.log index cb18951c1..83c032f22 100644 --- a/backend/logs/hardware_integration/hardware_integration.log +++ b/backend/logs/hardware_integration/hardware_integration.log @@ -3611,3 +3611,79 @@ 2025-06-20 08:19:37 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.103: Error Code: -1501, Invalid Request or Credentials 2025-06-20 08:19:39 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) 2025-06-20 08:19:39 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.106: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:14 - [hardware_integration] hardware_integration - [INFO] INFO - 🚀 Hardware Integration (Backend-Kontrolle) erfolgreich geladen +2025-06-20 08:20:18 - [hardware_integration] hardware_integration - [INFO] INFO - 🚀 Hardware Integration (Backend-Kontrolle) erfolgreich geladen +2025-06-20 08:20:20 - [hardware_integration] hardware_integration - [INFO] INFO - 🎯 DruckerSteuerung initialisiert - BACKEND ÜBERNIMMT KONTROLLE +2025-06-20 08:20:20 - [hardware_integration] hardware_integration - [INFO] INFO - 🎯 DruckerSteuerung initialisiert - BACKEND ÜBERNIMMT KONTROLLE +2025-06-20 08:20:20 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.100: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:20 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.100: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:20 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.101: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:20 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.101: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:20 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.102: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:20 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.102: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:20 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.103: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:20 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.103: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:22 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) +2025-06-20 08:20:22 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) +2025-06-20 08:20:23 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.106: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:23 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.106: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:33 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.100: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:33 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.101: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:33 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.102: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:34 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.103: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:36 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) +2025-06-20 08:20:36 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.106: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:44 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.100: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:44 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.101: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:44 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.102: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:45 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.103: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:20:47 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) +2025-06-20 08:20:47 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.106: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:21:22 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.100: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:21:22 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.101: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:21:23 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.102: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:21:23 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.103: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:21:25 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) +2025-06-20 08:21:25 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.106: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:08 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.100: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:08 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.101: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:08 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.102: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:08 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.103: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:10 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) +2025-06-20 08:24:10 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.106: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:14 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.100: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:15 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.101: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:15 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.102: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:15 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.103: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:17 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) +2025-06-20 08:24:17 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.106: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:31 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.100: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:31 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.101: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:33 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.102: HTTPConnectionPool(host='192.168.0.102', port=80): Read timed out. (read timeout=2) +2025-06-20 08:24:34 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.103: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:24:36 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) +2025-06-20 08:24:36 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.106: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:25:56 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.100: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:25:56 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.101: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:25:56 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.102: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:25:56 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.103: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:25:59 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) +2025-06-20 08:25:59 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.106: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:26:33 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.100: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:26:33 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.101: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:26:33 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.102: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:26:33 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.103: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:26:35 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) +2025-06-20 08:26:35 - [hardware_integration] hardware_integration - [ERROR] ERROR - ❌ Fehler beim Prüfen von Steckdose 192.168.0.106: Error Code: -1501, Invalid Request or Credentials +2025-06-20 08:33:20 - [hardware_integration] hardware_integration - [INFO] INFO - 🚀 Hardware Integration (Backend-Kontrolle) erfolgreich geladen +2025-06-20 08:33:22 - [hardware_integration] hardware_integration - [INFO] INFO - 🎯 DruckerSteuerung initialisiert - BACKEND ÜBERNIMMT KONTROLLE +2025-06-20 08:33:41 - [hardware_integration] hardware_integration - [INFO] INFO - 🚀 Hardware Integration (Backend-Kontrolle) erfolgreich geladen +2025-06-20 08:33:42 - [hardware_integration] hardware_integration - [INFO] INFO - 🎯 DruckerSteuerung initialisiert - BACKEND ÜBERNIMMT KONTROLLE +2025-06-20 08:34:06 - [hardware_integration] hardware_integration - [WARNING] WARNING - ⚠️ 192.168.0.100 ist über keine Methode erreichbar +2025-06-20 08:34:06 - [hardware_integration] hardware_integration - [WARNING] WARNING - ⚠️ Steckdose 192.168.0.100 ist im Netzwerk nicht erreichbar +2025-06-20 08:34:10 - [hardware_integration] hardware_integration - [INFO] INFO - 🚀 Hardware Integration (Backend-Kontrolle) erfolgreich geladen +2025-06-20 08:34:11 - [hardware_integration] hardware_integration - [INFO] INFO - 🎯 DruckerSteuerung initialisiert - BACKEND ÜBERNIMMT KONTROLLE +2025-06-20 08:34:37 - [hardware_integration] hardware_integration - [INFO] INFO - 🚀 Hardware Integration (Backend-Kontrolle) erfolgreich geladen +2025-06-20 08:34:40 - [hardware_integration] hardware_integration - [INFO] INFO - 🎯 DruckerSteuerung initialisiert - BACKEND ÜBERNIMMT KONTROLLE +2025-06-20 08:34:45 - [hardware_integration] hardware_integration - [INFO] INFO - 🚀 Hardware Integration (Backend-Kontrolle) erfolgreich geladen +2025-06-20 08:34:45 - [hardware_integration] hardware_integration - [INFO] INFO - 🎯 DruckerSteuerung initialisiert - BACKEND ÜBERNIMMT KONTROLLE diff --git a/backend/logs/job_queue_system/job_queue_system.log b/backend/logs/job_queue_system/job_queue_system.log index 3ab0ea95f..f1fc1ce65 100644 --- a/backend/logs/job_queue_system/job_queue_system.log +++ b/backend/logs/job_queue_system/job_queue_system.log @@ -1825,3 +1825,24 @@ 2025-06-20 08:18:48 - [job_queue_system] job_queue_system - [INFO] INFO - Queue Manager gestartet (Legacy-Kompatibilität) 2025-06-20 08:19:52 - [job_queue_system] job_queue_system - [INFO] INFO - Queue Manager gestoppt (Legacy-Kompatibilität) 2025-06-20 08:19:52 - [job_queue_system] job_queue_system - [INFO] INFO - Queue Manager gestoppt (Legacy-Kompatibilität) +2025-06-20 08:20:14 - [job_queue_system] job_queue_system - [INFO] INFO - ✅ Job & Queue System Module initialisiert +2025-06-20 08:20:14 - [job_queue_system] job_queue_system - [INFO] INFO - 📊 MASSIVE Konsolidierung: 4 Dateien → 1 Datei (75% Reduktion) +2025-06-20 08:20:16 - [job_queue_system] job_queue_system - [INFO] INFO - Queue Manager gestartet (Legacy-Kompatibilität) +2025-06-20 08:20:18 - [job_queue_system] job_queue_system - [INFO] INFO - ✅ Job & Queue System Module initialisiert +2025-06-20 08:20:18 - [job_queue_system] job_queue_system - [INFO] INFO - 📊 MASSIVE Konsolidierung: 4 Dateien → 1 Datei (75% Reduktion) +2025-06-20 08:20:20 - [job_queue_system] job_queue_system - [INFO] INFO - Queue Manager gestartet (Legacy-Kompatibilität) +2025-06-20 08:27:32 - [job_queue_system] job_queue_system - [INFO] INFO - Queue Manager gestoppt (Legacy-Kompatibilität) +2025-06-20 08:27:32 - [job_queue_system] job_queue_system - [INFO] INFO - Queue Manager gestoppt (Legacy-Kompatibilität) +2025-06-20 08:33:20 - [job_queue_system] job_queue_system - [INFO] INFO - ✅ Job & Queue System Module initialisiert +2025-06-20 08:33:20 - [job_queue_system] job_queue_system - [INFO] INFO - 📊 MASSIVE Konsolidierung: 4 Dateien → 1 Datei (75% Reduktion) +2025-06-20 08:33:22 - [job_queue_system] job_queue_system - [INFO] INFO - Queue Manager gestartet (Legacy-Kompatibilität) +2025-06-20 08:33:41 - [job_queue_system] job_queue_system - [INFO] INFO - ✅ Job & Queue System Module initialisiert +2025-06-20 08:33:41 - [job_queue_system] job_queue_system - [INFO] INFO - 📊 MASSIVE Konsolidierung: 4 Dateien → 1 Datei (75% Reduktion) +2025-06-20 08:33:42 - [job_queue_system] job_queue_system - [INFO] INFO - Queue Manager gestartet (Legacy-Kompatibilität) +2025-06-20 08:34:09 - [job_queue_system] job_queue_system - [INFO] INFO - Queue Manager gestoppt (Legacy-Kompatibilität) +2025-06-20 08:34:10 - [job_queue_system] job_queue_system - [INFO] INFO - ✅ Job & Queue System Module initialisiert +2025-06-20 08:34:10 - [job_queue_system] job_queue_system - [INFO] INFO - 📊 MASSIVE Konsolidierung: 4 Dateien → 1 Datei (75% Reduktion) +2025-06-20 08:34:11 - [job_queue_system] job_queue_system - [INFO] INFO - Queue Manager gestartet (Legacy-Kompatibilität) +2025-06-20 08:34:36 - [job_queue_system] job_queue_system - [INFO] INFO - Queue Manager gestoppt (Legacy-Kompatibilität) +2025-06-20 08:34:37 - [job_queue_system] job_queue_system - [INFO] INFO - ✅ Job & Queue System Module initialisiert +2025-06-20 08:34:37 - [job_queue_system] job_queue_system - [INFO] INFO - 📊 MASSIVE Konsolidierung: 4 Dateien → 1 Datei (75% Reduktion) diff --git a/backend/logs/monitoring_analytics/monitoring_analytics.log b/backend/logs/monitoring_analytics/monitoring_analytics.log index e5572ba8e..e8b83ceb3 100644 --- a/backend/logs/monitoring_analytics/monitoring_analytics.log +++ b/backend/logs/monitoring_analytics/monitoring_analytics.log @@ -937,3 +937,13 @@ 2025-06-20 08:18:44 - [monitoring_analytics] monitoring_analytics - [INFO] INFO - 📊 MASSIVE Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) 2025-06-20 08:18:47 - [monitoring_analytics] monitoring_analytics - [INFO] INFO - ✅ Monitoring & Analytics Module initialisiert 2025-06-20 08:18:47 - [monitoring_analytics] monitoring_analytics - [INFO] INFO - 📊 MASSIVE Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:20:16 - [monitoring_analytics] monitoring_analytics - [INFO] INFO - ✅ Monitoring & Analytics Module initialisiert +2025-06-20 08:20:16 - [monitoring_analytics] monitoring_analytics - [INFO] INFO - 📊 MASSIVE Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:20:19 - [monitoring_analytics] monitoring_analytics - [INFO] INFO - ✅ Monitoring & Analytics Module initialisiert +2025-06-20 08:20:19 - [monitoring_analytics] monitoring_analytics - [INFO] INFO - 📊 MASSIVE Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:33:21 - [monitoring_analytics] monitoring_analytics - [INFO] INFO - ✅ Monitoring & Analytics Module initialisiert +2025-06-20 08:33:21 - [monitoring_analytics] monitoring_analytics - [INFO] INFO - 📊 MASSIVE Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:33:42 - [monitoring_analytics] monitoring_analytics - [INFO] INFO - ✅ Monitoring & Analytics Module initialisiert +2025-06-20 08:33:42 - [monitoring_analytics] monitoring_analytics - [INFO] INFO - 📊 MASSIVE Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:34:11 - [monitoring_analytics] monitoring_analytics - [INFO] INFO - ✅ Monitoring & Analytics Module initialisiert +2025-06-20 08:34:11 - [monitoring_analytics] monitoring_analytics - [INFO] INFO - 📊 MASSIVE Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) diff --git a/backend/logs/permissions/permissions.log b/backend/logs/permissions/permissions.log index 1e2aaace7..a135e595b 100644 --- a/backend/logs/permissions/permissions.log +++ b/backend/logs/permissions/permissions.log @@ -494,3 +494,14 @@ WHERE user_permissions.user_id = ? 2025-06-20 08:15:03 - [permissions] permissions - [INFO] INFO - Admin-Berechtigungen korrigiert: 0 erstellt, 0 aktualisiert 2025-06-20 08:18:44 - [permissions] permissions - [INFO] INFO - Admin-Berechtigungen korrigiert: 0 erstellt, 0 aktualisiert 2025-06-20 08:18:48 - [permissions] permissions - [INFO] INFO - Admin-Berechtigungen korrigiert: 0 erstellt, 0 aktualisiert +2025-06-20 08:20:16 - [permissions] permissions - [ERROR] ERROR - Fehler beim Korrigieren der Admin-Berechtigungen: (sqlite3.OperationalError) no such table: users +[SQL: SELECT users.id AS users_id, users.email AS users_email, users.username AS users_username, users.password_hash AS users_password_hash, users.name AS users_name, users.role AS users_role, users.active AS users_active, users.created_at AS users_created_at, users.last_login AS users_last_login, users.updated_at AS users_updated_at, users.settings AS users_settings, users.last_activity AS users_last_activity, users.department AS users_department, users.position AS users_position, users.phone AS users_phone, users.bio AS users_bio, users.theme_preference AS users_theme_preference, users.language_preference AS users_language_preference, users.email_notifications AS users_email_notifications, users.browser_notifications AS users_browser_notifications, users.dashboard_layout AS users_dashboard_layout, users.compact_mode AS users_compact_mode, users.show_completed_jobs AS users_show_completed_jobs, users.auto_refresh_interval AS users_auto_refresh_interval, users.auto_logout_timeout AS users_auto_logout_timeout +FROM users +WHERE users.role = ?] +[parameters: ('admin',)] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2025-06-20 08:20:19 - [permissions] permissions - [INFO] INFO - UserPermission für Admin admin (ID: 1) erstellt +2025-06-20 08:20:19 - [permissions] permissions - [INFO] INFO - Admin-Berechtigungen korrigiert: 1 erstellt, 0 aktualisiert +2025-06-20 08:33:21 - [permissions] permissions - [INFO] INFO - Admin-Berechtigungen korrigiert: 0 erstellt, 0 aktualisiert +2025-06-20 08:33:42 - [permissions] permissions - [INFO] INFO - Admin-Berechtigungen korrigiert: 0 erstellt, 0 aktualisiert +2025-06-20 08:34:11 - [permissions] permissions - [INFO] INFO - Admin-Berechtigungen korrigiert: 0 erstellt, 0 aktualisiert diff --git a/backend/logs/scheduler/scheduler.log b/backend/logs/scheduler/scheduler.log index d8ec16dda..f849434d0 100644 --- a/backend/logs/scheduler/scheduler.log +++ b/backend/logs/scheduler/scheduler.log @@ -2587,3 +2587,74 @@ 2025-06-20 08:18:46 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True 2025-06-20 08:18:48 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet 2025-06-20 08:18:48 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-20 08:20:14 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-20 08:20:16 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-20 08:20:16 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-20 08:20:18 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-20 08:20:20 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-20 08:20:20 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-20 08:33:20 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-20 08:33:22 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-20 08:33:22 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-20 08:33:22 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Systemstart... +2025-06-20 08:33:22 - [scheduler] scheduler - [INFO] INFO - 🔍 Prüfe 6 konfigurierte Steckdosen... +2025-06-20 08:33:25 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 1: Steckdose 192.168.0.100 nicht erreichbar +2025-06-20 08:33:28 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 2: Steckdose 192.168.0.101 nicht erreichbar +2025-06-20 08:33:31 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 3: Steckdose 192.168.0.102 nicht erreichbar +2025-06-20 08:33:34 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 4: Steckdose 192.168.0.103 nicht erreichbar +2025-06-20 08:33:37 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 5: Steckdose 192.168.0.104 nicht erreichbar +2025-06-20 08:33:40 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 6: Steckdose 192.168.0.106 nicht erreichbar +2025-06-20 08:33:40 - [scheduler] scheduler - [INFO] INFO - ============================================================ +2025-06-20 08:33:40 - [scheduler] scheduler - [INFO] INFO - 🎯 STECKDOSEN-INITIALISIERUNG ABGESCHLOSSEN +2025-06-20 08:33:40 - [scheduler] scheduler - [INFO] INFO - 📊 Gesamt: 6 Steckdosen +2025-06-20 08:33:40 - [scheduler] scheduler - [INFO] INFO - ✅ Erfolgreich: 0 +2025-06-20 08:33:40 - [scheduler] scheduler - [INFO] INFO - 📡 Nicht erreichbar: 6 +2025-06-20 08:33:40 - [scheduler] scheduler - [INFO] INFO - ❌ Fehlgeschlagen: 0 +2025-06-20 08:33:40 - [scheduler] scheduler - [WARNING] WARNING - ⚠️ KEINE Steckdose konnte initialisiert werden! +2025-06-20 08:33:40 - [scheduler] scheduler - [INFO] INFO - ============================================================ +2025-06-20 08:33:41 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-20 08:33:42 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-20 08:33:42 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-20 08:33:42 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Systemstart... +2025-06-20 08:33:42 - [scheduler] scheduler - [INFO] INFO - 🔍 Prüfe 6 konfigurierte Steckdosen... +2025-06-20 08:33:45 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 1: Steckdose 192.168.0.100 nicht erreichbar +2025-06-20 08:33:48 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 2: Steckdose 192.168.0.101 nicht erreichbar +2025-06-20 08:33:51 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 3: Steckdose 192.168.0.102 nicht erreichbar +2025-06-20 08:33:54 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 4: Steckdose 192.168.0.103 nicht erreichbar +2025-06-20 08:33:57 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 5: Steckdose 192.168.0.104 nicht erreichbar +2025-06-20 08:34:00 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 6: Steckdose 192.168.0.106 nicht erreichbar +2025-06-20 08:34:00 - [scheduler] scheduler - [INFO] INFO - ============================================================ +2025-06-20 08:34:00 - [scheduler] scheduler - [INFO] INFO - 🎯 STECKDOSEN-INITIALISIERUNG ABGESCHLOSSEN +2025-06-20 08:34:00 - [scheduler] scheduler - [INFO] INFO - 📊 Gesamt: 6 Steckdosen +2025-06-20 08:34:00 - [scheduler] scheduler - [INFO] INFO - ✅ Erfolgreich: 0 +2025-06-20 08:34:00 - [scheduler] scheduler - [INFO] INFO - 📡 Nicht erreichbar: 6 +2025-06-20 08:34:00 - [scheduler] scheduler - [INFO] INFO - ❌ Fehlgeschlagen: 0 +2025-06-20 08:34:00 - [scheduler] scheduler - [WARNING] WARNING - ⚠️ KEINE Steckdose konnte initialisiert werden! +2025-06-20 08:34:00 - [scheduler] scheduler - [INFO] INFO - ============================================================ +2025-06-20 08:34:10 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-20 08:34:11 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-20 08:34:11 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-20 08:34:11 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Systemstart... +2025-06-20 08:34:11 - [scheduler] scheduler - [INFO] INFO - 🔍 Prüfe 6 konfigurierte Steckdosen... +2025-06-20 08:34:14 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 1: Steckdose 192.168.0.100 nicht erreichbar +2025-06-20 08:34:17 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 2: Steckdose 192.168.0.101 nicht erreichbar +2025-06-20 08:34:20 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 3: Steckdose 192.168.0.102 nicht erreichbar +2025-06-20 08:34:23 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 4: Steckdose 192.168.0.103 nicht erreichbar +2025-06-20 08:34:26 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 5: Steckdose 192.168.0.104 nicht erreichbar +2025-06-20 08:34:29 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 6: Steckdose 192.168.0.106 nicht erreichbar +2025-06-20 08:34:29 - [scheduler] scheduler - [INFO] INFO - ============================================================ +2025-06-20 08:34:29 - [scheduler] scheduler - [INFO] INFO - 🎯 STECKDOSEN-INITIALISIERUNG ABGESCHLOSSEN +2025-06-20 08:34:29 - [scheduler] scheduler - [INFO] INFO - 📊 Gesamt: 6 Steckdosen +2025-06-20 08:34:29 - [scheduler] scheduler - [INFO] INFO - ✅ Erfolgreich: 0 +2025-06-20 08:34:29 - [scheduler] scheduler - [INFO] INFO - 📡 Nicht erreichbar: 6 +2025-06-20 08:34:29 - [scheduler] scheduler - [INFO] INFO - ❌ Fehlgeschlagen: 0 +2025-06-20 08:34:29 - [scheduler] scheduler - [WARNING] WARNING - ⚠️ KEINE Steckdose konnte initialisiert werden! +2025-06-20 08:34:29 - [scheduler] scheduler - [INFO] INFO - ============================================================ +2025-06-20 08:34:37 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-20 08:34:40 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-20 08:34:40 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-20 08:34:40 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Systemstart... +2025-06-20 08:34:40 - [scheduler] scheduler - [INFO] INFO - 🔍 Prüfe 6 konfigurierte Steckdosen... +2025-06-20 08:34:43 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 1: Steckdose 192.168.0.100 nicht erreichbar +2025-06-20 08:34:45 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-20 08:34:46 - [scheduler] scheduler - [WARNING] WARNING - 📡 Drucker 2: Steckdose 192.168.0.101 nicht erreichbar diff --git a/backend/logs/security_suite/security_suite.log b/backend/logs/security_suite/security_suite.log index d7794d2d0..65c98633c 100644 --- a/backend/logs/security_suite/security_suite.log +++ b/backend/logs/security_suite/security_suite.log @@ -1416,3 +1416,21 @@ 2025-06-20 08:18:46 - [security_suite] security_suite - [INFO] INFO - ✅ Security Suite Module initialisiert 2025-06-20 08:18:46 - [security_suite] security_suite - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) 2025-06-20 08:18:48 - [security_suite] security_suite - [INFO] INFO - 🔒 Security Suite initialisiert +2025-06-20 08:20:14 - [security_suite] security_suite - [INFO] INFO - ✅ Security Suite Module initialisiert +2025-06-20 08:20:14 - [security_suite] security_suite - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:20:16 - [security_suite] security_suite - [INFO] INFO - 🔒 Security Suite initialisiert +2025-06-20 08:20:18 - [security_suite] security_suite - [INFO] INFO - ✅ Security Suite Module initialisiert +2025-06-20 08:20:18 - [security_suite] security_suite - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:20:19 - [security_suite] security_suite - [INFO] INFO - 🔒 Security Suite initialisiert +2025-06-20 08:33:20 - [security_suite] security_suite - [INFO] INFO - ✅ Security Suite Module initialisiert +2025-06-20 08:33:20 - [security_suite] security_suite - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:33:21 - [security_suite] security_suite - [INFO] INFO - 🔒 Security Suite initialisiert +2025-06-20 08:33:41 - [security_suite] security_suite - [INFO] INFO - ✅ Security Suite Module initialisiert +2025-06-20 08:33:41 - [security_suite] security_suite - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:33:42 - [security_suite] security_suite - [INFO] INFO - 🔒 Security Suite initialisiert +2025-06-20 08:34:10 - [security_suite] security_suite - [INFO] INFO - ✅ Security Suite Module initialisiert +2025-06-20 08:34:10 - [security_suite] security_suite - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:34:11 - [security_suite] security_suite - [INFO] INFO - 🔒 Security Suite initialisiert +2025-06-20 08:34:37 - [security_suite] security_suite - [INFO] INFO - ✅ Security Suite Module initialisiert +2025-06-20 08:34:37 - [security_suite] security_suite - [INFO] INFO - 📊 Massive Konsolidierung: 3 Dateien → 1 Datei (67% Reduktion) +2025-06-20 08:34:39 - [security_suite] security_suite - [INFO] INFO - 🔒 Security Suite initialisiert diff --git a/backend/logs/startup/startup.log b/backend/logs/startup/startup.log index 7371f0cca..479db21eb 100644 --- a/backend/logs/startup/startup.log +++ b/backend/logs/startup/startup.log @@ -3709,3 +3709,48 @@ 2025-06-20 08:18:47 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert 2025-06-20 08:18:47 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert 2025-06-20 08:18:47 - [startup] startup - [INFO] INFO - ================================================== +2025-06-20 08:20:16 - [startup] startup - [INFO] INFO - ================================================== +2025-06-20 08:20:16 - [startup] startup - [INFO] INFO - [START] MYP Platform Backend wird gestartet... +2025-06-20 08:20:16 - [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-20 08:20:16 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-20 08:20:16 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-20 08:20:16 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-20T08:20:16.099487 +2025-06-20 08:20:16 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-20 08:20:16 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-20 08:20:16 - [startup] startup - [INFO] INFO - ================================================== +2025-06-20 08:20:19 - [startup] startup - [INFO] INFO - ================================================== +2025-06-20 08:20:19 - [startup] startup - [INFO] INFO - [START] MYP Platform Backend wird gestartet... +2025-06-20 08:20:19 - [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-20 08:20:19 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-20 08:20:19 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-20 08:20:19 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-20T08:20:19.575052 +2025-06-20 08:20:19 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-20 08:20:19 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-20 08:20:19 - [startup] startup - [INFO] INFO - ================================================== +2025-06-20 08:33:21 - [startup] startup - [INFO] INFO - ================================================== +2025-06-20 08:33:21 - [startup] startup - [INFO] INFO - [START] MYP Platform Backend wird gestartet... +2025-06-20 08:33:21 - [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-20 08:33:21 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-20 08:33:21 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-20 08:33:21 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-20T08:33:21.669124 +2025-06-20 08:33:21 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-20 08:33:21 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-20 08:33:21 - [startup] startup - [INFO] INFO - ================================================== +2025-06-20 08:33:42 - [startup] startup - [INFO] INFO - ================================================== +2025-06-20 08:33:42 - [startup] startup - [INFO] INFO - [START] MYP Platform Backend wird gestartet... +2025-06-20 08:33:42 - [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-20 08:33:42 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-20 08:33:42 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-20 08:33:42 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-20T08:33:42.280402 +2025-06-20 08:33:42 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-20 08:33:42 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-20 08:33:42 - [startup] startup - [INFO] INFO - ================================================== +2025-06-20 08:34:11 - [startup] startup - [INFO] INFO - ================================================== +2025-06-20 08:34:11 - [startup] startup - [INFO] INFO - [START] MYP Platform Backend wird gestartet... +2025-06-20 08:34:11 - [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-20 08:34:11 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-20 08:34:11 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-20 08:34:11 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-20T08:34:11.469430 +2025-06-20 08:34:11 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-20 08:34:11 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-20 08:34:11 - [startup] startup - [INFO] INFO - ================================================== diff --git a/backend/logs/utilities_collection/utilities_collection.log b/backend/logs/utilities_collection/utilities_collection.log index d3b6d3bf7..fcc14554d 100644 --- a/backend/logs/utilities_collection/utilities_collection.log +++ b/backend/logs/utilities_collection/utilities_collection.log @@ -1229,3 +1229,19 @@ 2025-06-20 08:18:43 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion) 2025-06-20 08:18:46 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert 2025-06-20 08:18:46 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion) +2025-06-20 08:20:14 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert +2025-06-20 08:20:14 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion) +2025-06-20 08:20:18 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert +2025-06-20 08:20:18 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion) +2025-06-20 08:31:43 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert +2025-06-20 08:31:43 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion) +2025-06-20 08:33:20 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert +2025-06-20 08:33:20 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion) +2025-06-20 08:33:41 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert +2025-06-20 08:33:41 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion) +2025-06-20 08:34:10 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert +2025-06-20 08:34:10 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion) +2025-06-20 08:34:37 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert +2025-06-20 08:34:37 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion) +2025-06-20 08:34:45 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert +2025-06-20 08:34:45 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion) diff --git a/backend/logs/windows_fixes/windows_fixes.log b/backend/logs/windows_fixes/windows_fixes.log index bf044c2b2..add855648 100644 --- a/backend/logs/windows_fixes/windows_fixes.log +++ b/backend/logs/windows_fixes/windows_fixes.log @@ -419,3 +419,15 @@ 2025-06-20 08:18:43 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet 2025-06-20 08:18:46 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... 2025-06-20 08:18:46 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-20 08:20:14 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-20 08:20:14 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-20 08:20:17 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-20 08:20:17 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-20 08:33:20 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-20 08:33:20 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-20 08:33:41 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-20 08:33:41 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-20 08:34:10 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-20 08:34:10 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-20 08:34:37 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-20 08:34:37 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet diff --git a/backend/scripts/diagnose_tapo.py b/backend/scripts/diagnose_tapo.py new file mode 100644 index 000000000..e944c415a --- /dev/null +++ b/backend/scripts/diagnose_tapo.py @@ -0,0 +1,281 @@ +#!/usr/bin/env python3 +""" +Tapo Steckdosen Diagnose-Tool +============================ + +Dieses Script hilft bei der Diagnose von Verbindungsproblemen mit Tapo-Steckdosen. + +Autor: Till Tomczak +Datum: 2025-06-20 +""" + +import sys +import socket +import subprocess +import time +import os +from datetime import datetime + +# Farben für Terminal-Ausgabe +class Colors: + GREEN = '\033[92m' + YELLOW = '\033[93m' + RED = '\033[91m' + BLUE = '\033[94m' + ENDC = '\033[0m' + BOLD = '\033[1m' + +def print_header(text): + """Druckt eine formatierte Überschrift""" + print(f"\n{Colors.BOLD}{Colors.BLUE}{'=' * 60}{Colors.ENDC}") + print(f"{Colors.BOLD}{Colors.BLUE}{text:^60}{Colors.ENDC}") + print(f"{Colors.BOLD}{Colors.BLUE}{'=' * 60}{Colors.ENDC}\n") + +def print_success(text): + """Druckt eine Erfolgsmeldung""" + print(f"{Colors.GREEN}✅ {text}{Colors.ENDC}") + +def print_warning(text): + """Druckt eine Warnung""" + print(f"{Colors.YELLOW}⚠️ {text}{Colors.ENDC}") + +def print_error(text): + """Druckt eine Fehlermeldung""" + print(f"{Colors.RED}❌ {text}{Colors.ENDC}") + +def print_info(text): + """Druckt eine Info-Meldung""" + print(f"{Colors.BLUE}ℹ️ {text}{Colors.ENDC}") + +def test_port_connection(ip, port, timeout=3): + """ + Testet die Verbindung zu einem bestimmten Port. + + Args: + ip: IP-Adresse + port: Port-Nummer + timeout: Timeout in Sekunden + + Returns: + bool: True wenn Verbindung möglich + """ + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(timeout) + result = sock.connect_ex((ip, port)) + sock.close() + return result == 0 + except Exception as e: + print_error(f"Socket-Fehler: {e}") + return False + +def test_icmp_ping(ip): + """ + Führt einen ICMP Ping durch. + + Args: + ip: IP-Adresse + + Returns: + bool: True wenn Ping erfolgreich + """ + try: + # Windows und Linux kompatibel + param = '-n' if os.name == 'nt' else '-c' + command = ['ping', param, '1', '-w', '2000', ip] + result = subprocess.run(command, capture_output=True, text=True, timeout=5) + return result.returncode == 0 + except Exception as e: + print_error(f"Ping-Fehler: {e}") + return False + +def test_dns_resolution(hostname): + """ + Testet die DNS-Auflösung eines Hostnamens. + + Args: + hostname: Hostname zum Auflösen + + Returns: + str: Aufgelöste IP oder None + """ + try: + ip = socket.gethostbyname(hostname) + return ip + except Exception as e: + print_error(f"DNS-Auflösung fehlgeschlagen: {e}") + return None + +def test_tapo_connection(ip, username="admin", password="admin"): + """ + Testet die Tapo-Verbindung. + + Args: + ip: IP-Adresse der Steckdose + username: Tapo-Benutzername + password: Tapo-Passwort + + Returns: + dict: Ergebnis der Tests + """ + results = { + "timestamp": datetime.now().isoformat(), + "ip": ip, + "tests": {} + } + + # Test 1: ICMP Ping + print_info(f"Teste ICMP Ping zu {ip}...") + ping_result = test_icmp_ping(ip) + results["tests"]["icmp_ping"] = ping_result + if ping_result: + print_success(f"ICMP Ping zu {ip} erfolgreich") + else: + print_warning(f"ICMP Ping zu {ip} fehlgeschlagen (kann durch Firewall blockiert sein)") + + # Test 2: Port 80 (HTTP) + print_info(f"Teste Port 80 (HTTP) auf {ip}...") + port80_result = test_port_connection(ip, 80) + results["tests"]["port_80"] = port80_result + if port80_result: + print_success(f"Port 80 auf {ip} ist erreichbar") + else: + print_error(f"Port 80 auf {ip} ist NICHT erreichbar") + + # Test 3: Port 9999 (Tapo-spezifisch) + print_info(f"Teste Port 9999 (Tapo) auf {ip}...") + port9999_result = test_port_connection(ip, 9999) + results["tests"]["port_9999"] = port9999_result + if port9999_result: + print_success(f"Port 9999 auf {ip} ist erreichbar") + else: + print_warning(f"Port 9999 auf {ip} ist nicht erreichbar") + + # Test 4: PyP100 Verbindung + try: + print_info("Teste PyP100 Bibliothek...") + from PyP100.PyP100 import P100 + + print_info(f"Versuche Tapo-Handshake mit {ip}...") + p100 = P100(ip, username, password) + + # Handshake + p100.handshake() + print_success("Tapo-Handshake erfolgreich") + results["tests"]["tapo_handshake"] = True + + # Login + p100.login() + print_success("Tapo-Login erfolgreich") + results["tests"]["tapo_login"] = True + + # Device Info + device_info = p100.getDeviceInfo() + if device_info and 'error_code' in device_info and device_info['error_code'] == 0: + print_success("Tapo-Geräteinformationen erfolgreich abgerufen") + results["tests"]["tapo_device_info"] = True + results["device_info"] = device_info.get('result', {}) + + # Status anzeigen + device_on = device_info.get('result', {}).get('device_on', False) + print_info(f"Steckdosen-Status: {'EIN' if device_on else 'AUS'}") + else: + print_error("Konnte Geräteinformationen nicht abrufen") + results["tests"]["tapo_device_info"] = False + + except ImportError: + print_error("PyP100 Bibliothek nicht installiert!") + print_info("Installiere mit: pip install PyP100") + results["tests"]["pyp100_available"] = False + except Exception as e: + print_error(f"Tapo-Verbindung fehlgeschlagen: {e}") + results["tests"]["tapo_connection"] = False + results["error"] = str(e) + + return results + +def diagnose_network(): + """Führt eine allgemeine Netzwerk-Diagnose durch""" + print_header("Netzwerk-Diagnose") + + # Lokale IP-Adresse ermitteln + try: + hostname = socket.gethostname() + local_ip = socket.gethostbyname(hostname) + print_info(f"Lokaler Hostname: {hostname}") + print_info(f"Lokale IP-Adresse: {local_ip}") + except Exception as e: + print_error(f"Konnte lokale IP nicht ermitteln: {e}") + + # Gateway ermitteln (nur Linux/Unix) + if os.name != 'nt': + try: + result = subprocess.run(['ip', 'route', 'show'], capture_output=True, text=True) + if result.returncode == 0: + lines = result.stdout.strip().split('\n') + for line in lines: + if 'default' in line: + gateway = line.split()[2] + print_info(f"Standard-Gateway: {gateway}") + break + except: + pass + + # DNS-Test + print_info("Teste DNS-Auflösung...") + google_ip = test_dns_resolution("google.com") + if google_ip: + print_success(f"DNS funktioniert (google.com -> {google_ip})") + else: + print_error("DNS-Auflösung fehlgeschlagen") + +def main(): + """Hauptfunktion""" + print_header("Tapo Steckdosen Diagnose-Tool") + print_info(f"Start: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") + + # Argumente prüfen + if len(sys.argv) < 2: + print_error("Verwendung: python diagnose_tapo.py [username] [password]") + print_info("Beispiel: python diagnose_tapo.py 192.168.1.100") + print_info("Beispiel: python diagnose_tapo.py 192.168.1.100 admin admin") + sys.exit(1) + + ip_address = sys.argv[1] + username = sys.argv[2] if len(sys.argv) > 2 else "admin" + password = sys.argv[3] if len(sys.argv) > 3 else "admin" + + # Netzwerk-Diagnose + diagnose_network() + + # Tapo-Diagnose + print_header(f"Teste Tapo-Steckdose: {ip_address}") + results = test_tapo_connection(ip_address, username, password) + + # Zusammenfassung + print_header("Diagnose-Zusammenfassung") + + successful_tests = sum(1 for test, result in results["tests"].items() if result is True) + total_tests = len(results["tests"]) + + print_info(f"Erfolgreiche Tests: {successful_tests}/{total_tests}") + + # Empfehlungen + if not results["tests"].get("port_80", False): + print_warning("\nEmpfehlungen:") + print_warning("1. Stelle sicher, dass die Steckdose eingeschaltet ist") + print_warning("2. Prüfe, ob die IP-Adresse korrekt ist") + print_warning("3. Stelle sicher, dass sich die Steckdose im gleichen Netzwerk befindet") + print_warning("4. Prüfe Firewall-Einstellungen") + print_warning("5. Versuche die Steckdose zurückzusetzen (Reset-Knopf)") + + if results["tests"].get("port_80", False) and not results["tests"].get("tapo_login", False): + print_warning("\nAuthentifizierungsproblem:") + print_warning("1. Prüfe Benutzername und Passwort") + print_warning("2. Standard-Credentials sind meist 'admin'/'admin'") + print_warning("3. Wurden die Credentials in der Tapo-App geändert?") + + print_info(f"\nEnde: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/backend/static/js/admin-guest-requests.js b/backend/static/js/admin-guest-requests.js index 1d3922316..0c16e796c 100644 --- a/backend/static/js/admin-guest-requests.js +++ b/backend/static/js/admin-guest-requests.js @@ -93,7 +93,7 @@ async function loadGuestRequests() { try { showLoading(true); - const url = `${API_BASE_URL}/api/admin/guest-requests`; + const url = `${API_BASE_URL}/api/admin/requests`; const response = await fetch(url, { method: 'GET', headers: { @@ -138,7 +138,7 @@ function updateStats(stats) { const elements = { 'pending-count': stats.pending || 0, 'approved-count': stats.approved || 0, - 'rejected-count': stats.rejected || 0, + 'rejected-count': stats.denied || stats.rejected || 0, 'total-count': stats.total || 0 }; @@ -289,7 +289,7 @@ function createRequestRow(request) {
${escapeHtml(request.file_name || 'Keine Datei')}
- ${request.duration_minutes ? `${request.duration_minutes} Min.` : 'Unbekannte Dauer'} + ${request.duration_min ? `${request.duration_min} Min.` : 'Unbekannte Dauer'} ${request.copies ? ` • ${request.copies} Kopien` : ''}
${request.reason ? `
${escapeHtml(request.reason)}
` : ''} @@ -378,6 +378,7 @@ function getStatusColor(status) { 'pending': 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300', 'approved': 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300', 'rejected': 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300', + 'denied': 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300', 'expired': 'bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-300' }; return colors[status] || 'bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-300'; @@ -388,6 +389,7 @@ function getStatusDot(status) { 'pending': 'bg-yellow-400 dark:bg-yellow-300', 'approved': 'bg-green-400 dark:bg-green-300', 'rejected': 'bg-red-400 dark:bg-red-300', + 'denied': 'bg-red-400 dark:bg-red-300', 'expired': 'bg-gray-400 dark:bg-gray-300' }; return dots[status] || 'bg-gray-400 dark:bg-gray-300'; @@ -398,6 +400,7 @@ function getStatusText(status) { 'pending': 'Wartend', 'approved': 'Genehmigt', 'rejected': 'Abgelehnt', + 'denied': 'Abgelehnt', 'expired': 'Abgelaufen' }; return texts[status] || status; @@ -429,7 +432,7 @@ async function approveRequest(requestId) { try { showLoading(true); - const url = `${API_BASE_URL}/api/admin/guest-requests/${requestId}/approve`; + const url = `${API_BASE_URL}/api/requests/${requestId}/approve`; const response = await fetch(url, { method: 'POST', headers: { @@ -437,7 +440,7 @@ async function approveRequest(requestId) { 'X-CSRFToken': csrfToken }, body: JSON.stringify({ - approval_notes: notes || '' + notes: notes || '' }) }); @@ -446,7 +449,7 @@ async function approveRequest(requestId) { if (data.success) { showNotification('✅ Gastauftrag erfolgreich genehmigt', 'success'); if (data.otp_code) { - showNotification(`🔑 OTP-Code für ${data.guest_name}: ${data.otp_code}`, 'info'); + showNotification(`🔑 OTP-Code für ${data.guest_name || 'Gast'}: ${data.otp_code}`, 'info'); } loadGuestRequests(); } else { @@ -470,14 +473,14 @@ async function rejectRequest(requestId) { try { showLoading(true); - const url = `${API_BASE_URL}/api/admin/guest-requests/${requestId}/reject`; + const url = `${API_BASE_URL}/api/requests/${requestId}/deny`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRFToken': csrfToken }, - body: JSON.stringify({ rejection_reason: reason.trim() }) + body: JSON.stringify({ reason: reason.trim() }) }); const data = await response.json(); @@ -563,7 +566,7 @@ function showRequestDetail(requestId) {

Auftrag Details

Datei: ${escapeHtml(request.file_name || 'Keine Datei')}

-

Dauer: ${request.duration_minutes || 'Unbekannt'} Minuten

+

Dauer: ${request.duration_min || 'Unbekannt'} Minuten

Kopien: ${request.copies || 1}

Status: ${getStatusText(request.status)}

@@ -738,7 +741,7 @@ function exportToCSV(data) { req.file_name || '', getStatusText(req.status), formatDateTime(req.created_at), - req.duration_minutes || '', + req.duration_min || '', req.copies || '', req.reason || '' ]); diff --git a/backend/templates/base.html b/backend/templates/base.html index e944e2124..e6cc5655c 100644 --- a/backend/templates/base.html +++ b/backend/templates/base.html @@ -17,8 +17,8 @@ - - + + diff --git a/backend/utils/__pycache__/hardware_integration.cpython-313.pyc b/backend/utils/__pycache__/hardware_integration.cpython-313.pyc index 6adcc09b58d8ddc9645b709de9570f2069671f17..ed6cf8f7c5d5e43f9a88e06fd18e98f504462ed0 100644 GIT binary patch delta 10317 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 delta 3466 zcmai0Yj9h|72eh3%CclhiR9RpWb0af#PTaPaZ>6${D_^zu_HgOl>{uJ$kw$YN0ywG z6i5m<1GGa5ZE%(rrc8<%D1=T!-Dn0p9olgTEuJaUUSqd$ZyBI8L&;F6(@-FxrQLI7 zhosY)-XGtdJ$ugC-LreXy&wJs%THs|m7JVx#6I^w`wvEXCQSLbd1CDoA-~g&1mgw_ zLkN+=e8l=Wb|jcKsFrm_g6gnKF#C%dRD#8hMl^&MR@o6L7FPS+g4JKb#!4DE!KRFr z3b|~oY#kET^kP!(FYN24!FDTc!4>#GdIYakXX`V8(UoTUgvN>Or?dqI9XO9*k}W9R ztmUpjaGcT(jXMQ{Unf}noWS`_Y$`UrV!c|>Fx_f4ruFNX-l{CYDwzBhw%E*qY|JOi zuk-60R9ZGM)3XJ#P2>uNO4L068b1dk%r1|`$X||~FBFi1@ET8%Y;m-a)X*W32uU#| zl2j~wsgl{J8d=t|=>+D}-{L-3Ym>)&;tj1JoK z`;VFUU@8$76GI1s(WICpn^+*Sg^G>}ZYzjQlsf7y%^+{bL{|=?8sOk z7zz5I4~S)rs;unXQ-H%aDvSNWdNBd1V%IA87Aq z&`hsZJMjbbMD>pCD6n@De(Xr1gVu^ap1TOB*|W->{2`SIGnP>6#y6 zANAIbZg>#lodEbIz(W9#8I}|!0VhH6$cmOsfOLv3)#l}1&$yfwCn1pp29J`R)Va=G zs$?Vtmcsy$5E2GB2+#!(p@Zv6>N}Yzs}reFSszKnhvQ^4m?Whzt{l^sCuGQ+P(OWf zT?9f*_Hm9cB!jzLn8?D=z zOW$|dYO;OUgapHX1wvtMF&fCv%#Dx^1rXYhX>?PKa_7C3B3ibksa9jt7ra$oKXJ#@Jr8bw)9AQhES@tKOQoBq`=;Aw zG&6fB%$MnALhsFX`9X9vb2v2Y+MCX&yq zGFK3a;-)hFE+ndg4tR?UsYGCmq{Lw{b}W6q`5ea2(j%?q_$7L}mB(MFKW|N`$hq`~ z9rt5SsiSlBNasFFrU-y6cC%2Vm%i0$cbo(9Iv2@$c7OpfmLx~XUPg{K74cF}R~3FF z?dv*=`*(shkdJJL1{29ZYAh5?ipn0m9v!(pOw?cq6K0CC2qdLirL6ob9~5A) z-Da#qEAO+Su;%E6>=g|wuvPgkuR$qEqfdKN@#nDOH{D!zg82p;mJxwHo~1}w1vs$0 z2SlGV=DLN|N=)m@!fuWewhbWqwyThSzd%R-&~8x;%gVW+3N;#bleZlaAPMTvoF#Q7BDeejp}x zd)I=w!bx!JNE#ds%lnToH?ja~<)MZv$kXSCjP#+sjk>eIN&7H;eeY(C#;&iVrjgol zhwFm9dd^-wZ?Ao@^F6cu@w?A_ZQj+mXf1mD?m27q6rQ)%FY;B-nV&LGWlg*1`7Iat zmN~v9ln^uoPc$L=@ zl`J7Iwr*_mpz}2t)^UU@Rp@qxAAf zF1Azap^kC*O(I$VNO9&*O8KV>LiZVf#{fD2l)o^bMe-7W7oZ!U2Ox`qtWBoIq9XYt z$hm<)A{k6Zh62H4l0*hmjBW#g%s);QcvPU(3~e9+z@8HA6i1)3+qDIgLraJ?(;B6j zv3(4^rCaIGqBZo3=vH@?wh~NOGj-RD`X~1&qSWL26jVxwzA^e4zL)+wR>oaoq2I>z zli0Tvk=#q`4_oQ!xW)BXHnPO-(-i{~j-!hPe%|1gG;X4-@LBqL{4pzdD;e;pGxzl) zM30PlxXVocF{VEl`v&&`m_XE$sw+&q$|8~vK?h+x+RP@EI4~grPjUs(@xvXa3i4;x zlQqf6s7PL>zdIboXK5=5?N@#Tliabkx50hBm@EC2ui diff --git a/backend/utils/__pycache__/job_scheduler.cpython-313.pyc b/backend/utils/__pycache__/job_scheduler.cpython-313.pyc index 0f53cd7e3b58a78e877eb087a43da3b0ce2d36ff..a2e8c67ad555e6a02503d058ad005d73a91814d4 100644 GIT binary patch delta 7822 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 delta 2343 zcmZuyYitx%6y7_#JKeV1(o$+`3)|8s(-tTX`vCetuoYSsp*6IHWZCWx+b#R3cV;Rr zL5hk<2(KIzigpXAs3@f+j>JCI%CYm`JEZO*ApybEkH(x<9@>_uljR z&N=ta-OIwkSB2DvDJe-7_Pg zIhI}<&2B4&pX}A71Pa6ji3Kz-V3TGUS#aEy1$)I?WFL4E_B#R=NpLqwiC}ZIL&UM1 z)PU}&74|0Uzd1UsnNP5ovpt)TE<;fqsn3gj4jy>A?P;=K5_!PvhtGSIW)uhtX8sL|10Z;u;Sld z+@>4be_Wt*E1iXbo9oI zK(&;cQglMp%I+rxUNOg|*GWy*Km#WK_aGn#?3}?uz zs2*RB?At8+4bc}3hl45|K>a}mlEa+GUAQp>g*63a8#L8;NR@uF=A|^E>18V#NOBC1 zM-fhdy7EfK9wr7WSQ`h${D{}rlTSOKxn(E^i(}ZI(_}h8Q&AQ-1w*P#=^?n=lAXtM zbEBJs2yYDoU`Wnh9YE<=xSP%Ie#>p5C z8V!ZIy}r$KKhu*^Om2snOqarN>qc?}{%A#pGgh^de!X{9ax&Qs{T(eLCwKy`cPtm* zLUj$&JF`X3_-&Zm*(kn)yT?K6tPAl8*oSMRNarFnB4AMZAp$3Q2qjLGbL4C}(TVEQ zkC}=jnrU7^bu(9#E+A|JSJyi7qu$?jE|I(orT#kc1n!SQuRrF*P?BH>b1LZtm?q0) zEey&w~_!x|1o=toSdHCxn(Cw%C}8^fK)86QETWV7j>-e|YN zSTzLl$S`;UMZ9UbFdA4#3iaOuY6^)#NXwP3GNZwaX1Ooqjj%z>Um5M5-KKh}N{7*1 zLReN5Z$M_lbxs>^=rQ<0bF=F+qyHc|sh{m0u4w(kz?nqEEOJ@x$0XBf{fe7i-FAdzZ36cm~hiB$@un=x{yJT~- zAHB|2?5kFTo9v72mh$1^aDzA>^B4qj)U{z5iU|l$BeWnm5Y{5#>q(zQ*oY8Bh$2vg z00KUa=5Sp`=^DaU2tQb0=xFuSTkIiv#WE&X?T%lPMEmRqkLjNuy-3P`?Gn0(y^y+4 zx0r#E#2-RFT=#I7eIlyxum-Nbc};xC#M=TK7;%xUaCT&n+<~%KEiu3!tH|LjFuvhr nGuFl&`Lz&x*&bTpRBXENrv*NXxl_VPq;Sl_u{#qAN9+FvxZhP5 diff --git a/backend/utils/hardware_integration.py b/backend/utils/hardware_integration.py index 4b46f5750..86069c4c8 100644 --- a/backend/utils/hardware_integration.py +++ b/backend/utils/hardware_integration.py @@ -33,6 +33,7 @@ except ImportError: # MYP Models & Utils from models import get_db_session, Printer, PlugStatusLog from utils.logging_config import get_logger +import os # Logger hardware_logger = get_logger("hardware_integration") @@ -353,27 +354,55 @@ class DruckerSteuerung: hardware_logger.warning(f"⚠️ Simulation: Steckdose {ip} würde {'eingeschaltet' if einschalten else 'ausgeschaltet'}") return True # Simulation immer erfolgreich - try: - action = "einschalten" if einschalten else "ausschalten" - hardware_logger.debug(f"🔌 Versuche Steckdose {ip} zu {action}") - - # P100-Verbindung herstellen - p100 = PyP100(ip, self.tapo_username, self.tapo_password) - p100.handshake() - p100.login() - - # Schalten - if einschalten: - p100.turnOn() - else: - p100.turnOff() - - hardware_logger.info(f"✅ Steckdose {ip} erfolgreich {action}") - return True - - except Exception as e: - hardware_logger.error(f"❌ Fehler beim Schalten der Steckdose {ip}: {e}") + # Zuerst Netzwerk-Erreichbarkeit prüfen + if not self._erweiterte_netzwerk_prüfung(ip): + hardware_logger.error(f"❌ Steckdose {ip} ist im Netzwerk nicht erreichbar") return False + + retry_count = 0 + max_retries = 3 + + while retry_count < max_retries: + try: + action = "einschalten" if einschalten else "ausschalten" + hardware_logger.debug(f"🔌 Versuche Steckdose {ip} zu {action} (Versuch {retry_count + 1}/{max_retries})") + + # P100-Verbindung herstellen mit Timeout + p100 = PyP100(ip, self.tapo_username, self.tapo_password) + p100.handshake() + p100.login() + + # Schalten + if einschalten: + p100.turnOn() + else: + p100.turnOff() + + hardware_logger.info(f"✅ Steckdose {ip} erfolgreich {action}") + return True + + except Exception as e: + retry_count += 1 + error_msg = str(e) + + # Spezifische Fehlerbehandlung + if "Connection refused" in error_msg: + hardware_logger.error(f"❌ Verbindung zu {ip} verweigert - Steckdose antwortet nicht auf Port 80") + elif "timeout" in error_msg.lower(): + hardware_logger.error(f"❌ Zeitüberschreitung bei Verbindung zu {ip}") + elif "handshake" in error_msg.lower(): + hardware_logger.error(f"❌ Tapo-Handshake fehlgeschlagen für {ip} - Möglicherweise falsche Credentials") + elif "login" in error_msg.lower(): + hardware_logger.error(f"❌ Tapo-Login fehlgeschlagen für {ip} - Benutzername/Passwort prüfen") + else: + hardware_logger.error(f"❌ Fehler beim Schalten der Steckdose {ip}: {e}") + + if retry_count < max_retries: + hardware_logger.info(f"🔄 Warte 2 Sekunden vor erneutem Versuch...") + time.sleep(2) + + hardware_logger.error(f"❌ Alle {max_retries} Versuche für Steckdose {ip} fehlgeschlagen") + return False def _drucker_status_pruefen(self, drucker: Printer) -> str: """Prüft den aktuellen Status eines Druckers""" @@ -397,6 +426,51 @@ class DruckerSteuerung: except: return False + def _erweiterte_netzwerk_prüfung(self, ip: str) -> bool: + """ + Erweiterte Netzwerk-Prüfung mit mehreren Tests. + + Args: + ip: IP-Adresse zum Prüfen + + Returns: + bool: True wenn erreichbar + """ + hardware_logger.debug(f"🔍 Erweiterte Netzwerk-Prüfung für {ip}") + + # Test 1: Port 80 (HTTP) + if self._ping_test(ip, timeout=2): + hardware_logger.debug(f"✅ {ip} auf Port 80 erreichbar") + return True + + # Test 2: Port 9999 (Tapo-spezifisch für manche Modelle) + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(2) + result = sock.connect_ex((ip, 9999)) + sock.close() + if result == 0: + hardware_logger.debug(f"✅ {ip} auf Port 9999 erreichbar") + return True + except: + pass + + # Test 3: ICMP Ping (falls verfügbar) + try: + import subprocess + # Windows und Linux kompatibel + param = '-n' if os.name == 'nt' else '-c' + command = ['ping', param, '1', '-w', '2000', ip] + result = subprocess.run(command, capture_output=True, text=True, timeout=3) + if result.returncode == 0: + hardware_logger.debug(f"✅ {ip} via ICMP Ping erreichbar") + return True + except: + pass + + hardware_logger.warning(f"⚠️ {ip} ist über keine Methode erreichbar") + return False + def _status_log_erstellen(self, drucker_id: int, action: str, grund: str): """Erstellt einen Eintrag im Status-Log""" try: @@ -443,33 +517,171 @@ class DruckerSteuerung: # Legacy-Format: (reachable, status) return (True, 'online') + # Zuerst Netzwerk-Erreichbarkeit prüfen + if not self._erweiterte_netzwerk_prüfung(ip): + hardware_logger.warning(f"⚠️ Steckdose {ip} ist im Netzwerk nicht erreichbar") + return (False, 'unreachable') + + retry_count = 0 + max_retries = 2 + + while retry_count < max_retries: + try: + # Tapo P100/P110 Verbindung + p100 = PyP100(ip, self.tapo_username, self.tapo_password) + p100.handshake() + p100.login() + + # Device Info abrufen + device_info = p100.getDeviceInfo() + + if device_info and 'error_code' in device_info: + if device_info['error_code'] == 0: + device_on = device_info.get('result', {}).get('device_on', False) + + hardware_logger.debug(f"✅ Steckdose {ip}: {'EIN' if device_on else 'AUS'}") + + # Legacy-Format: (reachable, status) + return (True, 'on' if device_on else 'off') + else: + hardware_logger.warning(f"⚠️ Steckdose {ip} Error Code: {device_info['error_code']}") + return (False, 'error') + else: + hardware_logger.error(f"❌ Steckdose {ip}: Keine gültige Antwort") + return (False, 'unreachable') + + except Exception as e: + retry_count += 1 + error_msg = str(e) + + if "Connection refused" in error_msg: + hardware_logger.error(f"❌ Verbindung zu {ip} verweigert") + elif "timeout" in error_msg.lower(): + hardware_logger.error(f"❌ Zeitüberschreitung bei {ip}") + elif "handshake" in error_msg.lower(): + hardware_logger.error(f"❌ Handshake-Fehler bei {ip}") + else: + hardware_logger.error(f"❌ Fehler beim Prüfen von Steckdose {ip}: {e}") + + if retry_count < max_retries: + time.sleep(1) + + return (False, 'unreachable') + + def ping_address(self, ip: str, timeout: int = 5) -> bool: + """ + Prüft die Netzwerk-Erreichbarkeit einer IP-Adresse. + + Args: + ip: IP-Adresse zum Testen + timeout: Timeout in Sekunden + + Returns: + bool: True wenn erreichbar, False sonst + """ + hardware_logger.debug(f"📡 Teste Netzwerk-Erreichbarkeit: {ip}") + try: - # Tapo P100/P110 Verbindung + # Socket-basierter Ping-Test auf Port 80 (HTTP) + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(timeout) + result = sock.connect_ex((ip, 80)) + sock.close() + + is_reachable = (result == 0) + hardware_logger.debug(f"📡 {ip}: {'✅ erreichbar' if is_reachable else '❌ nicht erreichbar'}") + + return is_reachable + + except Exception as e: + hardware_logger.debug(f"❌ Ping-Test für {ip} fehlgeschlagen: {e}") + return False + + def turn_off(self, ip: str, username: str = None, password: str = None, printer_id: int = None) -> bool: + """ + Schaltet eine Tapo-Steckdose aus. + + Args: + ip: IP-Adresse der Steckdose + username: Benutzername (wird ignoriert, verwendet interne Credentials) + password: Passwort (wird ignoriert, verwendet interne Credentials) + printer_id: Optional - ID des Druckers für Logging + + Returns: + bool: True wenn erfolgreich ausgeschaltet + """ + hardware_logger.debug(f"🔴 Schalte Steckdose aus: {ip}" + (f" (Drucker ID: {printer_id})" if printer_id else "")) + + if not TAPO_AVAILABLE: + hardware_logger.info(f"🔄 SIMULATION: Steckdose {ip} ausgeschaltet") + return True + + try: + # P100-Verbindung mit internen Credentials p100 = PyP100(ip, self.tapo_username, self.tapo_password) p100.handshake() p100.login() - # Device Info abrufen - device_info = p100.getDeviceInfo() + # Steckdose ausschalten + p100.turnOff() + + hardware_logger.info(f"✅ Steckdose {ip} erfolgreich ausgeschaltet") + + # Status-Log erstellen falls Drucker-ID verfügbar + if printer_id: + try: + self._status_log_erstellen(printer_id, 'turned_off', 'Startup-Initialisierung') + except: + pass # Fehler beim Logging nicht kritisch + + return True - if device_info and 'error_code' in device_info: - if device_info['error_code'] == 0: - device_on = device_info.get('result', {}).get('device_on', False) - - hardware_logger.debug(f"✅ Steckdose {ip}: {'EIN' if device_on else 'AUS'}") - - # Legacy-Format: (reachable, status) - return (True, 'online' if device_on else 'offline') - else: - hardware_logger.warning(f"⚠️ Steckdose {ip} Error Code: {device_info['error_code']}") - return (False, 'error') - else: - hardware_logger.error(f"❌ Steckdose {ip}: Keine gültige Antwort") - return (False, 'unreachable') - except Exception as e: - hardware_logger.error(f"❌ Fehler beim Prüfen von Steckdose {ip}: {e}") - return (False, 'unreachable') + hardware_logger.error(f"❌ Fehler beim Ausschalten der Steckdose {ip}: {e}") + return False + + def turn_on(self, ip: str, username: str = None, password: str = None, printer_id: int = None) -> bool: + """ + Schaltet eine Tapo-Steckdose ein. + + Args: + ip: IP-Adresse der Steckdose + username: Benutzername (wird ignoriert, verwendet interne Credentials) + password: Passwort (wird ignoriert, verwendet interne Credentials) + printer_id: Optional - ID des Druckers für Logging + + Returns: + bool: True wenn erfolgreich eingeschaltet + """ + hardware_logger.debug(f"🟢 Schalte Steckdose ein: {ip}" + (f" (Drucker ID: {printer_id})" if printer_id else "")) + + if not TAPO_AVAILABLE: + hardware_logger.info(f"🔄 SIMULATION: Steckdose {ip} eingeschaltet") + return True + + try: + # P100-Verbindung mit internen Credentials + p100 = PyP100(ip, self.tapo_username, self.tapo_password) + p100.handshake() + p100.login() + + # Steckdose einschalten + p100.turnOn() + + hardware_logger.info(f"✅ Steckdose {ip} erfolgreich eingeschaltet") + + # Status-Log erstellen falls Drucker-ID verfügbar + if printer_id: + try: + self._status_log_erstellen(printer_id, 'turned_on', 'Manuell') + except: + pass # Fehler beim Logging nicht kritisch + + return True + + except Exception as e: + hardware_logger.error(f"❌ Fehler beim Einschalten der Steckdose {ip}: {e}") + return False # ===== GLOBALE INSTANZ ===== diff --git a/backend/utils/job_scheduler.py b/backend/utils/job_scheduler.py index 68258e71f..64f8e661a 100644 --- a/backend/utils/job_scheduler.py +++ b/backend/utils/job_scheduler.py @@ -39,6 +39,7 @@ class BackgroundTaskScheduler: self._running = False self._start_time: Optional[datetime] = None self.logger = get_scheduler_logger() + self._outlets_initialized = False # Flag für einmalige Initialisierung def register_task(self, task_id: str, @@ -713,6 +714,188 @@ class BackgroundTaskScheduler: db_session.rollback() db_session.close() + def initialize_all_outlets_on_startup(self) -> Dict[str, bool]: + """ + Initialisiert alle konfigurierten Steckdosen beim Systemstart. + + Schaltet alle im Netzwerk erreichbaren Tapo-Steckdosen aus, um einen + einheitlichen Startzustand (aus = frei) zu gewährleisten. + + Returns: + Dict[str, bool]: Ergebnis der Initialisierung pro Drucker + """ + if self._outlets_initialized: + self.logger.info("🔄 Steckdosen bereits initialisiert - überspringe") + return {} + + self.logger.info("🚀 Starte Steckdosen-Initialisierung beim Systemstart...") + results = {} + success_count = 0 + total_count = 0 + unreachable_count = 0 + + try: + db_session = get_db_session() + + # Alle aktiven Drucker mit Steckdosen-Konfiguration laden + printers = db_session.query(Printer).filter( + Printer.active == True, + Printer.plug_ip.isnot(None) + ).all() + + if not printers: + self.logger.warning("⚠️ Keine aktiven Drucker mit Steckdosen-Konfiguration gefunden") + db_session.close() + return results + + total_count = len(printers) + self.logger.info(f"🔍 Prüfe {total_count} konfigurierte Steckdosen...") + + # Tapo-Controller für die Operationen verwenden + tapo_controller = get_tapo_controller() + + # Jede Steckdose einzeln verarbeiten + for printer in printers: + printer_name = printer.name + plug_ip = printer.plug_ip + + try: + self.logger.debug(f"🔌 Verarbeite {printer_name} ({plug_ip})...") + + # 1. Netzwerk-Erreichbarkeit prüfen + is_reachable = tapo_controller.ping_address(plug_ip, timeout=3) + + if not is_reachable: + self.logger.warning(f"📡 {printer_name}: Steckdose {plug_ip} nicht erreichbar") + results[printer_name] = { + 'success': False, + 'reason': 'nicht_erreichbar', + 'ip': plug_ip + } + unreachable_count += 1 + continue + + # 2. Aktuellen Status prüfen + reachable, current_status = tapo_controller.check_outlet_status( + plug_ip, + printer_id=printer.id, + debug=True + ) + + if not reachable: + self.logger.warning(f"🔗 {printer_name}: Tapo-Verbindung fehlgeschlagen") + results[printer_name] = { + 'success': False, + 'reason': 'verbindung_fehlgeschlagen', + 'ip': plug_ip + } + unreachable_count += 1 + continue + + # 3. Steckdose ausschalten (nur wenn nötig) + if current_status == "on": + self.logger.info(f"🔄 {printer_name}: Schalte Steckdose von 'an' auf 'aus' um...") + + success = tapo_controller.turn_off( + plug_ip, + printer_id=printer.id + ) + + if success: + self.logger.info(f"✅ {printer_name}: Erfolgreich ausgeschaltet") + + # Drucker-Status in Datenbank aktualisieren + printer.status = "offline" + printer.last_checked = datetime.now() + + results[printer_name] = { + 'success': True, + 'action': 'ausgeschaltet', + 'previous_status': 'an', + 'ip': plug_ip + } + success_count += 1 + else: + self.logger.error(f"❌ {printer_name}: Ausschalten fehlgeschlagen") + results[printer_name] = { + 'success': False, + 'reason': 'ausschalten_fehlgeschlagen', + 'ip': plug_ip + } + + elif current_status == "off": + self.logger.info(f"✓ {printer_name}: Bereits ausgeschaltet - keine Aktion nötig") + + # Status in Datenbank aktualisieren + printer.status = "offline" + printer.last_checked = datetime.now() + + results[printer_name] = { + 'success': True, + 'action': 'bereits_aus', + 'previous_status': 'aus', + 'ip': plug_ip + } + success_count += 1 + + else: + self.logger.warning(f"⚠️ {printer_name}: Unbekannter Status '{current_status}'") + results[printer_name] = { + 'success': False, + 'reason': 'unbekannter_status', + 'status': current_status, + 'ip': plug_ip + } + + except Exception as e: + self.logger.error(f"❌ {printer_name}: Fehler bei Initialisierung - {str(e)}") + results[printer_name] = { + 'success': False, + 'reason': 'ausnahme', + 'error': str(e), + 'ip': plug_ip + } + + # Änderungen in der Datenbank speichern + try: + db_session.commit() + self.logger.debug("💾 Datenbank-Änderungen gespeichert") + except Exception as e: + self.logger.error(f"❌ Fehler beim Speichern der Datenbank-Änderungen: {str(e)}") + db_session.rollback() + + db_session.close() + + # Zusammenfassung loggen + self.logger.info("=" * 60) + self.logger.info("🎯 STECKDOSEN-INITIALISIERUNG ABGESCHLOSSEN") + self.logger.info(f"📊 Gesamt: {total_count} Steckdosen") + self.logger.info(f"✅ Erfolgreich: {success_count}") + self.logger.info(f"📡 Nicht erreichbar: {unreachable_count}") + self.logger.info(f"❌ Fehlgeschlagen: {total_count - success_count - unreachable_count}") + + if success_count == total_count: + self.logger.info("🌟 ALLE Steckdosen erfolgreich initialisiert!") + elif success_count > 0: + self.logger.info(f"⚡ {success_count}/{total_count} Steckdosen erfolgreich initialisiert") + else: + self.logger.warning("⚠️ KEINE Steckdose konnte initialisiert werden!") + + self.logger.info("=" * 60) + + # Flag setzen um Mehrfach-Initialisierung zu verhindern + self._outlets_initialized = True + + except Exception as e: + self.logger.error(f"❌ Kritischer Fehler bei Steckdosen-Initialisierung: {str(e)}") + try: + db_session.rollback() + db_session.close() + except: + pass + + return results + # Scheduler-Instanz erzeugen scheduler = BackgroundTaskScheduler()