🛠️ "Implementiere TP-Link Tapo P110 Unterstützung für Druckerüberwachung und -steuerung"

- Aktualisiere die `check_printer_status()` Funktion zur Verwendung des PyP100-Moduls für die Tapo-Steckdosen.
- Füge neue API-Endpunkte hinzu: `test-tapo` für die Verbindungstests einzelner Drucker und `test-all-tapo` für Massentests.
- Verbessere die Fehlerbehandlung und Logging für Tapo-Verbindungen.
- Aktualisiere die Benutzeroberfläche, um den Datei-Upload als optional zu kennzeichnen.
- Implementiere umfassende Tests für die Tapo-Verbindungen in `debug_drucker_erkennung.py` und verbessere die Validierung der Konfiguration in `job_scheduler.py`.
This commit is contained in:
2025-05-29 21:19:30 +02:00
parent da1d531c16
commit de1b87f833
8 changed files with 585 additions and 178 deletions

View File

@@ -313,7 +313,14 @@ def toggle_plug(printer_id: int, state: bool) -> bool:
db_session.close()
return False
# Konfiguration validieren
if not printer.plug_ip or not printer.plug_username or not printer.plug_password:
logger.error(f"Unvollständige Tapo-Konfiguration für Drucker {printer.name} (ID: {printer_id})")
db_session.close()
return False
# TP-Link Tapo P110 Verbindung herstellen
logger.debug(f"Verbinde zu Tapo-Steckdose {printer.plug_ip} für Drucker {printer.name}")
p110 = PyP110.P110(printer.plug_ip, printer.plug_username, printer.plug_password)
p110.handshake() # Authentifizierung
p110.login() # Login
@@ -321,19 +328,60 @@ def toggle_plug(printer_id: int, state: bool) -> bool:
# Steckdose ein-/ausschalten
if state:
p110.turnOn()
logger.info(f"Steckdose für Drucker {printer.name} (ID: {printer_id}) eingeschaltet")
logger.info(f"Steckdose für Drucker {printer.name} (ID: {printer_id}) eingeschaltet")
else:
p110.turnOff()
logger.info(f"Steckdose für Drucker {printer.name} (ID: {printer_id}) ausgeschaltet")
logger.info(f"Steckdose für Drucker {printer.name} (ID: {printer_id}) ausgeschaltet")
db_session.close()
return True
except Exception as e:
logger.error(f"Fehler beim Schalten der Steckdose für Drucker {printer_id}: {str(e)}")
logger.error(f"Fehler beim Schalten der Steckdose für Drucker {printer_id}: {str(e)}")
db_session.close()
return False
def test_tapo_connection(ip_address: str, username: str, password: str) -> dict:
"""
Testet die Verbindung zu einer Tapo-Steckdose und gibt detaillierte Informationen zurück.
Args:
ip_address: IP-Adresse der Steckdose
username: Benutzername
password: Passwort
Returns:
dict: Testergebnis mit Status und Informationen
"""
logger = get_logger("printers")
result = {
"success": False,
"error": None,
"device_info": None,
"status": "unknown"
}
try:
logger.debug(f"Teste Tapo-Verbindung zu {ip_address}")
p110 = PyP110.P110(ip_address, username, password)
p110.handshake() # Authentifizierung
p110.login() # Login
# Geräteinformationen abrufen
device_info = p110.getDeviceInfo()
result["device_info"] = device_info
result["status"] = "on" if device_info.get('device_on', False) else "off"
result["success"] = True
logger.debug(f"✅ Tapo-Verbindung zu {ip_address} erfolgreich")
except Exception as e:
result["error"] = str(e)
logger.warning(f"❌ Tapo-Verbindung zu {ip_address} fehlgeschlagen: {str(e)}")
return result
def check_jobs():
"""
Überprüft alle geplanten und laufenden Jobs und schaltet Steckdosen entsprechend.