Erweitere die Statusverarbeitung in BambuVirtualPrinter zur besseren Erkennung von Druckzuständen und verbessere die Fehlerbehandlung bei der Statusaktualisierung.

This commit is contained in:
Manuel Weiser 2025-03-02 12:17:05 +01:00
parent c7c089ef68
commit fea0f0ed25

View File

@ -465,29 +465,63 @@ class BambuVirtualPrinter:
try:
self._log.debug(f"Received printer state update: {print_job_state}")
# Normalisieren des Status, falls er 'unknown' ist
if print_job_state == "unknown":
# Wenn der Status unbekannt ist, versuchen wir, ihn aus anderen Informationen abzuleiten
if hasattr(self._bambu_client, 'device') and hasattr(self._bambu_client.device, 'print_job'):
# Prüfe ob Druckfortschritt vorhanden ist
if hasattr(self._bambu_client.device.print_job, 'mc_percent') and self._bambu_client.device.print_job.mc_percent > 0:
print_job_state = "RUNNING"
self._log.debug(f"Changed unknown state to RUNNING based on print progress")
# Erweitern der Statuserkennung - in Bambu können die Status auch kleingeschrieben sein
# oder andere Werte haben als die, die wir erwarten
print_job_state = print_job_state.upper() if print_job_state else "UNKNOWN"
# Normalisieren des Status, falls er 'unknown' ist oder nicht erkannt wird
if print_job_state in ["UNKNOWN", ""]:
# Wenn wir keinen erkannten Status haben, versuchen wir ihn aus anderen Daten abzuleiten
# Prüfe ob Druckfortschritt vorhanden ist
if self.current_print_job and self.current_print_job.print_percentage > 0:
print_job_state = "RUNNING"
self._log.debug(f"Changed unknown state to RUNNING based on print progress from current_print_job")
# Prüfe auf Temperaturen, die auf einen laufenden Druck hinweisen könnten
elif self._telemetry.targetTemp[0] > 150 or self._telemetry.bedTargetTemp > 40:
print_job_state = "PREPARE"
self._log.debug(f"Changed unknown state to PREPARE based on target temperatures")
# Status im PrintJob aktualisieren
if self.current_print_job is not None:
if self.current_print_job is None and print_job_state in ["RUNNING", "PREPARE", "PAUSE"]:
# Wenn wir keinen PrintJob haben, aber ein Druck läuft, erstellen wir einen
self._log.info(f"Creating new PrintJob for running print with state: {print_job_state}")
self.current_print_job = PrintJob()
self.current_print_job.gcode_state = print_job_state
elif self.current_print_job is not None:
self.current_print_job.gcode_state = print_job_state
# Statusänderung in den Zustandsautomaten übertragen
if print_job_state in ["IDLE", "FINISH", "FAILED"]:
# Prüfe auf zusätzliche Indikatoren für einen aktiven Druck
is_printing = False
# Check 1: Standard-Statuserkennung
if print_job_state in ["RUNNING", "PREPARE"]:
is_printing = True
# Check 2: Druckfortschritt > 0 und < 100
if hasattr(self._bambu_client, 'device') and hasattr(self._bambu_client.device, 'print_job'):
if hasattr(self._bambu_client.device.print_job, 'mc_percent'):
progress = getattr(self._bambu_client.device.print_job, 'mc_percent', 0)
if progress > 0 and progress < 100:
is_printing = True
self._log.debug(f"Detected active printing based on progress: {progress}%")
# Check 3: Temperaturen deuten auf aktiven Druck hin
if self._telemetry.temp[0] > 170 and self._telemetry.bedTemp > 40:
# Hohe aktuelle Temperaturen deuten auf einen laufenden Druck hin
is_printing = True
self._log.debug(f"Detected potential printing based on actual temperatures: "
f"Nozzle={self._telemetry.temp[0]}, Bed={self._telemetry.bedTemp}")
# Statusänderung in den Zustandsautomaten übertragen basierend auf allen Checks
if print_job_state in ["IDLE", "FINISH", "FAILED"] and not is_printing:
self._log.debug(f"Changing to IDLE state based on status: {print_job_state} and is_printing={is_printing}")
self.change_state(self._state_idle)
elif print_job_state in ["RUNNING", "PREPARE"]:
elif print_job_state in ["RUNNING", "PREPARE"] or is_printing:
self._log.debug(f"Changing to PRINTING state based on status: {print_job_state} and is_printing={is_printing}")
self.change_state(self._state_printing)
elif print_job_state == "PAUSE":
self._log.debug(f"Changing to PAUSED state based on status: {print_job_state}")
self.change_state(self._state_paused)
elif print_job_state == "unknown":
# Wenn wir keine bessere Information haben, behalten wir den aktuellen Zustand bei
self._log.debug("Keeping current state due to unknown printer state")
else:
self._log.warn(f"Unknown print job state: {print_job_state}")