feat: Erweiterung der Druckerstatusüberprüfung durch Implementierung einer Steckdosenabfrage für Drucker. Verbesserung der Benutzeroberfläche mit optimierten Dark Mode-Elementen und neuen Statusanzeigen für Drucker. Anpassungen in den Templates zur Unterstützung dynamischer Statusinformationen und zur Verbesserung der Benutzererfahrung. Aktualisierung der CSS-Styles für ein ansprechenderes Design und bessere Benutzerinteraktion.

This commit is contained in:
2025-05-29 09:46:16 +02:00
parent e9071c7b57
commit d81149229a
13 changed files with 2138 additions and 1233 deletions

View File

@@ -1110,10 +1110,10 @@ def kiosk_restart_system():
def check_printer_status(ip_address: str, timeout: int = 7) -> Tuple[str, bool]:
"""
Überprüft den Status eines Druckers über Ping mit Timeout.
Überprüft den Status eines Druckers über Steckdosenabfrage mit Timeout.
Args:
ip_address: IP-Adresse des Druckers
ip_address: IP-Adresse der Drucker-Steckdose
timeout: Timeout in Sekunden (Standard: 7)
Returns:
@@ -1132,7 +1132,7 @@ def check_printer_status(ip_address: str, timeout: int = 7) -> Tuple[str, bool]:
printers_logger.warning(f"Ungültige IP-Adresse: {ip_address}")
return "offline", False
# Windows-spezifischer Ping-Befehl mit Timeout
# Zuerst prüfen, ob die Steckdose erreichbar ist
if os.name == 'nt': # Windows
cmd = ['ping', '-n', '1', '-w', str(timeout * 1000), ip_address.strip()]
else: # Unix/Linux/macOS
@@ -1150,19 +1150,66 @@ def check_printer_status(ip_address: str, timeout: int = 7) -> Tuple[str, bool]:
timeout=timeout + 2 # Zusätzlicher Timeout für subprocess
)
# Erfolgreicher Ping (Return Code 0)
if result.returncode == 0:
printers_logger.debug(f"Ping erfolgreich für {ip_address}")
return "online", True
else:
# Wenn Steckdose nicht erreichbar ist, ist der Drucker offline
if result.returncode != 0:
printers_logger.debug(f"Ping fehlgeschlagen für {ip_address} (Return Code: {result.returncode})")
return "offline", False
# Jetzt den tatsächlichen Steckdosenstatus abfragen
db_session = get_db_session()
printer = db_session.query(Printer).filter(Printer.plug_ip == ip_address).first()
if not printer:
printers_logger.warning(f"Kein Drucker mit Steckdosen-IP {ip_address} gefunden")
db_session.close()
return "offline", False
# Smart Plug Status prüfen
import requests
from requests.exceptions import RequestException
# Standardwerte aus der Datenbank verwenden
username = printer.plug_username
password = printer.plug_password
try:
# Für TP-Link Smart Plugs oder kompatible Steckdosen
auth = (username, password)
response = requests.get(f"http://{ip_address}/status", auth=auth, timeout=timeout)
if response.status_code == 200:
try:
status_data = response.json()
# Überprüfen ob die Steckdose eingeschaltet ist
if 'system' in status_data and 'get_sysinfo' in status_data['system']:
if status_data['system']['get_sysinfo'].get('relay_state') == 1:
printers_logger.debug(f"Steckdose {ip_address} ist eingeschaltet")
db_session.close()
return "online", True
except (ValueError, KeyError) as e:
printers_logger.debug(f"Fehler beim Parsen der Steckdosen-Antwort: {str(e)}")
# Zweiter Versuch mit einfacher GET-Anfrage
response = requests.get(f"http://{ip_address}", auth=auth, timeout=timeout)
if response.status_code == 200:
printers_logger.debug(f"Steckdose {ip_address} antwortet auf HTTP-Anfrage")
# Wenn wir hier ankommen, ist die Steckdose online, aber wir wissen nicht sicher, ob sie eingeschaltet ist
# Da wir nur die Verfügbarkeit prüfen, nehmen wir an, dass sie aktiv ist, wenn sie antwortet
db_session.close()
return "online", True
except RequestException as e:
printers_logger.debug(f"Fehler bei HTTP-Anfrage an Steckdose {ip_address}: {str(e)}")
# Wenn beide API-Anfragen fehlschlagen, können wir annehmen, dass die Steckdose nicht eingeschaltet ist
db_session.close()
return "offline", False
except subprocess.TimeoutExpired:
printers_logger.warning(f"Ping-Timeout für Drucker {ip_address} nach {timeout} Sekunden")
return "offline", False
except Exception as e:
printers_logger.error(f"Fehler beim Ping für Drucker {ip_address}: {str(e)}")
printers_logger.error(f"Fehler beim Status-Check für Drucker {ip_address}: {str(e)}")
return "offline", False
def check_multiple_printers_status(printers: List[Dict], timeout: int = 7) -> Dict[int, Tuple[str, bool]]: