"Refactor job scheduling and printer monitoring"
This commit is contained in:
parent
9ce6b0b5e8
commit
00c3251b96
@ -1283,8 +1283,10 @@ def kiosk_restart_system():
|
|||||||
@measure_execution_time(logger=printers_logger, task_name="Drucker-Status-Prüfung")
|
@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]:
|
def check_printer_status(ip_address: str, timeout: int = 7) -> Tuple[str, bool]:
|
||||||
"""
|
"""
|
||||||
Überprüft den Status eines Druckers anhand der IP-Adresse.
|
Überprüft den Status eines Druckers anhand der Steckdosen-Logik:
|
||||||
Gibt den Status und die Erreichbarkeit zurück.
|
- 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:
|
Args:
|
||||||
ip_address: IP-Adresse des Druckers oder der Steckdose
|
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
|
reachable = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Überprüfen, ob die Steckdose online ist
|
# Überprüfen, ob die Steckdose erreichbar ist
|
||||||
import socket
|
import socket
|
||||||
|
|
||||||
# Erst Port 9999 versuchen (Tapo-Standard)
|
# 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
|
# Geräteinformationen abrufen
|
||||||
device_info = p100.getDeviceInfo()
|
device_info = p100.getDeviceInfo()
|
||||||
|
|
||||||
# Status auswerten
|
# 🎯 KORREKTE LOGIK: Status auswerten
|
||||||
if device_info.get('device_on', False):
|
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:
|
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:
|
except Exception as e:
|
||||||
printers_logger.error(f"❌ Fehler bei Tapo-Status-Check für {ip_address}: {str(e)}")
|
printers_logger.error(f"❌ Fehler bei Tapo-Status-Check für {ip_address}: {str(e)}")
|
||||||
reachable = False
|
reachable = False
|
||||||
status = "error"
|
status = "error"
|
||||||
else:
|
else:
|
||||||
# Alternativ HTTP/HTTPS versuchen
|
# Steckdose nicht erreichbar = kritischer Fehler
|
||||||
try:
|
printers_logger.warning(f"❌ Drucker {ip_address}: OFFLINE (Steckdose nicht erreichbar)")
|
||||||
# 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
|
reachable = False
|
||||||
status = "error"
|
status = "offline"
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printers_logger.error(f"❌ Fehler bei Verbindungsprüfung zu {ip_address}: {str(e)}")
|
printers_logger.error(f"❌ Unerwarteter Fehler bei Status-Check für {ip_address}: {str(e)}")
|
||||||
status = "error"
|
|
||||||
reachable = False
|
reachable = False
|
||||||
|
status = "error"
|
||||||
|
|
||||||
return status, reachable
|
return status, reachable
|
||||||
|
|
||||||
|
@ -293,8 +293,8 @@ class BackgroundTaskScheduler:
|
|||||||
Args:
|
Args:
|
||||||
ip: IP-Adresse der Steckdose
|
ip: IP-Adresse der Steckdose
|
||||||
state: True = Ein, False = Aus
|
state: True = Ein, False = Aus
|
||||||
username: Benutzername für die Steckdose (optional)
|
username: Benutzername für die Steckdose (wird überschrieben mit globalen Credentials)
|
||||||
password: Passwort für die Steckdose (optional)
|
password: Passwort für die Steckdose (wird überschrieben mit globalen Credentials)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
bool: True wenn erfolgreich geschaltet
|
bool: True wenn erfolgreich geschaltet
|
||||||
@ -307,8 +307,7 @@ class BackgroundTaskScheduler:
|
|||||||
self.logger.error("❌ PyP100-Modul nicht installiert - Steckdose kann nicht geschaltet werden")
|
self.logger.error("❌ PyP100-Modul nicht installiert - Steckdose kann nicht geschaltet werden")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Anmeldedaten aus Einstellungen verwenden, falls nicht angegeben
|
# IMMER globale Anmeldedaten verwenden (da diese funktionieren)
|
||||||
if not username or not password:
|
|
||||||
from config.settings import TAPO_USERNAME, TAPO_PASSWORD
|
from config.settings import TAPO_USERNAME, TAPO_PASSWORD
|
||||||
username = TAPO_USERNAME
|
username = TAPO_USERNAME
|
||||||
password = TAPO_PASSWORD
|
password = TAPO_PASSWORD
|
||||||
@ -338,7 +337,9 @@ class BackgroundTaskScheduler:
|
|||||||
|
|
||||||
def toggle_printer_plug(self, printer_id: int, state: bool) -> bool:
|
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:
|
Args:
|
||||||
printer_id: ID des Druckers
|
printer_id: ID des Druckers
|
||||||
@ -367,16 +368,24 @@ class BackgroundTaskScheduler:
|
|||||||
success = self.toggle_plug(
|
success = self.toggle_plug(
|
||||||
ip=printer.plug_ip,
|
ip=printer.plug_ip,
|
||||||
state=state,
|
state=state,
|
||||||
username=printer.plug_username,
|
username=printer.plug_username, # Wird überschrieben mit globalen Credentials
|
||||||
password=printer.plug_password
|
password=printer.plug_password # Wird überschrieben mit globalen Credentials
|
||||||
)
|
)
|
||||||
|
|
||||||
if success:
|
if success:
|
||||||
# Status in Datenbank aktualisieren
|
# Status in Datenbank aktualisieren entsprechend der neuen Logik
|
||||||
printer.status = "online" if state else "offline"
|
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()
|
printer.last_checked = datetime.now()
|
||||||
db_session.commit()
|
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()
|
db_session.close()
|
||||||
return success
|
return success
|
||||||
|
@ -144,8 +144,8 @@ class PrinterMonitor:
|
|||||||
|
|
||||||
Args:
|
Args:
|
||||||
ip_address: IP-Adresse der Steckdose
|
ip_address: IP-Adresse der Steckdose
|
||||||
username: Benutzername für die Steckdose
|
username: Benutzername für die Steckdose (wird überschrieben)
|
||||||
password: Passwort für die Steckdose
|
password: Passwort für die Steckdose (wird überschrieben)
|
||||||
timeout: Timeout in Sekunden (wird ignoriert, da PyP100 eigenes Timeout hat)
|
timeout: Timeout in Sekunden (wird ignoriert, da PyP100 eigenes Timeout hat)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@ -155,14 +155,13 @@ class PrinterMonitor:
|
|||||||
monitor_logger.error("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdose nicht schalten")
|
monitor_logger.error("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdose nicht schalten")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Fallback zu globalen Anmeldedaten wenn keine lokalen vorhanden
|
# IMMER globale Anmeldedaten verwenden (da diese funktionieren)
|
||||||
if not username or not password:
|
|
||||||
username = TAPO_USERNAME
|
username = TAPO_USERNAME
|
||||||
password = TAPO_PASSWORD
|
password = TAPO_PASSWORD
|
||||||
monitor_logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip_address}")
|
monitor_logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip_address}")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# TP-Link Tapo P100 Verbindung herstellen (P100 statt P110 verwenden)
|
# TP-Link Tapo P100 Verbindung herstellen (P100 statt P110)
|
||||||
from PyP100 import PyP100
|
from PyP100 import PyP100
|
||||||
p100 = PyP100.P100(ip_address, username, password)
|
p100 = PyP100.P100(ip_address, username, password)
|
||||||
p100.handshake() # Authentifizierung
|
p100.handshake() # Authentifizierung
|
||||||
@ -450,14 +449,13 @@ class PrinterMonitor:
|
|||||||
monitor_logger.debug("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdosen-Status nicht abfragen")
|
monitor_logger.debug("⚠️ PyP100-Modul nicht verfügbar - kann Tapo-Steckdosen-Status nicht abfragen")
|
||||||
return False, "unknown"
|
return False, "unknown"
|
||||||
|
|
||||||
# Fallback zu globalen Anmeldedaten wenn keine lokalen vorhanden
|
# IMMER globale Anmeldedaten verwenden (da diese funktionieren)
|
||||||
if not username or not password:
|
|
||||||
username = TAPO_USERNAME
|
username = TAPO_USERNAME
|
||||||
password = TAPO_PASSWORD
|
password = TAPO_PASSWORD
|
||||||
monitor_logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip_address}")
|
monitor_logger.debug(f"🔧 Verwende globale Tapo-Anmeldedaten für {ip_address}")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# TP-Link Tapo P100 Verbindung herstellen (P100 statt P110 verwenden)
|
# TP-Link Tapo P100 Verbindung herstellen (P100 statt P110)
|
||||||
from PyP100 import PyP100
|
from PyP100 import PyP100
|
||||||
p100 = PyP100.P100(ip_address, username, password)
|
p100 = PyP100.P100(ip_address, username, password)
|
||||||
p100.handshake() # Authentifizierung
|
p100.handshake() # Authentifizierung
|
||||||
|
Loading…
x
Reference in New Issue
Block a user