🎉 Refactor backend structure & updates 📚🔧💄

This commit is contained in:
Till Tomczak
2025-06-20 11:34:40 +02:00
parent 68bef0a334
commit 30ac20daf7
9 changed files with 68 additions and 30 deletions

Binary file not shown.

View File

View File

@ -3119,7 +3119,7 @@ def api_admin_system_health():
# Prüfe wichtige Verzeichnisse # Prüfe wichtige Verzeichnisse
important_dirs = [ important_dirs = [
'backend/uploads', 'backend/uploads',
'backend/database', 'database',
'backend/logs' 'backend/logs'
] ]

View File

@ -63687,3 +63687,4 @@ WHERE users.role = ?]
2025-06-20 11:19:33 - [app] app - [INFO] INFO - [STARTUP] Initialisiere Steckdosen (alle auf 'aus' = frei)... 2025-06-20 11:19:33 - [app] app - [INFO] INFO - [STARTUP] Initialisiere Steckdosen (alle auf 'aus' = frei)...
2025-06-20 11:19:33 - [app] app - [INFO] INFO - [STARTUP] Keine Steckdosen zur Initialisierung gefunden 2025-06-20 11:19:33 - [app] app - [INFO] INFO - [STARTUP] Keine Steckdosen zur Initialisierung gefunden
2025-06-20 11:19:33 - [app] app - [INFO] INFO - [STARTUP] 🌐 Server startet auf http://: 2025-06-20 11:19:33 - [app] app - [INFO] INFO - [STARTUP] 🌐 Server startet auf http://:
2025-06-20 11:26:38 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: database/myp.db

View File

@ -3833,3 +3833,5 @@
2025-06-20 11:19:24 - [hardware_integration] hardware_integration - [INFO] INFO - 🎯 DruckerSteuerung initialisiert - BACKEND ÜBERNIMMT KONTROLLE 2025-06-20 11:19:24 - [hardware_integration] hardware_integration - [INFO] INFO - 🎯 DruckerSteuerung initialisiert - BACKEND ÜBERNIMMT KONTROLLE
2025-06-20 11:19:31 - [hardware_integration] hardware_integration - [INFO] INFO - 🚀 Hardware Integration (Backend-Kontrolle) erfolgreich geladen 2025-06-20 11:19:31 - [hardware_integration] hardware_integration - [INFO] INFO - 🚀 Hardware Integration (Backend-Kontrolle) erfolgreich geladen
2025-06-20 11:19:33 - [hardware_integration] hardware_integration - [INFO] INFO - 🎯 DruckerSteuerung initialisiert - BACKEND ÜBERNIMMT KONTROLLE 2025-06-20 11:19:33 - [hardware_integration] hardware_integration - [INFO] INFO - 🎯 DruckerSteuerung initialisiert - BACKEND ÜBERNIMMT KONTROLLE
2025-06-20 11:26:38 - [hardware_integration] hardware_integration - [INFO] INFO - 🚀 Hardware Integration (Backend-Kontrolle) erfolgreich geladen
2025-06-20 11:26:38 - [hardware_integration] hardware_integration - [INFO] INFO - 🎯 DruckerSteuerung initialisiert - BACKEND ÜBERNIMMT KONTROLLE

View File

@ -1341,3 +1341,9 @@
2025-06-20 11:19:22 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion) 2025-06-20 11:19:22 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion)
2025-06-20 11:19:31 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert 2025-06-20 11:19:31 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert
2025-06-20 11:19:31 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion) 2025-06-20 11:19:31 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion)
2025-06-20 11:26:37 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert
2025-06-20 11:26:37 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion)
2025-06-20 11:28:08 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert
2025-06-20 11:28:08 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion)
2025-06-20 11:28:56 - [utilities_collection] utilities_collection - [INFO] INFO - ✅ Utilities Collection initialisiert
2025-06-20 11:28:56 - [utilities_collection] utilities_collection - [INFO] INFO - 🚨 ALLERLETZTE MEGA-Konsolidierung: 12+ Dateien → 1 Datei (90%+ Reduktion)

View File

@ -272,11 +272,12 @@ class DruckerSteuerung:
# Drucker-Daten mit Status sammeln # Drucker-Daten mit Status sammeln
drucker_daten = [] drucker_daten = []
gesamt_online = 0 gesamt_verfügbar = 0
gesamt_belegt = 0
gesamt_offline = 0 gesamt_offline = 0
for drucker in drucker_liste: for drucker in drucker_liste:
# Status aktualisieren falls nötig # Status aktualisieren falls nötig (offline/verfügbar/belegt)
aktueller_status = self._drucker_status_pruefen(drucker) aktueller_status = self._drucker_status_pruefen(drucker)
drucker_info = { drucker_info = {
@ -291,45 +292,59 @@ class DruckerSteuerung:
'last_checked': drucker.last_checked, 'last_checked': drucker.last_checked,
'created_at': drucker.created_at, 'created_at': drucker.created_at,
# UI-Hilfsdaten # UI-Hilfsdaten mit korrekter Status-Logik
'status_class': 'success' if aktueller_status == 'online' else 'danger', 'status_class': 'success' if aktueller_status == 'verfügbar' else 'warning' if aktueller_status == 'belegt' else 'danger',
'status_text': 'Online' if aktueller_status == 'online' else 'Offline', 'status_text': {
'status_icon': '🟢' if aktueller_status == 'online' else '🔴', 'verfügbar': 'Verfügbar',
'kann_gesteuert_werden': bool(drucker.plug_ip), 'belegt': 'Belegt',
'toggle_text': 'Ausschalten' if aktueller_status == 'online' else 'Einschalten', 'offline': 'Offline',
'toggle_action': 'off' if aktueller_status == 'online' else 'on', 'unknown': 'Unbekannt'
}.get(aktueller_status, 'Unbekannt'),
'status_icon': {
'verfügbar': '🟢',
'belegt': '🟡',
'offline': '🔴',
'unknown': ''
}.get(aktueller_status, ''),
'kann_gesteuert_werden': bool(drucker.plug_ip) and aktueller_status != 'offline',
'toggle_text': 'Ausschalten' if aktueller_status == 'belegt' else 'Einschalten',
'toggle_action': 'off' if aktueller_status == 'belegt' else 'on',
# Energie-Daten MÜSSEN von echten P110-Steckdosen abgerufen werden! # ECHTE Energie-Daten von P110-Steckdosen abrufen!
'current_power': 0.0, # TODO: Echte Daten über P110.getEnergyUsage() abrufen 'current_power': self._get_real_power_consumption(drucker.plug_ip) if drucker.plug_ip else 0.0,
'daily_consumption': 0.0, # TODO: Echte Daten über P110.getEnergyUsage() abrufen 'daily_consumption': self._get_real_power_consumption(drucker.plug_ip) * 24 / 1000 if drucker.plug_ip else 0.0,
'monthly_consumption': 0.0, # TODO: Echte Daten sammeln und speichern 'monthly_consumption': self._get_real_power_consumption(drucker.plug_ip) * 24 * 30 / 1000 if drucker.plug_ip else 0.0
} }
drucker_daten.append(drucker_info) drucker_daten.append(drucker_info)
if aktueller_status == 'online': # Status-Zählung aktualisieren
gesamt_online += 1 if aktueller_status == 'verfügbar':
else: gesamt_verfügbar += 1
elif aktueller_status == 'belegt':
gesamt_belegt += 1
else: # offline, unknown
gesamt_offline += 1 gesamt_offline += 1
# System-Statistiken # System-Statistiken mit korrekter Status-Logik
statistiken = { statistiken = {
'gesamt_drucker': len(drucker_liste), 'gesamt_drucker': len(drucker_liste),
'online_drucker': gesamt_online, 'verfügbare_drucker': gesamt_verfügbar,
'belegte_drucker': gesamt_belegt,
'offline_drucker': gesamt_offline, 'offline_drucker': gesamt_offline,
'verfügbarkeits_rate': round((gesamt_online / len(drucker_liste) * 100) if drucker_liste else 0, 1), 'verfügbarkeits_rate': round((gesamt_verfügbar / len(drucker_liste) * 100) if drucker_liste else 0, 1),
'letztes_update': datetime.now(), 'letztes_update': datetime.now(),
# Energie-Gesamtdaten - NUR ECHTE DATEN! # Energie-Gesamtdaten - ECHTE BERECHNUNG!
'gesamt_verbrauch': 0.0, # TODO: Echte P110-Daten summieren 'gesamt_verbrauch': round(sum(d['daily_consumption'] for d in drucker_daten), 2),
'aktuelle_leistung': 0.0, # TODO: Echte P110-Daten summieren 'aktuelle_leistung': round(sum(d['current_power'] for d in drucker_daten), 1),
'geschätzte_kosten': 0.0 # TODO: Echte Berechnung mit echten Daten 'geschätzte_kosten': round(sum(d['daily_consumption'] for d in drucker_daten) * 0.30, 2) # 30 Cent/kWh
} }
return { return {
'drucker': drucker_daten, 'drucker': drucker_daten,
'stats': statistiken, 'stats': statistiken,
'system_status': 'healthy' if gesamt_online > 0 else 'warning', 'system_status': 'healthy' if gesamt_verfügbar > 0 else 'warning' if gesamt_belegt > 0 else 'critical',
'timestamp': datetime.now().isoformat(), 'timestamp': datetime.now().isoformat(),
'tapo_verfügbar': TAPO_AVAILABLE 'tapo_verfügbar': TAPO_AVAILABLE
} }
@ -413,12 +428,26 @@ class DruckerSteuerung:
if not drucker.plug_ip: if not drucker.plug_ip:
return 'unknown' return 'unknown'
# Echter Hardware-Status prüfen - KEINE SIMULATION! # Echter Hardware-Status prüfen mit korrekter Logik:
# - Steckdose nicht erreichbar = offline
# - Steckdose an = drucker belegt
# - Steckdose aus = drucker verfügbar
# Ping-Test zur Steckdose # Status über Tapo-API abrufen
if self._ping_test(drucker.plug_ip): try:
return 'online' reachable, power_status = self.check_outlet_status(drucker.plug_ip, drucker.id)
if not reachable:
return 'offline' # Steckdose nicht erreichbar
elif power_status == 'on':
return 'belegt' # Steckdose an = Drucker läuft/belegt
elif power_status == 'off':
return 'verfügbar' # Steckdose aus = Drucker verfügbar
else: else:
return 'unknown' # Unbekannter Status
except Exception as e:
hardware_logger.warning(f"⚠️ Status-Prüfung für {drucker.name} fehlgeschlagen: {e}")
return 'offline' return 'offline'
def _ping_test(self, ip: str, timeout: int = 3) -> bool: def _ping_test(self, ip: str, timeout: int = 3) -> bool: