Starting Klippy... Args: ['/home/pi1/klipper/klippy/klippy.py', '/home/pi1/printer_data/config/printer.cfg', '-l', '/home/pi1/printer_data/logs/klippy.log', '-I', '/home/pi1/printer_data/comms/klippy.serial', '-a', '/home/pi1/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-205-g5f0d252b' Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' Start printer at Sun Jun 18 20:40:36 2023 (1687113636.2 21.7) ===== Config file ===== [printer] kinematics = corexy max_velocity = 500 max_accel = 10000 max_z_velocity = 50 max_z_accel = 350 square_corner_velocity = 5 [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32f446xx_4C0031000151303530353135-if00 restart_method = command [mcu pitb] canbus_uuid = 0a754ef78da4 [mcu rpi] serial = /tmp/klipper_host_mcu [mcu sb2040] canbus_uuid = 62aff65e7dcf [temperature_sensor MCU_BTT_Octopus_CPU_temp] sensor_type = temperature_mcu min_temp = 0 max_temp = 100 [temperature_sensor MCU_PITB_CPU_temp] sensor_type = temperature_mcu sensor_mcu = pitb [temperature_sensor MCU_RPI_CPU_temp] sensor_type = temperature_host min_temp = 0 max_temp = 100 [temperature_sensor MCU_SB2040_CPU_temp] sensor_type = temperature_mcu sensor_mcu = sb2040 [adxl345] cs_pin = sb2040:gpio1 spi_software_sclk_pin = sb2040:gpio0 spi_software_mosi_pin = sb2040:gpio3 spi_software_miso_pin = sb2040:gpio2 [resonance_tester] accel_chip = adxl345 probe_points = 175,175,20 [input_shaper] shaper_type_x = mzv shaper_freq_x = 50.0 shaper_type_y = mzv shaper_freq_y = 37.0 [heater_bed] heater_pin = PA1 sensor_type = Generic 3950 sensor_pin = PF3 max_power = 1.0 pwm_cycle_time = 0.02 min_temp = 0 max_temp = 120 control = pid pid_kp = 62.696 pid_ki = 2.986 pid_kd = 329.155 [verify_heater heater_bed] check_gain_time = 90 [bed_mesh] algorithm = bicubic fade_end = 10.0 fade_start = 0.6 horizontal_move_z = 10 mesh_max = 325,325 mesh_min = 25,25 mesh_pps = 2,2 probe_count = 9,9 relative_reference_index = 40 speed = 300 [probe] pin = ^sb2040:gpio28 x_offset = 0 y_offset = 0 lift_speed = 25 samples = 3 samples_result = median sample_retract_dist = 2.50 samples_tolerance = 0.0025 samples_tolerance_retries = 10 speed = 6 activate_gcode = {% set PROBE_TEMP = 150 %} {% set MAX_TEMP = PROBE_TEMP + 5 %} {% set ACTUAL_TEMP = printer.extruder.temperature %} {% set TARGET_TEMP = printer.extruder.target %} {% if TARGET_TEMP > PROBE_TEMP %} { action_respond_info('Extruder temperature target of %.1fC is too high, lowering to %.1fC' % (TARGET_TEMP, PROBE_TEMP)) } M109 S{ PROBE_TEMP } {% else %} {% if ACTUAL_TEMP > MAX_TEMP %} { action_respond_info('Extruder temperature %.1fC is still too high, waiting until below %.1fC' % (ACTUAL_TEMP, MAX_TEMP)) } TEMPERATURE_WAIT SENSOR=extruder MAXIMUM={ MAX_TEMP } {% endif %} {% endif %} z_offset = -0.525 [quad_gantry_level] gantry_corners = -60,-10 410,420 points = 25,25 25,325 325,325 325,25 speed = 300 horizontal_move_z = 10 retries = 5 retry_tolerance = 0.005 max_adjust = 10 [safe_z_home] home_xy_position = 175,175 speed = 100 z_hop = 10 z_hop_speed = 25 [skew_correction] [temperature_sensor chamber_temp] sensor_pin = pitb:gpio26 pullup_resistor = 4700 sensor_type = ATC Semitec 104NT-4-R025H42G min_temp = -50 max_temp = 350 gcode_id = chamber [temperature_sensor toolhead_temp] sensor_type = ATC Semitec 104GT-2 sensor_pin = sb2040:gpio26 pullup_resistor = 4700 min_temp = -50 max_temp = 350 [output_pin caselight] pin = PD15 pwm = True shutdown_value = 0 value = 0.50 cycle_time = 0.01 [extruder] enable_pin = !sb2040:gpio7 step_pin = sb2040:gpio9 dir_pin = sb2040:gpio10 rotation_distance = 22.33 gear_ratio = 50:10 microsteps = 64 full_steps_per_rotation = 200 nozzle_diameter = 0.400 filament_diameter = 1.75 heater_pin = sb2040:gpio6 sensor_type = PT1000 pullup_resistor = 1000 sensor_pin = sb2040:gpio27 min_extrude_temp = 170 max_extrude_cross_section = 5 max_extrude_only_distance = 500 min_temp = 0 max_temp = 350 max_power = 1.0 pressure_advance = 0.040 pressure_advance_smooth_time = 0.040 control = pid pid_kp = 24.715 pid_ki = 1.420 pid_kd = 107.511 [firmware_retraction] retract_length = 0.5 retract_speed = 60 unretract_extra_length = 0 unretract_speed = 60 [gcode_arcs] resolution = 0.1 [tmc2209 extruder] uart_pin = sb2040:gpio8 interpolate = false run_current = 0.65 stealthchop_threshold = 0 [tmc5160 stepper_x] spi_bus = spi0a cs_pin = pitb:gpio10 diag0_pin = ^pitb:gpio24 run_current = 1.275 sense_resistor = 0.075 driver_hend = 3 driver_hstrt = 0 driver_sgt = 1 driver_tbl = 2 driver_toff = 3 stealthchop_threshold = 0 [tmc5160 stepper_y] spi_bus = spi0a cs_pin = pitb:gpio6 diag0_pin = ^pitb:gpio23 run_current = 1.275 sense_resistor = 0.075 driver_hend = 3 driver_hstrt = 0 driver_sgt = 1 driver_tbl = 2 driver_toff = 3 stealthchop_threshold = 0 [tmc2209 stepper_z] uart_pin = PC6 interpolate = false run_current = 1.0 sense_resistor = 0.110 driver_tbl = 1 driver_toff = 3 driver_hstrt = 3 driver_hend = 3 stealthchop_threshold = 0 [tmc2209 stepper_z1] uart_pin = PC7 interpolate = false run_current = 1.0 sense_resistor = 0.110 driver_tbl = 1 driver_toff = 3 driver_hstrt = 3 driver_hend = 3 stealthchop_threshold = 0 [tmc2209 stepper_z2] uart_pin = PF2 interpolate = false run_current = 1.0 sense_resistor = 0.110 driver_tbl = 1 driver_toff = 3 driver_hstrt = 3 driver_hend = 3 stealthchop_threshold = 0 [tmc2209 stepper_z3] uart_pin = PE4 interpolate = false run_current = 1.0 sense_resistor = 0.110 driver_tbl = 1 driver_toff = 3 driver_hstrt = 3 driver_hend = 3 stealthchop_threshold = 0 [stepper_x] step_pin = pitb:gpio12 dir_pin = !pitb:gpio11 enable_pin = !pitb:gpio9 rotation_distance = 40 microsteps = 64 full_steps_per_rotation = 200 endstop_pin = sb2040:gpio29 position_min = 0 position_endstop = 350 position_max = 350 homing_speed = 100 homing_retract_dist = 5 homing_positive_dir = true [stepper_y] step_pin = pitb:gpio8 dir_pin = !pitb:gpio7 enable_pin = !pitb:gpio5 rotation_distance = 40 microsteps = 64 full_steps_per_rotation = 200 endstop_pin = tmc5160_stepper_y:virtual_endstop position_min = 0 position_endstop = 355 position_max = 355 homing_speed = 100 homing_retract_dist = 5 homing_positive_dir = true [stepper_z] step_pin = PF11 dir_pin = PG3 enable_pin = !PG5 rotation_distance = 40 gear_ratio = 80:16 microsteps = 64 endstop_pin = probe:z_virtual_endstop position_max = 300 position_min = -5 homing_speed = 25 second_homing_speed = 5 homing_retract_dist = 5 homing_retract_speed = 25 [stepper_z1] step_pin = PG4 dir_pin = !PC1 enable_pin = !PA0 rotation_distance = 40 gear_ratio = 80:16 microsteps = 64 [stepper_z2] step_pin = PF9 dir_pin = PF10 enable_pin = !PG2 rotation_distance = 40 gear_ratio = 80:16 microsteps = 64 [stepper_z3] step_pin = PC13 dir_pin = !PF0 enable_pin = !PF1 rotation_distance = 40 gear_ratio = 80:16 microsteps = 64 [controller_fan controller_fan] pin = PD12 max_power = 1.0 kick_start_time = 0.5 heater = heater_bed fan_speed = 0.35 [controller_fan SB2040_fan] pin = sb2040:gpio15 max_power = 1.0 kick_start_time = 0.5 heater = extruder stepper = extruder, stepper_x, stepper_y, stepper_z fan_speed = 1.0 [fan] pin = sb2040:gpio13 kick_start_time = 0.5 off_below = 0.10 [fan_generic exhaust_fan] pin = PD13 max_power = 1.0 [heater_fan hotend_fan] pin = sb2040:gpio14 max_power = 1.0 kick_start_time = 0.5 heater = extruder heater_temp = 50.0 [display] lcd_type = uc1701 cs_pin = PE9 a0_pin = PE10 rst_pin = PE12 encoder_pins = ^PB2, ^PB1 click_pin = ^!PE7 contrast = 63 display_group = __voron_display menu_timeout = 60 spi_software_miso_pin = PA6 spi_software_mosi_pin = PA7 spi_software_sclk_pin = PA5 [neopixel display] pin = PE13 chain_count = 3 initial_red = 0.2 initial_green = 0.6784 initial_blue = 0.2392 color_order = RGB [delayed_gcode setdisplayneopixel] initial_duration = 1 gcode = SET_LED LED=display RED=0.2 GREEN=0.6784 BLUE=0.2392 INDEX=1 TRANSMIT=0 SET_LED LED=display RED=0.2 GREEN=0.6784 BLUE=0.2392 INDEX=2 TRANSMIT=0 SET_LED LED=display RED=0.2 GREEN=0.6784 BLUE=0.2392 INDEX=3 [output_pin _beeper] pin = PE8 pwm = TRUE value = 0 shutdown_value = 0 cycle_time = 0.001 [display_template _vheater_temperature] param_heater_name = "extruder" text = {% if param_heater_name in printer %} {% set heater = printer[param_heater_name] %} {% if param_heater_name == "heater_bed" %} {% if heater.target %} {% set frame = (printer.toolhead.estimated_print_time|int % 2) + 1 %} ~bed_heat{frame}~ {% else %} ~bed~ {% endif %} {% else %} ~extruder~ {% endif %} { "%3.0f" % (heater.temperature,) } {% if heater.target and (heater.temperature - heater.target)|abs > 2 %} ~right_arrow~ { "%0.0f" % (heater.target,) } {% endif %} ~degrees~ {% endif %} [display_data __voron_display extruder] position = 0, 0 text = { render("_vheater_temperature", param_heater_name="extruder") } [display_data __voron_display fan] position = 0, 10 text = {% if 'fan' in printer %} {% set speed = printer.fan.speed %} {% if speed %} {% set frame = (printer.toolhead.estimated_print_time|int % 2) + 1 %} ~fan{frame}~ {% else %} ~fan1~ {% endif %} { "{:>4.0%}".format(speed) } {% endif %} [display_data __voron_display bed] position = 1, 0 text = { render("_vheater_temperature", param_heater_name="heater_bed") } [display_data __voron_display progress_text] position = 1, 10 text = {% set progress = printer.display_status.progress %} { "{:^6.0%}".format(progress) } [display_data __voron_display progress_text2] position = 1, 10 text = {% set progress = printer.display_status.progress %} { draw_progress_bar(1, 10, 6, progress) } [display_data __voron_display printing_time] position = 2, 10 text = {% set ptime = printer.idle_timeout.printing_time %} { "%02d:%02d" % (ptime // (60 * 60), (ptime // 60) % 60) } [display_data __voron_display chamber] position = 2, 0 text = {% set chamber = printer['temperature_sensor Chamber'] %} ~chamber~ { "%3.0f" % (chamber.temperature,) } ~degrees~ [display_data __voron_display print_status] position = 3, 0 text = {% if printer.display_status.message %} { printer.display_status.message } {% elif printer.idle_timeout.printing_time %} {% set pos = printer.toolhead.position %} { "X%-4.0fY%-4.0fZ%-5.2f" % (pos.x, pos.y, pos.z) } {% else %} { "V2.2478 " } ~voron~ {% endif %} [display_glyph chamber] data = ................ **************** *....*....*....* *....*....*....* *....******....* *..............* *..............* *.....****.....* *.***.*..*.***.* *.....****.....* *......**......* *..............* *.************.* *...*......*...* **************** ................ [display_glyph voron] data = ......***....... ....*******..... ...*********.... .*************.. *****..***..***. ****..***..****. ***..***..*****. **..***..******. ******..***..**. *****..***..***. ****..***..****. ***..***..*****. .*************.. ...*********.... ....*******..... ......***....... [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = "Cancel the running print" rename_existing = CANCEL_PRINT_BASE gcode = TURN_OFF_HEATERS M220 S100 M221 S100 SAFE_RETRACT SAFE_PARK M106 S0 CANCEL_PRINT_BASE [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE="{printer[printer.toolhead.extruder].target}" PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL {rawparams} [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = 0 gcode = {% set E = printer["gcode_macro PAUSE"].extrude|float %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} G91; Use relative coordinates G1 E{E} F2100 {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} [gcode_macro SET_PAUSE_NEXT_LAYER] description = Enable a pause if the next layer is reached gcode = {% set pause_next_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_next_layer %} {% set ENABLE = params.ENABLE | default(1) | int != 0 %} {% set MACRO = params.MACRO | default(pause_next_layer.call, True) %} SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_next_layer VALUE="{{ 'enable': ENABLE, 'call': MACRO }}" [gcode_macro SET_PAUSE_AT_LAYER] description = Enable/disable a pause if a given layer number is reached gcode = {% set pause_at_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_at_layer %} {% set ENABLE = params.ENABLE | int != 0 if params.ENABLE is defined else params.LAYER is defined %} {% set LAYER = params.LAYER | default(pause_at_layer.layer) | int %} {% set MACRO = params.MACRO | default(pause_at_layer.call, True) %} SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_at_layer VALUE="{{ 'enable': ENABLE, 'layer': LAYER, 'call': MACRO }}" [gcode_macro SET_PRINT_STATS_INFO] rename_existing = SET_PRINT_STATS_INFO_BASE description = Overwrite, to get pause_next_layer and pause_at_layer feature variable_pause_next_layer = { 'enable': False, 'call': "PAUSE" } variable_pause_at_layer = { 'enable': False, 'layer': 0, 'call': "PAUSE" } gcode = {% if pause_next_layer.enable %} {action_respond_info("%s, forced by pause_next_layer" % pause_next_layer.call)} {pause_next_layer.call} SET_PAUSE_NEXT_LAYER ENABLE=0 {% elif pause_at_layer.enable and params.CURRENT_LAYER is defined and params.CURRENT_LAYER|int == pause_at_layer.layer %} {action_respond_info("%s, forced by pause_at_layer [%d]" % (pause_at_layer.call, pause_at_layer.layer))} {pause_at_layer.call} SET_PAUSE_AT_LAYER ENABLE=0 {% endif %} SET_PRINT_STATS_INFO_BASE {rawparams} [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} {% set use_custom = False if not macro_found else False if client.use_custom_pos is not defined else True if client.use_custom_pos|lower == 'true' else False %} {% set custom_park_x = 0.0 if not macro_found else client.custom_park_x|default(0.0) %} {% set custom_park_y = 0.0 if not macro_found else client.custom_park_y|default(0.0) %} {% set park_dz = 2.0 if not macro_found else client.custom_park_dz|default(2.0)|abs %} {% set sp_hop = 900 if not macro_found else client.speed_hop|default(15) * 60 %} {% set sp_move = velocity * 60 if not macro_found else client.speed_move|default(velocity) * 60 %} {% set origin = printer.gcode_move.homing_origin %} {% set act = printer.gcode_move.gcode_position %} {% set max = printer.toolhead.axis_maximum %} {% set cone = printer.toolhead.cone_start_z|default(max.z) %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set z_min = params.Z_MIN|default(0)|float %} {% set z_park = [[(act.z + park_dz), z_min]|max, (max.z - origin.z)]|min %} {% set x_park = params.X if params.X is defined else custom_park_x if use_custom else 0.0 if round_bed else (max.x - 5.0) %} {% set y_park = params.Y if params.Y is defined else custom_park_y if use_custom else (max.y - 5.0) if round_bed and z_park < cone else 0.0 if round_bed else (max.y - 5.0) %} _CLIENT_RETRACT {% if "xyz" in printer.toolhead.homed_axes %} G90 G1 Z{z_park} F{sp_hop} G1 X{x_park} Y{y_park} F{sp_move} {% if not printer.gcode_move.absolute_coordinates %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} [gcode_macro _CLIENT_EXTRUDE] description = Extrudes, if the extruder is hot enough gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set use_fw_retract = False if not macro_found else False if client.use_fw_retract is not defined else True if client.use_fw_retract|lower == 'true' and printer.firmware_retraction is defined else False %} {% set length = (params.LENGTH|float) if params.LENGTH is defined else 1.0 if not macro_found else client.unretract|default(1.0) %} {% set speed = params.SPEED if params.SPEED is defined else 35 if not macro_found else client.speed_unretract|default(35) %} {% set absolute_extrude = printer.gcode_move.absolute_extrude %} {% if printer.extruder.can_extrude %} {% if use_fw_retract %} {% if length < 0 %} G10 {% else %} G11 {% endif %} {% else %} M83 G1 E{length} F{(speed|float|abs) * 60} {% if absolute_extrude %} M82 {% endif %} {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} [gcode_macro _CLIENT_RETRACT] description = Retracts, if the extruder is hot enough gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set length = (params.LENGTH|float) if params.LENGTH is defined else 1.0 if not macro_found else client.retract|default(1.0) %} {% set speed = params.SPEED if params.SPEED is defined else 35 if not macro_found else client.speed_retract|default(35) %} _CLIENT_EXTRUDE LENGTH=-{length|float|abs} SPEED={speed|float|abs} [gcode_macro TEST_PROBE_ACCURACY] variable_start_idle_minutes = 0 variable_bed_temp = 0 variable_extruder_temp = 0 variable_bed_soak_minutes = 0 variable_extruder_soak_minutes = 0 variable_dwell_seconds = 0 variable_dwell_lift_z = 0 variable_end_idle_minutes = 0 variable_state = 'start' variable_next_state = 'none' gcode = SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=start_idle_minutes VALUE={ params.START_IDLE_MINUTES|default(5)|int } SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=bed_temp VALUE={ params.BED_TEMP|default(110)|int } SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=extruder_temp VALUE={ params.EXTRUDER_TEMP|default(150)|int } SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=bed_soak_minutes VALUE={ params.BED_SOAK_MINUTES|default(30)|int } SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=extruder_soak_minutes VALUE={ params.EXTRUDER_SOAK_MINUTES|default(15)|int } SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=dwell_seconds VALUE={ params.DWELL_SECONDS|default(1)|int } SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=dwell_lift_z VALUE={ params.DWELL_LIFT_Z|default(-1)|int } SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=end_idle_minutes VALUE={ params.END_IDLE_MINUTES|default(10)|int } SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=state VALUE='"start"' SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=next_state VALUE='"none"' UPDATE_DELAYED_GCODE ID=probe_accuracy_loop DURATION=1 [delayed_gcode probe_accuracy_loop] gcode = {% set tmacro = printer['gcode_macro TEST_PROBE_ACCURACY'] %} {% if tmacro.state == 'start' %} { action_respond_info('TEST_PROBE_ACCURACY: START') } SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=state VALUE='"start_idle"' SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=next_state VALUE='"start_idle_done"' UPDATE_DELAYED_GCODE ID=probe_accuracy_set_next_state DURATION={ tmacro.start_idle_minutes|int * 60 } {% elif tmacro.state == 'start_idle_done' %} {% if tmacro.bed_temp >= 0 %} M140 S{ tmacro.bed_temp } { action_respond_info('TEST_PROBE_ACCURACY: BED HEATING TO %s' % tmacro.bed_temp) } SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=state VALUE='"bed_heating"' {% else %} SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=state VALUE='"bed_soaked"' {% endif %} {% elif tmacro.state == 'bed_heating' %} {% if printer.heater_bed.temperature >= tmacro.bed_temp %} { action_respond_info('TEST_PROBE_ACCURACY: BED HEATED TO %s' % tmacro.bed_temp) } SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=state VALUE='"bed_soaking"' SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=next_state VALUE='"bed_soaked"' UPDATE_DELAYED_GCODE ID=probe_accuracy_set_next_state DURATION={ tmacro.bed_soak_minutes|int * 60 } {% endif %} {% elif tmacro.state == 'bed_soaked' %} {% if tmacro.bed_temp >= 0 %} { action_respond_info('TEST_PROBE_ACCURACY: BED SOAKED') } {% endif %} {% if tmacro.extruder_temp >= 0 %} M104 S{ tmacro.extruder_temp } { action_respond_info('TEST_PROBE_ACCURACY: EXTRUDER HEATING TO %s' % tmacro.extruder_temp) } SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=state VALUE='"extruder_heating"' {% else %} SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=state VALUE='"extruder_soaked"' {% endif %} {% elif tmacro.state == 'extruder_heating' %} {% if printer.extruder.temperature >= tmacro.extruder_temp %} { action_respond_info('TEST_PROBE_ACCURACY: EXTRUDER HEATED TO %s' % tmacro.extruder_temp) } SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=state VALUE='"extruder_soaking"' SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=next_state VALUE='"extruder_soaked"' UPDATE_DELAYED_GCODE ID=probe_accuracy_set_next_state DURATION={ tmacro.extruder_soak_minutes|int * 60 } {% endif %} {% elif tmacro.state == 'extruder_soaked' %} {% if tmacro.extruder_temp >= 0 %} { action_respond_info('TEST_PROBE_ACCURACY: EXTRUDER SOAKED') } {% endif %} TURN_OFF_HEATERS SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=state VALUE='"end_idle"' SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=next_state VALUE='"done"' UPDATE_DELAYED_GCODE ID=probe_accuracy_set_next_state DURATION={ tmacro.end_idle_minutes|int * 60 } {% elif tmacro.state == 'done' %} { action_respond_info('TEST_PROBE_ACCURACY: DONE') } G90 G1 Z30 UPDATE_DELAYED_GCODE ID=probe_accuracy_loop DURATION=0 {% endif %} {% if tmacro.state != 'done' %} M105 PROBE_ACCURACY {% if tmacro.dwell_lift_z >= 0 %} G1 Z{ tmacro.dwell_lift_z } {% endif %} M400 UPDATE_DELAYED_GCODE ID=probe_accuracy_loop DURATION={ tmacro.dwell_seconds } {% endif %} [delayed_gcode probe_accuracy_set_next_state] gcode = {% set tmacro = printer['gcode_macro TEST_PROBE_ACCURACY'] %} SET_GCODE_VARIABLE MACRO=TEST_PROBE_ACCURACY VARIABLE=state VALUE='"{ tmacro.next_state }"' [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = True variable_status_macro = 'STATUS_MESHING' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' gcode = {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set bed_mesh_min = printer.configfile.settings.bed_mesh.mesh_min %} {% set bed_mesh_max = printer.configfile.settings.bed_mesh.mesh_max %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (printer.configfile.settings.bed_mesh.probe_count[0]-2) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (printer.configfile.settings.bed_mesh.probe_count[1]-2) %} {% set x_min = bed_mesh_min[0] %} {% set y_min = bed_mesh_min[1] %} {% set x_max = bed_mesh_max[0] %} {% set y_max = bed_mesh_max[1] %} { action_respond_info("{} points, clamping to mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% if all_points %} {% set fuzz_range = range(fuzz_min * 100 | int, fuzz_max * 100 | int) %} {% set x_min = ( bed_mesh_min[0], ((all_points | map(attribute=0) | min - (fuzz_range | random / 100.0)) | default(bed_mesh_min[0])) ) | max %} {% set y_min = ( bed_mesh_min[1], ((all_points | map(attribute=1) | min - (fuzz_range | random / 100.0)) | default(bed_mesh_min[1])) ) | max %} {% set x_max = ( bed_mesh_max[0], ((all_points | map(attribute=0) | max + (fuzz_range | random / 100.0)) | default(bed_mesh_max[0])) ) | min %} {% set y_max = ( bed_mesh_max[1], ((all_points | map(attribute=1) | max + (fuzz_range | random / 100.0)) | default(bed_mesh_max[1])) ) | min %} {% endif %} {% else %} {% set x_min = [ bed_mesh_min[0], (all_points | map(attribute=0) | min | default(bed_mesh_min[0])) ] | max %} {% set y_min = [ bed_mesh_min[1], (all_points | map(attribute=1) | min | default(bed_mesh_min[1])) ] | max %} {% set x_max = [ bed_mesh_max[0], (all_points | map(attribute=0) | max | default(bed_mesh_max[0])) ] | min %} {% set y_max = [ bed_mesh_max[1], (all_points | map(attribute=1) | max | default(bed_mesh_max[1])) ] | min %} {% endif %} { action_respond_info("Object bounds, clamped to the bed_mesh: {!r}, {!r}".format( (x_min, y_min), (x_max, y_max), )) } {% set points_x = (((x_max - x_min) / max_probe_point_distance_x) | int) + 2 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | int) + 2 %} {% if (([points_x, points_y]|max) > 6) %} {% set algorithm = "bicubic" %} {% set min_points = 4 %} {% else %} {% set algorithm = "lagrange" %} {% set min_points = 3 %} {% endif %} { action_respond_info( "Algorithm: {}".format(algorithm)) } {% set points_x = [points_x, min_points]|max %} {% set points_y = [points_y, min_points]|max %} { action_respond_info( "Points: x: {}, y: {}".format(points_x, points_y) ) } {% if printer.configfile.settings.bed_mesh.relative_reference_index is defined %} {% set ref_index = (points_x * points_y / 2) | int %} { action_respond_info( "Reference index: {}".format(ref_index) ) } {% else %} {% set ref_index = -1 %} {% endif %} {% if probe_dock_enable == True %} {attach_macro} {% endif %} {% if led_enable == True %} {status_macro} {% endif %} _BED_MESH_CALIBRATE mesh_min={x_min},{y_min} mesh_max={x_max},{y_max} ALGORITHM={algorithm} PROBE_COUNT={points_x},{points_y} RELATIVE_REFERENCE_INDEX={ref_index} {% if probe_dock_enable == True %} {detach_macro} {% endif %} [gcode_macro _AIR_FILTER_VARIABLES] variable_fan = 'fan_generic exhaust_fan' variable_hours_until_replacement = 50 variable_replacement_gcode = 'M117 Replace Filter Media' variable_time = -1 gcode = [gcode_macro RESET_AIR_FILTER] description = Resets the air-filter replacement timer gcode = SET_GCODE_VARIABLE MACRO=_AIR_FILTER_VARIABLES VARIABLE=time VALUE=0 SAVE_VARIABLE VARIABLE=air_filter_time VALUE=0 { action_respond_info("Air filter timer has been reset.") } [gcode_macro QUERY_AIR_FILTER] description = Displays the amount of time the air filter has run since it was last reset. gcode = {% set hours = "%.2f"|format(printer['gcode_macro _AIR_FILTER_VARIABLES'].time|int / 3600) %} { action_respond_info("Air Filter Hours: " + hours) } [delayed_gcode _AIR_FILTER_TIMER] initial_duration = 1 gcode = {% set cached_time = printer['gcode_macro _AIR_FILTER_VARIABLES'].time|int %} {% if cached_time == -1 %} {% set cached_time = printer.save_variables.variables.air_filter_time|default(0) %} SET_GCODE_VARIABLE MACRO=_AIR_FILTER_VARIABLES VARIABLE=time VALUE={ cached_time } {% endif %} {% if printer[printer['gcode_macro _AIR_FILTER_VARIABLES'].fan].speed|float > 0 %} SET_GCODE_VARIABLE MACRO=_AIR_FILTER_VARIABLES VARIABLE=time VALUE={ cached_time + 1} {% endif %} {% set replacement_seconds = printer['gcode_macro _AIR_FILTER_VARIABLES'].hours_until_replacement|float * 3600 %} {% if cached_time > replacement_seconds %} { printer['gcode_macro _AIR_FILTER_VARIABLES'].replacement_gcode } {% endif %} UPDATE_DELAYED_GCODE ID=_AIR_FILTER_TIMER DURATION=1 [delayed_gcode _AIR_FILTER_FLUSH_TIMER] initial_duration = 300 gcode = {% set saved_time = printer.save_variables.variables.air_filter_time|default(0)|float %} {% set actual_time = printer['gcode_macro _AIR_FILTER_VARIABLES'].time|float %} {% if saved_time != actual_time %} SAVE_VARIABLE VARIABLE=air_filter_time VALUE={actual_time} {% endif %} UPDATE_DELAYED_GCODE ID=_AIR_FILTER_FLUSH_TIMER DURATION=300 [gcode_macro CG28] gcode = {% if "xyz" not in printer.toolhead.homed_axes %} G28 {% endif %} [gcode_macro CQGL] gcode = {% if printer.quad_gantry_level.applied == False %} {% if "xyz" not in printer.toolhead.homed_axes %} G28 {% endif %} QUAD_GANTRY_LEVEL G28 Z {% endif %} [gcode_macro LOAD_UNLOAD_POS] gcode = {% if not 'xyz' in printer.toolhead.homed_axes %} M117 Homing... G28 {% endif %} M117 Move Extruder to load/unload position G90 G0 X300 Y10 Z100 F6000 [gcode_macro CHANGE_FILAMENT] gcode = {% set TEMP = params.TEMP|default(230)|float %} SAVE_GCODE_STATE NAME=CHANGE_FILAMENT_state PAUSE UNLOAD_FILAMENT RESTORE_GCODE_STATE NAME=CHANGE_FILAMENT_state [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=UNLOAD_FILAMENT_state LOAD_UNLOAD_POS {% set FILAMENT = params.FILAMENT|default('ABS')|string %} {% set TEMP = params.TEMP|default(250)|float %} {% set DISTANCE = params.DISTANCE|default(105)|float %} M400 _LOW_TEMP_CHECK T={TEMP} M117 {FILAMENT} Unloading... M82 G92 E0 G1 E2 F3600 G1 E0 F3600 G1 E3 F3600 G1 E0 F3600 G1 E4 F3600 G1 E0 F3600 M83 G1 E-20 F3600 G4 P3000 G1 E{DISTANCE|float * -1} F3000 M400 TURN_OFF_HEATERS M117 RESTORE_GCODE_STATE NAME=UNLOAD_FILAMENT_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=LOAD_FILAMENT_state LOAD_UNLOAD_POS {% set FILAMENT = params.FILAMENT|default('ABS')|string %} {% set TEMP = params.TEMP|default(250)|float %} {% set DISTANCE = params.DISTANCE|default(105)|float %} M400 _LOW_TEMP_CHECK T={TEMP} M117 {FILAMENT} Loading... M83 G92 E0 G1 E{DISTANCE|float} F200 G1 E50 F150 G92 E0 M400 TURN_OFF_HEATERS M117 RESTORE_GCODE_STATE NAME=LOAD_FILAMENT_state [gcode_macro CLEAN_NOZZLE] gcode = {% if 'xyz' not in printer.toolhead.homed_axes %} SAFE_HOME {% endif %} QUERY_PROBE {% if not printer.probe.last_query %} DOCK_PROBE {% endif %} _CLEAN_NOZZLE [gcode_macro _CLEAN_NOZZLE] variable_location_bucket_rear = True variable_enable_purge = False variable_purge_len = 10 variable_purge_spd = 300 variable_purge_temp_min = 220 variable_purge_ret = 2 variable_ooze_dwell = 2 variable_brush_top = 2 variable_clearance_z = 7 variable_wipe_qty = 7 variable_prep_spd_xy = 18000 variable_prep_spd_z = 1500 variable_wipe_spd_xy = 12000 variable_brush_start = 203 variable_brush_width = 44 variable_brush_front = 302 variable_brush_depth = 10 variable_bucket_left_width = 25 variable_bucket_right_width = 25 variable_bucket_gap = 22 variable_bucket_start = 182 variable_bucket_pos = 1 gcode = {% if "xyz" in printer.toolhead.homed_axes %} SAVE_GCODE_STATE NAME=clean_nozzle G90 {% set Ry = printer.configfile.config["stepper_y"]["position_max"]|float %} {% if enable_purge %} SET_GCODE_VARIABLE MACRO=clean_nozzle VARIABLE=bucket_pos VALUE={(range(2) | random)} G1 Z{brush_top + clearance_z} F{prep_spd_z} {% if location_bucket_rear %} G1 Y{Ry} F{prep_spd_xy} {% else %} G1 Y{brush_front + (brush_depth / 2)} F{prep_spd_xy} {% endif %} G1 X{bucket_start + (bucket_left_width / (2 - bucket_pos)) + (bucket_pos * bucket_gap) + (bucket_pos * (bucket_right_width / 2))} {% if printer.extruder.temperature >= purge_temp_min %} M83 G1 E{purge_len} F{purge_spd} G1 E-{purge_ret} F{purge_spd * 5} G4 P{ooze_dwell * 1000} G92 E0 {% endif %} {% endif %} G1 Z{brush_top + clearance_z} F{prep_spd_z} G1 X{brush_start + (brush_width * bucket_pos)} F{prep_spd_xy} {% if location_bucket_rear %} G1 Y{Ry} {% else %} G1 Y{brush_front + (brush_depth / 2)} {% endif %} G1 Z{brush_top} F{prep_spd_z} {% for wipes in range(1, (wipe_qty + 1)) %} G1 X{brush_start + (brush_width * (1 - bucket_pos))} F{wipe_spd_xy} G1 X{brush_start + (brush_width * bucket_pos)} F{wipe_spd_xy} {% endfor %} M117 Cleaned! G1 Z{brush_top + clearance_z} F{prep_spd_z} RESTORE_GCODE_STATE NAME=clean_nozzle {% else %} { action_raise_error("Please home your axes!") } M117 Please home first! {% endif %} [gcode_macro PRESSURE_ADVANCE_LIST] description = List all filament pressure advance settings gcode = {% if not printer.save_variables.variables.pressure_advance %} {action_respond_info("PRESSURE ADVANCE: No filament defined ABORDED")} {% else %} {% set pa_dic = printer.save_variables.variables.pressure_advance %} {% set out = ["PRESSURE ADVANCE: Defined filaments"] %} {% for filament in pa_dic|sort(attribute='id') %} {% set _dummy = out.append("%s" % filament.id) %} {% for setup in filament.val|sort(attribute='profile') %} {% set _dummy = out.append("Profile: %s | Pressure Advance: %1.03f | Smooth Time: %1.03f" % (setup.profile, setup.pa, setup.st)) %} {% endfor %} {% endfor %} {action_respond_info(out|join("\n"))} {% endif %} [gcode_macro PRESSURE_ADVANCE_ADD] description = Add or change pressure advance settings gcode = {% if 'FILAMENT' not in params|upper %} {action_respond_info("PRESSURE ADVANCE: FILAMENT must be defined use \"PRESSURE_ADVANCE_ADD FILAMENT=id\" as a minimum")} {% else %} {% set cfg = printer.configfile.settings.extruder %} {% set id = params.FILAMENT|string %} {% set profile = params.PROFILE|string %} {% if not printer.save_variables.variables.pressure_advance %} {action_respond_info("PRESSURE ADVANCE: Initialize with Filament %s" % (id))} {% set pa_dic = [{'id' : id, 'val': [{'profile': profile, 'pa' : params.PRESSURE_ADVANCE|default(cfg.pressure_advance)|float|round(3), 'st' : params.SMOOTH_TIME|default(cfg.pressure_advance_smooth_time)|float|round(3)}]}] %} {% else %} {% set pa_dic = printer.save_variables.variables.pressure_advance %} {% for filament in pa_dic %} {% if id == filament.id %} {% set id_index = loop.index0 %} {% for setup in filament.val %} {% if profile == setup.profile %} {% set change_txt = [] %} {% if 'PRESSURE_ADVANCE' in params|upper %} {% set _dummy = change_txt.append("PRESSURE ADVANCE") %} {% set _dummy = pa_dic[id_index].val[loop.index0].update({'pa': params.PRESSURE_ADVANCE|float|round(3)}) %} {% endif %} {% if 'SMOOTH_TIME' in params|upper %} {% set _dummy = change_txt.append("SMOOTH TIME") %} {% set _dummy = pa_dic[id_index].val[loop.index0].update({'st': params.SMOOTH_TIME|float|round(3)}) %} {% endif %} {% if change_txt|length > 0 %} {action_respond_info("PRESSURE ADVANCE: Changed %s at Filament %s Profile %s" % (change_txt|join(" and "),id,profile))} {% else %} {action_respond_info("PRESSURE ADVANCE: Nothing changed at Filament %s Profile %s" % (id,profile))} {% endif %} {% elif loop.last %} {action_respond_info("PRESSURE ADVANCE: Add setup for Profile %s at Filament %s" % (profile,id))} {% set _dummy = pa_dic[id_index].val.append({'profile': profile, 'pa' : params.PRESSURE_ADVANCE|default(cfg.pressure_advance)|float|round(3), 'st' : params.SMOOTH_TIME|default(cfg.pressure_advance_smooth_time)|float|round(3)}) %} {% endif%} {% endfor %} {% elif loop.last %} {action_respond_info("PRESSURE ADVANCE: Add setup for Filament %s" % (id))} {% set _dummy = pa_dic.append({'id' : id, 'val': [{'profile': profile, 'pa' : params.PRESSURE_ADVANCE|default(cfg.pressure_advance)|float|round(3), 'st' : params.SMOOTH_TIME|default(cfg.pressure_advance_smooth_time)|float|round(3)}]}) %} {% endif %} {% endfor %} {% endif %} SAVE_VARIABLE VARIABLE=pressure_advance VALUE="{pa_dic}" {% endif %} [gcode_macro PRESSURE_ADVANCE_REMOVE] description = Remove a filament or a nezzle setup gcode = {% if 'FILAMENT' not in params|upper %} {action_respond_info("PRESSURE ADVANCE: FILAMENT must be defined use \"PRESSURE_ADVANCE_REMOVE FILAMENT=id\" as a minimum")} {% else %} {% if not printer.save_variables.variables.pressure_advance %} {action_respond_info("PRESSURE ADVANCE: Nothing to remove, no save_variable defined yet")} {% else %} {% set id = params.FILAMENT|string %} {% set pa_dic = printer.save_variables.variables.pressure_advance %} {% for filament in pa_dic %} {% if id == filament.id %} {% if 'PROFILE' in params|upper %} {% set profile = params.PROFILE|string %} {% set id_index = loop.index0 %} {% for setup in filament.val %} {% if profile == setup.profile %} {action_respond_info("PRESSURE ADVANCE: Remove Profile %s at Filament %s" % (profile,id))} {% set _dummy = pa_dic[id_index].val.pop(loop.index0) %} {% elif loop.last %} {action_respond_info("PRESSURE ADVANCE: Nothing to remove, Profile %s at Filament %s not defined" % (profile,id))} {% endif%} {% endfor %} {% else %} {action_respond_info("PRESSURE ADVANCE: Remove Filament %s" % id)} {% set _dummy = pa_dic.pop(loop.index0) %} {% endif %} {% elif loop.last %} {action_respond_info("PRESSURE ADVANCE: Nothing to remove, Filament %s not defined" % id)} {% endif %} {% endfor %} {% endif %} SAVE_VARIABLE VARIABLE=pressure_advance VALUE="{pa_dic}" {% endif %} [gcode_macro PRESSURE_ADVANCE_SELECT] description = Set PA depending on profile and filament gcode = {% if not printer.save_variables.variables.pressure_advance %} {action_respond_info("PRESSURE ADVANCE: No filament defined ABORDED")} {% else %} {% set profile = params.PROFILE|string %} {% set id = params.FILAMENT|default('None')|string %} {action_respond_info("PRESSURE ADVANCE: Got Profile %s and Filament %s" % (profile,id))} {% set pa_dic = printer.save_variables.variables.pressure_advance %} {% set found = {'id' : 'default', 'profile': 0.4, 'pa' : printer.configfile.settings.extruder.pressure_advance, 'st' : printer.configfile.settings.extruder.pressure_advance_smooth_time} %} {% for filament in pa_dic %} {% if id == filament.id %} {% for setup in filament.val %} {% if profile == setup.profile %} {% set _dummy = found.update({'id': filament.id}) %} {% set _dummy = found.update({'profile': setup.profile}) %} {% set _dummy = found.update({'pa': setup.pa}) %} {% set _dummy = found.update({'st': setup.st}) %} {% endif %} {% endfor %} {% endif %} {% endfor %} SET_PRESSURE_ADVANCE ADVANCE={found.pa} SMOOTH_TIME={found.st} {action_respond_info("PRESSURE ADVANCE: Filament: %s Profile: %s Pressure Advance: %1.03f Smooth Time: %1.03f" % (found.id, found.profile, found.pa, found.st))} {% endif %} [gcode_macro PRINT_END] description = Stop the print and filter the atmosphere for 10min before shuting down gcode = {% set disable_motors_in_end_print = printer["gcode_macro _USER_VARIABLES_OTHER"].disable_motors_in_end_print %} {% set light_intensity_end_print = printer["gcode_macro _USER_VARIABLES_OTHER"].light_intensity_end_print %} PARK _TIP_SHAPING G1 E-7 F2100 TURN_OFF_HEATERS M107 M400 BED_MESH_CLEAR {% set FILTER_TIME = params.FILTER_TIME|default(10)|int %} START_FILTER SPEED=1 UPDATE_DELAYED_GCODE ID=_STOP_FILTER_DELAYED DURATION={FILTER_TIME} LIGHT_ON S={light_intensity_end_print} {% if disable_motors_in_end_print %} M84 {% endif %} [gcode_macro PRINT_START] gcode = {% set BED_TEMP = params.BED_TEMP|default(110)|int %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(250)|int %} {% set ENC_TEMP = params.ENC_TEMP|default(0)|int %} {% set FL_SIZE = params.SIZE|default("0_0_0_0")|string %} BED_MESH_CLEAR STATUS_HOMING G28 G90 M83 RESPOND MSG="Heating Bed..." STATUS_HEATING G1 Z20 F3000 M190 S{BED_TEMP} {% if BED_TEMP >= 95 %} RESPOND MSG="Heating Chamber..." SET_FAN_SPEED fan=bed_fan SPEED=1.0 SET_FAN_SPEED fan=nevermore SPEED=1.0 TEMPERATURE_WAIT SENSOR="temperature_sensor enclosure_temp" MINIMUM=40 MAXIMUM=60 {% endif %} {% if BED_TEMP >= 95 %} SET_FAN_SPEED fan=nevermore SPEED=0.5 SET_FAN_SPEED fan=bed_fan SPEED=0.5 {% endif %} RESPOND MSG="Quad Gauntry Leveling..." STATUS_LEVELING QUAD_GANTRY_LEVEL RESPOND MSG="Heating Extruder..." STATUS_HEATING G1 Z20 F3000 M109 S{EXTRUDER_TEMP} RESPOND MSG="Waiting 30 seconds..." G4 P{60000 * 0.5} RESPOND MSG="Auto Z calibration..." STATUS_CLEANING clean_nozzle STATUS_HOMING CALIBRATE_Z RESPOND MSG="Bed mesh measurement..." STATUS_MESHING ADAPTIVE_BED_MESH SIZE={FL_SIZE} RESPOND MSG="One last cleaning..." STATUS_CLEANING clean_nozzle RESPOND MSG="Start printing !" STATUS_BUSY G1 X60 Y5 Z0.2 F3000 G92 E0 G1 X160 E15 F600 G1 X120 F5000 [idle_timeout] gcode = {% if printer.webhooks.state == "ready" %} {%if not printer.pause_resume.is_paused %} RESPOND PREFIX="info" MSG="Idle Timeout > Turn off heaters" TURN_OFF_HEATERS RESPOND PREFIX="info" MSG="Idle Timeout > Motors off" M84 {% else %} RESPOND PREFIX="info" MSG="Idle Timeout > Motors and heaters not turned off due to paused print" {% endif %} {% endif %} timeout = 3600 [gcode_macro SAFE_PARK] description = "Park the print head in a safe location @param {float} [X=200] - The target hotend temp @param {float} [Y=200] - The target hotend temp @param {bool} [Z_MOVE=true] - Whether or not to move the Z axis. This can be useful if you've already moved on Z" gcode = SAVE_GCODE_STATE NAME=safe_park {% set x_park = params.X|default(printer.toolhead.axis_minimum.x + 5.0)|float %} {% set y_park = params.Y|default(printer.toolhead.axis_maximum.y - 5.0)|float %} {% set should_park_z = params.Z_MOVE|default('true')|string %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set current_z = printer.toolhead.position.z|float %} {% set jump_z = 20.0|float %} {% if (current_z + jump_z) < max_z %} {% set z_safe = (current_z + jump_z) %} {% else %} {% set z_safe = max_z %} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G90 {% if should_park_z|lower == 'true' %} G1 Z{z_safe} F900 {% endif %} G1 X{x_park} Y{y_park} F6000 {% else %} {action_respond_info("Printer not homed")} {% endif %} RESTORE_GCODE_STATE NAME=safe_park [gcode_macro SAFE_RETRACT] description = Retract gcode = SAVE_GCODE_STATE NAME=safe_retract {% if printer.extruder.can_extrude|lower == 'true' %} M83 G91 G10 G1 Z0.2 F2400 G1 E-2 F300 {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESTORE_GCODE_STATE NAME=safe_retract [neopixel sb_leds] pin = 'enter_your_led_data_pin_name' chain_count = 3 color_order = GRBW initial_red = 1.0 initial_green = 0.0 initial_blue = 1.0 initial_white = 0.0 [gcode_macro _sb_vars] variable_colors = { 'logo': { 'busy': {'r': 0.4, 'g': 0.0, 'b': 0.0, 'w': 0.0}, 'cleaning': {'r': 0.0, 'g': 0.02, 'b': 0.5, 'w': 0.0}, 'calibrating_z': {'r': 0.8, 'g': 0., 'b': 0.35, 'w': 0.0}, 'heating': {'r': 0.3, 'g': 0.18, 'b': 0.0, 'w': 0.0}, 'homing': {'r': 0.0, 'g': 0.6, 'b': 0.2, 'w': 0.0}, 'leveling': {'r': 0.5, 'g': 0.1, 'b': 0.4, 'w': 0.0}, 'meshing': {'r': 0.2, 'g': 1.0, 'b': 0.0, 'w': 0.0}, 'off': {'r': 0.0, 'g': 0.0, 'b': 0.0, 'w': 0.0}, 'printing': {'r': 1.0, 'g': 0.0, 'b': 0.0, 'w': 0.0}, 'standby': {'r': 0.01, 'g': 0.01, 'b': 0.01, 'w': 0.1}, }, 'nozzle': { 'heating': {'r': 0.8, 'g': 0.35, 'b': 0.0, 'w':0.0}, 'off': {'r': 0.0, 'g': 0.0, 'b': 0.0, 'w': 0.0}, 'on': {'r': 0.8, 'g': 0.8, 'b': 0.8, 'w':1.0}, 'standby': {'r': 0.6, 'g': 0.0, 'b': 0.0, 'w':0.0}, }, 'thermal': { 'hot': {'r': 1.0, 'g': 0.0, 'b': 0.0, 'w': 0.0}, 'cold': {'r': 0.3, 'g': 0.0, 'b': 0.3, 'w': 0.0} } } variable_logo_led_name = "sb_leds" variable_logo_idx = "1" variable_nozzle_led_name = "sb_leds" variable_nozzle_idx = "2,3" gcode = [gcode_macro _set_sb_leds] gcode = {% set red = params.RED|default(0)|float %} {% set green = params.GREEN|default(0)|float %} {% set blue = params.BLUE|default(0)|float %} {% set white = params.WHITE|default(0)|float %} {% set led = params.LED|string %} {% set idx = (params.IDX|string).split(',') %} {% set transmit_last = params.TRANSMIT|default(1) %} {% for led_index in idx %} {% set transmit=transmit_last if loop.last else 0 %} set_led led={led} red={red} green={green} blue={blue} white={white} index={led_index} transmit={transmit} {% endfor %} [gcode_macro _set_sb_leds_by_name] gcode = {% set leds_name = params.LEDS %} {% set color_name = params.COLOR %} {% set color = printer["gcode_macro _sb_vars"].colors[leds_name][color_name] %} {% set led = printer["gcode_macro _sb_vars"][leds_name + "_led_name"] %} {% set idx = printer["gcode_macro _sb_vars"][leds_name + "_idx"] %} {% set transmit = params.TRANSMIT|default(1) %} _set_sb_leds led={led} red={color.r} green={color.g} blue={color.b} white={color.w} idx="{idx}" transmit={transmit} [gcode_macro _set_logo_leds] gcode = {% set red = params.RED|default(0)|float %} {% set green = params.GREEN|default(0)|float %} {% set blue = params.BLUE|default(0)|float %} {% set white = params.WHITE|default(0)|float %} {% set led = printer["gcode_macro _sb_vars"].logo_led_name %} {% set idx = printer["gcode_macro _sb_vars"].logo_idx %} {% set transmit=params.TRANSMIT|default(1) %} _set_sb_leds led={led} red={red} green={green} blue={blue} white={white} idx="{idx}" transmit={transmit} [gcode_macro _set_nozzle_leds] gcode = {% set red = params.RED|default(0)|float %} {% set green = params.GREEN|default(0)|float %} {% set blue = params.BLUE|default(0)|float %} {% set white = params.WHITE|default(0)|float %} {% set led = printer["gcode_macro _sb_vars"].nozzle_led_name %} {% set idx = printer["gcode_macro _sb_vars"].nozzle_idx %} {% set transmit=params.TRANSMIT|default(1) %} _set_sb_leds led={led} red={red} green={green} blue={blue} white={white} idx="{idx}" transmit={transmit} [gcode_macro set_logo_leds_off] gcode = {% set transmit=params.TRANSMIT|default(1) %} _set_logo_leds red=0 blue=0 green=0 white=0 transmit={transmit} [gcode_macro set_nozzle_leds_on] gcode = {% set transmit=params.TRANSMIT|default(1) %} _set_sb_leds_by_name leds="nozzle" color="on" transmit={transmit} [gcode_macro set_nozzle_leds_off] gcode = {% set transmit=params.TRANSMIT|default(1) %} _set_sb_leds_by_name leds="nozzle" color="off" transmit={transmit} [gcode_macro status_off] gcode = set_logo_leds_off transmit=0 set_nozzle_leds_off [gcode_macro status_ready] gcode = _set_sb_leds_by_name leds="logo" color="standby" transmit=0 _set_sb_leds_by_name leds="nozzle" color="standby" transmit=1 [gcode_macro status_busy] gcode = _set_sb_leds_by_name leds="logo" color="busy" transmit=0 set_nozzle_leds_on [gcode_macro status_heating] gcode = _set_sb_leds_by_name leds="logo" color="heating" transmit=0 _set_sb_leds_by_name leds="nozzle" color="heating" transmit=1 [gcode_macro status_leveling] gcode = _set_sb_leds_by_name leds="logo" color="leveling" transmit=0 set_nozzle_leds_on [gcode_macro status_homing] gcode = _set_sb_leds_by_name leds="logo" color="homing" transmit=0 set_nozzle_leds_on [gcode_macro status_cleaning] gcode = _set_sb_leds_by_name leds="logo" color="cleaning" transmit=0 set_nozzle_leds_on [gcode_macro status_meshing] gcode = _set_sb_leds_by_name leds="logo" color="meshing" transmit=0 set_nozzle_leds_on [gcode_macro status_calibrating_z] gcode = _set_sb_leds_by_name leds="logo" color="calibrating_z" transmit=0 set_nozzle_leds_on [gcode_macro status_printing] gcode = _set_sb_leds_by_name leds="logo" color="printing" transmit=0 set_nozzle_leds_on [gcode_macro TEST_SPEED] gcode = {% set speed = params.SPEED|default(printer.configfile.settings.printer.max_velocity)|int %} {% set iterations = params.ITERATIONS|default(5)|int %} {% set accel = params.ACCEL|default(printer.configfile.settings.printer.max_accel)|int %} {% set bound = params.BOUND|default(20)|int %} {% set x_min = printer.toolhead.axis_minimum.x + bound %} {% set x_max = printer.toolhead.axis_maximum.x - bound %} {% set y_min = printer.toolhead.axis_minimum.y + bound %} {% set y_max = printer.toolhead.axis_maximum.y - bound %} SAVE_GCODE_STATE NAME=TEST_SPEED G90 SET_VELOCITY_LIMIT VELOCITY={speed} ACCEL={accel} ACCEL_TO_DECEL={accel / 2} G28 {% if printer.configfile.settings.quad_gantry_level %} {% if printer.quad_gantry_level.applied == False %} QUAD_GANTRY_LEVEL G28 Z {% endif %} {% endif %} G0 X{printer.toolhead.axis_maximum.x} Y{printer.toolhead.axis_maximum.y} F{30 * 60} G4 P1000 GET_POSITION G0 X{x_min} Y{y_min} Z{bound + 10} F{speed * 60} {% for i in range(iterations) %} G0 X{x_min} Y{y_min} F{speed * 60} G0 X{x_max} Y{y_max} F{speed * 60} G0 X{x_min} Y{y_min} F{speed * 60} G0 X{x_max} Y{y_min} F{speed * 60} G0 X{x_min} Y{y_max} F{speed * 60} G0 X{x_max} Y{y_min} F{speed * 60} G0 X{x_min} Y{y_min} F{speed * 60} G0 X{x_min} Y{y_max} F{speed * 60} G0 X{x_max} Y{y_max} F{speed * 60} G0 X{x_max} Y{y_min} F{speed * 60} {% endfor %} SET_VELOCITY_LIMIT VELOCITY={printer.configfile.settings.printer.max_velocity} ACCEL={printer.configfile.settings.printer.max_accel} ACCEL_TO_DECEL={printer.configfile.settings.printer.max_accel_to_decel} G28 X Y G0 X{printer.toolhead.axis_maximum.x} Y{printer.toolhead.axis_maximum.y} F{30 * 60} G4 P1000 GET_POSITION RESTORE_GCODE_STATE NAME=TEST_SPEED ======================= Extruder max_extrude_ratio=2.078758 mcu 'mcu': Starting serial connect webhooks client 548217118432: New connection webhooks client 548217118432: Client info {'program': 'Moonraker', 'version': 'v0.8.0-41-g348b7f5'} Loaded MCU 'mcu' 117 commands (v0.11.0-210-g0539e9f2 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.35.2-2+14+b2) 2.35.2) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1a=PB8,PB9 BUS_PINS_i2c2=PB10,PB11 BUS_PINS_i2c3=PA8,PC9 BUS_PINS_sdio=PC12,PD2,PC8,PC9,PC10,PC11 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 BUS_PINS_spi3=PB4,PB5,PB3 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 CLOCK_FREQ=180000000 INITIAL_PINS=!PA14,PC7,PC6 MCU=stm32f446xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'pitb': Starting CAN connect Created a socket Unhandled exception during connect Traceback (most recent call last): File "/home/pi1/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi1/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi1/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi1/klipper/klippy/mcu.py", line 792, in _mcu_identify self._serial.connect_canbus(self._serialport, nodeid, File "/home/pi1/klipper/klippy/serialhdl.py", line 135, in connect_canbus bus = can.interface.Bus(channel=canbus_iface, File "/home/pi1/klippy-env/lib/python3.9/site-packages/can/interface.py", line 127, in __new__ return cls(channel, *args, **kwargs) File "/home/pi1/klippy-env/lib/python3.9/site-packages/can/interfaces/socketcan/socketcan.py", line 594, in __init__ bind_socket(self.socket, channel) File "/home/pi1/klippy-env/lib/python3.9/site-packages/can/interfaces/socketcan/socketcan.py", line 459, in bind_socket sock.bind((channel,)) OSError: [Errno 19] No such device