From f5e6b3d0dd84e5e4ee28caee078006a8f75422d1 Mon Sep 17 00:00:00 2001 From: Manuel Weiser Date: Sun, 2 Mar 2025 11:43:31 +0100 Subject: [PATCH] =?UTF-8?q?Verbessere=20die=20Verarbeitung=20des=20Druckst?= =?UTF-8?q?atus=20in=20BambuVirtualPrinter=20durch=20Normalisierung=20unbe?= =?UTF-8?q?kannter=20Zust=C3=A4nde=20und=20verbessere=20die=20Fehlerbehand?= =?UTF-8?q?lung=20beim=20Schlie=C3=9Fen=20der=20Verbindungen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../printer/bambu_virtual_printer.py | 52 +++++++++++++++---- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/octoprint_bambu_printer/printer/bambu_virtual_printer.py b/octoprint_bambu_printer/printer/bambu_virtual_printer.py index 44efc36..71eaf3e 100644 --- a/octoprint_bambu_printer/printer/bambu_virtual_printer.py +++ b/octoprint_bambu_printer/printer/bambu_virtual_printer.py @@ -357,12 +357,24 @@ 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") + if print_job_state in ["IDLE", "FINISH", "FAILED"]: self.change_state(self._state_idle) elif print_job_state in ["RUNNING", "PREPARE"]: self.change_state(self._state_printing) elif print_job_state == "PAUSE": self.change_state(self._state_paused) + elif print_job_state == "unknown": + # Wenn wir keine bessere Information haben, betrachten wir es als IDLE + self._log.debug("Keeping current state due to unknown printer state") else: self._log.warn(f"Unknown print job state: {print_job_state}") @@ -930,17 +942,35 @@ class BambuVirtualPrinter: return True def close(self): - if self._mqtt_client and self._mqtt_connected: - self._mqtt_client.loop_stop() - self._mqtt_client.disconnect() - self._mqtt_connected = False - self._custom_connected = False - # Ändern Sie jeden Verweis auf bambu_client.connected zu self.is_connected - if self._bambu_client: - self._bambu_client.disconnect() - self.change_state(self._state_idle) - self._serial_io.close() - self.stop() + """Safely close all connections.""" + try: + if self._mqtt_client and self._mqtt_connected: + self._mqtt_client.loop_stop() + self._mqtt_client.disconnect() + self._mqtt_connected = False + self._custom_connected = False + + # Sicherstellen, dass wir keinen AttributError bekommen, wenn wir den BambuClient trennen + if self._bambu_client: + try: + self._bambu_client.disconnect() + except AttributeError: + # BambuClient hat keinen client-Attribut oder die disconnect-Methode funktioniert nicht wie erwartet + self._log.warning("BambuClient disconnect failed, cleaning up manually") + # Manuell aufräumen + if hasattr(self._bambu_client, '_mqtt_client') and self._bambu_client._mqtt_client: + try: + self._bambu_client._mqtt_client.loop_stop() + self._bambu_client._mqtt_client.disconnect() + except: + pass + except Exception as e: + self._log.error(f"Error during close: {e}", exc_info=True) + finally: + # Immer in einen sicheren Zustand zurückkehren + self.change_state(self._state_idle) + self._serial_io.close() + self.stop() def stop(self): self._running = False