11from __future__ import annotations
22
33import collections
4- from dataclasses import dataclass , field
4+ from dataclasses import dataclass , field , asdict
55import math
66from pathlib import Path
77import queue
1111from octoprint_bambu_printer .printer .file_system .cached_file_view import CachedFileView
1212from octoprint_bambu_printer .printer .file_system .file_info import FileInfo
1313from octoprint_bambu_printer .printer .print_job import PrintJob
14- from pybambu import BambuClient , commands
14+ from octoprint_bambu_printer . printer . pybambu import BambuClient , commands
1515import logging
1616import logging .handlers
1717
@@ -43,6 +43,7 @@ class BambuPrinterTelemetry:
4343 lastTempAt : float = time .monotonic ()
4444 firmwareName : str = "Bambu"
4545 extruderCount : int = 1
46+ ams_current_tray : int = - 1
4647
4748
4849# noinspection PyBroadException
@@ -64,6 +65,7 @@ def __init__(
6465 self ._data_folder = data_folder
6566 self ._last_hms_errors = None
6667 self ._log = logging .getLogger ("octoprint.plugins.bambu_printer.BambuPrinter" )
68+ self .ams_data = self ._settings .get (["ams_data" ])
6769
6870 self ._state_idle = IdleState (self )
6971 self ._state_printing = PrintingState (self )
@@ -168,6 +170,22 @@ def project_files(self):
168170 def change_state (self , new_state : APrinterState ):
169171 self ._state_change_queue .put (new_state )
170172
173+ def _convert2serialize (self , obj ):
174+ if isinstance (obj , dict ):
175+ return {k : self ._convert2serialize (v ) for k , v in obj .items ()}
176+ elif hasattr (obj , "_ast" ):
177+ return self ._convert2serialize (obj ._ast ())
178+ elif not isinstance (obj , str ) and hasattr (obj , "__iter__" ):
179+ return [self ._convert2serialize (v ) for v in obj ]
180+ elif hasattr (obj , "__dict__" ):
181+ return {
182+ k : self ._convert2serialize (v )
183+ for k , v in obj .__dict__ .items ()
184+ if not callable (v ) and not k .startswith ('_' )
185+ }
186+ else :
187+ return obj
188+
171189 def new_update (self , event_type ):
172190 if event_type == "event_hms_errors" :
173191 self ._update_hms_errors ()
@@ -178,13 +196,25 @@ def _update_printer_info(self):
178196 device_data = self .bambu_client .get_device ()
179197 print_job_state = device_data .print_job .gcode_state
180198 temperatures = device_data .temperature
199+ ams_data = self ._convert2serialize (device_data .ams .data )
200+
201+ if self .ams_data != ams_data :
202+ self ._log .debug (f"Recieveid AMS Update: { ams_data } " )
203+ self .ams_data = ams_data
204+ self ._settings .set (["ams_data" ], ams_data )
205+ self ._settings .save (trigger_event = True )
181206
182207 self .lastTempAt = time .monotonic ()
183208 self ._telemetry .temp [0 ] = temperatures .nozzle_temp
184209 self ._telemetry .targetTemp [0 ] = temperatures .target_nozzle_temp
185210 self ._telemetry .bedTemp = temperatures .bed_temp
186211 self ._telemetry .bedTargetTemp = temperatures .target_bed_temp
187212 self ._telemetry .chamberTemp = temperatures .chamber_temp
213+ self ._telemetry .ams_current_tray = device_data .push_all_data ["ams" ]["tray_now" ] or - 1
214+
215+ if self ._telemetry .ams_current_tray != self ._settings .get_int (["ams_current_tray" ]):
216+ self ._settings .set_int (["ams_current_tray" ], self ._telemetry .ams_current_tray )
217+ self ._settings .save (trigger_event = True )
188218
189219 self ._log .debug (f"Received printer state update: { print_job_state } " )
190220 if (
@@ -214,6 +244,8 @@ def _update_hms_errors(self):
214244
215245 def on_disconnect (self , on_disconnect ):
216246 self ._log .debug (f"on disconnect called" )
247+ self .stop_continuous_status_report ()
248+ self .stop_continuous_temp_report ()
217249 return on_disconnect
218250
219251 def on_connect (self , on_connect ):
0 commit comments