diff --git a/octoprint_bambu_printer/printer/bambu_virtual_printer.py b/octoprint_bambu_printer/printer/bambu_virtual_printer.py index 76ea16e..7de5f6c 100644 --- a/octoprint_bambu_printer/printer/bambu_virtual_printer.py +++ b/octoprint_bambu_printer/printer/bambu_virtual_printer.py @@ -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}")