🎉 Improved IHK Project Documentation with Screenshots & Videos 📚

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

View File

@ -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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 882 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 40 KiB

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

View File

@ -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*

View File

@ -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

Binary file not shown.

View File

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

Binary file not shown.

View File

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

Binary file not shown.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 40 KiB

View File

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

View File

@ -18,8 +18,9 @@ import os
from models import get_db_session, Printer, PlugStatusLog
from utils.logging_config import get_logger
from utils.settings import PRINTERS, TAPO_USERNAME, TAPO_PASSWORD, DEFAULT_TAPO_IPS, TAPO_AUTO_DISCOVERY
from utils.tapo_controller import tapo_controller
# TP-Link Tapo P110 Unterstützung hinzufügen
# TP-Link Tapo P110 Unterstützung prüfen
try:
from PyP100 import PyP100
TAPO_AVAILABLE = True
@ -82,61 +83,9 @@ class PrinterMonitor:
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)."""
@ -658,93 +400,9 @@ class PrinterMonitor:
monitor_logger.info("🔍 Tapo-Steckdosen wurden bereits erkannt")
return {}
monitor_logger.info("🔍 Starte automatische Tapo-Steckdosenerkennung...")
results = {}
start_time = time.time()
# 1. Zuerst die Standard-IPs aus der Konfiguration testen
monitor_logger.info(f"🔄 Teste {len(DEFAULT_TAPO_IPS)} Standard-IPs aus der Konfiguration")
for i, ip in enumerate(DEFAULT_TAPO_IPS):
try:
# Fortschrittsmeldung
monitor_logger.info(f"🔍 Teste IP {i+1}/{len(DEFAULT_TAPO_IPS)}: {ip}")
# Reduzierte Timeouts für schnellere Erkennung
ping_success = self._ping_address(ip, timeout=2)
if ping_success:
monitor_logger.info(f"✅ Steckdose mit IP {ip} ist erreichbar")
# Tapo-Verbindung testen mit Timeout-Schutz
if TAPO_AVAILABLE:
try:
# Timeout für Tapo-Verbindung
import signal
def timeout_handler(signum, frame):
raise TimeoutError("Tapo-Verbindung Timeout")
# Nur unter Unix/Linux verfügbar
if hasattr(signal, 'SIGALRM'):
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(5) # 5 Sekunden Timeout
try:
from PyP100 import PyP100
p100 = PyP100.P100(ip, TAPO_USERNAME, TAPO_PASSWORD)
p100.handshake()
p100.login()
device_info = p100.getDeviceInfo()
# Timeout zurücksetzen
if hasattr(signal, 'SIGALRM'):
signal.alarm(0)
# Steckdose gefunden und verbunden
nickname = device_info.get('nickname', f"Tapo P110 ({ip})")
state = "on" if device_info.get('device_on', False) else "off"
monitor_logger.info(f"✅ Tapo-Steckdose '{nickname}' ({ip}) gefunden - Status: {state}")
results[ip] = True
# Steckdose in Datenbank speichern/aktualisieren (nicht-blockierend)
try:
self._ensure_tapo_in_database(ip, nickname)
except Exception as db_error:
monitor_logger.warning(f"⚠️ Fehler beim Speichern in DB für {ip}: {str(db_error)}")
except (TimeoutError, Exception) as tapo_error:
if hasattr(signal, 'SIGALRM'):
signal.alarm(0) # Timeout zurücksetzen
monitor_logger.debug(f"❌ IP {ip} ist erreichbar, aber keine Tapo-Steckdose oder Timeout: {str(tapo_error)}")
results[ip] = False
except Exception as outer_error:
monitor_logger.debug(f"❌ Fehler bei Tapo-Test für {ip}: {str(outer_error)}")
results[ip] = False
else:
monitor_logger.warning("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Verbindung nicht testen")
results[ip] = False
else:
monitor_logger.debug(f"❌ IP {ip} nicht erreichbar")
results[ip] = False
except Exception as e:
monitor_logger.warning(f"❌ Fehler bei Steckdosen-Erkennung für IP {ip}: {str(e)}")
results[ip] = False
# Weiter mit nächster IP - nicht abbrechen
continue
# Erfolgsstatistik berechnen
success_count = sum(1 for success in results.values() if success)
elapsed_time = time.time() - start_time
monitor_logger.info(f"✅ Steckdosen-Erkennung abgeschlossen: {success_count}/{len(results)} Steckdosen gefunden in {elapsed_time:.1f}s")
# Markieren, dass automatische Erkennung durchgeführt wurde
# Verwende zentrale tapo_controller Implementierung
results = tapo_controller.auto_discover_outlets()
self.auto_discovered_tapo = True
return results
def _ensure_tapo_in_database(self, ip_address: str, nickname: str = None) -> bool:
@ -758,67 +416,8 @@ class PrinterMonitor:
Returns:
bool: True wenn erfolgreich in Datenbank gespeichert/aktualisiert
"""
try:
db_session = get_db_session()
# Prüfen, ob Drucker mit dieser IP bereits existiert
existing_printer = db_session.query(Printer).filter(Printer.plug_ip == ip_address).first()
if existing_printer:
# Drucker aktualisieren, falls nötig
if not existing_printer.plug_username or not existing_printer.plug_password:
existing_printer.plug_username = TAPO_USERNAME
existing_printer.plug_password = TAPO_PASSWORD
monitor_logger.info(f"✅ Drucker {existing_printer.name} mit Tapo-Anmeldedaten aktualisiert")
if nickname and existing_printer.name != nickname and "Tapo P110" not in existing_printer.name:
old_name = existing_printer.name
existing_printer.name = nickname
monitor_logger.info(f"✅ Drucker {old_name} umbenannt zu {nickname}")
# Drucker als aktiv markieren, da Tapo-Steckdose gefunden wurde
if not existing_printer.active:
existing_printer.active = True
monitor_logger.info(f"✅ Drucker {existing_printer.name} als aktiv markiert")
# Status aktualisieren
existing_printer.last_checked = datetime.now()
db_session.commit()
db_session.close()
return True
else:
# Neuen Drucker erstellen, falls keiner existiert
printer_name = nickname or f"Tapo P110 ({ip_address})"
mac_address = f"tapo:{ip_address.replace('.', '-')}" # Pseudo-MAC-Adresse
new_printer = Printer(
name=printer_name,
model="TP-Link Tapo P110",
location="Automatisch erkannt",
ip_address=ip_address, # Drucker-IP setzen wir gleich Steckdosen-IP
mac_address=mac_address,
plug_ip=ip_address,
plug_username=TAPO_USERNAME,
plug_password=TAPO_PASSWORD,
status="offline",
active=True,
last_checked=datetime.now()
)
db_session.add(new_printer)
db_session.commit()
monitor_logger.info(f"✅ Neuer Drucker '{printer_name}' mit Tapo-Steckdose {ip_address} erstellt")
db_session.close()
return True
except Exception as e:
monitor_logger.error(f"❌ Fehler beim Speichern der Tapo-Steckdose {ip_address}: {str(e)}")
try:
db_session.rollback()
db_session.close()
except:
pass
return False
# Verwende zentrale tapo_controller Implementierung
return tapo_controller._ensure_outlet_in_database(ip_address, nickname)
# Globale Instanz
printer_monitor = PrinterMonitor()

View File

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

View File

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

312
dings.md
View File

@ -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.

View File

@ -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/<id>` - 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.