Verbessere die Verarbeitung des Druckstatus in BambuVirtualPrinter durch Normalisierung unbekannter Zustände und verbessere die Fehlerbehandlung beim Schließen der Verbindungen.

This commit is contained in:
Manuel Weiser 2025-03-02 11:43:31 +01:00
parent 9358533ce8
commit f5e6b3d0dd

View File

@ -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