Verbessere die Verarbeitung von MQTT-Nachrichten in BambuVirtualPrinter mit zentraler Payload-Verarbeitung, erweitere Fehlerbehandlung und aktualisiere Temperatur- sowie Druckerstatusmethoden.
This commit is contained in:
parent
ad08d3eb9a
commit
61c9332f15
@ -274,91 +274,120 @@ class BambuVirtualPrinter:
|
||||
payload = json.loads(msg.payload.decode('utf-8'))
|
||||
self._log.debug(f"MQTT message received on topic {msg.topic}: {list(payload.keys())}")
|
||||
|
||||
# Vollständigen Payload für Debugging ausgeben
|
||||
self._log.debug(f"Full MQTT payload: {json.dumps(payload)}")
|
||||
# Direkte Verarbeitung der Daten
|
||||
self._process_mqtt_payload(payload)
|
||||
|
||||
# Verarbeite direkt die Daten aus der MQTT-Nachricht
|
||||
if 'print' in payload:
|
||||
self._log.info(f"Processing print data with keys: {list(payload['print'].keys())}")
|
||||
self._process_print_data(payload['print'])
|
||||
# Auch an Bambu Client weiterleiten
|
||||
try:
|
||||
# Wenn der BambuClient eine eigene Verarbeitungsmethode hat, nutzen wir diese
|
||||
if hasattr(self._bambu_client, '_process_message') and callable(self._bambu_client._process_message):
|
||||
self._bambu_client._process_message(msg.topic, payload)
|
||||
self._log.debug("Message forwarded to pybambu via _process_message")
|
||||
elif hasattr(self._bambu_client, '_handle_mqtt_message') and callable(self._bambu_client._handle_mqtt_message):
|
||||
self._bambu_client._handle_mqtt_message(client, userdata, msg)
|
||||
self._log.debug("Message forwarded to pybambu via _handle_mqtt_message")
|
||||
else:
|
||||
# Wenn keine Methode zur Verarbeitung verfügbar ist, aktualisieren wir die Datenstruktur manuell
|
||||
self._log.debug("No message handler found in BambuClient, updating state manually")
|
||||
self._update_bambu_client_state(payload)
|
||||
except Exception as e:
|
||||
self._log.error(f"Error forwarding to pybambu: {e}", exc_info=True)
|
||||
|
||||
# Forward the message to pybambu for its internal state
|
||||
try:
|
||||
if hasattr(self._bambu_client, '_process_message'):
|
||||
self._bambu_client._process_message(msg.topic, payload)
|
||||
self._log.debug("Message forwarded to pybambu via _process_message")
|
||||
else:
|
||||
# Alternative Methode für pybambu
|
||||
self._update_bambu_client_state(payload)
|
||||
self._log.debug("Message processed via _update_bambu_client_state")
|
||||
except Exception as e:
|
||||
self._log.error(f"Error forwarding to pybambu: {e}")
|
||||
|
||||
# Trigger explicit update of printer info after processing print data
|
||||
self._log.debug("Triggering printer data update")
|
||||
self.new_update("event_printer_data_update")
|
||||
|
||||
if 'info' in payload:
|
||||
self._log.info(f"Processing info data with keys: {list(payload['info'].keys())}")
|
||||
if 'hms' in payload['info']:
|
||||
# Aktualisiere HMS-Fehler direkt
|
||||
try:
|
||||
if hasattr(self._bambu_client.device, 'hms'):
|
||||
self._bambu_client.device.hms.update_from_payload(payload['info']['hms'])
|
||||
self._log.debug("HMS error data updated")
|
||||
except Exception as e:
|
||||
self._log.error(f"Error updating HMS data: {e}")
|
||||
self._log.debug("Triggering HMS errors update")
|
||||
self.new_update("event_hms_errors")
|
||||
except Exception as e:
|
||||
self._log.error(f"Error processing MQTT message: {e}", exc_info=True)
|
||||
|
||||
def _process_print_data(self, print_data):
|
||||
"""Verarbeitet direkt die Druckerdaten aus der MQTT-Nachricht"""
|
||||
def _process_mqtt_payload(self, payload):
|
||||
"""Zentrale Methode zur Verarbeitung von MQTT-Payloads"""
|
||||
try:
|
||||
# Aktualisiere Temperaturdaten direkt
|
||||
if 'temperature' in print_data:
|
||||
temp_data = print_data['temperature']
|
||||
# Verarbeite print-Daten
|
||||
if 'print' in payload:
|
||||
print_data = payload['print']
|
||||
self._log.info(f"Processing print data with keys: {list(print_data.keys())}")
|
||||
|
||||
# Extruder Temperatur
|
||||
if 'nozzle_temp' in temp_data:
|
||||
self._telemetry.temp[0] = float(temp_data['nozzle_temp'])
|
||||
if 'target_nozzle_temp' in temp_data:
|
||||
self._telemetry.targetTemp[0] = float(temp_data['target_nozzle_temp'])
|
||||
|
||||
# Bett Temperatur
|
||||
if 'bed_temp' in temp_data:
|
||||
self._telemetry.bedTemp = float(temp_data['bed_temp'])
|
||||
if 'target_bed_temp' in temp_data:
|
||||
self._telemetry.bedTargetTemp = float(temp_data['target_bed_temp'])
|
||||
|
||||
# Kammer Temperatur
|
||||
if 'chamber_temp' in temp_data:
|
||||
self._telemetry.chamberTemp = float(temp_data['chamber_temp'])
|
||||
# Temperaturdaten verarbeiten
|
||||
if 'temperature' in print_data:
|
||||
self._process_temperature_data(print_data['temperature'])
|
||||
|
||||
self._log.debug(f"Updated temperatures - Nozzle: {self._telemetry.temp[0]}/{self._telemetry.targetTemp[0]}, " +
|
||||
f"Bed: {self._telemetry.bedTemp}/{self._telemetry.bedTargetTemp}, " +
|
||||
f"Chamber: {self._telemetry.chamberTemp}")
|
||||
# Status verarbeiten
|
||||
if 'gcode_state' in print_data:
|
||||
self._process_print_state(print_data['gcode_state'])
|
||||
|
||||
# Trigger update
|
||||
self.new_update("event_printer_data_update")
|
||||
|
||||
# Aktualisiere Druckerstatus
|
||||
if 'gcode_state' in print_data:
|
||||
print_job_state = print_data['gcode_state']
|
||||
self._log.debug(f"Received printer state update: {print_job_state}")
|
||||
# Verarbeite info-Daten
|
||||
if 'info' in payload:
|
||||
info_data = payload['info']
|
||||
self._log.info(f"Processing info data with keys: {list(info_data.keys())}")
|
||||
|
||||
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)
|
||||
else:
|
||||
self._log.warn(f"Unknown print job state: {print_job_state}")
|
||||
|
||||
# Aktualisiere auch die pybambu-Datenstruktur
|
||||
if hasattr(self._bambu_client, 'device') and hasattr(self._bambu_client.device, 'print_job'):
|
||||
self._bambu_client.device.print_job.gcode_state = print_job_state
|
||||
# HMS-Fehler verarbeiten
|
||||
if 'hms' in info_data:
|
||||
self._process_hms_errors(info_data['hms'])
|
||||
self.new_update("event_hms_errors")
|
||||
except Exception as e:
|
||||
self._log.error(f"Error processing print data: {e}")
|
||||
self._log.error(f"Error processing MQTT payload: {e}", exc_info=True)
|
||||
|
||||
def _process_temperature_data(self, temp_data):
|
||||
"""Verarbeitet Temperaturdaten aus MQTT-Nachrichten"""
|
||||
try:
|
||||
# Extruder Temperatur
|
||||
if 'nozzle_temp' in temp_data:
|
||||
self._telemetry.temp[0] = float(temp_data['nozzle_temp'])
|
||||
if 'target_nozzle_temp' in temp_data:
|
||||
self._telemetry.targetTemp[0] = float(temp_data['target_nozzle_temp'])
|
||||
|
||||
# Bett Temperatur
|
||||
if 'bed_temp' in temp_data:
|
||||
self._telemetry.bedTemp = float(temp_data['bed_temp'])
|
||||
if 'target_bed_temp' in temp_data:
|
||||
self._telemetry.bedTargetTemp = float(temp_data['target_bed_temp'])
|
||||
|
||||
# Kammer Temperatur
|
||||
if 'chamber_temp' in temp_data:
|
||||
self._telemetry.chamberTemp = float(temp_data['chamber_temp'])
|
||||
|
||||
self._log.debug(f"Updated temperatures - Nozzle: {self._telemetry.temp[0]}/{self._telemetry.targetTemp[0]}, " +
|
||||
f"Bed: {self._telemetry.bedTemp}/{self._telemetry.bedTargetTemp}, " +
|
||||
f"Chamber: {self._telemetry.chamberTemp}")
|
||||
except Exception as e:
|
||||
self._log.error(f"Error processing temperature data: {e}", exc_info=True)
|
||||
|
||||
def _process_print_state(self, print_job_state):
|
||||
"""Verarbeitet den Druckerstatus aus MQTT-Nachrichten"""
|
||||
try:
|
||||
self._log.debug(f"Received printer state update: {print_job_state}")
|
||||
|
||||
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)
|
||||
else:
|
||||
self._log.warn(f"Unknown print job state: {print_job_state}")
|
||||
|
||||
# Aktualisiere auch die pybambu-Datenstruktur
|
||||
if hasattr(self._bambu_client, 'device') and hasattr(self._bambu_client.device, 'print_job'):
|
||||
self._bambu_client.device.print_job.gcode_state = print_job_state
|
||||
except Exception as e:
|
||||
self._log.error(f"Error processing print state: {e}", exc_info=True)
|
||||
|
||||
def _process_hms_errors(self, hms_data):
|
||||
"""Verarbeitet HMS-Fehlerdaten aus MQTT-Nachrichten"""
|
||||
try:
|
||||
if hasattr(self._bambu_client, 'device') and hasattr(self._bambu_client.device, 'hms'):
|
||||
self._bambu_client.device.hms.update_from_payload(hms_data)
|
||||
self._log.debug("HMS error data updated")
|
||||
|
||||
# Überprüfe auf Fehler und zeige sie an
|
||||
if self._bambu_client.device.hms.errors != self._last_hms_errors and self._bambu_client.device.hms.errors["Count"] > 0:
|
||||
self._log.debug(f"HMS Error: {self._bambu_client.device.hms.errors}")
|
||||
for n in range(1, self._bambu_client.device.hms.errors["Count"] + 1):
|
||||
error = self._bambu_client.device.hms.errors[f"{n}-Error"].strip()
|
||||
self.sendIO(f"// action:notification {error}")
|
||||
self._last_hms_errors = self._bambu_client.device.hms.errors
|
||||
except Exception as e:
|
||||
self._log.error(f"Error processing HMS errors: {e}", exc_info=True)
|
||||
|
||||
def _update_bambu_client_state(self, payload):
|
||||
"""Aktualisiert die internen Zustände des BambuClient"""
|
||||
@ -422,11 +451,13 @@ class BambuVirtualPrinter:
|
||||
auth_token=self._settings.get(["auth_token"]),
|
||||
)
|
||||
|
||||
# Initialisiere den BambuClient hier, bevor wir die MQTT-Verbindung herstellen
|
||||
# Initialisiere die device-Eigenschaft manuell, wenn sie nicht vorhanden ist
|
||||
if not hasattr(bambu_client, 'device'):
|
||||
self._log.debug("Initializing BambuClient device attribute")
|
||||
# Stellen Sie sicher, dass wir den Client nur initialisieren, wenn er existiert
|
||||
bambu_client._init_device()
|
||||
self._log.debug("BambuClient has no device attribute, creating it manually")
|
||||
# Anstatt die nicht existierende _init_device Methode zu verwenden,
|
||||
# initialisieren wir den Client mit einer Verbindung, die später durch unsere ersetzt wird
|
||||
bambu_client.connect()
|
||||
bambu_client.disconnect() # Trennen Sie die automatische Verbindung sofort wieder
|
||||
|
||||
# Set up our own MQTT client
|
||||
self._mqtt_client = mqtt.Client()
|
||||
|
Loading…
x
Reference in New Issue
Block a user