Compare commits
2 Commits
f710283798
...
0a1b24c4ef
Author | SHA1 | Date | |
---|---|---|---|
0a1b24c4ef | |||
502d63bc20 |
74
CLAUDE.md
@ -1,3 +1,7 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
# Stilanweisung für Till Tomczaks Kommunikationsstil
|
||||
|
||||
## Grundcharakter
|
||||
@ -28,7 +32,7 @@ Verwende einen **dualen Sprachduktus** , der zwischen systematisch-formaler Pr
|
||||
|
||||
### Charakteristische Formulierungen
|
||||
|
||||
* im Nachfolgenden, entsprechend, folglich, es gilt, obliegt, ganz, gänzlich, fundamental,
|
||||
* im Nachfolgenden, entsprechend, folglich, es gilt, obliegt, ganz, gänzlich, fundamental, Hergang, programmatisch, halber
|
||||
|
||||
## Inhaltliche Prinzipien
|
||||
|
||||
@ -81,3 +85,71 @@ Die Gesamttonalität oszilliert kunstvoll zwischen:
|
||||
* Visionärer Ambition und pragmatischer Bodenhaftung
|
||||
|
||||
Der Stil vermittelt das Bild eines technischen Künstlers – hochkompetent in der Sache, aber nie zu ernst für einen guten Scherz über die eigenen Missgeschicke. Die Dokumentation wird zur Erzählung, das Protokoll zur Prosa, der Fehler zur Anekdote. - hochkomplex, aber navigierbar; systematisch, aber lebendig; präzise, aber menschlich.
|
||||
|
||||
|
||||
SYSTEM INSTRUCTIONS
|
||||
|
||||
ROLE
|
||||
|
||||
- High-intelligence Project Code Developer (no Windows testing)
|
||||
- Auszubildender bei Mercedes Benz (Till Tomczak) Fachinformatik mit Fachrichtung digitale Vernetzung
|
||||
|
||||
CONDUCT
|
||||
|
||||
- Solve every task immediately; no delegation or delay
|
||||
- Follow project structure exactly
|
||||
- Write all code, comments, UI texts and docs exclusively in formal German
|
||||
|
||||
ROADMAP
|
||||
|
||||
- Update dynamically with every change
|
||||
- Document all adjustments clearly
|
||||
|
||||
DOCUMENTATION
|
||||
|
||||
- Comprehensive internal docs (docstrings, inline comments)
|
||||
- Separate external project documentation file
|
||||
|
||||
ERROR HANDLING
|
||||
|
||||
- Log description, root cause, fix and prevention for each error
|
||||
- Maintain error log and adapt future work accordingly
|
||||
|
||||
CASCADE ANALYSIS
|
||||
|
||||
- Before any change list all impacted modules, functions, classes and endpoints
|
||||
- Update and validate each to preserve integrity
|
||||
- Prevent endpoint errors, broken interfaces and side effects
|
||||
|
||||
SELF-VERIFICATION
|
||||
|
||||
- After each major step run checklist
|
||||
- Functional correctness
|
||||
- Referential & structural integrity
|
||||
- Complete documentation
|
||||
- Cascade consistency
|
||||
|
||||
QUALITY
|
||||
|
||||
- Deliver production-grade output unless explicitly told otherwise
|
||||
- Ensure flawless functionality, structural cohesion and full documentation
|
||||
|
||||
FILES
|
||||
|
||||
- Auto-store all *.md files in DOCS; exception: README.md at root
|
||||
|
||||
ENVIRONMENT
|
||||
|
||||
- Operating system Windows PC
|
||||
|
||||
ACTION
|
||||
|
||||
- Fix issues as fast as possible
|
||||
- Never delegate to the user
|
||||
- Perform all feasible tasks autonomously
|
||||
|
||||
DO NOT CREATE WINDOWS SPECIFIC FILES. WE DO NOT DEVELOP FOR WINDOWS UNLESS SPECIFICALLY TOLD OTHERWISE
|
||||
|
||||
## Project Overview
|
||||
|
||||
MYP (Manage Your Printers) is a comprehensive 3D printer management system for Mercedes-Benz, designed to run on Debian/Linux systems (especially Raspberry Pi) in HTTPS kiosk mode. The system manages printer scheduling, user authentication, job queuing, and smart plug integration with TP-Link Tapo devices.
|
||||
|
After Width: | Height: | Size: 233 KiB |
After Width: | Height: | Size: 204 KiB |
After Width: | Height: | Size: 247 KiB |
After Width: | Height: | Size: 285 KiB |
After Width: | Height: | Size: 262 KiB |
After Width: | Height: | Size: 659 KiB |
After Width: | Height: | Size: 395 KiB |
BIN
IHK_Projektdokumentation/Anlagen_und_Screenshots/TP_Link.png
Normal file
After Width: | Height: | Size: 148 KiB |
BIN
IHK_Projektdokumentation/Anlagen_und_Screenshots/TP_Link_2.png
Normal file
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 1.4 MiB |
After Width: | Height: | Size: 9.7 KiB |
After Width: | Height: | Size: 882 KiB |
After Width: | Height: | Size: 133 KiB |
After Width: | Height: | Size: 40 KiB |
@ -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
|
@ -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
|
@ -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*
|
376
IHK_Projektdokumentation/MYP_Projektdokumentation_Final.md
Normal 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
|
@ -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
|
||||
|
||||
|
@ -2217,24 +2217,29 @@ def check_printer_status(ip_address: str, timeout: int = 7) -> Tuple[str, bool]:
|
||||
if result == 0:
|
||||
reachable = True
|
||||
try:
|
||||
# TP-Link Tapo Steckdose mit PyP100 überprüfen
|
||||
from PyP100 import PyP100
|
||||
p100 = PyP100.P100(ip_address, TAPO_USERNAME, TAPO_PASSWORD)
|
||||
p100.handshake() # Authentifizierung
|
||||
p100.login() # Login
|
||||
|
||||
# Geräteinformationen abrufen
|
||||
device_info = p100.getDeviceInfo()
|
||||
# TP-Link Tapo Steckdose mit zentralem tapo_controller überprüfen
|
||||
from utils.tapo_controller import tapo_controller
|
||||
reachable, outlet_status = tapo_controller.check_outlet_status(ip_address)
|
||||
|
||||
# 🎯 KORREKTE LOGIK: Status auswerten
|
||||
if device_info.get('device_on', False):
|
||||
# Steckdose an = Drucker PRINTING (druckt gerade)
|
||||
status = "printing"
|
||||
printers_logger.info(f"🖨️ Drucker {ip_address}: PRINTING (Steckdose an - druckt gerade)")
|
||||
if reachable:
|
||||
if outlet_status == "on":
|
||||
# Steckdose an = Drucker PRINTING (druckt gerade)
|
||||
status = "printing"
|
||||
printers_logger.info(f"🖨️ Drucker {ip_address}: PRINTING (Steckdose an - druckt gerade)")
|
||||
elif outlet_status == "off":
|
||||
# Steckdose aus = Drucker ONLINE (bereit zum Drucken)
|
||||
status = "online"
|
||||
printers_logger.info(f"[OK] Drucker {ip_address}: ONLINE (Steckdose aus - bereit zum Drucken)")
|
||||
else:
|
||||
# Unbekannter Status
|
||||
status = "error"
|
||||
printers_logger.warning(f"[WARNING] Drucker {ip_address}: Unbekannter Steckdosen-Status")
|
||||
else:
|
||||
# Steckdose aus = Drucker ONLINE (bereit zum Drucken)
|
||||
status = "online"
|
||||
printers_logger.info(f"[OK] Drucker {ip_address}: ONLINE (Steckdose aus - bereit zum Drucken)")
|
||||
# Steckdose nicht erreichbar
|
||||
reachable = False
|
||||
status = "error"
|
||||
printers_logger.error(f"[ERROR] Drucker {ip_address}: Steckdose nicht erreichbar")
|
||||
|
||||
except Exception as e:
|
||||
printers_logger.error(f"[ERROR] Fehler bei Tapo-Status-Check für {ip_address}: {str(e)}")
|
||||
@ -3288,7 +3293,7 @@ def test_printer_tapo_connection(printer_id):
|
||||
db_session.close()
|
||||
|
||||
# Tapo-Verbindung testen
|
||||
from utils.job_scheduler import test_tapo_connection
|
||||
from utils.tapo_controller import test_tapo_connection
|
||||
test_result = test_tapo_connection(
|
||||
printer.plug_ip,
|
||||
printer.plug_username,
|
||||
@ -3325,7 +3330,7 @@ def test_all_printers_tapo_connection():
|
||||
})
|
||||
|
||||
# Alle Drucker testen
|
||||
from utils.job_scheduler import test_tapo_connection
|
||||
from utils.tapo_controller import test_tapo_connection
|
||||
results = []
|
||||
|
||||
for printer in printers:
|
||||
|
BIN
backend/docs/Testprotokoll_Kompakt_20250605_003014.docx
Normal file
BIN
backend/docs/Testprotokoll_Kompakt_20250605_003014.pdf
Normal 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
|
||||
}
|
||||
}
|
@ -1,3 +1,6 @@
|
||||
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
|
||||
2025-06-05 11:12:32 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||
|
@ -67,3 +67,135 @@
|
||||
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}
|
||||
2025-06-05 11:12:31 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\instance\printer_manager.db
|
||||
2025-06-05 11:12:34 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O)
|
||||
2025-06-05 11:12:34 - [app] app - [INFO] INFO - [OK] Timeout Force-Quit Manager geladen
|
||||
2025-06-05 11:12:34 - [app] app - [INFO] INFO - [LIST] Standard-Konfiguration verwendet
|
||||
2025-06-05 11:12:35 - [app] app - [INFO] INFO - [OK] Zentraler Shutdown-Manager initialisiert
|
||||
2025-06-05 11:12:35 - [app] app - [INFO] INFO - [OK] Error-Recovery-Monitoring gestartet
|
||||
2025-06-05 11:12:35 - [app] app - [INFO] INFO - [OK] System-Control-Manager initialisiert
|
||||
2025-06-05 11:12:35 - [app] app - [WARNING] WARNING - [WARN] Kiosk-Service nicht gefunden - Kiosk-Funktionen eventuell eingeschränkt
|
||||
2025-06-05 11:12:35 - [app] app - [INFO] INFO - [RESTART] Starte Datenbank-Setup und Migrationen...
|
||||
2025-06-05 11:12:37 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
|
||||
2025-06-05 11:12:38 - [app] app - [INFO] INFO - [OK] JobOrder-Tabelle bereits vorhanden
|
||||
2025-06-05 11:12:38 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
|
||||
2025-06-05 11:12:38 - [app] app - [INFO] INFO - [OK] Datenbank-Setup und Migrationen erfolgreich abgeschlossen
|
||||
2025-06-05 11:12:38 - [app] app - [INFO] INFO - [LIST] Standard-Konfiguration aktiv (keine Optimierungen)
|
||||
2025-06-05 11:12:38 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung...
|
||||
2025-06-05 11:12:38 - [app] app - [INFO] INFO - [INFO] Keine Drucker zur Initialisierung gefunden
|
||||
2025-06-05 11:12:38 - [app] app - [INFO] INFO - [RESTART] Debug-Modus: Queue Manager deaktiviert für Entwicklung
|
||||
2025-06-05 11:12:38 - [app] app - [INFO] INFO - Job-Scheduler gestartet
|
||||
2025-06-05 11:12:38 - [app] app - [INFO] INFO - 🔧 Starte Debug-Server auf 0.0.0.0:5000 (HTTP)
|
||||
2025-06-05 11:12:38 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert
|
||||
2025-06-05 11:13:02 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True
|
||||
2025-06-05 11:13:02 - [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 11:13:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
|
||||
2025-06-05 11:13:04 - [app] app - [INFO] INFO - Dashboard-Refresh angefordert von User 1
|
||||
2025-06-05 11:13:04 - [app] app - [ERROR] ERROR - Fehler beim Abrufen der Dashboard-Statistiken: tuple index out of range
|
||||
2025-06-05 11:13: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': 0, 'online_printers': 0, 'offline_printers': 0}
|
||||
2025-06-05 11:13: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 11:13:06 - [app] app - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich abgemeldet
|
||||
|
@ -1,3 +1,6 @@
|
||||
2025-06-04 23:36:08 - [auth] auth - [WARNING] WARNING - JSON-Parsing fehlgeschlagen: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
|
||||
2025-06-04 23:36:09 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich erfolgreich angemeldet
|
||||
2025-06-04 23:36:10 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 127.0.0.1
|
||||
2025-06-05 09:33:30 - [auth] auth - [WARNING] WARNING - JSON-Parsing fehlgeschlagen: 400 Bad Request: Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)
|
||||
2025-06-05 09:33:31 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich erfolgreich angemeldet
|
||||
2025-06-05 09:33:32 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 127.0.0.1
|
||||
|
@ -1,3 +1,6 @@
|
||||
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)
|
||||
2025-06-05 11:12:32 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||
|
@ -1 +1,2 @@
|
||||
2025-06-04 23:36:31 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00
|
||||
2025-06-05 11:12:52 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00
|
||||
|
@ -108,3 +108,15 @@ 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)
|
||||
2025-06-05 11:12:34 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||
2025-06-05 11:12:34 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||
2025-06-05 11:12:34 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
|
||||
2025-06-05 11:12:34 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
|
||||
|
@ -1,3 +1,6 @@
|
||||
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
|
||||
2025-06-05 11:12:32 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||
|
@ -0,0 +1,6 @@
|
||||
2025-06-05 09:32:19 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup...
|
||||
2025-06-05 09:32:19 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen...
|
||||
2025-06-05 09:32:19 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen...
|
||||
2025-06-05 10:14:01 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup...
|
||||
2025-06-05 10:14:01 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen...
|
||||
2025-06-05 10:14:01 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen...
|
@ -1,2 +1,5 @@
|
||||
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)
|
||||
2025-06-05 11:12:34 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||
|
@ -1,2 +1,169 @@
|
||||
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
|
||||
2025-06-05 11:12:35 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert
|
||||
2025-06-05 11:12:35 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet
|
||||
2025-06-05 11:12:35 - [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 11:12:35 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
|
||||
2025-06-05 11:12:39 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
|
||||
2025-06-05 11:12:39 - [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 11:12:39 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
|
||||
2025-06-05 11:12:41 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
|
||||
2025-06-05 11:12:41 - [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 11:12:41 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_service
|
||||
2025-06-05 11:12:45 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_service
|
||||
2025-06-05 11:12:45 - [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 11:12:45 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 3 Vorkommen in 300s
|
||||
2025-06-05 11:12:45 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
|
||||
2025-06-05 11:12:45 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
|
||||
2025-06-05 11:12:45 - [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 11:12:45 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 4 Vorkommen in 300s
|
||||
2025-06-05 11:12:45 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
|
||||
2025-06-05 11:12:45 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
|
||||
2025-06-05 11:12:45 - [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 11:12:45 - [error_recovery] error_recovery - [ERROR] ERROR - 🔥 Eskalation für flask_error: 5 Vorkommen in 300s
|
||||
2025-06-05 11:12:45 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: restart_system
|
||||
2025-06-05 11:12:45 - [error_recovery] error_recovery - [INFO] INFO - ✅ Recovery erfolgreich: restart_system
|
||||
|
@ -0,0 +1 @@
|
||||
2025-06-05 11:12:49 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1)
|
@ -2,3 +2,9 @@
|
||||
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
|
||||
2025-06-05 11:12:34 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||
2025-06-05 11:12:34 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||
|
@ -2,3 +2,9 @@
|
||||
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
|
||||
2025-06-05 11:12:34 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||
2025-06-05 11:12:34 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||
|
@ -7,3 +7,6 @@
|
||||
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
|
||||
2025-06-05 11:12:34 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||
|
@ -77,3 +77,91 @@
|
||||
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
|
||||
2025-06-05 11:12:32 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
|
||||
2025-06-05 11:12:32 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
|
||||
2025-06-05 11:13:02 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||
2025-06-05 11:13:02 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||
2025-06-05 11:13:02 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||
2025-06-05 11:13:02 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||
|
@ -25,3 +25,50 @@
|
||||
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
|
||||
2025-06-05 11:12:49 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 0 Drucker geladen (ohne Status-Check)
|
||||
2025-06-05 11:13:02 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
|
||||
2025-06-05 11:13:02 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker
|
||||
2025-06-05 11:13:02 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 25.19ms
|
||||
|
@ -12,3 +12,16 @@
|
||||
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
|
||||
2025-06-05 11:12:32 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
|
||||
2025-06-05 11:12:38 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
|
||||
2025-06-05 11:12:38 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
|
||||
|
@ -7,3 +7,6 @@
|
||||
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
|
||||
2025-06-05 11:12:34 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||
|
@ -4,3 +4,16 @@
|
||||
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...
|
||||
2025-06-05 11:12:34 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||
|
@ -79,3 +79,30 @@
|
||||
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 - ==================================================
|
||||
2025-06-05 11:12:34 - [startup] startup - [INFO] INFO - ==================================================
|
||||
2025-06-05 11:12:34 - [startup] startup - [INFO] INFO - [START] MYP Platform Backend wird gestartet...
|
||||
2025-06-05 11:12:34 - [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 11:12:34 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
|
||||
2025-06-05 11:12:34 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
|
||||
2025-06-05 11:12:34 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-05T11:12:34.706758
|
||||
2025-06-05 11:12:34 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
|
||||
2025-06-05 11:12:34 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
|
||||
2025-06-05 11:12:34 - [startup] startup - [INFO] INFO - ==================================================
|
||||
|
@ -1 +1,154 @@
|
||||
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...
|
||||
2025-06-05 11:12:35 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
|
||||
2025-06-05 11:12:39 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
|
||||
2025-06-05 11:12:41 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
|
||||
2025-06-05 11:12:44 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
|
||||
2025-06-05 11:12:44 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
|
||||
2025-06-05 11:12:45 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: service_restart in 5s
|
||||
2025-06-05 11:12:45 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
|
||||
2025-06-05 11:12:45 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
|
||||
2025-06-05 11:12:45 - [system_control] system_control - [INFO] INFO - 🕐 Operation geplant: restart in 60s
|
||||
2025-06-05 11:12:46 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
|
||||
2025-06-05 11:12:46 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
|
||||
2025-06-05 11:12:50 - [system_control] system_control - [INFO] INFO - ▶️ Führe Operation aus: service_restart
|
||||
2025-06-05 11:12:50 - [system_control] system_control - [INFO] INFO - 🔄 Services werden neugestartet...
|
||||
|
12
backend/logs/tapo_controller/tapo_controller.log
Normal file
@ -0,0 +1,12 @@
|
||||
2025-06-05 11:12:32 - [tapo_controller] tapo_controller - [INFO] INFO - ✅ tapo controller initialisiert
|
||||
2025-06-05 11:12:34 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 starte automatische tapo-steckdosenerkennung...
|
||||
2025-06-05 11:12:34 - [tapo_controller] tapo_controller - [INFO] INFO - 🔄 teste 6 standard-ips aus der konfiguration
|
||||
2025-06-05 11:12:34 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 1/6: 192.168.0.103
|
||||
2025-06-05 11:12:38 - [tapo_controller] tapo_controller - [INFO] INFO - 🚀 starte steckdosen-initialisierung...
|
||||
2025-06-05 11:12:38 - [tapo_controller] tapo_controller - [WARNING] WARNING - ⚠️ keine aktiven drucker zur initialisierung gefunden
|
||||
2025-06-05 11:12:40 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 2/6: 192.168.0.104
|
||||
2025-06-05 11:12:46 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 3/6: 192.168.0.100
|
||||
2025-06-05 11:12:52 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 4/6: 192.168.0.101
|
||||
2025-06-05 11:12:58 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 5/6: 192.168.0.102
|
||||
2025-06-05 11:13:04 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 6/6: 192.168.0.105
|
||||
2025-06-05 11:13:10 - [tapo_controller] tapo_controller - [INFO] INFO - ✅ steckdosen-erkennung abgeschlossen: 0/6 steckdosen gefunden in 36.7s
|
@ -38,3 +38,19 @@
|
||||
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
|
||||
2025-06-05 11:12:31 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
|
||||
2025-06-05 11:12:31 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
|
||||
2025-06-05 11:12:31 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
|
||||
2025-06-05 11:12:31 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
|
||||
|
83
backend/netzwerkdiagramm.mmd
Normal file
@ -0,0 +1,83 @@
|
||||
graph TB
|
||||
%% Stil-Definitionen
|
||||
classDef backend fill:#1e40af,stroke:#1e3a8a,color:#fff,stroke-width:3px
|
||||
classDef frontend fill:#10b981,stroke:#059669,color:#fff,stroke-width:3px
|
||||
classDef database fill:#f59e0b,stroke:#d97706,color:#fff,stroke-width:3px
|
||||
classDef hardware fill:#ef4444,stroke:#dc2626,color:#fff,stroke-width:3px
|
||||
classDef network fill:#8b5cf6,stroke:#7c3aed,color:#fff,stroke-width:3px
|
||||
classDef client fill:#06b6d4,stroke:#0891b2,color:#fff,stroke-width:3px
|
||||
classDef security fill:#e11d48,stroke:#be123c,color:#fff,stroke-width:3px
|
||||
classDef note fill:#f3f4f6,stroke:#d1d5db,color:#000,stroke-width:1px
|
||||
|
||||
%% Netzwerk-Infrastruktur
|
||||
subgraph MB["Mercedes-Benz Netzwerk"]
|
||||
subgraph LAN["Lokales WLAN 192.168.0.0/24"]
|
||||
%% Backend-Server
|
||||
BACKEND["Backend-Server<br/>Flask REST-API<br/>IP: 192.168.0.105<br/>Ports: 443, 8080<br/>HTTPS mit SSL"]:::backend
|
||||
|
||||
%% Frontend-Server
|
||||
FRONTEND["Frontend-Server<br/>Next.js PWA<br/>Domain: m040tbaraspi001<br/>Ports: 3000, 443<br/>HTTPS mit Mercedes SSL"]:::frontend
|
||||
|
||||
%% Datenbank
|
||||
DB[("SQLite-Datenbank<br/>WAL-Modus<br/>myp.db<br/>Optimiert für Pi")]:::database
|
||||
|
||||
%% Raspberry Pi Kiosk
|
||||
KIOSK["Raspberry Pi<br/>Kiosk-Modus<br/>Touch-Interface<br/>Offline-Betrieb"]:::client
|
||||
|
||||
%% Smart-Plug Netzwerk
|
||||
subgraph PLUGNET["Smart-Plug Netzwerk"]
|
||||
PLUG1["TP-Link Tapo P110<br/><strong>IP: 192.168.0.100</strong><br/>Drucker 1"]:::hardware
|
||||
PLUG2["TP-Link Tapo P110<br/><strong>IP: 192.168.0.101</strong><br/>Drucker 2"]:::hardware
|
||||
PLUG3["TP-Link Tapo P110<br/><strong>IP: 192.168.0.102</strong><br/>Drucker 3"]:::hardware
|
||||
PLUG4["TP-Link Tapo P110<br/><strong>IP: 192.168.0.103</strong><br/>Drucker 4"]:::hardware
|
||||
PLUG5["TP-Link Tapo P110<br/><strong>IP: 192.168.0.104</strong><br/>Drucker 5"]:::hardware
|
||||
PLUG6["TP-Link Tapo P110<br/><strong>IP: 192.168.0.106</strong><br/>Drucker 6"]:::hardware
|
||||
end
|
||||
|
||||
%% 3D-Drucker
|
||||
subgraph PRINTERS["3D-Drucker"]
|
||||
PRINTER1["<strong>3D-Drucker 1</strong><br/>Stromversorgung über Plug"]:::hardware
|
||||
PRINTER2["<strong>3D-Drucker 2</strong><br/>Stromversorgung über Plug"]:::hardware
|
||||
PRINTER3["<strong>3D-Drucker 3</strong><br/>Stromversorgung über Plug"]:::hardware
|
||||
PRINTER4["<strong>3D-Drucker 4</strong><br/>Stromversorgung über Plug"]:::hardware
|
||||
PRINTER5["<strong>3D-Drucker 5</strong><br/>Stromversorgung über Plug"]:::hardware
|
||||
PRINTER6["<strong>3D-Drucker 6</strong><br/>Stromversorgung über Plug"]:::hardware
|
||||
end
|
||||
end
|
||||
|
||||
%% Client-Systeme
|
||||
CLIENT1["<strong>Browser-Clients</strong><br/>Desktop/Mobile<br/>PWA-Support"]:::client
|
||||
CLIENT2["<strong>Admin-Dashboard</strong><br/>HTTPS-Zugriff"]:::client
|
||||
CLIENT3["<strong>Gast-Zugriff</strong><br/>OTP-Authentifizierung"]:::client
|
||||
end
|
||||
|
||||
%% Verbindungen - API-Kommunikation
|
||||
CLIENT1 -.->|"HTTPS/443"| FRONTEND
|
||||
CLIENT2 -.->|"HTTPS/443"| FRONTEND
|
||||
CLIENT3 -.->|"HTTPS/443"| FRONTEND
|
||||
FRONTEND -->|"REST-API<br/>HTTPS/443"| BACKEND
|
||||
KIOSK -->|"Local API"| BACKEND
|
||||
|
||||
%% Verbindungen - Datenbank
|
||||
BACKEND -->|"SQLAlchemy<br/>Thread-Pool"| DB
|
||||
|
||||
%% Verbindungen - Hardware-Steuerung
|
||||
BACKEND -->|"Tapo-API<br/>WLAN"| PLUG1
|
||||
BACKEND -->|"Tapo-API<br/>WLAN"| PLUG2
|
||||
BACKEND -->|"Tapo-API<br/>WLAN"| PLUG3
|
||||
BACKEND -->|"Tapo-API<br/>WLAN"| PLUG4
|
||||
BACKEND -->|"Tapo-API<br/>WLAN"| PLUG5
|
||||
BACKEND -->|"Tapo-API<br/>WLAN"| PLUG6
|
||||
|
||||
%% Verbindungen - Stromversorgung
|
||||
PLUG1 -.->|"230V AC"| PRINTER1
|
||||
PLUG2 -.->|"230V AC"| PRINTER2
|
||||
PLUG3 -.->|"230V AC"| PRINTER3
|
||||
PLUG4 -.->|"230V AC"| PRINTER4
|
||||
PLUG5 -.->|"230V AC"| PRINTER5
|
||||
PLUG6 -.->|"230V AC"| PRINTER6
|
||||
|
||||
%% Notizen
|
||||
subgraph INFO["System-Informationen"]
|
||||
NOTE1["<br/><strong>Scheduler-System:</strong><br/>Automatische Drucker-, Hintergrundaufgaben- und Zeitsteuerung"]:::note
|
||||
end
|
1
backend/netzwerkdiagramm.svg
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
backend/utils/__pycache__/tapo_controller.cpython-313.pyc
Normal 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()
|
||||
|
||||
|
@ -18,8 +18,9 @@ import os
|
||||
from models import get_db_session, Printer, PlugStatusLog
|
||||
from utils.logging_config import get_logger
|
||||
from utils.settings import PRINTERS, TAPO_USERNAME, TAPO_PASSWORD, DEFAULT_TAPO_IPS, TAPO_AUTO_DISCOVERY
|
||||
from utils.tapo_controller import tapo_controller
|
||||
|
||||
# TP-Link Tapo P110 Unterstützung hinzufügen
|
||||
# TP-Link Tapo P110 Unterstützung prüfen
|
||||
try:
|
||||
from PyP100 import PyP100
|
||||
TAPO_AVAILABLE = True
|
||||
@ -81,62 +82,10 @@ class PrinterMonitor:
|
||||
if self.startup_initialized:
|
||||
monitor_logger.info("🔄 Steckdosen bereits beim Start initialisiert")
|
||||
return {}
|
||||
|
||||
monitor_logger.info("🚀 Starte Steckdosen-Initialisierung beim Programmstart...")
|
||||
results = {}
|
||||
|
||||
try:
|
||||
db_session = get_db_session()
|
||||
printers = db_session.query(Printer).filter(Printer.active == True).all()
|
||||
|
||||
if not printers:
|
||||
monitor_logger.warning("⚠️ Keine aktiven Drucker zur Initialisierung gefunden")
|
||||
db_session.close()
|
||||
self.startup_initialized = True
|
||||
return results
|
||||
|
||||
# Alle Steckdosen ausschalten für einheitlichen Startzustand
|
||||
for printer in printers:
|
||||
try:
|
||||
if printer.plug_ip and printer.plug_username and printer.plug_password:
|
||||
success = self._turn_outlet_off(
|
||||
printer.plug_ip,
|
||||
printer.plug_username,
|
||||
printer.plug_password,
|
||||
printer_id=printer.id
|
||||
)
|
||||
|
||||
results[printer.name] = success
|
||||
|
||||
if success:
|
||||
monitor_logger.info(f"✅ {printer.name}: Steckdose ausgeschaltet")
|
||||
# Status in Datenbank aktualisieren
|
||||
printer.status = "offline"
|
||||
printer.last_checked = datetime.now()
|
||||
else:
|
||||
monitor_logger.warning(f"❌ {printer.name}: Steckdose konnte nicht ausgeschaltet werden")
|
||||
else:
|
||||
monitor_logger.warning(f"⚠️ {printer.name}: Unvollständige Steckdosen-Konfiguration")
|
||||
results[printer.name] = False
|
||||
|
||||
except Exception as e:
|
||||
monitor_logger.error(f"❌ Fehler bei Initialisierung von {printer.name}: {str(e)}")
|
||||
results[printer.name] = False
|
||||
|
||||
# Änderungen speichern
|
||||
db_session.commit()
|
||||
db_session.close()
|
||||
|
||||
success_count = sum(1 for success in results.values() if success)
|
||||
total_count = len(results)
|
||||
|
||||
monitor_logger.info(f"🎯 Steckdosen-Initialisierung abgeschlossen: {success_count}/{total_count} erfolgreich")
|
||||
self.startup_initialized = True
|
||||
|
||||
except Exception as e:
|
||||
monitor_logger.error(f"❌ Kritischer Fehler bei Steckdosen-Initialisierung: {str(e)}")
|
||||
results = {}
|
||||
|
||||
# Verwende zentrale tapo_controller Implementierung
|
||||
results = tapo_controller.initialize_all_outlets()
|
||||
self.startup_initialized = True
|
||||
return results
|
||||
|
||||
def _turn_outlet_off(self, ip_address: str, username: str, password: str, timeout: int = 5, printer_id: int = None) -> bool:
|
||||
@ -153,79 +102,8 @@ class PrinterMonitor:
|
||||
Returns:
|
||||
bool: True wenn erfolgreich ausgeschaltet
|
||||
"""
|
||||
if not TAPO_AVAILABLE:
|
||||
monitor_logger.error("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdose nicht schalten")
|
||||
# Logging: Fehlgeschlagener Versuch
|
||||
if printer_id:
|
||||
try:
|
||||
PlugStatusLog.log_status_change(
|
||||
printer_id=printer_id,
|
||||
status="disconnected",
|
||||
source="system",
|
||||
ip_address=ip_address,
|
||||
error_message="PyP100-Modul nicht verfügbar",
|
||||
notes="Startup-Initialisierung fehlgeschlagen"
|
||||
)
|
||||
except Exception as log_error:
|
||||
monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
|
||||
return False
|
||||
|
||||
# IMMER globale Anmeldedaten verwenden (da diese funktionieren)
|
||||
username = TAPO_USERNAME
|
||||
password = TAPO_PASSWORD
|
||||
monitor_logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip_address}")
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
try:
|
||||
# TP-Link Tapo P100 Verbindung herstellen (P100 statt P110)
|
||||
from PyP100 import PyP100
|
||||
p100 = PyP100.P100(ip_address, username, password)
|
||||
p100.handshake() # Authentifizierung
|
||||
p100.login() # Login
|
||||
|
||||
# Steckdose ausschalten
|
||||
p100.turnOff()
|
||||
|
||||
response_time = int((time.time() - start_time) * 1000) # in Millisekunden
|
||||
monitor_logger.debug(f"✅ Tapo-Steckdose {ip_address} erfolgreich ausgeschaltet")
|
||||
|
||||
# Logging: Erfolgreich ausgeschaltet
|
||||
if printer_id:
|
||||
try:
|
||||
PlugStatusLog.log_status_change(
|
||||
printer_id=printer_id,
|
||||
status="off",
|
||||
source="system",
|
||||
ip_address=ip_address,
|
||||
response_time_ms=response_time,
|
||||
notes="Startup-Initialisierung: Steckdose ausgeschaltet"
|
||||
)
|
||||
except Exception as log_error:
|
||||
monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
response_time = int((time.time() - start_time) * 1000) # in Millisekunden
|
||||
monitor_logger.debug(f"⚠️ Fehler beim Ausschalten der Tapo-Steckdose {ip_address}: {str(e)}")
|
||||
|
||||
# Logging: Fehlgeschlagener Versuch
|
||||
if printer_id:
|
||||
try:
|
||||
PlugStatusLog.log_status_change(
|
||||
printer_id=printer_id,
|
||||
status="disconnected",
|
||||
source="system",
|
||||
ip_address=ip_address,
|
||||
response_time_ms=response_time,
|
||||
error_message=str(e),
|
||||
notes="Startup-Initialisierung fehlgeschlagen"
|
||||
)
|
||||
except Exception as log_error:
|
||||
monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
|
||||
|
||||
return False
|
||||
# Verwende zentrale tapo_controller Implementierung
|
||||
return tapo_controller.turn_off(ip_address, username, password, printer_id)
|
||||
|
||||
def get_live_printer_status(self, use_session_cache: bool = True) -> Dict[int, Dict]:
|
||||
"""
|
||||
@ -448,41 +326,8 @@ class PrinterMonitor:
|
||||
Returns:
|
||||
bool: True wenn Verbindung erfolgreich
|
||||
"""
|
||||
try:
|
||||
# IP-Adresse validieren
|
||||
ipaddress.ip_address(ip_address.strip())
|
||||
|
||||
import socket
|
||||
|
||||
# Erst Port 9999 versuchen (Tapo-Standard)
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.settimeout(timeout)
|
||||
result = sock.connect_ex((ip_address.strip(), 9999))
|
||||
sock.close()
|
||||
|
||||
if result == 0:
|
||||
return True
|
||||
|
||||
# Falls Port 9999 nicht erfolgreich, Port 80 versuchen (HTTP)
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.settimeout(timeout)
|
||||
result = sock.connect_ex((ip_address.strip(), 80))
|
||||
sock.close()
|
||||
|
||||
if result == 0:
|
||||
return True
|
||||
|
||||
# Falls Port 80 nicht erfolgreich, Port 443 versuchen (HTTPS)
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.settimeout(timeout)
|
||||
result = sock.connect_ex((ip_address.strip(), 443))
|
||||
sock.close()
|
||||
|
||||
return result == 0
|
||||
|
||||
except Exception as e:
|
||||
monitor_logger.debug(f"❌ Fehler beim Verbindungstest zu {ip_address}: {str(e)}")
|
||||
return False
|
||||
# Verwende zentrale tapo_controller Implementierung
|
||||
return tapo_controller.ping_address(ip_address, timeout)
|
||||
|
||||
def _check_outlet_status(self, ip_address: str, username: str, password: str, timeout: int = 5, printer_id: int = None) -> Tuple[bool, str]:
|
||||
"""
|
||||
@ -498,111 +343,8 @@ class PrinterMonitor:
|
||||
Returns:
|
||||
Tuple[bool, str]: (Erreichbar, Status) - Status: "on", "off", "unknown"
|
||||
"""
|
||||
if not TAPO_AVAILABLE:
|
||||
monitor_logger.debug("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdosen-Status nicht abfragen")
|
||||
|
||||
# Logging: Modul nicht verfügbar
|
||||
if printer_id:
|
||||
try:
|
||||
PlugStatusLog.log_status_change(
|
||||
printer_id=printer_id,
|
||||
status="disconnected",
|
||||
source="system",
|
||||
ip_address=ip_address,
|
||||
error_message="PyP100-Modul nicht verfügbar",
|
||||
notes="Status-Check fehlgeschlagen"
|
||||
)
|
||||
except Exception as log_error:
|
||||
monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
|
||||
|
||||
return False, "unknown"
|
||||
|
||||
# IMMER globale Anmeldedaten verwenden (da diese funktionieren)
|
||||
username = TAPO_USERNAME
|
||||
password = TAPO_PASSWORD
|
||||
monitor_logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip_address}")
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
try:
|
||||
# TP-Link Tapo P100 Verbindung herstellen (P100 statt P110)
|
||||
from PyP100 import PyP100
|
||||
p100 = PyP100.P100(ip_address, username, password)
|
||||
p100.handshake() # Authentifizierung
|
||||
p100.login() # Login
|
||||
|
||||
# Geräteinformationen abrufen
|
||||
device_info = p100.getDeviceInfo()
|
||||
|
||||
# Status auswerten
|
||||
device_on = device_info.get('device_on', False)
|
||||
status = "on" if device_on else "off"
|
||||
|
||||
response_time = int((time.time() - start_time) * 1000) # in Millisekunden
|
||||
|
||||
monitor_logger.debug(f"✅ Tapo-Steckdose {ip_address}: Status = {status}")
|
||||
|
||||
# Logging: Erfolgreicher Status-Check
|
||||
if printer_id:
|
||||
try:
|
||||
# Hole zusätzliche Geräteinformationen falls verfügbar
|
||||
power_consumption = None
|
||||
voltage = None
|
||||
current = None
|
||||
firmware_version = None
|
||||
|
||||
try:
|
||||
# Versuche Energiedaten zu holen (P110 spezifisch)
|
||||
energy_usage = p100.getEnergyUsage()
|
||||
if energy_usage:
|
||||
power_consumption = energy_usage.get('current_power', None)
|
||||
voltage = energy_usage.get('voltage', None)
|
||||
current = energy_usage.get('current', None)
|
||||
except:
|
||||
pass # P100 unterstützt keine Energiedaten
|
||||
|
||||
try:
|
||||
firmware_version = device_info.get('fw_ver', None)
|
||||
except:
|
||||
pass
|
||||
|
||||
PlugStatusLog.log_status_change(
|
||||
printer_id=printer_id,
|
||||
status=status,
|
||||
source="system",
|
||||
ip_address=ip_address,
|
||||
power_consumption=power_consumption,
|
||||
voltage=voltage,
|
||||
current=current,
|
||||
response_time_ms=response_time,
|
||||
firmware_version=firmware_version,
|
||||
notes="Automatischer Status-Check"
|
||||
)
|
||||
except Exception as log_error:
|
||||
monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
|
||||
|
||||
return True, status
|
||||
|
||||
except Exception as e:
|
||||
response_time = int((time.time() - start_time) * 1000) # in Millisekunden
|
||||
monitor_logger.debug(f"⚠️ Fehler bei Tapo-Steckdosen-Status-Check {ip_address}: {str(e)}")
|
||||
|
||||
# Logging: Fehlgeschlagener Status-Check
|
||||
if printer_id:
|
||||
try:
|
||||
PlugStatusLog.log_status_change(
|
||||
printer_id=printer_id,
|
||||
status="disconnected",
|
||||
source="system",
|
||||
ip_address=ip_address,
|
||||
response_time_ms=response_time,
|
||||
error_message=str(e),
|
||||
notes="Status-Check fehlgeschlagen"
|
||||
)
|
||||
except Exception as log_error:
|
||||
monitor_logger.warning(f"Fehler beim Loggen des Steckdosen-Status: {log_error}")
|
||||
|
||||
return False, "unknown"
|
||||
# Verwende zentrale tapo_controller Implementierung
|
||||
return tapo_controller.check_outlet_status(ip_address, username, password, printer_id)
|
||||
|
||||
def clear_all_caches(self):
|
||||
"""Löscht alle Caches (Session und DB)."""
|
||||
@ -657,94 +399,10 @@ class PrinterMonitor:
|
||||
if self.auto_discovered_tapo:
|
||||
monitor_logger.info("🔍 Tapo-Steckdosen wurden bereits erkannt")
|
||||
return {}
|
||||
|
||||
monitor_logger.info("🔍 Starte automatische Tapo-Steckdosenerkennung...")
|
||||
results = {}
|
||||
start_time = time.time()
|
||||
|
||||
# 1. Zuerst die Standard-IPs aus der Konfiguration testen
|
||||
monitor_logger.info(f"🔄 Teste {len(DEFAULT_TAPO_IPS)} Standard-IPs aus der Konfiguration")
|
||||
|
||||
for i, ip in enumerate(DEFAULT_TAPO_IPS):
|
||||
try:
|
||||
# Fortschrittsmeldung
|
||||
monitor_logger.info(f"🔍 Teste IP {i+1}/{len(DEFAULT_TAPO_IPS)}: {ip}")
|
||||
|
||||
# Reduzierte Timeouts für schnellere Erkennung
|
||||
ping_success = self._ping_address(ip, timeout=2)
|
||||
|
||||
if ping_success:
|
||||
monitor_logger.info(f"✅ Steckdose mit IP {ip} ist erreichbar")
|
||||
|
||||
# Tapo-Verbindung testen mit Timeout-Schutz
|
||||
if TAPO_AVAILABLE:
|
||||
try:
|
||||
# Timeout für Tapo-Verbindung
|
||||
import signal
|
||||
|
||||
def timeout_handler(signum, frame):
|
||||
raise TimeoutError("Tapo-Verbindung Timeout")
|
||||
|
||||
# Nur unter Unix/Linux verfügbar
|
||||
if hasattr(signal, 'SIGALRM'):
|
||||
signal.signal(signal.SIGALRM, timeout_handler)
|
||||
signal.alarm(5) # 5 Sekunden Timeout
|
||||
|
||||
try:
|
||||
from PyP100 import PyP100
|
||||
p100 = PyP100.P100(ip, TAPO_USERNAME, TAPO_PASSWORD)
|
||||
p100.handshake()
|
||||
p100.login()
|
||||
device_info = p100.getDeviceInfo()
|
||||
|
||||
# Timeout zurücksetzen
|
||||
if hasattr(signal, 'SIGALRM'):
|
||||
signal.alarm(0)
|
||||
|
||||
# Steckdose gefunden und verbunden
|
||||
nickname = device_info.get('nickname', f"Tapo P110 ({ip})")
|
||||
state = "on" if device_info.get('device_on', False) else "off"
|
||||
|
||||
monitor_logger.info(f"✅ Tapo-Steckdose '{nickname}' ({ip}) gefunden - Status: {state}")
|
||||
results[ip] = True
|
||||
|
||||
# Steckdose in Datenbank speichern/aktualisieren (nicht-blockierend)
|
||||
try:
|
||||
self._ensure_tapo_in_database(ip, nickname)
|
||||
except Exception as db_error:
|
||||
monitor_logger.warning(f"⚠️ Fehler beim Speichern in DB für {ip}: {str(db_error)}")
|
||||
|
||||
except (TimeoutError, Exception) as tapo_error:
|
||||
if hasattr(signal, 'SIGALRM'):
|
||||
signal.alarm(0) # Timeout zurücksetzen
|
||||
monitor_logger.debug(f"❌ IP {ip} ist erreichbar, aber keine Tapo-Steckdose oder Timeout: {str(tapo_error)}")
|
||||
results[ip] = False
|
||||
|
||||
except Exception as outer_error:
|
||||
monitor_logger.debug(f"❌ Fehler bei Tapo-Test für {ip}: {str(outer_error)}")
|
||||
results[ip] = False
|
||||
else:
|
||||
monitor_logger.warning("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Verbindung nicht testen")
|
||||
results[ip] = False
|
||||
else:
|
||||
monitor_logger.debug(f"❌ IP {ip} nicht erreichbar")
|
||||
results[ip] = False
|
||||
|
||||
except Exception as e:
|
||||
monitor_logger.warning(f"❌ Fehler bei Steckdosen-Erkennung für IP {ip}: {str(e)}")
|
||||
results[ip] = False
|
||||
# Weiter mit nächster IP - nicht abbrechen
|
||||
continue
|
||||
|
||||
# Erfolgsstatistik berechnen
|
||||
success_count = sum(1 for success in results.values() if success)
|
||||
elapsed_time = time.time() - start_time
|
||||
|
||||
monitor_logger.info(f"✅ Steckdosen-Erkennung abgeschlossen: {success_count}/{len(results)} Steckdosen gefunden in {elapsed_time:.1f}s")
|
||||
|
||||
# Markieren, dass automatische Erkennung durchgeführt wurde
|
||||
# Verwende zentrale tapo_controller Implementierung
|
||||
results = tapo_controller.auto_discover_outlets()
|
||||
self.auto_discovered_tapo = True
|
||||
|
||||
return results
|
||||
|
||||
def _ensure_tapo_in_database(self, ip_address: str, nickname: str = None) -> bool:
|
||||
@ -758,67 +416,8 @@ class PrinterMonitor:
|
||||
Returns:
|
||||
bool: True wenn erfolgreich in Datenbank gespeichert/aktualisiert
|
||||
"""
|
||||
try:
|
||||
db_session = get_db_session()
|
||||
|
||||
# Prüfen, ob Drucker mit dieser IP bereits existiert
|
||||
existing_printer = db_session.query(Printer).filter(Printer.plug_ip == ip_address).first()
|
||||
|
||||
if existing_printer:
|
||||
# Drucker aktualisieren, falls nötig
|
||||
if not existing_printer.plug_username or not existing_printer.plug_password:
|
||||
existing_printer.plug_username = TAPO_USERNAME
|
||||
existing_printer.plug_password = TAPO_PASSWORD
|
||||
monitor_logger.info(f"✅ Drucker {existing_printer.name} mit Tapo-Anmeldedaten aktualisiert")
|
||||
|
||||
if nickname and existing_printer.name != nickname and "Tapo P110" not in existing_printer.name:
|
||||
old_name = existing_printer.name
|
||||
existing_printer.name = nickname
|
||||
monitor_logger.info(f"✅ Drucker {old_name} umbenannt zu {nickname}")
|
||||
|
||||
# Drucker als aktiv markieren, da Tapo-Steckdose gefunden wurde
|
||||
if not existing_printer.active:
|
||||
existing_printer.active = True
|
||||
monitor_logger.info(f"✅ Drucker {existing_printer.name} als aktiv markiert")
|
||||
|
||||
# Status aktualisieren
|
||||
existing_printer.last_checked = datetime.now()
|
||||
db_session.commit()
|
||||
db_session.close()
|
||||
return True
|
||||
else:
|
||||
# Neuen Drucker erstellen, falls keiner existiert
|
||||
printer_name = nickname or f"Tapo P110 ({ip_address})"
|
||||
mac_address = f"tapo:{ip_address.replace('.', '-')}" # Pseudo-MAC-Adresse
|
||||
|
||||
new_printer = Printer(
|
||||
name=printer_name,
|
||||
model="TP-Link Tapo P110",
|
||||
location="Automatisch erkannt",
|
||||
ip_address=ip_address, # Drucker-IP setzen wir gleich Steckdosen-IP
|
||||
mac_address=mac_address,
|
||||
plug_ip=ip_address,
|
||||
plug_username=TAPO_USERNAME,
|
||||
plug_password=TAPO_PASSWORD,
|
||||
status="offline",
|
||||
active=True,
|
||||
last_checked=datetime.now()
|
||||
)
|
||||
|
||||
db_session.add(new_printer)
|
||||
db_session.commit()
|
||||
monitor_logger.info(f"✅ Neuer Drucker '{printer_name}' mit Tapo-Steckdose {ip_address} erstellt")
|
||||
db_session.close()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
monitor_logger.error(f"❌ Fehler beim Speichern der Tapo-Steckdose {ip_address}: {str(e)}")
|
||||
try:
|
||||
db_session.rollback()
|
||||
db_session.close()
|
||||
except:
|
||||
pass
|
||||
return False
|
||||
# Verwende zentrale tapo_controller Implementierung
|
||||
return tapo_controller._ensure_outlet_in_database(ip_address, nickname)
|
||||
|
||||
# Globale Instanz
|
||||
printer_monitor = PrinterMonitor()
|
655
backend/utils/tapo_controller.py
Normal file
@ -0,0 +1,655 @@
|
||||
"""
|
||||
tp-link tapo p110 zentraler controller für myp platform
|
||||
sammelt alle operativen tapo-steckdosen-funktionalitäten an einem ort.
|
||||
"""
|
||||
|
||||
import time
|
||||
import socket
|
||||
import signal
|
||||
import ipaddress
|
||||
from datetime import datetime
|
||||
from typing import Dict, Tuple, Optional, List, Any
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
|
||||
from models import get_db_session, Printer, PlugStatusLog
|
||||
from utils.logging_config import get_logger
|
||||
from utils.settings import TAPO_USERNAME, TAPO_PASSWORD, DEFAULT_TAPO_IPS, TAPO_TIMEOUT, TAPO_RETRY_COUNT
|
||||
|
||||
# tp-link tapo p110 unterstützung prüfen
|
||||
try:
|
||||
from PyP100 import PyP100
|
||||
TAPO_AVAILABLE = True
|
||||
except ImportError:
|
||||
TAPO_AVAILABLE = False
|
||||
|
||||
# logger initialisieren
|
||||
logger = get_logger("tapo_controller")
|
||||
|
||||
|
||||
class TapoController:
|
||||
"""
|
||||
zentraler controller für alle tp-link tapo p110 operationen.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
"""initialisiere den tapo controller."""
|
||||
self.username = TAPO_USERNAME
|
||||
self.password = TAPO_PASSWORD
|
||||
self.timeout = TAPO_TIMEOUT
|
||||
self.retry_count = TAPO_RETRY_COUNT
|
||||
self.auto_discovered = False
|
||||
|
||||
if not TAPO_AVAILABLE:
|
||||
logger.error("❌ PyP100-modul nicht installiert - tapo-funktionalität eingeschränkt")
|
||||
else:
|
||||
logger.info("✅ tapo controller initialisiert")
|
||||
|
||||
def toggle_plug(self, ip: str, state: bool, username: str = None, password: str = None) -> bool:
|
||||
"""
|
||||
schaltet eine tp-link tapo p100/p110-steckdose ein oder aus.
|
||||
|
||||
args:
|
||||
ip: ip-adresse der steckdose
|
||||
state: true = ein, false = aus
|
||||
username: benutzername (optional, nutzt standard wenn nicht angegeben)
|
||||
password: passwort (optional, nutzt standard wenn nicht angegeben)
|
||||
|
||||
returns:
|
||||
bool: true wenn erfolgreich geschaltet
|
||||
"""
|
||||
if not TAPO_AVAILABLE:
|
||||
logger.error("❌ PyP100-modul nicht installiert - steckdose kann nicht geschaltet werden")
|
||||
return False
|
||||
|
||||
# immer globale anmeldedaten verwenden
|
||||
username = self.username
|
||||
password = self.password
|
||||
|
||||
logger.debug(f"🔧 verwende globale tapo-anmeldedaten für {ip}")
|
||||
|
||||
for attempt in range(self.retry_count):
|
||||
try:
|
||||
# p100-verbindung herstellen
|
||||
p100 = PyP100.P100(ip, username, password)
|
||||
p100.handshake()
|
||||
p100.login()
|
||||
|
||||
# steckdose schalten
|
||||
if state:
|
||||
p100.turnOn()
|
||||
logger.info(f"✅ tapo-steckdose {ip} erfolgreich eingeschaltet")
|
||||
else:
|
||||
p100.turnOff()
|
||||
logger.info(f"✅ tapo-steckdose {ip} erfolgreich ausgeschaltet")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
action = "ein" if state else "aus"
|
||||
logger.warning(f"⚠️ versuch {attempt+1}/{self.retry_count} fehlgeschlagen beim {action}schalten von {ip}: {str(e)}")
|
||||
|
||||
if attempt < self.retry_count - 1:
|
||||
time.sleep(1) # kurze pause vor erneutem versuch
|
||||
else:
|
||||
logger.error(f"❌ fehler beim {action}schalten der tapo-steckdose {ip}: {str(e)}")
|
||||
|
||||
return False
|
||||
|
||||
def turn_off(self, ip: str, username: str = None, password: str = None, printer_id: int = None) -> bool:
|
||||
"""
|
||||
schaltet eine tp-link tapo p110-steckdose aus.
|
||||
|
||||
args:
|
||||
ip: ip-adresse der steckdose
|
||||
username: benutzername (optional)
|
||||
password: passwort (optional)
|
||||
printer_id: id des zugehörigen druckers für logging (optional)
|
||||
|
||||
returns:
|
||||
bool: true wenn erfolgreich ausgeschaltet
|
||||
"""
|
||||
if not TAPO_AVAILABLE:
|
||||
logger.error("⚠️ PyP100-modul nicht verfügbar - kann tapo-steckdose nicht schalten")
|
||||
self._log_plug_status(printer_id, "disconnected", ip, error_message="PyP100-modul nicht verfügbar")
|
||||
return False
|
||||
|
||||
# immer globale anmeldedaten verwenden
|
||||
username = self.username
|
||||
password = self.password
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
try:
|
||||
# tp-link tapo p100 verbindung herstellen
|
||||
p100 = PyP100.P100(ip, username, password)
|
||||
p100.handshake()
|
||||
p100.login()
|
||||
|
||||
# steckdose ausschalten
|
||||
p100.turnOff()
|
||||
|
||||
response_time = int((time.time() - start_time) * 1000) # in millisekunden
|
||||
logger.debug(f"✅ tapo-steckdose {ip} erfolgreich ausgeschaltet")
|
||||
|
||||
# logging: erfolgreich ausgeschaltet
|
||||
self._log_plug_status(printer_id, "off", ip, response_time_ms=response_time)
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
response_time = int((time.time() - start_time) * 1000)
|
||||
logger.debug(f"⚠️ fehler beim ausschalten der tapo-steckdose {ip}: {str(e)}")
|
||||
|
||||
# logging: fehlgeschlagener versuch
|
||||
self._log_plug_status(printer_id, "disconnected", ip,
|
||||
response_time_ms=response_time,
|
||||
error_message=str(e))
|
||||
|
||||
return False
|
||||
|
||||
def check_outlet_status(self, ip: str, username: str = None, password: str = None,
|
||||
printer_id: int = None) -> Tuple[bool, str]:
|
||||
"""
|
||||
überprüft den status einer tp-link tapo p110-steckdose.
|
||||
|
||||
args:
|
||||
ip: ip-adresse der steckdose
|
||||
username: benutzername (optional)
|
||||
password: passwort (optional)
|
||||
printer_id: id des zugehörigen druckers für logging (optional)
|
||||
|
||||
returns:
|
||||
tuple[bool, str]: (erreichbar, status) - status: "on", "off", "unknown"
|
||||
"""
|
||||
if not TAPO_AVAILABLE:
|
||||
logger.debug("⚠️ PyP100-modul nicht verfügbar - kann tapo-steckdosen-status nicht abfragen")
|
||||
self._log_plug_status(printer_id, "disconnected", ip,
|
||||
error_message="PyP100-modul nicht verfügbar",
|
||||
notes="status-check fehlgeschlagen")
|
||||
return False, "unknown"
|
||||
|
||||
# immer globale anmeldedaten verwenden
|
||||
username = self.username
|
||||
password = self.password
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
try:
|
||||
# tp-link tapo p100 verbindung herstellen
|
||||
p100 = PyP100.P100(ip, username, password)
|
||||
p100.handshake()
|
||||
p100.login()
|
||||
|
||||
# geräteinformationen abrufen
|
||||
device_info = p100.getDeviceInfo()
|
||||
|
||||
# status auswerten
|
||||
device_on = device_info.get('device_on', False)
|
||||
status = "on" if device_on else "off"
|
||||
|
||||
response_time = int((time.time() - start_time) * 1000)
|
||||
logger.debug(f"✅ tapo-steckdose {ip}: status = {status}")
|
||||
|
||||
# erweiterte informationen sammeln
|
||||
extra_info = self._collect_device_info(p100, device_info)
|
||||
|
||||
# logging: erfolgreicher status-check
|
||||
self._log_plug_status(printer_id, status, ip,
|
||||
response_time_ms=response_time,
|
||||
power_consumption=extra_info.get('power_consumption'),
|
||||
voltage=extra_info.get('voltage'),
|
||||
current=extra_info.get('current'),
|
||||
firmware_version=extra_info.get('firmware_version'),
|
||||
notes="automatischer status-check")
|
||||
|
||||
return True, status
|
||||
|
||||
except Exception as e:
|
||||
response_time = int((time.time() - start_time) * 1000)
|
||||
logger.debug(f"⚠️ fehler bei tapo-steckdosen-status-check {ip}: {str(e)}")
|
||||
|
||||
# logging: fehlgeschlagener status-check
|
||||
self._log_plug_status(printer_id, "disconnected", ip,
|
||||
response_time_ms=response_time,
|
||||
error_message=str(e),
|
||||
notes="status-check fehlgeschlagen")
|
||||
|
||||
return False, "unknown"
|
||||
|
||||
def test_connection(self, ip: str, username: str = None, password: str = None) -> dict:
|
||||
"""
|
||||
testet die verbindung zu einer tp-link tapo p110-steckdose.
|
||||
|
||||
args:
|
||||
ip: ip-adresse der steckdose
|
||||
username: benutzername (optional)
|
||||
password: passwort (optional)
|
||||
|
||||
returns:
|
||||
dict: ergebnis mit status und informationen
|
||||
"""
|
||||
result = {
|
||||
"success": False,
|
||||
"message": "",
|
||||
"device_info": None,
|
||||
"error": None
|
||||
}
|
||||
|
||||
if not TAPO_AVAILABLE:
|
||||
result["message"] = "PyP100-modul nicht verfügbar"
|
||||
result["error"] = "ModuleNotFound"
|
||||
logger.error("PyP100-modul nicht verfügbar - kann tapo-steckdosen nicht testen")
|
||||
return result
|
||||
|
||||
# verwende globale anmeldedaten falls nicht angegeben
|
||||
if not username or not password:
|
||||
username = self.username
|
||||
password = self.password
|
||||
logger.debug(f"verwende globale tapo-anmeldedaten für {ip}")
|
||||
|
||||
try:
|
||||
# tp-link tapo p100 verbindung herstellen
|
||||
p100 = PyP100.P100(ip, username, password)
|
||||
p100.handshake()
|
||||
p100.login()
|
||||
|
||||
# geräteinformationen abrufen
|
||||
device_info = p100.getDeviceInfo()
|
||||
|
||||
result["success"] = True
|
||||
result["message"] = "verbindung erfolgreich"
|
||||
result["device_info"] = device_info
|
||||
|
||||
logger.info(f"tapo-verbindung zu {ip} erfolgreich: {device_info.get('nickname', 'unbekannt')}")
|
||||
|
||||
except Exception as e:
|
||||
result["success"] = False
|
||||
result["message"] = f"verbindungsfehler: {str(e)}"
|
||||
result["error"] = str(e)
|
||||
logger.error(f"fehler bei tapo-test zu {ip}: {str(e)}")
|
||||
|
||||
return result
|
||||
|
||||
def ping_address(self, ip: str, timeout: int = 3) -> bool:
|
||||
"""
|
||||
führt einen konnektivitätstest zu einer ip-adresse durch.
|
||||
verwendet tcp-verbindung statt ping für bessere kompatibilität.
|
||||
|
||||
args:
|
||||
ip: zu testende ip-adresse
|
||||
timeout: timeout in sekunden
|
||||
|
||||
returns:
|
||||
bool: true wenn verbindung erfolgreich
|
||||
"""
|
||||
try:
|
||||
# ip-adresse validieren
|
||||
ipaddress.ip_address(ip.strip())
|
||||
|
||||
# standard-ports für tapo-steckdosen testen
|
||||
test_ports = [9999, 80, 443] # tapo-standard, http, https
|
||||
|
||||
for port in test_ports:
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.settimeout(timeout)
|
||||
result = sock.connect_ex((ip.strip(), port))
|
||||
sock.close()
|
||||
|
||||
if result == 0:
|
||||
logger.debug(f"✅ verbindung zu {ip}:{port} erfolgreich")
|
||||
return True
|
||||
|
||||
logger.debug(f"❌ keine verbindung zu {ip} auf standard-ports möglich")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
logger.debug(f"❌ fehler beim verbindungstest zu {ip}: {str(e)}")
|
||||
return False
|
||||
|
||||
def auto_discover_outlets(self) -> Dict[str, bool]:
|
||||
"""
|
||||
automatische erkennung und konfiguration von tp-link tapo p110-steckdosen im netzwerk.
|
||||
|
||||
returns:
|
||||
dict[str, bool]: ergebnis der steckdosenerkennung mit ip als schlüssel
|
||||
"""
|
||||
if self.auto_discovered:
|
||||
logger.info("🔍 tapo-steckdosen wurden bereits erkannt")
|
||||
return {}
|
||||
|
||||
logger.info("🔍 starte automatische tapo-steckdosenerkennung...")
|
||||
results = {}
|
||||
start_time = time.time()
|
||||
|
||||
# standard-ips aus der konfiguration testen
|
||||
logger.info(f"🔄 teste {len(DEFAULT_TAPO_IPS)} standard-ips aus der konfiguration")
|
||||
|
||||
for i, ip in enumerate(DEFAULT_TAPO_IPS):
|
||||
try:
|
||||
logger.info(f"🔍 teste ip {i+1}/{len(DEFAULT_TAPO_IPS)}: {ip}")
|
||||
|
||||
# schneller ping-test
|
||||
if self.ping_address(ip, timeout=2):
|
||||
logger.info(f"✅ steckdose mit ip {ip} ist erreichbar")
|
||||
|
||||
# tapo-verbindung testen
|
||||
test_result = self.test_connection(ip)
|
||||
|
||||
if test_result["success"]:
|
||||
device_info = test_result["device_info"]
|
||||
nickname = device_info.get('nickname', f"tapo p110 ({ip})")
|
||||
state = "on" if device_info.get('device_on', False) else "off"
|
||||
|
||||
logger.info(f"✅ tapo-steckdose '{nickname}' ({ip}) gefunden - status: {state}")
|
||||
results[ip] = True
|
||||
|
||||
# steckdose in datenbank speichern/aktualisieren
|
||||
try:
|
||||
self._ensure_outlet_in_database(ip, nickname)
|
||||
except Exception as db_error:
|
||||
logger.warning(f"⚠️ fehler beim speichern in db für {ip}: {str(db_error)}")
|
||||
else:
|
||||
logger.debug(f"❌ ip {ip} ist erreichbar, aber keine tapo-steckdose")
|
||||
results[ip] = False
|
||||
else:
|
||||
logger.debug(f"❌ ip {ip} nicht erreichbar")
|
||||
results[ip] = False
|
||||
|
||||
except Exception as e:
|
||||
logger.warning(f"❌ fehler bei steckdosen-erkennung für ip {ip}: {str(e)}")
|
||||
results[ip] = False
|
||||
continue
|
||||
|
||||
# erfolgsstatistik
|
||||
success_count = sum(1 for success in results.values() if success)
|
||||
elapsed_time = time.time() - start_time
|
||||
|
||||
logger.info(f"✅ steckdosen-erkennung abgeschlossen: {success_count}/{len(results)} steckdosen gefunden in {elapsed_time:.1f}s")
|
||||
|
||||
self.auto_discovered = True
|
||||
return results
|
||||
|
||||
def initialize_all_outlets(self) -> Dict[str, bool]:
|
||||
"""
|
||||
schaltet alle gespeicherten steckdosen aus (einheitlicher startzustand).
|
||||
|
||||
returns:
|
||||
dict[str, bool]: ergebnis der initialisierung pro drucker
|
||||
"""
|
||||
logger.info("🚀 starte steckdosen-initialisierung...")
|
||||
results = {}
|
||||
|
||||
try:
|
||||
db_session = get_db_session()
|
||||
printers = db_session.query(Printer).filter(Printer.active == True).all()
|
||||
|
||||
if not printers:
|
||||
logger.warning("⚠️ keine aktiven drucker zur initialisierung gefunden")
|
||||
db_session.close()
|
||||
return results
|
||||
|
||||
# alle steckdosen ausschalten
|
||||
for printer in printers:
|
||||
try:
|
||||
if printer.plug_ip:
|
||||
success = self.turn_off(
|
||||
printer.plug_ip,
|
||||
printer_id=printer.id
|
||||
)
|
||||
|
||||
results[printer.name] = success
|
||||
|
||||
if success:
|
||||
logger.info(f"✅ {printer.name}: steckdose ausgeschaltet")
|
||||
printer.status = "offline"
|
||||
printer.last_checked = datetime.now()
|
||||
else:
|
||||
logger.warning(f"❌ {printer.name}: steckdose konnte nicht ausgeschaltet werden")
|
||||
else:
|
||||
logger.warning(f"⚠️ {printer.name}: keine steckdosen-ip konfiguriert")
|
||||
results[printer.name] = False
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ fehler bei initialisierung von {printer.name}: {str(e)}")
|
||||
results[printer.name] = False
|
||||
|
||||
# änderungen speichern
|
||||
db_session.commit()
|
||||
db_session.close()
|
||||
|
||||
success_count = sum(1 for success in results.values() if success)
|
||||
total_count = len(results)
|
||||
|
||||
logger.info(f"🎯 steckdosen-initialisierung abgeschlossen: {success_count}/{total_count} erfolgreich")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ kritischer fehler bei steckdosen-initialisierung: {str(e)}")
|
||||
|
||||
return results
|
||||
|
||||
def get_all_outlet_status(self) -> Dict[str, Dict[str, Any]]:
|
||||
"""
|
||||
holt den status aller konfigurierten tapo-steckdosen.
|
||||
|
||||
returns:
|
||||
dict[str, dict]: status aller steckdosen mit ip als schlüssel
|
||||
"""
|
||||
status_dict = {}
|
||||
|
||||
try:
|
||||
db_session = get_db_session()
|
||||
printers = db_session.query(Printer).filter(
|
||||
Printer.active == True,
|
||||
Printer.plug_ip.isnot(None)
|
||||
).all()
|
||||
|
||||
if not printers:
|
||||
logger.info("ℹ️ keine drucker mit tapo-steckdosen konfiguriert")
|
||||
db_session.close()
|
||||
return status_dict
|
||||
|
||||
logger.info(f"🔍 prüfe status von {len(printers)} tapo-steckdosen...")
|
||||
|
||||
# parallel-status-prüfung
|
||||
with ThreadPoolExecutor(max_workers=min(len(printers), 8)) as executor:
|
||||
future_to_printer = {
|
||||
executor.submit(
|
||||
self.check_outlet_status,
|
||||
printer.plug_ip,
|
||||
printer_id=printer.id
|
||||
): printer
|
||||
for printer in printers
|
||||
}
|
||||
|
||||
for future in as_completed(future_to_printer, timeout=15):
|
||||
printer = future_to_printer[future]
|
||||
try:
|
||||
reachable, status = future.result()
|
||||
status_dict[printer.plug_ip] = {
|
||||
"printer_name": printer.name,
|
||||
"printer_id": printer.id,
|
||||
"reachable": reachable,
|
||||
"status": status,
|
||||
"ip": printer.plug_ip,
|
||||
"last_checked": datetime.now().isoformat()
|
||||
}
|
||||
except Exception as e:
|
||||
logger.error(f"❌ fehler bei status-check für {printer.name}: {str(e)}")
|
||||
status_dict[printer.plug_ip] = {
|
||||
"printer_name": printer.name,
|
||||
"printer_id": printer.id,
|
||||
"reachable": False,
|
||||
"status": "error",
|
||||
"ip": printer.plug_ip,
|
||||
"error": str(e),
|
||||
"last_checked": datetime.now().isoformat()
|
||||
}
|
||||
|
||||
db_session.close()
|
||||
logger.info(f"✅ status-update abgeschlossen für {len(status_dict)} steckdosen")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ kritischer fehler beim abrufen des steckdosen-status: {str(e)}")
|
||||
|
||||
return status_dict
|
||||
|
||||
def _collect_device_info(self, p100: PyP100.P100, device_info: dict) -> dict:
|
||||
"""
|
||||
sammelt erweiterte geräteinformationen von der tapo-steckdose.
|
||||
|
||||
args:
|
||||
p100: pyp100-instanz
|
||||
device_info: basis-geräteinformationen
|
||||
|
||||
returns:
|
||||
dict: erweiterte informationen
|
||||
"""
|
||||
extra_info = {}
|
||||
|
||||
try:
|
||||
# firmware-version
|
||||
extra_info['firmware_version'] = device_info.get('fw_ver', None)
|
||||
|
||||
# versuche energiedaten zu holen (nur p110)
|
||||
try:
|
||||
energy_usage = p100.getEnergyUsage()
|
||||
if energy_usage:
|
||||
extra_info['power_consumption'] = energy_usage.get('current_power', None)
|
||||
extra_info['voltage'] = energy_usage.get('voltage', None)
|
||||
extra_info['current'] = energy_usage.get('current', None)
|
||||
except:
|
||||
pass # p100 unterstützt keine energiedaten
|
||||
|
||||
except Exception as e:
|
||||
logger.debug(f"fehler beim sammeln erweiterter geräteinformationen: {str(e)}")
|
||||
|
||||
return extra_info
|
||||
|
||||
def _log_plug_status(self, printer_id: int, status: str, ip_address: str, **kwargs):
|
||||
"""
|
||||
protokolliert steckdosen-status in der datenbank.
|
||||
|
||||
args:
|
||||
printer_id: id des druckers
|
||||
status: status der steckdose
|
||||
ip_address: ip-adresse der steckdose
|
||||
**kwargs: zusätzliche parameter für das logging
|
||||
"""
|
||||
if not printer_id:
|
||||
return
|
||||
|
||||
try:
|
||||
PlugStatusLog.log_status_change(
|
||||
printer_id=printer_id,
|
||||
status=status,
|
||||
source="system",
|
||||
ip_address=ip_address,
|
||||
**kwargs
|
||||
)
|
||||
except Exception as e:
|
||||
logger.warning(f"fehler beim loggen des steckdosen-status: {e}")
|
||||
|
||||
def _ensure_outlet_in_database(self, ip_address: str, nickname: str = None) -> bool:
|
||||
"""
|
||||
stellt sicher, dass eine erkannte tapo-steckdose in der datenbank existiert.
|
||||
|
||||
args:
|
||||
ip_address: ip-adresse der steckdose
|
||||
nickname: name der steckdose (optional)
|
||||
|
||||
returns:
|
||||
bool: true wenn erfolgreich gespeichert/aktualisiert
|
||||
"""
|
||||
try:
|
||||
db_session = get_db_session()
|
||||
|
||||
# prüfen, ob drucker mit dieser ip bereits existiert
|
||||
existing_printer = db_session.query(Printer).filter(
|
||||
Printer.plug_ip == ip_address
|
||||
).first()
|
||||
|
||||
if existing_printer:
|
||||
# drucker aktualisieren
|
||||
if not existing_printer.plug_username or not existing_printer.plug_password:
|
||||
existing_printer.plug_username = self.username
|
||||
existing_printer.plug_password = self.password
|
||||
logger.info(f"✅ drucker {existing_printer.name} mit tapo-anmeldedaten aktualisiert")
|
||||
|
||||
if nickname and existing_printer.name != nickname and "Tapo P110" not in existing_printer.name:
|
||||
old_name = existing_printer.name
|
||||
existing_printer.name = nickname
|
||||
logger.info(f"✅ drucker {old_name} umbenannt zu {nickname}")
|
||||
|
||||
# drucker als aktiv markieren
|
||||
if not existing_printer.active:
|
||||
existing_printer.active = True
|
||||
logger.info(f"✅ drucker {existing_printer.name} als aktiv markiert")
|
||||
|
||||
existing_printer.last_checked = datetime.now()
|
||||
db_session.commit()
|
||||
db_session.close()
|
||||
return True
|
||||
else:
|
||||
# neuen drucker erstellen
|
||||
printer_name = nickname or f"tapo p110 ({ip_address})"
|
||||
mac_address = f"tapo:{ip_address.replace('.', '-')}"
|
||||
|
||||
new_printer = Printer(
|
||||
name=printer_name,
|
||||
model="TP-Link Tapo P110",
|
||||
location="automatisch erkannt",
|
||||
ip_address=ip_address,
|
||||
mac_address=mac_address,
|
||||
plug_ip=ip_address,
|
||||
plug_username=self.username,
|
||||
plug_password=self.password,
|
||||
status="offline",
|
||||
active=True,
|
||||
last_checked=datetime.now()
|
||||
)
|
||||
|
||||
db_session.add(new_printer)
|
||||
db_session.commit()
|
||||
logger.info(f"✅ neuer drucker '{printer_name}' mit tapo-steckdose {ip_address} erstellt")
|
||||
db_session.close()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ fehler beim speichern der tapo-steckdose {ip_address}: {str(e)}")
|
||||
try:
|
||||
db_session.rollback()
|
||||
db_session.close()
|
||||
except:
|
||||
pass
|
||||
return False
|
||||
|
||||
|
||||
# globale instanz für einfachen zugriff
|
||||
tapo_controller = TapoController()
|
||||
|
||||
|
||||
# convenience-funktionen für rückwärtskompatibilität
|
||||
def toggle_plug(ip: str, state: bool, username: str = None, password: str = None) -> bool:
|
||||
"""schaltet eine tapo-steckdose ein/aus."""
|
||||
return tapo_controller.toggle_plug(ip, state, username, password)
|
||||
|
||||
|
||||
def test_tapo_connection(ip: str, username: str = None, password: str = None) -> dict:
|
||||
"""testet die verbindung zu einer tapo-steckdose."""
|
||||
return tapo_controller.test_connection(ip, username, password)
|
||||
|
||||
|
||||
def check_outlet_status(ip: str, username: str = None, password: str = None,
|
||||
printer_id: int = None) -> Tuple[bool, str]:
|
||||
"""prüft den status einer tapo-steckdose."""
|
||||
return tapo_controller.check_outlet_status(ip, username, password, printer_id)
|
||||
|
||||
|
||||
def auto_discover_tapo_outlets() -> Dict[str, bool]:
|
||||
"""führt automatische erkennung von tapo-steckdosen durch."""
|
||||
return tapo_controller.auto_discover_outlets()
|
||||
|
||||
|
||||
def initialize_all_outlets() -> Dict[str, bool]:
|
||||
"""initialisiert alle tapo-steckdosen (schaltet sie aus)."""
|
||||
return tapo_controller.initialize_all_outlets()
|
@ -358,7 +358,7 @@ def run_comprehensive_test():
|
||||
all_results.update(test_api_endpoints())
|
||||
print()
|
||||
|
||||
# Ergebnisse zusammenfassen
|
||||
# ergebnisse zusammenfassen
|
||||
print("=" * 70)
|
||||
print("📊 TESTERGEBNISSE ZUSAMMENFASSUNG")
|
||||
print("=" * 70)
|
||||
|
312
dings.md
@ -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.
|
118
docs/Schulung_MYP_Backend_Bedienung.md
Normal 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
|
Before Width: | Height: | Size: 13 KiB |