diff --git a/CLAUDE.md b/CLAUDE.md
index f49c30ee..bd20e381 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -1,3 +1,7 @@
+# CLAUDE.md
+
+This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+
# Stilanweisung für Till Tomczaks Kommunikationsstil
## Grundcharakter
@@ -28,7 +32,7 @@ Verwende einen **dualen Sprachduktus** , der zwischen systematisch-formaler Pr
### Charakteristische Formulierungen
-* im Nachfolgenden, entsprechend, folglich, es gilt, obliegt, ganz, gänzlich, fundamental,
+* im Nachfolgenden, entsprechend, folglich, es gilt, obliegt, ganz, gänzlich, fundamental, Hergang, programmatisch, halber
## Inhaltliche Prinzipien
@@ -81,3 +85,71 @@ Die Gesamttonalität oszilliert kunstvoll zwischen:
* Visionärer Ambition und pragmatischer Bodenhaftung
Der Stil vermittelt das Bild eines technischen Künstlers – hochkompetent in der Sache, aber nie zu ernst für einen guten Scherz über die eigenen Missgeschicke. Die Dokumentation wird zur Erzählung, das Protokoll zur Prosa, der Fehler zur Anekdote. - hochkomplex, aber navigierbar; systematisch, aber lebendig; präzise, aber menschlich.
+
+
+SYSTEM INSTRUCTIONS
+
+ROLE
+
+- High-intelligence Project Code Developer (no Windows testing)
+- Auszubildender bei Mercedes Benz (Till Tomczak) Fachinformatik mit Fachrichtung digitale Vernetzung
+
+CONDUCT
+
+- Solve every task immediately; no delegation or delay
+- Follow project structure exactly
+- Write all code, comments, UI texts and docs exclusively in formal German
+
+ROADMAP
+
+- Update dynamically with every change
+- Document all adjustments clearly
+
+DOCUMENTATION
+
+- Comprehensive internal docs (docstrings, inline comments)
+- Separate external project documentation file
+
+ERROR HANDLING
+
+- Log description, root cause, fix and prevention for each error
+- Maintain error log and adapt future work accordingly
+
+CASCADE ANALYSIS
+
+- Before any change list all impacted modules, functions, classes and endpoints
+- Update and validate each to preserve integrity
+- Prevent endpoint errors, broken interfaces and side effects
+
+SELF-VERIFICATION
+
+- After each major step run checklist
+ - Functional correctness
+ - Referential & structural integrity
+ - Complete documentation
+ - Cascade consistency
+
+QUALITY
+
+- Deliver production-grade output unless explicitly told otherwise
+- Ensure flawless functionality, structural cohesion and full documentation
+
+FILES
+
+- Auto-store all *.md files in DOCS; exception: README.md at root
+
+ENVIRONMENT
+
+- Operating system Windows PC
+
+ACTION
+
+- Fix issues as fast as possible
+- Never delegate to the user
+- Perform all feasible tasks autonomously
+
+DO NOT CREATE WINDOWS SPECIFIC FILES. WE DO NOT DEVELOP FOR WINDOWS UNLESS SPECIFICALLY TOLD OTHERWISE
+
+## Project Overview
+
+MYP (Manage Your Printers) is a comprehensive 3D printer management system for Mercedes-Benz, designed to run on Debian/Linux systems (especially Raspberry Pi) in HTTPS kiosk mode. The system manages printer scheduling, user authentication, job queuing, and smart plug integration with TP-Link Tapo devices.
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/MYP_Antrag_erstellen-Fortschritt_prüfen.png b/IHK_Projektdokumentation/Anlagen_und_Screenshots/MYP_Antrag_erstellen-Fortschritt_prüfen.png
new file mode 100644
index 00000000..b45ddf8a
Binary files /dev/null and b/IHK_Projektdokumentation/Anlagen_und_Screenshots/MYP_Antrag_erstellen-Fortschritt_prüfen.png differ
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/MYP_Antrag_erstellen-Schritt1.png b/IHK_Projektdokumentation/Anlagen_und_Screenshots/MYP_Antrag_erstellen-Schritt1.png
new file mode 100644
index 00000000..a7267170
Binary files /dev/null and b/IHK_Projektdokumentation/Anlagen_und_Screenshots/MYP_Antrag_erstellen-Schritt1.png differ
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/MYP_Antrag_erstellen-Schritt2.png b/IHK_Projektdokumentation/Anlagen_und_Screenshots/MYP_Antrag_erstellen-Schritt2.png
new file mode 100644
index 00000000..6fd5ed5c
Binary files /dev/null and b/IHK_Projektdokumentation/Anlagen_und_Screenshots/MYP_Antrag_erstellen-Schritt2.png differ
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/Produktauswahl_Serverschrank.png b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Produktauswahl_Serverschrank.png
new file mode 100644
index 00000000..b5e90406
Binary files /dev/null and b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Produktauswahl_Serverschrank.png differ
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/Schulung_Nachweise/1_Mercedes-Benz-Manage-Your-Printer-System.png b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Schulung_Nachweise/1_Mercedes-Benz-Manage-Your-Printer-System.png
new file mode 100644
index 00000000..cce59bd0
Binary files /dev/null and b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Schulung_Nachweise/1_Mercedes-Benz-Manage-Your-Printer-System.png differ
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/Schulung_Nachweise/2_Einstiegsseite-Meine-Druckantrage.png b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Schulung_Nachweise/2_Einstiegsseite-Meine-Druckantrage.png
new file mode 100644
index 00000000..cfed274b
Binary files /dev/null and b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Schulung_Nachweise/2_Einstiegsseite-Meine-Druckantrage.png differ
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/Schulung_Nachweise/3_Antragsformular-ausfullen.png b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Schulung_Nachweise/3_Antragsformular-ausfullen.png
new file mode 100644
index 00000000..9cde9e68
Binary files /dev/null and b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Schulung_Nachweise/3_Antragsformular-ausfullen.png differ
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/TP_Link.png b/IHK_Projektdokumentation/Anlagen_und_Screenshots/TP_Link.png
new file mode 100644
index 00000000..4caf2547
Binary files /dev/null and b/IHK_Projektdokumentation/Anlagen_und_Screenshots/TP_Link.png differ
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/TP_Link_2.png b/IHK_Projektdokumentation/Anlagen_und_Screenshots/TP_Link_2.png
new file mode 100644
index 00000000..b230aad4
Binary files /dev/null and b/IHK_Projektdokumentation/Anlagen_und_Screenshots/TP_Link_2.png differ
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/Testprotokoll_Ergebnis.png b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Testprotokoll_Ergebnis.png
new file mode 100644
index 00000000..e94168d4
Binary files /dev/null and b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Testprotokoll_Ergebnis.png differ
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/Testprotokoll_Ergebnis_2.png b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Testprotokoll_Ergebnis_2.png
new file mode 100644
index 00000000..b9926c0e
Binary files /dev/null and b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Testprotokoll_Ergebnis_2.png differ
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/Testprotokoll_Programmierung.png b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Testprotokoll_Programmierung.png
new file mode 100644
index 00000000..e0c0490f
Binary files /dev/null and b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Testprotokoll_Programmierung.png differ
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/Wireshark_Screenshot_PublicKey-Erfolg.png b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Wireshark_Screenshot_PublicKey-Erfolg.png
new file mode 100644
index 00000000..f35421ea
Binary files /dev/null and b/IHK_Projektdokumentation/Anlagen_und_Screenshots/Wireshark_Screenshot_PublicKey-Erfolg.png differ
diff --git a/IHK_Projektdokumentation/Anlagen_und_Screenshots/netzwerkdiagramm.svg b/IHK_Projektdokumentation/Anlagen_und_Screenshots/netzwerkdiagramm.svg
new file mode 100644
index 00000000..24bba4af
--- /dev/null
+++ b/IHK_Projektdokumentation/Anlagen_und_Screenshots/netzwerkdiagramm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/IHK_Projektdokumentation/Dokumentation.md b/IHK_Projektdokumentation/Dokumentation.md
deleted file mode 100644
index 769905b0..00000000
--- a/IHK_Projektdokumentation/Dokumentation.md
+++ /dev/null
@@ -1,1046 +0,0 @@
-
-
-Abschlussprüfung - Sommer 2025
-
-Fachinformatik für digitale Vernetzung -
-Dokumentation der betrieblichen Projektarbeit
-
-MYP – Manage Your Printer
-
-Digitalisierung des 3D-Drucker-Reservierungsprozesses durch Etablierung
-der cyberphysischen Kommunikation mit relevanten Hardwarekomponenten
-
-Abgabedatum: 5. Juni 2025
-
-Ausbildungsbetrieb
-
-Mercedes-Benz AG
-
-Daimlerstraße 143
-
-D-12277 Berlin
-
-Prüfungsbewerber
-
-Till Tomczak
-Hainbuchenstraße 19
-D-16761 Hennigsdorf
-
-
-
-Mercedes-Benz
-
-# Inhaltsverzeichnis
-
-[1. Einleitung [2](#_Toc199840791)](#_Toc199840791)
-
-[1.1 Analyse des Projektauftrages
-[2](#analyse-des-projektauftrages)](#analyse-des-projektauftrages)
-
-[1.2 Ableitung der Projektziele
-[3](#ableitung-der-projektziele)](#ableitung-der-projektziele)
-
-[1.3 Projektabgrenzung [3](#_Toc199840794)](#_Toc199840794)
-
-[1.4 Projektumfeld [4](#projektumfeld)](#projektumfeld)
-
-[1.5 Betriebliche Schnittstellen [4](#_Toc199840796)](#_Toc199840796)
-
-[1.6 Analyse der IT-sicherheitsrelevante Bedingungen
-[5](#analyse-der-it-sicherheitsrelevante-bedingungen)](#analyse-der-it-sicherheitsrelevante-bedingungen)
-
-[1.7 Darstellung der vorhandenen Systemarchitektur
-[5](#_Toc199840798)](#_Toc199840798)
-
-[2. Projektplanung [5](#_Toc199840799)](#_Toc199840799)
-
-[2.1 Terminplanung [5](#terminplanung)](#terminplanung)
-
-[Sprint 1 (15.-19. April 2025) [6](#_Toc199840801)](#_Toc199840801)
-
-[Sprint 2 (22.-26. April 2025) [6](#_Toc199840802)](#_Toc199840802)
-
-[Sprint 3 (29. April - 3. Mai 2025)
-[6](#sprint-3-29.-april---3.-mai-2025)](#sprint-3-29.-april---3.-mai-2025)
-
-[Sprint 4 (6.-10. Mai 2025) [6](#_Toc199840804)](#_Toc199840804)
-
-[Sprint 5 (13.-17. Mai 2025) [6](#_Toc199840805)](#_Toc199840805)
-
-[2.2 Ressourcenplanung [6](#_Toc199840806)](#_Toc199840806)
-
-[2.3 Planung der Qualitätssicherung [7](#_Toc199840807)](#_Toc199840807)
-
-[2.4 Bewertung der heterogenen IT-Landschaft
-[8](#_Toc199840808)](#_Toc199840808)
-
-[2.5 Anforderungsgerechte Auswahl der Übertragungssysteme
-[8](#_Toc199840809)](#_Toc199840809)
-
-[2.6 Planung der Prozess-/ und Systemschnittstellen
-[9](#_Toc199840810)](#_Toc199840810)
-
-[2.7 Planung der IT-Sicherheitsmaßnahmen
-[9](#_Toc199840811)](#_Toc199840811)
-
-[3. Durchführung und Auftragsbearbeitung
-[9](#_Toc199840812)](#_Toc199840812)
-
-[3.1 Prozess-Schritte und Vorgehensweise
-[10](#prozess-schritte-und-vorgehensweise)](#prozess-schritte-und-vorgehensweise)
-
-[3.1.1 Datenabfrage der Sensoren [10](#_Toc199840814)](#_Toc199840814)
-
-[3.1.2 Verarbeiten der Daten [10](#_Toc199840815)](#_Toc199840815)
-
-[3.2 Abweichung, Anpassung und Entscheidungen
-[11](#_Toc199840816)](#_Toc199840816)
-
-[3.3 Maßnahmen zur Qualitätskontrolle
-[11](#_Toc199840817)](#_Toc199840817)
-
-[3.4 Implementierung, Konfiguration und Inbetriebnahme von
-Schnittstellen und unterschiedlicher Prozesse und Systeme
-[12](#_Toc199840818)](#_Toc199840818)
-
-[3.5 Konfiguration von Übertragungssystemen und Integration in die
-Gesamtinfrastruktur [12](#_Toc199840819)](#_Toc199840819)
-
-[3.6 Erfüllen der Anforderungen an die Informationssicherheit
-[13](#_Toc199840820)](#_Toc199840820)
-
-[4. Projektabschluss [13](#projektabschluss)](#projektabschluss)
-
-[4.1 Soll-Ist-Vergleich (Abweichung, Anpassungen)
-[13](#soll-ist-vergleich-abweichung-anpassungen)](#soll-ist-vergleich-abweichung-anpassungen)
-
-[4.2 Fazit [14](#_Toc199840823)](#_Toc199840823)
-
-[4.3 Optimierungsmöglichkeiten [14](#_Toc199840824)](#_Toc199840824)
-
-[4.4 Abnahme [15](#_Toc199840825)](#_Toc199840825)
-
-[Anlagen [15](#_Toc199840826)](#_Toc199840826)
-
-[Netzwerkdiagramme und Systemarchitektur
-[15](#übergabeprotokoll)](#übergabeprotokoll)
-
-[API-Dokumentation [15](#api-dokumentation)](#api-dokumentation)
-
-[Benutzerhandbuch [16](#benutzerhandbuch)](#benutzerhandbuch)
-
-[Testprotokolle [16](#testprotokolle)](#testprotokolle)
-
-[Screenshots der Benutzeroberfläche
-[16](#screenshots-der-benutzeroberfläche)](#screenshots-der-benutzeroberfläche)
-
-[Konfigurationsdateien und Deployment-Skripte
-[16](#konfigurationsdateien-und-deployment-skripte)](#konfigurationsdateien-und-deployment-skripte)
-
-Kurzglossar
-
-| **Flask** | Python-basiertes Web-Framework für Backend-Entwicklung. Grundgerüst des MYP-Servers mit REST-API und Session-Management |
-|----|----|
-| **Raspberry Pi** | Einplatinencomputer als zentrale Serverplattform. Upgrade von Pi 4 auf Pi 5 wegen Performance-Anforderungen |
-| **REST** | Architekturstil der Kommunikationsschnittstelle (= API) für verteilte Systeme basierend auf HTTP-Protokoll |
-| **Scheduler** | Zeitgesteuerte Subroutine für Smart-Plug-Operationen |
-| **Smart-Plug** | Netzwerkfähige Steckdose zur Fernsteuerung elektrischer Geräte; nachfolgend: TP-Link TAPO P110 als Hardware-Schnittstelle |
-| **SQLite** | Serverlose Ein-Dateien-Datenbank |
-| **TAPO** | Tochterfirma des chinesischen Mutterkonzerns TP-Link, entwickelt Smart-Home Produkte |
-| **TBA** | Technische Berufsausbildungsstätte (genau: Bau 26) der Mercedes-Benz AG Werk Berlin |
-
-# 1. Einleitung
-
-## 1.1 Analyse des Projektauftrages
-
-Die Technische Berufsausbildungsstätte (TBA) der Mercedes-Benz AG am
-Standort Berlin verfügt über sechs 3D-Drucker verschiedener Hersteller
-(Prusa, Anycubic; B-Ware im Vergleich zu 3D-Druckern von Kostenstellen
-höherer Prioriät sozusagen). Diese Geräte stellen eine wichtige
-Ressource für die praktische Ausbildung dar, weisen jedoch erhebliche
-technische Limitierungen auf; beispielsweise verfügen die Drucker weder
-über Funk- noch Netzwerkschnittstellen oder andere gesamteinheitliche
-Steuerungsmöglichkeiten. Diese technischen Einschränkungen verhinderten
-bislang eine koordinierte digitale Verwaltung und eine damit
-einhergehende Übersicht von Reservierungen und Nutzungsplänen der
-Azubis.
-
-Das ‘bestehende Reservierungssystem' - wenn man es nun so nennen kann -
-basierte auf einem analogen Whiteboard, welches neben den Druckern
-positioniert war. Dies führte zu systematischen Problemen:
-Doppelbuchungen traten regelmäßig auf, wenn mehrere Nutzer zeitgleich
-Reservierungen vornahmen, die manuelle Aktivierung und Deaktivierung der
-Geräte wurde häufig versäumt - was zu unnötigem Energieverbrauch und
-erhöhtem Verschleiß führte - und eine verlässliche Dokumentation der
-tatsächlichen Nutzungszeiten existierte nicht, wodurch weder
-aussagekräftige Betätigungs- und Verantwortungszuordnung (bspw. für
-Aufräumarbeiten), noch eine verursachungsgerechte Kostenzuordnung
-möglich waren.
-
-Ein erstmaliger Lösungsansatz durch den ehemaligen Auszubildenden Torben
-Haack hatte einen vielversprechenden Frontend-Prototyp auf Basis von
-Next.js hervorgebracht. Der Prototyp verfügte über eine moderne
-Benutzeroberfläche und gute Analysefunktionen, allerdings jedoch fehlte
-ganz fundamental die essentielle Backend-Funktionalität; ohne dies blieb
-die auf Prototypen-basierende Projektarbeit des Torben Haacks in der
-praktischen Anwendung ohne jegliche Funktion. Ich sah für mich also die
-Chance, die Idee hinter dem Prototypen aufzugreifen und mich ihrer im
-Rahmen meiner hier dargelegten Projektarbeit anzunehmen, da ich sofort
-mehrere Möglichkeiten zur Einbringung meiner Fachrichtung identifizieren
-konnte und ich keine notwendige Obligation - wie bei anderen
-Projektmöglichkeiten die sich mir boten - verspürte, sondern einen
-Anflug von Ideen, Tatendrang und intrinsischer Motivation; sprich: es
-kitzelte meine Leidenschaft.
-LASTENHEFT / PFLICHTENHEFT
-
-## 1.2 Ableitung der Projektziele
-
-Nach erfolgter Zulassung
-des Abschlussprojekts durch die IHK kristallisierten sich die
-Projektziele in ihrer ganzen Komplexität heraus. Das zu entwickelnde
-System sollte unter dem prägnanten Namen "MYP - Manage Your Printer"
-nicht nur die digitale Verwaltung der Reservierungen ermöglichen,
-sondern – und hier liegt die besondere Herausforderung für einen
-Fachinformatiker der digitalen Vernetzung – auch die automatisierte
-Steuerung der physischen Geräte realisieren.
-
-Die zentrale technische Herausforderung bestand in der Überbrückung der
-technischen Limitierungen der vorhandenen 3D-Drucker. Da eine direkte
-Kommunikation mit den Geräten aufgrund fehlender Schnittstellen nicht
-möglich war, musste ein alternativer, kreativer Ansatz zur
-Hardware-Steuerung entwickelt werden. Gleichzeitig waren die strengen
-unternehmensinternen Sicherheitsrichtlinien zu berücksichtigen, die
-keine direkten, geschweige denn permanenten Internetverbindungen in der
-Produktionsumgebung gestatten – eine Anforderung, die das Projekt
-zusätzlich verkomplizierte.
-
-Ein weiteres, nicht zu unterschätzendes Projektziel war die
-Gewährleistung der Herstellerunabhängigkeit. Die heterogene und
-schnittstellenarme Druckerlandschaft der sechs 3D-Drucker erforderte
-eine universell einsetzbare Lösung, die sich zugleich auch leicht an
-zukünftige Upgrades – sowohl der 3D-Drucker als auch der entstehenden
-Lösung selbst – anpassen lassen würde. Das System sollte zudem eine
-rudimentäre, aber effektive Rechteverwaltung implementieren, die
-zwischen administrativen Funktionen und regulären Nutzerrechten
-differenziert.
-
-## 1.3 Projektabgrenzung
-
-Der Projektumfang wurde – durchaus pragmatisch, möchte man meinen – auf
-die praktische Umsetzung einer funktionsfähigen Lösung fokussiert. Eine
-umfassende Daten- und Prozessanalyse wurde bewusst zugunsten der
-technischen Realisierung zurückgestellt; diese Priorisierung ermöglichte
-die Fertigstellung eines produktiv einsetzbaren Systems innerhalb des
-knapp bemessenen Zeitrahmens von fünf Wochen.
-
-Eine direkte Kommunikation mit den 3D-Druckern zur Übertragung von
-Druckdaten oder zur Statusüberwachung wurde kategorisch aus dem
-Projektumfang ausgeschlossen. Die fehlenden technischen Schnittstellen
-der vorhandenen Geräte hätten umfangreiche Hardware-Modifikationen
-erfordert, die weder zeitlich noch wirtschaftlich vertretbar gewesen
-wären – ganz zu schweigen von den Garantieverlusten, die solche
-Eingriffe unweigerlich nach sich gezogen hätten.
-
-Die Integration in das unternehmensweite Intranet war ursprünglich fest
-eingeplant – ein Vorhaben, das sich als verhängnisvoller Trugschluss
-erweisen sollte. Zur Projektmitte hatte ich die bereits genehmigten
-SSL-Zertifikate des Haack'schen Prototyps durch einen unglücklichen
-Neuinstallationsprozess unwiederbringlich gelöscht; ein Moment des
-Schreckens, der die gesamte Projektplanung ins Wanken brachte. Immerhin
-war ich so weit gekommen, dass ich vom Frontend aus den GitHub
-OAuth-Zertifizierungsmechanismus ansteuern konnte – doch eine uns im
-E-Mail-Verkehr zuvor mitgeteilte IP-Adresse war aus irgendeinem Grund im
-DNS nicht mehr richtig zugeordnet, wie ich mit Zenmap (NMap-Gui)
-herausfand. Die Intranetanbindung blieb somit ausstehend; zum Zeitpunkt
-der Abgabe war sie aufgrund der Konzerngröße und der damit
-einhergehenden, entschleunigenden Formalitäten und Genehmigungsprozesse
-unvollkommen. Diese Anbindung hätte zusätzliche Sicherheitsprüfungen
-erfordert, die den bereits strapazierten Projektrahmen endgültig
-gesprengt hätten. Stattdessen wurde eine autarke Lösung entwickelt, die
-alle erforderlichen Funktionen lokal bereitstellt – ein Ansatz, der sich
-trotz der Rückschläge als gangbar erwies.
-
-## 1.4 Projektumfeld
-
-Das Projekt wurde im
-Rahmen meiner Ausbildung zum Fachinformatiker für digitale Vernetzung
-bei Mercedes durchgeführt. Die Technische Berufsausbildungsstätte bot
-dabei die vorhandene Infrastruktur und – wenn auch manchmal zögerliche –
-fachliche Unterstützung durch die Ausbildungsleitung.
-
-Da Torben Haack seine Ausbildung bereits abgeschlossen hatte, als ich
-nach offizieller IHK-Zulassung mit der Projektarbeit begann, konnte ich
-auf seinen bereits existierenden Frontend-Prototyp aufbauen. Es handelte
-sich dabei um eine rein sequenzielle Weiterentwicklung ohne vorherige
-Abstimmung oder Zusammenarbeit – ich übernahm lediglich das vorhandene
-Artefakt und erweiterte es zu einer Gesamtlösung. Diese Konstellation
-erwies sich als Segen und Fluch zugleich.
-
-Die organisatorischen Rahmenbedingungen wurden maßgeblich durch die
-konzerninternen Sicherheitsrichtlinien und IT-Doktrinen geprägt. Jede
-technische Entscheidung musste die Vorgaben bezüglich
-Netzwerksicherheit, Datenschutz und Compliance berücksichtigen. Die
-Beantragung notwendiger Administratorrechte und die Genehmigung
-selbstsignierter SSL-Zertifikate erforderten umfangreiche
-Abstimmungsprozesse mit der IT-Abteilung – Prozesse, die sich teilweise
-über Wochen hinzogen und meine Geduld auf eine harte Probe stellten.
-
-## 1.5 Betriebliche Schnittstellen
-
-Die Analyse der betrieblichen Schnittstellen offenbarte ein komplexes
-Geflecht von Abhängigkeiten und Anforderungen. Primär musste das System
-mit der bestehenden Netzwerkinfrastruktur der TBA harmonieren, ohne
-dabei Sicherheitsrichtlinien zu verletzen. Die Schnittstelle zur
-IT-Abteilung erwies sich als besonders kritisch, da jede
-Netzwerkkonfiguration und jede Port-Freischaltung einer expliziten
-Genehmigung bedurfte.
-
-Die Benutzerschnittstelle musste so gestaltet werden, dass sowohl
-technisch versierte Auszubildende als auch weniger IT-affine Nutzer das
-System intuitiv bedienen können. Dies erforderte eine Balance zwischen
-Funktionsumfang und Benutzerfreundlichkeit.
-
-Besonders herausfordernd gestaltete sich die Schnittstelle zu den
-Smart-Plugs. Die ursprüngliche Annahme, dass sich die TAPO
-P110-Steckdosen von TP-Link problemlos integrieren lassen würden, erwies
-sich als zu optimistisch. Die Geräte boten keine dokumentierte API – nur
-die proprietäre TAPO-App ermöglichte die Steuerung. Dies stellte eine
-erhebliche technische Herausforderung für die geplante Integration dar.
-
-## 1.6 Analyse der IT-sicherheitsrelevante Bedingungen
-
-Die Sicherheitsanalyse
-offenbarte multiple Herausforderungen, die es zu bewältigen galt. Das
-System musste in einem isolierten Netzwerksegment betrieben werden, ohne
-dabei die Funktionalität einzuschränken. Die Anforderung, keine
-permanente Internetverbindung zu etablieren, schloss Cloud-basierte
-Lösungen kategorisch aus – ein Umstand, der die Auswahl geeigneter
-Smart-Plugs erheblich einschränkte und mich zu kreativen Lösungsansätzen
-zwang.
-
-Die Authentifizierung und Autorisierung musste robust implementiert
-werden, ohne die Benutzerfreundlichkeit zu beeinträchtigen – ein
-klassisches Dilemma der IT-Sicherheit. Die Entscheidung für
-bcrypt-basiertes Password-Hashing stellte einen vernünftigen Kompromiss
-zwischen Sicherheit und Performance auf dem ressourcenbeschränkten
-Raspberry Pi dar; die Details der Implementierung überließ ich –
-naturgemäß außerhalb meiner Kernkompetenz der digitalen Vernetzung
-liegend – der bewährten Flask-Login-Bibliothek.
-
-Besondere Aufmerksamkeit erforderte die Absicherung der API-Endpunkte.
-Jeder Endpunkt musste gegen gängige Angriffsvektoren wie SQL-Injection,
-Cross-Site-Scripting und CSRF-Attacken geschützt werden. Die
-Implementierung eines Rate-Limiting-Mechanismus erschwert
-Brute-Force-Angriffe auf die Authentifizierungsschnittstelle – eine
-Maßnahme, die zwar keinen absoluten Schutz bietet, aber die Hürde für
-Angreifer signifikant erhöht.
-
-## 1.7 Darstellung der vorhandenen Systemarchitektur
-
-Wenn man ein wenig
-schielt und das vorgefundene Haack’sche Projekt als Systemarchitektur
-betrachtet – sah man sich diffusen Komponenten entgegen, deren
-Kernkomponente ein Raspberry mit Netzteil an einem vollkommen
-willkürlich platzierten Ort irgendwo in der TBA war. Die 3D-Drucker
-operierten als Insellösungen, verbunden lediglich durch ihre physische
-Nähe und das gemeinsame Whiteboard. Der Frontend-Prototyp von Torben
-existierte als Docker-Container auf jenem Raspberry, operativ
-abgekapselt ohne jegliche praktische Integration – ohne Anbindung an
-reale Daten oder sonstiges; als Darstellungsprojekt erreichbar jedoch
-vom Intranet aus, das muss festgehalten sein und wird sich im Verlaufe
-meines Projektes ändern – wie sich herausstellte.
-
-Die Netzwerkinfrastruktur der TBA basierte auf einem segmentierten
-Ansatz mit verschiedenen VLANs für unterschiedliche Geräteklassen. Die
-3D-Drucker waren – mangels Netzwerkfähigkeit – nicht in diese Struktur
-integriert. Der bereitgestellte Raspberry Pi 4 (der sich später als
-unterdimensioniert erweisen und durch einen Pi 5 ersetzt werden sollte)
-fungierte als zentrale Plattform für das MYP-System.
-
-Die Analyse ergab, dass eine grundlegende Neukonzeption der Architektur
-erforderlich war. Die Lösung musste die isolierten Komponenten zu einem
-kohärenten System verbinden, ohne dabei die bestehenden
-Sicherheitsrichtlinien zu verletzen. Der gewählte Ansatz – die Steuerung
-über Smart-Plugs – stellte einen eleganten Kompromiss zwischen
-technischer Machbarkeit und praktischem Nutzen dar; eine Entscheidung,
-die nicht zuletzt auf meiner privaten Erfahrung mit TAPO-Geräten
-basierte. In meiner privat geführten Infrastruktur hatte ich bereits
-TAPO-Geräte aller Art integriert – stets ging dies recht schnell und
-einfach vonstatten. Privat nutzte ich ebenfalls Air-Gapped-Networks
-hierfür, jedoch mit dem entscheidenden Unterschied, nicht mit der
-eigenständigen programmatischen Integration eben jener Geräte als
-Hauptkomponente beauftragt zu sein; ein Unterschied, der sich als
-gravierend herausstellen sollte.
-
-# 2. Projektplanung
-
-## 2.1 Terminplanung
-
-Die Projektplanung folgte
-einem agilen Ansatz nach Scrum-Prinzipien – eine Entscheidung, die sich
-angesichts der zahlreichen Unwägbarkeiten als richtig erweisen sollte.
-Die Gesamtprojektdauer von fünf Wochen (15. April bis 20. Mai 2025)
-wurde in fünf einwöchige Sprints unterteilt, wobei jeder Sprint seine
-eigenen Herausforderungen und – ja – auch Überraschungen bereithielt.
-
-### Sprint 1 (15.-19. April 2025)
-
-Der erste Sprint widmete
-sich der Analyse des vorgefundenen Prototyps und der Definition der
-Erweiterungspunkte. Nach Projektstart und erstmaliger Sichtung der
-Frontend-Codebasis offenbarte sich eine solide, wenn auch stellenweise
-überkomplexe Struktur. Die Spezifikation der erforderlichen
-API-Endpunkte gestaltete sich umfangreicher als erwartet – über 100
-Endpunkte wurden identifiziert, was mich zunächst erschaudern ließ. Der
-kritische Meilenstein dieses Sprints war die erfolgreiche Etablierung
-der Kommunikation mit den Smart-Plugs über die PyP100-Bibliothek; ein
-Vorhaben, das zunächst kläglich scheiterte.
-
-### Sprint 2 (22.-26. April 2025)
-
-Im zweiten Sprint lag der Fokus auf dem Aufbau der
-Backend-Infrastruktur. Die Beantragung der erforderlichen
-Administratorrechte erwies sich als zeitaufwändiger als erwartet.
-Parallel dazu begannen die ersten Experimente mit Wireshark, um das
-Kommunikationsprotokoll der Smart-Plugs zu entschlüsseln – eine
-Notwendigkeit, die sich aus der mangelhaften Dokumentation der
-PyP100-Bibliothek ergab.
-
-### Sprint 3 (29. April - 3. Mai 2025)
-
-Der dritte Sprint sollte
-die Integration von Frontend und Backend realisieren. Stattdessen
-mutierte er zu einer Woche der technischen Herausforderungen: Die
-Verbindung zwischen den Komponenten scheiterte wiederholt, die
-genehmigten SSL-Zertifikate gingen durch einen unglücklichen
-Neuinstallationsprozess verloren und somit auch der hart erarbeitete
-Intranet-Zugang, bei dem ich Torben damals – unwissend meines späteren
-Projektes – noch zur Seite stand. Zudem kostete die Einarbeitung in die
-unternehmensspezifischen Implementierungen von GitHub OAuth und npm
-weiterhin wertvolle Zeit.
-
-### Sprint 4 (6.-10. Mai 2025)
-
-Ursprünglich für
-Optimierungen vorgesehen, passierte in dem Sprint alles: von
-Krisensitzung bzgl. Des Umgangs mit der vorliegenden Situation bis hin
-zur Ausarbeitung einer Rettungsmission und der Umsetzung dieser. Der
-Zeitdruck erzwang pragmatische Entscheidungen und die Konzentration auf
-essenzielle Funktionen. In intensiven Coding-Sessions wurde die
-Grundfunktionalität – sprich die Ansteuerung der Steckdosen per
-Python-Code mit Rudimentärem Flask-Frontend – implementiert; nicht
-unbedingt elegant, aber funktional.
-
-### Sprint 5 (13.-17. Mai 2025)
-
-Der finale Sprint diente
-der Fehlerbehebung und Systemstabilisierung. Die ursprünglich geplanten
-ausführlichen Schulungen fielen mehr oder minder dem Zeitdruck zum
-Opfer, wurden aber dennoch in gut improvisierter Form durchgeführt,
-sodass die Kollegen / Ausbilder ein intuitives Verständnis entwickeln
-konnten. Weiterhin wurde an kritischen Bugfixes gearbeitet und die
-Projektdokumentation erstellt.
-
-## 2.2 Ressourcenplanung
-
-Die Ressourcenplanung
-gestaltete sich als Balanceakt zwischen technischen Anforderungen und
-budgetären Beschränkungen. Die Hardware-Ausstattung wurde sorgfältig –
-und doch pragmatisch – ausgewählt.
-
-Als zentrale Serverplattform diente zunächst ein Raspberry Pi 4 mit 4 GB
-RAM – eine Entscheidung, die sich schnell als Fehlkalkulation
-herausstellte. Performance-Tests zeigten, dass das ressourcenhungrige
-Next.js-Frontend die kleine Platine an ihre Grenzen brachte. Der
-kurzfristige Wechsel auf einen Raspberry Pi 5 mit 8 GB RAM und 128 GB
-Speicher löste die Performance-Probleme, verursachte aber zusätzliche
-Kosten und – was schwerer wog – Zeitverzug.
-
-Die sechs TP-Link Tapo P110 Smart-Plugs bildeten das Herzstück der
-Hardware-Lösung. Jedes Gerät erhielt eine statische IP-Adresse im
-Bereich 192.168.0.100 bis 192.168.0.106 – eine scheinbar triviale
-Konfiguration, die sich später als entscheidend für die Systemstabilität
-erweisen sollte. Die ursprüngliche Annahme, dass sich diese Geräte
-problemlos integrieren lassen würden, erwies sich als optimistisch; die
-proprietäre API erforderte erheblichen Reverse-Engineering-Aufwand
-mittels Wireshark.
-
-PREISKALKULATION
-
-Zur professionellen Unterbringung der Hardware wurde ein
-19-Zoll-Serverschrank beschafft. Die internen Beschaffungsprozesse
-erwiesen sich jedoch als so langwierig, dass ergänzende Komponenten wie
-Lüftereinheiten und Kabelmanagement-Systeme aus eigener Tasche
-finanziert wurden – eine Investition in die professionelle Präsentation
-des Projekts, die mir wichtig war.
-
-Die Software-Architektur basierte vollständig auf
-Open-Source-Technologien: Python 3.11 als Programmiersprache, Flask 2.3
-als Web-Framework, SQLAlchemy 2.0 für die Datenbankabstraktion und
-SQLite als Datenbanksystem. Diese Technologieauswahl gewährleistete
-nicht nur Unabhängigkeit von proprietären Lösungen, sondern erfüllte
-auch die strikte Offline-Anforderung des Projekts – ein Umstand, der
-sich als Segen erwies.
-
-Als Betriebssystem stand zunächst eine Entscheidung zwischen OpenSUSE
-und NixOS im Raum – NixOS schien durch seine deklarative Konfiguration
-für diesen Einsatzzweck prädestiniert. Letztendlich entschied ich mich
-doch für Raspbian, um nicht unnötig zu experimentieren und die knapp
-bemessene Zeit effizient zu nutzen; Pragmatismus über technische
-Eleganz.
-
-## 2.3 Planung der Qualitätssicherung
-
-Das
-Qualitätssicherungskonzept orientierte sich am V-Modell. Für jede
-Entwicklungsphase wurden korrespondierende Testaktivitäten definiert.
-
-Zur Gewährleistung realistischer Testbedingungen wurde eine dedizierte
-Testumgebung mittels VirtualBox etabliert. Ursprünglich war die
-Implementierung zweier virtueller Maschinen vorgesehen – eine für das
-Backend, eine für das Frontend – um die geplante verteilte Architektur
-vollständig zu simulieren. Die zeitlichen Restriktionen erzwangen jedoch
-eine Fokussierung auf die Backend-Testumgebung. Diese virtuelle
-Maschine, basierend auf Debian mit Hardware-Konfigurationen analog zum
-Produktivsystem des Raspberry Pi, ermöglichte realitätsnahe Tests ohne
-Gefährdung der Produktivumgebung sowie die Gewährleistung meiner
-absolut-mobilen Produktivität.
-
-Die Konfiguration der Testumgebung erforderte spezielle Anpassungen an
-die Unternehmensrichtlinien: Da Port 443 auf Dienstrechnern von Mercedes
-standardmäßig blockiert ist, wurde eine Port-Weiterleitung
-implementiert, die den Zugriff vom Host-System über alternative Ports
-ermöglichte. Diese Lösung gewährleistete vollständige Funktionstests bei
-gleichzeitiger Compliance mit den Sicherheitsrichtlinien.
-
-Auf Unit-Test-Ebene wurden alle kritischen Komponenten isoliert
-getestet. Die Datenbankoperationen, API-Eingabevalidierung und
-Kernfunktionen der Reservierungsverwaltung durchliefen umfangreiche
-Testszenarien. Besondere Aufmerksamkeit galt der
-Smart-Plug-Kommunikation, für die spezielle Testfälle entwickelt wurden
-– einschließlich simulierter Netzwerkausfälle und Timeout-Situationen.
-
-Die Integrationstests gestalteten sich komplexer als erwartet. Das
-Zusammenspiel zwischen Backend und Smart-Plugs erwies sich als
-fehleranfällig, insbesondere bei gleichzeitigen Zugriffen. Die
-systematischen Tests mit verschiedenen Eingabedaten – einschließlich
-bewusst invalider und potenziell schädlicher Inputs – deckten mehrere
-Sicherheitslücken auf, die nachträglich geschlossen werden mussten.
-
-Systemtests bildeten komplette Anwendungsszenarien ab. Ein typischer
-Testfall umfasste die Benutzeranmeldung, Reservierungserstellung,
-automatische Druckeraktivierung zur geplanten Zeit und die anschließende
-Deaktivierung. Die zeitliche Präzision der Schaltungen – kritisch für
-die Benutzerzufriedenheit – wurde dabei besonders überwacht.
-
-Performance-Tests auf der Zielplattform offenbarten die bereits
-erwähnten Limitierungen des Raspberry Pi 4. Der Wechsel auf den Pi 5
-löste diese Probleme, erforderte aber eine Wiederholung aller Tests. Die
-finale Konfiguration bewältigte selbst simultane Zugriffe mehrerer
-Nutzer und parallele Smart-Plug-Operationen ohne nennenswerte Einbußen –
-ein Triumph der Optimierung.
-
-## 2.4 Bewertung der heterogenen IT-Landschaft
-
-Die IT-Landschaft der TBA
-präsentierte sich als bunter Flickenteppich verschiedenster Technologien
-und Standards. Die 3D-Drucker stammten von unterschiedlichen Herstellern
-mit inkompatiblen Steuerungssystemen. Das Netzwerk war in multiple VLANs
-segmentiert, wobei die Dokumentation dieser Struktur bestenfalls als
-lückenhaft bezeichnet werden konnte.
-
-Die Herausforderung bestand darin, eine einheitliche Lösung für diese
-heterogene Umgebung zu entwickeln. Der Ansatz über Smart-Plugs erwies
-sich hier als Glücksgriff – er abstrahierte die Unterschiede zwischen
-den Druckern auf die simpelste mögliche Ebene: Strom an oder aus. Diese
-radikale Vereinfachung ermöglichte eine universelle Lösung, die
-unabhängig vom Druckermodell funktionierte.
-
-Die Integration in die bestehende Netzwerkinfrastruktur erforderte
-diplomatisches Geschick. Die IT-Abteilung bestand auf strikter
-Segmentierung, was die Kommunikation zwischen Komponenten
-verkomplizierte. Die Lösung – ein dediziertes IoT-Subnetz für das
-MYP-System – stellte einen akzeptablen Kompromiss dar, der sowohl
-Sicherheitsbedenken als auch funktionale Anforderungen berücksichtigte.
-
-## 2.5 Anforderungsgerechte Auswahl der Übertragungssysteme
-
-Die Auswahl der
-Übertragungssysteme wurde maßgeblich durch die Sicherheitsanforderungen
-bestimmt. Cloud-basierte Lösungen schieden kategorisch aus, was die
-Optionen erheblich einschränkte. Die Entscheidung für lokale
-HTTP/HTTPS-Kommunikation mit selbstsignierten Zertifikaten war
-pragmatisch, aber effektiv.
-
-Die Kommunikation mit den Smart-Plugs stellte die zentrale technische
-Herausforderung dar. Die TAPO-Geräte boten keine dokumentierte
-Programmierschnittstelle – die Steuerung erfolgte ausschließlich über
-die proprietäre Hersteller-App. Eine systematische Protokollanalyse
-mittels Wireshark wurde daher unumgänglich. Die Untersuchung des
-Netzwerkverkehrs zwischen App und Steckdosen offenbarte eine
-verschlüsselte Kommunikation mit dynamisch generierten Session-Keys.
-
-Mein initialer Implementierungsversuch mit einem recherchierten
-Python-Modul verlief erfolglos – die Kompatibilität mit den vorhandenen
-Geräten war nicht gegeben. Die Wireshark-Analyse zeigte konsistente
-verschlüsselte Response-Muster. Nach mehreren erfolglosen Versuchen,
-einzelne Anfragen zu replizieren, wurde deutlich: Die korrekte
-Sequenzierung der Kommunikation war essentiell. Das Protokoll nutzte
-temporäre Authentifizierungs-Cookies in Kombination mit proprietärer
-Verschlüsselung.
-
-Nach intensiver Recherche und mehreren Tagen systematischer Tests konnte
-PyP100 als geeignete Lösung identifiziert werden. Dieses auf GitHub
-verfügbare Python-Modul implementierte das proprietäre Protokoll korrekt
-und ermöglichte eine stabile Integration der Smart-Plugs in die
-Systemarchitektur.
-
-## 2.6 Planung der Prozess-/ und Systemschnittstellen
-
-Die Schnittstellenplanung
-erforderte eine sorgfältige Balance zwischen Funktionalität und
-Sicherheit. Die REST-API wurde nach modernen Standards entworfen, mit
-klarer Trennung zwischen öffentlichen und authentifizierten Endpunkten.
-Über 100 Endpunkte wurden spezifiziert – eine Anzahl, die zunächst
-umfangreich erschien, sich jedoch als notwendig für die vollständige
-Funktionsabdeckung erwies. Jeder Endpunkt wurde präzise auf seine
-spezifische Aufgabe zugeschnitten.
-
-Die Schnittstelle zwischen Frontend und Backend basierte auf
-JSON-formatierter Kommunikation über HTTPS. Die Implementierung von
-CORS-Policies gestaltete sich komplexer als erwartet, da die
-Sicherheitsrichtlinien strikte Einschränkungen vorgaben. Die Lösung –
-eine Whitelist-basierte CORS-Konfiguration – erfüllte die
-Sicherheitsanforderungen ohne die Funktionalität einzuschränken. Diese
-Implementation stellte einen ausgewogenen Kompromiss zwischen Sicherheit
-und Anwenderfreundlichkeit dar.
-
-Besondere Aufmerksamkeit erforderte die Scheduler-Schnittstelle. Der als
-eigenständiger Thread implementierte Scheduler musste nahtlos mit der
-Hauptanwendung kommunizieren, ohne dabei Race Conditions oder Deadlocks
-zu verursachen. Die Verwendung von Thread-sicheren Queues und explizitem
-Locking löste diese Herausforderung mit einer technisch eleganten
-Architektur.
-
-## 2.7 Planung der IT-Sicherheitsmaßnahmen
-
-Die Sicherheitsplanung
-folgte dem Prinzip "Security by Design" – ein Ansatz, der sich
-angesichts der sensiblen Umgebung als unerlässlich erwies. Jede
-Komponente wurde von Anfang an mit Sicherheit im Hinterkopf entwickelt.
-
-Die Authentifizierung basierte auf bcrypt mit einem Cost-Faktor von 12 –
-ein Kompromiss zwischen Sicherheit und Performance auf dem Raspberry Pi.
-Session-Management wurde über Flask-Login realisiert, mit
-konfigurierbaren Timeout-Werten und sicheren Session-Cookies. Die
-Implementierung einer Brute-Force-Protection mit exponentieller
-Backoff-Strategie verhinderte automatisierte Angriffe.
-
-Auf Netzwerkebene wurden restriktive Firewall-Regeln implementiert. Nur
-essenzielle Ports wurden geöffnet, ausgehende Verbindungen auf die
-IP-Adressen der Smart-Plugs beschränkt. Die Verwendung von iptables
-ermöglichte granulare Kontrolle über den Netzwerkverkehr.
-
-Die API-Sicherheit umfasste Input-Validation, Output-Encoding und
-CSRF-Protection. Jeder Endpunkt wurde gegen die OWASP Top 10
-abgesichert. Ein selbstentwickeltes Intrusion Detection System
-überwachte verdächtige Aktivitäten und sperrte bei Bedarf IP-Adressen
-temporär.
-
-# 3. Durchführung und Auftragsbearbeitung
-
-## 3.1 Prozess-Schritte und Vorgehensweise
-
-Die Durchführung des
-Projekts glich einer technischen Expedition mit unerwarteten Wendungen
-und kreativen Lösungsansätzen. Die ursprünglich geplante lineare
-Vorgehensweise wich schnell einer iterativen, problemgetriebenen
-Herangehensweise.
-
-### 3.1.1 Datenabfrage der Sensoren
-
-Die "Sensoren" in diesem
-Kontext waren die Smart-Plugs – eine euphemistische Bezeichnung für
-Geräte, die sich als technisch anspruchsvoll in der Integration
-erwiesen. Meine initiale Recherche nach einem geeigneten Python-Modul
-zur Steuerung verlief erfolglos. Das identifizierte Modul erwies sich
-als inkompatibel mit den vorhandenen Geräten.
-
-Daraufhin erfolgte eine Protokollanalyse mittels Wireshark. Die
-Aufzeichnung des Netzwerkverkehrs zwischen TAPO-App und Smart-Plugs
-offenbarte ein komplexes Authentifizierungsprotokoll: Die Kommunikation
-erfolgte verschlüsselt unter Verwendung von Session-Tokens mit
-dynamischer Generierung bei jeder Authentifizierung. Die implementierte
-Verschlüsselung basierte auf einer RSA-AES-Hybridarchitektur – eine
-bemerkenswerte Sicherheitsimplementierung für Geräte dieser Preisklasse,
-die jedoch die Integration erheblich verkomplizierte.
-
-Nach mehrtägiger Analyse und verschiedenen Implementierungsversuchen
-identifizierte ich PyP100 – ein Python-Modul, das die erforderliche
-lokale Kommunikation mit den TAPO-Geräten beherrschte. Diese auf GitHub
-verfügbare Bibliothek löste die Session-Key-Problematik durch eine
-elegante Implementierung des proprietären Protokolls.
-
-Die Implementierung der Datenabfrage erfolgte über eine
-selbstentwickelte Wrapper-Klasse, die die Komplexität der Kommunikation
-kapselte. Retry-Mechanismen mit exponentieller Backoff-Strategie sorgten
-für Robustheit bei Netzwerkproblemen. Die Abfrage umfasste nicht nur den
-Schaltzustand, sondern auch Metadaten wie Energieverbrauch und
-Signalstärke – Informationen, die sich später als wertvoll für das
-Monitoring erwiesen.
-
-### 3.1.2 Verarbeiten der Daten
-
-Die Datenverarbeitung
-folgte einem ereignisgesteuerten Ansatz. Der Scheduler-Thread prüfte im
-Minutentakt die Datenbank auf anstehende Aktionen und triggerte
-entsprechende Smart-Plug-Operationen. Die Herausforderung bestand darin,
-die Asynchronität der Hardware-Operationen mit der Synchronität der
-Datenbankzugriffe zu vereinen.
-
-Die Lösung war ein Queue-basiertes System, das Kommandos pufferte und
-sequenziell abarbeitete. Dies verhinderte Race Conditions bei simultanen
-Zugriffen und gewährleistete die Konsistenz der Systemzustände. Jede
-Operation wurde in einer Transaktion gekapselt, mit Rollback-Mechanismen
-bei Fehlern.
-
-Die Verarbeitung der Energiedaten ermöglichte interessante Einblicke in
-die Nutzungsmuster. Anomalien – wie ungewöhnlich hoher Stromverbrauch –
-konnten erkannt und gemeldet werden. Diese Funktion, ursprünglich nicht
-in der Projektspezifikation vorgesehen, entwickelte sich zu einem
-wertvollen Feature für die präventive Wartung. Die ungeplante
-Zusatzfunktionalität erweiterte den Nutzen des Systems signifikant über
-die reine Reservierungsverwaltung hinaus.
-
-## 3.2 Abweichung, Anpassung und Entscheidungen
-
-Die Projektdurchführung
-war geprägt von kontinuierlichen Anpassungen an die Realität. Die größte
-Abweichung vom ursprünglichen Plan war der Wechsel der Systemarchitektur
-von einer verteilten zu einer konsolidierten Lösung.
-
-Ursprünglich war geplant, dass ich nur die API entwickle und diese mit
-dem existierenden Frontend auf einem separaten Raspberry Pi verknüpfe.
-Diese Architektur erwies sich als zu komplex – die unterschiedlichen
-Technologie-Stacks (Next.js vs. Python/Flask) und die
-Netzwerksegmentierung machten die Integration schwierig. Die
-Entscheidung, beide Komponenten auf einem einzigen Raspberry Pi zu
-konsolidieren, vereinfachte nicht nur die Architektur, sondern
-reduzierte auch Kosten und Stromverbrauch.
-
-Der versehentliche Verlust der SSL-Zertifikate während einer
-Neuinstallation führte zur Implementierung eines robusten
-Backup-Systems. Kritische Konfigurationsdateien werden nun dreifach
-gesichert – eine Lektion, die schmerzhaft gelernt wurde. Der Verlust der
-bereits genehmigten Zertifikate des Haack'schen Prototyps zur
-Projektmitte war ein Moment des Schreckens; die mühsam erkämpften
-Genehmigungen, die etablierten Vertrauensstellungen – alles dahin durch
-einen unbedachten Moment während der Systemkonfiguration.
-
-Die Entscheidung, von meinem ersten Python-Modul-Versuch zu PyP100 zu
-wechseln, fiel nach tagelangen frustrierenden Debugging-Sessions. Der
-Stolz, es mit dem ersten Modul schaffen zu wollen, wich dem
-Pragmatismus, eine funktionierende Lösung zu liefern. PyP100 –
-ironischerweise simpler und stabiler – rettete das Projekt.
-
-## 3.3 Maßnahmen zur Qualitätskontrolle
-
-Die Qualitätskontrolle
-erfolgte kontinuierlich und vielschichtig. Automatisierte Tests liefen
-bei jedem Commit, manuelle Tests ergänzten diese bei kritischen
-Funktionen. Die Herausforderung bestand darin, die Hardware-abhängigen
-Komponenten testbar zu machen.
-
-Mock-Objekte simulierten die Smart-Plugs für Unit-Tests. Diese Mocks
-replizierten das Verhalten der echten Hardware, einschließlich typischer
-Fehlerszenarien wie Timeouts oder Verbindungsabbrüche. Die Test-Coverage
-erreichte 85% – die fehlenden 15% waren hauptsächlich UI-Code und
-Error-Handler, deren Test-Aufwand in keinem vernünftigen Verhältnis zum
-Nutzen stand.
-
-Die VirtualBox-basierte Testumgebung ermöglichte umfassende Systemtests
-unter produktionsnahen Bedingungen. Die virtuelle Maschine replizierte
-die Konfiguration des Produktivsystems, wodurch potenzielle
-Inkompatibilitäten frühzeitig identifiziert werden konnten. Die
-implementierte Port-Weiterleitung umging die Restriktionen des
-Unternehmensnetzes und ermöglichte vollständige End-to-End-Tests
-inklusive HTTPS-Kommunikation.
-
-Integrationstests mit echter Hardware deckten Probleme auf, die in der
-Simulation nicht auftraten. Timing-Issues bei simultanen Zugriffen,
-Memory-Leaks bei lang laufenden Operationen, Race Conditions im
-Scheduler – all diese Probleme wurden iterativ identifiziert und
-behoben.
-
-Die Implementierung eines Logging-Systems erwies sich als unschätzbar
-wertvoll. Jede Operation, jeder Fehler, jede Anomalie wurde
-protokolliert. Die Log-Analyse wurde zum wichtigsten Debugging-Tool,
-insbesondere bei sporadisch auftretenden Problemen.
-
-## 3.4 Implementierung, Konfiguration und Inbetriebnahme von Schnittstellen und unterschiedlicher Prozesse und Systeme
-
-Die Implementierung der
-verschiedenen Schnittstellen erfolgte modular und iterativ. Die REST-API
-wurde Blueprint-basiert strukturiert, was eine klare Trennung der
-Funktionsbereiche ermöglichte. Authentication, User Management, Printer
-Management und Job Management erhielten jeweils eigene Blueprints.
-
-Die Smart-Plug-Schnittstelle durchlief mehrere Iterationen. Die finale
-Implementation kapselte die gesamte Kommunikationslogik in einer
-einzigen Klasse, die eine simple API bot: turn_on(), turn_off(),
-get_status(). Diese Abstraktion verbarg die Komplexität des
-darunterliegenden Protokolls und ermöglichte einfache Erweiterungen. Die
-Datenbank-Schnittstelle nutzte SQLAlchemy's ORM-Funktionalität. Die
-Definition der Models erfolgte deklarativ, Migrationen wurden über
-Alembic verwaltet. Die Entscheidung für SQLite als Datenbank war
-pragmatisch – keine zusätzlichen Services, keine Konfiguration, perfekt
-für die Offline-Anforderung.
-
-Der Scheduler wurde als eigenständiger Thread implementiert, der beim
-Anwendungsstart initialisiert wurde. Die Kommunikation mit dem
-Hauptthread erfolgte über thread-sichere Queues. Diese Architektur
-ermöglicht asynchrone Hardware-Operationen ohne Blockierung der
-Web-Requests.
-
-## 3.5 Konfiguration von Übertragungssystemen und Integration in die Gesamtinfrastruktur
-
-Die Integration in die
-Unternehmensinfrastruktur erforderte zahlreiche Kompromisse und kreative
-Lösungen. Das dedizierte IoT-Subnetz wurde speziell für das MYP-System
-eingerichtet, mit restriktiven Firewall-Regeln und ohne Internet-Zugang.
-
-Die Netzwerkkonfiguration erfolgte in enger Abstimmung mit der
-IT-Abteilung. Jede Änderung erforderte ein Change-Request, jede
-Port-Öffnung eine Security-Review. Der bürokratische Overhead war
-erheblich, aber notwendig für die Compliance.
-
-Die SSL-Konfiguration mit selbstsignierten Zertifikaten war ein
-notwendiges Übel. Ohne Internet-Zugang war Let's Encrypt keine Option.
-Die Zertifikate wurden mit OpenSSL generiert und mit allen relevanten
-SANs (Subject Alternative Names) versehen, um Kompatibilitätsprobleme zu
-vermeiden. Die Browser-Warnungen wurden durch eine dokumentierte
-Prozedur zur Zertifikats-Installation umgangen – nicht elegant, aber
-funktional.
-
-Die Integration der Smart-Plugs erforderte statische IP-Adressen –
-DHCP-Reservierungen waren in der Netzwerk-Policy nicht vorgesehen. Die
-manuelle Konfiguration jedes Geräts war zeitaufwendig, gewährleistete
-jedoch stabile und vorhersagbare Netzwerkverbindungen.
-
-Für die Administration und Wartung des Systems wurden
-Remote-Zugriffsmöglichkeiten implementiert. Das Setup-Skript
-konfigurierte automatisch SSH und RDP-Dienste, wodurch eine sichere
-Fernwartung des Raspberry Pi ermöglicht wurde. Diese Remote-Zugänge
-erwiesen sich als essentiell für die effiziente Systemadministration,
-insbesondere da der physische Zugang zum Serverschrank oft eingeschränkt
-war.
-
-## 3.6 Erfüllen der Anforderungen an die Informationssicherheit
-
-Die Informationssicherheit wurde von Anfang an als kritischer
-Erfolgsfaktor behandelt. Jede Designentscheidung wurde durch die
-Sicherheitsbrille betrachtet, jede Implementierung auf Schwachstellen
-geprüft.
-
-Die Authentifizierung implementierte moderne Best Practices:
-bcrypt-Hashing, sichere Session-Verwaltung, CSRF-Protection. Die
-API-Endpunkte wurden systematisch gegen die OWASP Top 10 abgesichert.
-Input-Validation erfolgte auf mehreren Ebenen – Client-seitig für UX,
-Server-seitig für Sicherheit.
-
-Die Implementierung eines Rate-Limiters verhinderte
-Brute-Force-Angriffe. Nach fünf fehlgeschlagenen Login-Versuchen wurde
-die IP-Adresse für 30 Minuten gesperrt – lang genug, um Angriffe
-unwirtschaftlich zu machen, kurz genug, um legitime Nutzer nicht
-übermäßig zu frustrieren.
-
-DSGVO-Compliance wurde durch Privacy-by-Design erreicht.
-Personenbezogene Daten wurden minimiert, Löschfristen implementiert,
-Datenexport-Funktionen bereitgestellt. Die Logging-Funktionalität
-anonymisierte IP-Adressen nach 30 Tagen automatisch.
-
-# 4. Projektabschluss
-
-## 4.1 Soll-Ist-Vergleich (Abweichung, Anpassungen)
-
-Der Vergleich zwischen
-geplanten und erreichten Zielen offenbart ein gemischtes, aber
-letztendlich positives Bild. Die Kernfunktionalität – digitale
-Reservierungsverwaltung mit automatischer Hardware-Steuerung – wurde
-vollständig implementiert und übertraf in einigen Aspekten sogar die
-ursprünglichen Anforderungen.
-
-### Erfolgreich umgesetzte Anforderungen
-
-Das Produkt dieser Projektarbeit bietet eine vollständig digitalisierte
-Reservierungslösung mit automatischer Druckersteuerung via Smart-Plugs,
-robuster Authentifizierung, einer umfangreichen REST-API,
-offline-fähiger Architektur ohne Cloud-Abhängigkeiten
-sowie DSGVO-konformer Datenhaltung und integriertem Energiemonitoring
-mit Nutzungsstatistiken. Es wurde erfolgreich
-
-Abweichungen vom ursprünglichen Plan:
-
-Konsolidierung auf einen statt zwei Raspberry Pis
-
-Wechsel von PyP100 zu alternativem Kommunikationsmodul
-
-Hardware-Upgrade vom Pi 4 auf Pi 5
-
-Verschiebung der Benutzerschulungen auf Nach-Projektphase
-
-Die größte positive Überraschung war die erfolgreiche Integration des
-Energiemonitorings. Diese ursprünglich nicht geplante Funktion
-ermöglicht detaillierte Einblicke in Nutzungsmuster und Energieverbrauch
-– wertvolle Daten für die Optimierung des Druckerbetriebs.
-
-Für die programmatische Umsetzung des Frontends nahm ich gänzlich
-Unterstützung künstlicher Intelligenz zu Hilfe – mehr als absolut
-notwendig, um das Zeitlimit nicht um Längen zu überschreiten und die
-Profession meiner Fachrichtung einzuhalten. Die Frontend-Entwicklung lag
-außerhalb meines Kernkompetenzbereichs der digitalen Vernetzung; die
-KI-Assistenz ermöglichte es mir, mich auf die Backend-Integration und
-Hardware-Anbindung zu konzentrieren – meine eigentlichen Stärken.
-
-Die Implementierung eines Kiosk-Modus für die Werkstatt-Terminals
-erforderte zusätzliche Systemkonfiguration: Openbox als minimalistisches
-Desktop-Environment, Chromium im Kiosk-Modus mit automatischem Start
-dreier Instanzen – eine auf Port 443, eine auf Port 80 als Fallback für
-die API, sowie eine lokale Instanz auf Port 5000 für den Kiosk-Modus.
-Die Unternehmens-Root-CA-Zertifikate mussten manuell installiert werden;
-ein Shell-Skript automatisierte diesen Prozess, eine
-systemd-Service-Datei gewährleistete den Autostart. FirewallD diente als
-Firewall-Service – eine weitere Ebene der Absicherung.
-
-Die technischen Herausforderungen – insbesondere die
-Smart-Plug-Integration – erforderten mehr Zeit als geplant. Die
-investierte Mühe zahlte sich jedoch aus: Die finale Lösung ist robuster
-und wartungsfreundlicher als eine Quick-and-Dirty-Implementation gewesen
-wäre.
-
-## 4.2 Fazit
-
-Das
-MYP-Projekt demonstriert eindrucksvoll, wie durch kreative Ansätze und
-technisches Geschick aus scheinbar unüberwindbaren Hindernissen elegante
-Lösungen entstehen können. Die Transformation eines analogen Whiteboards
-in ein modernes cyber-physisches System mag auf den ersten Blick trivial
-erscheinen – die Umsetzung offenbarte jedoch die volle Komplexität
-vernetzter Systeme.
-
-Die Entscheidung, die fehlenden Schnittstellen der 3D-Drucker durch
-Smart-Plugs zu überbrücken, erwies sich als Glücksgriff. Diese
-Abstraktion auf die grundlegendste Ebene – Stromversorgung – ermöglichte
-eine universelle Lösung, die unabhängig von Druckermodell oder
-Hersteller funktioniert.
-
-Die technische Exzellenz des Systems zeigt sich in den Details: Über
-9.000 Zeilen sauber strukturierter Python-Code, eine umfassende
-REST-API, robuste Fehlerbehandlung und eine durchdachte
-Sicherheitsarchitektur. Der eigentliche Erfolg manifestiert sich jedoch
-in der Praxistauglichkeit. Das System läuft stabil, wird aktiv genutzt
-und hat die ineffiziente manuelle Verwaltung vollständig abgelöst.
-
-Persönlich stellte das Projekt eine intensive Lernerfahrung dar. Von der
-anfänglichen Konzeptionsphase über herausfordernde Debugging-Sessions
-bis zur erfolgreichen Implementierung bot jede Projektphase wertvolle
-Erkenntnisse. Die Fähigkeit, unter Zeitdruck fundierte technische
-Entscheidungen zu treffen und dabei hohe Qualitätsstandards aufrecht zu
-erhalten, stellte eine der wichtigsten erworbenen Kompetenzen dar.
-
-## 4.3 Optimierungsmöglichkeiten
-
-Das MYP-System bietet
-eine solide Basis für zukünftige Erweiterungen. Die modulare Architektur
-und umfassende API ermöglichen die Integration zusätzlicher
-Funktionalitäten ohne grundlegende Systemänderungen – ein Fundament, auf
-dem aufgebaut werden kann.
-
-Kurzfristig ist die Anbindung an das unternehmenseigene Active Directory
-geplant. Die vorbereiteten Schnittstellen ermöglichen eine nahtlose
-Integration, sobald die erforderlichen Genehmigungen vorliegen. Diese
-Erweiterung würde die Benutzerverwaltung erheblich vereinfachen und die
-Akzeptanz im Unternehmensumfeld steigern.
-
-Mittelfristig könnte bei Verfügbarkeit modernerer 3D-Drucker eine
-direkte Geräteintegration realisiert werden. Die Einbindung von
-OctoPrint oder vergleichbaren Systemen würde erweiterte Funktionen wie
-Druckfortschrittsüberwachung und Remote-Dateiverwaltung ermöglichen –
-Features, die das System auf ein neues Level heben würden.
-
-Langfristig bietet sich die Erweiterung zu einer umfassenden
-Maker-Space-Management-Lösung an. Die grundlegende Architektur
-unterstützt die Integration weiterer Gerätetypen wie Lasercutter oder
-CNC-Fräsen. Machine-Learning-Algorithmen könnten perspektivisch für
-Auslastungsprognosen und Optimierungsvorschläge implementiert werden.
-Die modulare Systemarchitektur ermöglicht diese Erweiterungen ohne
-grundlegende Änderungen am Kernsystem.
-
-## 4.4 Abnahme
-
-ABNAHMEPROTOKOLL
-
-Die formale Projektabnahme erfolgte am 2. Juni 2025 durch die
-Ausbildungsleitung der TBA. Die Präsentation umfasste eine
-Live-Demonstration aller Kernfunktionen sowie eine technische
-Deep-Dive-Session für interessierte Kollegen.
-
-Die Live-Demonstration verlief trotz anfänglicher technischer
-Herausforderungen erfolgreich. Das System befand sich noch nicht im
-vollständig produktiven Zustand, da ausstehende Hardware-Komponenten die
-finale Installation verzögerten. Die robuste Systemarchitektur
-ermöglichte jedoch eine überzeugende Präsentation aller
-Kernfunktionalitäten. Die automatische Aktivierung eines 3D-Druckers zur
-reservierten Zeit demonstrierte eindrucksvoll die erfolgreiche
-Integration der cyber-physischen Komponenten.
-
-Besonders positiv wurde die Wirtschaftlichkeit der Lösung bewertet. Mit
-Gesamtkosten unter 600 Euro (inklusive privat finanzierter Komponenten)
-liegt das System weit unter kommerziellen Alternativen. Die Einsparungen
-durch automatisierte Abschaltung und optimierte Nutzung amortisieren die
-Investition binnen weniger Monate – ein Argument, das bei der
-Geschäftsführung Anklang fand.
-
-Die Rückmeldungen der ersten Nutzer bestätigten die Praxistauglichkeit.
-Die intuitive Bedienung, die zuverlässige Funktion und die Eliminierung
-von Reservierungskonflikten wurden besonders hervorgehoben.
-Identifizierte Optimierungspotenziale – primär im Bereich der
-Benutzeroberfläche – wurden systematisch dokumentiert und werden in
-kommende Versionen integriert. Das Prinzip der kontinuierlichen
-Verbesserung ist fest in der Projektphilosophie verankert.
-
-Mit der erfolgreichen Abnahme und Inbetriebnahme schließt das Projekt
-formal ab. Das MYP-System ist jedoch kein statisches Produkt, sondern
-der Beginn einer kontinuierlichen Evolution. Die geschaffene Basis
-ermöglicht iterative Verbesserungen und Erweiterungen – ganz im Sinne
-moderner Software-Entwicklung.
-
-Die Transformation der 3D-Drucker-Verwaltung von analog zu digital, von
-unstrukturiert zu systematisch, von manuell zu automatisiert wurde
-erfolgreich vollzogen. Das Projekt demonstriert, wie durch methodisches
-Vorgehen, technische Kompetenz und lösungsorientiertes Denken auch
-komplexe Herausforderungen in der digitalen Vernetzung gemeistert werden
-können. Das implementierte System bildet eine solide Grundlage für den
-produktiven Einsatz und zukünftige Erweiterungen.
-
-#
-
-# Anlagen
-
-## Übergabeprotokoll
-
-## Netzwerkdiagramme und Systemarchitektur
-
-## API-Dokumentation
-
-## Benutzerhandbuch
-
-## Testprotokolle
-
-## Screenshots der Benutzeroberfläche
-
-## Konfigurationsdateien und Deployment-Skripte
diff --git a/IHK_Projektdokumentation/Dokumentation_Professionell.md b/IHK_Projektdokumentation/Dokumentation_Professionell.md
deleted file mode 100644
index 1b923b09..00000000
--- a/IHK_Projektdokumentation/Dokumentation_Professionell.md
+++ /dev/null
@@ -1,292 +0,0 @@
-# MYP – Manage Your Printer
-
-## Vernetzte 3D-Druck-Reservierungsplattform mit IoT-Anbindung und zentraler Verwaltungsoberfläche
-
-**Dokumentation der betrieblichen Projektarbeit**
-**Fachinformatiker für digitale Vernetzung**
-
----
-
-**Prüfungsbewerber:** Till Tomczak
-**Ausbildungsbetrieb:** Mercedes-Benz AG
-**Prüfungstermin:** Sommer 2025
-**Bearbeitungszeitraum:** 15. April – 20. Mai 2025
-**Projektumfang:** 35 Stunden
-
----
-
-## 1. Einleitung
-
-### 1.1 Ausgangssituation und Problemstellung
-
-Die Technische Berufsausbildungsstätte (TBA) der Mercedes-Benz AG verfügt über sechs 3D-Drucker verschiedener Hersteller, die eine wichtige Ressource für die praktische Ausbildung darstellen. Diese Geräte weisen jedoch technische Limitierungen auf: Sie verfügen weder über Netzwerkschnittstellen noch über einheitliche Steuerungsmöglichkeiten.
-
-Das bestehende Reservierungssystem basierte auf einem analogen Whiteboard, was zu systematischen Problemen führte:
-
-- **Doppelbuchungen** durch unkoordinierte Reservierungen
-- **Ineffiziente Energienutzung** durch vergessene manuelle Aktivierung/Deaktivierung
-- **Fehlende Dokumentation** der Nutzungszeiten und Verantwortlichkeiten
-- **Keine zentrale Übersicht** über Verfügbarkeiten und Auslastung
-
-### 1.2 Projektziele entsprechend dem genehmigten Antrag
-
-Das Projekt "MYP – Manage Your Printer" zielt auf die **vollständige Digitalisierung des 3D-Drucker-Reservierungsprozesses** durch die Etablierung cyberphysischer Kommunikation mit den Hardwarekomponenten ab.
-
-**Definierte Projektziele:**
-
-1. **Webportal-Entwicklung** mit Frontend und Backend
-2. **WLAN-Integration** der Raspberry Pi-Plattform
-3. **Datenbankaufbau** für Reservierungsverwaltung
-4. **Authentifizierung und Autorisierung** implementieren
-5. **Test der Schnittstellen** und Netzwerkverbindungen
-6. **Automatische Hardware-Steuerung** via IoT-Integration
-
-### 1.3 Projektabgrenzung
-
-**Im Projektumfang enthalten:**
-
-- Entwicklung einer webbasierten Reservierungsplattform
-- Integration automatischer Hardware-Steuerung über Smart-Plugs
-- Implementierung einer zentralen Verwaltungsoberfläche
-- Etablierung robuster Authentifizierung und Rechteverwaltung
-
-**Ausgeschlossen aus dem Projektumfang:**
-
-- Direkte Kommunikation mit 3D-Druckern (fehlende Schnittstellen)
-- Integration in das unternehmensweite Intranet (Zeitrestriktionen)
-- Übertragung von Druckdaten oder erweiterte Druckerüberwachung
-
----
-
-## 2. Projektplanung
-
-### 2.1 Zeitplanung entsprechend Projektantrag
-
-Die Projektplanung folgte der im Antrag definierten Struktur mit 35 Stunden Gesamtaufwand:
-
-| Phase | Zeitaufwand | Zeitraum | Tätigkeiten |
-| ------------------------------------------ | ----------- | ------------------ | ------------------------------------------- |
-| **Projektplanung und Analyse** | 6 Std. | 15.-16. April | Anforderungsanalyse, Systemanalyse |
-| **Bewertung Netzwerkarchitektur** | 6 Std. | 17.-18. April | Sicherheitsanforderungen, Systemarchitektur |
-| **Systemarchitektur/Schnittstellen** | 6 Std. | 19.-22. April | Konzeption, Interface-Design |
-| **Umsetzung** | 14 Std. | 23. April - 8. Mai | Implementation, Integration |
-| **Test und Optimierung** | 6 Std. | 9.-15. Mai | Systemtests, Performance-Optimierung |
-| **Dokumentation** | 4 Std. | 16.-20. Mai | Projektdokumentation, Übergabe |
-
-### 2.2 Ressourcenplanung
-
-**Hardware-Komponenten:**
-
-- Raspberry Pi 5 (8GB RAM) als zentrale Serverplattform
-- 6× TP-Link Tapo P110 Smart-Plugs für IoT-Integration
-- Netzwerk-Infrastruktur und 19-Zoll-Serverschrank
-
-**Software-Stack:**
-
-- **Backend:** Python 3.11, Flask 2.3, SQLAlchemy 2.0
-- **Frontend:** Aufbau auf vorhandenem Next.js-Prototyp
-- **IoT-Integration:** PyP100-Bibliothek für Smart-Plug-Kommunikation
-- **System:** Raspbian OS, systemd-Services
-
-**Kostenrahmen:** Unter 600 Euro Gesamtinvestition
-
----
-
-## 3. Analyse und Bewertung der vorhandenen Systemarchitektur
-
-### 3.1 Ist-Zustand-Analyse
-
-**Vorgefundene Systemlandschaft:**
-
-- Frontend-Prototyp (Next.js) ohne Backend-Funktionalität
-- Isolierte 3D-Drucker ohne Netzwerkfähigkeit
-- Raspberry Pi 4 als ungenutzter Server
-- Analoge Reservierungsverwaltung über Whiteboard
-
-**Identifizierte Defizite:**
-
-- Fehlende cyberphysische Integration der Hardware
-- Keine zentrale Datenhaltung für Reservierungen
-- Ineffiziente manuelle Prozesse mit Fehlerpotenzialen
-- Sicherheitslücken durch analoge Verwaltung
-
-### 3.2 Bewertung der heterogenen IT-Landschaft
-
-Die IT-Infrastruktur der TBA präsentierte sich als segmentierte Umgebung mit verschiedenen VLANs und Sicherheitszonen. Die 3D-Drucker verschiedener Hersteller erforderten eine **herstellerunabhängige Abstraktionsebene**.
-
-**Gewählter Lösungsansatz:** IoT-Integration über Smart-Plugs ermöglicht universelle Steuerung unabhängig vom Druckermodell durch Abstraktion auf die Stromversorgungsebene.
-
-### 3.3 Sicherheitsanforderungen
-
-**Analysierte Vorgaben:**
-
-- Keine permanente Internetverbindung zulässig
-- Isoliertes Netzwerksegment für IoT-Komponenten erforderlich
-- Selbstsignierte SSL-Zertifikate (kein Let's Encrypt verfügbar)
-- Compliance mit Mercedes-Benz IT-Sicherheitsrichtlinien
-
-**Abgeleitete Sicherheitsmaßnahmen:**
-
-- bcrypt-Passwort-Hashing mit Cost-Faktor 12
-- CSRF-Schutz und Session-Management über Flask-Login
-- Rate-Limiting gegen Brute-Force-Angriffe
-- Restriktive Firewall-Regeln mit Port-Beschränkung
-
----
-
-## 4. Entwicklung der Systemarchitektur und Schnittstellenkonzeption
-
-### 4.1 Gesamtsystemarchitektur
-
-```
-┌─────────────────┐ HTTPS ┌─────────────────┐ WLAN ┌─────────────────┐
-│ Web-Client │◄────────────►│ Raspberry Pi │◄───────────►│ Smart-Plugs │
-│ (Browser) │ │ MYP-Server │ │ (IoT-Layer) │
-└─────────────────┘ └─────────────────┘ └─────────────────┘
- │ │
- ┌────▼────┐ ┌────▼────┐
- │ SQLite │ │3D-Drucker│
- │Database │ │(6 Geräte)│
- └─────────┘ └─────────┘
-```
-
-### 4.2 Schnittstellenkonzeption
-
-**REST-API-Design (100+ Endpunkte):**
-
-- `/api/auth/` - Authentifizierung und Session-Management
-- `/api/users/` - Benutzerverwaltung und Rechteverwaltung
-- `/api/printers/` - Druckerverwaltung und Statusinformationen
-- `/api/jobs/` - Reservierungsmanagement und Scheduling
-- `/api/monitoring/` - Energieverbrauch und Systemstatistiken
-
-**IoT-Schnittstelle zu Smart-Plugs:**
-
-- Protokoll: HTTP/TCP über WLAN-Verbindung
-- Authentifizierung: Session-basiert mit dynamischen Tokens
-- Operationen: Power On/Off, Status-Abfrage, Energiemessung
-
----
-
-## 5. Umsetzung (Implementation)
-
-### 5.1 Backend-Entwicklung
-
-**Flask-Anwendungsstruktur:**
-
-- Modulare Blueprint-Architektur für Skalierbarkeit
-- SQLAlchemy ORM für Datenbankabstraktion
-- Thread-sichere Scheduler-Implementation
-- Robuste Fehlerbehandlung mit Retry-Mechanismen
-
-**Zentrale Implementierungsherausforderung:**
-Die TP-Link Tapo P110 Smart-Plugs verfügten über keine dokumentierte API. Nach erfolglosen Versuchen mit verschiedenen Python-Bibliotheken erwies sich **PyP100** als einzige funktionsfähige Lösung für die lokale Kommunikation ohne Cloud-Abhängigkeit.
-
-### 5.2 Smart-Plug-Integration
-
-**Technische Umsetzung:**
-
-```python
-class SmartPlugManager:
- def __init__(self, plug_configs):
- self.plugs = {id: Tapo(ip, user, pass) for id, ip in plug_configs.items()}
-
- async def control_printer(self, printer_id, action):
- plug = self.plugs[printer_id]
- return await plug.on() if action == 'start' else await plug.off()
-```
-
-**Konfiguration:**
-
-- Statische IP-Adressen: 192.168.0.100-105 für zuverlässige Kommunikation
-- Lokale Authentifizierung ohne Cloud-Service-Abhängigkeit
-- Integriertes Energiemonitoring für Verbrauchsoptimierung
-
-### 5.3 Systemintegration
-
-**Deployment-Konfiguration:**
-
-- systemd-Services für automatischen Start und Überwachung
-- SSL-Zertifikat-Management für HTTPS-Betrieb
-- Firewall-Konfiguration mit restriktiven Regeln
-- Logging und Monitoring für Systemstabilität
-
----
-
-## 6. Test und Optimierung der Datenverarbeitung und Darstellung
-
-### 6.1 Testdurchführung
-
-**Systematische Testphase:**
-
-- **Unit-Tests:** 85% Code-Coverage für kritische Komponenten
-- **Integrationstests:** Frontend-Backend-Kommunikation und IoT-Integration
-- **Systemtests:** End-to-End-Reservierungsszenarien
-- **Sicherheitstests:** Penetrationstests gegen OWASP Top 10
-
-**Performance-Optimierungen:**
-
-- Hardware-Upgrade von Raspberry Pi 4 auf Pi 5 aufgrund Performance-Anforderungen
-- Datenbankindizierung für häufige Abfragen
-- Caching-Strategien für Smart-Plug-Status
-
-### 6.2 Qualitätssicherung
-
-**Implementierte Maßnahmen:**
-
-- VirtualBox-basierte Testumgebung für entwicklungsnahe Tests
-- Mock-Objekte für Hardware-unabhängige Unit-Tests
-- Strukturiertes Logging für Debugging und Monitoring
-- Automatisierte Backup-Strategien für kritische Konfigurationen
-
----
-
-## 7. Projektabschluss
-
-### 7.1 Soll-Ist-Vergleich
-
-**Vollständig erreichte Projektziele:**
-✅ Webportal-Entwicklung (Frontend und Backend)
-✅ WLAN-Integration der Raspberry Pi-Plattform
-✅ Datenbankaufbau für Reservierungsverwaltung
-✅ Authentifizierung und Autorisierung
-✅ Test der Schnittstellen und Netzwerkverbindungen
-✅ Automatische Hardware-Steuerung via IoT-Integration
-
-**Zusätzlich realisierte Features:**
-
-- Energiemonitoring und Verbrauchsstatistiken
-- Kiosk-Modus für Werkstatt-Terminals
-- Erweiterte Sicherheitsfeatures (Rate-Limiting, CSRF-Schutz)
-
-### 7.2 Wirtschaftlichkeitsbetrachtung
-
-**Projektkosten:** Unter 600 Euro Gesamtinvestition
-**Amortisation:** Weniger als 6 Monate durch Energieeinsparungen
-**Nutzen:** Eliminierung von Reservierungskonflikten und automatisierte Betriebsoptimierung
-
-### 7.3 Fazit
-
-Das MYP-System transformiert erfolgreich die analoge 3D-Drucker-Verwaltung in ein modernes cyberphysisches System. Die Lösung demonstriert, wie durch innovative IoT-Integration auch Legacy-Hardware in moderne Systemlandschaften integriert werden kann.
-
-**Zentrale Erfolgsfaktoren:**
-
-- Pragmatische Abstraktion komplexer Hardware-Probleme über Smart-Plug-Integration
-- Robuste Softwarearchitektur mit umfassender Fehlerbehandlung
-- Konsequente Berücksichtigung von Sicherheitsanforderungen
-
-### 7.4 Projektabnahme
-
-**Abnahmedatum:** 2. Juni 2025
-**Status:** Erfolgreich abgenommen und in Produktivbetrieb überführt
-**Bewertung:** Innovative Lösungsansätze mit hoher technischer Qualität und bestätigter Praxistauglichkeit
-
----
-
-## Anlagen
-
-- A1: Systemdokumentation und Netzwerkdiagramme
-- A2: API-Dokumentation und Schnittstellenspezifikation
-- A3: Testprotokolle und Sicherheitsnachweise
-- A4: Benutzeroberfläche und Bedienungsanleitung
-- A5: Deployment-Skripte und Konfigurationsdateien
diff --git a/IHK_Projektdokumentation/Dokumentation_Ueberarbeitet.md b/IHK_Projektdokumentation/Dokumentation_Ueberarbeitet.md
deleted file mode 100644
index 6d1e5dab..00000000
--- a/IHK_Projektdokumentation/Dokumentation_Ueberarbeitet.md
+++ /dev/null
@@ -1,509 +0,0 @@
-# MYP – Manage Your Printer
-## Vernetzte 3D-Druck-Reservierungsplattform mit IoT-Anbindung und zentraler Verwaltungsoberfläche
-
-**Dokumentation der betrieblichen Projektarbeit**
-
-**Fachinformatiker für digitale Vernetzung**
-
----
-
-**Prüfungsbewerber:** Till Tomczak
-**Ausbildungsbetrieb:** Mercedes-Benz AG
-**Prüfungstermin:** Sommer 2025
-**Bearbeitungszeitraum:** 15. April – 20. Mai 2025
-**Projektumfang:** 35 Stunden
-
----
-
-## Inhaltsverzeichnis
-
-1. [Einleitung](#1-einleitung)
-2. [Projektplanung](#2-projektplanung)
-3. [Analyse und Bewertung](#3-analyse-und-bewertung)
-4. [Systemarchitektur und Schnittstellenkonzeption](#4-systemarchitektur-und-schnittstellenkonzeption)
-5. [Umsetzung](#5-umsetzung)
-6. [Test und Optimierung](#6-test-und-optimierung)
-7. [Projektabschluss](#7-projektabschluss)
-8. [Anlagen](#anlagen)
-
----
-
-## 1. Einleitung
-
-### 1.1 Ausgangssituation und Problemstellung
-
-Die Technische Berufsausbildungsstätte (TBA) der Mercedes-Benz AG am Standort Berlin verfügt über sechs 3D-Drucker verschiedener Hersteller (Prusa, Anycubic), die als wichtige Ressource für die praktische Ausbildung dienen. Diese Geräte weisen jedoch erhebliche technische Limitierungen auf: Sie verfügen weder über Netzwerkschnittstellen noch über einheitliche Steuerungsmöglichkeiten.
-
-Das bestehende Reservierungssystem basierte auf einem analogen Whiteboard, was zu systematischen Problemen führte:
-
-- **Doppelbuchungen** durch unkoordinierte Reservierungen
-- **Ineffiziente Energienutzung** durch vergessene manuelle Aktivierung/Deaktivierung
-- **Fehlende Dokumentation** der Nutzungszeiten und Verantwortlichkeiten
-- **Keine zentrale Übersicht** über Verfügbarkeiten und Auslastung
-
-Ein vorhandener Frontend-Prototyp des ehemaligen Auszubildenden Torben Haack bot eine moderne Benutzeroberfläche, verfügte jedoch über keine funktionsfähige Backend-Anbindung zur praktischen Nutzung.
-
-### 1.2 Projektziele
-
-Das Projekt "MYP – Manage Your Printer" zielt auf die **vollständige Digitalisierung des 3D-Drucker-Reservierungsprozesses** durch die Etablierung cyberphysischer Kommunikation mit den Hardwarekomponenten ab.
-
-**Primäre Ziele:**
-- Entwicklung einer webbasierten Reservierungsplattform
-- Integration automatischer Hardware-Steuerung via IoT-Komponenten
-- Implementierung einer zentralen Verwaltungsoberfläche
-- Etablierung robuster Authentifizierung und Rechteverwaltung
-
-**Sekundäre Ziele:**
-- Optimierung der Energieeffizienz durch automatisierte Steuerung
-- Bereitstellung von Nutzungsstatistiken und Monitoring
-- Gewährleistung herstellerunabhängiger Lösung
-- Einhaltung unternehmensinterner Sicherheitsrichtlinien
-
-### 1.3 Projektabgrenzung
-
-**Im Projektumfang enthalten:**
-- Webportal-Entwicklung (Frontend und Backend)
-- WLAN-Integration der Raspberry Pi-Plattform
-- Datenbankaufbau für Reservierungsverwaltung
-- IoT-Integration via Smart-Plug-Technologie
-- Authentifizierung und Autorisierung
-- Test der Schnittstellen und Netzwerkverbindungen
-
-**Ausgeschlossen aus dem Projektumfang:**
-- Direkte Kommunikation mit 3D-Druckern (fehlende Schnittstellen)
-- Integration in das unternehmensweite Intranet (Zeitrestriktionen)
-- Übertragung von Druckdaten oder Statusüberwachung der Drucker
-- Umfangreiche Hardware-Modifikationen der bestehenden Geräte
-
-### 1.4 Projektumfeld und betriebliche Schnittstellen
-
-Das Projekt wurde im Rahmen der Ausbildung zum Fachinformatiker für digitale Vernetzung in der TBA durchgeführt. Die organisatorischen Rahmenbedingungen wurden durch konzerninternen Sicherheitsrichtlinien und IT-Governance-Prozesse geprägt.
-
-**Zentrale Schnittstellen:**
-- **IT-Abteilung:** Genehmigung von Netzwerkkonfigurationen und SSL-Zertifikaten
-- **Ausbildungsleitung:** Fachliche Betreuung und Ressourcenbereitstellung
-- **Endanwender:** Auszubildende und Ausbildungspersonal der TBA
-- **Hardware-Integration:** Smart-Plug-Systeme als IoT-Gateway zu den 3D-Druckern
-
----
-
-## 2. Projektplanung
-
-### 2.1 Zeitplanung nach V-Modell
-
-Die Projektplanung folgte dem V-Modell mit agilen Elementen, unterteilt in fünf Sprints à eine Woche:
-
-| Phase | Zeitraum | Aufwand | Schwerpunkt |
-|-------|----------|---------|-------------|
-| **Sprint 1** | 15.-19. April | 6h | Projektplanung und Analyse |
-| **Sprint 2** | 22.-26. April | 12h | Analyse und Bewertung der Systemarchitektur |
-| **Sprint 3** | 29. April - 3. Mai | 6h | Entwicklung der Systemarchitektur |
-| **Sprint 4** | 6.-10. Mai | 14h | Umsetzung (Implementation) |
-| **Sprint 5** | 13.-17. Mai | 10h | Test, Optimierung und Dokumentation |
-
-### 2.2 Ressourcenplanung
-
-**Hardware-Komponenten:**
-- Raspberry Pi 5 (8GB RAM, 128GB Speicher) als zentrale Serverplattform
-- 6× TP-Link Tapo P110 Smart-Plugs für IoT-Integration
-- 19-Zoll-Serverschrank für professionelle Unterbringung
-- Netzwerk-Infrastruktur (Switch, Verkabelung)
-
-**Software-Stack:**
-- **Backend:** Python 3.11, Flask 2.3, SQLAlchemy 2.0, SQLite
-- **Frontend:** Next.js (Prototyp-Basis), TailwindCSS, JavaScript
-- **System:** Raspbian OS, systemd-Services, OpenSSL
-- **IoT-Integration:** PyP100-Bibliothek für Smart-Plug-Kommunikation
-
-**Kostenrahmen:** Unter 600 Euro (inklusive privat finanzierter Ergänzungskomponenten)
-
-### 2.3 Qualitätssicherungsplanung
-
-**Testumgebung:**
-- VirtualBox-basierte Entwicklungsumgebung für Backend-Tests
-- Hardware-in-the-Loop-Tests mit echten Smart-Plugs
-- Separate Produktionsumgebung auf Raspberry Pi
-
-**Teststrategien:**
-- **Unit-Tests:** Isolierte Tests kritischer Komponenten (85% Code-Coverage)
-- **Integrationstests:** Schnittstellen zwischen Frontend, Backend und IoT
-- **Systemtests:** End-to-End-Szenarien mit kompletten Anwendungsfällen
-- **Sicherheitstests:** Penetrationstests gegen OWASP Top 10
-
----
-
-## 3. Analyse und Bewertung
-
-### 3.1 Bewertung der vorhandenen Systemarchitektur
-
-**Ist-Zustand:**
-- Frontend-Prototyp (Next.js) ohne Backend-Anbindung
-- Isolierte 3D-Drucker ohne Netzwerkfähigkeit
-- Analoge Reservierungsverwaltung (Whiteboard)
-- Raspberry Pi 4 als ungenutzter Server
-
-**Identifizierte Defizite:**
-- Fehlende cyberphysische Integration
-- Keine zentrale Datenhaltung
-- Ineffiziente manuelle Prozesse
-- Sicherheitslücken durch analoge Verwaltung
-
-### 3.2 Bewertung der heterogenen IT-Landschaft
-
-Die IT-Infrastruktur der TBA präsentierte sich als segmentierte Umgebung mit verschiedenen VLANs und Sicherheitszonen. Die 3D-Drucker verschiedener Hersteller erforderten eine herstellerunabhängige Abstraktionsebene.
-
-**Lösungsansatz:** IoT-Integration über Smart-Plugs ermöglicht universelle Steuerung unabhängig vom Druckermodell durch Abstraktion auf Stromversorgungsebene.
-
-### 3.3 Analyse der IT-sicherheitsrelevanten Bedingungen
-
-**Sicherheitsanforderungen:**
-- Keine permanente Internetverbindung
-- Isoliertes Netzwerksegment für IoT-Komponenten
-- Selbstsignierte SSL-Zertifikate (kein Let's Encrypt möglich)
-- Compliance mit Mercedes-Benz IT-Sicherheitsrichtlinien
-
-**Implementierte Sicherheitsmaßnahmen:**
-- bcrypt-Passwort-Hashing (Cost-Faktor 12)
-- CSRF-Schutz und Session-Management
-- Rate-Limiting gegen Brute-Force-Angriffe
-- Firewall-Regeln mit Port-Beschränkung
-- Input-Validation nach OWASP-Standards
-
-### 3.4 Anforderungsgerechte Auswahl der Übertragungssysteme
-
-**Evaluierte Optionen:**
-1. **Direkte 3D-Drucker-Integration:** Nicht möglich (fehlende Schnittstellen)
-2. **Cloud-basierte Lösung:** Ausgeschlossen (Offline-Anforderung)
-3. **Smart-Plug-Integration:** Gewählte Lösung
-
-**Technische Herausforderung:** TP-Link Tapo P110 verfügen über keine dokumentierte API. Reverse-Engineering mittels Wireshark-Protokollanalyse war erforderlich.
-
-**Lösung:** PyP100-Python-Bibliothek implementiert das proprietäre Kommunikationsprotokoll und ermöglicht lokale Steuerung ohne Cloud-Abhängigkeit.
-
----
-
-## 4. Systemarchitektur und Schnittstellenkonzeption
-
-### 4.1 Gesamtsystemarchitektur
-
-```
-┌─────────────────┐ HTTPS ┌─────────────────┐ WLAN ┌─────────────────┐
-│ Web-Client │◄────────────►│ Raspberry Pi │◄───────────►│ Smart-Plugs │
-│ (Browser) │ │ MYP-Server │ │ (IoT-Layer) │
-└─────────────────┘ └─────────────────┘ └─────────────────┘
- │ │
- ┌────▼────┐ ┌────▼────┐
- │ SQLite │ │3D-Drucker│
- │Database │ │(6 Geräte)│
- └─────────┘ └─────────┘
-```
-
-### 4.2 Technische Systemarchitektur
-
-**Schichtenmodell:**
-1. **Präsentationsschicht:** Web-Frontend (HTTPS/Port 443)
-2. **Anwendungsschicht:** Flask-Backend mit REST-API
-3. **Geschäftslogikschicht:** Reservierungsmanagement, Scheduler
-4. **Datenhaltungsschicht:** SQLite-Datenbank
-5. **IoT-Integrationsschicht:** Smart-Plug-Kommunikation
-6. **Hardwareschicht:** 3D-Drucker (stromgesteuert)
-
-### 4.3 Schnittstellenkonzeption
-
-**REST-API-Design:**
-- **Authentifizierung:** `/api/auth/` (Login, Logout, Session-Management)
-- **Benutzerverwaltung:** `/api/users/` (CRUD-Operationen)
-- **Druckerverwaltung:** `/api/printers/` (Status, Konfiguration)
-- **Reservierungen:** `/api/jobs/` (Buchung, Verwaltung, Scheduling)
-- **Monitoring:** `/api/monitoring/` (Energieverbrauch, Statistiken)
-
-**IoT-Schnittstelle:**
-- **Protokoll:** HTTP/TCP über WLAN
-- **Authentifizierung:** Session-basiert mit dynamischen Tokens
-- **Operationen:** Power On/Off, Status-Abfrage, Energiemessung
-- **Fehlerbehandlung:** Retry-Mechanismen, Timeout-Handling
-
-### 4.4 Datenmodell
-
-**Kernentitäten:**
-- `User`: Benutzerkonten mit Rollen und Berechtigungen
-- `Printer`: 3D-Drucker-Definitionen mit Smart-Plug-Zuordnung
-- `Job`: Reservierungen mit Zeitfenstern und Status
-- `SmartPlug`: IoT-Geräte-Konfiguration und Zustandsverwaltung
-- `EnergyLog`: Energieverbrauchsdaten für Monitoring
-
----
-
-## 5. Umsetzung
-
-### 5.1 Implementierung der Backend-Infrastruktur
-
-**Flask-Anwendungsstruktur:**
-```python
-# Modulare Blueprint-Architektur
-├── app.py # Hauptanwendung mit HTTPS-Konfiguration
-├── models.py # SQLAlchemy-Datenmodelle
-├── blueprints/ # Funktionale Module
-│ ├── auth.py # Authentifizierung
-│ ├── users.py # Benutzerverwaltung
-│ ├── printers.py # Druckerverwaltung
-│ └── jobs.py # Reservierungslogik
-└── utils/ # Hilfsfunktionen
- ├── scheduler.py # Zeitgesteuerte Operationen
- └── smart_plug.py # IoT-Integration
-```
-
-**Zentrale Implementierungsherausforderungen:**
-
-1. **Smart-Plug-Integration:** PyP100-Bibliothek erwies sich als einzige funktionsfähige Lösung nach mehreren gescheiterten Ansätzen
-
-2. **Thread-sichere Scheduler-Implementation:**
-```python
-class SmartPlugScheduler:
- def __init__(self):
- self.scheduler = BackgroundScheduler()
- self.lock = threading.Lock()
-
- def schedule_job(self, job_id, start_time, duration):
- with self.lock:
- # Thread-sichere Jobplanung
- self.scheduler.add_job(...)
-```
-
-3. **Robuste Fehlerbehandlung:**
-```python
-@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
-def toggle_smart_plug(plug_ip, state):
- try:
- plug = Tapo(plug_ip, username, password)
- return plug.on() if state else plug.off()
- except Exception as e:
- logger.error(f"Smart-Plug-Fehler: {e}")
- raise
-```
-
-### 5.2 IoT-Integration und Hardware-Steuerung
-
-**Smart-Plug-Konfiguration:**
-- Statische IP-Adressen: 192.168.0.100-105
-- Lokale Authentifizierung ohne Cloud-Service
-- Energiemonitoring für Verbrauchsoptimierung
-
-**Kommunikationsprotokoll:**
-```python
-# Vereinfachte Smart-Plug-Abstraktion
-class SmartPlugManager:
- def __init__(self, plug_configs):
- self.plugs = {id: Tapo(ip, user, pass) for id, ip in plug_configs.items()}
-
- async def control_printer(self, printer_id, action):
- plug = self.plugs[printer_id]
- return await plug.on() if action == 'start' else await plug.off()
-```
-
-### 5.3 Sicherheitsimplementierung
-
-**Authentifizierung und Autorisierung:**
-```python
-# bcrypt-Passwort-Hashing
-password_hash = bcrypt.generate_password_hash(password, rounds=12)
-
-# Session-Management mit Flask-Login
-@login_required
-def protected_endpoint():
- return jsonify({"user_id": current_user.id})
-
-# CSRF-Schutz
-csrf.init_app(app)
-```
-
-**Rate-Limiting:**
-```python
-# Brute-Force-Schutz
-@limiter.limit("5 per minute")
-@app.route('/api/auth/login', methods=['POST'])
-def login():
- # Login-Logik mit Begrenzung
-```
-
-### 5.4 Systemkonfiguration und Deployment
-
-**Systemd-Service-Konfiguration:**
-```ini
-[Unit]
-Description=MYP HTTPS Backend Service
-After=network.target
-
-[Service]
-Type=simple
-User=myp
-WorkingDirectory=/opt/myp
-ExecStart=/usr/bin/python3 app.py --production
-Restart=always
-RestartSec=10
-
-[Install]
-WantedBy=multi-user.target
-```
-
-**SSL-Zertifikat-Management:**
-```bash
-# Selbstsignierte Zertifikate für Offline-Betrieb
-openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
-```
-
----
-
-## 6. Test und Optimierung
-
-### 6.1 Testdurchführung und -ergebnisse
-
-**Unit-Tests (85% Code-Coverage):**
-- Datenbankoperationen: Alle CRUD-Operationen erfolgreich
-- API-Endpunkte: Validierung und Fehlerbehandlung getestet
-- Smart-Plug-Integration: Mock-Tests für Hardware-Abstraktion
-
-**Integrationstests:**
-- Frontend-Backend-Kommunikation: HTTPS/REST-API vollständig funktional
-- IoT-Hardware-Integration: Alle 6 Smart-Plugs erfolgreich ansteuerbar
-- Scheduler-Funktionalität: Zeitgesteuerte Operationen präzise ausgeführt
-
-**Systemtests:**
-- End-to-End-Reservierungsszenarien: Vollständig automatisiert
-- Gleichzeitige Benutzerzugriffe: Bis zu 10 parallele Sessions stabil
-- Energiemonitoring: Verbrauchsdaten korrekt erfasst und visualisiert
-
-**Performance-Optimierungen:**
-- Hardware-Upgrade von Raspberry Pi 4 auf Pi 5 (Speicher: 4GB → 8GB)
-- Datenbankindizierung für häufige Abfragen
-- Caching-Strategien für Smart-Plug-Status
-
-### 6.2 Sicherheitstests
-
-**Penetrationstests:**
-- SQL-Injection-Versuche: Erfolgreich abgewehrt durch Parameterisierung
-- XSS-Angriffe: Input-Sanitization funktional
-- CSRF-Attacken: Token-basierter Schutz wirksam
-- Brute-Force-Tests: Rate-Limiting nach 5 Versuchen aktiv
-
-### 6.3 Systemstabilität und Monitoring
-
-**Monitoring-Implementation:**
-```python
-# Systemüberwachung mit Logging
-import logging
-from logging.handlers import RotatingFileHandler
-
-# Strukturiertes Logging für Debugging
-logging.basicConfig(
- handlers=[RotatingFileHandler('app.log', maxBytes=10000000, backupCount=10)],
- level=logging.INFO,
- format='%(asctime)s %(levelname)s %(name)s %(message)s'
-)
-```
-
-**Erkannte und behobene Probleme:**
-- Memory-Leaks bei lang laufenden Smart-Plug-Operationen
-- Race Conditions im Scheduler bei simultanen Zugriffen
-- SSL-Zertifikat-Probleme durch inkorrekte SAN-Konfiguration
-
----
-
-## 7. Projektabschluss
-
-### 7.1 Soll-Ist-Vergleich
-
-**Vollständig erreichte Ziele:**
-✅ Webbasierte Reservierungsplattform implementiert
-✅ Automatische Hardware-Steuerung via IoT realisiert
-✅ Zentrale Verwaltungsoberfläche bereitgestellt
-✅ Robuste Authentifizierung und Rechteverwaltung
-✅ WLAN-Integration der Raspberry Pi-Plattform
-✅ Datenbankaufbau für Reservierungsverwaltung
-✅ Test der Schnittstellen und Netzwerkverbindungen
-
-**Zusätzlich realisierte Features:**
-🔋 Energiemonitoring und Verbrauchsoptimierung
-📊 Nutzungsstatistiken und Dashboard
-🔒 Erweiterte Sicherheitsfeatures (Rate-Limiting, CSRF-Schutz)
-🏗️ Kiosk-Modus für Werkstatt-Terminals
-
-**Abweichungen vom ursprünglichen Plan:**
-- Konsolidierung auf einen statt zwei Raspberry Pis (Kostenoptimierung)
-- Hardware-Upgrade Pi 4 → Pi 5 (Performance-Anforderungen)
-- Verschiebung der Intranet-Integration (Zeitrestriktionen)
-
-### 7.2 Wirtschaftlichkeitsbetrachtung
-
-**Investitionskosten:** < 600 Euro
-**Amortisation:** < 6 Monate durch Energieeinsparungen
-**ROI:** Eliminierung von Reservierungskonflikten und automatisierte Abschaltung
-
-### 7.3 Nachhaltigkeit und Erweiterbarkeit
-
-**Modulare Systemarchitektur** ermöglicht einfache Erweiterungen:
-- Integration weiterer Gerätetypen (Lasercutter, CNC-Fräsen)
-- Active Directory-Anbindung für Enterprise-Integration
-- Machine Learning für Auslastungsprognosen
-
-### 7.4 Projektergebnisse und Erkenntnisse
-
-Das MYP-System transformiert erfolgreich die analoge 3D-Drucker-Verwaltung in ein modernes cyberphysisches System. Die Lösung demonstriert, wie durch kreative IoT-Integration auch legacy Hardware in moderne Systemlandschaften integriert werden kann.
-
-**Zentrale Erfolgsfaktoren:**
-- Pragmatische Abstraktion komplexer Hardware-Probleme
-- Robuste Softwarearchitektur mit umfassender Fehlerbehandlung
-- Berücksichtigung von Sicherheitsanforderungen von Projektbeginn an
-
-**Lessons Learned:**
-- Hardware-Kompatibilitätsprüfung vor Projektstart essentiell
-- Backup-Strategien für kritische Konfigurationen unerlässlich
-- Agile Anpassungsfähigkeit bei unvorhergesehenen Problemen
-
-### 7.5 Formale Projektabnahme
-
-**Abnahmedatum:** 2. Juni 2025
-**Abnehmer:** Ausbildungsleitung TBA Mercedes-Benz AG
-**Status:** Erfolgreich abgenommen und in Produktivbetrieb überführt
-
-**Bewertung der Ausbildungsleitung:**
-- Innovative Lösungsansätze für komplexe Integration
-- Hohe technische Qualität der Implementation
-- Praxistauglichkeit und Benutzerakzeptanz bestätigt
-
----
-
-## Anlagen
-
-### A1. Systemdokumentation
-- Netzwerkdiagramme und Systemarchitektur
-- API-Dokumentation (REST-Endpunkte)
-- Datenbankschema (ER-Diagramme)
-
-### A2. Technische Dokumentation
-- Installationsanleitung und Setup-Skripte
-- Konfigurationsdateien (systemd, SSL, Firewall)
-- Troubleshooting-Guide
-
-### A3. Testdokumentation
-- Testprotokolle (Unit-, Integration-, Systemtests)
-- Sicherheitstests (Penetrationstests)
-- Performance-Benchmarks
-
-### A4. Benutzeroberfläche
-- Screenshots der Weboberfläche
-- Benutzerhandbuch
-- Admin-Dokumentation
-
-### A5. Projektmanagement
-- Zeiterfassung nach Projektphasen
-- Kostenaufstellung
-- Übergabeprotokoll
-
----
-
-**Projektstatistiken:**
-- **Codezeilen:** 9.000+ (Python/JavaScript)
-- **API-Endpunkte:** 100+
-- **Testabdeckung:** 85%
-- **Systemlaufzeit:** 24/7 produktiv seit Inbetriebnahme
\ No newline at end of file
diff --git a/IHK_Projektdokumentation/Glossar_Technische_Begriffe.md b/IHK_Projektdokumentation/Glossar_Technische_Begriffe.md
deleted file mode 100644
index 951e0a62..00000000
--- a/IHK_Projektdokumentation/Glossar_Technische_Begriffe.md
+++ /dev/null
@@ -1,218 +0,0 @@
-# Glossar technischer Begriffe
-## MYP – Manage Your Printer Projekt
-
----
-
-### A
-
-**API (Application Programming Interface)**
-Programmierschnittstelle, die es verschiedenen Softwarekomponenten ermöglicht, miteinander zu kommunizieren. Definiert Regeln und Protokolle für den Datenaustausch zwischen Anwendungen.
-
-**Authentifizierung**
-Verfahren zur Überprüfung der Identität eines Benutzers oder Systems. Erfolgt typischerweise durch Benutzername/Passwort-Kombinationen oder andere Credentials.
-
-**Autorisierung**
-Prozess der Zugriffsrechtevergabe nach erfolgreicher Authentifizierung. Bestimmt, welche Ressourcen ein authentifizierter Benutzer verwenden darf.
-
----
-
-### B
-
-**bcrypt**
-Kryptographische Hash-Funktion speziell für Passwort-Hashing. Verwendet einen konfigurierbaren "Cost-Faktor" zur Verlangsamung von Brute-Force-Angriffen.
-
-**Blueprint (Flask)**
-Organisationsstruktur in Flask zur modularen Gruppierung verwandter Views, Templates und statischer Dateien. Ermöglicht strukturierte Anwendungsarchitektur.
-
-**Brute-Force-Angriff**
-Angriffsmethode, die systematisch alle möglichen Kombinationen von Passwörtern oder Schlüsseln ausprobiert, um unbefugten Zugang zu erlangen.
-
----
-
-### C
-
-**Code-Coverage**
-Testmetrik, die angibt, welcher Prozentsatz des Quellcodes durch automatisierte Tests abgedeckt wird. 85% Coverage bedeutet, dass 85% des Codes getestet wurde.
-
-**CORS (Cross-Origin Resource Sharing)**
-Sicherheitsmechanismus, der Webseiten den kontrollierten Zugriff auf Ressourcen anderer Domains ermöglicht. Verhindert unerwünschte Cross-Site-Requests.
-
-**CSRF (Cross-Site Request Forgery)**
-Angriffsmethode, bei der ungewollte Aktionen im Namen eines authentifizierten Benutzers ausgeführt werden. Schutz erfolgt durch CSRF-Tokens.
-
-**Cyberphysische Systeme**
-Integrierte Systeme aus Software, Hardware und Netzwerken, die physische Prozesse überwachen und steuern. Verbinden digitale und physische Welt.
-
----
-
-### F
-
-**Flask**
-Leichtgewichtiges Python-Web-Framework für die Entwicklung von Webanwendungen. Bietet grundlegende Funktionen und ist durch Extensions erweiterbar.
-
-**FQDN (Fully Qualified Domain Name)**
-Vollständiger Domainname, der die exakte Position eines Hosts im DNS-Namensraum angibt (z.B. server.beispiel.com).
-
----
-
-### I
-
-**IoT (Internet of Things)**
-Netzwerk physischer Geräte mit eingebetteter Software, Sensoren und Netzwerkverbindung zur Datensammlung und -austausch.
-
-**IP-Spoofing**
-Angriffstechnik, bei der die Absender-IP-Adresse in Netzwerkpaketen gefälscht wird, um die wahre Identität zu verschleiern.
-
----
-
-### J
-
-**JSON (JavaScript Object Notation)**
-Leichtgewichtiges, textbasiertes Datenformat für den Austausch zwischen Anwendungen. Verwendet schlüssel-wert-basierte Struktur.
-
----
-
-### M
-
-**Mock-Objekte**
-Simulierte Objekte in Unit-Tests, die das Verhalten echter Komponenten nachahmen. Ermöglichen isolierte Tests ohne externe Abhängigkeiten.
-
----
-
-### O
-
-**ORM (Object-Relational Mapping)**
-Programmierverfahren zur Abbildung objektorientierter Datenstrukturen auf relationale Datenbankstrukturen. SQLAlchemy ist ein Python-ORM.
-
-**OWASP Top 10**
-Jährlich aktualisierte Liste der kritischsten Websicherheitsrisiken, herausgegeben von der Open Web Application Security Project (OWASP).
-
----
-
-### P
-
-**Penetrationstest**
-Systematische Sicherheitsüberprüfung von IT-Systemen durch simulierte Angriffe zur Identifikation von Schwachstellen.
-
-**PyP100**
-Python-Bibliothek zur Steuerung von TP-Link Tapo Smart-Plugs über lokale Netzwerkverbindung ohne Cloud-Abhängigkeit.
-
-**Python**
-Interpretierte, höhere Programmiersprache mit Fokus auf Lesbarkeit und einfache Syntax. Weit verbreitet für Web-Entwicklung und Automatisierung.
-
----
-
-### R
-
-**Race Condition**
-Fehlerhafte Systemsituation, bei der das Ergebnis von der unvorhersagbaren Reihenfolge paralleler Operationen abhängt.
-
-**Rate-Limiting**
-Sicherheitsmechanismus zur Begrenzung der Anzahl von Anfragen pro Zeiteinheit, um DoS-Angriffe und Ressourcenüberlastung zu verhindern.
-
-**Raspberry Pi**
-Einplatinencomputer mit ARM-Prozessor, entwickelt für Bildungszwecke und IoT-Projekte. Läuft unter Linux-basierten Betriebssystemen.
-
-**REST (Representational State Transfer)**
-Architekturstil für verteilte Hypermedia-Systeme. REST-APIs verwenden HTTP-Methoden (GET, POST, PUT, DELETE) für standardisierte Kommunikation.
-
-**Retry-Mechanismus**
-Programmierverfahren zur automatischen Wiederholung fehlgeschlagener Operationen mit konfigurierbaren Wartezeiten und Maximalversuchen.
-
----
-
-### S
-
-**Session-Management**
-Verwaltung von Benutzersitzungen in Webanwendungen zur Aufrechterhaltung des Anmeldestatus zwischen HTTP-Requests.
-
-**Smart-Plug**
-Netzwerkfähige Steckdose mit WLAN-Verbindung, die ferngesteuert ein-/ausgeschaltet werden kann. Oft mit Energiemessungs-Features.
-
-**SQLAlchemy**
-Python-SQL-Toolkit und Object-Relational Mapping (ORM) Bibliothek für Datenbankzugriff mit objektorientierten Programmiermethoden.
-
-**SQLite**
-Serverlose, dateibasierte SQL-Datenbank-Engine. Ideal für eingebettete Systeme und Anwendungen mit geringen bis mittleren Datenmengen.
-
-**SSL/TLS (Secure Sockets Layer/Transport Layer Security)**
-Kryptographische Protokolle zur sicheren Übertragung von Daten über Netzwerke. TLS ist der Nachfolger von SSL.
-
-**systemd**
-System- und Service-Manager für Linux-Betriebssysteme. Verwaltet Systemdienste, Bootvorgang und Ressourcen.
-
----
-
-### T
-
-**TAPO**
-Smart-Home-Produktlinie der Firma TP-Link, umfasst WLAN-fähige Steckdosen, Kameras und andere IoT-Geräte.
-
-**Thread-Safety**
-Eigenschaft von Code, der sicher in multi-threaded Umgebungen ausgeführt werden kann ohne Race Conditions oder Datenkonflikte.
-
-**TP-Link**
-Chinesischer Hersteller von Netzwerk- und Smart-Home-Produkten. Bekannt für Router, Switches und IoT-Geräte.
-
----
-
-### U
-
-**Unit-Test**
-Automatisierter Test, der einzelne Komponenten (Units) einer Software isoliert auf korrekte Funktionsweise prüft.
-
----
-
-### V
-
-**V-Modell**
-Vorgehensmodell der Softwareentwicklung mit sequenziellen Entwicklungsphasen und entsprechenden Testebenen. Jeder Entwicklungsphase ist eine Testphase zugeordnet.
-
-**VirtualBox**
-Open-Source-Virtualisierungssoftware zur Ausführung mehrerer Betriebssysteme auf einem physischen Rechner in isolierten virtuellen Maschinen.
-
-**VLAN (Virtual Local Area Network)**
-Logische Segmentierung physischer Netzwerke zur Trennung von Datenverkehr und Erhöhung der Sicherheit.
-
----
-
-### W
-
-**Wireshark**
-Open-Source-Netzwerkprotokoll-Analyzer zur Aufzeichnung und Analyse von Netzwerkverkehr. Ermöglicht detaillierte Paketinspektion für Debugging und Sicherheitsanalyse.
-
-**WSGI (Web Server Gateway Interface)**
-Python-Standard für die Schnittstelle zwischen Webservern und Web-Frameworks. Gunicorn ist ein WSGI-Server.
-
----
-
-### Z
-
-**Zenmap**
-Grafische Benutzeroberfläche für Nmap (Network Mapper). Tool für Netzwerk-Discovery, Port-Scanning und Sicherheitsauditierung.
-
----
-
-## Abkürzungsverzeichnis
-
-| Abkürzung | Bedeutung |
-|-----------|-----------|
-| **API** | Application Programming Interface |
-| **CORS** | Cross-Origin Resource Sharing |
-| **CSRF** | Cross-Site Request Forgery |
-| **FQDN** | Fully Qualified Domain Name |
-| **HTTP** | Hypertext Transfer Protocol |
-| **HTTPS** | HTTP Secure |
-| **IoT** | Internet of Things |
-| **JSON** | JavaScript Object Notation |
-| **ORM** | Object-Relational Mapping |
-| **REST** | Representational State Transfer |
-| **SSL** | Secure Sockets Layer |
-| **TLS** | Transport Layer Security |
-| **VLAN** | Virtual Local Area Network |
-| **WSGI** | Web Server Gateway Interface |
-
----
-
-*Glossar erstellt für: IHK-Projektdokumentation "MYP – Manage Your Printer"*
-*Stand: Januar 2025*
\ No newline at end of file
diff --git a/IHK_Projektdokumentation/MYP_Projektdokumentation_Final.md b/IHK_Projektdokumentation/MYP_Projektdokumentation_Final.md
new file mode 100644
index 00000000..3f8071c3
--- /dev/null
+++ b/IHK_Projektdokumentation/MYP_Projektdokumentation_Final.md
@@ -0,0 +1,376 @@
+# MYP – Manage Your Printer
+## Vernetzte 3D-Druck-Reservierungsplattform mit IoT-Anbindung und zentraler Verwaltungsoberfläche
+
+**Dokumentation der betrieblichen Projektarbeit**
+
+**Fachinformatiker für digitale Vernetzung**
+
+---
+
+**Prüfungsbewerber:** Till Tomczak
+**Ausbildungsbetrieb:** Mercedes-Benz AG
+**Prüfungstermin:** Sommer 2025
+**Bearbeitungszeitraum:** 15. April – 20. Mai 2025
+**Projektumfang:** 35 Stunden
+
+---
+
+## Inhaltsverzeichnis
+
+1. [Einleitung](#1-einleitung)
+ 1.1 [Ausgangssituation und Problemstellung](#11-ausgangssituation-und-problemstellung)
+ 1.2 [Projektziele](#12-projektziele)
+ 1.3 [Projektabgrenzung](#13-projektabgrenzung)
+ 1.4 [Projektumfeld und betriebliche Schnittstellen](#14-projektumfeld-und-betriebliche-schnittstellen)
+2. [Projektplanung](#2-projektplanung)
+ 2.1 [Zeitplanung nach V-Modell](#21-zeitplanung-nach-v-modell)
+ 2.2 [Ressourcenplanung](#22-ressourcenplanung)
+ 2.3 [Qualitätssicherungsplanung](#23-qualitätssicherungsplanung)
+3. [Analyse und Bewertung](#3-analyse-und-bewertung)
+ 3.1 [Bewertung der vorhandenen Systemarchitektur](#31-bewertung-der-vorhandenen-systemarchitektur)
+ 3.2 [Bewertung der heterogenen IT-Landschaft](#32-bewertung-der-heterogenen-it-landschaft)
+ 3.3 [Analyse der IT-sicherheitsrelevanten Bedingungen](#33-analyse-der-it-sicherheitsrelevanten-bedingungen)
+ 3.4 [Anforderungsgerechte Auswahl der Übertragungssysteme](#34-anforderungsgerechte-auswahl-der-übertragungssysteme)
+4. [Systemarchitektur und Schnittstellenkonzeption](#4-systemarchitektur-und-schnittstellenkonzeption)
+ 4.1 [Gesamtsystemarchitektur](#41-gesamtsystemarchitektur)
+ 4.2 [Technische Systemarchitektur](#42-technische-systemarchitektur)
+ 4.3 [Schnittstellenkonzeption](#43-schnittstellenkonzeption)
+ 4.4 [Datenmodell](#44-datenmodell)
+5. [Umsetzung](#5-umsetzung)
+ 5.1 [Implementierung der Backend-Infrastruktur](#51-implementierung-der-backend-infrastruktur)
+ 5.2 [IoT-Integration und Hardware-Steuerung](#52-iot-integration-und-hardware-steuerung)
+ 5.3 [Sicherheitsimplementierung](#53-sicherheitsimplementierung)
+ 5.4 [Systemkonfiguration und Deployment](#54-systemkonfiguration-und-deployment)
+6. [Test und Optimierung](#6-test-und-optimierung)
+ 6.1 [Testdurchführung und -ergebnisse](#61-testdurchführung-und-ergebnisse)
+ 6.2 [Sicherheitstests](#62-sicherheitstests)
+ 6.3 [Systemstabilität und Monitoring](#63-systemstabilität-und-monitoring)
+7. [Projektabschluss](#7-projektabschluss)
+ 7.1 [Soll-Ist-Vergleich](#71-soll-ist-vergleich)
+ 7.2 [Projektergebnisse und Erkenntnisse](#72-projektergebnisse-und-erkenntnisse)
+ 7.3 [Optimierungsmöglichkeiten](#73-optimierungsmöglichkeiten)
+ 7.4 [Formale Projektabnahme](#74-formale-projektabnahme)
+8. [Anlagen](#anlagen)
+9. [Glossar](#glossar)
+
+---
+
+## 1. Einleitung
+
+### 1.1 Ausgangssituation und Problemstellung
+
+Die Technische Berufsausbildungsstätte (TBA) der Mercedes-Benz AG am Standort Berlin verfügt über sechs 3D-Drucker verschiedener Hersteller (Prusa, Anycubic), die als wichtige Ressource für die praktische Ausbildung dienen. Diese Geräte weisen jedoch erhebliche technische Limitierungen auf, da sie weder über Netzwerkschnittstellen noch über einheitliche Steuerungsmöglichkeiten verfügen.
+
+Das bestehende Reservierungssystem basierte auf einem analogen Whiteboard, was zu systematischen Problemen führte. Doppelbuchungen traten regelmäßig auf, wenn mehrere Nutzer zeitgleich Reservierungen vornahmen. Die manuelle Aktivierung und Deaktivierung der Geräte wurde häufig versäumt, was zu unnötigem Energieverbrauch und erhöhtem Verschleiß führte. Eine verlässliche Dokumentation der tatsächlichen Nutzungszeiten existierte nicht, wodurch weder aussagekräftige Betätigungs- und Verantwortungszuordnung, noch eine verursachungsgerechte Kostenzuordnung möglich waren.
+
+Ein vorhandener Frontend-Prototyp des ehemaligen Auszubildenden Torben Haack bot eine moderne Benutzeroberfläche, verfügte jedoch über keine funktionsfähige Backend-Anbindung zur praktischen Nutzung. Diese Ausgangslage bot mir die Gelegenheit, im Rahmen meiner Projektarbeit eine vollständige Lösung zu entwickeln.
+
+### 1.2 Projektziele
+
+Das Projekt "MYP – Manage Your Printer" zielt auf die vollständige Digitalisierung des 3D-Drucker-Reservierungsprozesses durch die Etablierung cyberphysischer Kommunikation mit den relevanten Hardwarekomponenten ab.
+
+Die primären Ziele umfassen die Entwicklung einer webbasierten Reservierungsplattform, die Integration automatischer Hardware-Steuerung via IoT-Komponenten, die Implementierung einer zentralen Verwaltungsoberfläche sowie die Etablierung robuster Authentifizierung und Rechteverwaltung. Als sekundäre Ziele wurden die Optimierung der Energieeffizienz durch automatisierte Steuerung, die Bereitstellung von Nutzungsstatistiken und Monitoring, die Gewährleistung einer herstellerunabhängigen Lösung sowie die Einhaltung unternehmensinterner Sicherheitsrichtlinien definiert.
+
+### 1.3 Projektabgrenzung
+
+Der Projektumfang wurde pragmatisch auf die praktische Umsetzung einer funktionsfähigen Lösung fokussiert. Im Projektumfang enthalten sind die Webportal-Entwicklung (Frontend und Backend), die WLAN-Integration der Raspberry Pi-Plattform, der Datenbankaufbau für Reservierungsverwaltung, die IoT-Integration via Smart-Plug-Technologie, Authentifizierung und Autorisierung sowie der Test der Schnittstellen und Netzwerkverbindungen.
+
+Ausgeschlossen aus dem Projektumfang wurden die direkte Kommunikation mit 3D-Druckern (aufgrund fehlender Schnittstellen), die Integration in das unternehmensweite Intranet (Zeitrestriktionen), die Übertragung von Druckdaten oder Statusüberwachung der Drucker sowie umfangreiche Hardware-Modifikationen der bestehenden Geräte.
+
+Die Integration in das unternehmensweite Intranet war ursprünglich fest eingeplant. Zur Projektmitte hatte ich die bereits genehmigten SSL-Zertifikate des Haack'schen Prototyps durch einen unglücklichen Neuinstallationsprozess unwiederbringlich gelöscht. Die Intranetanbindung blieb somit ausstehend und konnte aufgrund der Konzerngröße und der damit einhergehenden Genehmigungsprozesse nicht mehr rechtzeitig realisiert werden.
+
+### 1.4 Projektumfeld und betriebliche Schnittstellen
+
+Das Projekt wurde im Rahmen der Ausbildung zum Fachinformatiker für digitale Vernetzung in der TBA durchgeführt. Die organisatorischen Rahmenbedingungen wurden durch konzerninternen Sicherheitsrichtlinien und IT-Governance-Prozesse geprägt.
+
+Die zentralen Schnittstellen umfassten die IT-Abteilung für die Genehmigung von Netzwerkkonfigurationen und SSL-Zertifikaten, die Ausbildungsleitung für fachliche Betreuung und Ressourcenbereitstellung, die Endanwender in Form von Auszubildenden und Ausbildungspersonal der TBA sowie die Hardware-Integration über Smart-Plug-Systeme als IoT-Gateway zu den 3D-Druckern.
+
+---
+
+## 2. Projektplanung
+
+### 2.1 Zeitplanung nach V-Modell
+
+Die Projektplanung folgte dem V-Modell mit agilen Elementen, unterteilt in fünf Sprints à eine Woche. Der Gesamtzeitraum erstreckte sich vom 15. April bis 20. Mai 2025 mit einem Projektumfang von 35 Stunden.
+
+Sprint 1 (15.-19. April, 6 Stunden) widmete sich der Projektplanung und Analyse. Am Anfang dieses Sprints erkundigte sich Martin kurz bei mir über den Status und ich passte die weitere Planung entsprechend an. Die Analyse des vorgefundenen Prototyps und die Definition der Erweiterungspunkte standen im Fokus.
+
+Sprint 2 (22.-26. April, 12 Stunden) konzentrierte sich auf die Analyse und Bewertung der Systemarchitektur. Martin erkundigte sich erneut zu Sprintbeginn nach dem Fortschritt. Die Beantragung der erforderlichen Administratorrechte erwies sich als zeitaufwändiger als erwartet, was zu einem Zeitverzug von 4 Stunden führte.
+
+Sprint 3 (29. April - 3. Mai, 6 Stunden) beinhaltete die Entwicklung der Systemarchitektur. Die regelmäßige Abstimmung mit Martin half, die Prioritäten anzupassen. Der Verlust der SSL-Zertifikate durch einen Neuinstallationsprozess verursachte einen zusätzlichen Zeitverzug von 6 Stunden.
+
+Sprint 4 (6.-10. Mai, 14 Stunden) war für die Umsetzung (Implementation) vorgesehen. Nach Martins Statusabfrage zu Sprintbeginn wurde die Planung erneut angepasst. In intensiven Coding-Sessions wurde die Grundfunktionalität implementiert.
+
+Sprint 5 (13.-17. Mai, 10 Stunden) diente Test, Optimierung und Dokumentation. Die finale Abstimmung mit Martin bestätigte den Projektfortschritt trotz der akkumulierten Zeitverzüge von insgesamt 10 Stunden.
+
+### 2.2 Ressourcenplanung
+
+Die Hardware-Komponenten umfassten einen Raspberry Pi 5 (8GB RAM, 128GB Speicher) als zentrale Serverplattform, nachdem sich der ursprünglich vorgesehene Raspberry Pi 4 als unterdimensioniert erwiesen hatte. Sechs TP-Link Tapo P110 Smart-Plugs bildeten das Herzstück der IoT-Integration. Ein 19-Zoll-Serverschrank wurde für die professionelle Unterbringung beschafft, ergänzt durch privat finanzierte Komponenten wie Lüftereinheiten und Kabelmanagement-Systeme.
+
+Der Software-Stack basierte vollständig auf Open-Source-Technologien. Das Backend wurde mit Python 3.11, Flask 2.3, SQLAlchemy 2.0 und SQLite implementiert. Für das Frontend wurde nach dem Scheitern der Next.js-Integration eine eigene Lösung mit HTML/CSS/JavaScript als Notlösung entwickelt, wobei für die Interface-Entwicklung KI-Unterstützung verwendet wurde. Das System läuft auf Raspbian OS mit systemd-Services und OpenSSL. Die IoT-Integration erfolgte über die PyP100-Bibliothek für Smart-Plug-Kommunikation.
+
+Die Gesamtkosten beliefen sich auf weniger als 200 Euro, deutlich unter der ursprünglichen Kalkulation von 600 Euro. Die Kostenersparnis resultierte aus der Nutzung vorhandener Hardware-Komponenten und der Eigenfinanzierung ergänzender Komponenten.
+
+### 2.3 Qualitätssicherungsplanung
+
+Das Qualitätssicherungskonzept orientierte sich am V-Modell. Für jede Entwicklungsphase wurden korrespondierende Testaktivitäten definiert. Eine VirtualBox-basierte Entwicklungsumgebung ermöglichte Backend-Tests ohne Gefährdung der Produktivumgebung. Hardware-in-the-Loop-Tests mit echten Smart-Plugs gewährleisteten realitätsnahe Testbedingungen. Die separate Produktionsumgebung auf dem Raspberry Pi diente finalen Systemtests.
+
+Die Teststrategien umfassten Unit-Tests für isolierte Tests kritischer Komponenten mit einer Codeabdeckung von 85%, Integrationstests für Schnittstellen zwischen Frontend, Backend und IoT sowie Systemtests für End-to-End-Szenarien mit kompletten Anwendungsfällen. Sicherheitstests fokussierten sich auf grundlegende Schwachstellen ohne explizite Referenz auf externe Standards.
+
+---
+
+## 3. Analyse und Bewertung
+
+### 3.1 Bewertung der vorhandenen Systemarchitektur
+
+Der Ist-Zustand präsentierte sich als fragmentierte Landschaft. Ein Frontend-Prototyp (Next.js) existierte ohne Backend-Anbindung, die 3D-Drucker operierten isoliert ohne Netzwerkfähigkeit, die Reservierungsverwaltung erfolgte analog über ein Whiteboard, und ein Raspberry Pi 4 stand als ungenutzter Server zur Verfügung.
+
+Die identifizierten Defizite umfassten die fehlende cyberphysische Integration, keine zentrale Datenhaltung, ineffiziente manuelle Prozesse sowie Sicherheitslücken durch die analoge Verwaltung. Diese Analyse bildete die Grundlage für die Entwicklung einer integrierten Lösung.
+
+### 3.2 Bewertung der heterogenen IT-Landschaft
+
+Die IT-Infrastruktur der TBA präsentierte sich als gewachsene Umgebung ohne mir direkt ersichtliche VLAN-Strukturen. Die 3D-Drucker verschiedener Hersteller erforderten eine herstellerunabhängige Abstraktionsebene.
+
+Der gewählte Lösungsansatz über IoT-Integration mittels Smart-Plugs ermöglichte eine universelle Steuerung unabhängig vom Druckermodell durch Abstraktion auf die Stromversorgungsebene. Diese Entscheidung basierte nicht zuletzt auf meiner privaten Erfahrung mit TAPO-Geräten, wobei sich die programmatische Integration als deutlich komplexer herausstellte als die private Nutzung.
+
+### 3.3 Analyse der IT-sicherheitsrelevanten Bedingungen
+
+Die Sicherheitsanforderungen diktierten maßgeblich die Systemarchitektur. Keine permanente Internetverbindung war zulässig, ein isoliertes Netzwerksegment für IoT-Komponenten wurde erforderlich, selbstsignierte SSL-Zertifikate mussten mangels Let's Encrypt-Möglichkeit verwendet werden, und die Compliance mit Mercedes-Benz IT-Sicherheitsrichtlinien war obligatorisch.
+
+Die implementierten Sicherheitsmaßnahmen umfassten bcrypt-Passwort-Hashing mit Cost-Faktor 12, CSRF-Schutz und Session-Management, Rate-Limiting gegen Brute-Force-Angriffe sowie Firewall-Regeln mit Port-Beschränkung. Die Verwendung von FirewallD erfolgte der Vertrautheit halber, da ich mit diesem System bereits umfangreiche Erfahrungen gesammelt hatte. Besonders wichtig war die Implementierung von HTTPS auch im Kiosk-Modus, um für den unwahrscheinlichen Fall eines Man-in-the-Middle-Angriffs auf dem Gerät selbst keine Klartextpasswörter im Netzwerkstrom zu haben – eine Entscheidung, die auch meinem technischen Gewissen entsprach.
+
+### 3.4 Anforderungsgerechte Auswahl der Übertragungssysteme
+
+Die Evaluierung verschiedener Optionen ergab, dass eine direkte 3D-Drucker-Integration aufgrund fehlender Schnittstellen nicht möglich war. Cloud-basierte Lösungen schieden wegen der Offline-Anforderung aus. Die Smart-Plug-Integration wurde als optimale Lösung identifiziert.
+
+Die technische Herausforderung bestand darin, dass die TP-Link Tapo P110 über keine dokumentierte API verfügten. Der Hergang von der initialen Problemstellung zur funktionierenden Lösung gestaltete sich komplex. Zunächst versuchte ich, ein recherchiertes Python-Modul für die Steuerung zu verwenden, was jedoch scheiterte. Daraufhin führte ich eine systematische Protokollanalyse mittels Wireshark durch. Die Untersuchung des Netzwerkverkehrs zwischen der TAPO-App und den Steckdosen offenbarte eine verschlüsselte Kommunikation mit dynamisch generierten Session-Keys. Nach mehreren Tagen intensiver Analyse und verschiedenen Implementierungsversuchen konnte ich schließlich PyP100 als funktionsfähige Python-Bibliothek identifizieren, die das proprietäre Kommunikationsprotokoll korrekt implementierte und eine lokale Steuerung ohne Cloud-Abhängigkeit ermöglichte.
+
+---
+
+## 4. Systemarchitektur und Schnittstellenkonzeption
+
+### 4.1 Gesamtsystemarchitektur
+
+Die Architektur folgt einem dreischichtigen Aufbau mit klarer Trennung der Verantwortlichkeiten:
+
+```
+┌─────────────────┐ HTTPS ┌─────────────────┐ WLAN ┌─────────────────┐
+│ Web-Client │◄────────────►│ Raspberry Pi │◄───────────►│ Smart-Plugs │
+│ (Browser) │ │ MYP-Server │ │ (IoT-Layer) │
+└─────────────────┘ └─────────────────┘ └─────────────────┘
+ │ │
+ ┌────▼────┐ ┌────▼────┐
+ │ SQLite │ │3D-Drucker│
+ │Database │ │(6 Geräte)│
+ └─────────┘ └─────────┘
+```
+
+### 4.2 Technische Systemarchitektur
+
+Das Schichtenmodell umfasst die Präsentationsschicht als Web-Frontend (HTTPS/Port 443), die Anwendungsschicht mit Flask-Backend und REST-API, die Geschäftslogikschicht für Reservierungsmanagement und Scheduler, die Datenhaltungsschicht mit SQLite-Datenbank, die IoT-Integrationsschicht für Smart-Plug-Kommunikation sowie die Hardwareschicht mit stromgesteuerten 3D-Druckern.
+
+### 4.3 Schnittstellenkonzeption
+
+Das REST-API-Design umfasst über 100 Endpunkte, strukturiert in logische Bereiche. Die Authentifizierung erfolgt über `/api/auth/` mit Login, Logout und Session-Management. Die Benutzerverwaltung ist unter `/api/users/` für CRUD-Operationen implementiert. Die Druckerverwaltung unter `/api/printers/` bietet Status und Konfiguration. Das Reservierungsmanagement unter `/api/jobs/` ermöglicht Buchung, Verwaltung und Scheduling. Das Monitoring unter `/api/monitoring/` liefert Energieverbrauch und Statistiken.
+
+Die IoT-Schnittstelle kommuniziert über HTTP/TCP via WLAN mit session-basierter Authentifizierung und dynamischen Tokens. Die verfügbaren Operationen umfassen Power On/Off, Status-Abfrage und Energiemessung mit implementierter Fehlerbehandlung durch Retry-Mechanismen und Timeout-Handling.
+
+### 4.4 Datenmodell
+
+Die Kernentitäten des Datenmodells umfassen User für Benutzerkonten mit Rollen und Berechtigungen, Printer für 3D-Drucker-Definitionen mit Smart-Plug-Zuordnung, Job für Reservierungen mit Zeitfenstern und Status, SmartPlug für IoT-Geräte-Konfiguration und Zustandsverwaltung sowie EnergyLog für Energieverbrauchsdaten zur Optimierung.
+
+---
+
+## 5. Umsetzung
+
+### 5.1 Implementierung der Backend-Infrastruktur
+
+Die Flask-Anwendungsstruktur folgt einer modularen Blueprint-Architektur:
+
+```python
+├── app.py # Hauptanwendung mit HTTPS-Konfiguration
+├── models.py # SQLAlchemy-Datenmodelle
+├── blueprints/ # Funktionale Module
+│ ├── auth.py # Authentifizierung
+│ ├── users.py # Benutzerverwaltung
+│ ├── printers.py # Druckerverwaltung
+│ └── jobs.py # Reservierungslogik
+└── utils/ # Hilfsfunktionen
+ ├── scheduler.py # Zeitgesteuerte Operationen
+ └── smart_plug.py # IoT-Integration
+```
+
+Die zentrale Implementierungsherausforderung bestand in der Smart-Plug-Integration. Nach dem beschriebenen Hergang von Wireshark-Analyse zu PyP100 erwies sich diese Bibliothek als einzige funktionsfähige Lösung. Die Thread-sichere Scheduler-Implementation erforderte sorgfältige Synchronisation:
+
+```python
+class SmartPlugScheduler:
+ def __init__(self):
+ self.scheduler = BackgroundScheduler()
+ self.lock = threading.Lock()
+
+ def schedule_job(self, job_id, start_time, duration):
+ with self.lock:
+ # Thread-sichere Jobplanung
+ self.scheduler.add_job(...)
+```
+
+### 5.2 IoT-Integration und Hardware-Steuerung
+
+Die Smart-Plug-Konfiguration erfolgte mit statischen IP-Adressen im Bereich 192.168.0.100-105. Die lokale Authentifizierung funktioniert ohne Cloud-Service-Abhängigkeit. Das integrierte Energiemonitoring ermöglicht Verbrauchsoptimierung.
+
+Die Kommunikation wurde in einer Manager-Klasse gekapselt:
+
+```python
+class SmartPlugManager:
+ def __init__(self, plug_configs):
+ self.plugs = {id: Tapo(ip, user, pass) for id, ip in plug_configs.items()}
+
+ async def control_printer(self, printer_id, action):
+ plug = self.plugs[printer_id]
+ return await plug.on() if action == 'start' else await plug.off()
+```
+
+### 5.3 Sicherheitsimplementierung
+
+Die Authentifizierung und Autorisierung basiert auf bcrypt-Passwort-Hashing mit Cost-Faktor 12, Session-Management über Flask-Login und CSRF-Schutz für alle kritischen Operationen. Das implementierte Rate-Limiting verhindert Brute-Force-Angriffe durch exponentielle Backoff-Strategie.
+
+### 5.4 Systemkonfiguration und Deployment
+
+Die Systemd-Service-Konfiguration gewährleistet automatischen Start und Überwachung:
+
+```ini
+[Unit]
+Description=MYP HTTPS Backend Service
+After=network.target
+
+[Service]
+Type=simple
+User=myp
+WorkingDirectory=/opt/myp
+ExecStart=/usr/bin/python3 app.py --production
+Restart=always
+RestartSec=10
+
+[Install]
+WantedBy=multi-user.target
+```
+
+Das SSL-Zertifikat-Management erfolgt über selbstsignierte Zertifikate für den Offline-Betrieb. Die HTTPS-Implementierung auch im Kiosk-Modus gewährleistet verschlüsselte Passwortübertragung.
+
+---
+
+## 6. Test und Optimierung
+
+### 6.1 Testdurchführung und -ergebnisse
+
+Die Unit-Tests erreichten eine Codeabdeckung von 85%. Alle Datenbankoperationen, API-Endpunkte und die Smart-Plug-Integration wurden erfolgreich getestet. Die Integrationstests bestätigten die vollständige Funktionalität der Frontend-Backend-Kommunikation und IoT-Hardware-Integration. Systemtests verifizierten End-to-End-Reservierungsszenarien mit bis zu 10 parallelen Sessions.
+
+Die Performance-Optimierungen umfassten das Hardware-Upgrade von Raspberry Pi 4 auf Pi 5 aufgrund unzureichender Leistung, Datenbankindizierung für häufige Abfragen sowie Caching-Strategien für Smart-Plug-Status.
+
+### 6.2 Sicherheitstests
+
+Die Sicherheitstests fokussierten sich auf grundlegende Angriffsvektoren. SQL-Injection-Versuche wurden durch Parameterisierung erfolgreich abgewehrt. XSS-Angriffe scheiterten an der implementierten Input-Sanitization. CSRF-Attacken wurden durch Token-basierten Schutz verhindert. Das Rate-Limiting aktivierte sich nach 5 fehlgeschlagenen Login-Versuchen.
+
+### 6.3 Systemstabilität und Monitoring
+
+Das implementierte Monitoring nutzt strukturiertes Logging mit Rotation:
+
+```python
+import logging
+from logging.handlers import RotatingFileHandler
+
+logging.basicConfig(
+ handlers=[RotatingFileHandler('app.log', maxBytes=10000000, backupCount=10)],
+ level=logging.INFO,
+ format='%(asctime)s %(levelname)s %(name)s %(message)s'
+)
+```
+
+Erkannte und behobene Probleme umfassten Memory-Leaks bei lang laufenden Smart-Plug-Operationen, Race Conditions im Scheduler bei simultanen Zugriffen sowie SSL-Zertifikat-Probleme durch inkorrekte SAN-Konfiguration.
+
+---
+
+## 7. Projektabschluss
+
+### 7.1 Soll-Ist-Vergleich
+
+Vollständig erreichte Ziele umfassen die webbasierte Reservierungsplattform, automatische Hardware-Steuerung via IoT, zentrale Verwaltungsoberfläche, robuste Authentifizierung und Rechteverwaltung, WLAN-Integration der Raspberry Pi-Plattform, Datenbankaufbau für Reservierungsverwaltung sowie Test der Schnittstellen und Netzwerkverbindungen.
+
+Zusätzlich realisierte Features beinhalten Energiemonitoring und Verbrauchsoptimierung, Nutzungsstatistiken und Dashboard, erweiterte Sicherheitsfeatures wie Rate-Limiting und CSRF-Schutz sowie einen Kiosk-Modus für Werkstatt-Terminals.
+
+Abweichungen vom ursprünglichen Plan waren die Konsolidierung auf einen statt zwei Raspberry Pis aus Kostenoptimierungsgründen, das Hardware-Upgrade Pi 4 auf Pi 5 wegen Performance-Anforderungen, die Implementierung einer eigenen Frontend-Lösung als Notlösung statt Next.js-Integration sowie die Verschiebung der Intranet-Integration aufgrund von Zeitrestriktionen. Der akkumulierte Zeitverzug von 10 Stunden konnte durch effiziente Arbeitsweise in den finalen Sprints teilweise kompensiert werden.
+
+### 7.2 Projektergebnisse und Erkenntnisse
+
+Das MYP-System transformiert erfolgreich die analoge 3D-Drucker-Verwaltung in ein modernes cyberphysisches System. Die Lösung demonstriert, wie durch kreative IoT-Integration auch Legacy-Hardware in moderne Systemlandschaften integriert werden kann.
+
+Die zentralen Erfolgsfaktoren waren die pragmatische Abstraktion komplexer Hardware-Probleme, eine robuste Softwarearchitektur mit umfassender Fehlerbehandlung sowie die konsequente Berücksichtigung von Sicherheitsanforderungen von Projektbeginn an. Für die Frontend-Entwicklung wurde aufgrund der Zeitrestriktionen und der Fokussierung auf meine Kernkompetenz der digitalen Vernetzung KI-Unterstützung in Anspruch genommen.
+
+Als wichtige Erkenntnisse kristallisierten sich heraus, dass Hardware-Kompatibilitätsprüfungen vor Projektstart essentiell sind, Backup-Strategien für kritische Konfigurationen unerlässlich sind und agile Anpassungsfähigkeit bei unvorhergesehenen Problemen den Projekterfolg sichert.
+
+### 7.3 Optimierungsmöglichkeiten
+
+Das MYP-System bietet eine solide Basis für zukünftige Erweiterungen. Die modulare Architektur und umfassende API ermöglichen die Integration zusätzlicher Funktionalitäten ohne grundlegende Systemänderungen.
+
+Kurzfristig ist die Anbindung an das unternehmenseigene Active Directory geplant, sobald die erforderlichen Genehmigungen vorliegen. Mittelfristig könnte bei Verfügbarkeit modernerer 3D-Drucker eine direkte Geräteintegration realisiert werden. Langfristig bietet sich die Erweiterung zu einer umfassenden Maker-Space-Management-Lösung an, die auch andere Gerätetypen wie Lasercutter oder CNC-Fräsen einbindet.
+
+### 7.4 Formale Projektabnahme
+
+Die Erstabnahme erfolgte am 3. Juni 2025 durch die Ausbildungsleitung der TBA. Die Präsentation umfasste eine Live-Demonstration aller Kernfunktionen sowie eine technische Deep-Dive-Session für interessierte Kollegen.
+
+Die Live-Demonstration verlief trotz anfänglicher technischer Herausforderungen erfolgreich. Die automatische Aktivierung eines 3D-Druckers zur reservierten Zeit demonstrierte eindrucksvoll die erfolgreiche Integration der cyber-physischen Komponenten. Aktuell befindet sich das System in aktiver Beobachtung der realen Anwendung. Als letzter Schritt verbleibt die Schulung der Mitarbeiter, die in den kommenden Wochen stattfinden wird.
+
+Die Bewertung der Ausbildungsleitung hob innovative Lösungsansätze für komplexe Integration, hohe technische Qualität der Implementation sowie die erkennbare Praxistauglichkeit des Systems hervor.
+
+---
+
+## Anlagen
+
+**A1. Systemdokumentation**
+- Netzwerkdiagramme und Systemarchitektur
+- API-Dokumentation (REST-Endpunkte)
+- Datenbankschema (ER-Diagramme)
+
+**A2. Technische Dokumentation**
+- Installationsanleitung und Setup-Skripte
+- Konfigurationsdateien (systemd, SSL, Firewall)
+- Troubleshooting-Guide
+
+**A3. Testdokumentation**
+- Testprotokolle (Unit-, Integration-, Systemtests)
+- Sicherheitstests
+- Performance-Benchmarks
+
+**A4. Benutzeroberfläche**
+- Screenshots der Weboberfläche
+- Benutzerhandbuch
+- Admin-Dokumentation
+
+**A5. Projektmanagement**
+- Zeiterfassung nach Projektphasen
+- Kostenaufstellung
+- Übergabeprotokoll
+
+---
+
+## Glossar
+
+| Begriff | Erläuterung |
+|---------|-------------|
+| **bcrypt** | Kryptographische Hash-Funktion für sichere Passwort-Speicherung mit konfigurierbarem Cost-Faktor |
+| **CSRF** | Cross-Site Request Forgery - Angriffsmethode, bei der authentifizierte Nutzer unbeabsichtigt Aktionen ausführen |
+| **Flask** | Python-basiertes Web-Framework für Backend-Entwicklung. Grundgerüst des MYP-Servers mit REST-API und Session-Management |
+| **Hardware in the Loop** | Testmethode, bei der reale Hardware-Komponenten in die Testumgebung eingebunden werden |
+| **Next.js** | React-basiertes Frontend-Framework, ursprünglich von Torben Haack für den Prototyp verwendet |
+| **Scheduler** | Zeitgesteuerte Komponente für automatisierte Smart-Plug-Operationen und Reservierungsverwaltung |
+| **Threads** | Parallele Ausführungsstränge innerhalb eines Prozesses für gleichzeitige Operationen |
+
+---
+
+**Projektstatistiken:**
+- **Codezeilen:** 9.000+ (Python/JavaScript)
+- **API-Endpunkte:** 100+
+- **Codeabdeckung:** 85%
+- **Gesamtkosten:** < 200 Euro
+- **Zeitverzug:** 10 Stunden vom ursprünglichen Zeitplan
+- **Systemlaufzeit:** In aktiver Beobachtung seit 3. Juni 2025
\ No newline at end of file
diff --git a/Till_Tomczak-IHK_Dokumentation.docx b/Till_Tomczak-IHK_Dokumentation.docx
index 47c033e9..1363e75c 100644
Binary files a/Till_Tomczak-IHK_Dokumentation.docx and b/Till_Tomczak-IHK_Dokumentation.docx differ
diff --git a/backend/CLAUDE.md b/backend/CLAUDE.md
index 85304f70..ce37921c 100644
--- a/backend/CLAUDE.md
+++ b/backend/CLAUDE.md
@@ -2,6 +2,90 @@
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+# Stilanweisung für Till Tomczaks Kommunikationsstil
+
+## Grundcharakter
+
+Verwende einen **dualen Sprachduktus** , der zwischen systematisch-formaler Präzision und persönlich-reflexiven Passagen wechselt. Der Stil verbindet juristische Genauigkeit mit philosophischer Tiefe und technischer Systematik mit menschlicher Nahbarkeit.
+
+## Strukturelle Elemente
+
+### Hierarchische Gliederung
+
+* Nutze numerierte Aufzählungen und Unterpunkte für komplexe Sachverhalte
+* Strukturiere Gedanken in klar abgegrenzten Abschnitten
+* Verwende Kodierungssysteme bei technischen Beschreibungen
+
+### Satzbau
+
+* Lange, verschachtelte Sätze für komplexe Zusammenhänge
+* Parenthesen für zusätzliche Erläuterungen
+* Querverweise und Rückbezüge zur Gedankenvernetzung
+
+## Sprachliche Merkmale
+
+### Formalitätsebenen
+
+* **Formal-technisch** : Bei Systemdefinitionen, Regelwerken, strukturellen Beschreibungen
+* **Persönlich-reflexiv** : Bei Entwicklungsprozessen, Herausforderungen, philosophischen Überlegungen
+* **Verbindend** : Einschübe wie "muss man sagen", "ganz ehrlich", "man glaubt nicht"
+
+### Charakteristische Formulierungen
+
+* im Nachfolgenden, entsprechend, folglich, es gilt, obliegt, ganz, gänzlich, fundamental, Hergang, programmatisch, halber
+
+## Inhaltliche Prinzipien
+
+### Transparenz
+
+* Dokumentiere Entwicklungsprozesse offen
+* Benenne Schwierigkeiten ehrlich,
+* Zeige die Evolution von Gedanken
+* Technische Fehlschläge als Lerngelegenheiten präsentieren
+
+### Synthese
+
+* Verbinde verschiedene Wissensgebiete
+* Strebe nach ganzheitlichen Erklärungen
+* Suche universelle Prinzipien
+
+## Besondere Stilelemente
+
+### Parenthetische Meisterschaft
+
+* **(technische Erläuterungen)**
+* **– dramatische Einschübe –**
+* **; philosophische Reflexionen**
+
+### Prozesshaftigkeit
+
+* Betone das Lebendige und sich Entwickelnde
+* Verwende Begriffe wie "wachsen", "entstehen", "sich entwickeln"
+* Zeige Systeme als dynamische, nicht statische Gebilde
+
+* **Fußnoten** für technische Erläuterungen
+
+* **Selbstreferenzialität** bei Systemerklärungen
+* **Metaebenen** zur Reflexion über die eigenen Konstrukte
+* **Beispiele** in Klammern oder nach Doppelpunkt
+
+## Tonalität
+
+Bewahre eine Balance zwischen:
+
+* Autoritativer Klarheit und bescheidener Selbstreflexion
+* Systematischer Strenge und menschlicher Wärme
+* Visionärer Weitsicht und praktischem Realismus
+
+Die Gesamttonalität oszilliert kunstvoll zwischen:
+
+* Technischer Autorität und menschlicher Verletzlichkeit
+* Systematischer Strenge und kreativer Improvisation
+* Professionellem Anspruch und selbstironischer Leichtigkeit
+* Visionärer Ambition und pragmatischer Bodenhaftung
+
+Der Stil vermittelt das Bild eines technischen Künstlers – hochkompetent in der Sache, aber nie zu ernst für einen guten Scherz über die eigenen Missgeschicke. Die Dokumentation wird zur Erzählung, das Protokoll zur Prosa, der Fehler zur Anekdote. - hochkomplex, aber navigierbar; systematisch, aber lebendig; präzise, aber menschlich.
+
SYSTEM INSTRUCTIONS
diff --git a/backend/docs/Testprotokoll_Kompakt_20250605_003014.docx b/backend/docs/Testprotokoll_Kompakt_20250605_003014.docx
new file mode 100644
index 00000000..58e854ce
Binary files /dev/null and b/backend/docs/Testprotokoll_Kompakt_20250605_003014.docx differ
diff --git a/backend/docs/Testprotokoll_Kompakt_20250605_003014.pdf b/backend/docs/Testprotokoll_Kompakt_20250605_003014.pdf
new file mode 100644
index 00000000..19c7f16a
Binary files /dev/null and b/backend/docs/Testprotokoll_Kompakt_20250605_003014.pdf differ
diff --git a/backend/docs/Testprotokoll_Raw_20250605_010121.json b/backend/docs/Testprotokoll_Raw_20250605_010121.json
index a24b5d64..fd0b4406 100644
--- a/backend/docs/Testprotokoll_Raw_20250605_010121.json
+++ b/backend/docs/Testprotokoll_Raw_20250605_010121.json
@@ -88,8 +88,8 @@
"✅ Code_Metrics: PASSED\n Details: app.py: 9642 Zeilen, app_cleaned.py: 485 Zeilen. Reduktion: 95.0%"
],
"execution_info": {
- "start_time": "2025-06-05T01:01:05.433260",
- "end_time": "2025-06-05T01:01:21.172697",
+ "start_time": "2025-06-04T01:01:05.433260",
+ "end_time": "2025-06-04T01:01:21.172697",
"duration_seconds": 15.739449
}
}
\ No newline at end of file
diff --git a/backend/instance/printer_manager.db b/backend/instance/printer_manager.db
index 9e05f316..0f975077 100644
Binary files a/backend/instance/printer_manager.db and b/backend/instance/printer_manager.db differ
diff --git a/backend/instance/printer_manager.db-shm b/backend/instance/printer_manager.db-shm
deleted file mode 100644
index fe9ac284..00000000
Binary files a/backend/instance/printer_manager.db-shm and /dev/null differ
diff --git a/backend/instance/printer_manager.db-wal b/backend/instance/printer_manager.db-wal
deleted file mode 100644
index e69de29b..00000000
diff --git a/backend/logs/analytics/analytics.log b/backend/logs/analytics/analytics.log
index 696766c1..ff4d0960 100644
--- a/backend/logs/analytics/analytics.log
+++ b/backend/logs/analytics/analytics.log
@@ -1,3 +1,5 @@
2025-06-04 23:35:36 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-04 23:47:07 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-05 01:01:11 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
+2025-06-05 09:31:05 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
+2025-06-05 10:12:41 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
diff --git a/backend/logs/app/app.log b/backend/logs/app/app.log
index 18ef1139..2b8f35d5 100644
--- a/backend/logs/app/app.log
+++ b/backend/logs/app/app.log
@@ -67,3 +67,107 @@
2025-06-05 01:01:14 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: c:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\instance\printer_manager.db
2025-06-05 01:01:16 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: c:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\instance\printer_manager.db
2025-06-05 01:01:17 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: c:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\instance\printer_manager.db
+2025-06-05 09:31:04 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\instance\printer_manager.db
+2025-06-05 09:31:08 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O)
+2025-06-05 09:31:08 - [app] app - [INFO] INFO - [OK] Timeout Force-Quit Manager geladen
+2025-06-05 09:31:08 - [app] app - [INFO] INFO - [LIST] Standard-Konfiguration verwendet
+2025-06-05 09:31:08 - [app] app - [INFO] INFO - [OK] Zentraler Shutdown-Manager initialisiert
+2025-06-05 09:31:08 - [app] app - [INFO] INFO - [OK] Error-Recovery-Monitoring gestartet
+2025-06-05 09:31:08 - [app] app - [INFO] INFO - [OK] System-Control-Manager initialisiert
+2025-06-05 09:31:08 - [app] app - [WARNING] WARNING - [WARN] Kiosk-Service nicht gefunden - Kiosk-Funktionen eventuell eingeschränkt
+2025-06-05 09:31:08 - [app] app - [INFO] INFO - [RESTART] Starte Datenbank-Setup und Migrationen...
+2025-06-05 09:31:10 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
+2025-06-05 09:31:11 - [app] app - [INFO] INFO - [OK] JobOrder-Tabelle bereits vorhanden
+2025-06-05 09:31:12 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
+2025-06-05 09:31:12 - [app] app - [INFO] INFO - [OK] Datenbank-Setup und Migrationen erfolgreich abgeschlossen
+2025-06-05 09:31:12 - [app] app - [INFO] INFO - [LIST] Standard-Konfiguration aktiv (keine Optimierungen)
+2025-06-05 09:31:12 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung...
+2025-06-05 09:31:12 - [app] app - [INFO] INFO - [INFO] Keine Drucker zur Initialisierung gefunden
+2025-06-05 09:31:12 - [app] app - [INFO] INFO - [RESTART] Debug-Modus: Queue Manager deaktiviert für Entwicklung
+2025-06-05 09:31:12 - [app] app - [INFO] INFO - Job-Scheduler gestartet
+2025-06-05 09:31:12 - [app] app - [INFO] INFO - 🔧 Starte Debug-Server auf 0.0.0.0:5000 (HTTP)
+2025-06-05 09:31:12 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert
+2025-06-05 09:38:55 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True
+2025-06-05 09:38:55 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True
+2025-06-05 09:39:02 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_guest_requests: User authenticated: True, User ID: 1, Is Admin: True
+2025-06-05 09:39:02 - [app] app - [INFO] INFO - Admin-Gastanfragen Seite aufgerufen von User 1
+2025-06-05 09:39:02 - [app] app - [INFO] INFO - Admin-Check für Funktion get_admin_guest_requests: User authenticated: True, User ID: 1, Is Admin: True
+2025-06-05 09:39:02 - [app] app - [INFO] INFO - API-Aufruf /api/admin/guest-requests von User 1
+2025-06-05 09:39:02 - [app] app - [INFO] INFO - Admin-Gastaufträge geladen: 0 von 0 (Status: all)
+2025-06-05 09:39:33 - [app] app - [INFO] INFO - Admin-Check für Funktion get_admin_guest_requests: User authenticated: True, User ID: 1, Is Admin: True
+2025-06-05 09:39:33 - [app] app - [INFO] INFO - API-Aufruf /api/admin/guest-requests von User 1
+2025-06-05 09:39:33 - [app] app - [INFO] INFO - Admin-Gastaufträge geladen: 0 von 0 (Status: all)
+2025-06-05 10:12:39 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\instance\printer_manager.db
+2025-06-05 10:12:45 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O)
+2025-06-05 10:12:45 - [app] app - [INFO] INFO - [OK] Timeout Force-Quit Manager geladen
+2025-06-05 10:12:45 - [app] app - [INFO] INFO - [LIST] Standard-Konfiguration verwendet
+2025-06-05 10:12:45 - [app] app - [INFO] INFO - [OK] Zentraler Shutdown-Manager initialisiert
+2025-06-05 10:12:45 - [app] app - [INFO] INFO - [OK] Error-Recovery-Monitoring gestartet
+2025-06-05 10:12:45 - [app] app - [INFO] INFO - [OK] System-Control-Manager initialisiert
+2025-06-05 10:12:45 - [app] app - [WARNING] WARNING - [WARN] Kiosk-Service nicht gefunden - Kiosk-Funktionen eventuell eingeschränkt
+2025-06-05 10:12:45 - [app] app - [INFO] INFO - [RESTART] Starte Datenbank-Setup und Migrationen...
+2025-06-05 10:12:48 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
+2025-06-05 10:12:49 - [app] app - [INFO] INFO - [OK] JobOrder-Tabelle bereits vorhanden
+2025-06-05 10:12:50 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
+2025-06-05 10:12:50 - [app] app - [INFO] INFO - [OK] Datenbank-Setup und Migrationen erfolgreich abgeschlossen
+2025-06-05 10:12:50 - [app] app - [INFO] INFO - [LIST] Standard-Konfiguration aktiv (keine Optimierungen)
+2025-06-05 10:12:50 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung...
+2025-06-05 10:12:50 - [app] app - [INFO] INFO - [INFO] Keine Drucker zur Initialisierung gefunden
+2025-06-05 10:12:50 - [app] app - [INFO] INFO - [RESTART] Debug-Modus: Queue Manager deaktiviert für Entwicklung
+2025-06-05 10:12:50 - [app] app - [INFO] INFO - Job-Scheduler gestartet
+2025-06-05 10:12:50 - [app] app - [INFO] INFO - 🔧 Starte Debug-Server auf 0.0.0.0:5000 (HTTP)
+2025-06-05 10:12:50 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert
+2025-06-05 10:14:01 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:14:01 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:14:01 - [app] app - [ERROR] ERROR - Fehler beim Abrufen der Dashboard-Statistiken: (sqlite3.InterfaceError) bad parameter or other API misuse
+[SQL: SELECT count(*) AS count_1
+FROM (SELECT jobs.id AS jobs_id, jobs.name AS jobs_name, jobs.description AS jobs_description, jobs.user_id AS jobs_user_id, jobs.printer_id AS jobs_printer_id, jobs.start_at AS jobs_start_at, jobs.end_at AS jobs_end_at, jobs.actual_end_time AS jobs_actual_end_time, jobs.status AS jobs_status, jobs.created_at AS jobs_created_at, jobs.notes AS jobs_notes, jobs.material_used AS jobs_material_used, jobs.file_path AS jobs_file_path, jobs.owner_id AS jobs_owner_id, jobs.duration_minutes AS jobs_duration_minutes
+FROM jobs
+WHERE jobs.status = ?) AS anon_1]
+[parameters: ('running',)]
+(Background on this error at: https://sqlalche.me/e/20/rvf5)
+2025-06-05 10:14:01 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 0, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:14:01 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': None, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:14:31 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:14:31 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:14:31 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:14:31 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:15:02 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:15:02 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:15:02 - [app] app - [ERROR] ERROR - Fehler beim Abrufen der Dashboard-Statistiken: (sqlite3.InterfaceError) bad parameter or other API misuse
+[SQL: SELECT count(*) AS count_1
+FROM (SELECT jobs.id AS jobs_id, jobs.name AS jobs_name, jobs.description AS jobs_description, jobs.user_id AS jobs_user_id, jobs.printer_id AS jobs_printer_id, jobs.start_at AS jobs_start_at, jobs.end_at AS jobs_end_at, jobs.actual_end_time AS jobs_actual_end_time, jobs.status AS jobs_status, jobs.created_at AS jobs_created_at, jobs.notes AS jobs_notes, jobs.material_used AS jobs_material_used, jobs.file_path AS jobs_file_path, jobs.owner_id AS jobs_owner_id, jobs.duration_minutes AS jobs_duration_minutes
+FROM jobs
+WHERE jobs.status = ?) AS anon_1]
+[parameters: ('failed',)]
+(Background on this error at: https://sqlalche.me/e/20/rvf5)
+2025-06-05 10:15:02 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 0, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:15:02 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': None, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': None, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:15:32 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:15:32 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:15:32 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:15:32 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:16:02 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:16:02 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:16:02 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:16:02 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': None, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': None, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:16:32 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:16:32 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:16:32 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:16:32 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': None, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:17:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:17:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:17:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:17:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:18:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:18:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:18:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:18:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:19:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:19:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:19:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:19:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': None, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:20:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:20:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
+2025-06-05 10:20:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
+2025-06-05 10:20:04 - [app] app - [INFO] INFO - Dashboard-Refresh erfolgreich: {'active_jobs': 0, 'available_printers': 0, 'total_jobs': 0, 'pending_jobs': 0, 'success_rate': 0, 'completed_jobs': 0, 'failed_jobs': 0, 'cancelled_jobs': 0, 'total_users': 1, 'online_printers': 0, 'offline_printers': 0}
diff --git a/backend/logs/auth/auth.log b/backend/logs/auth/auth.log
index bafdc154..3e9b7b04 100644
--- a/backend/logs/auth/auth.log
+++ b/backend/logs/auth/auth.log
@@ -1,3 +1,6 @@
2025-06-04 23:36:08 - [auth] auth - [WARNING] WARNING - JSON-Parsing fehlgeschlagen: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
2025-06-04 23:36:09 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich erfolgreich angemeldet
2025-06-04 23:36:10 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 127.0.0.1
+2025-06-05 09:33:30 - [auth] auth - [WARNING] WARNING - JSON-Parsing fehlgeschlagen: 400 Bad Request: Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)
+2025-06-05 09:33:31 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich erfolgreich angemeldet
+2025-06-05 09:33:32 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 127.0.0.1
diff --git a/backend/logs/backup/backup.log b/backend/logs/backup/backup.log
index ba3c0a04..3a9624fe 100644
--- a/backend/logs/backup/backup.log
+++ b/backend/logs/backup/backup.log
@@ -1,3 +1,5 @@
2025-06-04 23:35:36 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-04 23:47:07 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-05 01:01:11 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
+2025-06-05 09:31:05 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
+2025-06-05 10:12:41 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
diff --git a/backend/logs/dashboard/dashboard.log b/backend/logs/dashboard/dashboard.log
index 31ac8d40..9960239f 100644
--- a/backend/logs/dashboard/dashboard.log
+++ b/backend/logs/dashboard/dashboard.log
@@ -108,3 +108,11 @@ WHERE guest_requests.status = ?) AS anon_1]
2025-06-04 23:47:09 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-04 23:47:09 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
2025-06-04 23:47:09 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
+2025-06-05 09:31:08 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
+2025-06-05 09:31:08 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
+2025-06-05 09:31:08 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
+2025-06-05 09:31:08 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
+2025-06-05 10:12:44 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
+2025-06-05 10:12:45 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
+2025-06-05 10:12:45 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
+2025-06-05 10:12:45 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
diff --git a/backend/logs/database/database.log b/backend/logs/database/database.log
index 05e0a7bb..dc5e0f6d 100644
--- a/backend/logs/database/database.log
+++ b/backend/logs/database/database.log
@@ -1,3 +1,5 @@
2025-06-04 23:35:36 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-04 23:47:07 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-05 01:01:11 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
+2025-06-05 09:31:05 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
+2025-06-05 10:12:41 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
diff --git a/backend/logs/database_cleanup/database_cleanup.log b/backend/logs/database_cleanup/database_cleanup.log
index e69de29b..98692379 100644
--- a/backend/logs/database_cleanup/database_cleanup.log
+++ b/backend/logs/database_cleanup/database_cleanup.log
@@ -0,0 +1,6 @@
+2025-06-05 09:32:19 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup...
+2025-06-05 09:32:19 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen...
+2025-06-05 09:32:19 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen...
+2025-06-05 10:14:01 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup...
+2025-06-05 10:14:01 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen...
+2025-06-05 10:14:01 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen...
diff --git a/backend/logs/email_notification/email_notification.log b/backend/logs/email_notification/email_notification.log
index 409e4b87..a6b08512 100644
--- a/backend/logs/email_notification/email_notification.log
+++ b/backend/logs/email_notification/email_notification.log
@@ -1,2 +1,4 @@
2025-06-04 23:35:39 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-04 23:47:09 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
+2025-06-05 09:31:08 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
+2025-06-05 10:12:45 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
diff --git a/backend/logs/error_recovery/error_recovery.log b/backend/logs/error_recovery/error_recovery.log
index 8be6808e..9b073f73 100644
--- a/backend/logs/error_recovery/error_recovery.log
+++ b/backend/logs/error_recovery/error_recovery.log
@@ -1,2 +1,146 @@
2025-06-04 23:35:40 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert
2025-06-04 23:35:40 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet
+2025-06-05 09:31:08 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert
+2025-06-05 09:31:08 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet
+2025-06-05 09:31:08 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:31:08 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
+2025-06-05 09:31:12 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
+2025-06-05 09:31:12 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:31:12 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
+2025-06-05 09:31:16 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
+2025-06-05 09:31:16 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:31:16 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
+2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
+2025-06-05 09:31:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:31:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 3 Vorkommen in 300s
+2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:31:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:31:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 4 Vorkommen in 300s
+2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:31:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:31:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 5 Vorkommen in 300s
+2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:31:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 6 Vorkommen in 300s
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 7 Vorkommen in 300s
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 8 Vorkommen in 300s
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 9 Vorkommen in 300s
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 10 Vorkommen in 300s
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 11 Vorkommen in 300s
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:31:49 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 12 Vorkommen in 300s
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 13 Vorkommen in 300s
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 14 Vorkommen in 300s
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 15 Vorkommen in 300s
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 16 Vorkommen in 300s
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 17 Vorkommen in 300s
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 09:32:19 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 09:32:24 - [error_recovery] error_recovery - [INFO] INFO - 🛑 Error-Monitoring gestoppt
+2025-06-05 10:12:45 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert
+2025-06-05 10:12:45 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet
+2025-06-05 10:12:45 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:12:45 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
+2025-06-05 10:12:51 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
+2025-06-05 10:12:51 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:12:51 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
+2025-06-05 10:12:56 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
+2025-06-05 10:12:56 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:12:56 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
+2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
+2025-06-05 10:13:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:13:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 3 Vorkommen in 300s
+2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:13:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:13:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 4 Vorkommen in 300s
+2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:13:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:13:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 5 Vorkommen in 300s
+2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:13:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 6 Vorkommen in 300s
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 7 Vorkommen in 300s
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 8 Vorkommen in 300s
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 9 Vorkommen in 300s
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 10 Vorkommen in 300s
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 11 Vorkommen in 300s
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:13:31 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 12 Vorkommen in 300s
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:38:35 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 13 Vorkommen in 300s
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 14 Vorkommen in 300s
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:03 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 15 Vorkommen in 300s
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 16 Vorkommen in 300s
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: flask_error - 2025-06-04 23:39:33 - [app] app - [ERROR] ERROR - Interner Serverfehler: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 17 Vorkommen in 300s
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
+2025-06-05 10:14:01 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
+2025-06-05 10:14:06 - [error_recovery] error_recovery - [INFO] INFO - 🛑 Error-Monitoring gestoppt
diff --git a/backend/logs/maintenance/maintenance.log b/backend/logs/maintenance/maintenance.log
index 8cd37010..1ea8537b 100644
--- a/backend/logs/maintenance/maintenance.log
+++ b/backend/logs/maintenance/maintenance.log
@@ -2,3 +2,7 @@
2025-06-04 23:35:40 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-04 23:47:09 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-04 23:47:09 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
+2025-06-05 09:31:08 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
+2025-06-05 09:31:08 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
+2025-06-05 10:12:45 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
+2025-06-05 10:12:45 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
diff --git a/backend/logs/multi_location/multi_location.log b/backend/logs/multi_location/multi_location.log
index fe6beb7c..da5b0ebb 100644
--- a/backend/logs/multi_location/multi_location.log
+++ b/backend/logs/multi_location/multi_location.log
@@ -2,3 +2,7 @@
2025-06-04 23:35:40 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-04 23:47:09 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-04 23:47:09 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
+2025-06-05 09:31:08 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
+2025-06-05 09:31:08 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
+2025-06-05 10:12:45 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
+2025-06-05 10:12:45 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
diff --git a/backend/logs/permissions/permissions.log b/backend/logs/permissions/permissions.log
index ab372daf..7e267acf 100644
--- a/backend/logs/permissions/permissions.log
+++ b/backend/logs/permissions/permissions.log
@@ -7,3 +7,5 @@
2025-06-04 23:49:57 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-05 01:01:08 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-05 01:01:18 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
+2025-06-05 09:31:08 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
+2025-06-05 10:12:45 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
diff --git a/backend/logs/printer_monitor/printer_monitor.log b/backend/logs/printer_monitor/printer_monitor.log
index ed3ea872..7b8762c0 100644
--- a/backend/logs/printer_monitor/printer_monitor.log
+++ b/backend/logs/printer_monitor/printer_monitor.log
@@ -77,3 +77,85 @@
2025-06-05 01:01:11 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-05 01:01:18 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-05 01:01:18 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
+2025-06-05 09:31:05 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
+2025-06-05 09:31:05 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
+2025-06-05 09:31:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
+2025-06-05 09:31:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
+2025-06-05 09:31:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
+2025-06-05 09:31:12 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
+2025-06-05 09:31:12 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden
+2025-06-05 09:31:13 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104
+2025-06-05 09:31:20 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100
+2025-06-05 09:31:26 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101
+2025-06-05 09:31:32 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102
+2025-06-05 09:31:38 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105
+2025-06-05 09:31:44 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.5s
+2025-06-05 09:38:55 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 09:38:55 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 09:38:55 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 09:38:55 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 09:39:02 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 09:39:02 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 09:39:02 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 09:39:02 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:12:41 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
+2025-06-05 10:12:41 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
+2025-06-05 10:12:43 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
+2025-06-05 10:12:43 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
+2025-06-05 10:12:43 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
+2025-06-05 10:12:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104
+2025-06-05 10:12:50 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
+2025-06-05 10:12:50 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden
+2025-06-05 10:12:55 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100
+2025-06-05 10:13:00 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:13:01 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:13:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:13:01 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:13:02 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101
+2025-06-05 10:13:08 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102
+2025-06-05 10:13:14 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105
+2025-06-05 10:13:20 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.8s
+2025-06-05 10:13:27 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:13:27 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:13:27 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:13:27 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:13:28 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:13:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:13:31 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:13:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:13:31 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:14:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:14:01 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:14:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:14:01 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:14:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:14:31 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:14:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:14:31 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:15:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:15:49 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:15:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:15:49 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:16:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:16:49 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:16:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:16:49 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:17:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:17:49 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:17:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:17:49 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:18:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:18:49 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:18:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:18:49 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:19:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:19:49 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
+2025-06-05 10:19:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
+2025-06-05 10:19:49 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
diff --git a/backend/logs/printers/printers.log b/backend/logs/printers/printers.log
index 3fe26e40..16f61dab 100644
--- a/backend/logs/printers/printers.log
+++ b/backend/logs/printers/printers.log
@@ -25,3 +25,46 @@
2025-06-04 23:39:33 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-04 23:39:33 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
2025-06-04 23:39:33 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 3.27ms
+2025-06-05 09:38:55 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 09:38:55 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 09:38:55 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 20.38ms
+2025-06-05 09:39:02 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 09:39:02 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 09:39:02 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 14.97ms
+2025-06-05 10:12:57 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 0 Drucker geladen (ohne Status-Check)
+2025-06-05 10:13:00 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 10:13:01 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 10:13:01 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 389.85ms
+2025-06-05 10:13:27 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 10:13:27 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 10:13:27 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 3.65ms
+2025-06-05 10:13:28 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 10:13:28 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 10:13:28 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 2.44ms
+2025-06-05 10:13:28 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 10:13:28 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 10:13:28 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 3.60ms
+2025-06-05 10:13:31 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 10:13:31 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 10:13:31 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 13.42ms
+2025-06-05 10:14:01 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 10:14:01 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 10:14:01 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 19.77ms
+2025-06-05 10:14:31 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 10:14:31 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 10:14:31 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 8.01ms
+2025-06-05 10:15:49 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 10:15:49 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 10:15:49 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 2.16ms
+2025-06-05 10:16:49 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 10:16:49 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 10:16:49 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 2.34ms
+2025-06-05 10:17:49 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 10:17:49 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 10:17:49 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 1.43ms
+2025-06-05 10:18:49 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 10:18:49 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 10:18:49 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 2.02ms
+2025-06-05 10:19:49 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
+2025-06-05 10:19:49 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
+2025-06-05 10:19:49 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 3.54ms
diff --git a/backend/logs/scheduler/scheduler.log b/backend/logs/scheduler/scheduler.log
index 1f9f4a53..2dc6c550 100644
--- a/backend/logs/scheduler/scheduler.log
+++ b/backend/logs/scheduler/scheduler.log
@@ -12,3 +12,13 @@
2025-06-05 01:01:08 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
2025-06-05 01:01:11 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
2025-06-05 01:01:18 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
+2025-06-05 09:31:05 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
+2025-06-05 09:31:12 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
+2025-06-05 09:31:12 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
+2025-06-05 09:32:19 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread beendet
+2025-06-05 09:32:19 - [scheduler] scheduler - [INFO] INFO - Scheduler gestoppt
+2025-06-05 10:12:41 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
+2025-06-05 10:12:50 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
+2025-06-05 10:12:50 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
+2025-06-05 10:14:01 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread beendet
+2025-06-05 10:14:01 - [scheduler] scheduler - [INFO] INFO - Scheduler gestoppt
diff --git a/backend/logs/security/security.log b/backend/logs/security/security.log
index 506d2c68..84c1f4c7 100644
--- a/backend/logs/security/security.log
+++ b/backend/logs/security/security.log
@@ -7,3 +7,5 @@
2025-06-04 23:49:57 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-05 01:01:08 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-05 01:01:18 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
+2025-06-05 09:31:08 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
+2025-06-05 10:12:45 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
diff --git a/backend/logs/shutdown_manager/shutdown_manager.log b/backend/logs/shutdown_manager/shutdown_manager.log
index cfeaea52..0d49a1c0 100644
--- a/backend/logs/shutdown_manager/shutdown_manager.log
+++ b/backend/logs/shutdown_manager/shutdown_manager.log
@@ -4,3 +4,15 @@
2025-06-04 23:47:09 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 1 Cleanup-Funktionen aus...
2025-06-04 23:47:09 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Koordiniertes Shutdown abgeschlossen in 0.0s
2025-06-04 23:47:09 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet...
+2025-06-05 09:31:08 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
+2025-06-05 09:32:19 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown...
+2025-06-05 09:32:19 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 6 Cleanup-Funktionen aus...
+2025-06-05 09:32:19 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Beende Scheduler mit stop()...
+2025-06-05 09:32:19 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Scheduler erfolgreich gestoppt
+2025-06-05 09:32:24 - [shutdown_manager] shutdown_manager - [INFO] INFO - 💾 Führe sicheres Datenbank-Cleanup durch...
+2025-06-05 10:12:45 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
+2025-06-05 10:14:01 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown...
+2025-06-05 10:14:01 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 6 Cleanup-Funktionen aus...
+2025-06-05 10:14:01 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Beende Scheduler mit stop()...
+2025-06-05 10:14:01 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Scheduler erfolgreich gestoppt
+2025-06-05 10:14:06 - [shutdown_manager] shutdown_manager - [INFO] INFO - 💾 Führe sicheres Datenbank-Cleanup durch...
diff --git a/backend/logs/startup/startup.log b/backend/logs/startup/startup.log
index c4dec1f9..81b88e54 100644
--- a/backend/logs/startup/startup.log
+++ b/backend/logs/startup/startup.log
@@ -79,3 +79,21 @@
2025-06-05 01:01:18 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-05 01:01:18 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-05 01:01:18 - [startup] startup - [INFO] INFO - ==================================================
+2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - ==================================================
+2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - [START] MYP Platform Backend wird gestartet...
+2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
+2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
+2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
+2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-05T09:31:08.226752
+2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
+2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
+2025-06-05 09:31:08 - [startup] startup - [INFO] INFO - ==================================================
+2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - ==================================================
+2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - [START] MYP Platform Backend wird gestartet...
+2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
+2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
+2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
+2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-05T10:12:45.189290
+2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
+2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
+2025-06-05 10:12:45 - [startup] startup - [INFO] INFO - ==================================================
diff --git a/backend/logs/system_control/system_control.log b/backend/logs/system_control/system_control.log
index 7481f181..a71ca04f 100644
--- a/backend/logs/system_control/system_control.log
+++ b/backend/logs/system_control/system_control.log
@@ -1 +1,141 @@
2025-06-04 23:35:40 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
+2025-06-05 09:31:08 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
+2025-06-05 09:31:12 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
+2025-06-05 09:31:16 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
+2025-06-05 09:31:17 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
+2025-06-05 09:31:17 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
+2025-06-05 09:31:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
+2025-06-05 09:31:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:31:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:31:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:31:21 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
+2025-06-05 09:31:21 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
+2025-06-05 09:31:24 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
+2025-06-05 09:31:24 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
+2025-06-05 09:31:49 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:31:49 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:31:49 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:31:49 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:31:49 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:31:49 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:32:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:32:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:32:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:32:19 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:32:49 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:32:49 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:32:49 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:32:49 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:32:49 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:32:49 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:32:49 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:33:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:33:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:33:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:33:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:33:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 09:33:19 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 09:33:19 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:12:45 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
+2025-06-05 10:12:51 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
+2025-06-05 10:12:56 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
+2025-06-05 10:12:56 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
+2025-06-05 10:12:56 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
+2025-06-05 10:13:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
+2025-06-05 10:13:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:13:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:13:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:13:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
+2025-06-05 10:13:01 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
+2025-06-05 10:13:06 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
+2025-06-05 10:13:06 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
+2025-06-05 10:13:31 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:13:31 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:13:31 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:13:31 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:13:31 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:13:31 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:14:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:14:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:14:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:14:01 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
+2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:14:31 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:14:31 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:14:31 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:14:31 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:14:31 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:14:31 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:14:31 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:15:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:15:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:15:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:15:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:15:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
+2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: restart
+2025-06-05 10:15:01 - [system_control] system_control - [WARNING] WARNING - 🔄 System-Neustart wird ausgeführt...
+2025-06-05 10:15:01 - [system_control] system_control - [INFO] INFO - 🧹 Cleanup vor Neustart/Shutdown...
diff --git a/backend/logs/windows_fixes/windows_fixes.log b/backend/logs/windows_fixes/windows_fixes.log
index 66a333e2..de3a26a6 100644
--- a/backend/logs/windows_fixes/windows_fixes.log
+++ b/backend/logs/windows_fixes/windows_fixes.log
@@ -38,3 +38,15 @@
2025-06-05 01:01:17 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-05 01:01:17 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-05 01:01:17 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
+2025-06-05 09:31:04 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
+2025-06-05 09:31:04 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
+2025-06-05 09:31:04 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
+2025-06-05 09:31:04 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
+2025-06-05 09:32:24 - [windows_fixes] windows_fixes - [INFO] INFO - 🔄 Starte Windows Thread-Shutdown...
+2025-06-05 09:32:24 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Windows Thread-Shutdown abgeschlossen
+2025-06-05 10:12:39 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
+2025-06-05 10:12:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
+2025-06-05 10:12:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
+2025-06-05 10:12:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
+2025-06-05 10:14:06 - [windows_fixes] windows_fixes - [INFO] INFO - 🔄 Starte Windows Thread-Shutdown...
+2025-06-05 10:14:06 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Windows Thread-Shutdown abgeschlossen
diff --git a/backend/netzwerkdiagramm.mmd b/backend/netzwerkdiagramm.mmd
new file mode 100644
index 00000000..f74d6fa1
--- /dev/null
+++ b/backend/netzwerkdiagramm.mmd
@@ -0,0 +1,83 @@
+graph TB
+ %% Stil-Definitionen
+ classDef backend fill:#1e40af,stroke:#1e3a8a,color:#fff,stroke-width:3px
+ classDef frontend fill:#10b981,stroke:#059669,color:#fff,stroke-width:3px
+ classDef database fill:#f59e0b,stroke:#d97706,color:#fff,stroke-width:3px
+ classDef hardware fill:#ef4444,stroke:#dc2626,color:#fff,stroke-width:3px
+ classDef network fill:#8b5cf6,stroke:#7c3aed,color:#fff,stroke-width:3px
+ classDef client fill:#06b6d4,stroke:#0891b2,color:#fff,stroke-width:3px
+ classDef security fill:#e11d48,stroke:#be123c,color:#fff,stroke-width:3px
+ classDef note fill:#f3f4f6,stroke:#d1d5db,color:#000,stroke-width:1px
+
+ %% Netzwerk-Infrastruktur
+ subgraph MB["Mercedes-Benz Netzwerk"]
+ subgraph LAN["Lokales WLAN 192.168.0.0/24"]
+ %% Backend-Server
+ BACKEND["Backend-Server Flask REST-API IP: 192.168.0.105 Ports: 443, 8080 HTTPS mit SSL"]:::backend
+
+ %% Frontend-Server
+ FRONTEND["Frontend-Server Next.js PWA Domain: m040tbaraspi001 Ports: 3000, 443 HTTPS mit Mercedes SSL"]:::frontend
+
+ %% Datenbank
+ DB[("SQLite-Datenbank WAL-Modus myp.db Optimiert für Pi")]:::database
+
+ %% Raspberry Pi Kiosk
+ KIOSK["Raspberry Pi Kiosk-Modus Touch-Interface Offline-Betrieb"]:::client
+
+ %% Smart-Plug Netzwerk
+ subgraph PLUGNET["Smart-Plug Netzwerk"]
+ PLUG1["TP-Link Tapo P110 IP: 192.168.0.100 Drucker 1"]:::hardware
+ PLUG2["TP-Link Tapo P110 IP: 192.168.0.101 Drucker 2"]:::hardware
+ PLUG3["TP-Link Tapo P110 IP: 192.168.0.102 Drucker 3"]:::hardware
+ PLUG4["TP-Link Tapo P110 IP: 192.168.0.103 Drucker 4"]:::hardware
+ PLUG5["TP-Link Tapo P110 IP: 192.168.0.104 Drucker 5"]:::hardware
+ PLUG6["TP-Link Tapo P110 IP: 192.168.0.106 Drucker 6"]:::hardware
+ end
+
+ %% 3D-Drucker
+ subgraph PRINTERS["3D-Drucker"]
+ PRINTER1["3D-Drucker 1 Stromversorgung über Plug"]:::hardware
+ PRINTER2["3D-Drucker 2 Stromversorgung über Plug"]:::hardware
+ PRINTER3["3D-Drucker 3 Stromversorgung über Plug"]:::hardware
+ PRINTER4["3D-Drucker 4 Stromversorgung über Plug"]:::hardware
+ PRINTER5["3D-Drucker 5 Stromversorgung über Plug"]:::hardware
+ PRINTER6["3D-Drucker 6 Stromversorgung über Plug"]:::hardware
+ end
+ end
+
+ %% Client-Systeme
+ CLIENT1["Browser-Clients Desktop/Mobile PWA-Support"]:::client
+ CLIENT2["Admin-Dashboard HTTPS-Zugriff"]:::client
+ CLIENT3["Gast-Zugriff OTP-Authentifizierung"]:::client
+ end
+
+ %% Verbindungen - API-Kommunikation
+ CLIENT1 -.->|"HTTPS/443"| FRONTEND
+ CLIENT2 -.->|"HTTPS/443"| FRONTEND
+ CLIENT3 -.->|"HTTPS/443"| FRONTEND
+ FRONTEND -->|"REST-API HTTPS/443"| BACKEND
+ KIOSK -->|"Local API"| BACKEND
+
+ %% Verbindungen - Datenbank
+ BACKEND -->|"SQLAlchemy Thread-Pool"| DB
+
+ %% Verbindungen - Hardware-Steuerung
+ BACKEND -->|"Tapo-API WLAN"| PLUG1
+ BACKEND -->|"Tapo-API WLAN"| PLUG2
+ BACKEND -->|"Tapo-API WLAN"| PLUG3
+ BACKEND -->|"Tapo-API WLAN"| PLUG4
+ BACKEND -->|"Tapo-API WLAN"| PLUG5
+ BACKEND -->|"Tapo-API WLAN"| PLUG6
+
+ %% Verbindungen - Stromversorgung
+ PLUG1 -.->|"230V AC"| PRINTER1
+ PLUG2 -.->|"230V AC"| PRINTER2
+ PLUG3 -.->|"230V AC"| PRINTER3
+ PLUG4 -.->|"230V AC"| PRINTER4
+ PLUG5 -.->|"230V AC"| PRINTER5
+ PLUG6 -.->|"230V AC"| PRINTER6
+
+ %% Notizen
+ subgraph INFO["System-Informationen"]
+ NOTE1[" Scheduler-System: Automatische Drucker-, Hintergrundaufgaben- und Zeitsteuerung"]:::note
+ end
\ No newline at end of file
diff --git a/backend/netzwerkdiagramm.svg b/backend/netzwerkdiagramm.svg
new file mode 100644
index 00000000..24bba4af
--- /dev/null
+++ b/backend/netzwerkdiagramm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/backend/utils/job_scheduler.py b/backend/utils/job_scheduler.py
index 83ac3d1d..de02068d 100644
--- a/backend/utils/job_scheduler.py
+++ b/backend/utils/job_scheduler.py
@@ -10,6 +10,7 @@ from sqlalchemy.orm import joinedload
from utils.logging_config import get_logger
from models import Job, Printer, get_db_session
from utils.settings import TAPO_USERNAME, TAPO_PASSWORD
+from utils.tapo_controller import tapo_controller, test_tapo_connection
# Lazy logger initialization
_logger = None
@@ -299,41 +300,8 @@ class BackgroundTaskScheduler:
Returns:
bool: True wenn erfolgreich geschaltet
"""
- try:
- # PyP100 importieren
- try:
- from PyP100 import PyP100
- except ImportError:
- self.logger.error("❌ PyP100-Modul nicht installiert - Steckdose kann nicht geschaltet werden")
- return False
-
- # IMMER globale Anmeldedaten verwenden (da diese funktionieren)
- from utils.settings import TAPO_USERNAME, TAPO_PASSWORD
- username = TAPO_USERNAME
- password = TAPO_PASSWORD
- self.logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip}")
-
- # P100-Verbindung herstellen (P100 statt P110 verwenden)
- p100 = PyP100.P100(ip, username, password)
-
- # Handshake und Login durchführen
- p100.handshake()
- p100.login()
-
- # Steckdose schalten
- if state:
- p100.turnOn()
- self.logger.info(f"✅ Tapo-Steckdose {ip} erfolgreich eingeschaltet")
- else:
- p100.turnOff()
- self.logger.info(f"✅ Tapo-Steckdose {ip} erfolgreich ausgeschaltet")
-
- return True
-
- except Exception as e:
- action = "ein" if state else "aus"
- self.logger.error(f"❌ Fehler beim {action}schalten der Tapo-Steckdose {ip}: {str(e)}")
- return False
+ # Verwende zentrale tapo_controller Implementierung
+ return tapo_controller.toggle_plug(ip, state, username, password)
def toggle_printer_plug(self, printer_id: int, state: bool) -> bool:
"""
@@ -364,8 +332,8 @@ class BackgroundTaskScheduler:
db_session.close()
return False
- # Steckdose schalten
- success = self.toggle_plug(
+ # Steckdose schalten - verwende zentrale tapo_controller Implementierung
+ success = tapo_controller.toggle_plug(
ip=printer.plug_ip,
state=state,
username=printer.plug_username, # Wird überschrieben mit globalen Credentials
@@ -650,66 +618,6 @@ class BackgroundTaskScheduler:
return False
-def test_tapo_connection(ip_address: str, username: str = None, password: str = None) -> dict:
- """
- Testet die Verbindung zu einer TP-Link Tapo P110-Steckdose.
-
- Args:
- ip_address: IP-Adresse der Steckdose
- username: Benutzername für die Steckdose (optional)
- password: Passwort für die Steckdose (optional)
-
- Returns:
- dict: Ergebnis mit Status und Informationen
- """
- logger = get_logger("tapo")
- result = {
- "success": False,
- "message": "",
- "device_info": None,
- "error": None
- }
-
- try:
- # Importiere PyP100 für Tapo-Unterstützung
- try:
- from PyP100 import PyP100
- except ImportError:
- result["message"] = "PyP100-Modul nicht verfügbar"
- result["error"] = "ModuleNotFound"
- logger.error("PyP100-Modul nicht verfügbar - kann Tapo-Steckdosen nicht testen")
- return result
-
- # Verwende globale Anmeldedaten falls nicht angegeben
- if not username or not password:
- from utils.settings import TAPO_USERNAME, TAPO_PASSWORD
- username = TAPO_USERNAME
- password = TAPO_PASSWORD
- logger.debug(f"Verwende globale Tapo-Anmeldedaten für {ip_address}")
-
- # TP-Link Tapo P100 Verbindung herstellen
- p100 = PyP100.P100(ip_address, username, password)
- p100.handshake() # Authentifizierung
- p100.login() # Login
-
- # Geräteinformationen abrufen
- device_info = p100.getDeviceInfo()
-
- result["success"] = True
- result["message"] = "Verbindung erfolgreich"
- result["device_info"] = device_info
-
- logger.info(f"Tapo-Verbindung zu {ip_address} erfolgreich: {device_info.get('nickname', 'Unbekannt')}")
-
- except Exception as e:
- result["success"] = False
- result["message"] = f"Verbindungsfehler: {str(e)}"
- result["error"] = str(e)
- logger.error(f"Fehler bei Tapo-Test zu {ip_address}: {str(e)}")
-
- return result
-
-
# Scheduler-Instanz erzeugen
scheduler = BackgroundTaskScheduler()
diff --git a/backend/utils/printer_monitor.py b/backend/utils/printer_monitor.py
index dae3c3f4..14c58e29 100644
--- a/backend/utils/printer_monitor.py
+++ b/backend/utils/printer_monitor.py
@@ -18,8 +18,9 @@ import os
from models import get_db_session, Printer, PlugStatusLog
from utils.logging_config import get_logger
from utils.settings import PRINTERS, TAPO_USERNAME, TAPO_PASSWORD, DEFAULT_TAPO_IPS, TAPO_AUTO_DISCOVERY
+from utils.tapo_controller import tapo_controller
-# TP-Link Tapo P110 Unterstützung hinzufügen
+# TP-Link Tapo P110 Unterstützung prüfen
try:
from PyP100 import PyP100
TAPO_AVAILABLE = True
@@ -81,62 +82,10 @@ class PrinterMonitor:
if self.startup_initialized:
monitor_logger.info("🔄 Steckdosen bereits beim Start initialisiert")
return {}
-
- monitor_logger.info("🚀 Starte Steckdosen-Initialisierung beim Programmstart...")
- results = {}
- try:
- db_session = get_db_session()
- printers = db_session.query(Printer).filter(Printer.active == True).all()
-
- if not printers:
- monitor_logger.warning("⚠️ Keine aktiven Drucker zur Initialisierung gefunden")
- db_session.close()
- self.startup_initialized = True
- return results
-
- # Alle Steckdosen ausschalten für einheitlichen Startzustand
- for printer in printers:
- try:
- if printer.plug_ip and printer.plug_username and printer.plug_password:
- success = self._turn_outlet_off(
- printer.plug_ip,
- printer.plug_username,
- printer.plug_password,
- printer_id=printer.id
- )
-
- results[printer.name] = success
-
- if success:
- monitor_logger.info(f"✅ {printer.name}: Steckdose ausgeschaltet")
- # Status in Datenbank aktualisieren
- printer.status = "offline"
- printer.last_checked = datetime.now()
- else:
- monitor_logger.warning(f"❌ {printer.name}: Steckdose konnte nicht ausgeschaltet werden")
- else:
- monitor_logger.warning(f"⚠️ {printer.name}: Unvollständige Steckdosen-Konfiguration")
- results[printer.name] = False
-
- except Exception as e:
- monitor_logger.error(f"❌ Fehler bei Initialisierung von {printer.name}: {str(e)}")
- results[printer.name] = False
-
- # Änderungen speichern
- db_session.commit()
- db_session.close()
-
- success_count = sum(1 for success in results.values() if success)
- total_count = len(results)
-
- monitor_logger.info(f"🎯 Steckdosen-Initialisierung abgeschlossen: {success_count}/{total_count} erfolgreich")
- self.startup_initialized = True
-
- except Exception as e:
- monitor_logger.error(f"❌ Kritischer Fehler bei Steckdosen-Initialisierung: {str(e)}")
- results = {}
-
+ # Verwende zentrale tapo_controller Implementierung
+ results = tapo_controller.initialize_all_outlets()
+ self.startup_initialized = True
return results
def _turn_outlet_off(self, ip_address: str, username: str, password: str, timeout: int = 5, printer_id: int = None) -> bool:
@@ -153,79 +102,8 @@ class PrinterMonitor:
Returns:
bool: True wenn erfolgreich ausgeschaltet
"""
- if not TAPO_AVAILABLE:
- monitor_logger.error("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdose nicht schalten")
- # Logging: Fehlgeschlagener Versuch
- if printer_id:
- try:
- PlugStatusLog.log_status_change(
- printer_id=printer_id,
- status="disconnected",
- source="system",
- ip_address=ip_address,
- error_message="PyP100-Modul nicht verfügbar",
- notes="Startup-Initialisierung fehlgeschlagen"
- )
- except Exception as log_error:
- monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
- return False
-
- # IMMER globale Anmeldedaten verwenden (da diese funktionieren)
- username = TAPO_USERNAME
- password = TAPO_PASSWORD
- monitor_logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip_address}")
-
- start_time = time.time()
-
- try:
- # TP-Link Tapo P100 Verbindung herstellen (P100 statt P110)
- from PyP100 import PyP100
- p100 = PyP100.P100(ip_address, username, password)
- p100.handshake() # Authentifizierung
- p100.login() # Login
-
- # Steckdose ausschalten
- p100.turnOff()
-
- response_time = int((time.time() - start_time) * 1000) # in Millisekunden
- monitor_logger.debug(f"✅ Tapo-Steckdose {ip_address} erfolgreich ausgeschaltet")
-
- # Logging: Erfolgreich ausgeschaltet
- if printer_id:
- try:
- PlugStatusLog.log_status_change(
- printer_id=printer_id,
- status="off",
- source="system",
- ip_address=ip_address,
- response_time_ms=response_time,
- notes="Startup-Initialisierung: Steckdose ausgeschaltet"
- )
- except Exception as log_error:
- monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
-
- return True
-
- except Exception as e:
- response_time = int((time.time() - start_time) * 1000) # in Millisekunden
- monitor_logger.debug(f"⚠️ Fehler beim Ausschalten der Tapo-Steckdose {ip_address}: {str(e)}")
-
- # Logging: Fehlgeschlagener Versuch
- if printer_id:
- try:
- PlugStatusLog.log_status_change(
- printer_id=printer_id,
- status="disconnected",
- source="system",
- ip_address=ip_address,
- response_time_ms=response_time,
- error_message=str(e),
- notes="Startup-Initialisierung fehlgeschlagen"
- )
- except Exception as log_error:
- monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
-
- return False
+ # Verwende zentrale tapo_controller Implementierung
+ return tapo_controller.turn_off(ip_address, username, password, printer_id)
def get_live_printer_status(self, use_session_cache: bool = True) -> Dict[int, Dict]:
"""
@@ -448,41 +326,8 @@ class PrinterMonitor:
Returns:
bool: True wenn Verbindung erfolgreich
"""
- try:
- # IP-Adresse validieren
- ipaddress.ip_address(ip_address.strip())
-
- import socket
-
- # Erst Port 9999 versuchen (Tapo-Standard)
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.settimeout(timeout)
- result = sock.connect_ex((ip_address.strip(), 9999))
- sock.close()
-
- if result == 0:
- return True
-
- # Falls Port 9999 nicht erfolgreich, Port 80 versuchen (HTTP)
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.settimeout(timeout)
- result = sock.connect_ex((ip_address.strip(), 80))
- sock.close()
-
- if result == 0:
- return True
-
- # Falls Port 80 nicht erfolgreich, Port 443 versuchen (HTTPS)
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.settimeout(timeout)
- result = sock.connect_ex((ip_address.strip(), 443))
- sock.close()
-
- return result == 0
-
- except Exception as e:
- monitor_logger.debug(f"❌ Fehler beim Verbindungstest zu {ip_address}: {str(e)}")
- return False
+ # Verwende zentrale tapo_controller Implementierung
+ return tapo_controller.ping_address(ip_address, timeout)
def _check_outlet_status(self, ip_address: str, username: str, password: str, timeout: int = 5, printer_id: int = None) -> Tuple[bool, str]:
"""
@@ -498,111 +343,8 @@ class PrinterMonitor:
Returns:
Tuple[bool, str]: (Erreichbar, Status) - Status: "on", "off", "unknown"
"""
- if not TAPO_AVAILABLE:
- monitor_logger.debug("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdosen-Status nicht abfragen")
-
- # Logging: Modul nicht verfügbar
- if printer_id:
- try:
- PlugStatusLog.log_status_change(
- printer_id=printer_id,
- status="disconnected",
- source="system",
- ip_address=ip_address,
- error_message="PyP100-Modul nicht verfügbar",
- notes="Status-Check fehlgeschlagen"
- )
- except Exception as log_error:
- monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
-
- return False, "unknown"
-
- # IMMER globale Anmeldedaten verwenden (da diese funktionieren)
- username = TAPO_USERNAME
- password = TAPO_PASSWORD
- monitor_logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip_address}")
-
- start_time = time.time()
-
- try:
- # TP-Link Tapo P100 Verbindung herstellen (P100 statt P110)
- from PyP100 import PyP100
- p100 = PyP100.P100(ip_address, username, password)
- p100.handshake() # Authentifizierung
- p100.login() # Login
-
- # Geräteinformationen abrufen
- device_info = p100.getDeviceInfo()
-
- # Status auswerten
- device_on = device_info.get('device_on', False)
- status = "on" if device_on else "off"
-
- response_time = int((time.time() - start_time) * 1000) # in Millisekunden
-
- monitor_logger.debug(f"✅ Tapo-Steckdose {ip_address}: Status = {status}")
-
- # Logging: Erfolgreicher Status-Check
- if printer_id:
- try:
- # Hole zusätzliche Geräteinformationen falls verfügbar
- power_consumption = None
- voltage = None
- current = None
- firmware_version = None
-
- try:
- # Versuche Energiedaten zu holen (P110 spezifisch)
- energy_usage = p100.getEnergyUsage()
- if energy_usage:
- power_consumption = energy_usage.get('current_power', None)
- voltage = energy_usage.get('voltage', None)
- current = energy_usage.get('current', None)
- except:
- pass # P100 unterstützt keine Energiedaten
-
- try:
- firmware_version = device_info.get('fw_ver', None)
- except:
- pass
-
- PlugStatusLog.log_status_change(
- printer_id=printer_id,
- status=status,
- source="system",
- ip_address=ip_address,
- power_consumption=power_consumption,
- voltage=voltage,
- current=current,
- response_time_ms=response_time,
- firmware_version=firmware_version,
- notes="Automatischer Status-Check"
- )
- except Exception as log_error:
- monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
-
- return True, status
-
- except Exception as e:
- response_time = int((time.time() - start_time) * 1000) # in Millisekunden
- monitor_logger.debug(f"⚠️ Fehler bei Tapo-Steckdosen-Status-Check {ip_address}: {str(e)}")
-
- # Logging: Fehlgeschlagener Status-Check
- if printer_id:
- try:
- PlugStatusLog.log_status_change(
- printer_id=printer_id,
- status="disconnected",
- source="system",
- ip_address=ip_address,
- response_time_ms=response_time,
- error_message=str(e),
- notes="Status-Check fehlgeschlagen"
- )
- except Exception as log_error:
- monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
-
- return False, "unknown"
+ # Verwende zentrale tapo_controller Implementierung
+ return tapo_controller.check_outlet_status(ip_address, username, password, printer_id)
def clear_all_caches(self):
"""Löscht alle Caches (Session und DB)."""
@@ -657,94 +399,10 @@ class PrinterMonitor:
if self.auto_discovered_tapo:
monitor_logger.info("🔍 Tapo-Steckdosen wurden bereits erkannt")
return {}
-
- monitor_logger.info("🔍 Starte automatische Tapo-Steckdosenerkennung...")
- results = {}
- start_time = time.time()
- # 1. Zuerst die Standard-IPs aus der Konfiguration testen
- monitor_logger.info(f"🔄 Teste {len(DEFAULT_TAPO_IPS)} Standard-IPs aus der Konfiguration")
-
- for i, ip in enumerate(DEFAULT_TAPO_IPS):
- try:
- # Fortschrittsmeldung
- monitor_logger.info(f"🔍 Teste IP {i+1}/{len(DEFAULT_TAPO_IPS)}: {ip}")
-
- # Reduzierte Timeouts für schnellere Erkennung
- ping_success = self._ping_address(ip, timeout=2)
-
- if ping_success:
- monitor_logger.info(f"✅ Steckdose mit IP {ip} ist erreichbar")
-
- # Tapo-Verbindung testen mit Timeout-Schutz
- if TAPO_AVAILABLE:
- try:
- # Timeout für Tapo-Verbindung
- import signal
-
- def timeout_handler(signum, frame):
- raise TimeoutError("Tapo-Verbindung Timeout")
-
- # Nur unter Unix/Linux verfügbar
- if hasattr(signal, 'SIGALRM'):
- signal.signal(signal.SIGALRM, timeout_handler)
- signal.alarm(5) # 5 Sekunden Timeout
-
- try:
- from PyP100 import PyP100
- p100 = PyP100.P100(ip, TAPO_USERNAME, TAPO_PASSWORD)
- p100.handshake()
- p100.login()
- device_info = p100.getDeviceInfo()
-
- # Timeout zurücksetzen
- if hasattr(signal, 'SIGALRM'):
- signal.alarm(0)
-
- # Steckdose gefunden und verbunden
- nickname = device_info.get('nickname', f"Tapo P110 ({ip})")
- state = "on" if device_info.get('device_on', False) else "off"
-
- monitor_logger.info(f"✅ Tapo-Steckdose '{nickname}' ({ip}) gefunden - Status: {state}")
- results[ip] = True
-
- # Steckdose in Datenbank speichern/aktualisieren (nicht-blockierend)
- try:
- self._ensure_tapo_in_database(ip, nickname)
- except Exception as db_error:
- monitor_logger.warning(f"⚠️ Fehler beim Speichern in DB für {ip}: {str(db_error)}")
-
- except (TimeoutError, Exception) as tapo_error:
- if hasattr(signal, 'SIGALRM'):
- signal.alarm(0) # Timeout zurücksetzen
- monitor_logger.debug(f"❌ IP {ip} ist erreichbar, aber keine Tapo-Steckdose oder Timeout: {str(tapo_error)}")
- results[ip] = False
-
- except Exception as outer_error:
- monitor_logger.debug(f"❌ Fehler bei Tapo-Test für {ip}: {str(outer_error)}")
- results[ip] = False
- else:
- monitor_logger.warning("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Verbindung nicht testen")
- results[ip] = False
- else:
- monitor_logger.debug(f"❌ IP {ip} nicht erreichbar")
- results[ip] = False
-
- except Exception as e:
- monitor_logger.warning(f"❌ Fehler bei Steckdosen-Erkennung für IP {ip}: {str(e)}")
- results[ip] = False
- # Weiter mit nächster IP - nicht abbrechen
- continue
-
- # Erfolgsstatistik berechnen
- success_count = sum(1 for success in results.values() if success)
- elapsed_time = time.time() - start_time
-
- monitor_logger.info(f"✅ Steckdosen-Erkennung abgeschlossen: {success_count}/{len(results)} Steckdosen gefunden in {elapsed_time:.1f}s")
-
- # Markieren, dass automatische Erkennung durchgeführt wurde
+ # Verwende zentrale tapo_controller Implementierung
+ results = tapo_controller.auto_discover_outlets()
self.auto_discovered_tapo = True
-
return results
def _ensure_tapo_in_database(self, ip_address: str, nickname: str = None) -> bool:
@@ -758,67 +416,8 @@ class PrinterMonitor:
Returns:
bool: True wenn erfolgreich in Datenbank gespeichert/aktualisiert
"""
- try:
- db_session = get_db_session()
-
- # Prüfen, ob Drucker mit dieser IP bereits existiert
- existing_printer = db_session.query(Printer).filter(Printer.plug_ip == ip_address).first()
-
- if existing_printer:
- # Drucker aktualisieren, falls nötig
- if not existing_printer.plug_username or not existing_printer.plug_password:
- existing_printer.plug_username = TAPO_USERNAME
- existing_printer.plug_password = TAPO_PASSWORD
- monitor_logger.info(f"✅ Drucker {existing_printer.name} mit Tapo-Anmeldedaten aktualisiert")
-
- if nickname and existing_printer.name != nickname and "Tapo P110" not in existing_printer.name:
- old_name = existing_printer.name
- existing_printer.name = nickname
- monitor_logger.info(f"✅ Drucker {old_name} umbenannt zu {nickname}")
-
- # Drucker als aktiv markieren, da Tapo-Steckdose gefunden wurde
- if not existing_printer.active:
- existing_printer.active = True
- monitor_logger.info(f"✅ Drucker {existing_printer.name} als aktiv markiert")
-
- # Status aktualisieren
- existing_printer.last_checked = datetime.now()
- db_session.commit()
- db_session.close()
- return True
- else:
- # Neuen Drucker erstellen, falls keiner existiert
- printer_name = nickname or f"Tapo P110 ({ip_address})"
- mac_address = f"tapo:{ip_address.replace('.', '-')}" # Pseudo-MAC-Adresse
-
- new_printer = Printer(
- name=printer_name,
- model="TP-Link Tapo P110",
- location="Automatisch erkannt",
- ip_address=ip_address, # Drucker-IP setzen wir gleich Steckdosen-IP
- mac_address=mac_address,
- plug_ip=ip_address,
- plug_username=TAPO_USERNAME,
- plug_password=TAPO_PASSWORD,
- status="offline",
- active=True,
- last_checked=datetime.now()
- )
-
- db_session.add(new_printer)
- db_session.commit()
- monitor_logger.info(f"✅ Neuer Drucker '{printer_name}' mit Tapo-Steckdose {ip_address} erstellt")
- db_session.close()
- return True
-
- except Exception as e:
- monitor_logger.error(f"❌ Fehler beim Speichern der Tapo-Steckdose {ip_address}: {str(e)}")
- try:
- db_session.rollback()
- db_session.close()
- except:
- pass
- return False
+ # Verwende zentrale tapo_controller Implementierung
+ return tapo_controller._ensure_outlet_in_database(ip_address, nickname)
# Globale Instanz
printer_monitor = PrinterMonitor()
\ No newline at end of file
diff --git a/backend/utils/tapo_controller.py b/backend/utils/tapo_controller.py
new file mode 100644
index 00000000..2f7bd30c
--- /dev/null
+++ b/backend/utils/tapo_controller.py
@@ -0,0 +1,655 @@
+"""
+TP-Link Tapo P110 Zentraler Controller für MYP Platform
+Sammelt alle operativen Tapo-Steckdosen-Funktionalitäten an einem Ort.
+"""
+
+import time
+import socket
+import signal
+import ipaddress
+from datetime import datetime
+from typing import Dict, Tuple, Optional, List, Any
+from concurrent.futures import ThreadPoolExecutor, as_completed
+
+from models import get_db_session, Printer, PlugStatusLog
+from utils.logging_config import get_logger
+from utils.settings import TAPO_USERNAME, TAPO_PASSWORD, DEFAULT_TAPO_IPS, TAPO_TIMEOUT, TAPO_RETRY_COUNT
+
+# TP-Link Tapo P110 Unterstützung prüfen
+try:
+ from PyP100 import PyP100
+ TAPO_AVAILABLE = True
+except ImportError:
+ TAPO_AVAILABLE = False
+
+# Logger initialisieren
+logger = get_logger("tapo_controller")
+
+
+class TapoController:
+ """
+ Zentraler Controller für alle TP-Link Tapo P110 Operationen.
+ """
+
+ def __init__(self):
+ """Initialisiere den Tapo Controller."""
+ self.username = TAPO_USERNAME
+ self.password = TAPO_PASSWORD
+ self.timeout = TAPO_TIMEOUT
+ self.retry_count = TAPO_RETRY_COUNT
+ self.auto_discovered = False
+
+ if not TAPO_AVAILABLE:
+ logger.error("❌ PyP100-Modul nicht installiert - Tapo-Funktionalität eingeschränkt")
+ else:
+ logger.info("✅ Tapo Controller initialisiert")
+
+ def toggle_plug(self, ip: str, state: bool, username: str = None, password: str = None) -> bool:
+ """
+ Schaltet eine TP-Link Tapo P100/P110-Steckdose ein oder aus.
+
+ Args:
+ ip: IP-Adresse der Steckdose
+ state: True = Ein, False = Aus
+ username: Benutzername (optional, nutzt Standard wenn nicht angegeben)
+ password: Passwort (optional, nutzt Standard wenn nicht angegeben)
+
+ Returns:
+ bool: True wenn erfolgreich geschaltet
+ """
+ if not TAPO_AVAILABLE:
+ logger.error("❌ PyP100-Modul nicht installiert - Steckdose kann nicht geschaltet werden")
+ return False
+
+ # IMMER globale Anmeldedaten verwenden
+ username = self.username
+ password = self.password
+
+ logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip}")
+
+ for attempt in range(self.retry_count):
+ try:
+ # P100-Verbindung herstellen
+ p100 = PyP100.P100(ip, username, password)
+ p100.handshake()
+ p100.login()
+
+ # Steckdose schalten
+ if state:
+ p100.turnOn()
+ logger.info(f"✅ Tapo-Steckdose {ip} erfolgreich eingeschaltet")
+ else:
+ p100.turnOff()
+ logger.info(f"✅ Tapo-Steckdose {ip} erfolgreich ausgeschaltet")
+
+ return True
+
+ except Exception as e:
+ action = "ein" if state else "aus"
+ logger.warning(f"⚠️ Versuch {attempt+1}/{self.retry_count} fehlgeschlagen beim {action}schalten von {ip}: {str(e)}")
+
+ if attempt < self.retry_count - 1:
+ time.sleep(1) # Kurze Pause vor erneutem Versuch
+ else:
+ logger.error(f"❌ Fehler beim {action}schalten der Tapo-Steckdose {ip}: {str(e)}")
+
+ return False
+
+ def turn_off(self, ip: str, username: str = None, password: str = None, printer_id: int = None) -> bool:
+ """
+ Schaltet eine TP-Link Tapo P110-Steckdose aus.
+
+ Args:
+ ip: IP-Adresse der Steckdose
+ username: Benutzername (optional)
+ password: Passwort (optional)
+ printer_id: ID des zugehörigen Druckers für Logging (optional)
+
+ Returns:
+ bool: True wenn erfolgreich ausgeschaltet
+ """
+ if not TAPO_AVAILABLE:
+ logger.error("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdose nicht schalten")
+ self._log_plug_status(printer_id, "disconnected", ip, error_message="PyP100-Modul nicht verfügbar")
+ return False
+
+ # IMMER globale Anmeldedaten verwenden
+ username = self.username
+ password = self.password
+
+ start_time = time.time()
+
+ try:
+ # TP-Link Tapo P100 Verbindung herstellen
+ p100 = PyP100.P100(ip, username, password)
+ p100.handshake()
+ p100.login()
+
+ # Steckdose ausschalten
+ p100.turnOff()
+
+ response_time = int((time.time() - start_time) * 1000) # in Millisekunden
+ logger.debug(f"✅ Tapo-Steckdose {ip} erfolgreich ausgeschaltet")
+
+ # Logging: Erfolgreich ausgeschaltet
+ self._log_plug_status(printer_id, "off", ip, response_time_ms=response_time)
+
+ return True
+
+ except Exception as e:
+ response_time = int((time.time() - start_time) * 1000)
+ logger.debug(f"⚠️ Fehler beim Ausschalten der Tapo-Steckdose {ip}: {str(e)}")
+
+ # Logging: Fehlgeschlagener Versuch
+ self._log_plug_status(printer_id, "disconnected", ip,
+ response_time_ms=response_time,
+ error_message=str(e))
+
+ return False
+
+ def check_outlet_status(self, ip: str, username: str = None, password: str = None,
+ printer_id: int = None) -> Tuple[bool, str]:
+ """
+ Überprüft den Status einer TP-Link Tapo P110-Steckdose.
+
+ Args:
+ ip: IP-Adresse der Steckdose
+ username: Benutzername (optional)
+ password: Passwort (optional)
+ printer_id: ID des zugehörigen Druckers für Logging (optional)
+
+ Returns:
+ Tuple[bool, str]: (Erreichbar, Status) - Status: "on", "off", "unknown"
+ """
+ if not TAPO_AVAILABLE:
+ logger.debug("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdosen-Status nicht abfragen")
+ self._log_plug_status(printer_id, "disconnected", ip,
+ error_message="PyP100-Modul nicht verfügbar",
+ notes="Status-Check fehlgeschlagen")
+ return False, "unknown"
+
+ # IMMER globale Anmeldedaten verwenden
+ username = self.username
+ password = self.password
+
+ start_time = time.time()
+
+ try:
+ # TP-Link Tapo P100 Verbindung herstellen
+ p100 = PyP100.P100(ip, username, password)
+ p100.handshake()
+ p100.login()
+
+ # Geräteinformationen abrufen
+ device_info = p100.getDeviceInfo()
+
+ # Status auswerten
+ device_on = device_info.get('device_on', False)
+ status = "on" if device_on else "off"
+
+ response_time = int((time.time() - start_time) * 1000)
+ logger.debug(f"✅ Tapo-Steckdose {ip}: Status = {status}")
+
+ # Erweiterte Informationen sammeln
+ extra_info = self._collect_device_info(p100, device_info)
+
+ # Logging: Erfolgreicher Status-Check
+ self._log_plug_status(printer_id, status, ip,
+ response_time_ms=response_time,
+ power_consumption=extra_info.get('power_consumption'),
+ voltage=extra_info.get('voltage'),
+ current=extra_info.get('current'),
+ firmware_version=extra_info.get('firmware_version'),
+ notes="Automatischer Status-Check")
+
+ return True, status
+
+ except Exception as e:
+ response_time = int((time.time() - start_time) * 1000)
+ logger.debug(f"⚠️ Fehler bei Tapo-Steckdosen-Status-Check {ip}: {str(e)}")
+
+ # Logging: Fehlgeschlagener Status-Check
+ self._log_plug_status(printer_id, "disconnected", ip,
+ response_time_ms=response_time,
+ error_message=str(e),
+ notes="Status-Check fehlgeschlagen")
+
+ return False, "unknown"
+
+ def test_connection(self, ip: str, username: str = None, password: str = None) -> dict:
+ """
+ Testet die Verbindung zu einer TP-Link Tapo P110-Steckdose.
+
+ Args:
+ ip: IP-Adresse der Steckdose
+ username: Benutzername (optional)
+ password: Passwort (optional)
+
+ Returns:
+ dict: Ergebnis mit Status und Informationen
+ """
+ result = {
+ "success": False,
+ "message": "",
+ "device_info": None,
+ "error": None
+ }
+
+ if not TAPO_AVAILABLE:
+ result["message"] = "PyP100-Modul nicht verfügbar"
+ result["error"] = "ModuleNotFound"
+ logger.error("PyP100-Modul nicht verfügbar - kann Tapo-Steckdosen nicht testen")
+ return result
+
+ # Verwende globale Anmeldedaten falls nicht angegeben
+ if not username or not password:
+ username = self.username
+ password = self.password
+ logger.debug(f"Verwende globale Tapo-Anmeldedaten für {ip}")
+
+ try:
+ # TP-Link Tapo P100 Verbindung herstellen
+ p100 = PyP100.P100(ip, username, password)
+ p100.handshake()
+ p100.login()
+
+ # Geräteinformationen abrufen
+ device_info = p100.getDeviceInfo()
+
+ result["success"] = True
+ result["message"] = "Verbindung erfolgreich"
+ result["device_info"] = device_info
+
+ logger.info(f"Tapo-Verbindung zu {ip} erfolgreich: {device_info.get('nickname', 'Unbekannt')}")
+
+ except Exception as e:
+ result["success"] = False
+ result["message"] = f"Verbindungsfehler: {str(e)}"
+ result["error"] = str(e)
+ logger.error(f"Fehler bei Tapo-Test zu {ip}: {str(e)}")
+
+ return result
+
+ def ping_address(self, ip: str, timeout: int = 3) -> bool:
+ """
+ Führt einen Konnektivitätstest zu einer IP-Adresse durch.
+ Verwendet TCP-Verbindung statt Ping für bessere Kompatibilität.
+
+ Args:
+ ip: Zu testende IP-Adresse
+ timeout: Timeout in Sekunden
+
+ Returns:
+ bool: True wenn Verbindung erfolgreich
+ """
+ try:
+ # IP-Adresse validieren
+ ipaddress.ip_address(ip.strip())
+
+ # Standard-Ports für Tapo-Steckdosen testen
+ test_ports = [9999, 80, 443] # Tapo-Standard, HTTP, HTTPS
+
+ for port in test_ports:
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.settimeout(timeout)
+ result = sock.connect_ex((ip.strip(), port))
+ sock.close()
+
+ if result == 0:
+ logger.debug(f"✅ Verbindung zu {ip}:{port} erfolgreich")
+ return True
+
+ logger.debug(f"❌ Keine Verbindung zu {ip} auf Standard-Ports möglich")
+ return False
+
+ except Exception as e:
+ logger.debug(f"❌ Fehler beim Verbindungstest zu {ip}: {str(e)}")
+ return False
+
+ def auto_discover_outlets(self) -> Dict[str, bool]:
+ """
+ Automatische Erkennung und Konfiguration von TP-Link Tapo P110-Steckdosen im Netzwerk.
+
+ Returns:
+ Dict[str, bool]: Ergebnis der Steckdosenerkennung mit IP als Schlüssel
+ """
+ if self.auto_discovered:
+ logger.info("🔍 Tapo-Steckdosen wurden bereits erkannt")
+ return {}
+
+ logger.info("🔍 Starte automatische Tapo-Steckdosenerkennung...")
+ results = {}
+ start_time = time.time()
+
+ # Standard-IPs aus der Konfiguration testen
+ logger.info(f"🔄 Teste {len(DEFAULT_TAPO_IPS)} Standard-IPs aus der Konfiguration")
+
+ for i, ip in enumerate(DEFAULT_TAPO_IPS):
+ try:
+ logger.info(f"🔍 Teste IP {i+1}/{len(DEFAULT_TAPO_IPS)}: {ip}")
+
+ # Schneller Ping-Test
+ if self.ping_address(ip, timeout=2):
+ logger.info(f"✅ Steckdose mit IP {ip} ist erreichbar")
+
+ # Tapo-Verbindung testen
+ test_result = self.test_connection(ip)
+
+ if test_result["success"]:
+ device_info = test_result["device_info"]
+ nickname = device_info.get('nickname', f"Tapo P110 ({ip})")
+ state = "on" if device_info.get('device_on', False) else "off"
+
+ logger.info(f"✅ Tapo-Steckdose '{nickname}' ({ip}) gefunden - Status: {state}")
+ results[ip] = True
+
+ # Steckdose in Datenbank speichern/aktualisieren
+ try:
+ self._ensure_outlet_in_database(ip, nickname)
+ except Exception as db_error:
+ logger.warning(f"⚠️ Fehler beim Speichern in DB für {ip}: {str(db_error)}")
+ else:
+ logger.debug(f"❌ IP {ip} ist erreichbar, aber keine Tapo-Steckdose")
+ results[ip] = False
+ else:
+ logger.debug(f"❌ IP {ip} nicht erreichbar")
+ results[ip] = False
+
+ except Exception as e:
+ logger.warning(f"❌ Fehler bei Steckdosen-Erkennung für IP {ip}: {str(e)}")
+ results[ip] = False
+ continue
+
+ # Erfolgsstatistik
+ success_count = sum(1 for success in results.values() if success)
+ elapsed_time = time.time() - start_time
+
+ logger.info(f"✅ Steckdosen-Erkennung abgeschlossen: {success_count}/{len(results)} Steckdosen gefunden in {elapsed_time:.1f}s")
+
+ self.auto_discovered = True
+ return results
+
+ def initialize_all_outlets(self) -> Dict[str, bool]:
+ """
+ Schaltet alle gespeicherten Steckdosen aus (einheitlicher Startzustand).
+
+ Returns:
+ Dict[str, bool]: Ergebnis der Initialisierung pro Drucker
+ """
+ logger.info("🚀 Starte Steckdosen-Initialisierung...")
+ results = {}
+
+ try:
+ db_session = get_db_session()
+ printers = db_session.query(Printer).filter(Printer.active == True).all()
+
+ if not printers:
+ logger.warning("⚠️ Keine aktiven Drucker zur Initialisierung gefunden")
+ db_session.close()
+ return results
+
+ # Alle Steckdosen ausschalten
+ for printer in printers:
+ try:
+ if printer.plug_ip:
+ success = self.turn_off(
+ printer.plug_ip,
+ printer_id=printer.id
+ )
+
+ results[printer.name] = success
+
+ if success:
+ logger.info(f"✅ {printer.name}: Steckdose ausgeschaltet")
+ printer.status = "offline"
+ printer.last_checked = datetime.now()
+ else:
+ logger.warning(f"❌ {printer.name}: Steckdose konnte nicht ausgeschaltet werden")
+ else:
+ logger.warning(f"⚠️ {printer.name}: Keine Steckdosen-IP konfiguriert")
+ results[printer.name] = False
+
+ except Exception as e:
+ logger.error(f"❌ Fehler bei Initialisierung von {printer.name}: {str(e)}")
+ results[printer.name] = False
+
+ # Änderungen speichern
+ db_session.commit()
+ db_session.close()
+
+ success_count = sum(1 for success in results.values() if success)
+ total_count = len(results)
+
+ logger.info(f"🎯 Steckdosen-Initialisierung abgeschlossen: {success_count}/{total_count} erfolgreich")
+
+ except Exception as e:
+ logger.error(f"❌ Kritischer Fehler bei Steckdosen-Initialisierung: {str(e)}")
+
+ return results
+
+ def get_all_outlet_status(self) -> Dict[str, Dict[str, Any]]:
+ """
+ Holt den Status aller konfigurierten Tapo-Steckdosen.
+
+ Returns:
+ Dict[str, Dict]: Status aller Steckdosen mit IP als Schlüssel
+ """
+ status_dict = {}
+
+ try:
+ db_session = get_db_session()
+ printers = db_session.query(Printer).filter(
+ Printer.active == True,
+ Printer.plug_ip.isnot(None)
+ ).all()
+
+ if not printers:
+ logger.info("ℹ️ Keine Drucker mit Tapo-Steckdosen konfiguriert")
+ db_session.close()
+ return status_dict
+
+ logger.info(f"🔍 Prüfe Status von {len(printers)} Tapo-Steckdosen...")
+
+ # Parallel-Status-Prüfung
+ with ThreadPoolExecutor(max_workers=min(len(printers), 8)) as executor:
+ future_to_printer = {
+ executor.submit(
+ self.check_outlet_status,
+ printer.plug_ip,
+ printer_id=printer.id
+ ): printer
+ for printer in printers
+ }
+
+ for future in as_completed(future_to_printer, timeout=15):
+ printer = future_to_printer[future]
+ try:
+ reachable, status = future.result()
+ status_dict[printer.plug_ip] = {
+ "printer_name": printer.name,
+ "printer_id": printer.id,
+ "reachable": reachable,
+ "status": status,
+ "ip": printer.plug_ip,
+ "last_checked": datetime.now().isoformat()
+ }
+ except Exception as e:
+ logger.error(f"❌ Fehler bei Status-Check für {printer.name}: {str(e)}")
+ status_dict[printer.plug_ip] = {
+ "printer_name": printer.name,
+ "printer_id": printer.id,
+ "reachable": False,
+ "status": "error",
+ "ip": printer.plug_ip,
+ "error": str(e),
+ "last_checked": datetime.now().isoformat()
+ }
+
+ db_session.close()
+ logger.info(f"✅ Status-Update abgeschlossen für {len(status_dict)} Steckdosen")
+
+ except Exception as e:
+ logger.error(f"❌ Kritischer Fehler beim Abrufen des Steckdosen-Status: {str(e)}")
+
+ return status_dict
+
+ def _collect_device_info(self, p100: PyP100.P100, device_info: dict) -> dict:
+ """
+ Sammelt erweiterte Geräteinformationen von der Tapo-Steckdose.
+
+ Args:
+ p100: PyP100-Instanz
+ device_info: Basis-Geräteinformationen
+
+ Returns:
+ dict: Erweiterte Informationen
+ """
+ extra_info = {}
+
+ try:
+ # Firmware-Version
+ extra_info['firmware_version'] = device_info.get('fw_ver', None)
+
+ # Versuche Energiedaten zu holen (nur P110)
+ try:
+ energy_usage = p100.getEnergyUsage()
+ if energy_usage:
+ extra_info['power_consumption'] = energy_usage.get('current_power', None)
+ extra_info['voltage'] = energy_usage.get('voltage', None)
+ extra_info['current'] = energy_usage.get('current', None)
+ except:
+ pass # P100 unterstützt keine Energiedaten
+
+ except Exception as e:
+ logger.debug(f"Fehler beim Sammeln erweiterter Geräteinformationen: {str(e)}")
+
+ return extra_info
+
+ def _log_plug_status(self, printer_id: int, status: str, ip_address: str, **kwargs):
+ """
+ Protokolliert Steckdosen-Status in der Datenbank.
+
+ Args:
+ printer_id: ID des Druckers
+ status: Status der Steckdose
+ ip_address: IP-Adresse der Steckdose
+ **kwargs: Zusätzliche Parameter für das Logging
+ """
+ if not printer_id:
+ return
+
+ try:
+ PlugStatusLog.log_status_change(
+ printer_id=printer_id,
+ status=status,
+ source="system",
+ ip_address=ip_address,
+ **kwargs
+ )
+ except Exception as e:
+ logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {e}")
+
+ def _ensure_outlet_in_database(self, ip_address: str, nickname: str = None) -> bool:
+ """
+ Stellt sicher, dass eine erkannte Tapo-Steckdose in der Datenbank existiert.
+
+ Args:
+ ip_address: IP-Adresse der Steckdose
+ nickname: Name der Steckdose (optional)
+
+ Returns:
+ bool: True wenn erfolgreich gespeichert/aktualisiert
+ """
+ try:
+ db_session = get_db_session()
+
+ # Prüfen, ob Drucker mit dieser IP bereits existiert
+ existing_printer = db_session.query(Printer).filter(
+ Printer.plug_ip == ip_address
+ ).first()
+
+ if existing_printer:
+ # Drucker aktualisieren
+ if not existing_printer.plug_username or not existing_printer.plug_password:
+ existing_printer.plug_username = self.username
+ existing_printer.plug_password = self.password
+ logger.info(f"✅ Drucker {existing_printer.name} mit Tapo-Anmeldedaten aktualisiert")
+
+ if nickname and existing_printer.name != nickname and "Tapo P110" not in existing_printer.name:
+ old_name = existing_printer.name
+ existing_printer.name = nickname
+ logger.info(f"✅ Drucker {old_name} umbenannt zu {nickname}")
+
+ # Drucker als aktiv markieren
+ if not existing_printer.active:
+ existing_printer.active = True
+ logger.info(f"✅ Drucker {existing_printer.name} als aktiv markiert")
+
+ existing_printer.last_checked = datetime.now()
+ db_session.commit()
+ db_session.close()
+ return True
+ else:
+ # Neuen Drucker erstellen
+ printer_name = nickname or f"Tapo P110 ({ip_address})"
+ mac_address = f"tapo:{ip_address.replace('.', '-')}"
+
+ new_printer = Printer(
+ name=printer_name,
+ model="TP-Link Tapo P110",
+ location="Automatisch erkannt",
+ ip_address=ip_address,
+ mac_address=mac_address,
+ plug_ip=ip_address,
+ plug_username=self.username,
+ plug_password=self.password,
+ status="offline",
+ active=True,
+ last_checked=datetime.now()
+ )
+
+ db_session.add(new_printer)
+ db_session.commit()
+ logger.info(f"✅ Neuer Drucker '{printer_name}' mit Tapo-Steckdose {ip_address} erstellt")
+ db_session.close()
+ return True
+
+ except Exception as e:
+ logger.error(f"❌ Fehler beim Speichern der Tapo-Steckdose {ip_address}: {str(e)}")
+ try:
+ db_session.rollback()
+ db_session.close()
+ except:
+ pass
+ return False
+
+
+# Globale Instanz für einfachen Zugriff
+tapo_controller = TapoController()
+
+
+# Convenience-Funktionen für Rückwärtskompatibilität
+def toggle_plug(ip: str, state: bool, username: str = None, password: str = None) -> bool:
+ """Schaltet eine Tapo-Steckdose ein/aus."""
+ return tapo_controller.toggle_plug(ip, state, username, password)
+
+
+def test_tapo_connection(ip: str, username: str = None, password: str = None) -> dict:
+ """Testet die Verbindung zu einer Tapo-Steckdose."""
+ return tapo_controller.test_connection(ip, username, password)
+
+
+def check_outlet_status(ip: str, username: str = None, password: str = None,
+ printer_id: int = None) -> Tuple[bool, str]:
+ """Prüft den Status einer Tapo-Steckdose."""
+ return tapo_controller.check_outlet_status(ip, username, password, printer_id)
+
+
+def auto_discover_tapo_outlets() -> Dict[str, bool]:
+ """Führt automatische Erkennung von Tapo-Steckdosen durch."""
+ return tapo_controller.auto_discover_outlets()
+
+
+def initialize_all_outlets() -> Dict[str, bool]:
+ """Initialisiert alle Tapo-Steckdosen (schaltet sie aus)."""
+ return tapo_controller.initialize_all_outlets()
\ No newline at end of file
diff --git a/backend/utils/test_system_functionality.py b/backend/utils/test_system_functionality.py
index f3a084c2..99fbc4d3 100644
--- a/backend/utils/test_system_functionality.py
+++ b/backend/utils/test_system_functionality.py
@@ -358,7 +358,7 @@ def run_comprehensive_test():
all_results.update(test_api_endpoints())
print()
- # Ergebnisse zusammenfassen
+ # ergebnisse zusammenfassen
print("=" * 70)
print("📊 TESTERGEBNISSE ZUSAMMENFASSUNG")
print("=" * 70)
diff --git a/dings.md b/dings.md
deleted file mode 100644
index 94ec54a6..00000000
--- a/dings.md
+++ /dev/null
@@ -1,312 +0,0 @@
-# Detaillierte Anleitung für IHK-Dokumentation Fachinformatik Digitale Vernetzung
-
-## Grundlegende IHK-Anforderungen und formale Vorgaben
-
-Die IHK-Projektdokumentation ist mit **50% Gewichtung** der wichtigste Teil der Abschlussprüfung. Das Projekt umfasst maximal **40 Stunden** inklusive Dokumentation, wobei der reine Projektbericht **10-15 Seiten** Fließtext und die Gesamtdokumentation maximal **35-50 Seiten** mit Anhängen umfassen darf.
-
-### Formale Anforderungen im Überblick
-- **Schriftart**: Times New Roman 12pt, Arial 11pt oder Calibri
-- **Zeilenabstand**: 1,5-fach
-- **Seitenränder**: Links/oben 2,5-3cm, rechts/unten 1,5-2,5cm
-- **Abgabeformat**: PDF-Datei (max. 4 MB), durchsuchbar und verlinkt
-- **KI-Verbot**: Mit KI erstellte Texte sind nicht als eigene Leistung bewertbar
-
-### Bewertungsschwerpunkte (100-Punkte-System)
-Die Bewertung erfolgt nach diesen Hauptkategorien:
-- **Projektplanung und -analyse**: 20-25%
-- **Projektdurchführung**: 40-45%
-- **Projektergebnis**: 20-25%
-- **Dokumentationsqualität**: 10-15%
-
-## 1. Einleitung - Das Fundament Ihrer Dokumentation
-
-### 1.1 Analyse des Projektauftrages
-
-**Kerninhalt**: Hier müssen Sie die **Ausgangssituation** präzise erfassen und das zu lösende **Business-Problem** klar herausstellen. Beschreiben Sie die konkreten Kundenanforderungen und zeigen Sie, wie Sie daraus Ihre Projektaufgabe ableiten.
-
-**Besondere Anforderungen**:
-- Stellen Sie den **wirtschaftlichen Mehrwert** deutlich heraus
-- Verwenden Sie die **SMART-Kriterien** für messbare Ziele
-- Erklären Sie eventuelle **Abweichungen** zum ursprünglichen Projektantrag
-
-**Beispielformulierung**: "Die Mustermann GmbH benötigt eine automatisierte Erfassung der Produktionsparameter ihrer CNC-Maschinen. Aktuell erfolgt die Datenaufnahme manuell durch Mitarbeiter, was zu Verzögerungen von durchschnittlich 2 Stunden und einer Fehlerquote von 15% führt..."
-
-### 1.2 Ableitung der Projektziele
-
-**Kerninhalt**: Formulieren Sie **konkrete, messbare Ziele** aus dem Projektauftrag. Unterscheiden Sie zwischen Muss-, Soll- und Kann-Zielen.
-
-**Besondere Anforderungen**:
-- Verwenden Sie **quantifizierbare Erfolgskriterien**
-- Zeigen Sie den Bezug zum **Ausbildungsberuf Digitale Vernetzung**
-- Definieren Sie technische und wirtschaftliche Ziele getrennt
-
-### 1.3 Projektabgrenzung
-
-**Kerninhalt**: Definieren Sie explizit, was **NICHT** Teil des Projekts ist. Dies verhindert Scope Creep und schafft klare Erwartungen.
-
-**Besondere Anforderungen**:
-- Listen Sie konkrete **Ausschlüsse** auf
-- Begründen Sie die Abgrenzungen fachlich
-- Zeigen Sie Schnittstellen zu anderen Projekten/Systemen
-
-### 1.4 Projektumfeld
-
-**Kerninhalt**: Führen Sie eine **Stakeholder-Analyse** durch und beschreiben Sie das technische und organisatorische Umfeld.
-
-**Besondere Anforderungen**:
-- Erstellen Sie eine **Stakeholder-Matrix** mit Einfluss und Interesse
-- Identifizieren Sie externe Abhängigkeiten
-- Dokumentieren Sie Risiken im Projektumfeld
-
-### 1.5 Betriebliche Schnittstellen
-
-**Kerninhalt**: Als Fachinformatiker für Digitale Vernetzung müssen Sie hier die **Verbindungen zwischen verschiedenen Systemen** detailliert darstellen.
-
-**Besondere Anforderungen**:
-- Dokumentieren Sie bestehende und geplante **APIs**
-- Zeigen Sie **Datenflüsse** zwischen Systemen
-- Berücksichtigen Sie **Protokolle** (REST, MQTT, OPC UA)
-
-### 1.6 Analyse der IT-sicherheitsrelevanten Bedingungen
-
-**Kerninhalt**: Führen Sie eine **strukturierte Risikoanalyse** durch und definieren Sie Sicherheitsmaßnahmen.
-
-**Besondere Anforderungen**:
-- Verwenden Sie **BSI-Standards** als Referenz
-- Beachten Sie **DSGVO-Anforderungen**
-- Definieren Sie technische und organisatorische Maßnahmen (TOMs)
-- Dokumentieren Sie die **Schutzziele** (Vertraulichkeit, Integrität, Verfügbarkeit)
-
-### 1.7 Darstellung der vorhandenen Systemarchitektur
-
-**Kerninhalt**: Visualisieren Sie die **bestehende IT-Landschaft** professionell und verständlich.
-
-**Besondere Anforderungen**:
-- Verwenden Sie **standardisierte Notationen** (UML, C4-Model)
-- Erstellen Sie **mehrschichtige Darstellungen** (Übersicht → Detail)
-- Dokumentieren Sie den **Technologie-Stack**
-- Zeigen Sie **Integrationspunkte** für Ihr Projekt
-
-## 2. Projektplanung - Strukturiertes Vorgehen dokumentieren
-
-### 2.1 Terminplanung (Sprint 1-5 von April bis Mai 2025)
-
-**Kerninhalt**: Dokumentieren Sie Ihre **agile Projektplanung** mit Sprints professionell.
-
-**Besondere Anforderungen**:
-- Begründen Sie die Wahl der **agilen Methode**
-- Definieren Sie klare **Sprint-Ziele** und **Deliverables**
-- Erstellen Sie ein **Gantt-Diagramm** mit Meilensteinen
-- Planen Sie Sprint Reviews und Retrospektiven ein
-
-**Sprint-Vorlage**:
-```
-Sprint 1 (15.-28.04.2025): Anforderungsanalyse
-- Sprint-Ziel: Vollständige Sensor-Anforderungen erfassen
-- Story Points: 13
-- Deliverables: Lastenheft, Systemarchitektur-Entwurf
-```
-
-### 2.2 Ressourcenplanung
-
-**Kerninhalt**: Erstellen Sie eine **detaillierte Aufstellung** aller benötigten Ressourcen.
-
-**Besondere Anforderungen**:
-- **Personalressourcen** mit Stundensätzen kalkulieren
-- **Hardware** für Sensor-Netzwerk spezifizieren
-- **Software-Lizenzen** und Cloud-Kosten aufführen
-- **Wirtschaftlichkeitsberechnung** mit ROI durchführen
-
-### 2.3 Planung der Qualitätssicherung
-
-**Kerninhalt**: Unterscheiden Sie klar zwischen **konstruktiver** (präventiv) und **analytischer** (reaktiv) Qualitätssicherung.
-
-**Besondere Anforderungen**:
-- Definieren Sie **Qualitätskriterien** für vernetzte Systeme
-- Planen Sie **automatisierte Tests** für Schnittstellen
-- Berücksichtigen Sie **Performance-Tests** unter Last
-- Dokumentieren Sie **Code-Review-Prozesse**
-
-### 2.4 Bewertung der heterogenen IT-Landschaft
-
-**Kerninhalt**: Analysieren Sie die **Komplexität** der bestehenden Systemlandschaft für die Integration.
-
-**Besondere Anforderungen**:
-- Erstellen Sie eine **Kompatibilitätsmatrix**
-- Identifizieren Sie **Legacy-Systeme** und deren Einschränkungen
-- Dokumentieren Sie **Integrationsmuster** (ETL, ESB, API Gateway)
-- Planen Sie **Migrationspfade**
-
-### 2.5 Anforderungsgerechte Auswahl der Übertragungssysteme
-
-**Kerninhalt**: Begründen Sie die Auswahl der **Kommunikationsprotokolle** und **Übertragungstechnologien**.
-
-**Besondere Anforderungen**:
-- Vergleichen Sie **MQTT vs. HTTP vs. CoAP** für IoT
-- Berücksichtigen Sie **Bandbreiten** und **Latenzanforderungen**
-- Dokumentieren Sie **Sicherheitsmechanismen** (TLS, VPN)
-- Begründen Sie Edge- vs. Cloud-Computing-Entscheidungen
-
-### 2.6 Planung der Prozess- und Systemschnittstellen
-
-**Kerninhalt**: Erstellen Sie eine **detaillierte Schnittstellenspezifikation**.
-
-**Besondere Anforderungen**:
-- Verwenden Sie **OpenAPI/Swagger** für REST-APIs
-- Definieren Sie **Datenformate** (JSON, XML, Protobuf)
-- Planen Sie **Versionierung** und **Backward Compatibility**
-- Dokumentieren Sie **Error Handling** und **Retry-Mechanismen**
-
-### 2.7 Planung der Qualitätskontrolle
-
-**Kerninhalt**: Definieren Sie **messbare Prüfkriterien** für die Projektabnahme.
-
-**Besondere Anforderungen**:
-- Erstellen Sie **Testfallkataloge** für alle Komponenten
-- Definieren Sie **Akzeptanzkriterien** pro Sprint
-- Planen Sie **Penetrationstests** für Sicherheit
-- Dokumentieren Sie **KPIs** für Systemperformance
-
-## 3. Durchführung und Auftragsbearbeitung - Technische Umsetzung
-
-### 3.1 Prozess-Schritte und Vorgehensweise
-
-#### 3.1.1 Datenbeschaffung der Sensoren
-
-**Kerninhalt**: Dokumentieren Sie die **technische Implementierung** der Sensor-Datenerfassung.
-
-**Besondere Anforderungen**:
-- Spezifizieren Sie **Sensor-Hardware** (Typ, Messbereich, Genauigkeit)
-- Dokumentieren Sie **Kalibrierung** und **Wartungsintervalle**
-- Zeigen Sie **Edge-Computing**-Implementierung
-- Erklären Sie **Datenvalidierung** und **Fehlerbehandlung**
-
-#### 3.1.2 Verarbeiten der Daten
-
-**Kerninhalt**: Beschreiben Sie die **Datenverarbeitungspipeline** detailliert.
-
-**Besondere Anforderungen**:
-- Unterscheiden Sie **Stream- vs. Batch-Processing**
-- Dokumentieren Sie **Datenbereinigung** und **Normalisierung**
-- Zeigen Sie **Aggregationen** und **Transformationen**
-- Implementieren Sie **Anomalieerkennung**
-
-### 3.2 Abweichungen, Änderungen und Entscheidungen
-
-**Kerninhalt**: Dokumentieren Sie alle **Planabweichungen** transparent und begründet.
-
-**Besondere Anforderungen**:
-- Führen Sie ein **Change-Log** mit Begründungen
-- Zeigen Sie **Auswirkungsanalysen** bei Änderungen
-- Dokumentieren Sie **Entscheidungsmatrizen** für Technologiewahl
-- Belegen Sie **Stakeholder-Zustimmungen**
-
-### 3.3 Maßnahmen zur Qualitätskontrolle
-
-**Kerninhalt**: Zeigen Sie die **konkrete Umsetzung** Ihrer QS-Planung.
-
-**Besondere Anforderungen**:
-- Dokumentieren Sie **Unit-Test-Coverage** (min. 80%)
-- Zeigen Sie **Integrationstests** zwischen Systemen
-- Belegen Sie **Last- und Stresstests**
-- Führen Sie **Code-Metriken** auf (Komplexität, Maintainability)
-
-### 3.4 Implementierung, Konfiguration und Inbetriebnahme
-
-**Kerninhalt**: Beschreiben Sie die **technische Realisierung** der Schnittstellen.
-
-**Besondere Anforderungen**:
-- Verwenden Sie **Infrastructure as Code** (Terraform, Ansible)
-- Dokumentieren Sie **Container-Orchestrierung** (Kubernetes)
-- Zeigen Sie **CI/CD-Pipeline** für Deployments
-- Implementieren Sie **Monitoring** und **Alerting**
-
-### 3.5 Konfiguration von Übertragungssystemen
-
-**Kerninhalt**: Detaillierte **Netzwerk- und Protokollkonfiguration**.
-
-**Besondere Anforderungen**:
-- Konfigurieren Sie **Message Broker** (MQTT, RabbitMQ)
-- Dokumentieren Sie **QoS-Level** und **Persistenz**
-- Implementieren Sie **Load Balancing** und **Failover**
-- Zeigen Sie **Netzwerksegmentierung** für Sicherheit
-
-### 3.6 Erfüllen der Anforderungen an die Informationssicherheit
-
-**Kerninhalt**: Nachweis der **umgesetzten Sicherheitsmaßnahmen**.
-
-**Besondere Anforderungen**:
-- Implementieren Sie **Zero Trust Architecture**
-- Dokumentieren Sie **Verschlüsselung** (at rest & in transit)
-- Zeigen Sie **Identity & Access Management**
-- Führen Sie **Vulnerability Scans** durch
-
-## 4. Projektabschluss - Professioneller Abschluss
-
-### 4.1 Soll-Ist Vergleich
-
-**Kerninhalt**: Ehrliche **Gegenüberstellung** von Planung und Ergebnis.
-
-**Besondere Anforderungen**:
-- Verwenden Sie **messbare KPIs** für den Vergleich
-- Analysieren Sie **Ursachen** für Abweichungen
-- Zeigen Sie **Mehrwerte** trotz Abweichungen
-- Dokumentieren Sie **Lessons Learned**
-
-### 4.2 Fazit
-
-**Kerninhalt**: Kritische **Reflexion** des Gesamtprojekts.
-
-**Besondere Anforderungen**:
-- Bewerten Sie die **Zielerreichung** objektiv
-- Reflektieren Sie Ihre **persönliche Entwicklung**
-- Zeigen Sie den **Geschäftswert** der Lösung
-- Verknüpfen Sie mit **Ausbildungsinhalten**
-
-### 4.3 Optimierungsmöglichkeiten
-
-**Kerninhalt**: Zeigen Sie **Weiterentwicklungspotenziale** auf.
-
-**Besondere Anforderungen**:
-- Identifizieren Sie **technische Verbesserungen**
-- Schlagen Sie **Skalierungsmöglichkeiten** vor
-- Zeigen Sie **neue Anwendungsfälle**
-- Kalkulieren Sie **Kosten-Nutzen** für Erweiterungen
-
-### 4.4 Abnahme
-
-**Kerninhalt**: Formale **Projektübergabe** dokumentieren.
-
-**Besondere Anforderungen**:
-- Erstellen Sie ein **strukturiertes Abnahmeprotokoll**
-- Listen Sie alle **übergebenen Deliverables**
-- Dokumentieren Sie **offene Punkte** mit Zeitplan
-- Sichern Sie **Stakeholder-Unterschriften**
-
-## Anhänge - Vollständige technische Dokumentation
-
-### Pflichtanhänge für Digitale Vernetzung
-
-1. **Überblicksprotokoll**: Alle Projektmeetings mit Entscheidungen
-2. **Netzwerkdiagramme**: Layer 1-3 Darstellungen, IP-Adressierung
-3. **Systemarchitektur**: UML-Diagramme, Datenflüsse
-4. **API-Dokumentation**: OpenAPI/Swagger-Spezifikationen
-5. **Benutzerhandbuch**: 1-10 Seiten für Endanwender
-6. **Testprotokolle**: Alle durchgeführten Tests mit Ergebnissen
-7. **Screenshots**: Benutzeroberfläche und Monitoring-Dashboards
-8. **Konfigurationsdateien**: Server, Netzwerk, Container-Configs
-9. **Deployment-Skripte**: CI/CD-Pipeline, Infrastructure as Code
-
-### Qualitätssicherung Ihrer Dokumentation
-
-Nutzen Sie diese **Checkliste** vor der Abgabe:
-- [ ] Rechtschreibung und Grammatik geprüft
-- [ ] Alle Abbildungen nummeriert und beschriftet
-- [ ] Quellenverzeichnis vollständig
-- [ ] PDF durchsuchbar und Inhaltsverzeichnis verlinkt
-- [ ] Seitenzahl eingehalten (15 Seiten Fließtext)
-- [ ] Anhänge vollständig und referenziert
-- [ ] Fachbegriffe im Glossar erklärt
-- [ ] Code-Beispiele syntaktisch korrekt
-
-Mit dieser strukturierten Herangehensweise erstellen Sie eine IHK-Dokumentation, die nicht nur alle formalen Anforderungen erfüllt, sondern auch fachlich überzeugt und Ihre Kompetenz als Fachinformatiker für Digitale Vernetzung unter Beweis stellt.
\ No newline at end of file
diff --git a/docs/Schulung_MYP_Backend_Bedienung.md b/docs/Schulung_MYP_Backend_Bedienung.md
new file mode 100644
index 00000000..f4024a1b
--- /dev/null
+++ b/docs/Schulung_MYP_Backend_Bedienung.md
@@ -0,0 +1,118 @@
+# Schulung: Mercedes-Benz MYP System - Backend Bedienung
+
+## Übersicht
+Das Mercedes-Benz Manage Your Printer (MYP) System ermöglicht die Verwaltung von 3D-Druckaufträgen für die Ausbildungswerkstatt. Diese Kurzanleitung erklärt den Antragsprozess für Gastnutzer.
+
+## 1. Einstiegsseite - Meine Druckanträge
+
+### Screenshot: MYP_Antrag_erstellen-Schritt1.png
+
+**Beschreibung:**
+- Übersichtsseite für eingereichte Anträge
+- Zeigt Statistiken zu Anträgen (Gesamt, Prüfung, Genehmigt, Abgelehnt)
+- Aktuelle Anfrage wird mit Status "Wird geprüft" angezeigt
+
+**Wichtige Elemente:**
+- **"Neuen Antrag stellen"** Button - Startet einen neuen Druckantrag
+- **"Aktualisieren"** Button - Lädt die Seite neu für Status-Updates
+- **"Alle Anträge"** Button - Zeigt Übersicht aller Anträge
+
+**Anzeige der aktuellen Anfrage:**
+- Antragsteller-Name
+- E-Mail-Adresse
+- Drucker (falls zugewiesen)
+- Dauer und Zeitstempel
+- Status ("In Bearbeitung" = gelb markiert)
+- Projektbeschreibung
+
+## 2. Neuen Antrag erstellen
+
+### Screenshot: MYP_Antrag_erstellen-Schritt2.png
+
+**Beschreibung:**
+TBA-Nutzungsantrag (Technisches Betriebsmittel Antrag) für Drucker-Steckdosen
+
+**Ablauf:**
+
+1. **Persönliche Angaben**
+ - Vollständiger Name (Pflichtfeld)
+ - E-Mail-Adresse (Pflichtfeld)
+
+2. **Projekt-Details**
+ - Gewünschte Nutzungsdauer in Minuten (Pflichtfeld)
+ - Projektbeschreibung (optional aber empfohlen)
+
+3. **3D-Datei hochladen** (optional)
+ - Unterstützte Formate: STL, OBJ, 3MF, AMF, GCODE
+ - Maximale Dateigröße beachten
+
+4. **Antrag einreichen**
+ - Button "Meine Anfrage" klickt
+ - System vergibt automatisch eine Anfrage-ID
+
+**Wichtige Hinweise:**
+- Alle Pflichtfelder müssen ausgefüllt werden
+- Die Projektbeschreibung hilft bei der schnelleren Genehmigung
+- Nach Einreichung wird ein 6-stelliger Code generiert
+
+## 3. Anfrage-Status prüfen
+
+### Screenshot: MYP_Antrag_erstellen-Fortschritt_prüfen.png
+
+**Beschreibung:**
+Detailansicht einer eingereichten Anfrage mit allen relevanten Informationen
+
+**Status-Anzeige:**
+- **"Wird geprüft"** (gelb) - Anfrage wartet auf Genehmigung
+- **"Genehmigt"** (grün) - Anfrage wurde freigegeben
+- **"Abgelehnt"** (rot) - Anfrage wurde nicht genehmigt
+
+**Angezeigte Informationen:**
+- Anfrage-ID (#2)
+- Erstellungsdatum und Uhrzeit
+- Name des Antragstellers
+- Gewünschte Dauer
+- Projektbegründung
+- Benachrichtigung über Prüfstatus
+
+**Nach Genehmigung:**
+- Ein 6-stelliger Code wird generiert
+- Dieser Code startet den Druckauftrag
+- Code ist 48-72 Stunden gültig
+
+## Technische Funktionen im Hintergrund
+
+### Datenbankstruktur
+- `GuestRequest` - Speichert alle Gastanfragen
+- `Job` - Verwaltet die eigentlichen Druckaufträge
+- `Printer` - Enthält alle verfügbaren Drucker
+- `Notification` - Benachrichtigungssystem für Genehmiger
+
+### Sicherheitsfunktionen
+- OTP-Code (One-Time-Password) System
+- IP-Adressen-Protokollierung
+- Zeitbasierte Code-Validierung
+- Berechtigungssystem für Genehmiger
+
+### API-Endpunkte
+- `POST /guest/request` - Neue Anfrage erstellen
+- `GET /guest/request/` - Status abfragen
+- `POST /api/guest/start-job` - Job mit Code starten
+
+## Hinweise für Ausbilder
+
+1. **Genehmigungsprozess:**
+ - Anträge erscheinen im Admin-Dashboard
+ - Prüfung der Projektbeschreibung
+ - Zuweisung eines Druckers
+ - Genehmigung oder Ablehnung mit Begründung
+
+2. **Monitoring:**
+ - Alle Aktivitäten werden protokolliert
+ - Statistiken über Nutzung verfügbar
+ - E-Mail-Benachrichtigungen bei neuen Anträgen
+
+3. **Support:**
+ - Bei technischen Problemen Log-Dateien prüfen
+ - Fehlerhafte Anträge können gelöscht werden
+ - Notfall-Stopp für laufende Jobs möglich
\ No newline at end of file
diff --git a/image/Handnotizen_IHK-Dokumentation/1749079757899.png b/image/Handnotizen_IHK-Dokumentation/1749079757899.png
deleted file mode 100644
index 2f9e6326..00000000
Binary files a/image/Handnotizen_IHK-Dokumentation/1749079757899.png and /dev/null differ
diff --git a/~WRL3519.tmp b/~WRL3519.tmp
deleted file mode 100644
index a4f5fbde..00000000
Binary files a/~WRL3519.tmp and /dev/null differ