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