🎉 Update project documentation and conversion scripts to Markdown format, optimize logs directory structure. 🐛

This commit is contained in:
Till Tomczak 2025-06-03 23:04:37 +02:00
parent a27b978fc5
commit 31d1a3eaf6
25 changed files with 520 additions and 0 deletions

View File

@ -0,0 +1,442 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Erweiterte Konvertierung der IHK-Projektdokumentation von Markdown nach Word (DOCX)
mit vollständiger IHK-konformer Formatierung.
"""
import os
import re
from docx import Document
from docx.shared import Pt, Inches, RGBColor, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
from docx.enum.style import WD_STYLE_TYPE
from docx.enum.section import WD_SECTION
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
def create_element(name):
"""Hilfsfunktion zum Erstellen von XML-Elementen"""
return OxmlElement(name)
def create_attribute(element, name, value):
"""Hilfsfunktion zum Setzen von XML-Attributen"""
element.set(qn(name), value)
def add_page_numbers(doc):
"""Fügt Seitenzahlen in die Fußzeile ein"""
for section in doc.sections:
footer = section.footer
footer_para = footer.paragraphs[0]
footer_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
# Füge Seitenzahl hinzu
fldChar1 = create_element('w:fldChar')
create_attribute(fldChar1, 'w:fldCharType', 'begin')
instrText = create_element('w:instrText')
instrText.text = " PAGE "
fldChar2 = create_element('w:fldChar')
create_attribute(fldChar2, 'w:fldCharType', 'end')
footer_para._p.append(fldChar1)
footer_para._p.append(instrText)
footer_para._p.append(fldChar2)
def add_header(doc):
"""Fügt Kopfzeile mit Projektinformationen hinzu"""
for section in doc.sections[1:]: # Skip erste Seite (Titelseite)
header = section.header
header_para = header.paragraphs[0]
header_para.text = "IHK-Projektdokumentation - MYP Manage Your Printer"
header_para.alignment = WD_ALIGN_PARAGRAPH.RIGHT
header_para.style.font.size = Pt(10)
header_para.style.font.italic = True
def create_ihk_styles(doc):
"""Erstellt erweiterte IHK-konforme Formatvorlagen"""
# Normaler Text mit IHK-Spezifikationen
normal_style = doc.styles['Normal']
normal_style.font.name = 'Arial'
normal_style.font.size = Pt(11)
normal_style.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
normal_style.paragraph_format.space_after = Pt(6)
normal_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
normal_style.paragraph_format.first_line_indent = Cm(0.5) # Einzug erste Zeile
# Überschrift 1 - Hauptkapitel
h1_style = doc.styles['Heading 1']
h1_style.font.name = 'Arial'
h1_style.font.size = Pt(16)
h1_style.font.bold = True
h1_style.font.color.rgb = RGBColor(0, 0, 0)
h1_style.paragraph_format.space_before = Pt(24)
h1_style.paragraph_format.space_after = Pt(12)
h1_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT
h1_style.paragraph_format.keep_with_next = True
h1_style.paragraph_format.page_break_before = False # Kein automatischer Seitenumbruch
# Überschrift 2 - Unterkapitel
h2_style = doc.styles['Heading 2']
h2_style.font.name = 'Arial'
h2_style.font.size = Pt(14)
h2_style.font.bold = True
h2_style.font.color.rgb = RGBColor(0, 0, 0)
h2_style.paragraph_format.space_before = Pt(18)
h2_style.paragraph_format.space_after = Pt(6)
h2_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT
h2_style.paragraph_format.keep_with_next = True
# Überschrift 3 - Abschnitte
h3_style = doc.styles['Heading 3']
h3_style.font.name = 'Arial'
h3_style.font.size = Pt(12)
h3_style.font.bold = True
h3_style.font.color.rgb = RGBColor(0, 0, 0)
h3_style.paragraph_format.space_before = Pt(12)
h3_style.paragraph_format.space_after = Pt(6)
h3_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT
h3_style.paragraph_format.keep_with_next = True
# Aufzählungsstil
bullet_style = doc.styles['List Bullet']
bullet_style.font.name = 'Arial'
bullet_style.font.size = Pt(11)
bullet_style.paragraph_format.left_indent = Cm(1.0)
bullet_style.paragraph_format.first_line_indent = Cm(-0.5)
bullet_style.paragraph_format.space_after = Pt(3)
# Code-Style für technische Begriffe
try:
code_style = doc.styles.add_style('Code', WD_STYLE_TYPE.CHARACTER)
except:
code_style = doc.styles['Code']
code_style.font.name = 'Courier New'
code_style.font.size = Pt(10)
code_style.font.color.rgb = RGBColor(0, 0, 139) # Dunkelblau
# Zitat-Style
try:
quote_style = doc.styles.add_style('Quote', WD_STYLE_TYPE.PARAGRAPH)
except:
quote_style = doc.styles['Quote']
quote_style.font.name = 'Arial'
quote_style.font.size = Pt(10)
quote_style.font.italic = True
quote_style.paragraph_format.left_indent = Cm(1.0)
quote_style.paragraph_format.right_indent = Cm(1.0)
quote_style.paragraph_format.space_before = Pt(6)
quote_style.paragraph_format.space_after = Pt(6)
return doc
def setup_document_layout(doc):
"""Richtet das erweiterte Dokumentlayout nach IHK-Vorgaben ein"""
for section in doc.sections:
# IHK-Standard Seitenränder
section.top_margin = Cm(2.5)
section.bottom_margin = Cm(2.0)
section.left_margin = Cm(2.5)
section.right_margin = Cm(2.0)
# A4 Format
section.page_height = Cm(29.7)
section.page_width = Cm(21.0)
# Kopf- und Fußzeilenabstand
section.header_distance = Cm(1.25)
section.footer_distance = Cm(1.25)
def add_enhanced_title_page(doc):
"""Fügt eine erweiterte IHK-konforme Titelseite hinzu"""
# Logo-Platzhalter
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
p.add_run('[Mercedes-Benz Logo]').italic = True
# Leerzeilen
for _ in range(3):
doc.add_paragraph()
# Prüfungsinformationen
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Abschlussprüfung Sommer 2025')
run.font.size = Pt(14)
run.font.bold = True
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Industrie- und Handelskammer Berlin')
run.font.size = Pt(12)
doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Fachinformatiker für digitale Vernetzung')
run.font.size = Pt(16)
run.font.bold = True
for _ in range(2):
doc.add_paragraph()
# Dokumenttyp
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Dokumentation der betrieblichen Projektarbeit')
run.font.size = Pt(14)
for _ in range(2):
doc.add_paragraph()
# Projekttitel
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('MYP Manage Your Printer')
run.font.size = Pt(20)
run.font.bold = True
doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.add_run('Digitalisierung des 3D-Drucker-Reservierungsprozesses\n')
p.add_run('durch Etablierung der cyberphysischen Kommunikation\n')
p.add_run('mit relevanten Hardwarekomponenten')
# Füllung
for _ in range(6):
doc.add_paragraph()
# Informationsblock am Seitenende
table = doc.add_table(rows=2, cols=2)
table.alignment = WD_ALIGN_PARAGRAPH.CENTER
table.style = 'Table Grid'
# Ausbildungsbetrieb
cell = table.cell(0, 0)
p = cell.paragraphs[0]
p.add_run('Ausbildungsbetrieb:').bold = True
cell.add_paragraph('Mercedes-Benz AG')
cell.add_paragraph('Daimlerstraße 143')
cell.add_paragraph('12277 Berlin')
# Prüfungsbewerber
cell = table.cell(0, 1)
p = cell.paragraphs[0]
p.add_run('Prüfungsbewerber:').bold = True
cell.add_paragraph('Till Tomczak')
cell.add_paragraph('Hainbuchenstraße 19')
cell.add_paragraph('16761 Hennigsdorf')
# Abgabedatum
cell = table.cell(1, 0)
p = cell.paragraphs[0]
p.add_run('Abgabedatum:').bold = True
cell.add_paragraph('5. Juni 2025')
# Prüflingsnummer
cell = table.cell(1, 1)
p = cell.paragraphs[0]
p.add_run('Prüflingsnummer:').bold = True
cell.add_paragraph('[Wird von IHK vergeben]')
# Seitenumbruch
doc.add_page_break()
def process_enhanced_content(content):
"""Erweiterte Verarbeitung des Markdown-Inhalts"""
# Entferne den Header-Bereich
content = re.sub(r'^.*?(?=# 1\. Einleitung)', '', content, flags=re.DOTALL)
# Verbessere Formatierung
content = re.sub(r'', '', content) # Korrekter Gedankenstrich
content = re.sub(r'\.\.\.', '', content) # Auslassungspunkte
content = re.sub(r'"([^"]*)"', '\\1"', content) # Deutsche Anführungszeichen
return content
def add_enhanced_content(doc, content):
"""Fügt Inhalt mit erweiterter Formatierung hinzu"""
lines = content.split('\n')
current_paragraph = None
in_list = False
for i, line in enumerate(lines):
# Überschriften
if line.startswith('# '):
heading = line[2:].strip()
doc.add_heading(heading, level=1)
current_paragraph = None
in_list = False
elif line.startswith('## '):
heading = line[3:].strip()
doc.add_heading(heading, level=2)
current_paragraph = None
in_list = False
elif line.startswith('### '):
heading = line[4:].strip()
doc.add_heading(heading, level=3)
current_paragraph = None
in_list = False
elif line.startswith('#### '):
heading = line[5:].strip()
p = doc.add_paragraph()
p.add_run(heading + ':').bold = True
current_paragraph = None
in_list = False
# Listen
elif line.strip().startswith('- '):
text = line.strip()[2:]
p = doc.add_paragraph(text, style='List Bullet')
in_list = True
current_paragraph = None
# Normaler Text
elif line.strip():
if not in_list:
if current_paragraph is None:
current_paragraph = doc.add_paragraph()
else:
current_paragraph.add_run(' ')
process_enhanced_inline_formatting(current_paragraph, line.strip())
else:
in_list = False
current_paragraph = doc.add_paragraph()
process_enhanced_inline_formatting(current_paragraph, line.strip())
# Leerzeile
else:
current_paragraph = None
if not in_list:
in_list = False
def process_enhanced_inline_formatting(paragraph, text):
"""Erweiterte Inline-Formatierung mit besserer Erkennung"""
# Komplexere Regex für verschachtelte Formatierungen
pattern = r'(\*\*[^*]+\*\*|\*[^*]+\*|`[^`]+`|„[^"]+"|[^\']+\')'
parts = re.split(pattern, text)
for part in parts:
if not part:
continue
if part.startswith('**') and part.endswith('**'):
# Fett
paragraph.add_run(part[2:-2]).bold = True
elif part.startswith('*') and part.endswith('*') and not part.startswith('**'):
# Kursiv
paragraph.add_run(part[1:-1]).italic = True
elif part.startswith('`') and part.endswith('`'):
# Code/Technische Begriffe
run = paragraph.add_run(part[1:-1])
run.font.name = 'Courier New'
run.font.size = Pt(10)
run.font.color.rgb = RGBColor(0, 0, 139)
elif part.startswith('') or part.startswith('"'):
# Zitate
run = paragraph.add_run(part)
run.italic = True
else:
# Normaler Text
paragraph.add_run(part)
def add_appendix_placeholder(doc):
"""Fügt Platzhalter für Anhänge hinzu"""
doc.add_page_break()
doc.add_heading('Anlagen', level=1)
doc.add_heading('A. Netzwerkdiagramme und Systemarchitektur', level=2)
p = doc.add_paragraph('[Hier Netzwerkdiagramme einfügen]')
p.italic = True
doc.add_heading('B. API-Dokumentation', level=2)
p = doc.add_paragraph('[Hier API-Dokumentation einfügen]')
p.italic = True
doc.add_heading('C. Benutzerhandbuch', level=2)
p = doc.add_paragraph('[Hier Benutzerhandbuch einfügen]')
p.italic = True
doc.add_heading('D. Testprotokolle', level=2)
p = doc.add_paragraph('[Hier Testprotokolle einfügen]')
p.italic = True
doc.add_heading('E. Screenshots der Benutzeroberfläche', level=2)
p = doc.add_paragraph('[Hier Screenshots einfügen]')
p.italic = True
doc.add_heading('F. Konfigurationsdateien und Deployment-Skripte', level=2)
p = doc.add_paragraph('[Hier relevante Konfigurationsdateien einfügen]')
p.italic = True
def main():
"""Hauptfunktion"""
input_file = 'Dokumentation_Final_Markdown/Dokumentation.md'
output_file = 'IHK_Projektdokumentation_Final_Enhanced.docx'
print("Lese Markdown-Datei...")
with open(input_file, 'r', encoding='utf-8') as f:
content = f.read()
print("Erstelle Word-Dokument mit erweiterten IHK-Formatierungen...")
doc = Document()
# Konfiguration
print("Konfiguriere Dokumentlayout und Styles...")
create_ihk_styles(doc)
setup_document_layout(doc)
# Titelseite
print("Erstelle erweiterte Titelseite...")
add_enhanced_title_page(doc)
# Kopf- und Fußzeilen
print("Füge Kopf- und Fußzeilen hinzu...")
add_header(doc)
add_page_numbers(doc)
# Inhaltsverzeichnis
print("Füge Inhaltsverzeichnis-Platzhalter hinzu...")
doc.add_heading('Inhaltsverzeichnis', level=1)
p = doc.add_paragraph()
p.add_run('Bitte generieren Sie das Inhaltsverzeichnis über:\n')
p.add_run('Verweise → Inhaltsverzeichnis → Automatisches Verzeichnis 1\n\n')
p.add_run('Stellen Sie sicher, dass alle Überschriften korrekt als Überschrift 1-3 formatiert sind.')
p.italic = True
doc.add_page_break()
# Hauptinhalt
print("Verarbeite und füge Hauptinhalt hinzu...")
processed_content = process_enhanced_content(content)
add_enhanced_content(doc, processed_content)
# Anhänge
print("Füge Anhang-Platzhalter hinzu...")
add_appendix_placeholder(doc)
# Speichern
print(f"Speichere Dokument als {output_file}...")
doc.save(output_file)
print("\nKonvertierung erfolgreich abgeschlossen!")
print("\nWichtige Nachbearbeitungsschritte:")
print("1. Generieren Sie das Inhaltsverzeichnis (Verweise → Inhaltsverzeichnis)")
print("2. Überprüfen Sie alle Seitenumbrüche")
print("3. Fügen Sie fehlende Abbildungen und Diagramme ein")
print("4. Prüfen Sie die Seitennummerierung")
print("5. Ergänzen Sie die Anlagen mit den tatsächlichen Dokumenten")
print("6. Führen Sie eine finale Rechtschreibprüfung durch")
print("\nDie Datei entspricht nun den IHK-Formatvorgaben!")
if __name__ == "__main__":
main()

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -128,3 +128,4 @@
2025-06-03 22:00:22 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-03 22:15:15 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-03 22:15:51 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-03 23:03:59 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert

View File

@ -937,3 +937,4 @@
2025-06-03 20:42:22 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 127.0.0.1
2025-06-03 22:15:28 - [auth] auth - [INFO] INFO - 🕒 Automatische Abmeldung: Benutzer admin@mercedes-benz.com war 85.0 Minuten inaktiv (Limit: 60min)
2025-06-03 22:15:28 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 10.0.2.2
2025-06-03 23:04:06 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1

View File

@ -133,3 +133,4 @@
2025-06-03 22:00:22 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-03 22:15:15 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-03 22:15:51 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-03 23:03:59 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)

View File

@ -514,3 +514,7 @@
2025-06-03 22:15:51 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-03 22:15:51 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit eventlet initialisiert
2025-06-03 22:15:51 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: eventlet)
2025-06-03 23:04:00 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-03 23:04:00 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-03 23:04:00 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
2025-06-03 23:04:00 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)

View File

@ -129,3 +129,4 @@
2025-06-03 22:00:22 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-03 22:15:15 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-03 22:15:51 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-03 23:03:59 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet

View File

@ -49,3 +49,6 @@
2025-06-03 22:15:51 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup...
2025-06-03 22:15:51 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen...
2025-06-03 22:15:51 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen...
2025-06-03 23:04:01 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup...
2025-06-03 23:04:01 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen...
2025-06-03 23:04:01 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen...

View File

@ -125,3 +125,4 @@
2025-06-03 22:00:23 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-03 22:15:16 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-03 22:15:51 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-03 23:04:00 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)

View File

@ -46,3 +46,7 @@
2025-06-03 22:15:51 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet
2025-06-03 22:15:51 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: database_lock - 2025-06-01 00:29:13 - myp.app - ERROR - ❌ Fehler beim Datenbank-Cleanup: (sqlite3.OperationalError) database is locked
2025-06-03 22:15:51 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: reset_database
2025-06-03 23:04:01 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert
2025-06-03 23:04:01 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet
2025-06-03 23:04:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: database_lock - 2025-06-01 00:29:13 - myp.app - ERROR - ❌ Fehler beim Datenbank-Cleanup: (sqlite3.OperationalError) database is locked
2025-06-03 23:04:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: reset_database

View File

@ -256,3 +256,5 @@
2025-06-03 22:15:16 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-03 22:15:51 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-03 22:15:51 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-03 23:04:00 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-03 23:04:00 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet

View File

@ -254,3 +254,5 @@
2025-06-03 22:15:16 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-03 22:15:51 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-03 22:15:51 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-03 23:04:00 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-03 23:04:00 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt

View File

@ -127,3 +127,4 @@
2025-06-03 22:00:23 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-03 22:15:16 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-03 22:15:51 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-03 23:04:00 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert

View File

@ -3449,3 +3449,13 @@
2025-06-03 22:16:14 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-03 22:16:14 - [printer_monitor] printer_monitor - [INFO] INFO - Keine aktiven Drucker gefunden
2025-06-03 22:16:19 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102
2025-06-03 23:03:59 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-03 23:03:59 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-03 23:04:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
2025-06-03 23:04:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
2025-06-03 23:04:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
2025-06-03 23:04:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
2025-06-03 23:04:01 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden
2025-06-03 23:04:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104
2025-06-03 23:04:13 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100
2025-06-03 23:04:19 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101

View File

@ -32264,3 +32264,34 @@
2025-06-03 22:16:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x7fba8c4e5710>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
2025-06-03 22:16:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten
2025-06-03 22:16:20 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2
2025-06-03 23:03:59 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
2025-06-03 23:04:01 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
2025-06-03 23:04:01 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
2025-06-03 23:04:01 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test
2025-06-03 23:04:03 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22DADBB60>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
2025-06-03 23:04:03 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten
2025-06-03 23:04:03 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test
2025-06-03 23:04:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22DA2A350>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
2025-06-03 23:04:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten
2025-06-03 23:04:05 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test
2025-06-03 23:04:07 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22DA2AE90>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
2025-06-03 23:04:07 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten
2025-06-03 23:04:07 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test
2025-06-03 23:04:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22DA7D810>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
2025-06-03 23:04:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten
2025-06-03 23:04:09 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test
2025-06-03 23:04:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22DA7FE10>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
2025-06-03 23:04:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten
2025-06-03 23:04:11 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test
2025-06-03 23:04:14 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22DAE28D0>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
2025-06-03 23:04:14 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten
2025-06-03 23:04:14 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test
2025-06-03 23:04:16 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22F02C5A0>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
2025-06-03 23:04:16 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten
2025-06-03 23:04:16 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test
2025-06-03 23:04:18 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22F02CF30>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
2025-06-03 23:04:18 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten
2025-06-03 23:04:18 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi
2025-06-03 23:04:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22F02D260>, 'Connection to 192.168.0.104 timed out. (connect timeout=2)'))
2025-06-03 23:04:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten
2025-06-03 23:04:20 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi

View File

@ -127,3 +127,4 @@
2025-06-03 22:00:23 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-03 22:15:16 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-03 22:15:51 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-03 23:04:00 - [security] security - [INFO] INFO - 🔒 Security System initialisiert

View File

@ -221,3 +221,4 @@
2025-06-03 22:00:23 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
2025-06-03 22:15:16 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
2025-06-03 22:15:51 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
2025-06-03 23:04:00 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert

View File

@ -1143,3 +1143,12 @@
2025-06-03 22:15:51 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: /mnt
2025-06-03 22:15:51 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-03T22:15:51.607422
2025-06-03 22:15:51 - [startup] startup - [INFO] INFO - ==================================================
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - ==================================================
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-03T23:04:00.907327
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - ==================================================

View File

@ -10,3 +10,4 @@
2025-06-03 22:00:23 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
2025-06-03 22:15:16 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
2025-06-03 22:15:51 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
2025-06-03 23:04:01 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert

View File

@ -527,3 +527,7 @@
2025-06-03 20:42:01 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-03 20:42:01 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-03 20:42:01 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet