import logging from enum import ( Enum, IntEnum, ) LOGGER = logging.getLogger(__package__) class Features(Enum): AUX_FAN = 1, CHAMBER_LIGHT = 2, CHAMBER_FAN = 3, CHAMBER_TEMPERATURE = 4, CURRENT_STAGE = 5, PRINT_LAYERS = 6, AMS = 7, EXTERNAL_SPOOL = 8, K_VALUE = 9, START_TIME = 10, AMS_TEMPERATURE = 11, CAMERA_RTSP = 13, START_TIME_GENERATED = 14, CAMERA_IMAGE = 15, DOOR_SENSOR = 16, MANUAL_MODE = 17, class FansEnum(Enum): PART_COOLING = 1, AUXILIARY = 2, CHAMBER = 3, HEATBREAK = 4, CURRENT_STAGE_IDS = { "default": "unknown", 0: "printing", 1: "auto_bed_leveling", 2: "heatbed_preheating", 3: "sweeping_xy_mech_mode", 4: "changing_filament", 5: "m400_pause", 6: "paused_filament_runout", 7: "heating_hotend", 8: "calibrating_extrusion", 9: "scanning_bed_surface", 10: "inspecting_first_layer", 11: "identifying_build_plate_type", 12: "calibrating_micro_lidar", # DUPLICATED? 13: "homing_toolhead", 14: "cleaning_nozzle_tip", 15: "checking_extruder_temperature", 16: "paused_user", 17: "paused_front_cover_falling", 18: "calibrating_micro_lidar", # DUPLICATED? 19: "calibrating_extrusion_flow", 20: "paused_nozzle_temperature_malfunction", 21: "paused_heat_bed_temperature_malfunction", 22: "filament_unloading", 23: "paused_skipped_step", 24: "filament_loading", 25: "calibrating_motor_noise", 26: "paused_ams_lost", 27: "paused_low_fan_speed_heat_break", 28: "paused_chamber_temperature_control_error", 29: "cooling_chamber", 30: "paused_user_gcode", 31: "motor_noise_showoff", 32: "paused_nozzle_filament_covered_detected", 33: "paused_cutter_error", 34: "paused_first_layer_error", 35: "paused_nozzle_clog", # X1 returns -1 for idle -1: "idle", # DUPLICATED # P1 returns 255 for idle 255: "idle", # DUPLICATED } CURRENT_STAGE_OPTIONS = list(set(CURRENT_STAGE_IDS.values())) # Conversion to set first removes the duplicates GCODE_STATE_OPTIONS = [ "failed", "finish", "idle", "init", "offline", "pause", "prepare", "running", "slicing", "unknown" ] SPEED_PROFILE = { 1: "silent", 2: "standard", 3: "sport", 4: "ludicrous" } FILAMENT_NAMES = { "default": "Unknown", "GFB00": "Bambu ABS", "GFB01": "Bambu ASA", "GFN03": "Bambu PA-CF", "GFN05": "Bambu PA6-CF", "GFN04": "Bambu PAHT-CF", "GFC00": "Bambu PC", "GFT01": "Bambu PET-CF", "GFG00": "Bambu PETG Basic", "GFG50": "Bambu PETG-CF", "GFA11": "Bambu PLA Aero", "GFA00": "Bambu PLA Basic", "GFA03": "Bambu PLA Impact", "GFA07": "Bambu PLA Marble", "GFA01": "Bambu PLA Matte", "GFA02": "Bambu PLA Metal", "GFA05": "Bambu PLA Silk", "GFA08": "Bambu PLA Sparkle", "GFA09": "Bambu PLA Tough", "GFA50": "Bambu PLA-CF", "GFS03": "Bambu Support For PA/PET", "GFS02": "Bambu Support For PLA", "GFS01": "Bambu Support G", "GFS00": "Bambu Support W", "GFU01": "Bambu TPU 95A", "GFB99": "Generic ABS", "GFB98": "Generic ASA", "GFS98": "Generic HIPS", "GFN98": "Generic PA-CF", "GFN99": "Generic PA", "GFC99": "Generic PC", "GFG99": "Generic PETG", "GFG98": "Generic PETG-CF", "GFL99": "Generic PLA", "GFL95": "Generic PLA-High Speed", "GFL96": "Generic PLA Silk", "GFL98": "Generic PLA-CF", "GFS99": "Generic PVA", "GFU99": "Generic TPU", "GFL05": "Overture Matte PLA", "GFL04": "Overture PLA", "GFB60": "PolyLite ABS", "GFB61": "PolyLite ASA", "GFG60": "PolyLite PETG", "GFL00": "PolyLite PLA", "GFL01": "PolyTerra PLA", "GFL03": "eSUN PLA+", "GFSL99_01": "Generic PLA Silk", "GFSL99_12": "Generic PLA Silk", "GFA12": "Bambu PLA Glow", "GFT97": "Generic PPS", "GFT98": "Generic PPS-CF", "GFU00": "Bambu TPU 95A HF", } # TODO: Update error lists with data from https://e.bambulab.com/query.php?lang=en HMS_ERRORS = { "0300_1000_0002_0001": "The 1st order mechanical resonance mode of X axis is low.", "0300_1000_0002_0002": "The 1st order mechanical resonance mode of X axis differ much...", "0300_0F00_0001_0001": "The accelerometer data is unavailable", "0300_0D00_0001_000B": "The Z axis motor seems got stuck when moving up", "0300_0D00_0001_0002": "Hotbed homing failed. The environmental vibration is too great", "0300_0D00_0001_0003": "The build plate is not placed properly ...", "0300_0D00_0002_0001": "Heatbed homing abnormal. There may be a bulge on the ...", "0300_0A00_0001_0005": "the static voltage of force sensor 1/2/3 is not 0 ...", "0300_0A00_0001_0004": "External disturbance was detected when testing the force sensor", "0300_0A00_0001_0003": "The sensitivity of heatbed force sensor 1/2/3 is too low....", "0300_0A00_0001_0002": "The sensitivity of heatbed force sensor 1/2/3 is low...", "0300_0A00_0001_0001": "The sensitivity of heatbed force sensor 1/2/3 is too high...", "0300_0400_0002_0001": "The speed of part cooling fan if too slow or stopped ...", "0300_0300_0002_0002": "The speed of hotend fan is slow ...", "0300_0300_0001_0001": "The speed of the hotend fan is too slow or stopped...", "0300_0600_0001_0001": "Motor-A has an open-circuit. There may be a loose connection, or the motor may have failed.", "0300_0600_0001_0002": "Motor-A has a short-circuit. It may have failed.", "0300_0600_0001_0003": "The resistance of Motor-A is abnormal, the motor may have failed.", "0300_0100_0001_0001": "The heatbed temperature is abnormal, the heater may have a short circuit.", "0300_0100_0001_0002": "The heatbed temperature is abnormal, the heater may have an open circuit, or the thermal switch may be open.", "0300_0100_0001_0003": "The heatbed temperature is abnormal, the heater is over temperature.", "0300_0100_0001_0006": "The heatbed temperature is abnormal, the sensor may have a short circuit.", "0300_0100_0001_0007": "The heatbed temperature is abnormal, the sensor may have an open circuit.", "0300_1300_0001_0001": "The current sensor of Motor-A is abnormal. This may be caused by a failure of the hardware sampling circuit.", "0300_4000_0002_0001": "Data transmission over the serial port is abnormal, the software system may be faulty.", "0300_4100_0001_0001": "The system voltage is unstable, triggering the power failure protection function.", "0300_0200_0001_0001": "The nozzle temperature is abnormal, the heater may be short circuit.", "0300_0200_0001_0002": "The nozzle temperature is abnormal, the heater may be open circuit.", "0300_0200_0001_0003": "The nozzle temperature is abnormal, the heater is over temperature.", "0300_0200_0001_0006": "The nozzle temperature is abnormal, the sensor may be short circuit.", "0300_0200_0001_0007": "The nozzle temperature is abnormal, the sensor may be open circuit.", "0300_1200_0002_0001": "The front cover of the toolhead fell off.", "0C00_0100_0001_0001": "The Micro Lidar camera is offline.", "0C00_0100_0002_0002": "The Micro Lidar camera is malfunctioning.", "0C00_0100_0001_0003": "Synchronization between Micro Lidar camera and MCU is abnormal.", "0C00_0100_0001_0004": "The Micro Lidar camera lens seems to be dirty.", "0C00_0100_0001_0005": "Micro Lidar OTP parameter is abnormal.", "0C00_0100_0002_0006": "Micro Lidar extrinsic parameter abnormal.", "0C00_0100_0002_0007": "Micro Lidar laser parameters are drifted.", "0C00_0100_0002_0008": "Failed to get image from chamber camera.", "0C00_0100_0001_0009": "Chamber camera dirty.", "0C00_0100_0001_000A": "The Micro Lidar LED may be broken.", "0C00_0100_0001_000B": "Failed to calibrate Micro Lidar.", "0C00_0200_0001_0001": "The horizontal laser is not lit.", "0C00_0200_0002_0002": "The horizontal laser is too thick.", "0C00_0200_0002_0003": "The horizontal laser is not bright enough.", "0C00_0200_0002_0004": "Nozzle height seems too low.", "0C00_0200_0001_0005": "A new Micro Lidar is detected.", "0C00_0200_0002_0006": "Nozzle height seems too high.", "0C00_0300_0002_0001": "Filament exposure metering failed.", "0C00_0300_0002_0002": "First layer inspection terminated due to abnormal lidar data.", "0C00_0300_0002_0004": "First layer inspection not supported for current print.", "0C00_0300_0002_0005": "First layer inspection timeout.", "0C00_0300_0003_0006": "Purged filaments may have piled up.", "0C00_0300_0003_0007": "Possible first layer defects.", "0C00_0300_0003_0008": "Possible spaghetti defects were detected.", "0C00_0300_0001_0009": "The first layer inspection module rebooted abnormally.", "0C00_0300_0003_000B": "Inspecting first layer.", "0C00_0300_0002_000C": "The build plate localization marker is not detected.", "0500_0100_0002_0001": "The media pipeline is malfunctioning.", "0500_0100_0002_0002": "USB camera is not connected.", "0500_0100_0002_0003": "USB camera is malfunctioning.", "0500_0100_0003_0004": "Not enough space in SD Card.", "0500_0100_0003_0005": "Error in SD Card.", "0500_0100_0003_0006": "Unformatted SD Card.", "0500_0200_0002_0001": "Failed to connect internet, please check the network connection.", "0500_0200_0002_0002": "Failed to login device.", "0500_0200_0002_0004": "Unauthorized user.", "0500_0200_0002_0006": "Liveview service is malfunctioning.", "0500_0300_0001_0001": "The MC module is malfunctioning. Please restart the device.", "0500_0300_0001_0002": "The toolhead is malfunctioning. Please restart the device.", "0500_0300_0001_0003": "The AMS module is malfunctioning. Please restart the device.", "0500_0300_0001_000A": "System state is abnormal. Please restore factory settings.", "0500_0300_0001_000B": "The screen is malfunctioning.", "0500_0300_0002_000C": "Wireless hardware error. Please turn off/on WiFi or restart the device.", "0500_0400_0001_0001": "Failed to download print job. Please check your network connection.", "0500_0400_0001_0002": "Failed to report print state. Please check your network connection.", "0500_0400_0001_0003": "The content of print file is unreadable. Please resend the print job.", "0500_0400_0001_0004": "The print file is unauthorized.", "0500_0400_0001_0006": "Failed to resume previous print.", "0500_0400_0002_0007": "The bed temperature exceeds the filament's vitrification temperature, which may cause a nozzle clog.", "0700_4000_0002_0001": "The filament buffer signal lost, the cable or position sensor may be malfunctioning.", "0700_4000_0002_0002": "The filament buffer position signal error, the position sensor may be malfunctioning.", "0700_4000_0002_0003": "The AMS Hub communication is abnormal, the cable may be not well connected.", "0700_4000_0002_0004": "The filament buffer signal is abnormal, the spring may be stuck.", "0700_4500_0002_0001": "The filament cutter sensor is malfunctioning. The sensor may be disconnected or damaged.", "0700_4500_0002_0002": "The filament cutter's cutting distance is too large. The XY motor may lose steps.", "0700_4500_0002_0003": "The filament cutter handle has not released. The handle or blade may be stuck.", "0700_5100_0003_0001": "AMS is disabled, please load filament from spool holder.", "07FF_2000_0002_0001": "External filament has run out, please load a new filament.", "07FF_2000_0002_0002": "External filament is missing, please load a new filament.", "07FF_2000_0002_0004": "Please pull out the filament on the spool holder from the extruder.", } # These errors cover those that are AMS and/or slot specific. # 070X_xYxx_xxxx_xxxx = AMS X (0 based index) Slot Y (0 based index) has the error. HMS_AMS_ERRORS = { "0700_0100_0001_0001": "AMS1 assist motor has slipped. The extrusion wheel may be worn down, or the filament may be too thin.", "0700_0100_0001_0003": "AMS1 assist motor torque control is malfunctioning. The current sensor may be faulty.", "0700_0100_0001_0004": "AMS1 assist motor speed control is malfunctioning. The speed sensor may be faulty.", "0700_0100_0002_0002": "AMS1 assist motor is overloaded. The filament may be tangled or stuck.", "0700_0200_0001_0001": "AMS1 filament speed and length error. The filament odometry may be faulty.", "0700_1000_0001_0001": "AMS1 slot 1 motor has slipped. The extrusion wheel may be malfunctioning, or the filament may be too thin.", "0700_1000_0001_0003": "AMS1 slot 1 motor torque control is malfunctioning. The current sensor may be faulty.", "0700_1000_0002_0002": "AMS1 slot 1 motor is overloaded. The filament may be tangled or stuck.", "0700_2000_0002_0001": "AMS1 slot 1 filament has run out.", "0700_2000_0002_0002": "AMS1 slot 1 is empty.", "0700_2000_0002_0003": "AMS1 slot 1 filament may be broken in AMS.", "0700_2000_0002_0004": "AMS1 slot 1 filament may be broken in the tool head.", "0700_2000_0002_0005": "AMS1 slot 1 filament has run out, and purging the old filament went abnormally, please check whether the filament is stuck in the tool head.", "0700_2000_0003_0001": "AMS1 slot 1 filament has run out. Please wait while old filament is purged.", "0700_2000_0003_0002": "AMS1 slot 1 filament has run out and automatically switched to the slot with the same filament.", "0700_6000_0002_0001": "AMS1 slot 1 is overloaded. The filament may be tangled or the spool may be stuck.", } HMS_SEVERITY_LEVELS = { "default": "unknown", 1: "fatal", 2: "serious", 3: "common", 4: "info" } HMS_MODULES = { "default": "unknown", 0x05: "mainboard", 0x0C: "xcam", 0x07: "ams", 0x08: "toolhead", 0x03: "mc" } class SdcardState(Enum): NO_SDCARD = 0x00000000, HAS_SDCARD_NORMAL = 0x00000100, HAS_SDCARD_ABNORMAL = 0x00000200, SDCARD_STATE_NUM = 0x00000300, class Home_Flag_Values(IntEnum): X_AXIS = 0x00000001, Y_AXIS = 0x00000002, Z_AXIS = 0x00000004, VOLTAGE220 = 0x00000008, XCAM_AUTO_RECOVERY_STEP_LOSS = 0x00000010, CAMERA_RECORDING = 0x00000020, # Gap AMS_CALIBRATE_REMAINING = 0x00000080, SD_CARD_PRESENT = 0x00000100, SD_CARD_ABNORMAL = 0x00000200, AMS_AUTO_SWITCH = 0x00000400, # Gap XCAM_ALLOW_PROMPT_SOUND = 0x00020000, WIRED_NETWORK = 0x00040000, FILAMENT_TANGLE_DETECT_SUPPORTED = 0x00080000, FILAMENT_TANGLE_DETECTED = 0x00100000, SUPPORTS_MOTOR_CALIBRATION = 0x00200000, # Gap DOOR_OPEN = 0x00800000, # Gap INSTALLED_PLUS = 0x04000000, SUPPORTED_PLUS = 0x08000000, # Gap