From 9f29705dafcefe0ecaf972ce3aa3c065699320d3 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Tue, 3 Jun 2025 23:15:06 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=89=20Updated=20various=20log=20files?= =?UTF-8?q?=20and=20added=20new=20scripts=20for=20kiosk=20start=20in=20bac?= =?UTF-8?q?kend=20directory=20=F0=9F=93=9A=F0=9F=94=A7=F0=9F=92=BB?= =?UTF-8?q?=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/__pycache__/app.cpython-313.pyc | Bin 414798 -> 433732 bytes backend/database/myp.db | Bin 135168 -> 135168 bytes backend/logs/analytics/analytics.log | 5 + backend/logs/app/app.log | 127 ++ backend/logs/auth/auth.log | 24 + backend/logs/backup/backup.log | 5 + backend/logs/dashboard/dashboard.log | 20 + backend/logs/database/database.log | 5 + .../database_cleanup/database_cleanup.log | 12 + .../email_notification/email_notification.log | 5 + .../logs/error_recovery/error_recovery.log | 16 + backend/logs/jobs/jobs.log | 2 + backend/logs/maintenance/maintenance.log | 10 + .../logs/multi_location/multi_location.log | 10 + backend/logs/permissions/permissions.log | 5 + .../logs/printer_monitor/printer_monitor.log | 54 + backend/logs/printers/printers.log | 6 + backend/logs/queue_manager/queue_manager.log | 11 + backend/logs/scheduler/scheduler.log | 412 +++++ backend/logs/security/security.log | 5 + .../shutdown_manager/shutdown_manager.log | 7 + backend/logs/startup/startup.log | 45 + .../logs/system_control/system_control.log | 4 + backend/logs/windows_fixes/windows_fixes.log | 20 + backend/start_kiosk_fixed.py | 179 +++ backend/start_kiosk_optimized.py | 327 ++++ backend/templates/base.html | 1389 +++++++++++++++-- 27 files changed, 2535 insertions(+), 170 deletions(-) create mode 100644 backend/start_kiosk_fixed.py create mode 100644 backend/start_kiosk_optimized.py diff --git a/backend/__pycache__/app.cpython-313.pyc b/backend/__pycache__/app.cpython-313.pyc index 99402d19854ccdeeb5c3df16b09ae96eb1b71d51..50943b7a5c5100254f00a8eaacbd7cf81346bf90 100644 GIT binary patch delta 75396 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 diff --git a/backend/database/myp.db b/backend/database/myp.db index 82bc53801c09fe10f7a937df10c3785809e84ce8..2dbb8155b2a65bb410f0e13a67c3693680a91bef 100644 GIT binary patch delta 126 zcmV-^0D=F2pa_7V2#^~A_K_Sz0rs(A3okWBT2@SYHgQs8RYGe@L0VE~az=Vcb#E^+ zO;RvdaBp#WO>a|HQZ-IPSafSNIZ$~=Pij*xlb|nE3pqM8H!dkvM|>z6Eiw6 gG&(afE-*GWFflbVGJ!AylhIoxgAZP}4_*QBv3O@Fv;Y7A delta 126 zcmV-^0D=F2pa_7V2#^~A?~xos0q?P33okWCE@??xOfXJMXm@EdX?0LWYgc+WE^cy8 zSa^7JGiXjZYH4d)VN@_|WHLuKMr1;8S~75Xlb|nE3p6?~F)lPVH#RjivM|>z6EZq6 gHaamhE-^4QI5ssiGJ!AylhIoxgAZP}4_*QBv2|W3(EtDd diff --git a/backend/logs/analytics/analytics.log b/backend/logs/analytics/analytics.log index d90185fe..8159a732 100644 --- a/backend/logs/analytics/analytics.log +++ b/backend/logs/analytics/analytics.log @@ -129,3 +129,8 @@ 2025-06-03 22:15:15 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert 2025-06-03 22:15:51 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert 2025-06-03 23:03:59 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-03 23:04:27 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-03 23:05:08 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-03 23:06:43 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-03 23:07:16 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-03 23:09:46 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert diff --git a/backend/logs/app/app.log b/backend/logs/app/app.log index ff1c0486..99dc5750 100644 --- a/backend/logs/app/app.log +++ b/backend/logs/app/app.log @@ -3367,3 +3367,130 @@ WHERE jobs.status = ?) AS anon_1] 2025-06-03 23:04:01 - [app] app - [INFO] INFO - Job-Scheduler gestartet 2025-06-03 23:04:01 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) 2025-06-03 23:04:01 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert +2025-06-03 23:04:27 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-03 23:04:28 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-03 23:04:28 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-03 23:04:28 - [app] app - [INFO] INFO - 📋 Standard-Konfiguration verwendet +2025-06-03 23:04:28 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-03 23:04:28 - [app] app - [INFO] INFO - ✅ Error-Recovery-Monitoring gestartet +2025-06-03 23:04:28 - [app] app - [INFO] INFO - ✅ System-Control-Manager initialisiert +2025-06-03 23:04:28 - [app] app - [WARNING] WARNING - ⚠️ Kiosk-Service nicht gefunden - Kiosk-Funktionen eventuell eingeschränkt +2025-06-03 23:04:28 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-03 23:04:28 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-03 23:04:28 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-03 23:04:28 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-03 23:04:28 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-03 23:04:28 - [app] app - [INFO] INFO - 📋 Standard-Konfiguration aktiv (keine Optimierungen) +2025-06-03 23:04:28 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-03 23:04:28 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden +2025-06-03 23:04:28 - [app] app - [INFO] INFO - ✅ Printer Queue Manager erfolgreich gestartet +2025-06-03 23:04:28 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-03 23:04:28 - [app] app - [INFO] INFO - Starte HTTP-Server auf 0.0.0.0:80 +2025-06-03 23:04:33 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-03 23:05:08 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-03 23:05:09 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-03 23:05:09 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-03 23:05:09 - [app] app - [INFO] INFO - 📋 Standard-Konfiguration verwendet +2025-06-03 23:05:09 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-03 23:05:09 - [app] app - [INFO] INFO - ✅ Error-Recovery-Monitoring gestartet +2025-06-03 23:05:09 - [app] app - [INFO] INFO - ✅ System-Control-Manager initialisiert +2025-06-03 23:05:09 - [app] app - [WARNING] WARNING - ⚠️ Kiosk-Service nicht gefunden - Kiosk-Funktionen eventuell eingeschränkt +2025-06-03 23:05:09 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-03 23:05:09 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-03 23:05:09 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-03 23:05:09 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-03 23:05:09 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-03 23:05:09 - [app] app - [INFO] INFO - 📋 Standard-Konfiguration aktiv (keine Optimierungen) +2025-06-03 23:05:09 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-03 23:05:09 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden +2025-06-03 23:05:09 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung +2025-06-03 23:05:09 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-03 23:05:09 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) +2025-06-03 23:05:09 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert +2025-06-03 23:06:42 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-03 23:06:44 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-03 23:06:44 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-03 23:06:44 - [app] app - [INFO] INFO - 🚀 Aktiviere optimierte Konfiguration für schwache Hardware/Raspberry Pi +2025-06-03 23:06:44 - [app] app - [INFO] INFO - ✅ Optimierte Konfiguration aktiviert +2025-06-03 23:06:49 - [app] app - [ERROR] ERROR - Exception on / [GET] +Traceback (most recent call last): + File "C:\Users\TTOMCZA.EMEA\AppData\Roaming\Python\Python313\site-packages\flask\app.py", line 2190, in wsgi_app + response = self.full_dispatch_request() + File "C:\Users\TTOMCZA.EMEA\AppData\Roaming\Python\Python313\site-packages\flask\app.py", line 1486, in full_dispatch_request + rv = self.handle_user_exception(e) + File "C:\Users\TTOMCZA.EMEA\AppData\Roaming\Python\Python313\site-packages\flask\app.py", line 1484, in full_dispatch_request + rv = self.dispatch_request() + File "C:\Users\TTOMCZA.EMEA\AppData\Roaming\Python\Python313\site-packages\flask\app.py", line 1469, in dispatch_request + return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ + File "C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\app.py", line 2361, in index + return render_template("index.html") + File "C:\Users\TTOMCZA.EMEA\AppData\Roaming\Python\Python313\site-packages\flask\templating.py", line 151, in render_template + return _render(app, template, context) + File "C:\Users\TTOMCZA.EMEA\AppData\Roaming\Python\Python313\site-packages\flask\templating.py", line 132, in _render + rv = template.render(context) + File "C:\Users\TTOMCZA.EMEA\AppData\Roaming\Python\Python313\site-packages\jinja2\environment.py", line 1295, in render + self.environment.handle_exception() + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ + File "C:\Users\TTOMCZA.EMEA\AppData\Roaming\Python\Python313\site-packages\jinja2\environment.py", line 942, in handle_exception + raise rewrite_traceback_stack(source=source) + File "C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates\index.html", line 1, in top-level template code + {% extends "base.html" %} + File "C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\templates\base.html", line 103, in top-level template code + Abmelden + + File "C:\Users\TTOMCZA.EMEA\AppData\Roaming\Python\Python313\site-packages\flask\app.py", line 1697, in url_for + return self.handle_url_build_error(error, endpoint, values) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\TTOMCZA.EMEA\AppData\Roaming\Python\Python313\site-packages\flask\app.py", line 1686, in url_for + rv = url_adapter.build( # type: ignore[union-attr] + endpoint, + ...<3 lines>... + force_external=_external, + ) + File "C:\Users\TTOMCZA.EMEA\AppData\Roaming\Python\Python313\site-packages\werkzeug\routing\map.py", line 924, in build + raise BuildError(endpoint, values, method, self) +werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'auth.logout'. Did you mean 'auth_logout' instead? +2025-06-03 23:06:54 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-03 23:07:15 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-03 23:07:16 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-03 23:07:16 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-03 23:07:16 - [app] app - [INFO] INFO - 📋 Standard-Konfiguration verwendet +2025-06-03 23:07:17 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-03 23:07:17 - [app] app - [INFO] INFO - ✅ Error-Recovery-Monitoring gestartet +2025-06-03 23:07:17 - [app] app - [INFO] INFO - ✅ System-Control-Manager initialisiert +2025-06-03 23:07:17 - [app] app - [WARNING] WARNING - ⚠️ Kiosk-Service nicht gefunden - Kiosk-Funktionen eventuell eingeschränkt +2025-06-03 23:07:17 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-03 23:07:17 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-03 23:07:17 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-03 23:07:17 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-03 23:07:17 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-03 23:07:17 - [app] app - [INFO] INFO - 📋 Standard-Konfiguration aktiv (keine Optimierungen) +2025-06-03 23:07:17 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-03 23:07:17 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden +2025-06-03 23:07:17 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung +2025-06-03 23:07:17 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-03 23:07:17 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) +2025-06-03 23:07:17 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert +2025-06-03 23:09:45 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-03 23:09:46 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-03 23:09:46 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-03 23:09:46 - [app] app - [INFO] INFO - 📋 Standard-Konfiguration verwendet +2025-06-03 23:09:46 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-03 23:09:46 - [app] app - [INFO] INFO - ✅ Error-Recovery-Monitoring gestartet +2025-06-03 23:09:46 - [app] app - [INFO] INFO - ✅ System-Control-Manager initialisiert +2025-06-03 23:09:46 - [app] app - [WARNING] WARNING - ⚠️ Kiosk-Service nicht gefunden - Kiosk-Funktionen eventuell eingeschränkt +2025-06-03 23:09:46 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-03 23:09:47 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-03 23:09:47 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-03 23:09:47 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-03 23:09:47 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-03 23:09:47 - [app] app - [INFO] INFO - 📋 Standard-Konfiguration aktiv (keine Optimierungen) +2025-06-03 23:09:47 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-03 23:09:47 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden +2025-06-03 23:09:47 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung +2025-06-03 23:09:47 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-03 23:09:47 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) +2025-06-03 23:09:47 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert +2025-06-03 23:10:19 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True +2025-06-03 23:10:25 - [app] app - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich abgemeldet diff --git a/backend/logs/auth/auth.log b/backend/logs/auth/auth.log index 70533f1e..ababb116 100644 --- a/backend/logs/auth/auth.log +++ b/backend/logs/auth/auth.log @@ -938,3 +938,27 @@ 2025-06-03 22:15:28 - [auth] auth - [INFO] INFO - 🕒 Automatische Abmeldung: Benutzer admin@mercedes-benz.com war 85.0 Minuten inaktiv (Limit: 60min) 2025-06-03 22:15:28 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 10.0.2.2 2025-06-03 23:04:06 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:05:15 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:06:49 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:06:49 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:07:23 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:08:41 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:08:41 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:08:41 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:08:45 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:08:45 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:08:45 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:08:51 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:08:51 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:08:51 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:08:54 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:08:54 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:08:54 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:09:52 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:10:05 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:10:05 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:10:05 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:10:12 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:10:12 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:10:12 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 +2025-06-03 23:10:19 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1 diff --git a/backend/logs/backup/backup.log b/backend/logs/backup/backup.log index a5203c24..aff64826 100644 --- a/backend/logs/backup/backup.log +++ b/backend/logs/backup/backup.log @@ -134,3 +134,8 @@ 2025-06-03 22:15:15 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) 2025-06-03 22:15:51 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) 2025-06-03 23:03:59 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-03 23:04:27 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-03 23:05:08 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-03 23:06:43 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-03 23:07:15 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-03 23:09:45 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) diff --git a/backend/logs/dashboard/dashboard.log b/backend/logs/dashboard/dashboard.log index fc777a73..9afb09c9 100644 --- a/backend/logs/dashboard/dashboard.log +++ b/backend/logs/dashboard/dashboard.log @@ -518,3 +518,23 @@ 2025-06-03 23:04:00 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet 2025-06-03 23:04:00 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) 2025-06-03 23:04:00 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-03 23:04:28 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 23:04:28 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 23:04:28 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-03 23:04:28 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-03 23:05:09 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 23:05:09 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 23:05:09 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-03 23:05:09 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-03 23:06:43 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 23:06:44 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 23:06:44 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-03 23:06:44 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-03 23:07:16 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 23:07:16 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 23:07:16 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-03 23:07:16 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-03 23:09:46 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 23:09:46 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 23:09:46 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-03 23:09:46 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) diff --git a/backend/logs/database/database.log b/backend/logs/database/database.log index 4f016171..bddbf658 100644 --- a/backend/logs/database/database.log +++ b/backend/logs/database/database.log @@ -130,3 +130,8 @@ 2025-06-03 22:15:15 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet 2025-06-03 22:15:51 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet 2025-06-03 23:03:59 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-03 23:04:27 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-03 23:05:08 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-03 23:06:43 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-03 23:07:15 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-03 23:09:45 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet diff --git a/backend/logs/database_cleanup/database_cleanup.log b/backend/logs/database_cleanup/database_cleanup.log index ed8660df..87b54893 100644 --- a/backend/logs/database_cleanup/database_cleanup.log +++ b/backend/logs/database_cleanup/database_cleanup.log @@ -52,3 +52,15 @@ 2025-06-03 23:04:01 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup... 2025-06-03 23:04:01 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen... 2025-06-03 23:04:01 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen... +2025-06-03 23:04:28 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup... +2025-06-03 23:04:28 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen... +2025-06-03 23:04:28 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen... +2025-06-03 23:05:09 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup... +2025-06-03 23:05:09 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen... +2025-06-03 23:05:09 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen... +2025-06-03 23:07:17 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup... +2025-06-03 23:07:17 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen... +2025-06-03 23:07:17 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen... +2025-06-03 23:09:47 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup... +2025-06-03 23:09:47 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen... +2025-06-03 23:09:47 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen... diff --git a/backend/logs/email_notification/email_notification.log b/backend/logs/email_notification/email_notification.log index 8a6893fb..f748ec9b 100644 --- a/backend/logs/email_notification/email_notification.log +++ b/backend/logs/email_notification/email_notification.log @@ -126,3 +126,8 @@ 2025-06-03 22:15:16 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) 2025-06-03 22:15:51 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) 2025-06-03 23:04:00 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-03 23:04:28 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-03 23:05:09 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-03 23:06:44 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-03 23:07:16 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-03 23:09:46 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) diff --git a/backend/logs/error_recovery/error_recovery.log b/backend/logs/error_recovery/error_recovery.log index b1e60da7..059ccc84 100644 --- a/backend/logs/error_recovery/error_recovery.log +++ b/backend/logs/error_recovery/error_recovery.log @@ -50,3 +50,19 @@ 2025-06-03 23:04:01 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet 2025-06-03 23:04:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: database_lock - 2025-06-01 00:29:13 - myp.app - ERROR - ❌ Fehler beim Datenbank-Cleanup: (sqlite3.OperationalError) database is locked 2025-06-03 23:04:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: reset_database +2025-06-03 23:04:28 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert +2025-06-03 23:04:28 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet +2025-06-03 23:04:28 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: database_lock - 2025-06-01 00:29:13 - myp.app - ERROR - ❌ Fehler beim Datenbank-Cleanup: (sqlite3.OperationalError) database is locked +2025-06-03 23:04:28 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: reset_database +2025-06-03 23:05:09 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert +2025-06-03 23:05:09 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet +2025-06-03 23:05:09 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: database_lock - 2025-06-01 00:29:13 - myp.app - ERROR - ❌ Fehler beim Datenbank-Cleanup: (sqlite3.OperationalError) database is locked +2025-06-03 23:05:09 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: reset_database +2025-06-03 23:07:17 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert +2025-06-03 23:07:17 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet +2025-06-03 23:07:17 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: database_lock - 2025-06-01 00:29:13 - myp.app - ERROR - ❌ Fehler beim Datenbank-Cleanup: (sqlite3.OperationalError) database is locked +2025-06-03 23:07:17 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: reset_database +2025-06-03 23:09:46 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert +2025-06-03 23:09:46 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet +2025-06-03 23:09:47 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: database_lock - 2025-06-01 00:29:13 - myp.app - ERROR - ❌ Fehler beim Datenbank-Cleanup: (sqlite3.OperationalError) database is locked +2025-06-03 23:09:47 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: reset_database diff --git a/backend/logs/jobs/jobs.log b/backend/logs/jobs/jobs.log index 19ae2b97..8eea1c93 100644 --- a/backend/logs/jobs/jobs.log +++ b/backend/logs/jobs/jobs.log @@ -149,3 +149,5 @@ FROM jobs LEFT OUTER JOIN users AS users_1 ON users_1.id = jobs.user_id LEFT OUT 2025-06-03 13:31:45 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1) 2025-06-03 20:43:48 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1) 2025-06-03 22:16:06 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1) +2025-06-03 23:08:51 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1) +2025-06-03 23:10:12 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1) diff --git a/backend/logs/maintenance/maintenance.log b/backend/logs/maintenance/maintenance.log index f76ec6c4..ec2a1630 100644 --- a/backend/logs/maintenance/maintenance.log +++ b/backend/logs/maintenance/maintenance.log @@ -258,3 +258,13 @@ 2025-06-03 22:15:51 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet 2025-06-03 23:04:00 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet 2025-06-03 23:04:00 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 23:04:28 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 23:04:28 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 23:05:09 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 23:05:09 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 23:06:44 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 23:06:44 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 23:07:16 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 23:07:16 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 23:09:46 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 23:09:46 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet diff --git a/backend/logs/multi_location/multi_location.log b/backend/logs/multi_location/multi_location.log index 8eddf229..b0d587f9 100644 --- a/backend/logs/multi_location/multi_location.log +++ b/backend/logs/multi_location/multi_location.log @@ -256,3 +256,13 @@ 2025-06-03 22:15:51 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt 2025-06-03 23:04:00 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt 2025-06-03 23:04:00 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 23:04:28 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 23:04:28 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 23:05:09 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 23:05:09 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 23:06:44 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 23:06:44 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 23:07:16 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 23:07:16 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 23:09:46 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 23:09:46 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt diff --git a/backend/logs/permissions/permissions.log b/backend/logs/permissions/permissions.log index 26975aea..b360dfe4 100644 --- a/backend/logs/permissions/permissions.log +++ b/backend/logs/permissions/permissions.log @@ -128,3 +128,8 @@ 2025-06-03 22:15:16 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert 2025-06-03 22:15:51 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert 2025-06-03 23:04:00 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-03 23:04:28 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-03 23:05:09 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-03 23:06:44 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-03 23:07:16 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-03 23:09:46 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert diff --git a/backend/logs/printer_monitor/printer_monitor.log b/backend/logs/printer_monitor/printer_monitor.log index b64295ce..94b9fa39 100644 --- a/backend/logs/printer_monitor/printer_monitor.log +++ b/backend/logs/printer_monitor/printer_monitor.log @@ -3459,3 +3459,57 @@ 2025-06-03 23:04:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 2025-06-03 23:04:13 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 2025-06-03 23:04:19 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-03 23:04:27 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-03 23:04:27 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-03 23:04:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-03 23:04:28 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden +2025-06-03 23:04:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-03 23:04:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-03 23:04:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-03 23:04:35 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-03 23:04:41 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-03 23:04:47 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-03 23:04:53 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-03 23:05:08 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-03 23:05:08 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-03 23:05:09 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-03 23:05:09 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden +2025-06-03 23:05:10 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-03 23:05:10 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-03 23:05:10 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-03 23:05:16 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-03 23:05:22 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-03 23:05:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-03 23:05:34 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-03 23:06:43 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-03 23:06:43 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-03 23:06:45 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-03 23:06:45 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-03 23:06:45 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-03 23:06:51 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-03 23:07:15 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-03 23:07:15 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-03 23:07:17 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-03 23:07:17 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden +2025-06-03 23:07:17 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-03 23:07:17 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-03 23:07:17 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-03 23:07:23 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-03 23:07:30 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-03 23:07:36 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-03 23:07:42 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-03 23:07:48 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105 +2025-06-03 23:07:54 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.2s +2025-06-03 23:09:45 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-03 23:09:45 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-03 23:09:47 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-03 23:09:47 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden +2025-06-03 23:09:47 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-03 23:09:47 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-03 23:09:47 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-03 23:09:53 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-03 23:10:00 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-03 23:10:06 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-03 23:10:12 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-03 23:10:18 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105 +2025-06-03 23:10:24 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.2s diff --git a/backend/logs/printers/printers.log b/backend/logs/printers/printers.log index 4939758c..f7a623d4 100644 --- a/backend/logs/printers/printers.log +++ b/backend/logs/printers/printers.log @@ -6857,3 +6857,9 @@ 2025-06-03 22:16:14 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) 2025-06-03 22:16:14 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker 2025-06-03 22:16:14 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 104.60ms +2025-06-03 23:08:45 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-03 23:08:45 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-03 23:08:51 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-03 23:10:05 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-03 23:10:05 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-03 23:10:12 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) diff --git a/backend/logs/queue_manager/queue_manager.log b/backend/logs/queue_manager/queue_manager.log index 8dfb255b..04ec5567 100644 --- a/backend/logs/queue_manager/queue_manager.log +++ b/backend/logs/queue_manager/queue_manager.log @@ -171,3 +171,14 @@ 2025-06-03 22:16:20 - [queue_manager] queue_manager - [INFO] INFO - 🛑 Shutdown-Signal empfangen - beende Monitor-Loop 2025-06-03 22:16:20 - [queue_manager] queue_manager - [INFO] INFO - 🔚 Monitor-Loop beendet 2025-06-03 22:16:20 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestoppt +2025-06-03 23:04:28 - [queue_manager] queue_manager - [INFO] INFO - 🚀 Initialisiere neuen Queue-Manager... +2025-06-03 23:04:28 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Zentrale Shutdown-Verwaltung erkannt - deaktiviere lokale Signal-Handler +2025-06-03 23:04:28 - [queue_manager] queue_manager - [INFO] INFO - 🚀 Starte Printer Queue Manager... +2025-06-03 23:04:28 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Queue-Überwachung gestartet (Intervall: 120 Sekunden) +2025-06-03 23:04:28 - [queue_manager] queue_manager - [INFO] INFO - ✅ Printer Queue Manager gestartet +2025-06-03 23:04:28 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestartet +2025-06-03 23:04:28 - [queue_manager] queue_manager - [INFO] INFO - 🔍 Überprüfe 8 wartende Jobs... +2025-06-03 23:04:28 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Stoppe Queue-Manager... +2025-06-03 23:04:28 - [queue_manager] queue_manager - [INFO] INFO - ⏳ Warte auf Monitor-Thread... +2025-06-03 23:04:32 - [queue_manager] queue_manager - [INFO] INFO - 🛑 Shutdown-Signal empfangen - beende Monitor-Loop +2025-06-03 23:04:32 - [queue_manager] queue_manager - [INFO] INFO - 🔚 Monitor-Loop beendet diff --git a/backend/logs/scheduler/scheduler.log b/backend/logs/scheduler/scheduler.log index 4b028fd1..8d44ffbb 100644 --- a/backend/logs/scheduler/scheduler.log +++ b/backend/logs/scheduler/scheduler.log @@ -32295,3 +32295,415 @@ 2025-06-03 23:04:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:04:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten 2025-06-03 23:04:20 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 23:04:27 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-03 23:04:28 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-03 23:04:28 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-03 23:04:28 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 23:04:31 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:31 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 23:04:31 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 23:04:33 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:33 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Steckdose für Drucker 4: (sqlite3.ProgrammingError) Cannot operate on a closed database. +(Background on this error at: https://sqlalche.me/e/20/f405) +2025-06-03 23:04:33 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 23:04:33 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 23:04:35 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:35 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 23:04:35 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 23:04:37 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:37 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 23:04:37 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 23:04:39 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:39 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 23:04:39 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 23:04:41 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:41 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 23:04:41 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 23:04:43 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:43 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 23:04:43 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 23:04:46 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:46 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 23:04:46 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 23:04:48 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:04:48 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 23:04:48 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 23:04:50 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:04:50 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten +2025-06-03 23:04:50 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-03 23:04:52 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:04:52 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-03 23:04:52 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-03 23:04:54 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:04:54 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-03 23:04:54 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-03 23:05:08 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-03 23:05:09 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-03 23:05:09 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-03 23:05:09 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 23:05:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:05:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 23:05:11 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 23:05:13 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:05:13 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 23:05:13 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 23:05:15 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:05:15 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 23:05:15 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 23:05:18 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:05:18 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 23:05:18 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 23:05:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:05:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 23:05:20 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 23:05:22 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:05:22 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 23:05:22 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 23:05:24 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:05:24 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 23:05:24 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 23:05:26 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:05:26 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 23:05:26 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 23:05:28 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:05:28 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 23:05:28 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 23:05:30 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:05:30 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten +2025-06-03 23:05:30 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-03 23:05:32 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:05:32 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-03 23:05:32 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-03 23:05:34 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:05:34 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-03 23:05:34 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-03 23:06:43 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-03 23:07:15 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-03 23:07:17 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-03 23:07:17 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-03 23:07:17 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 23:07:19 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:19 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 23:07:19 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 23:07:21 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:21 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 23:07:21 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 23:07:23 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:23 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 23:07:23 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 23:07:25 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:25 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 23:07:25 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 23:07:28 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:28 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 23:07:28 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 23:07:30 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:30 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 23:07:30 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 23:07:32 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:32 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 23:07:32 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 23:07:34 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:34 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 23:07:34 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 23:07:36 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:07:36 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 23:07:36 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 23:07:38 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:07:38 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten +2025-06-03 23:07:38 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-03 23:07:40 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:07:40 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-03 23:07:40 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-03 23:07:42 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:07:42 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-03 23:07:42 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-03 23:07:44 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:44 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten +2025-06-03 23:07:44 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2 +2025-06-03 23:07:47 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:47 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 14 nicht einschalten +2025-06-03 23:07:47 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 15: test +2025-06-03 23:07:49 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:49 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 15 nicht einschalten +2025-06-03 23:07:49 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 16: test +2025-06-03 23:07:51 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:51 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 16 nicht einschalten +2025-06-03 23:07:52 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 23:07:54 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:54 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 23:07:54 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 23:07:56 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:56 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 23:07:56 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 23:07:58 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:07:58 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 23:07:58 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 23:08:00 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:00 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 23:08:00 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 23:08:02 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:02 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 23:08:02 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 23:08:04 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:04 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 23:08:04 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 23:08:06 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:06 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 23:08:06 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 23:08:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 23:08:09 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 23:08:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:08:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 23:08:11 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 23:08:13 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:08:13 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten +2025-06-03 23:08:13 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-03 23:08:15 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:08:15 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-03 23:08:15 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-03 23:08:17 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:08:17 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-03 23:08:17 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-03 23:08:19 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:19 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten +2025-06-03 23:08:19 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2 +2025-06-03 23:08:21 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:21 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 14 nicht einschalten +2025-06-03 23:08:21 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 15: test +2025-06-03 23:08:23 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:23 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 15 nicht einschalten +2025-06-03 23:08:23 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 16: test +2025-06-03 23:08:25 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:25 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 16 nicht einschalten +2025-06-03 23:08:26 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 23:08:29 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:29 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 23:08:29 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 23:08:31 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:31 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 23:08:31 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 23:08:33 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:33 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 23:08:33 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 23:08:35 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:35 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 23:08:35 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 23:08:37 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:37 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 23:08:37 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 23:08:39 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:39 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 23:08:39 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 23:08:41 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:41 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 23:08:41 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 23:08:43 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:43 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 23:08:43 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 23:08:45 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:08:45 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 23:08:45 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 23:08:47 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:08:47 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten +2025-06-03 23:08:47 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-03 23:08:49 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:08:49 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-03 23:08:49 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-03 23:08:51 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:08:51 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-03 23:08:51 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-03 23:08:54 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:54 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten +2025-06-03 23:08:54 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2 +2025-06-03 23:08:56 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:56 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 14 nicht einschalten +2025-06-03 23:08:56 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 15: test +2025-06-03 23:08:58 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:08:58 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 15 nicht einschalten +2025-06-03 23:08:58 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 16: test +2025-06-03 23:09:00 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:09:00 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 16 nicht einschalten +2025-06-03 23:09:01 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 23:09:03 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:09:03 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 23:09:03 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 23:09:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:09:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 23:09:05 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 23:09:07 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:09:07 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 23:09:07 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 23:09:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:09:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 23:09:09 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 23:09:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:09:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 23:09:11 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 23:09:13 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:09:13 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 23:09:13 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 23:09:45 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-03 23:09:47 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-03 23:09:47 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-03 23:09:47 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 23:09:49 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:09:49 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 23:09:49 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 23:09:51 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:09:51 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 23:09:51 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 23:09:53 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:09:53 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 23:09:53 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 23:09:55 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:09:55 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 23:09:55 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 23:09:57 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:09:57 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 23:09:57 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 23:09:59 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:09:59 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 23:09:59 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 23:10:01 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:01 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 23:10:01 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 23:10:04 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:04 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 23:10:04 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 23:10:06 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:10:06 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 23:10:06 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 23:10:08 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:10:08 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten +2025-06-03 23:10:08 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-03 23:10:10 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:10:10 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-03 23:10:10 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-03 23:10:12 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:10:12 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-03 23:10:12 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-03 23:10:14 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:14 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten +2025-06-03 23:10:14 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2 +2025-06-03 23:10:16 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:16 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 14 nicht einschalten +2025-06-03 23:10:16 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 15: test +2025-06-03 23:10:18 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:18 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 15 nicht einschalten +2025-06-03 23:10:18 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 16: test +2025-06-03 23:10:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 16 nicht einschalten +2025-06-03 23:10:21 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 23:10:23 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:23 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 23:10:23 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 23:10:26 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:26 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 23:10:26 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 23:10:28 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:28 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 23:10:28 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 23:10:30 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:30 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 23:10:30 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 23:10:32 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:32 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 23:10:32 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 23:10:34 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:34 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 23:10:34 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 23:10:36 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:36 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 23:10:36 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 23:10:38 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:38 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 23:10:38 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 23:10:40 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:10:40 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 23:10:40 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 23:10:42 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:10:42 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten +2025-06-03 23:10:42 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-03 23:10:45 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:10:45 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-03 23:10:45 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-03 23:10:47 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:10:47 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-03 23:10:47 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-03 23:10:49 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:49 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten +2025-06-03 23:10:49 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2 +2025-06-03 23:10:51 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:51 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 14 nicht einschalten +2025-06-03 23:10:51 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 15: test +2025-06-03 23:10:53 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:53 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 15 nicht einschalten +2025-06-03 23:10:53 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 16: test +2025-06-03 23:10:55 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:55 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 16 nicht einschalten +2025-06-03 23:10:56 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 23:10:58 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:10:58 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 23:10:58 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 23:11:00 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:00 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 23:11:00 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 23:11:02 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:02 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 23:11:02 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 23:11:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 23:11:05 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 23:11:07 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:07 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 23:11:07 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 23:11:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 23:11:09 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 23:11:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 23:11:11 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 23:11:13 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:13 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 23:11:13 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 23:11:15 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:11:15 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 23:11:15 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 23:11:17 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:11:17 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten +2025-06-03 23:11:17 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-03 23:11:19 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:11:19 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-03 23:11:19 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-03 23:11:21 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-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-03 23:11:21 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-03 23:11:21 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-03 23:11:24 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:24 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten +2025-06-03 23:11:24 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2 +2025-06-03 23:11:26 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:26 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 14 nicht einschalten +2025-06-03 23:11:26 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 15: test +2025-06-03 23:11:28 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:28 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 15 nicht einschalten +2025-06-03 23:11:28 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 16: test +2025-06-03 23:11:30 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:30 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 16 nicht einschalten +2025-06-03 23:11:31 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 23:11:33 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:33 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 23:11:33 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 23:11:35 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:35 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 23:11:35 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 23:11:38 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:38 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 23:11:38 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 23:11:40 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:40 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 23:11:40 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 23:11:42 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:11:42 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 23:11:42 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test diff --git a/backend/logs/security/security.log b/backend/logs/security/security.log index 86ffd96c..331d290e 100644 --- a/backend/logs/security/security.log +++ b/backend/logs/security/security.log @@ -128,3 +128,8 @@ 2025-06-03 22:15:16 - [security] security - [INFO] INFO - 🔒 Security System initialisiert 2025-06-03 22:15:51 - [security] security - [INFO] INFO - 🔒 Security System initialisiert 2025-06-03 23:04:00 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-03 23:04:28 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-03 23:05:09 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-03 23:06:44 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-03 23:07:16 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-03 23:09:46 - [security] security - [INFO] INFO - 🔒 Security System initialisiert diff --git a/backend/logs/shutdown_manager/shutdown_manager.log b/backend/logs/shutdown_manager/shutdown_manager.log index 0ac4acbe..255c73f4 100644 --- a/backend/logs/shutdown_manager/shutdown_manager.log +++ b/backend/logs/shutdown_manager/shutdown_manager.log @@ -222,3 +222,10 @@ 2025-06-03 22:15:16 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert 2025-06-03 22:15:51 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert 2025-06-03 23:04:00 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-03 23:04:28 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-03 23:04:28 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown... +2025-06-03 23:04:28 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 6 Cleanup-Funktionen aus... +2025-06-03 23:05:09 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-03 23:06:44 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-03 23:07:16 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-03 23:09:46 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert diff --git a/backend/logs/startup/startup.log b/backend/logs/startup/startup.log index 1cf65217..58959a80 100644 --- a/backend/logs/startup/startup.log +++ b/backend/logs/startup/startup.log @@ -1152,3 +1152,48 @@ 2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert 2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert 2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 23:04:28 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 23:04:28 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-03 23:04:28 - [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-03 23:04:28 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-03 23:04:28 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-03 23:04:28 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-03T23:04:28.384828 +2025-06-03 23:04:28 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-03 23:04:28 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-03 23:04:28 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 23:05:09 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 23:05:09 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-03 23:05:09 - [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-03 23:05:09 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-03 23:05:09 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-03 23:05:09 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-03T23:05:09.271771 +2025-06-03 23:05:09 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-03 23:05:09 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-03 23:05:09 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 23:06:44 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 23:06:44 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-03 23:06:44 - [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-03 23:06:44 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-03 23:06:44 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-03 23:06:44 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-03T23:06:44.104537 +2025-06-03 23:06:44 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-03 23:06:44 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-03 23:06:44 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 23:07:16 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 23:07:16 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-03 23:07: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-03 23:07:16 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-03 23:07:16 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-03 23:07:16 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-03T23:07:16.835850 +2025-06-03 23:07:16 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-03 23:07:16 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-03 23:07:16 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 23:09:46 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 23:09:46 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-03 23:09:46 - [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-03 23:09:46 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-03 23:09:46 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-03 23:09:46 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-03T23:09:46.756074 +2025-06-03 23:09:46 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-03 23:09:46 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-03 23:09:46 - [startup] startup - [INFO] INFO - ================================================== diff --git a/backend/logs/system_control/system_control.log b/backend/logs/system_control/system_control.log index 42eeb8d1..30af64f6 100644 --- a/backend/logs/system_control/system_control.log +++ b/backend/logs/system_control/system_control.log @@ -11,3 +11,7 @@ 2025-06-03 22:15:16 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert 2025-06-03 22:15:51 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert 2025-06-03 23:04:01 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert +2025-06-03 23:04:28 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert +2025-06-03 23:05:09 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert +2025-06-03 23:07:17 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert +2025-06-03 23:09:46 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert diff --git a/backend/logs/windows_fixes/windows_fixes.log b/backend/logs/windows_fixes/windows_fixes.log index dce8517f..83a7f577 100644 --- a/backend/logs/windows_fixes/windows_fixes.log +++ b/backend/logs/windows_fixes/windows_fixes.log @@ -531,3 +531,23 @@ 2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) 2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet 2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-03 23:04:27 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-03 23:04:27 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-03 23:04:27 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-03 23:04:27 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-03 23:05:08 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-03 23:05:08 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-03 23:05:08 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-03 23:05:08 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-03 23:06:42 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-03 23:06:42 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-03 23:06:42 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-03 23:06:42 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-03 23:07:15 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-03 23:07:15 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-03 23:07:15 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-03 23:07:15 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-03 23:09:45 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-03 23:09:45 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-03 23:09:45 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-03 23:09:45 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet diff --git a/backend/start_kiosk_fixed.py b/backend/start_kiosk_fixed.py new file mode 100644 index 00000000..a0749541 --- /dev/null +++ b/backend/start_kiosk_fixed.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +KIOSK-STARTUP SCRIPT (WINDOWS-OPTIMIERT) +========================================= + +Startet die Flask-App mit Waitress für stabilen Kiosk-Betrieb. +Behebt "unreachable" und Performance-Probleme. +""" + +import os +import sys +import time +import signal +import socket +import subprocess +import threading +from pathlib import Path + +# Umgebungsvariablen für optimierte Konfiguration setzen +os.environ["FORCE_OPTIMIZED_MODE"] = "true" +os.environ["USE_OPTIMIZED_CONFIG"] = "true" +os.environ["FLASK_ENV"] = "production" +os.environ["PYTHONUNBUFFERED"] = "1" + +def kill_hanging_processes(): + """Beendet hängende Flask-Prozesse auf Port 5000""" + print("🔄 Beende hängende Prozesse...") + + try: + result = subprocess.run( + ["netstat", "-ano"], + capture_output=True, + text=True, + shell=True + ) + + hanging_pids = set() + for line in result.stdout.split('\n'): + if ":5000" in line and ("WARTEND" in line or "ESTABLISHED" in line): + parts = line.split() + if len(parts) >= 5: + pid = parts[-1] + if pid.isdigit() and int(pid) != 0: + hanging_pids.add(int(pid)) + + for pid in hanging_pids: + try: + subprocess.run(["taskkill", "/F", "/PID", str(pid)], + capture_output=True, shell=True) + print(f"💀 Prozess {pid} beendet") + except: + pass + + if hanging_pids: + print(f"✅ {len(hanging_pids)} hängende Prozesse beendet") + time.sleep(2) + else: + print("✅ Keine hängenden Prozesse gefunden") + + except Exception as e: + print(f"⚠️ Prozess-Cleanup fehlgeschlagen: {e}") + +def test_app_response(host="127.0.0.1", port=5000, timeout=10): + """Testet ob die App antwortet""" + print(f"🔍 Teste App-Antwort auf {host}:{port}...") + + for i in range(timeout): + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(1) + result = sock.connect_ex((host, port)) + sock.close() + + if result == 0: + print(f"✅ App erreichbar nach {i+1} Sekunden") + return True + + except: + pass + + time.sleep(1) + print(f"⏳ Warte... ({i+1}/{timeout})") + + print("❌ App nicht erreichbar!") + return False + +def start_app_with_waitress(): + """Startet die App mit Waitress""" + print("🚀 Starte App mit Waitress WSGI-Server...") + + # Cleanup zuerst + kill_hanging_processes() + + # Importiere App-Module + try: + print("📦 Importiere Flask-App...") + sys.path.insert(0, str(Path(__file__).parent)) + + # App importieren und Optimierungen aktivieren + from app import app + + # Stelle sicher, dass optimierte Konfiguration aktiv ist + app.config.update({ + "DEBUG": False, + "TESTING": False, + "TEMPLATES_AUTO_RELOAD": False, + "SEND_FILE_MAX_AGE_DEFAULT": 31536000, # 1 Jahr Cache + }) + + print("✅ Flask-App erfolgreich importiert") + + except Exception as e: + print(f"❌ Fehler beim App-Import: {e}") + return False + + # Starte Waitress in separatem Thread + print("🖥️ Starte Waitress-Server...") + + def run_waitress(): + try: + from waitress import serve + serve( + app, + host="127.0.0.1", # IPv4 only + port=5000, + threads=6, # Multi-threading für bessere Performance + connection_limit=200, + cleanup_interval=30, + channel_timeout=120, + log_untrusted_proxy_headers=False, + clear_untrusted_proxy_headers=True, + max_request_header_size=8192, + max_request_body_size=104857600, # 100MB + expose_tracebacks=False + ) + except Exception as e: + print(f"❌ Waitress-Fehler: {e}") + + # Server in Thread starten + server_thread = threading.Thread(target=run_waitress, daemon=True) + server_thread.start() + + # Kurz warten und testen + time.sleep(3) + + if test_app_response(): + print("🎉 APP ERFOLGREICH GESTARTET!") + print("📋 Kiosk-URL: http://127.0.0.1:5000") + print("💡 IPv6-Probleme behoben durch IPv4-only") + print("🚀 Stable WSGI-Server statt Flask-Dev-Server") + return True + else: + print("❌ App startet nicht korrekt!") + return False + +def main(): + """Hauptfunktion""" + print("🔧 KIOSK-FIX GESTARTET") + print("=" * 50) + + if len(sys.argv) > 1 and sys.argv[1] == "--kill": + kill_hanging_processes() + return + + if start_app_with_waitress(): + try: + print("\n⌨️ Drücke CTRL+C zum Beenden...") + while True: + time.sleep(1) + except KeyboardInterrupt: + print("\n🛑 CTRL+C erkannt - beende App...") + print("✅ App gestoppt") + else: + print("❌ App-Start fehlgeschlagen!") + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/backend/start_kiosk_optimized.py b/backend/start_kiosk_optimized.py new file mode 100644 index 00000000..047025f1 --- /dev/null +++ b/backend/start_kiosk_optimized.py @@ -0,0 +1,327 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +OPTIMIERTES KIOSK-STARTUP SCRIPT +============================== + +Startet die Flask-App mit optimierter Konfiguration für Kiosk-Betrieb. +Behebt die Probleme mit "unreachable" und langen Ladezeiten. + +Verwendung: + python start_kiosk_optimized.py [--port PORT] [--debug] + +Autor: AutoFix-System +Datum: $(date) +""" + +import os +import sys +import time +import signal +import socket +import subprocess +import multiprocessing +from pathlib import Path + +# ===== KONFIGURATION ===== +DEFAULT_PORT = 5000 +DEFAULT_HOST = "127.0.0.1" # IPv4 only für bessere Kompatibilität +WORKERS = min(4, multiprocessing.cpu_count()) # Optimal für Kiosk +TIMEOUT = 120 # 2 Minuten Timeout +KEEPALIVE = 2 # 2 Sekunden Keep-Alive +MAX_REQUESTS = 1000 # Worker-Recycling + +class KioskOptimizer: + """Optimiert die App für Kiosk-Betrieb""" + + def __init__(self): + self.base_dir = Path(__file__).parent + self.app_file = self.base_dir / "app.py" + self.log_file = self.base_dir / "logs" / "kiosk.log" + self.pid_file = self.base_dir / "kiosk.pid" + + # Stelle sicher, dass Log-Verzeichnis existiert + self.log_file.parent.mkdir(exist_ok=True) + + def check_dependencies(self): + """Prüft ob alle Abhängigkeiten verfügbar sind""" + try: + import gunicorn + print("✅ Gunicorn verfügbar") + except ImportError: + print("❌ Gunicorn nicht installiert!") + print("Installiere mit: pip install gunicorn") + sys.exit(1) + + if not self.app_file.exists(): + print(f"❌ App-Datei nicht gefunden: {self.app_file}") + sys.exit(1) + + print("✅ Alle Abhängigkeiten verfügbar") + + def fix_ipv6_issues(self): + """Behebt IPv6-Auflösungsprobleme""" + print("🔧 Behebe IPv6-Auflösungsprobleme...") + + # Windows: Prüfe hosts-Datei + hosts_file = Path("C:/Windows/System32/drivers/etc/hosts") + + try: + if hosts_file.exists(): + content = hosts_file.read_text(encoding='utf-8') + # Prüfe auf IPv6 localhost-Eintrag + if "::1" in content and "localhost" in content: + print("⚠️ IPv6 localhost-Eintrag in hosts-Datei gefunden") + print("💡 Empfehlung: Verwende 127.0.0.1 statt localhost im Kiosk") + + except Exception as e: + print(f"⚠️ Hosts-Datei-Check fehlgeschlagen: {e}") + + print("✅ IPv6-Issues-Check abgeschlossen") + + def kill_hanging_processes(self): + """Beendet hängende Flask/Python-Prozesse""" + print("🔄 Beende hängende Prozesse...") + + # Finde Python-Prozesse die auf Port 5000 hören + try: + result = subprocess.run( + ["netstat", "-ano"], + capture_output=True, + text=True, + shell=True + ) + + lines = result.stdout.split('\n') + hanging_pids = set() + + for line in lines: + if ":5000" in line and ("WARTEND" in line or "ESTABLISHED" in line): + parts = line.split() + if len(parts) >= 5: + pid = parts[-1] + if pid.isdigit(): + hanging_pids.add(int(pid)) + + # Töte hängende Prozesse + for pid in hanging_pids: + try: + if pid != 0: # 0 ist System-PID + subprocess.run(["taskkill", "/F", "/PID", str(pid)], + capture_output=True, shell=True) + print(f"💀 Prozess {pid} beendet") + except: + pass + + if hanging_pids: + print(f"✅ {len(hanging_pids)} hängende Prozesse beendet") + time.sleep(2) # Kurz warten + else: + print("✅ Keine hängenden Prozesse gefunden") + + except Exception as e: + print(f"⚠️ Prozess-Cleanup fehlgeschlagen: {e}") + + def check_port_availability(self, host, port): + """Prüft ob Port verfügbar ist""" + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + sock.settimeout(1) + result = sock.connect_ex((host, port)) + return result != 0 # Port ist frei wenn connect fehlschlägt + finally: + sock.close() + + def start_with_gunicorn(self, host=DEFAULT_HOST, port=DEFAULT_PORT, debug=False): + """Startet die App mit Gunicorn""" + print(f"🚀 Starte Kiosk-App mit Gunicorn auf {host}:{port}") + + # Gunicorn-Konfiguration für optimale Kiosk-Performance + gunicorn_config = [ + "gunicorn", + "--bind", f"{host}:{port}", + "--workers", str(WORKERS), + "--worker-class", "sync", # Sync für einfache Requests, funktioniert am stabilsten + "--timeout", str(TIMEOUT), + "--keepalive", str(KEEPALIVE), + "--max-requests", str(MAX_REQUESTS), + "--max-requests-jitter", "50", + "--preload", # App einmal laden, dann forken + "--worker-tmp-dir", "/dev/shm" if os.name != 'nt' else ".", + "--log-level", "info" if not debug else "debug", + "--access-logfile", str(self.log_file), + "--error-logfile", str(self.log_file), + "--capture-output", + "--enable-stdio-inheritance" + ] + + # Windows-spezifische Optimierungen + if os.name == 'nt': + gunicorn_config.extend([ + "--worker-connections", "100", # Weniger Connections auf Windows + "--threads", "2" # Threading für Windows + ]) + + # Debug-Modus Anpassungen + if debug: + gunicorn_config.extend([ + "--reload", + "--log-level", "debug" + ]) + + # App-Modul + gunicorn_config.append("app:app") + + print(f"🔧 Gunicorn-Kommando: {' '.join(gunicorn_config)}") + + # Umgebungsvariablen für optimierte App setzen + env = os.environ.copy() + env.update({ + "FLASK_ENV": "production" if not debug else "development", + "USE_OPTIMIZED_CONFIG": "true", + "FORCE_OPTIMIZED_MODE": "true", + "PYTHONUNBUFFERED": "1", + "PYTHONIOENCODING": "utf-8" + }) + + # Starte Gunicorn + try: + # PID speichern + process = subprocess.Popen( + gunicorn_config, + cwd=str(self.base_dir), + env=env, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True + ) + + # PID in Datei schreiben + with open(self.pid_file, 'w') as f: + f.write(str(process.pid)) + + print(f"✅ Gunicorn gestartet (PID: {process.pid})") + print(f"📋 Logs: {self.log_file}") + print(f"🌐 URL: http://{host}:{port}") + print(f"🔄 Für Kiosk verwende: http://127.0.0.1:{port}") + + # Warte kurz und teste Verbindung + time.sleep(3) + if self.test_connection(host, port): + print("🎉 APP ERFOLGREICH GESTARTET!") + print(f"💡 Kiosk-Browser auf http://127.0.0.1:{port} zeigen lassen") + return process + else: + print("❌ App startet nicht korrekt!") + process.terminate() + return None + + except Exception as e: + print(f"❌ Fehler beim Starten: {e}") + return None + + def test_connection(self, host, port, retries=5): + """Testet die Verbindung zur App""" + print(f"🔍 Teste Verbindung zu {host}:{port}...") + + for i in range(retries): + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(2) + result = sock.connect_ex((host, port)) + sock.close() + + if result == 0: + print(f"✅ Verbindung erfolgreich (Versuch {i+1})") + return True + else: + print(f"⏳ Versuch {i+1} fehlgeschlagen, warte...") + time.sleep(1) + + except Exception as e: + print(f"⚠️ Verbindungstest Versuch {i+1} fehlgeschlagen: {e}") + time.sleep(1) + + print("❌ Verbindung fehlgeschlagen!") + return False + + def stop(self): + """Stoppt die App""" + if self.pid_file.exists(): + try: + with open(self.pid_file, 'r') as f: + pid = int(f.read().strip()) + + print(f"🛑 Stoppe App (PID: {pid})") + + # Windows: taskkill verwenden + if os.name == 'nt': + subprocess.run(["taskkill", "/F", "/PID", str(pid)], + capture_output=True, shell=True) + else: + os.kill(pid, signal.SIGTERM) + + self.pid_file.unlink() + print("✅ App gestoppt") + + except Exception as e: + print(f"⚠️ Fehler beim Stoppen: {e}") + else: + print("ℹ️ Keine PID-Datei gefunden") + +def main(): + """Hauptfunktion""" + import argparse + + parser = argparse.ArgumentParser(description="Optimiertes Kiosk-Startup für Flask-App") + parser.add_argument("--port", type=int, default=DEFAULT_PORT, help="Port (Standard: 5000)") + parser.add_argument("--host", default=DEFAULT_HOST, help="Host (Standard: 127.0.0.1)") + parser.add_argument("--debug", action="store_true", help="Debug-Modus") + parser.add_argument("--stop", action="store_true", help="App stoppen") + parser.add_argument("--force-kill", action="store_true", help="Alle hängenden Prozesse beenden") + + args = parser.parse_args() + + optimizer = KioskOptimizer() + + print("🚀 KIOSK-OPTIMIZER GESTARTET") + print("=" * 50) + + if args.stop: + optimizer.stop() + return + + if args.force_kill: + optimizer.kill_hanging_processes() + return + + # Systemchecks + optimizer.check_dependencies() + optimizer.fix_ipv6_issues() + + # Port-Check + if not optimizer.check_port_availability(args.host, args.port): + print(f"❌ Port {args.port} ist bereits belegt!") + print("💡 Versuche --force-kill um hängende Prozesse zu beenden") + sys.exit(1) + + # Cleanup alter Prozesse + optimizer.kill_hanging_processes() + + # App starten + process = optimizer.start_with_gunicorn(args.host, args.port, args.debug) + + if process: + try: + # Warte auf CTRL+C + print("\n⌨️ Drücke CTRL+C zum Beenden...") + process.wait() + except KeyboardInterrupt: + print("\n🛑 CTRL+C erkannt, stoppe App...") + optimizer.stop() + else: + print("❌ App-Start fehlgeschlagen!") + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/backend/templates/base.html b/backend/templates/base.html index 738480b6..c4ff142c 100644 --- a/backend/templates/base.html +++ b/backend/templates/base.html @@ -2,217 +2,1266 @@ - + - + + + + + + {% block title %}MYP Platform - Mercedes-Benz{% endblock %} - - + + - - + + + + + + - + + + + + + - - + + + - - - - - - + + + {% block extra_css %}{% endblock %} - - - - Skip to main content - -
- -
- - - {% with messages = get_flashed_messages(with_categories=true) %} - {% if messages %} - - {% endif %} - {% endwith %} - - -
- {% block content %}{% endblock %} -
- - -
-

© 2024 Mercedes-Benz AG. Alle Rechte vorbehalten.

-
- - - - - + + + + + {% block head %}{% endblock %} + + + + + + + + + + + +
+
+ + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + + + {% endif %} + {% endwith %} + + {% block content %}{% endblock %} +
+
+ + +
+
+
+
+ +
+
+
+ + + +
+
+
Mercedes-Benz
+
TBA Marienfelde - Steckdosen-Steuerung
+
+
+

+ Das Beste oder nichts - Professionelles 3D-Druck Management für Mercedes-Benz. +

+
+ + +
+

System

+
+
+ Version: + 3.0.0 +
+
+ Status: +
+
+ Online +
+
+ {% if current_user.is_authenticated and current_user.is_admin %} + + {% endif %} +
+
+ +
+

Benachrichtigungen

+
+ +
+ Nicht stören: + +
+ + +
+ Alle Benachrichtigungen aktiv +
+
+
+ + +
+

Rechtliches

+
+

© 2024 Mercedes-Benz Group AG

+

Alle Rechte vorbehalten.

+

+ Entwickelt für interne Mercedes-Benz Anwendungen +

+
+
+
+
+
+
+ + + + + + + + + + + + + + + + {% if current_user.is_authenticated %} + + + + {% endif %} + + + + + + + {% block scripts %}{% endblock %} - \ No newline at end of file + \ No newline at end of file