"Refactor job scheduling and printer monitoring"

This commit is contained in:
Till Tomczak 2025-05-29 23:24:13 +02:00
parent 9ce6b0b5e8
commit 00c3251b96
3 changed files with 53 additions and 62 deletions

View File

@ -1283,8 +1283,10 @@ def kiosk_restart_system():
@measure_execution_time(logger=printers_logger, task_name="Drucker-Status-Prüfung")
def check_printer_status(ip_address: str, timeout: int = 7) -> Tuple[str, bool]:
"""
Überprüft den Status eines Druckers anhand der IP-Adresse.
Gibt den Status und die Erreichbarkeit zurück.
Überprüft den Status eines Druckers anhand der Steckdosen-Logik:
- Steckdose erreichbar aber AUS = Drucker ONLINE (bereit zum Drucken)
- Steckdose erreichbar und AN = Drucker PRINTING (druckt gerade)
- Steckdose nicht erreichbar = Drucker OFFLINE (kritischer Fehler)
Args:
ip_address: IP-Adresse des Druckers oder der Steckdose
@ -1297,7 +1299,7 @@ def check_printer_status(ip_address: str, timeout: int = 7) -> Tuple[str, bool]:
reachable = False
try:
# Überprüfen, ob die Steckdose online ist
# Überprüfen, ob die Steckdose erreichbar ist
import socket
# Erst Port 9999 versuchen (Tapo-Standard)
@ -1318,48 +1320,30 @@ def check_printer_status(ip_address: str, timeout: int = 7) -> Tuple[str, bool]:
# Geräteinformationen abrufen
device_info = p100.getDeviceInfo()
# Status auswerten
# 🎯 KORREKTE LOGIK: Status auswerten
if device_info.get('device_on', False):
status = "online"
# Steckdose an = Drucker PRINTING (druckt gerade)
status = "printing"
printers_logger.info(f"🖨️ Drucker {ip_address}: PRINTING (Steckdose an - druckt gerade)")
else:
status = "standby"
# Steckdose aus = Drucker ONLINE (bereit zum Drucken)
status = "online"
printers_logger.info(f"✅ Drucker {ip_address}: ONLINE (Steckdose aus - bereit zum Drucken)")
printers_logger.info(f"✅ Tapo-Steckdose {ip_address}: Status = {status}")
except Exception as e:
printers_logger.error(f"❌ Fehler bei Tapo-Status-Check für {ip_address}: {str(e)}")
reachable = False
status = "error"
else:
# Alternativ HTTP/HTTPS versuchen
try:
# HTTP auf Port 80
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((ip_address, 80))
sock.close()
if result == 0:
reachable = True
status = "online" # Standarddrucker ohne Tapo-Steckdose
else:
# HTTPS auf Port 443
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((ip_address, 443))
sock.close()
if result == 0:
reachable = True
status = "online"
except Exception as e:
printers_logger.error(f"❌ Fehler bei Socket-Check für {ip_address}: {str(e)}")
reachable = False
status = "error"
# Steckdose nicht erreichbar = kritischer Fehler
printers_logger.warning(f"❌ Drucker {ip_address}: OFFLINE (Steckdose nicht erreichbar)")
reachable = False
status = "offline"
except Exception as e:
printers_logger.error(f"❌ Fehler bei Verbindungsprüfung zu {ip_address}: {str(e)}")
status = "error"
printers_logger.error(f"❌ Unerwarteter Fehler bei Status-Check für {ip_address}: {str(e)}")
reachable = False
status = "error"
return status, reachable

View File

@ -293,8 +293,8 @@ class BackgroundTaskScheduler:
Args:
ip: IP-Adresse der Steckdose
state: True = Ein, False = Aus
username: Benutzername für die Steckdose (optional)
password: Passwort für die Steckdose (optional)
username: Benutzername für die Steckdose (wird überschrieben mit globalen Credentials)
password: Passwort für die Steckdose (wird überschrieben mit globalen Credentials)
Returns:
bool: True wenn erfolgreich geschaltet
@ -307,12 +307,11 @@ class BackgroundTaskScheduler:
self.logger.error("❌ PyP100-Modul nicht installiert - Steckdose kann nicht geschaltet werden")
return False
# Anmeldedaten aus Einstellungen verwenden, falls nicht angegeben
if not username or not password:
from config.settings import TAPO_USERNAME, TAPO_PASSWORD
username = TAPO_USERNAME
password = TAPO_PASSWORD
self.logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip}")
# IMMER globale Anmeldedaten verwenden (da diese funktionieren)
from config.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)
@ -338,7 +337,9 @@ class BackgroundTaskScheduler:
def toggle_printer_plug(self, printer_id: int, state: bool) -> bool:
"""
Schaltet die Steckdose eines Druckers ein oder aus.
Schaltet die Steckdose eines Druckers ein oder aus mit korrektem Status-Mapping:
- Steckdose AUS = Drucker ONLINE (bereit zum Drucken)
- Steckdose AN = Drucker PRINTING (druckt gerade)
Args:
printer_id: ID des Druckers
@ -367,16 +368,24 @@ class BackgroundTaskScheduler:
success = self.toggle_plug(
ip=printer.plug_ip,
state=state,
username=printer.plug_username,
password=printer.plug_password
username=printer.plug_username, # Wird überschrieben mit globalen Credentials
password=printer.plug_password # Wird überschrieben mit globalen Credentials
)
if success:
# Status in Datenbank aktualisieren
printer.status = "online" if state else "offline"
# Status in Datenbank aktualisieren entsprechend der neuen Logik
if state:
# Steckdose eingeschaltet = Drucker druckt
printer.status = "printing"
self.logger.info(f"🖨️ Drucker {printer.name}: Status auf 'printing' gesetzt (Steckdose eingeschaltet)")
else:
# Steckdose ausgeschaltet = Drucker bereit
printer.status = "online"
self.logger.info(f"✅ Drucker {printer.name}: Status auf 'online' gesetzt (Steckdose ausgeschaltet - bereit)")
printer.last_checked = datetime.now()
db_session.commit()
self.logger.info(f"✅ Status für Drucker {printer.name} aktualisiert: {'online' if state else 'offline'}")
self.logger.info(f"✅ Status für Drucker {printer.name} erfolgreich aktualisiert")
db_session.close()
return success

View File

@ -144,8 +144,8 @@ class PrinterMonitor:
Args:
ip_address: IP-Adresse der Steckdose
username: Benutzername für die Steckdose
password: Passwort für die Steckdose
username: Benutzername für die Steckdose (wird überschrieben)
password: Passwort für die Steckdose (wird überschrieben)
timeout: Timeout in Sekunden (wird ignoriert, da PyP100 eigenes Timeout hat)
Returns:
@ -155,14 +155,13 @@ class PrinterMonitor:
monitor_logger.error("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdose nicht schalten")
return False
# Fallback zu globalen Anmeldedaten wenn keine lokalen vorhanden
if not username or not password:
username = TAPO_USERNAME
password = TAPO_PASSWORD
monitor_logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip_address}")
# 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}")
try:
# TP-Link Tapo P100 Verbindung herstellen (P100 statt P110 verwenden)
# TP-Link Tapo P100 Verbindung herstellen (P100 statt P110)
from PyP100 import PyP100
p100 = PyP100.P100(ip_address, username, password)
p100.handshake() # Authentifizierung
@ -450,14 +449,13 @@ class PrinterMonitor:
monitor_logger.debug("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdosen-Status nicht abfragen")
return False, "unknown"
# Fallback zu globalen Anmeldedaten wenn keine lokalen vorhanden
if not username or not password:
username = TAPO_USERNAME
password = TAPO_PASSWORD
monitor_logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip_address}")
# 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}")
try:
# TP-Link Tapo P100 Verbindung herstellen (P100 statt P110 verwenden)
# TP-Link Tapo P100 Verbindung herstellen (P100 statt P110)
from PyP100 import PyP100
p100 = PyP100.P100(ip_address, username, password)
p100.handshake() # Authentifizierung