"Refactor database shm and WAL paths for improved maintainability (feat)"

This commit is contained in:
Till Tomczak 2025-05-29 22:59:04 +02:00
parent ef7a87fb13
commit ff93a2a2da
3 changed files with 55 additions and 21 deletions

Binary file not shown.

Binary file not shown.

View File

@ -497,6 +497,7 @@ class PrinterMonitor:
def auto_discover_tapo_outlets(self) -> Dict[str, bool]: def auto_discover_tapo_outlets(self) -> Dict[str, bool]:
""" """
Automatische Erkennung und Konfiguration von TP-Link Tapo P110-Steckdosen im Netzwerk. Automatische Erkennung und Konfiguration von TP-Link Tapo P110-Steckdosen im Netzwerk.
Robuste Version mit Timeout-Behandlung und Fehler-Resilience.
Returns: Returns:
Dict[str, bool]: Ergebnis der Steckdosenerkennung mit IP als Schlüssel Dict[str, bool]: Ergebnis der Steckdosenerkennung mit IP als Schlüssel
@ -507,39 +508,68 @@ class PrinterMonitor:
monitor_logger.info("🔍 Starte automatische Tapo-Steckdosenerkennung...") monitor_logger.info("🔍 Starte automatische Tapo-Steckdosenerkennung...")
results = {} results = {}
start_time = time.time()
# 1. Zuerst die Standard-IPs aus der Konfiguration testen # 1. Zuerst die Standard-IPs aus der Konfiguration testen
monitor_logger.info(f"🔄 Teste {len(DEFAULT_TAPO_IPS)} Standard-IPs aus der Konfiguration") monitor_logger.info(f"🔄 Teste {len(DEFAULT_TAPO_IPS)} Standard-IPs aus der Konfiguration")
for ip in DEFAULT_TAPO_IPS: for i, ip in enumerate(DEFAULT_TAPO_IPS):
try: try:
# TCP-Verbindungstest für Grundkonnektivität # Fortschrittsmeldung
ping_success = self._ping_address(ip, timeout=3) 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: if ping_success:
monitor_logger.info(f"✅ Steckdose mit IP {ip} ist erreichbar") monitor_logger.info(f"✅ Steckdose mit IP {ip} ist erreichbar")
# Tapo-Verbindung testen # Tapo-Verbindung testen mit Timeout-Schutz
if TAPO_AVAILABLE: if TAPO_AVAILABLE:
try: try:
from PyP100 import PyP100 # Timeout für Tapo-Verbindung
p100 = PyP100.P100(ip, TAPO_USERNAME, TAPO_PASSWORD) import signal
p100.handshake()
p100.login()
device_info = p100.getDeviceInfo()
# Steckdose gefunden und verbunden def timeout_handler(signum, frame):
nickname = device_info.get('nickname', f"Tapo P110 ({ip})") raise TimeoutError("Tapo-Verbindung Timeout")
state = "on" if device_info.get('device_on', False) else "off"
monitor_logger.info(f"✅ Tapo-Steckdose '{nickname}' ({ip}) gefunden - Status: {state}") # Nur unter Unix/Linux verfügbar
results[ip] = True if hasattr(signal, 'SIGALRM'):
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(5) # 5 Sekunden Timeout
# Steckdose in Datenbank speichern/aktualisieren try:
self._ensure_tapo_in_database(ip, nickname) from PyP100 import PyP100
p100 = PyP100.P100(ip, TAPO_USERNAME, TAPO_PASSWORD)
except Exception as e: p100.handshake()
monitor_logger.debug(f"❌ IP {ip} ist erreichbar, aber keine Tapo-Steckdose: {str(e)}") 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 results[ip] = False
else: else:
monitor_logger.warning("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Verbindung nicht testen") monitor_logger.warning("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Verbindung nicht testen")
@ -549,12 +579,16 @@ class PrinterMonitor:
results[ip] = False results[ip] = False
except Exception as e: except Exception as e:
monitor_logger.error(f"❌ Fehler bei Steckdosen-Erkennung für IP {ip}: {str(e)}") monitor_logger.warning(f"❌ Fehler bei Steckdosen-Erkennung für IP {ip}: {str(e)}")
results[ip] = False results[ip] = False
# Weiter mit nächster IP - nicht abbrechen
continue
# Erfolgsstatistik berechnen # Erfolgsstatistik berechnen
success_count = sum(1 for success in results.values() if success) success_count = sum(1 for success in results.values() if success)
monitor_logger.info(f"✅ Steckdosen-Erkennung abgeschlossen: {success_count}/{len(results)} Steckdosen gefunden") 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 # Markieren, dass automatische Erkennung durchgeführt wurde
self.auto_discovered_tapo = True self.auto_discovered_tapo = True