===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Loaded MCU 'mcu' 105 commands (v0.11.0-169-g83308a10 / gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Configured MCU 'mcu' (1024 moves) Args: ['/home/klipper/klipper/klippy/klippy.py', '/home/klipper/printer_data/config/printer.cfg', '-I', '/home/klipper/printer_data/comms/klippy.serial', '-l', '/home/klipper/printer_data/logs/klippy.log', '-a', '/home/klipper/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-233-g1374c701-dirty' Untracked files: klippy/extras/led_effect.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv8 Processor rev 4 (v8l) Python: '3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0]' webhooks client 281473370564848: {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} =============== Log rollover at Wed Jun 21 19:22:51 2023 =============== Unable to issue reset command on MCU 'mcu' Attempting MCU 'rpi' config_reset command b'Got EOF when reading from device' webhooks client 281473370564848: Disconnected Restarting printer Start printer at Wed Jun 21 19:22:52 2023 (1687368173.0 79197.5) ===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect webhooks client 281473370768672: New connection webhooks client 281473370768672: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} Loaded MCU 'mcu' 105 commands (v0.11.0-169-g83308a10 / gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'rpi': Starting connect mcu 'rpi': got {'count': 136, 'sum': 100279, 'sumsq': 398354, '#name': 'stats', '#sent_time': 79201.52950614, '#receive_time': 79201.56692564} Loaded MCU 'rpi' 111 commands (v0.11.0-173-ga8b1b0ef / gcc: (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 binutils: (GNU Binutils for Ubuntu) 2.38) MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Sending MCU 'mcu' printer configuration... Configured MCU 'mcu' (1024 moves) Sending MCU 'rpi' printer configuration... Protocol error Traceback (most recent call last): File "/home/klipper/klipper/klippy/msgproto.py", line 350, in create_command cmd = mp.encode_by_name(**argparts) File "/home/klipper/klipper/klippy/msgproto.py", line 181, in encode_by_name t.encode(out, params[name]) KeyError: 'i2c_bus' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/klipper/klipper/klippy/klippy.py", line 180, in _connect cb() File "/home/klipper/klipper/klippy/mcu.py", line 753, in _connect self._send_config(None) File "/home/klipper/klipper/klippy/mcu.py", line 707, in _send_config self._serial.send(c) File "/home/klipper/klipper/klippy/serialhdl.py", line 256, in send cmd = self.msgparser.create_command(msg) File "/home/klipper/klipper/klippy/msgproto.py", line 355, in create_command self._error("Unable to encode: %s", msgname) File "/home/klipper/klipper/klippy/msgproto.py", line 243, in _error raise error(self.warn_prefix + (msg % params)) msgproto.error: mcu 'rpi': Unable to encode: config_i2c Build file /home/klipper/klipper/klippy/../.config(3418): Wed Jun 21 19:14:28 2023 ========= Last MCU build config ========= CONFIG_LOW_LEVEL_OPTIONS=y # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set CONFIG_MACH_STM32=y # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set # CONFIG_MACH_LINUX is not set # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="stm32" CONFIG_MCU="stm32h743xx" CONFIG_CLOCK_FREQ=400000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x8000000 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x20000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x8020000 CONFIG_STM32_SELECT=y # CONFIG_MACH_STM32F103 is not set # CONFIG_MACH_STM32F207 is not set # CONFIG_MACH_STM32F401 is not set # CONFIG_MACH_STM32F405 is not set # CONFIG_MACH_STM32F407 is not set # CONFIG_MACH_STM32F429 is not set # CONFIG_MACH_STM32F446 is not set # CONFIG_MACH_STM32F765 is not set # CONFIG_MACH_STM32F031 is not set # CONFIG_MACH_STM32F042 is not set # CONFIG_MACH_STM32F070 is not set # CONFIG_MACH_STM32F072 is not set # CONFIG_MACH_STM32G070 is not set # CONFIG_MACH_STM32G071 is not set # CONFIG_MACH_STM32G0B0 is not set # CONFIG_MACH_STM32G0B1 is not set # CONFIG_MACH_STM32G431 is not set # CONFIG_MACH_STM32H723 is not set CONFIG_MACH_STM32H743=y # CONFIG_MACH_STM32H750 is not set # CONFIG_MACH_STM32L412 is not set # CONFIG_MACH_N32G452 is not set # CONFIG_MACH_N32G455 is not set CONFIG_MACH_STM32H7=y CONFIG_HAVE_STM32_USBOTG=y CONFIG_HAVE_STM32_FDCANBUS=y CONFIG_HAVE_STM32_USBCANBUS=y CONFIG_STM32_DFU_ROM_ADDRESS=0x1ff09800 CONFIG_STM32_FLASH_START_20000=y # CONFIG_STM32_FLASH_START_0000 is not set # CONFIG_STM32_CLOCK_REF_8M is not set # CONFIG_STM32_CLOCK_REF_12M is not set # CONFIG_STM32_CLOCK_REF_16M is not set # CONFIG_STM32_CLOCK_REF_20M is not set # CONFIG_STM32_CLOCK_REF_24M is not set CONFIG_STM32_CLOCK_REF_25M=y # CONFIG_STM32_CLOCK_REF_INTERNAL is not set CONFIG_CLOCK_REF_FREQ=25000000 CONFIG_STM32F0_TRIM=16 CONFIG_STM32_USB_PA11_PA12=y # CONFIG_STM32_USB_PB14_PB15 is not set # CONFIG_STM32_SERIAL_USART1 is not set # CONFIG_STM32_SERIAL_USART1_ALT_PB7_PB6 is not set # CONFIG_STM32_SERIAL_USART2 is not set # CONFIG_STM32_SERIAL_USART2_ALT_PD6_PD5 is not set # CONFIG_STM32_SERIAL_USART3 is not set # CONFIG_STM32_SERIAL_USART3_ALT_PD9_PD8 is not set # CONFIG_STM32_SERIAL_UART4 is not set # CONFIG_STM32_CANBUS_PA11_PA12 is not set # CONFIG_STM32_CANBUS_PA11_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB8_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB12_PB13 is not set # CONFIG_STM32_MMENU_CANBUS_PD0_PD1 is not set # CONFIG_STM32_MMENU_CANBUS_PB0_PB1 is not set # CONFIG_STM32_MMENU_CANBUS_PD12_PD13 is not set # CONFIG_STM32_MMENU_CANBUS_PC2_PC3 is not set # CONFIG_STM32_USBCANBUS_PA11_PA12 is not set CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" # # USB ids # # end of USB ids CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_INITIAL_PINS="" CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_HAVE_BOOTLOADER_REQUEST=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/klipper/klipper/klippy/../out/klipper.dict(7935): Wed Jun 21 19:15:13 2023 Last MCU build version: v0.11.0-233-g1374c701 Last MCU build tools: gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi2b=PI2,PI3,PI1 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h743xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/klipper/klipper/klippy/../out/klipper.elf(1757700): Wed Jun 21 19:15:27 2023 b'Got EOF when reading from device' Unable to issue reset command on MCU 'mcu' Attempting MCU 'rpi' config_reset command b'Got EOF when reading from device' webhooks client 281473370768672: Disconnected Restarting printer Start printer at Wed Jun 21 19:26:02 2023 (1687368362.8 79387.3) ===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect webhooks client 281473369626928: New connection webhooks client 281473369626928: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} Loaded MCU 'mcu' 105 commands (v0.11.0-169-g83308a10 / gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'rpi': Starting connect mcu 'rpi': got {'count': 137, 'sum': 115061, 'sumsq': 504830, '#name': 'stats', '#sent_time': 79391.559645106, '#receive_time': 79391.563199023} Loaded MCU 'rpi' 111 commands (v0.11.0-173-ga8b1b0ef / gcc: (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 binutils: (GNU Binutils for Ubuntu) 2.38) MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Sending MCU 'mcu' printer configuration... Configured MCU 'mcu' (1024 moves) Sending MCU 'rpi' printer configuration... Protocol error Traceback (most recent call last): File "/home/klipper/klipper/klippy/msgproto.py", line 350, in create_command cmd = mp.encode_by_name(**argparts) File "/home/klipper/klipper/klippy/msgproto.py", line 181, in encode_by_name t.encode(out, params[name]) KeyError: 'i2c_bus' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/klipper/klipper/klippy/klippy.py", line 180, in _connect cb() File "/home/klipper/klipper/klippy/mcu.py", line 753, in _connect self._send_config(None) File "/home/klipper/klipper/klippy/mcu.py", line 707, in _send_config self._serial.send(c) File "/home/klipper/klipper/klippy/serialhdl.py", line 256, in send cmd = self.msgparser.create_command(msg) File "/home/klipper/klipper/klippy/msgproto.py", line 355, in create_command self._error("Unable to encode: %s", msgname) File "/home/klipper/klipper/klippy/msgproto.py", line 243, in _error raise error(self.warn_prefix + (msg % params)) msgproto.error: mcu 'rpi': Unable to encode: config_i2c Build file /home/klipper/klipper/klippy/../.config(3418): Wed Jun 21 19:14:28 2023 ========= Last MCU build config ========= CONFIG_LOW_LEVEL_OPTIONS=y # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set CONFIG_MACH_STM32=y # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set # CONFIG_MACH_LINUX is not set # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="stm32" CONFIG_MCU="stm32h743xx" CONFIG_CLOCK_FREQ=400000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x8000000 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x20000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x8020000 CONFIG_STM32_SELECT=y # CONFIG_MACH_STM32F103 is not set # CONFIG_MACH_STM32F207 is not set # CONFIG_MACH_STM32F401 is not set # CONFIG_MACH_STM32F405 is not set # CONFIG_MACH_STM32F407 is not set # CONFIG_MACH_STM32F429 is not set # CONFIG_MACH_STM32F446 is not set # CONFIG_MACH_STM32F765 is not set # CONFIG_MACH_STM32F031 is not set # CONFIG_MACH_STM32F042 is not set # CONFIG_MACH_STM32F070 is not set # CONFIG_MACH_STM32F072 is not set # CONFIG_MACH_STM32G070 is not set # CONFIG_MACH_STM32G071 is not set # CONFIG_MACH_STM32G0B0 is not set # CONFIG_MACH_STM32G0B1 is not set # CONFIG_MACH_STM32G431 is not set # CONFIG_MACH_STM32H723 is not set CONFIG_MACH_STM32H743=y # CONFIG_MACH_STM32H750 is not set # CONFIG_MACH_STM32L412 is not set # CONFIG_MACH_N32G452 is not set # CONFIG_MACH_N32G455 is not set CONFIG_MACH_STM32H7=y CONFIG_HAVE_STM32_USBOTG=y CONFIG_HAVE_STM32_FDCANBUS=y CONFIG_HAVE_STM32_USBCANBUS=y CONFIG_STM32_DFU_ROM_ADDRESS=0x1ff09800 CONFIG_STM32_FLASH_START_20000=y # CONFIG_STM32_FLASH_START_0000 is not set # CONFIG_STM32_CLOCK_REF_8M is not set # CONFIG_STM32_CLOCK_REF_12M is not set # CONFIG_STM32_CLOCK_REF_16M is not set # CONFIG_STM32_CLOCK_REF_20M is not set # CONFIG_STM32_CLOCK_REF_24M is not set CONFIG_STM32_CLOCK_REF_25M=y # CONFIG_STM32_CLOCK_REF_INTERNAL is not set CONFIG_CLOCK_REF_FREQ=25000000 CONFIG_STM32F0_TRIM=16 CONFIG_STM32_USB_PA11_PA12=y # CONFIG_STM32_USB_PB14_PB15 is not set # CONFIG_STM32_SERIAL_USART1 is not set # CONFIG_STM32_SERIAL_USART1_ALT_PB7_PB6 is not set # CONFIG_STM32_SERIAL_USART2 is not set # CONFIG_STM32_SERIAL_USART2_ALT_PD6_PD5 is not set # CONFIG_STM32_SERIAL_USART3 is not set # CONFIG_STM32_SERIAL_USART3_ALT_PD9_PD8 is not set # CONFIG_STM32_SERIAL_UART4 is not set # CONFIG_STM32_CANBUS_PA11_PA12 is not set # CONFIG_STM32_CANBUS_PA11_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB8_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB12_PB13 is not set # CONFIG_STM32_MMENU_CANBUS_PD0_PD1 is not set # CONFIG_STM32_MMENU_CANBUS_PB0_PB1 is not set # CONFIG_STM32_MMENU_CANBUS_PD12_PD13 is not set # CONFIG_STM32_MMENU_CANBUS_PC2_PC3 is not set # CONFIG_STM32_USBCANBUS_PA11_PA12 is not set CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" # # USB ids # # end of USB ids CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_INITIAL_PINS="" CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_HAVE_BOOTLOADER_REQUEST=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/klipper/klipper/klippy/../out/klipper.dict(7935): Wed Jun 21 19:15:13 2023 Last MCU build version: v0.11.0-233-g1374c701 Last MCU build tools: gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi2b=PI2,PI3,PI1 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h743xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/klipper/klipper/klippy/../out/klipper.elf(1757700): Wed Jun 21 19:15:27 2023 b'Got EOF when reading from device' Unable to issue reset command on MCU 'mcu' Attempting MCU 'rpi' config_reset command b'Got EOF when reading from device' webhooks client 281473369626928: Disconnected Restarting printer Start printer at Wed Jun 21 19:30:02 2023 (1687368602.4 79626.9) ===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect webhooks client 281473370929616: New connection webhooks client 281473370929616: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} Loaded MCU 'mcu' 105 commands (v0.11.0-169-g83308a10 / gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'rpi': Starting connect Loaded MCU 'rpi' 111 commands (v0.11.0-173-ga8b1b0ef / gcc: (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 binutils: (GNU Binutils for Ubuntu) 2.38) MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Sending MCU 'mcu' printer configuration... Configured MCU 'mcu' (1024 moves) Sending MCU 'rpi' printer configuration... Protocol error Traceback (most recent call last): File "/home/klipper/klipper/klippy/msgproto.py", line 350, in create_command cmd = mp.encode_by_name(**argparts) File "/home/klipper/klipper/klippy/msgproto.py", line 181, in encode_by_name t.encode(out, params[name]) KeyError: 'i2c_bus' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/klipper/klipper/klippy/klippy.py", line 180, in _connect cb() File "/home/klipper/klipper/klippy/mcu.py", line 753, in _connect self._send_config(None) File "/home/klipper/klipper/klippy/mcu.py", line 707, in _send_config self._serial.send(c) File "/home/klipper/klipper/klippy/serialhdl.py", line 256, in send cmd = self.msgparser.create_command(msg) File "/home/klipper/klipper/klippy/msgproto.py", line 355, in create_command self._error("Unable to encode: %s", msgname) File "/home/klipper/klipper/klippy/msgproto.py", line 243, in _error raise error(self.warn_prefix + (msg % params)) msgproto.error: mcu 'rpi': Unable to encode: config_i2c Build file /home/klipper/klipper/klippy/../.config(3418): Wed Jun 21 19:14:28 2023 ========= Last MCU build config ========= CONFIG_LOW_LEVEL_OPTIONS=y # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set CONFIG_MACH_STM32=y # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set # CONFIG_MACH_LINUX is not set # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="stm32" CONFIG_MCU="stm32h743xx" CONFIG_CLOCK_FREQ=400000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x8000000 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x20000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x8020000 CONFIG_STM32_SELECT=y # CONFIG_MACH_STM32F103 is not set # CONFIG_MACH_STM32F207 is not set # CONFIG_MACH_STM32F401 is not set # CONFIG_MACH_STM32F405 is not set # CONFIG_MACH_STM32F407 is not set # CONFIG_MACH_STM32F429 is not set # CONFIG_MACH_STM32F446 is not set # CONFIG_MACH_STM32F765 is not set # CONFIG_MACH_STM32F031 is not set # CONFIG_MACH_STM32F042 is not set # CONFIG_MACH_STM32F070 is not set # CONFIG_MACH_STM32F072 is not set # CONFIG_MACH_STM32G070 is not set # CONFIG_MACH_STM32G071 is not set # CONFIG_MACH_STM32G0B0 is not set # CONFIG_MACH_STM32G0B1 is not set # CONFIG_MACH_STM32G431 is not set # CONFIG_MACH_STM32H723 is not set CONFIG_MACH_STM32H743=y # CONFIG_MACH_STM32H750 is not set # CONFIG_MACH_STM32L412 is not set # CONFIG_MACH_N32G452 is not set # CONFIG_MACH_N32G455 is not set CONFIG_MACH_STM32H7=y CONFIG_HAVE_STM32_USBOTG=y CONFIG_HAVE_STM32_FDCANBUS=y CONFIG_HAVE_STM32_USBCANBUS=y CONFIG_STM32_DFU_ROM_ADDRESS=0x1ff09800 CONFIG_STM32_FLASH_START_20000=y # CONFIG_STM32_FLASH_START_0000 is not set # CONFIG_STM32_CLOCK_REF_8M is not set # CONFIG_STM32_CLOCK_REF_12M is not set # CONFIG_STM32_CLOCK_REF_16M is not set # CONFIG_STM32_CLOCK_REF_20M is not set # CONFIG_STM32_CLOCK_REF_24M is not set CONFIG_STM32_CLOCK_REF_25M=y # CONFIG_STM32_CLOCK_REF_INTERNAL is not set CONFIG_CLOCK_REF_FREQ=25000000 CONFIG_STM32F0_TRIM=16 CONFIG_STM32_USB_PA11_PA12=y # CONFIG_STM32_USB_PB14_PB15 is not set # CONFIG_STM32_SERIAL_USART1 is not set # CONFIG_STM32_SERIAL_USART1_ALT_PB7_PB6 is not set # CONFIG_STM32_SERIAL_USART2 is not set # CONFIG_STM32_SERIAL_USART2_ALT_PD6_PD5 is not set # CONFIG_STM32_SERIAL_USART3 is not set # CONFIG_STM32_SERIAL_USART3_ALT_PD9_PD8 is not set # CONFIG_STM32_SERIAL_UART4 is not set # CONFIG_STM32_CANBUS_PA11_PA12 is not set # CONFIG_STM32_CANBUS_PA11_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB8_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB12_PB13 is not set # CONFIG_STM32_MMENU_CANBUS_PD0_PD1 is not set # CONFIG_STM32_MMENU_CANBUS_PB0_PB1 is not set # CONFIG_STM32_MMENU_CANBUS_PD12_PD13 is not set # CONFIG_STM32_MMENU_CANBUS_PC2_PC3 is not set # CONFIG_STM32_USBCANBUS_PA11_PA12 is not set CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" # # USB ids # # end of USB ids CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_INITIAL_PINS="" CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_HAVE_BOOTLOADER_REQUEST=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/klipper/klipper/klippy/../out/klipper.dict(7935): Wed Jun 21 19:15:13 2023 Last MCU build version: v0.11.0-233-g1374c701 Last MCU build tools: gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi2b=PI2,PI3,PI1 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h743xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/klipper/klipper/klippy/../out/klipper.elf(1757700): Wed Jun 21 19:15:27 2023 b'Got EOF when reading from device' Unable to issue reset command on MCU 'mcu' Attempting MCU 'rpi' config_reset command b'Got EOF when reading from device' webhooks client 281473370929616: Disconnected Restarting printer Start printer at Wed Jun 21 19:32:12 2023 (1687368732.2 79756.7) ===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect webhooks client 281473370344416: New connection webhooks client 281473370344416: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} Loaded MCU 'mcu' 105 commands (v0.11.0-169-g83308a10 / gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'rpi': Starting connect Loaded MCU 'rpi' 111 commands (v0.11.0-173-ga8b1b0ef / gcc: (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 binutils: (GNU Binutils for Ubuntu) 2.38) MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Sending MCU 'mcu' printer configuration... Configured MCU 'mcu' (1024 moves) Sending MCU 'rpi' printer configuration... Protocol error Traceback (most recent call last): File "/home/klipper/klipper/klippy/msgproto.py", line 350, in create_command cmd = mp.encode_by_name(**argparts) File "/home/klipper/klipper/klippy/msgproto.py", line 181, in encode_by_name t.encode(out, params[name]) KeyError: 'i2c_bus' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/klipper/klipper/klippy/klippy.py", line 180, in _connect cb() File "/home/klipper/klipper/klippy/mcu.py", line 753, in _connect self._send_config(None) File "/home/klipper/klipper/klippy/mcu.py", line 707, in _send_config self._serial.send(c) File "/home/klipper/klipper/klippy/serialhdl.py", line 256, in send cmd = self.msgparser.create_command(msg) File "/home/klipper/klipper/klippy/msgproto.py", line 355, in create_command self._error("Unable to encode: %s", msgname) File "/home/klipper/klipper/klippy/msgproto.py", line 243, in _error raise error(self.warn_prefix + (msg % params)) msgproto.error: mcu 'rpi': Unable to encode: config_i2c Build file /home/klipper/klipper/klippy/../.config(3418): Wed Jun 21 19:14:28 2023 ========= Last MCU build config ========= CONFIG_LOW_LEVEL_OPTIONS=y # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set CONFIG_MACH_STM32=y # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set # CONFIG_MACH_LINUX is not set # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="stm32" CONFIG_MCU="stm32h743xx" CONFIG_CLOCK_FREQ=400000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x8000000 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x20000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x8020000 CONFIG_STM32_SELECT=y # CONFIG_MACH_STM32F103 is not set # CONFIG_MACH_STM32F207 is not set # CONFIG_MACH_STM32F401 is not set # CONFIG_MACH_STM32F405 is not set # CONFIG_MACH_STM32F407 is not set # CONFIG_MACH_STM32F429 is not set # CONFIG_MACH_STM32F446 is not set # CONFIG_MACH_STM32F765 is not set # CONFIG_MACH_STM32F031 is not set # CONFIG_MACH_STM32F042 is not set # CONFIG_MACH_STM32F070 is not set # CONFIG_MACH_STM32F072 is not set # CONFIG_MACH_STM32G070 is not set # CONFIG_MACH_STM32G071 is not set # CONFIG_MACH_STM32G0B0 is not set # CONFIG_MACH_STM32G0B1 is not set # CONFIG_MACH_STM32G431 is not set # CONFIG_MACH_STM32H723 is not set CONFIG_MACH_STM32H743=y # CONFIG_MACH_STM32H750 is not set # CONFIG_MACH_STM32L412 is not set # CONFIG_MACH_N32G452 is not set # CONFIG_MACH_N32G455 is not set CONFIG_MACH_STM32H7=y CONFIG_HAVE_STM32_USBOTG=y CONFIG_HAVE_STM32_FDCANBUS=y CONFIG_HAVE_STM32_USBCANBUS=y CONFIG_STM32_DFU_ROM_ADDRESS=0x1ff09800 CONFIG_STM32_FLASH_START_20000=y # CONFIG_STM32_FLASH_START_0000 is not set # CONFIG_STM32_CLOCK_REF_8M is not set # CONFIG_STM32_CLOCK_REF_12M is not set # CONFIG_STM32_CLOCK_REF_16M is not set # CONFIG_STM32_CLOCK_REF_20M is not set # CONFIG_STM32_CLOCK_REF_24M is not set CONFIG_STM32_CLOCK_REF_25M=y # CONFIG_STM32_CLOCK_REF_INTERNAL is not set CONFIG_CLOCK_REF_FREQ=25000000 CONFIG_STM32F0_TRIM=16 CONFIG_STM32_USB_PA11_PA12=y # CONFIG_STM32_USB_PB14_PB15 is not set # CONFIG_STM32_SERIAL_USART1 is not set # CONFIG_STM32_SERIAL_USART1_ALT_PB7_PB6 is not set # CONFIG_STM32_SERIAL_USART2 is not set # CONFIG_STM32_SERIAL_USART2_ALT_PD6_PD5 is not set # CONFIG_STM32_SERIAL_USART3 is not set # CONFIG_STM32_SERIAL_USART3_ALT_PD9_PD8 is not set # CONFIG_STM32_SERIAL_UART4 is not set # CONFIG_STM32_CANBUS_PA11_PA12 is not set # CONFIG_STM32_CANBUS_PA11_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB8_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB12_PB13 is not set # CONFIG_STM32_MMENU_CANBUS_PD0_PD1 is not set # CONFIG_STM32_MMENU_CANBUS_PB0_PB1 is not set # CONFIG_STM32_MMENU_CANBUS_PD12_PD13 is not set # CONFIG_STM32_MMENU_CANBUS_PC2_PC3 is not set # CONFIG_STM32_USBCANBUS_PA11_PA12 is not set CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" # # USB ids # # end of USB ids CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_INITIAL_PINS="" CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_HAVE_BOOTLOADER_REQUEST=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/klipper/klipper/klippy/../out/klipper.dict(7935): Wed Jun 21 19:15:13 2023 Last MCU build version: v0.11.0-233-g1374c701 Last MCU build tools: gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi2b=PI2,PI3,PI1 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h743xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/klipper/klipper/klippy/../out/klipper.elf(1757700): Wed Jun 21 19:15:27 2023 webhooks client 281473370344416: Disconnected Restarting printer Start printer at Wed Jun 21 19:32:39 2023 (1687368760.0 79784.4) ===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect webhooks client 281473370774000: New connection webhooks client 281473370774000: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} mcu 'mcu': Timeout on connect mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/klipper/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/klipper/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/klipper/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/klipper/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/klipper/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': got {'oid': 30, 'next_clock': 3405163520, 'value': 30858, '#name': 'analog_in_state', '#sent_time': 79792.937434297, '#receive_time': 79792.973450631} mcu 'mcu': got {'oid': 19, 'next_clock': 3481163520, 'value': 30932, '#name': 'analog_in_state', '#sent_time': 79793.146254131, '#receive_time': 79793.163722131} mcu 'mcu': got {'oid': 30, 'next_clock': 3525163520, 'value': 30857, '#name': 'analog_in_state', '#sent_time': 79793.249926839, '#receive_time': 79793.273434589} Loaded MCU 'mcu' 105 commands (v0.11.0-169-g83308a10 / gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'rpi': Starting connect mcu 'mcu': got {'oid': 19, 'next_clock': 3601163520, 'value': 30931, '#name': 'analog_in_state', '#sent_time': 79793.306664256, '#receive_time': 79793.463275714} mcu 'mcu': got {'oid': 30, 'next_clock': 3645163520, 'value': 30857, '#name': 'analog_in_state', '#sent_time': 79793.306664256, '#receive_time': 79793.573457714} mcu 'mcu': got {'oid': 19, 'next_clock': 3721163520, 'value': 30935, '#name': 'analog_in_state', '#sent_time': 79793.306664256, '#receive_time': 79793.763035839} Loaded MCU 'rpi' 111 commands (v0.11.0-173-ga8b1b0ef / gcc: (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 binutils: (GNU Binutils for Ubuntu) 2.38) MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Configured MCU 'mcu' (1024 moves) Sending MCU 'rpi' printer configuration... Protocol error Traceback (most recent call last): File "/home/klipper/klipper/klippy/msgproto.py", line 350, in create_command cmd = mp.encode_by_name(**argparts) File "/home/klipper/klipper/klippy/msgproto.py", line 181, in encode_by_name t.encode(out, params[name]) KeyError: 'i2c_bus' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/klipper/klipper/klippy/klippy.py", line 180, in _connect cb() File "/home/klipper/klipper/klippy/mcu.py", line 753, in _connect self._send_config(None) File "/home/klipper/klipper/klippy/mcu.py", line 707, in _send_config self._serial.send(c) File "/home/klipper/klipper/klippy/serialhdl.py", line 256, in send cmd = self.msgparser.create_command(msg) File "/home/klipper/klipper/klippy/msgproto.py", line 355, in create_command self._error("Unable to encode: %s", msgname) File "/home/klipper/klipper/klippy/msgproto.py", line 243, in _error raise error(self.warn_prefix + (msg % params)) msgproto.error: mcu 'rpi': Unable to encode: config_i2c MCU 'rpi' shutdown: oids already allocated clocksync state: mcu_freq=50000000 last_clock=1863906766 clock_est=(79793.488 1846636529 49996709.785) min_half_rtt=0.000069 min_rtt_time=79793.574 time_avg=79793.488(0.018) clock_avg=1846636529.292(876266.191) pred_variance=1842936345.118 clock_adj=(25.483 49990285.250) Dumping serial stats: bytes_write=781 bytes_read=4414 bytes_retransmit=0 bytes_invalid=0 send_seq=92 receive_seq=92 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 upcoming_bytes=0 Dumping send queue 91 messages Sent 0 79793.306936 79793.306936 8: seq: 11, identify offset=0 count=40 Sent 1 79793.307720 79793.307720 8: seq: 12, identify offset=40 count=40 Sent 2 79793.308537 79793.308537 8: seq: 13, identify offset=80 count=40 Sent 3 79793.309268 79793.309268 9: seq: 14, identify offset=120 count=40 Sent 4 79793.309867 79793.309867 9: seq: 15, identify offset=160 count=40 Sent 5 79793.310459 79793.310459 9: seq: 16, identify offset=200 count=40 Sent 6 79793.311012 79793.311012 9: seq: 17, identify offset=240 count=40 Sent 7 79793.311619 79793.311619 9: seq: 18, identify offset=280 count=40 Sent 8 79793.312212 79793.312212 9: seq: 19, identify offset=320 count=40 Sent 9 79793.312767 79793.312767 9: seq: 1a, identify offset=360 count=40 Sent 10 79793.313391 79793.313391 9: seq: 1b, identify offset=400 count=40 Sent 11 79793.313938 79793.313938 9: seq: 1c, identify offset=440 count=40 Sent 12 79793.314504 79793.314504 9: seq: 1d, identify offset=480 count=40 Sent 13 79793.315048 79793.315048 9: seq: 1e, identify offset=520 count=40 Sent 14 79793.315679 79793.315679 9: seq: 1f, identify offset=560 count=40 Sent 15 79793.316244 79793.316244 9: seq: 10, identify offset=600 count=40 Sent 16 79793.316830 79793.316830 9: seq: 11, identify offset=640 count=40 Sent 17 79793.317433 79793.317433 9: seq: 12, identify offset=680 count=40 Sent 18 79793.317989 79793.317989 9: seq: 13, identify offset=720 count=40 Sent 19 79793.318542 79793.318542 9: seq: 14, identify offset=760 count=40 Sent 20 79793.319095 79793.319095 9: seq: 15, identify offset=800 count=40 Sent 21 79793.319723 79793.319723 9: seq: 16, identify offset=840 count=40 Sent 22 79793.320307 79793.320307 9: seq: 17, identify offset=880 count=40 Sent 23 79793.320914 79793.320914 9: seq: 18, identify offset=920 count=40 Sent 24 79793.321491 79793.321491 9: seq: 19, identify offset=960 count=40 Sent 25 79793.322080 79793.322080 9: seq: 1a, identify offset=1000 count=40 Sent 26 79793.322641 79793.322641 9: seq: 1b, identify offset=1040 count=40 Sent 27 79793.323199 79793.323199 9: seq: 1c, identify offset=1080 count=40 Sent 28 79793.323840 79793.323840 9: seq: 1d, identify offset=1120 count=40 Sent 29 79793.324421 79793.324421 9: seq: 1e, identify offset=1160 count=40 Sent 30 79793.325147 79793.325147 9: seq: 1f, identify offset=1200 count=40 Sent 31 79793.325967 79793.325967 9: seq: 10, identify offset=1240 count=40 Sent 32 79793.326741 79793.326741 9: seq: 11, identify offset=1280 count=40 Sent 33 79793.327417 79793.327417 9: seq: 12, identify offset=1320 count=40 Sent 34 79793.328009 79793.328009 9: seq: 13, identify offset=1360 count=40 Sent 35 79793.328679 79793.328679 9: seq: 14, identify offset=1400 count=40 Sent 36 79793.329320 79793.329320 9: seq: 15, identify offset=1440 count=40 Sent 37 79793.329874 79793.329874 9: seq: 16, identify offset=1480 count=40 Sent 38 79793.330431 79793.330431 9: seq: 17, identify offset=1520 count=40 Sent 39 79793.330991 79793.330991 9: seq: 18, identify offset=1560 count=40 Sent 40 79793.331638 79793.331638 9: seq: 19, identify offset=1600 count=40 Sent 41 79793.332227 79793.332227 9: seq: 1a, identify offset=1640 count=40 Sent 42 79793.332826 79793.332826 9: seq: 1b, identify offset=1680 count=40 Sent 43 79793.333430 79793.333430 9: seq: 1c, identify offset=1720 count=40 Sent 44 79793.333994 79793.333994 9: seq: 1d, identify offset=1760 count=40 Sent 45 79793.334551 79793.334551 9: seq: 1e, identify offset=1800 count=40 Sent 46 79793.335105 79793.335105 9: seq: 1f, identify offset=1840 count=40 Sent 47 79793.335732 79793.335732 9: seq: 10, identify offset=1880 count=40 Sent 48 79793.336297 79793.336297 9: seq: 11, identify offset=1920 count=40 Sent 49 79793.336871 79793.336871 9: seq: 12, identify offset=1960 count=40 Sent 50 79793.337462 79793.337462 9: seq: 13, identify offset=2000 count=40 Sent 51 79793.338056 79793.338056 9: seq: 14, identify offset=2040 count=40 Sent 52 79793.338611 79793.338611 9: seq: 15, identify offset=2080 count=40 Sent 53 79793.339198 79793.339198 9: seq: 16, identify offset=2120 count=40 Sent 54 79793.339841 79793.339841 9: seq: 17, identify offset=2160 count=40 Sent 55 79793.340435 79793.340435 9: seq: 18, identify offset=2200 count=40 Sent 56 79793.341110 79793.341110 9: seq: 19, identify offset=2240 count=40 Sent 57 79793.341705 79793.341705 9: seq: 1a, identify offset=2280 count=40 Sent 58 79793.342302 79793.342302 9: seq: 1b, identify offset=2320 count=40 Sent 59 79793.342843 79793.342843 9: seq: 1c, identify offset=2360 count=40 Sent 60 79793.343479 79793.343479 9: seq: 1d, identify offset=2400 count=40 Sent 61 79793.344060 79793.344060 9: seq: 1e, identify offset=2440 count=40 Sent 62 79793.344619 79793.344619 9: seq: 1f, identify offset=2480 count=40 Sent 63 79793.345224 79793.345224 9: seq: 10, identify offset=2520 count=40 Sent 64 79793.345781 79793.345781 9: seq: 11, identify offset=2560 count=40 Sent 65 79793.346317 79793.346317 9: seq: 12, identify offset=2600 count=40 Sent 66 79793.346845 79793.346845 9: seq: 13, identify offset=2640 count=40 Sent 67 79793.347426 79793.347426 9: seq: 14, identify offset=2680 count=40 Sent 68 79793.347979 79793.347979 9: seq: 15, identify offset=2720 count=40 Sent 69 79793.348535 79793.348535 9: seq: 16, identify offset=2760 count=40 Sent 70 79793.349105 79793.349105 9: seq: 17, identify offset=2800 count=40 Sent 71 79793.349651 79793.349651 9: seq: 18, identify offset=2840 count=40 Sent 72 79793.350194 79793.350194 9: seq: 19, identify offset=2880 count=40 Sent 73 79793.350733 79793.350733 9: seq: 1a, identify offset=2920 count=40 Sent 74 79793.351263 79793.351263 9: seq: 1b, identify offset=2960 count=40 Sent 75 79793.351895 79793.351895 9: seq: 1c, identify offset=3000 count=40 Sent 76 79793.352435 79793.352435 9: seq: 1d, identify offset=3040 count=40 Sent 77 79793.353015 79793.353015 9: seq: 1e, identify offset=3080 count=40 Sent 78 79793.353561 79793.353561 9: seq: 1f, identify offset=3097 count=40 Sent 79 79793.418543 79793.418543 6: seq: 10, get_uptime Sent 80 79793.471328 79793.471328 6: seq: 11, get_clock Sent 81 79793.522498 79793.522498 6: seq: 12, get_clock Sent 82 79793.573662 79793.573662 6: seq: 13, get_clock Sent 83 79793.625833 79793.625833 6: seq: 14, get_clock Sent 84 79793.677152 79793.677152 6: seq: 15, get_clock Sent 85 79793.728537 79793.728537 6: seq: 16, get_clock Sent 86 79793.779713 79793.779713 6: seq: 17, get_clock Sent 87 79793.830919 79793.830919 6: seq: 18, get_clock Sent 88 79793.833334 79793.833334 6: seq: 19, get_clock Sent 89 79793.841541 79793.841541 6: seq: 1a, get_config Sent 90 79793.843532 79793.843532 7: seq: 1b, allocate_oids count=2 Dumping receive queue 93 messages Receive: 0 79793.305439 0.000000 13: seq: 11, stats count=51 sum=14014 sumsq=29119 Receive: 1 79793.305440 0.000000 13: seq: 11, stats count=51 sum=12731 sumsq=21814 Receive: 2 79793.307076 79793.306936 48: seq: 12, identify_response offset=0 data=b"x\xda\xa5\x1ako\xdc6\xf2\xaf\xf0\x16\x08\xd2\x1clw\xf5\xda\xd5\x1a\xc8\x07\xc7M\x8b\xa0\xe7KZ'\xb8\x03\x0e\x85 K\xdc]\xc2" Receive: 3 79793.307854 79793.307720 48: seq: 13, identify_response offset=40 data=b"zU\x94\xfc\xb8\xc2\xf7\xdbo\x86\xc3\x97\xb4k'w\xf5\x97\x1593\xe4p8o\xfa\x8f\xc5\xcd(\xaa2\xbb\xe3\xbd\x14m#\x17\xe7" Receive: 4 79793.308665 79793.308537 48: seq: 14, identify_response offset=80 data=b'\x8b]Q\x9c\xb3\xef\xbe\xdc\x8c\xcd0\xb2 8\x8b\xce\x96\xa7\xc1\xa8\x86\xc1\x7f\xc2\xf0l\x19\xbf\xd1\xd3\xecF4\xe3 *\t\xf8?\xfd' Receive: 5 79793.309370 79793.309268 49: seq: 15, identify_response offset=120 data=b'\xfd\x0b{\xa7\x87l\xdb\xf6\x8c\x16x\xc3\xc2\xb3(]\x9c,\x8a\xb6\xae\xf3\xa6\x84\r\xfeX\xe4U\xd5\x16\xf9\xc0\xb3V\x94\x92\x15- ' Receive: 6 79793.309968 79793.309867 49: seq: 16, identify_response offset=160 data=b'\xbe}U,\xce\xd3\x13\xe0f\x18\x80\x8d,/n\x19@a\xda\x83\xafb\x0f\xa1,\rB\xd7J\xf5#\x9a\xb7\xafF\xd6\x8dU\x95\x8d' Receive: 7 79793.310553 79793.310459 49: seq: 17, identify_response offset=200 data=b'\x1d\x11\xac\x1c\xc1\xef#\xef\x1f\xed\x9a\xc0\xc0-b\xf7\\\x0e\xd9 \x8a[I\xa3\xa1\xcf\x1bY\x8b!3\xbb2\xd1\x80l\xf4\xfe\t\x9c' Receive: 8 79793.311098 79793.311012 49: seq: 18, identify_response offset=240 data=b'\xa3\xe2y\x9f\xc9\xfd8\x94\xed}\xb38\x0f\xf1h\xcdV\xec\x80\xa3\x87*\x8a\x13\xb3\x85\xecDF\x9f\x8b\xf3$pXM^\xb5\xbbL' Receive: 9 79793.311716 79793.311619 49: seq: 19, identify_response offset=280 data=b'4\x96{\xc5\xf6\xe26E6\xd5RV\xd4ev\xa0\xb8Ko\x07\xdeu\xce\x01\xe00" Receive: 18 79793.316928 79793.316830 49: seq: 12, identify_response offset=640 data=b'\xd3\xf6T\x8a\xde|\x92\x13S\xc8\x0ek\xac$\xf7\x16\r\xdd\xc1\x86=\xef\xeb\x16L\xb7;*Q\x1f\xec\x84\x1a;\xa6\x86\xba\x18\xf3\xde' Receive: 19 79793.317529 79793.317433 49: seq: 13, identify_response offset=680 data=b"jK\xff\x90\x1d8&6\xd8I\xd4\xfdA\xd4\x9c\x8e\xb6q\xab\xf4(\x0f'VX\xbf\xe47#XT\xdb-\xce7f\x04\xab\xec\x94" Receive: 20 79793.318076 79793.317989 49: seq: 14, identify_response offset=720 data=b'5\xd1\xfd\x04\x16\xad\xe79\xc4\x88\xbe\xe4\xbd\xb3\rt`\xa1A\xb8\xef\xc5\xc0\x0f0P\x8d\t\x11\xbc6\xafy\xbf\xe3M\xf1\x98\xa1\xc3' Receive: 21 79793.318632 79793.318542 49: seq: 15, identify_response offset=760 data=b'\x02&`\x8a\x9cW\xb6ok~\x10Od^w\xbeI\xe8\xb1\x8d&\xd3x\x03\xac;OK\xc7\xb52\xee\xc5n\xc7{<\x84D\x8b' Receive: 22 79793.319184 79793.319095 49: seq: 16, identify_response offset=800 data=b"A\x9f\x98\xb8\xcdU4\x03\x9e\xf2\x81[\x01\x85\xa0\xd5[\x01\xf1\x05\x9cJF2dE_\x90XO\x16;\xf0'\x8aO\xd0\x7f=R" Receive: 23 79793.319816 79793.319723 49: seq: 17, identify_response offset=840 data=b'8`x4\x1c;\xbc\x05\xb8\xc8\x93\x85\xf6\xb9\x99\x84\xfd2\xd0@\x1b\x8b\xf0\x9b\xe4\xbc\nghx\x05\x06\xcd]\xc7\n\x84\x88\x8e\xb1' Receive: 24 79793.320402 79793.320307 49: seq: 18, identify_response offset=880 data=b'nK\xb1}\xcc\xe0\xae\xedZ=W&\xc5tH\x05\x0e\x10Jd\xb1&\xa3;\x9c\xe2\xe3\\Vq\xedFBB\xd4w9\xdf>\x86' Receive: 25 79793.321011 79793.320914 49: seq: 19, identify_response offset=920 data=b'\x0b\x13%o\x06\xd8\x9c\xb5\xdb-\xec\xa2\x8c\xcaF%\xd8\xc78hu\x0c+\xcd\xf5\xd2\x83\x8c]\xe9$M\t\xc7~\xf4\xb6Y\xc32' Receive: 26 79793.321577 79793.321491 49: seq: 1a, identify_response offset=960 data=b't%\xb3,\xe0x\xa2\x017\xb0\x9c\x11\xa8\xbb\x1c\x9d\x13\x897\x16a\x9e1\xfc\x9f\xcaV;e\xd3\xfe\xd8\x8d \xeb\xd9\x01\xe1\x9e\x17' Receive: 27 79793.322175 79793.322080 49: seq: 1b, identify_response offset=1000 data=b'\xb7^\xc4\x8e\xec\xa9fi\x86\xe5\xa0k\xc1\x9e\xe7\xfb{\x01+2\x0b\xccR\x85g\xf2/\x8fE\xe1s(`)+\x8fY\xd4}V' Receive: 28 79793.322734 79793.322641 49: seq: 1c, identify_response offset=1040 data=b'\xc2\xab\x19\xc1\\\xc2Ib\x10\x0e\xa2\xc73\xec\xa1y@\xb0\x10[\x12ObOw\xcc_~\xfd\x88\x93K\xa0\x01\xf8i0\xdf\xd2\xbf' Receive: 29 79793.323289 79793.323199 49: seq: 1d, identify_response offset=1080 data=b'\x03:\xf7\xc8\x8feov\x8f\xd6O\x13\x82\xc4\x90\xe8,\xe1(\x89\xbd|\x90\xed\xda\x12L\xc3\xfc1\xe4xe\x901\x8a\xd8\xdc\x07\xd5' Receive: 30 79793.323947 79793.323840 49: seq: 1e, identify_response offset=1120 data=b'\x83\x1c\xa71\xae\xbd\xca\x9b\xe0\x17n/\x04+\xa5\x8cF\x85\x1e\xb5\xee|\x13\xc0\x02\xa3@\x1c\xff\xa4\xb3\x04\x15N\x17\x1d )\xb6U' Receive: 31 79793.324513 79793.324421 49: seq: 1f, identify_response offset=1160 data=b'.b\xd7\x9c$&@\xb4"\xa2\x86?h\x16 8Zo!z\xf2\x9f\x01!\xf9R\xfb\xdf\x13+\x10\xa7\xde\xcc\x08\xf3+\xc9\x12\x88' Receive: 32 79793.325279 79793.325147 49: seq: 10, identify_response offset=1200 data=b'\x14.\xcc\xcbR\xb0\x04\xd9:cs^&\t\t\xcf\xf3S\x1e4\x8a\rt\xc0\xfc\xd5\x8f\xdb:\x9d\x05\x1f\xcc\xbd\xb4\x16HV\x8eD' Receive: 33 79793.326113 79793.325967 49: seq: 11, identify_response offset=1240 data=b'\xb6\xdb\xe1>\xef\xb9O[\x0b\xd9\x9a(]\xb7R\x1cK_\x0e\x16\x8dSZ\xf4\xf9sDx^\x95\x19\xbd\x14`\x92\xcd\x14\xebx|' Receive: 34 79793.326857 79793.326741 49: seq: 12, identify_response offset=1280 data=b'Ip7\xca\x812\x0cb\xe0\x9b\x05\xe6\x98\xd6\xcc\x83\x8dCP\xa1\x13m\x85\x82+\xb3\xb1\xd6\x8b\xbc@\x01K\xea\x0cf"j\x15b' Receive: 35 79793.327528 79793.327417 49: seq: 13, identify_response offset=1320 data=b"l\x04\xa2J\x0cQ\x89\x1ae\x88\x0e\xe2\x88\xf9\x80jyx\x83\x9f\x19\xf1\xae\xeduX&_\xa1\xc6VI\xf8C'\xe0J\xfc$`" Receive: 36 79793.328126 79793.328009 49: seq: 14, identify_response offset=1360 data=b'cW\x9a\x9d\xc2G\x02\x83\xa6\x90u\xcckx\xb6\x14?\x99l\x0b\xeb\xf2\x8b\x1f.\xb3\xab\x8b\x7fb*\xb7\x81+\xba\xfc\xdb\xc7\xcb\x9f' Receive: 37 79793.328791 79793.328679 49: seq: 15, identify_response offset=1400 data=b'\xb3\x1f\x7f}\xff\x0b\xc6+\xfa;Y\\]~Y\x9c/*(\xf5\x1f\xa0\xac\xffty\xa1l\xc5\x90\x81B}\xfa\xc7\x15\r\xa3p\x8d' Receive: 38 79793.329415 79793.329320 49: seq: 16, identify_response offset=1440 data=b"\xf2\xb9\xfe|\xf1\xf9:\xbb\xferu\xfdK\xf6\xee\xe2\xfa=&2\xab'LeFH\xaeTA\xa0\xba\x02\xba\xee\xd2\x9fg\xcb\xc5\xf9" Receive: 39 79793.329963 79793.329874 49: seq: 17, identify_response offset=1480 data=b"\xbf\x96'\xeb\xdf\x00\x134M\xb5\rT \xc4y\xb5Q\xfa\x1b\xa4-\x9dh\t1L\xcd\xb8\xd8\x8bn\xf9\xfds\x90\xc0B`~\x06" Receive: 40 79793.330522 79793.330431 49: seq: 18, identify_response offset=1520 data=b'\x0b-,\x01\x1b\x9e\xc2"\x0bKW\xf1\x0c\x16[X\x10\x80\x8dN\x81\x89\x03\xc6\xf1\x9c\x9b\x95\x03\xae\xc39;k\xc7\xea2\x98\xf3\x93' Receive: 41 79793.331084 79793.330991 49: seq: 19, identify_response offset=1560 data=b':`\xb44\x0c\x81\xc7\xa1\xd3\xc3\x07\x82VI\x02&\x1e\xac\x1c(\xf0@\xc0\xaa\x0f\n=\x10\xdc\x9b\x0f\x8a0!Y\xae\xf7\xa2\xea\x9d\xaa\x18\x8d,\x11\x15\xbd\x12\xd5Z4\xab\xd2\x04\x95j\xc1v\xbca\xa6" Receive: 48 79793.335196 79793.335105 49: seq: 10, identify_response offset=1840 data=b'\xc0\xb5\xf4\x10\x04/\xa9\x99\xc8\xba\xbc\x97\x00R\x9d&U\xc6\x18@\xcf!E\x91\x83j)^\xb6cU\xd2\xb9\x94\xeb\xfd\xe1:H\xdf' Receive: 49 79793.335827 79793.335732 49: seq: 11, identify_response offset=1880 data=b'A*\x8al\x01\xf1\xb0\xc7\x0fj\xae|\x13*\xfb\x0e|dh\xb8\x0c\x94' Receive: 52 79793.337552 79793.337462 49: seq: 14, identify_response offset=2000 data=b'Y\x00\x1a\xcaa\x0b)`I\x8d\xca\x0f\x94\xd2z\xebb\x97\x90\x89\xf2\x04\x13E-\xb7\x16tIu\x8d5\x17\xd4\x0cz\x81Ti9' Receive: 53 79793.338149 79793.338056 49: seq: 15, identify_response offset=2040 data=b'R\xc2]\x0c9\x08\xe4\xf5\xf7\xaf)\xf32D\xa6\x89\xeaz\xba\x94\x98R\xfaa\xb0\xecQ&s\x80\x86\xba\x05\xb6\x03Y-uF\x0c' Receive: 54 79793.338703 79793.338611 49: seq: 16, identify_response offset=2080 data=b'\xb0n\xc1\xb2\xb4z1l\xdfa\x14u`\xdb\xec\xb3\xed=j\x8c\x1c\xc0uEi\xf7\xc7<\xdf \x81E0\xf2s\xd8\xab0\xb3\xa6' Receive: 55 79793.339288 79793.339198 49: seq: 17, identify_response offset=2120 data=b'\xe5\xa7-\x9d\x81\xb4T$\xa7"w\x8ee@\xde\xb9\xb0\xa9f\x82}\xb8\x9e\xcc\xeb\xf2G]#\xed\x1cy\x87\x9a\x947\x1e\x0e\xe6"' Receive: 56 79793.339947 79793.339841 49: seq: 18, identify_response offset=2160 data=b'W\xf9\x03\xeanj\xe4M\xed\xaf+.e\xbe\xe3\x8c7\x05\xa4\x87\xc6@\xe1v\xae\x84\x94\x1c\xb6\x84R\xb3\x1c+\xd47 \xc6\xac\x9c' Receive: 57 79793.340526 79793.340435 49: seq: 19, identify_response offset=2200 data=b'\xe9DE\x19\x03\xbf\xe3xQ\x98\x90?O\xb0\xcf\xfbRy(\x8d\x8d\r\xf4\xe7\xb1\x8d\\42V1Wx\x95\xaa\x94a\xf0\xd5o' Receive: 58 79793.341214 79793.341110 49: seq: 1a, identify_response offset=2240 data=b'\xab\xf6\x9e\x8a\xa7_\xb9^\x00\x96B\x03\xea\x95\xc5\x817\xedr\xf4)\xd8\x9b\xb8\xb6\x08\x07|\xb3{\x01~\x99?\x14\x1c\xa0~\xdb\x93' Receive: 59 79793.341799 79793.341705 49: seq: 1b, identify_response offset=2280 data=b"rQG9a\xe9\x05*\xec8{T\xe6\xc4/P`\xe1~\xcd\x07}'\x8am\xc4\x10\xf5X\x9b9c\x0b \x87kk\xd7\xd8\x88" Receive: 60 79793.342393 79793.342302 49: seq: 1c, identify_response offset=2320 data=b'\x81\xc5\x94\xdfU\xee\xcc\x7f\xe6\xb8\xd6\x8exh[\xb6\xcd\x95LH\x1e\xd8w\xfa\xec\xab\x88\xf6{\xaa\x05L\xb9\xefg%E\xa4\x04\xb7' Receive: 61 79793.342932 79793.342843 49: seq: 1d, identify_response offset=2360 data=b'$\xb9\xea\xa3}\x86\x11\xe8\xfe#\xf6\xcd\xb5\xef\x90T=X\x08j\xac\x85`K\xfdK\x93\xdf`4j\xb5"+i\x10\x06uE\x1d' Receive: 62 79793.343577 79793.343479 49: seq: 1e, identify_response offset=2400 data=b'\x02h\x02\\,\xae\x00\t\xd3PQ\xf5\xe4\xc0\xca\xe3\xcc}\x17\xbd\x18\xcd\x90\xf2\xb2\xb0`\xacI\xe6`\x1d\x0bl$6\xb8\xf1\xfa\x00' Receive: 63 79793.344155 79793.344060 49: seq: 1f, identify_response offset=2440 data=b'\xd7\x9d\x94\x1e\x1f\xe6`\x9f#\xd0^NO^3,T\xb4\x03\xb4\xe4\x00\xcd\xc9\x8ez!\x0e\xac\xa2\xd1\x84\x95\xc0\x07c\xf8\xbd\xfe\xf4' Receive: 64 79793.344712 79793.344619 49: seq: 10, identify_response offset=2480 data=b'A\x15v\xd4\xe48\x84\xc9\x8ec\xd2\x90\xc4s`\xd36\xa77\x18y\x94\xed\xcd\xb8\x980\xa9\x1d\xa0\x91\x9a\xf6W\xc9\xe4\x0e\xa9\xa9\x87' Receive: 65 79793.345331 79793.345224 49: seq: 11, identify_response offset=2520 data=b'Kw\x82^\xd14\x8c\x00\x933\xc0\xed\xaaw\xc5\xac\xd8\x8f\xcd-(\x1f\xa4*%=Wy\xf3\xd2\x01@&\xe4\xf5t\x90E\xa7\x0e' Receive: 66 79793.345877 79793.345781 49: seq: 12, identify_response offset=2560 data=b'\xc5\x96d\x85d\xaa\xe2\xf0:\xfd\x94\x94\xb4M\x05y\xcc\x1d,@L\xa8\xf4\xc4\x9a\xc8\xe6\xa0\xd1y\xce>B>\x04e\xce\rVi' Receive: 67 79793.346410 79793.346317 49: seq: 13, identify_response offset=2600 data=b'[lt\xcb\xbfP#[\xbd|\xda\xd4H\xbf\x87\x96\xd4\xbd\x96\xd8\xaeD\x0fO\xbe\xa7\x000\x82b[\x95\xaa\xe0\xa2\xac\xa9\xca{L' Receive: 68 79793.346940 79793.346845 49: seq: 14, identify_response offset=2640 data=b'\x19\xf0%\xe4H\xbd\x87&L\x1e\x1c_)t\x06E\x1e\x0f\xab\\\xc85\x0f:\xf9\x98lB\xf1\x16\x05i\x92\xa8\xecZ\x0fV*\xbd' Receive: 69 79793.347530 79793.347426 49: seq: 15, identify_response offset=2680 data=b"\xa6\xc1*Q\xfe\x00\x06\xab\xd5\x1a\xbe\xa3\xa7'\xd5\xdd\x81\xdcDrz\xe0\xd5=M\xbfd\x97\x183\x9b\x82\xcf:\xa7\xa7(\x8d\xa3=" Receive: 70 79793.348078 79793.347979 49: seq: 16, identify_response offset=2720 data=b"P\xd7}\xd2M6S\x14S\x13\xc7_\xeef\xdcn9x.\xa4\xda\x8am\x8b\xbf\x95\xf0\x9eq\xb1\xcbr\x8a^\xd16S'\xbds" Receive: 71 79793.348629 79793.348535 49: seq: 17, identify_response offset=2760 data=b'Z\xf2X\xb7k\x13\xb9\x17\xe4\tE\xeeuJ\x99\x82\xe8\xf3\xa07\xa4\xdc\xcb\x95\xff\xa9}\xcd\x04\xb7\xa4\xdb\xee\xea\x84\xaa;\x8fsF' Receive: 72 79793.349207 79793.349105 49: seq: 18, identify_response offset=2800 data=b'\x8dT\xd7\x05\xa2\x91\xcfx\xaa\xde\x93T\x03\xf6%\xae5\x85\xfe\xc8\xdc\xee\xa7\x18G\xcd\x93\x88\x04\x9fl_8R|D\xa1\xce\xac\x01' Receive: 73 79793.349744 79793.349651 49: seq: 19, identify_response offset=2840 data=b'\xbd$\x10A.]/\xbat\xaf\x11\x13\xae\xf6m\r\xc6\x7f\xb8\x88\xff\xd8\x01\x82\xf5\x1a\xfc\x99Q\x1e\xd7\xca\xa0\xb1Q\x91\xd05\xf1=' Receive: 74 79793.350291 79793.350194 49: seq: 1a, identify_response offset=2880 data=b"\\\xdb\xcd'm:C\\`\xca\x93&\x9b\xd7RZ\xa0\xb0\x9ei\n\x7f\x8b\x8ab\xc9r\xb4\x89\xfc\xa7Tt<\xa2\xa2X\xd5\xd9G" Receive: 75 79793.350828 79793.350733 49: seq: 1b, identify_response offset=2920 data=b'\x87\xe9\x8d\xc8\xb1(\xd4\x1bt\x81xp\x02\x90\x82\xff\xee\x95b#\xccEr\xf3Dp\\\x00\x91_R\x7f\x93\x08\xd6>\x85\xd7\x14\xf3' Receive: 76 79793.351398 79793.351263 49: seq: 1c, identify_response offset=2960 data=b'\t\x10/=\xd6\xca<\xb8`\xbf9\xee\xdf4f\x94~\xef\xf0+\x9a\xb1\x89U\xb9\xdc\x0f\xaadH\x03*\x9e\xa53\x059\xd6\xfaG' Receive: 77 79793.351993 79793.351895 49: seq: 1d, identify_response offset=3000 data=b"\xfeN\x1a\x1f\xbbn\xe0\xacUH\xcf:\x10g6\xcb\x99c\xfc\x06\xd3\x18\x8di\xa0j'\xae\x7fx\xc8?v\x0e\xe9\xac\x91\xdf\x13t" Receive: 78 79793.352535 79793.352435 49: seq: 1e, identify_response offset=3040 data=b'\xf6S\xe4\xb6Ay\xf4!\xd0\xf3+\x9b\x10\xfd\xbe\xaa\x95\xe9U|\xf4\x9dN\x02nY\xff_\xcf\xe2|q\xb7<\x0b\x02\xfcW\x9eu' Receive: 79 79793.353115 79793.353015 26: seq: 1f, identify_response offset=3080 data=b't\xba\xcb\xd3\x9b\xe0f\xc9\xb7\x8b\xa7\xff\x02\xe9Y\xfa\xae' Receive: 80 79793.353658 79793.353561 9: seq: 10, identify_response offset=3097 data=b'' Receive: 81 79793.418723 79793.418543 12: seq: 11, uptime high=0 clock=1843169296 Receive: 82 79793.471480 79793.471328 11: seq: 12, clock clock=1845807308 Receive: 83 79793.522655 79793.522498 11: seq: 13, clock clock=1848366003 Receive: 84 79793.573801 79793.573662 11: seq: 14, clock clock=1850923077 Receive: 85 79793.625996 79793.625833 11: seq: 15, clock clock=1853533195 Receive: 86 79793.677311 79793.677152 11: seq: 16, clock clock=1856099000 Receive: 87 79793.728691 79793.728537 11: seq: 17, clock clock=1858668058 Receive: 88 79793.779865 79793.779713 11: seq: 18, clock clock=1861226793 Receive: 89 79793.831077 79793.830919 11: seq: 19, clock clock=1863787493 Receive: 90 79793.833478 79793.833334 11: seq: 1a, clock clock=1863906766 Receive: 91 79793.841683 79793.841541 10: seq: 1b, config is_config=0 crc=0 is_shutdown=0 move_count=0 Receive: 92 79793.843720 79793.843532 12: seq: 1c, shutdown clock=1864417036 static_string_id=oids already allocated Build file /home/klipper/klipper/klippy/../.config(3418): Wed Jun 21 19:14:28 2023 ========= Last MCU build config ========= CONFIG_LOW_LEVEL_OPTIONS=y # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set CONFIG_MACH_STM32=y # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set # CONFIG_MACH_LINUX is not set # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="stm32" CONFIG_MCU="stm32h743xx" CONFIG_CLOCK_FREQ=400000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x8000000 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x20000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x8020000 CONFIG_STM32_SELECT=y # CONFIG_MACH_STM32F103 is not set # CONFIG_MACH_STM32F207 is not set # CONFIG_MACH_STM32F401 is not set # CONFIG_MACH_STM32F405 is not set # CONFIG_MACH_STM32F407 is not set # CONFIG_MACH_STM32F429 is not set # CONFIG_MACH_STM32F446 is not set # CONFIG_MACH_STM32F765 is not set # CONFIG_MACH_STM32F031 is not set # CONFIG_MACH_STM32F042 is not set # CONFIG_MACH_STM32F070 is not set # CONFIG_MACH_STM32F072 is not set # CONFIG_MACH_STM32G070 is not set # CONFIG_MACH_STM32G071 is not set # CONFIG_MACH_STM32G0B0 is not set # CONFIG_MACH_STM32G0B1 is not set # CONFIG_MACH_STM32G431 is not set # CONFIG_MACH_STM32H723 is not set CONFIG_MACH_STM32H743=y # CONFIG_MACH_STM32H750 is not set # CONFIG_MACH_STM32L412 is not set # CONFIG_MACH_N32G452 is not set # CONFIG_MACH_N32G455 is not set CONFIG_MACH_STM32H7=y CONFIG_HAVE_STM32_USBOTG=y CONFIG_HAVE_STM32_FDCANBUS=y CONFIG_HAVE_STM32_USBCANBUS=y CONFIG_STM32_DFU_ROM_ADDRESS=0x1ff09800 CONFIG_STM32_FLASH_START_20000=y # CONFIG_STM32_FLASH_START_0000 is not set # CONFIG_STM32_CLOCK_REF_8M is not set # CONFIG_STM32_CLOCK_REF_12M is not set # CONFIG_STM32_CLOCK_REF_16M is not set # CONFIG_STM32_CLOCK_REF_20M is not set # CONFIG_STM32_CLOCK_REF_24M is not set CONFIG_STM32_CLOCK_REF_25M=y # CONFIG_STM32_CLOCK_REF_INTERNAL is not set CONFIG_CLOCK_REF_FREQ=25000000 CONFIG_STM32F0_TRIM=16 CONFIG_STM32_USB_PA11_PA12=y # CONFIG_STM32_USB_PB14_PB15 is not set # CONFIG_STM32_SERIAL_USART1 is not set # CONFIG_STM32_SERIAL_USART1_ALT_PB7_PB6 is not set # CONFIG_STM32_SERIAL_USART2 is not set # CONFIG_STM32_SERIAL_USART2_ALT_PD6_PD5 is not set # CONFIG_STM32_SERIAL_USART3 is not set # CONFIG_STM32_SERIAL_USART3_ALT_PD9_PD8 is not set # CONFIG_STM32_SERIAL_UART4 is not set # CONFIG_STM32_CANBUS_PA11_PA12 is not set # CONFIG_STM32_CANBUS_PA11_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB8_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB12_PB13 is not set # CONFIG_STM32_MMENU_CANBUS_PD0_PD1 is not set # CONFIG_STM32_MMENU_CANBUS_PB0_PB1 is not set # CONFIG_STM32_MMENU_CANBUS_PD12_PD13 is not set # CONFIG_STM32_MMENU_CANBUS_PC2_PC3 is not set # CONFIG_STM32_USBCANBUS_PA11_PA12 is not set CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" # # USB ids # # end of USB ids CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_INITIAL_PINS="" CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_HAVE_BOOTLOADER_REQUEST=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/klipper/klipper/klippy/../out/klipper.dict(7935): Wed Jun 21 19:15:13 2023 Last MCU build version: v0.11.0-233-g1374c701 Last MCU build tools: gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi2b=PI2,PI3,PI1 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h743xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/klipper/klipper/klippy/../out/klipper.elf(1757700): Wed Jun 21 19:15:27 2023 Transition to shutdown state: MCU 'rpi' shutdown: oids already allocated Dumping 20 requests for client 281473370774000 Received 79789.313715: b'{"id": 281473703173504, "method": "info", "params": {}}' Received 79789.568290: b'{"id": 281473703173024, "method": "info", "params": {}}' Received 79789.821357: b'{"id": 281473703168224, "method": "info", "params": {}}' Received 79790.074339: b'{"id": 281473703173312, "method": "info", "params": {}}' Received 79790.327432: b'{"id": 281473703173312, "method": "info", "params": {}}' Received 79790.582729: b'{"id": 281473703173312, "method": "info", "params": {}}' Received 79790.848293: b'{"id": 281473703166640, "method": "info", "params": {}}' Received 79791.101306: b'{"id": 281473703166640, "method": "info", "params": {}}' Received 79791.262084: b'{"id": 281473703169136, "method": "info", "params": {}}' Received 79791.354740: b'{"id": 281473703169136, "method": "info", "params": {}}' Received 79791.607967: b'{"id": 281473703169136, "method": "info", "params": {}}' Received 79791.861519: b'{"id": 281473703180560, "method": "info", "params": {}}' Received 79792.115023: b'{"id": 281473703168224, "method": "info", "params": {}}' Received 79792.368146: b'{"id": 281473703168224, "method": "info", "params": {}}' Received 79792.623548: b'{"id": 281473703168224, "method": "info", "params": {}}' Received 79792.885647: b'{"id": 281473703175664, "method": "info", "params": {}}' Received 79793.139001: b'{"id": 281473703169136, "method": "info", "params": {}}' Received 79793.265392: b'{"id": 281473703166640, "method": "info", "params": {}}' Received 79793.418733: b'{"id": 281473703166640, "method": "info", "params": {}}' Received 79793.672977: b'{"id": 281473703175424, "method": "info", "params": {}}' Reactor garbage collection: (79793.420058131, 0.0, 0.0) MCU 'mcu' shutdown: Command request clocksync state: mcu_freq=400000000 last_clock=24896501113 clock_est=(79792.956 24756032879 400055958.511) min_half_rtt=0.000192 min_rtt_time=79793.146 time_avg=79792.956(0.018) clock_avg=24756032879.877(7160766.351) pred_variance=118028125647.438 Dumping serial stats: bytes_write=1019 bytes_read=4223 bytes_retransmit=9 bytes_invalid=0 send_seq=108 receive_seq=108 retransmit_seq=2 srtt=0.001 rttvar=0.000 rto=0.025 ready_bytes=0 upcoming_bytes=0 Dumping send queue 100 messages Sent 0 79792.782526 79792.782526 9: seq: 18, identify offset=240 count=40 Sent 1 79792.787149 79792.787149 9: seq: 19, identify offset=280 count=40 Sent 2 79792.792275 79792.792275 9: seq: 1a, identify offset=320 count=40 Sent 3 79792.794493 79792.794493 9: seq: 1b, identify offset=360 count=40 Sent 4 79792.796398 79792.796398 9: seq: 1c, identify offset=400 count=40 Sent 5 79792.797576 79792.797576 9: seq: 1d, identify offset=440 count=40 Sent 6 79792.798603 79792.798603 9: seq: 1e, identify offset=480 count=40 Sent 7 79792.799946 79792.799946 9: seq: 1f, identify offset=520 count=40 Sent 8 79792.801268 79792.801268 9: seq: 10, identify offset=560 count=40 Sent 9 79792.802375 79792.802375 9: seq: 11, identify offset=600 count=40 Sent 10 79792.803672 79792.803672 9: seq: 12, identify offset=640 count=40 Sent 11 79792.804913 79792.804913 9: seq: 13, identify offset=680 count=40 Sent 12 79792.806136 79792.806136 9: seq: 14, identify offset=720 count=40 Sent 13 79792.807395 79792.807395 9: seq: 15, identify offset=760 count=40 Sent 14 79792.808659 79792.808659 9: seq: 16, identify offset=800 count=40 Sent 15 79792.809891 79792.809891 9: seq: 17, identify offset=840 count=40 Sent 16 79792.811094 79792.811094 9: seq: 18, identify offset=880 count=40 Sent 17 79792.812556 79792.812556 9: seq: 19, identify offset=920 count=40 Sent 18 79792.813680 79792.813680 9: seq: 1a, identify offset=960 count=40 Sent 19 79792.814888 79792.814888 9: seq: 1b, identify offset=1000 count=40 Sent 20 79792.816148 79792.816148 9: seq: 1c, identify offset=1040 count=40 Sent 21 79792.817390 79792.817390 9: seq: 1d, identify offset=1080 count=40 Sent 22 79792.818598 79792.818598 9: seq: 1e, identify offset=1120 count=40 Sent 23 79792.819900 79792.819900 9: seq: 1f, identify offset=1160 count=40 Sent 24 79792.821218 79792.821218 9: seq: 10, identify offset=1200 count=40 Sent 25 79792.822369 79792.822369 9: seq: 11, identify offset=1240 count=40 Sent 26 79792.823813 79792.823813 9: seq: 12, identify offset=1280 count=40 Sent 27 79792.825171 79792.825171 9: seq: 13, identify offset=1320 count=40 Sent 28 79792.826381 79792.826381 9: seq: 14, identify offset=1360 count=40 Sent 29 79792.827664 79792.827664 9: seq: 15, identify offset=1400 count=40 Sent 30 79792.829042 79792.829042 9: seq: 16, identify offset=1440 count=40 Sent 31 79792.830146 79792.830146 9: seq: 17, identify offset=1480 count=40 Sent 32 79792.831450 79792.831450 9: seq: 18, identify offset=1520 count=40 Sent 33 79792.832775 79792.832775 9: seq: 19, identify offset=1560 count=40 Sent 34 79792.833938 79792.833938 9: seq: 1a, identify offset=1600 count=40 Sent 35 79792.835167 79792.835167 9: seq: 1b, identify offset=1640 count=40 Sent 36 79792.836471 79792.836471 9: seq: 1c, identify offset=1680 count=40 Sent 37 79792.837707 79792.837707 9: seq: 1d, identify offset=1720 count=40 Sent 38 79792.838927 79792.838927 9: seq: 1e, identify offset=1760 count=40 Sent 39 79792.840517 79792.840517 9: seq: 1f, identify offset=1800 count=40 Sent 40 79792.841710 79792.841710 9: seq: 10, identify offset=1840 count=40 Sent 41 79792.842876 79792.842876 9: seq: 11, identify offset=1880 count=40 Sent 42 79792.844126 79792.844126 9: seq: 12, identify offset=1920 count=40 Sent 43 79792.845402 79792.845402 9: seq: 13, identify offset=1960 count=40 Sent 44 79792.846629 79792.846629 9: seq: 14, identify offset=2000 count=40 Sent 45 79792.848024 79792.848024 9: seq: 15, identify offset=2040 count=40 Sent 46 79792.849298 79792.849298 9: seq: 16, identify offset=2080 count=40 Sent 47 79792.850502 79792.850502 9: seq: 17, identify offset=2120 count=40 Sent 48 79792.851862 79792.851862 9: seq: 18, identify offset=2160 count=40 Sent 49 79792.853143 79792.853143 9: seq: 19, identify offset=2200 count=40 Sent 50 79792.854384 79792.854384 9: seq: 1a, identify offset=2240 count=40 Sent 51 79792.855792 79792.855792 9: seq: 1b, identify offset=2280 count=40 Sent 52 79792.857055 79792.857055 9: seq: 1c, identify offset=2320 count=40 Sent 53 79792.858309 79792.858309 9: seq: 1d, identify offset=2360 count=40 Sent 54 79792.859682 79792.859682 9: seq: 1e, identify offset=2400 count=40 Sent 55 79792.860871 79792.860871 9: seq: 1f, identify offset=2440 count=40 Sent 56 79792.862096 79792.862096 9: seq: 10, identify offset=2480 count=40 Sent 57 79792.863528 79792.863528 9: seq: 11, identify offset=2520 count=40 Sent 58 79792.864732 79792.864732 9: seq: 12, identify offset=2560 count=40 Sent 59 79792.866006 79792.866006 9: seq: 13, identify offset=2600 count=40 Sent 60 79792.867235 79792.867235 9: seq: 14, identify offset=2640 count=40 Sent 61 79792.868512 79792.868512 9: seq: 15, identify offset=2680 count=40 Sent 62 79792.869798 79792.869798 9: seq: 16, identify offset=2720 count=40 Sent 63 79792.871025 79792.871025 9: seq: 17, identify offset=2760 count=40 Sent 64 79792.872505 79792.872505 9: seq: 18, identify offset=2800 count=40 Sent 65 79792.873646 79792.873646 9: seq: 19, identify offset=2805 count=40 Sent 66 79792.885564 79792.885564 6: seq: 1a, get_uptime Sent 67 79792.937434 79792.937434 6: seq: 1b, get_clock Sent 68 79792.989367 79792.989367 6: seq: 1c, get_clock Sent 69 79793.041524 79793.041524 6: seq: 1d, get_clock Sent 70 79793.093586 79793.093586 6: seq: 1e, get_clock Sent 71 79793.146254 79793.146254 6: seq: 1f, get_clock Sent 72 79793.197645 79793.197645 6: seq: 10, get_clock Sent 73 79793.249927 79793.249927 6: seq: 11, get_clock Sent 74 79793.302643 79793.302643 6: seq: 12, get_clock Sent 75 79793.306664 79793.306664 6: seq: 13, get_clock Sent 76 79793.833022 79793.833022 6: seq: 14, get_config Sent 77 79793.838582 79793.838582 8: seq: 15, update_digital_out oid=24 value=0 Sent 78 79793.838696 79793.838696 14: seq: 16, endstop_home oid=8 clock=0 sample_ticks=0 sample_count=0 rest_ticks=0 pin_value=0 trsync_oid=0 trigger_reason=0 Sent 79 79793.838781 79793.838781 10: seq: 17, trsync_start oid=9 report_clock=0 report_ticks=0 expire_reason=0 Sent 80 79793.838911 79793.838911 8: seq: 18, reset_step_clock oid=10 clock=0 Sent 81 79793.838951 79793.838951 8: seq: 19, update_digital_out oid=26 value=1 Sent 82 79793.839047 79793.839047 14: seq: 1a, endstop_home oid=11 clock=0 sample_ticks=0 sample_count=0 rest_ticks=0 pin_value=0 trsync_oid=0 trigger_reason=0 Sent 83 79793.839137 79793.839137 13: seq: 1b, trsync_start oid=12 report_clock=0 report_ticks=0 expire_reason=0, reset_step_clock oid=13 clock=0 Sent 84 79793.839210 79793.839210 8: seq: 1c, update_digital_out oid=27 value=1 Sent 85 79793.839289 79793.839289 14: seq: 1d, endstop_home oid=14 clock=0 sample_ticks=0 sample_count=0 rest_ticks=0 pin_value=0 trsync_oid=0 trigger_reason=0 Sent 86 79793.839404 79793.839404 10: seq: 1e, trsync_start oid=15 report_clock=0 report_ticks=0 expire_reason=0 Sent 87 79793.839459 79793.839459 8: seq: 1f, reset_step_clock oid=16 clock=0 Sent 88 79793.839509 79793.839509 8: seq: 10, update_digital_out oid=28 value=1 Sent 89 79793.839860 79793.839860 46: seq: 11, reset_step_clock oid=17 clock=0, update_digital_out oid=29 value=1, reset_step_clock oid=18 clock=0, update_digital_out oid=32 value=1, query_analog_in oid=19 clock=4201163520 sample_ticks=400000 sample_count=8 rest_ticks=120000000 min_value=10757 max_value=32331 range_check_count=4, queue_digital_out oid=20 clock=3713025983 on_ticks=0 Sent 90 79793.840017 79793.840017 13: seq: 12, queue_digital_out oid=21 clock=3713069139 on_ticks=0 Sent 91 79793.840084 79793.840084 13: seq: 13, queue_digital_out oid=22 clock=3713126531 on_ticks=0 Sent 92 79793.840151 79793.840151 10: seq: 14, buttons_add oid=23 pos=0 pin=PE7 pull_up=1 Sent 93 79793.840212 79793.840212 10: seq: 15, buttons_add oid=23 pos=1 pin=PB2 pull_up=1 Sent 94 79793.840292 79793.840292 10: seq: 16, buttons_add oid=23 pos=2 pin=PB0 pull_up=1 Sent 95 79793.840389 79793.840389 17: seq: 17, buttons_query oid=23 clock=4217163520 rest_ticks=800000 retransmit_count=50 invert=4 Sent 96 79793.840444 79793.840444 13: seq: 18, queue_digital_out oid=25 clock=3713259033 on_ticks=0 Sent 97 79793.840581 79793.840581 26: seq: 19, query_analog_in oid=30 clock=4245163520 sample_ticks=400000 sample_count=8 rest_ticks=120000000 min_value=552 max_value=32201 range_check_count=4 Sent 98 79793.840708 79793.840708 13: seq: 1a, queue_digital_out oid=31 clock=3713832446 on_ticks=0 Sent 99 79793.866099 79793.866099 6: seq: 1b, emergency_stop Dumping receive queue 91 messages Receive: 0 79792.756143 79792.755073 48: seq: 13, identify_response offset=0 data=b'x\xda\xa5Y\xe9n\xe3\xc8\x11~\x15F\xc0 ;\x89m\x88\x97\x0e\x03\xf3\xc3\xf6xf\x16\x1b\xefx}$\x01\x82\x80\xa0\xc9\x96D\x98' Receive: 1 79792.759803 79792.758572 48: seq: 14, identify_response offset=40 data=b'\xd7\xf2\xf0\x91\x85\xdf=_uu7\x9b\x94fv\x91\x18\x90\xd5GUuw\xddU\xfam\xf6\xd0gy\x1a=\x89\xa6\xcd\xaa\xb2\x9d\x9d' Receive: 2 79792.763550 79792.762703 48: seq: 15, identify_response offset=80 data=b'\xce\xb6Ir\xea\xfc\xe0\x86\xa7\xee\xfc\xc4?\xf6\xe6\x9e{2_\x1e\x07\xef\x1d\x9a\x9f\xb8\x0e\xad\xcc\x17\x9e\xeb\xfc\xd0\x88\\\xc4\xadx\xef' Receive: 3 79792.768185 79792.767266 49: seq: 16, identify_response offset=120 data=b'\xcf\xa3\xbef\x84\xc5\x80\xf0k/\x9aWC\x13\x17x$\xe8F\xb4]\xd4e\xc9c\xcb\xb3\xae\x89\xcb' Receive: 6 79792.783799 79792.782526 49: seq: 19, identify_response offset=240 data=b'\xb6\xc8\xbaH\x9f\xead%X\xa4\xce\x0f\xf1\x0e\xbc\xbc\x89\xda]\xdf\xa5\xd5s9;\xf5\xe8i\xe5&\xdb\xe2F/\xb9\x1f\x84\xfa\x88\xb6' Receive: 7 79792.788715 79792.787149 49: seq: 1a, identify_response offset=280 data=b'\xce"\x1e\xceNCw\x80*\xe3\xbc\xdaFYin/\xaf=;\xf5\x07J\xea\xca\x1a\x82\xa7\x91\xc5\x87\xa5\x01\x95\x8b\xa2\x19\x13\x1b\xf1' Receive: 8 79792.793331 79792.792275 49: seq: 1b, identify_response offset=320 data=b'`\x19\x18\xe04\xdbf]\x9cGU\xdfM\x10\x9e\xe2\xbc\x174O\xc5&\xee\xf3.2\x0bE\xfc\x12\xa5}\x13wP\x12yOw8' Receive: 9 79792.795533 79792.794493 49: seq: 1c, identify_response offset=360 data=b'\\@\x9e]U\x8fh%\xa3\xc3\xbd\x85\x01\xde\xa5A\xb0\\\xcd5p\xd3F\xeal\xa1\x07i`F\xa1\x19-\xcchiF"\x8f_' Receive: 10 79792.796812 79792.796398 49: seq: 1d, identify_response offset=400 data=b'\x8d\xd0\xc0\x0e\xdf\x1c\x92y\x89>\x00C0\x92\xc5\n]\xa3o\xe8\x0c\xe4\xcdH\xc1\xc0\x96\xa2\xee\xd7^8\xb7\x11\x8d\xe0\x86\xc7\x96\xa2' Receive: 11 79792.798086 79792.797576 49: seq: 1e, identify_response offset=440 data=b'\xaa\xb3\x17\x91O8\x97\xc6]\x1c\xb5\xd9\x7fp\xc0\xae\x87=t\x11q\xcc\xd2\xa8V`)+\xad\xfb.\x07I\xd7\xcf\xc5\x01i$\xaf' Receive: 12 79792.799406 79792.798603 49: seq: 1f, identify_response offset=480 data=b'\xd0\xb2\x81\x86\x92\xc5\xae\x9fJ\x07+{\xe2\t\x86\x1bC\x03\xa7\x84\xc9\xb0\xba\xecID\xbbl\xbb\x93/\xf4W6<\xd4s\x9b\x8b}' Receive: 13 79792.800732 79792.799946 49: seq: 10, identify_response offset=520 data=b'\x15v\xcc^\xd4\xbd\xd6\x82y\x13\x8c0\xb5I\x1cBV[Q\xd1n?\xbc\xfb\x0b|\x80\xef\x8fp\x9f\xb3n\x076D\x89\xd6y@' Receive: 14 79792.801911 79792.801268 49: seq: 11, identify_response offset=560 data=b"X\xef\xe8\x96k\xcf\x88'1\x8a\xd3&\xf9\xa3\x19g\xa9\x19\xbe\x96I4\xd6\x11')\xd2hOm\xe6\xd6\t\xa2\xae\x07+\xa2i\xa4" Receive: 15 79792.803165 79792.802375 49: seq: 12, identify_response offset=600 data=b'\xb49\xcd\x1a=dO \x81\x07\xa8>o\x85E\xd4\x1b\x1e\xd6\xedDST0\xd0\xfa G\xed\xed\x81\xa9\xc1p\xa9\xaeH\xfa\xb81' Receive: 16 79792.804432 79792.803672 49: seq: 13, identify_response offset=640 data=b'\xba\xd1\xbcD{\xd6\xedtf\x914\xaf\xcb\n\xc1O[\x0fT\x1a\xe2\xc7\xc0V\xd0O\xc5C\x0f}\xae\xea\xd9\xe9Z\xcf@e+u' Receive: 17 79792.805681 79792.804913 49: seq: 14, identify_response offset=680 data=b"\x99\xe5\xe3\x1a\xb0F\xc4p\xb4M*\x1a:\x8f,\x88\xbd\x80\xa7\x01\x9e\x9b\xac\x13{\x10\xa4\xb4\x0c\x08\xd7'\n\xd1lE\x99\xbcF\xe4" Receive: 18 79792.806916 79792.806136 49: seq: 15, identify_response offset=720 data=b'.p\t,\xb1\xeb\x88vU!\xf6\x9cr\x1b\x17\xb5m\x00jn\\\xf2\xd8i\xe3\xea\x83\xbb\xe2\xe7\x1a\x1e7\xd9v+\x1azDK' Receive: 19 79792.808171 79792.807395 49: seq: 16, identify_response offset=760 data=b"\xf6A\x1e)\x1c\x0e\x97!\x01w\x8a;a\x18\xe4A\xab7\x19\x9c4L:b\x1e:I\x930[\x8ff[X\xb3\xbc'\xf4_\xcd" Receive: 20 79792.809427 79792.808659 49: seq: 17, identify_response offset=800 data=b'$\x0c\xac\x9a\xa7}MR\x80 \x8ff\xca\xe3E-\xce\x8b\xa0\x81\xc6\xa1\xd3\x98\xf9\xbc\xf0&`$\x02\r6\x88c\x01&\x92[*' Receive: 21 79792.810659 79792.809891 49: seq: 18, identify_response offset=840 data=b'\xaa4\xdb\xbcF\x90\xb5\xa1\xd5\x08iR\x8e\x8aK\xb8\x01\xed2Z\xa0\xd0X\x86cxZ\x8br\xa1\x9c\x86\xc7\x80J\x96\xd3\xe3\x03\x08' Receive: 22 79792.811934 79792.811094 49: seq: 19, identify_response offset=880 data=b',KE\xd9\xe1p\xa7\xdalp\x8a4*\x13\x90p\x8ev\x8f\xf2\x19\x86\x9b\xcb\xb9\xb5\xd3\xd7\xe9\xc0i\x8e\xda\xbb\xde:f\t2,' Receive: 23 79792.813170 79792.812556 49: seq: 1a, identify_response offset=920 data=b'\x92I(=\x1c\xad!\x81\xf9\x04A\xca\xb2\x1f\x9cH\xb06\x00\xd3\xb0\xfb?*[1(\x9b\xf2\xbe\xc3\x0c\xa9\xc3\x16\x88;\x91{' Receive: 27 79792.818165 79792.817390 49: seq: 1e, identify_response offset=1080 data=b'\x85\xe9y@\x80\x8e\x12\x8c\xfd\x86I\xd2\x85{\xfb{@\xf2\x052\x1104GY\x01\x90\x16\x8cT\x8a\x17u\x05\xc4*c\xbcY\xc3' Receive: 28 79792.819439 79792.818598 49: seq: 1f, identify_response offset=1120 data=b'\xee\xcce \xcd\x8f\xdf\xc90\xc0\x15\xbc\xca\n\xf6\x94\x0eo\x06\x9d\x1d\x8c5\xf4\x18\xce2wk\xd7\x0f\xf4nGI\x98\x1d\xfeTN' Receive: 29 79792.820732 79792.819900 49: seq: 10, identify_response offset=1160 data=b'\x06W&\xac\xdc\x0c(\x8b\x01\xa5\xad6\xdds\xdc\x08\x1b\xb7\xc8\xdaJ\x07\xbb\xa2j\xb3CY\xc0\x1e\xd1`\xc5D\xbf\xfd\x0e\x9f\xde+' Receive: 30 79792.821931 79792.821218 49: seq: 11, identify_response offset=1200 data=b'\x13\x8c\xef\xf9\xe9p=\x86:\xec\xa6C:\x8dS\x89\x88b\x01\\\\F\x89\x991\xd1l\xa5\xa9|\xa6\xd9ZS\xf9"i\xba\x92\xcc\xdb\xc8E\xa3t\x90M\x15' Receive: 42 79792.837165 79792.836471 49: seq: 1d, identify_response offset=1680 data=b"\xd7\xf7}\xf9\x9c\xb8\r\xe7\xc12\x95/\xe9r\x11\xce]\xef\x81\xdf\xa0\xfc/\x81\xb3v\xbbr\x8d\x14\x99\xdd\xb9'\t(\xdd\xf4\xe5\x88" Receive: 43 79792.838422 79792.837707 49: seq: 1e, identify_response offset=1720 data=b'\xb4\x90\xbdy s^\xd6*v\xd6\xa4@K9\x82\xaa\xac\xe8\x00$\x1a\x19\xf9\x95\x06\xf5D\x94\xa5\x8ac\x8e\xb4\xf8\rgH\xdc\x15' Receive: 44 79792.839722 79792.838927 49: seq: 1f, identify_response offset=1760 data=b'8\xcb\xc9q\xbd::\xd7N9\n^\xc4\xa5SV\x9d\x03\x0f\xe6P\x14p\x10\xb88Z9\xd2\x119\xcf\xbb\x0ccv(\xadS\xc3' Receive: 45 79792.840980 79792.840517 49: seq: 10, identify_response offset=1800 data=b'%\xe2$\x0e\xb3\xc0\xfdsG\xa1\x1a\xd5\xe0\x16TQb\xc5\x9d\x93\xb5N\xac\xce\xe2\xda\x97k\x00\x05\xdc\x12(9#\xaeTxUF' Receive: 46 79792.842322 79792.841710 49: seq: 11, identify_response offset=1840 data=b"u\x99\xf3\xe08Q:\xba<4\xf8`\xd6\x05\xf7\xb3\x9c:nZl\x89\xa6\xa9\x1a\xc9\x0c\xbd\xd1\x08$\x17m'\xbbZ?rr\xe3" Receive: 47 79792.843594 79792.842876 49: seq: 12, identify_response offset=1880 data=b'\xc0 \x9cd\x17\x97\xa5\xc896\xe9\r\xdd\xf1\x19\x1aP\x9c|p|\xd2P\xaa\x87&\xc50\xac\x01\x8cn\x11\x17\x02\x99\x0bW\xa0z' Receive: 48 79792.844859 79792.844126 49: seq: 13, identify_response offset=1920 data=b'\xb3\xa8\x9e\x84\xbe\x88CM\nr\xb3\xc3\xb6ii\x98&\x06\x17\xa0{\xfb*s7\xe7Sj\xa6\x81\xc0;\x87u\x90jB\xbdJ\xbd' Receive: 49 79792.846126 79792.845402 49: seq: 14, identify_response offset=1960 data=b'\x07\xa9i\xd4\x8f\xb0\x17\xb5\x87\xf7\xc6\xeb*\x0bMvY\xad\xa8\xf9\xd6EGY\xa6\x05C\x01\xe8*~!\xd5Zi\x1er\xeb\xe0J' Receive: 50 79792.847439 79792.846629 49: seq: 15, identify_response offset=2000 data=b'\xb4m\xbc\x15\x0e\xaaN\xe4\x04Z<\xd0\xbb\xab\xacm\x05\x8eD\x9a\x9e\xf69U\xbd@\xa6\x14\xcaQ\xd1I\xea\xaax\x12\xc4|\xca\x9e' Receive: 51 79792.848737 79792.848024 49: seq: 16, identify_response offset=2040 data=b'\xbe\x8d\xb0\x8b\x9bT\xea\xa7\x82\xa6\x0e\xde\x15q\\f\x95\x0eF\xcd&\xaf\x9e9-\xfd\x19J\x1d;\xfc\x1c\xb2\x08\xe9N\xa8\teo' Receive: 52 79792.849998 79792.849298 49: seq: 17, identify_response offset=2080 data=b'\x90~\xc8\r\xaal\xec\x8d\xac\xac9y\xe3\xa2Nn\x95t\xd3a\xd9\x93\xfe\xd6\xe8z\xddT[\xe8D\x81\xab\xc7\xf4\xb6\r\xb2\x1f\xdc' Receive: 53 79792.851289 79792.850502 49: seq: 18, identify_response offset=2120 data=b'\x12\xbc\x16dkT\x19\xdd\x08\xf5(\xc0\x90\xb278\x86X\rm"\xbd\xa5\xaa\xef\xd6\x00\xecq\xc7y\xce\xf2\x1cIA\x02z\xa36' Receive: 54 79792.852598 79792.851862 49: seq: 19, identify_response offset=2160 data=b'\x14\xa79\x03\xa6\xe1\xd0w0\xa8H\xba\x85\xcd\xb1\x0c\xe5\x05\x08"+\xfaB\xafi{ \x97\xaf[M\xb2\xe8\x051i\xa5\xd2m\xd8' Receive: 55 79792.853878 79792.853143 49: seq: 1a, identify_response offset=2200 data=b"}\xd9[e\xb6]U9\x9bX\xbe\x8e_F5\xfe\x9d\xadR\xc42\x00\xca\xe6\x1a'Hw\x92\x1f\x84\x89|\xa8\x15\xd2\x19\xde\x97m" Receive: 56 79792.855182 79792.854384 49: seq: 1b, identify_response offset=2240 data=b'_SN\x84\x13\xa9\xd1\xc8\xfa\x8d\xfb\xc8~6\n\xbf\xbe|\x04\r\xf8\xa7\x94\xdb\xa4\xd6z;l\x10\x82Tv\xe4sm\xd5H\xfbD' Receive: 57 79792.856498 79792.855792 49: seq: 1c, identify_response offset=2280 data=b'b\x85\x12\xbeeQZ\xcd1\xf6DU\x99\xc3y=\x81@\xfc\x90k\x9fd^\xba\x96\xf1\xcaQ\xf9\x1eg\xf0\x93f\xc1\xa9\xf3\x15^' Receive: 58 79792.857789 79792.857055 49: seq: 1d, identify_response offset=2320 data=b'\x11\x11\xf1\x81R\xb4\r5\x8b\xda?q3H\xb6\xe0\x8d\x83T\x8d\xf9\x94;@-\x95\xfc\xf0UJ;\x12lK\xdd1)\xa9t\x1c' Receive: 59 79792.859044 79792.858309 49: seq: 1e, identify_response offset=2360 data=b'\x92Ky\xdc\x90g\xa7n\xe2\x81d\x8fD\xc3\x8aL\x9d>\xe5G\xd9L(\xc5E\xe0\xd8\xeb\x86Q\xe4@\xee\xe0\xbb\xab0\x94AI' Receive: 60 79792.860291 79792.859682 49: seq: 1f, identify_response offset=2400 data=b'M\x162h\xf1d\x11J9c\xb2X,1\xf6\xdf\xdedIV\xc3\r\x08\xfe\xa5A\xf5\x05\xec|\xbd%\x7fX&b\xd2}X\x83' Receive: 61 79792.861607 79792.860871 49: seq: 10, identify_response offset=2440 data=b'\xeb\x07\xdb\x08C\xf1\xa8J^\x9d\x10s\xe1eS{\xe8\xa5\x99I\xacM\xb6\xa9\xe8;\xcf\xac\x9f\x13\xa8\xc2Z{\xa4\x00\xaa\x1d1\xea' Receive: 62 79792.862895 79792.862096 49: seq: 11, identify_response offset=2480 data=b'>1\xc5C\xb5\xea\xca\xfaid\x84\x11[\xbd\x06G\xee\xf0k\x8e\xc95rI:d\xfe+\xf33\x04\xa2\xa2j\\\xc9\x07\xca\xfe\x16' Receive: 63 79792.862954 79792.862096 15: seq: 11, analog_in_state oid=19 next_clock=3361163520 value=30934 Receive: 64 79792.864246 79792.863528 49: seq: 12, identify_response offset=2520 data=b'\xadi\xad\x92\x05\x17\x1c\x98}\xef\x95l[\xcb\x16\xc6\xf7n\xad0\xd4 \x1aN?\xa6\xb0\xaf\x9b\x8a-,\xcd\xf4\x08W\xc1\xd0\x93\x1b' Receive: 65 79792.865534 79792.864732 49: seq: 13, identify_response offset=2560 data=b'Q\xdeU\x05\x1c\xee\xfe\x19v\xcb\x0f\xe8\x8b\xa1\xcd\x15i\xf1\x0f\x95\x08\xcf\x95\x90\xdd\xa1\x93e\x81\x9a\x96\x16\xab\xc3\t\x81R^80' Receive: 66 79792.866789 79792.866006 49: seq: 14, identify_response offset=2600 data=b'\xc4\x99f6\xcc\x93%\xac\\7Y\xfe\x80\x8e\x1d\x93\xc5\x1dl\xca\xfc_J\xd6\xef+\xd9\xb1o\xf7\xe4\x14\xbf\xf5\xe5\xfa$\x91?\x83' Receive: 67 79792.868058 79792.867235 49: seq: 15, identify_response offset=2640 data=b'$$\x14\xbc\x00\\\xb0\x9b\xbf+J\xfc\x06\x17\xab\xfbd\x87\x19\xb0\xb2s\xd1?\xc4\x02\xcf\xc6\xb0JZ\x1b\x01\x92:\xd8\x87\xd8\x13\xaf' Receive: 68 79792.869309 79792.868512 49: seq: 16, identify_response offset=2680 data=b'\xddk\xb2\xe5\x1c\x8c\xeb\xfe\xdfQ\x8b\x95\xac\xcb\xe1\xd0d.\xb9\\p"\xdb\x0e\xba\xdc\xf6\x85\xfaj\x7f\xe5\xa6\x9cU\xc9O\xca|\xee' Receive: 69 79792.870584 79792.869798 49: seq: 17, identify_response offset=2720 data=b'lf\xa0\x1aN\xfc\xdaX\x0c\x07\x8d\xbd\xe7 $e\xb3\x9e\x0f\xb5\xff\xfe\xfd\xa9\xeagK\x1f\xd5\xf3\x83\xf1$\xb1i.\x1c\xec\x85\xdb' Receive: 70 79792.871911 79792.871025 49: seq: 18, identify_response offset=2760 data=b'\x8eA\xd6\xe82\xe1\xe5\x1f\x86z{s\x0e\xaf\xaa~&FA\xf64?q\xdd\x93\xf9\xb1\xbbX\x1foW\xbe?_\xc5\xa8K\xdf\xfe' Receive: 71 79792.873140 79792.872505 14: seq: 19, identify_response offset=2800 data=b'\x0b\x15\xb6\x03\xd4' Receive: 72 79792.874365 79792.873646 9: seq: 1a, identify_response offset=2805 data=b'' Receive: 73 79792.886303 79792.885564 12: seq: 1b, uptime high=5 clock=3253210660 Receive: 74 79792.938263 79792.937434 11: seq: 1c, clock clock=3273958025 Receive: 75 79792.973451 79792.937434 15: seq: 1c, analog_in_state oid=30 next_clock=3405163520 value=30858 Receive: 76 79792.990588 79792.989367 11: seq: 1d, clock clock=3294762347 Receive: 77 79793.042617 79793.041524 11: seq: 1e, clock clock=3315608709 Receive: 78 79793.094577 79793.093586 11: seq: 1f, clock clock=3336458745 Receive: 79 79793.146639 79793.146254 11: seq: 10, clock clock=3357510345 Receive: 80 79793.163722 79793.146254 15: seq: 10, analog_in_state oid=19 next_clock=3481163520 value=30932 Receive: 81 79793.198826 79793.197645 11: seq: 11, clock clock=3378061793 Receive: 82 79793.250895 79793.249927 11: seq: 12, clock clock=3398962883 Receive: 83 79793.273435 79793.249927 15: seq: 12, analog_in_state oid=30 next_clock=3525163520 value=30857 Receive: 84 79793.303119 79793.302643 11: seq: 13, clock clock=3420068793 Receive: 85 79793.307636 79793.306664 11: seq: 14, clock clock=3421664633 Receive: 86 79793.463276 79793.306664 15: seq: 14, analog_in_state oid=19 next_clock=3601163520 value=30931 Receive: 87 79793.573458 79793.306664 15: seq: 14, analog_in_state oid=30 next_clock=3645163520 value=30857 Receive: 88 79793.763036 79793.306664 15: seq: 14, analog_in_state oid=19 next_clock=3721163520 value=30935 Receive: 89 79793.834128 79793.833022 15: seq: 15, config is_config=1 crc=4029890451 is_shutdown=0 move_count=1024 Receive: 90 79793.867064 79793.866099 12: seq: 1c, shutdown clock=3645476584 static_string_id=Command request b'Got EOF when reading from device' Unable to issue reset command on MCU 'mcu' Attempting MCU 'rpi' config_reset command b'Got EOF when reading from device' webhooks client 281473370774000: Disconnected Restarting printer Start printer at Wed Jun 21 19:42:56 2023 (1687369376.0 80400.5) ===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' webhooks client 281473368980928: New connection webhooks client 281473368980928: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' Attempting MCU 'mcu' reset Unhandled exception during post run Traceback (most recent call last): File "/home/klipper/klippy-env/lib/python3.10/site-packages/serial/serialposix.py", line 265, in open self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK) FileNotFoundError: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/klipper/klipper/klippy/klippy.py", line 234, in run self.send_event("klippy:firmware_restart") File "/home/klipper/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/mcu.py", line 949, in _firmware_restart self._restart_arduino() File "/home/klipper/klipper/klippy/mcu.py", line 909, in _restart_arduino serialhdl.arduino_reset(self._serialport, self._reactor) File "/home/klipper/klipper/klippy/serialhdl.py", line 379, in arduino_reset ser = serial.Serial(serialport, 2400, timeout=0, exclusive=True) File "/home/klipper/klippy-env/lib/python3.10/site-packages/serial/serialutil.py", line 240, in __init__ self.open() File "/home/klipper/klippy-env/lib/python3.10/site-packages/serial/serialposix.py", line 268, in open raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg)) serial.serialutil.SerialException: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' Restarting printer Start printer at Wed Jun 21 19:43:13 2023 (1687369393.3 80417.7) ===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' webhooks client 281473368270032: New connection webhooks client 281473368270032: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' Starting Klippy... Args: ['/home/klipper/klipper/klippy/klippy.py', '/home/klipper/printer_data/config/printer.cfg', '-I', '/home/klipper/printer_data/comms/klippy.serial', '-l', '/home/klipper/printer_data/logs/klippy.log', '-a', '/home/klipper/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-233-g1374c701-dirty' Untracked files: klippy/extras/led_effect.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv8 Processor rev 4 (v8l) Python: '3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0]' Start printer at Wed Jun 21 19:44:49 2023 (1687369489.8 20.1) ===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' webhooks client 281473417693408: New connection webhooks client 281473417693408: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' MCU error during connect Traceback (most recent call last): File "/home/klipper/klipper/klippy/mcu.py", line 798, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/klipper/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/klipper/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/klipper/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/klipper/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/mcu.py", line 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/klipper/klipper/klippy/../.config(3418): Wed Jun 21 19:14:28 2023 ========= Last MCU build config ========= CONFIG_LOW_LEVEL_OPTIONS=y # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set CONFIG_MACH_STM32=y # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set # CONFIG_MACH_LINUX is not set # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="stm32" CONFIG_MCU="stm32h743xx" CONFIG_CLOCK_FREQ=400000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x8000000 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x20000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x8020000 CONFIG_STM32_SELECT=y # CONFIG_MACH_STM32F103 is not set # CONFIG_MACH_STM32F207 is not set # CONFIG_MACH_STM32F401 is not set # CONFIG_MACH_STM32F405 is not set # CONFIG_MACH_STM32F407 is not set # CONFIG_MACH_STM32F429 is not set # CONFIG_MACH_STM32F446 is not set # CONFIG_MACH_STM32F765 is not set # CONFIG_MACH_STM32F031 is not set # CONFIG_MACH_STM32F042 is not set # CONFIG_MACH_STM32F070 is not set # CONFIG_MACH_STM32F072 is not set # CONFIG_MACH_STM32G070 is not set # CONFIG_MACH_STM32G071 is not set # CONFIG_MACH_STM32G0B0 is not set # CONFIG_MACH_STM32G0B1 is not set # CONFIG_MACH_STM32G431 is not set # CONFIG_MACH_STM32H723 is not set CONFIG_MACH_STM32H743=y # CONFIG_MACH_STM32H750 is not set # CONFIG_MACH_STM32L412 is not set # CONFIG_MACH_N32G452 is not set # CONFIG_MACH_N32G455 is not set CONFIG_MACH_STM32H7=y CONFIG_HAVE_STM32_USBOTG=y CONFIG_HAVE_STM32_FDCANBUS=y CONFIG_HAVE_STM32_USBCANBUS=y CONFIG_STM32_DFU_ROM_ADDRESS=0x1ff09800 CONFIG_STM32_FLASH_START_20000=y # CONFIG_STM32_FLASH_START_0000 is not set # CONFIG_STM32_CLOCK_REF_8M is not set # CONFIG_STM32_CLOCK_REF_12M is not set # CONFIG_STM32_CLOCK_REF_16M is not set # CONFIG_STM32_CLOCK_REF_20M is not set # CONFIG_STM32_CLOCK_REF_24M is not set CONFIG_STM32_CLOCK_REF_25M=y # CONFIG_STM32_CLOCK_REF_INTERNAL is not set CONFIG_CLOCK_REF_FREQ=25000000 CONFIG_STM32F0_TRIM=16 CONFIG_STM32_USB_PA11_PA12=y # CONFIG_STM32_USB_PB14_PB15 is not set # CONFIG_STM32_SERIAL_USART1 is not set # CONFIG_STM32_SERIAL_USART1_ALT_PB7_PB6 is not set # CONFIG_STM32_SERIAL_USART2 is not set # CONFIG_STM32_SERIAL_USART2_ALT_PD6_PD5 is not set # CONFIG_STM32_SERIAL_USART3 is not set # CONFIG_STM32_SERIAL_USART3_ALT_PD9_PD8 is not set # CONFIG_STM32_SERIAL_UART4 is not set # CONFIG_STM32_CANBUS_PA11_PA12 is not set # CONFIG_STM32_CANBUS_PA11_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB8_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB12_PB13 is not set # CONFIG_STM32_MMENU_CANBUS_PD0_PD1 is not set # CONFIG_STM32_MMENU_CANBUS_PB0_PB1 is not set # CONFIG_STM32_MMENU_CANBUS_PD12_PD13 is not set # CONFIG_STM32_MMENU_CANBUS_PC2_PC3 is not set # CONFIG_STM32_USBCANBUS_PA11_PA12 is not set CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" # # USB ids # # end of USB ids CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_INITIAL_PINS="" CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_HAVE_BOOTLOADER_REQUEST=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/klipper/klipper/klippy/../out/klipper.dict(7935): Wed Jun 21 19:35:17 2023 Last MCU build version: v0.11.0-233-g1374c701 Last MCU build tools: gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi2b=PI2,PI3,PI1 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h743xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/klipper/klipper/klippy/../out/klipper.elf(1757700): Wed Jun 21 19:35:30 2023 webhooks client 281473417693408: Disconnected Restarting printer Start printer at Wed Jun 21 20:21:25 2023 (1687371685.7 2172.4) ===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' webhooks client 281473409434816: New connection webhooks client 281473409434816: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' MCU error during connect Traceback (most recent call last): File "/home/klipper/klipper/klippy/mcu.py", line 798, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/klipper/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/klipper/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/klipper/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/klipper/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/mcu.py", line 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/klipper/klipper/klippy/../.config(3418): Wed Jun 21 19:14:28 2023 ========= Last MCU build config ========= CONFIG_LOW_LEVEL_OPTIONS=y # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set CONFIG_MACH_STM32=y # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set # CONFIG_MACH_LINUX is not set # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="stm32" CONFIG_MCU="stm32h743xx" CONFIG_CLOCK_FREQ=400000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x8000000 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x20000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x8020000 CONFIG_STM32_SELECT=y # CONFIG_MACH_STM32F103 is not set # CONFIG_MACH_STM32F207 is not set # CONFIG_MACH_STM32F401 is not set # CONFIG_MACH_STM32F405 is not set # CONFIG_MACH_STM32F407 is not set # CONFIG_MACH_STM32F429 is not set # CONFIG_MACH_STM32F446 is not set # CONFIG_MACH_STM32F765 is not set # CONFIG_MACH_STM32F031 is not set # CONFIG_MACH_STM32F042 is not set # CONFIG_MACH_STM32F070 is not set # CONFIG_MACH_STM32F072 is not set # CONFIG_MACH_STM32G070 is not set # CONFIG_MACH_STM32G071 is not set # CONFIG_MACH_STM32G0B0 is not set # CONFIG_MACH_STM32G0B1 is not set # CONFIG_MACH_STM32G431 is not set # CONFIG_MACH_STM32H723 is not set CONFIG_MACH_STM32H743=y # CONFIG_MACH_STM32H750 is not set # CONFIG_MACH_STM32L412 is not set # CONFIG_MACH_N32G452 is not set # CONFIG_MACH_N32G455 is not set CONFIG_MACH_STM32H7=y CONFIG_HAVE_STM32_USBOTG=y CONFIG_HAVE_STM32_FDCANBUS=y CONFIG_HAVE_STM32_USBCANBUS=y CONFIG_STM32_DFU_ROM_ADDRESS=0x1ff09800 CONFIG_STM32_FLASH_START_20000=y # CONFIG_STM32_FLASH_START_0000 is not set # CONFIG_STM32_CLOCK_REF_8M is not set # CONFIG_STM32_CLOCK_REF_12M is not set # CONFIG_STM32_CLOCK_REF_16M is not set # CONFIG_STM32_CLOCK_REF_20M is not set # CONFIG_STM32_CLOCK_REF_24M is not set CONFIG_STM32_CLOCK_REF_25M=y # CONFIG_STM32_CLOCK_REF_INTERNAL is not set CONFIG_CLOCK_REF_FREQ=25000000 CONFIG_STM32F0_TRIM=16 CONFIG_STM32_USB_PA11_PA12=y # CONFIG_STM32_USB_PB14_PB15 is not set # CONFIG_STM32_SERIAL_USART1 is not set # CONFIG_STM32_SERIAL_USART1_ALT_PB7_PB6 is not set # CONFIG_STM32_SERIAL_USART2 is not set # CONFIG_STM32_SERIAL_USART2_ALT_PD6_PD5 is not set # CONFIG_STM32_SERIAL_USART3 is not set # CONFIG_STM32_SERIAL_USART3_ALT_PD9_PD8 is not set # CONFIG_STM32_SERIAL_UART4 is not set # CONFIG_STM32_CANBUS_PA11_PA12 is not set # CONFIG_STM32_CANBUS_PA11_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB8_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB12_PB13 is not set # CONFIG_STM32_MMENU_CANBUS_PD0_PD1 is not set # CONFIG_STM32_MMENU_CANBUS_PB0_PB1 is not set # CONFIG_STM32_MMENU_CANBUS_PD12_PD13 is not set # CONFIG_STM32_MMENU_CANBUS_PC2_PC3 is not set # CONFIG_STM32_USBCANBUS_PA11_PA12 is not set CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" # # USB ids # # end of USB ids CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_INITIAL_PINS="" CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_HAVE_BOOTLOADER_REQUEST=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/klipper/klipper/klippy/../out/klipper.dict(7935): Wed Jun 21 19:54:45 2023 Last MCU build version: v0.11.0-233-g1374c701 Last MCU build tools: gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi2b=PI2,PI3,PI1 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h743xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/klipper/klipper/klippy/../out/klipper.elf(1757700): Wed Jun 21 19:54:57 2023 Starting Klippy... Args: ['/home/klipper/klipper/klippy/klippy.py', '/home/klipper/printer_data/config/printer.cfg', '-I', '/home/klipper/printer_data/comms/klippy.serial', '-l', '/home/klipper/printer_data/logs/klippy.log', '-a', '/home/klipper/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-233-g1374c701-dirty' Untracked files: klippy/extras/led_effect.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv8 Processor rev 4 (v8l) Python: '3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0]' Start printer at Wed Jun 21 20:35:13 2023 (1687372513.4 19.5) ===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' webhooks client 281472813478960: New connection webhooks client 281472813478960: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' MCU error during connect Traceback (most recent call last): File "/home/klipper/klipper/klippy/mcu.py", line 798, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/klipper/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/klipper/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/klipper/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/klipper/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/mcu.py", line 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/klipper/klipper/klippy/../.config(2720): Wed Jun 21 20:28:51 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set CONFIG_MACH_STM32=y # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set # CONFIG_MACH_LINUX is not set # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="stm32" CONFIG_MCU="stm32h743xx" CONFIG_CLOCK_FREQ=400000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x8000000 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x20000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x8020000 CONFIG_STM32_SELECT=y # CONFIG_MACH_STM32F103 is not set # CONFIG_MACH_STM32F207 is not set # CONFIG_MACH_STM32F401 is not set # CONFIG_MACH_STM32F405 is not set # CONFIG_MACH_STM32F407 is not set # CONFIG_MACH_STM32F429 is not set # CONFIG_MACH_STM32F446 is not set # CONFIG_MACH_STM32F765 is not set # CONFIG_MACH_STM32F031 is not set # CONFIG_MACH_STM32F042 is not set # CONFIG_MACH_STM32F070 is not set # CONFIG_MACH_STM32F072 is not set # CONFIG_MACH_STM32G070 is not set # CONFIG_MACH_STM32G071 is not set # CONFIG_MACH_STM32G0B0 is not set # CONFIG_MACH_STM32G0B1 is not set # CONFIG_MACH_STM32G431 is not set # CONFIG_MACH_STM32H723 is not set CONFIG_MACH_STM32H743=y # CONFIG_MACH_STM32H750 is not set # CONFIG_MACH_STM32L412 is not set # CONFIG_MACH_N32G452 is not set # CONFIG_MACH_N32G455 is not set CONFIG_MACH_STM32H7=y CONFIG_HAVE_STM32_USBOTG=y CONFIG_HAVE_STM32_FDCANBUS=y CONFIG_HAVE_STM32_USBCANBUS=y CONFIG_STM32_DFU_ROM_ADDRESS=0x1ff09800 CONFIG_STM32_FLASH_START_20000=y # CONFIG_STM32_FLASH_START_0000 is not set CONFIG_CLOCK_REF_FREQ=8000000 CONFIG_STM32F0_TRIM=16 CONFIG_STM32_USB_PA11_PA12=y # CONFIG_STM32_USB_PB14_PB15 is not set # CONFIG_STM32_SERIAL_USART1 is not set # CONFIG_STM32_SERIAL_UART4 is not set # CONFIG_STM32_CANBUS_PA11_PA12 is not set # CONFIG_STM32_CANBUS_PA11_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB0_PB1 is not set # CONFIG_STM32_MMENU_CANBUS_PD12_PD13 is not set # CONFIG_STM32_MMENU_CANBUS_PC2_PC3 is not set # CONFIG_STM32_USBCANBUS_PA11_PA12 is not set CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_HAVE_BOOTLOADER_REQUEST=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/klipper/klipper/klippy/../out/klipper.dict(7935): Wed Jun 21 20:29:33 2023 Last MCU build version: v0.11.0-233-g1374c701 Last MCU build tools: gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi2b=PI2,PI3,PI1 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h743xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/klipper/klipper/klippy/../out/klipper.elf(1757700): Wed Jun 21 20:29:46 2023 Attempting MCU 'mcu' reset Unhandled exception during post run Traceback (most recent call last): File "/home/klipper/klippy-env/lib/python3.10/site-packages/serial/serialposix.py", line 265, in open self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK) FileNotFoundError: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/klipper/klipper/klippy/klippy.py", line 234, in run self.send_event("klippy:firmware_restart") File "/home/klipper/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/mcu.py", line 949, in _firmware_restart self._restart_arduino() File "/home/klipper/klipper/klippy/mcu.py", line 909, in _restart_arduino serialhdl.arduino_reset(self._serialport, self._reactor) File "/home/klipper/klipper/klippy/serialhdl.py", line 379, in arduino_reset ser = serial.Serial(serialport, 2400, timeout=0, exclusive=True) File "/home/klipper/klippy-env/lib/python3.10/site-packages/serial/serialutil.py", line 240, in __init__ self.open() File "/home/klipper/klippy-env/lib/python3.10/site-packages/serial/serialposix.py", line 268, in open raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg)) serial.serialutil.SerialException: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' Restarting printer Start printer at Wed Jun 21 20:38:02 2023 (1687372682.0 164.9) ===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' webhooks client 281472816134512: New connection webhooks client 281472816134512: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' MCU error during connect Traceback (most recent call last): File "/home/klipper/klipper/klippy/mcu.py", line 798, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/klipper/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/klipper/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/klipper/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/klipper/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/mcu.py", line 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/klipper/klipper/klippy/../.config(2720): Wed Jun 21 20:28:51 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set CONFIG_MACH_STM32=y # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set # CONFIG_MACH_LINUX is not set # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="stm32" CONFIG_MCU="stm32h743xx" CONFIG_CLOCK_FREQ=400000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x8000000 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x20000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x8020000 CONFIG_STM32_SELECT=y # CONFIG_MACH_STM32F103 is not set # CONFIG_MACH_STM32F207 is not set # CONFIG_MACH_STM32F401 is not set # CONFIG_MACH_STM32F405 is not set # CONFIG_MACH_STM32F407 is not set # CONFIG_MACH_STM32F429 is not set # CONFIG_MACH_STM32F446 is not set # CONFIG_MACH_STM32F765 is not set # CONFIG_MACH_STM32F031 is not set # CONFIG_MACH_STM32F042 is not set # CONFIG_MACH_STM32F070 is not set # CONFIG_MACH_STM32F072 is not set # CONFIG_MACH_STM32G070 is not set # CONFIG_MACH_STM32G071 is not set # CONFIG_MACH_STM32G0B0 is not set # CONFIG_MACH_STM32G0B1 is not set # CONFIG_MACH_STM32G431 is not set # CONFIG_MACH_STM32H723 is not set CONFIG_MACH_STM32H743=y # CONFIG_MACH_STM32H750 is not set # CONFIG_MACH_STM32L412 is not set # CONFIG_MACH_N32G452 is not set # CONFIG_MACH_N32G455 is not set CONFIG_MACH_STM32H7=y CONFIG_HAVE_STM32_USBOTG=y CONFIG_HAVE_STM32_FDCANBUS=y CONFIG_HAVE_STM32_USBCANBUS=y CONFIG_STM32_DFU_ROM_ADDRESS=0x1ff09800 CONFIG_STM32_FLASH_START_20000=y # CONFIG_STM32_FLASH_START_0000 is not set CONFIG_CLOCK_REF_FREQ=8000000 CONFIG_STM32F0_TRIM=16 CONFIG_STM32_USB_PA11_PA12=y # CONFIG_STM32_USB_PB14_PB15 is not set # CONFIG_STM32_SERIAL_USART1 is not set # CONFIG_STM32_SERIAL_UART4 is not set # CONFIG_STM32_CANBUS_PA11_PA12 is not set # CONFIG_STM32_CANBUS_PA11_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB0_PB1 is not set # CONFIG_STM32_MMENU_CANBUS_PD12_PD13 is not set # CONFIG_STM32_MMENU_CANBUS_PC2_PC3 is not set # CONFIG_STM32_USBCANBUS_PA11_PA12 is not set CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_HAVE_BOOTLOADER_REQUEST=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/klipper/klipper/klippy/../out/klipper.dict(7935): Wed Jun 21 20:29:33 2023 Last MCU build version: v0.11.0-233-g1374c701 Last MCU build tools: gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi2b=PI2,PI3,PI1 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h743xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/klipper/klipper/klippy/../out/klipper.elf(1757700): Wed Jun 21 20:29:46 2023 Starting Klippy... Args: ['/home/klipper/klipper/klippy/klippy.py', '/home/klipper/printer_data/config/printer.cfg', '-I', '/home/klipper/printer_data/comms/klippy.serial', '-l', '/home/klipper/printer_data/logs/klippy.log', '-a', '/home/klipper/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-233-g1374c701-dirty' Untracked files: klippy/extras/led_effect.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv8 Processor rev 4 (v8l) Python: '3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0]' Start printer at Wed Jun 21 20:43:49 2023 (1687373029.6 19.7) ===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' webhooks client 281473807978784: New connection webhooks client 281473807978784: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' Attempting MCU 'mcu' reset Unhandled exception during post run Traceback (most recent call last): File "/home/klipper/klippy-env/lib/python3.10/site-packages/serial/serialposix.py", line 265, in open self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK) FileNotFoundError: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/klipper/klipper/klippy/klippy.py", line 234, in run self.send_event("klippy:firmware_restart") File "/home/klipper/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/mcu.py", line 949, in _firmware_restart self._restart_arduino() File "/home/klipper/klipper/klippy/mcu.py", line 909, in _restart_arduino serialhdl.arduino_reset(self._serialport, self._reactor) File "/home/klipper/klipper/klippy/serialhdl.py", line 379, in arduino_reset ser = serial.Serial(serialport, 2400, timeout=0, exclusive=True) File "/home/klipper/klippy-env/lib/python3.10/site-packages/serial/serialutil.py", line 240, in __init__ self.open() File "/home/klipper/klippy-env/lib/python3.10/site-packages/serial/serialposix.py", line 268, in open raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg)) serial.serialutil.SerialException: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' Restarting printer Start printer at Wed Jun 21 20:44:57 2023 (1687373097.4 65.4) ===== Config file ===== [virtual_sdcard] path = /home/klipper/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set macro_found = True if printer['gcode_macro _CLIENT_VARIABLE'] is defined else False %} {% set client = printer['gcode_macro _CLIENT_VARIABLE'] %} {% set allow_park = False if not macro_found else False if client.park_at_cancel is not defined else True if client.park_at_cancel|lower == 'true' else False %} {% set retract = 5.0 if not macro_found else client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if not macro_found else "" if client.park_at_cancel_x is not defined else "X=" + client.park_at_cancel_x|string if client.park_at_cancel_x is not none %} {% set park_y = "" if not macro_found else "" if client.park_at_cancel_y is not defined else "Y=" + client.park_at_cancel_y|string if client.park_at_cancel_y is not none %} {% set custom_park = True if (park_x|length > 0 or park_y|length > 0) else False %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 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 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 sp_move = velocity if not macro_found else client.speed_move|default(velocity) %} M109 S{last_extruder_temp} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} [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 START_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} {% set Z_MAX = printer.toolhead.axis_maximum.z|default(100)|float %} {% set NOZZLE = printer.extruder.nozzle_diameter|default(0.4)|float %} {% set FILADIA = printer.extruder.filament_diameter|default(1.75)|float %} {% set X_START = 10.0|default(10.0)|float %} {% set Y_START = 20.0|default(20.0)|float %} {% set PRIMER_WIDTH = 0.75 * NOZZLE %} {% set PRIMER_HEIGHT = 0.70 * NOZZLE %} {% set PRIMER_SECT = PRIMER_WIDTH * PRIMER_HEIGHT %} {% set PRIMER_VOL = PRIMER_SECT * (X_MAX - 3 * X_START) %} {% set FILA_SECT = 3.1415 * ( FILADIA / 2.0)**2 %} {% set FILA_LENGTH = 1.55 * PRIMER_VOL / FILA_SECT %} {% set BED_TEMP = params.BED_TEMP|default(50)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %} M104 S{EXTRUDER_TEMP} T0 M140 S{BED_TEMP} G28 BED_MESH_PROFILE LOAD=standaard Z_TILT_ADJUST G1 Y{Y_MAX - 20} Z{Z_MAX/4.0} F6000 M190 S{BED_TEMP} M109 S{EXTRUDER_TEMP} T0 G92 E0 G1 X{X_START} Y{Y_START} Z{PRIMER_HEIGHT} F6000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G1 X{X_MAX - 2 * X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} G1 X{X_START} Y{Y_START + PRIMER_WIDTH} Z{PRIMER_HEIGHT} E{FILA_LENGTH} F2000.0 G92 E0 G1 Z2.0 F600 G1 Z0.2 F600 G1 Z2.0 F600 [gcode_macro END_PRINT] gcode = {% set X_MAX = printer.toolhead.axis_maximum.x|default(100)|float %} {% set Y_MAX = printer.toolhead.axis_maximum.y|default(100)|float %} G91 G1 E-2 F2700 G1 E-1.5 Z0.2 F2400 G1 X5 Y5 F6000 G1 Z10 G90 G1 Z{printer.toolhead.position.z + 10} F600 G1 X{X_MAX / 2} Y{Y_MAX} F6000 M106 S0 M104 S0 M140 S0 M84 X Y E [gcode_macro M600] gcode = {% set X = params.X|default(50)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro _Z_TILT_MAYBE] gcode = {% if printer["gcode_macro Z_TILT_ADJUST"].adjusted != 1 %} Z_TILT_ADJUST {% else %} {action_respond_info("Z tilt already adjusted, skipping.")} {% endif %} [gcode_macro Z_TILT_ADJUST] rename_existing = OG_Z_TILT_ADJUST variable_adjusted = 0 gcode = OG_Z_TILT_ADJUST G28 Z SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=1 [gcode_macro M18] rename_existing = M1800 gcode = M1800 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [gcode_macro M84] rename_existing = M8400 gcode = M8400 SET_GCODE_VARIABLE MACRO=Z_TILT_ADJUST VARIABLE=adjusted VALUE=0 [mcu rpi] serial = /tmp/klipper_host_mcu [mpu9250] i2c_mcu = rpi i2c_bus = i2c.0 [resonance_tester] accel_chip = mpu9250 probe_points = 150, 150, 10 [neopixel led_bar_x_axis] pin = PE6 chain_count = 32 color_order = GRB initial_red = 0.0 initial_green = 0.0 initial_blue = 0.0 initial_white = 0.0 [led_effect progress] leds = neopixel:led_bar_x_axis (1-17) autostart = true frame_rate = 24 layers = progress -1 0 add ( 0, 0, 1),( 0, 0.1, 0.6) static 0 0 top ( 0, 0, 0.1) [led_effect panel_idle] autostart = true frame_rate = 12 leds = neopixel:led_bar_x_axis (18-32) layers = static 0 0 top (1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(0.0, 0.0, 1.0) [gcode_macro NEOPIXEL_DISPLAY] gcode = {% set led = params.LED %} {% set type = params.TYPE %} {% set mode = params.MODE %} {% set my_neopixel = printer.configfile.config['neopixel ' ~ led] %} {% if mode == 'progress' %} {% for i in range(my_neopixel.chain_count|int) %} SET_LED_TEMPLATE LED={led} INDEX={i+1} TEMPLATE={'led_' ~ type ~ '_' ~ mode} param_led_num={i+1} param_led_total={my_neopixel.chain_count|int} {% endfor %} {% endif %} {% if mode == 'glow' %} SET_LED_TEMPLATE LED={led} TEMPLATE={'led_' ~ type ~ '_' ~ mode} {% endif %} [display_template led_extruder_temp_glow] text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_extruder_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.extruder.target > 0.0 %} {% set temp = printer.extruder.target %} {% else %} {% set temp = printer.configfile.config.extruder.max_temp %} {% endif %} {% set ratio = printer.extruder.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_bed_temp_glow] text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {ratio}, 0.0, {1-ratio}, 0.0 [display_template led_bed_temp_progress] param_led_num = 0 param_led_total = 1 text = {% if printer.heater_bed.target > 0.0 %} {% set temp = printer.heater_bed.target %} {% else %} {% set temp = printer.configfile.config.heater_bed.max_temp %} {% endif %} {% set ratio = printer.heater_bed.temperature / temp|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} {led_ratio}, 0.0, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_print_percent_glow] text = {% set ratio = printer.virtual_sdcard.progress %} 0.0, {ratio}, 0.0, 0.0 [display_template led_print_percent_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.virtual_sdcard.progress %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [display_template led_printer_speed_glow] text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} 0.0, {ratio}, 0.0, 0.0 [display_template led_printer_speed_progress] param_led_num = 0 param_led_total = 1 text = {% set ratio = printer.motion_report.live_velocity|float / printer.configfile.config.printer.max_velocity|float %} {% set led_ratio = param_led_num|float / param_led_total %} {% if ratio > led_ratio %} 0.0, {led_ratio}, 0.0, 0.0 {% else %} 0.0, 0.0, 0.0, 0.0 {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = True variable_fuzz_min = 0 variable_fuzz_max = 4 variable_margin_enable = False variable_margin_size = 5 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("led_enable : %d" % (led_enable)) } { action_respond_info("status_macro: \'%s\'" % (status_macro)) } { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } { action_respond_info("fuzz_min : %f" % (fuzz_min)) } { action_respond_info("fuzz_max : %f" % (fuzz_max)) } { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } {% endif %} {% 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 probe_count = printer.configfile.settings.bed_mesh.probe_count %} {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} {% if margin_enable == False %} {% set margin_size = 0 %} {% endif %} { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( all_points | count, bed_mesh_min, bed_mesh_max, )) } {% if fuzz_enable == True %} {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} {% else %} {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | 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) | round(method='ceil') | int) + 1 %} {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} {% 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 SETUP_KAMP_MESHING] gcode = SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' [gcode_macro LINE_PURGE] description = A purge macro that adapts to be near your actual printed objects variable_adaptive_enable = True variable_z_height = 0.4 variable_purge_amount = 40 variable_line_length = 50 variable_flow_rate = 12 variable_x_default = 10 variable_y_default = 10 variable_distance_to_object_y = 10 variable_display_parameters = True gcode = {% if display_parameters == True %} { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } { action_respond_info("z_height : %f" % (z_height)) } { action_respond_info("purge_amount : %f" % (purge_amount)) } { action_respond_info("line_length : %f" % (line_length)) } { action_respond_info("flow_rate : %f" % (flow_rate)) } { action_respond_info("x_default : %f" % (x_default)) } { action_respond_info("y_default : %f" % (y_default)) } { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } {% endif %} {% if adaptive_enable == True %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} {% set x_origin = ([x_origin, 0] | max) %} {% set y_origin = ([y_origin, 0] | max) %} {% else %} {% set x_origin = x_default | float %} {% set y_origin = y_default | float %} {% endif %} {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} {% set cross_section = nozzle_dia * z_height | float %} {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} G92 E0 G0 F{travel_speed} G90 G0 X{x_origin} Y{y_origin - distance_to_object_y} G0 Z{z_height} M83 G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} G1 E-.5 F2100 G92 E0 M82 G0 Z{z_height * 2} F{travel_speed} [gcode_macro SETUP_LINE_PURGE] gcode = SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} [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 %} [exclude_object] [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00 [printer] kinematics = cartesian max_velocity = 300 max_accel = 1500 max_z_velocity = 5 max_z_accel = 100 [stepper_x] step_pin = PD4 dir_pin = !PD3 enable_pin = !PD6 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC1 position_endstop = -15 position_min = -15 position_max = 300 homing_speed = 50 [tmc2209 stepper_x] uart_pin = PD5 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_y] step_pin = PA15 dir_pin = PA8 enable_pin = !PD1 microsteps = 16 rotation_distance = 40 endstop_pin = ^PC3 position_endstop = 0 position_max = 300 homing_speed = 50 [tmc2209 stepper_y] uart_pin = PD0 run_current = 0.800 diag_pin = stealthchop_threshold = 999999 [stepper_z] step_pin = PE2 dir_pin = PE3 enable_pin = !PE0 microsteps = 16 rotation_distance = 8 position_max = 400 position_min = -4 endstop_pin = probe:z_virtual_endstop [tmc2209 stepper_z] uart_pin = PE1 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [stepper_z1] step_pin = PD11 dir_pin = PD10 enable_pin = !PD13 microsteps = 16 rotation_distance = 8 [tmc2209 stepper_z1] uart_pin = PD12 run_current = 0.580 diag_pin = stealthchop_threshold = 999999 [extruder] step_pin = PD15 dir_pin = !PD14 enable_pin = !PC7 microsteps = 16 rotation_distance = 8.091289975550122 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PB3 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA2 min_temp = 5 max_temp = 300 pressure_advance = 0.0285 max_extrude_only_distance = 100.0 control = pid pid_kp = 24.511 pid_ki = 0.945 pid_kd = 159.016 [tmc2209 extruder] uart_pin = PC6 run_current = 1.197 diag_pin = stealthchop_threshold = 999999 [safe_z_home] home_xy_position = 164.0,157.0 speed = 80 z_hop = 10 z_hop_speed = 5 [heater_bed] heater_pin = PD7 sensor_type = ATC Semitec 104GT-2 sensor_pin = PA1 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.655 pid_ki = 0.668 pid_kd = 1712.523 [fan] pin = PB7 [heater_fan fan1] pin = PB6 [board_pins] aliases = EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=, EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10= [display] lcd_type = emulated_st7920 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP1_3 spi_software_sclk_pin = EXP1_5 spi_speed = 1000000 en_pin = EXP1_4 encoder_pins = ^EXP2_3, ^EXP2_5 click_pin = ^!EXP1_2 [output_pin beeper] pin = EXP1_1 [bltouch] sensor_pin = ^PC13 control_pin = PE5 set_output_mode = 5V pin_move_time = 0.4 stow_on_each_sample = False probe_with_touch_mode = False x_offset = -3.0 y_offset = -43.0 samples = 2 speed = 2 z_offset = 2.670 [bed_mesh] speed = 80 horizontal_move_z = 5 mesh_min = 27.0,12.0 mesh_max = 290.0,257.0 probe_count = 5,5 mesh_pps = 3,3 fade_start = 1 fade_end = 10 fade_target = 0 [bed_screws] screw1 = 30,35 screw1_name = front left screw screw2 = 270,35 screw2_name = front right screw screw3 = 270,275 screw3_name = rear right screw screw4 = 30,275 screw4_name = rear left screw [screws_tilt_adjust] screw1 = 33,78 screw1_name = front left screw screw2 = 274,78 screw2_name = front right screw screw3 = 274,298 screw3_name = rear right screw screw4 = 33,298 screw4_name = rear left screw speed = 80 horizontal_move_z = 10 screw_thread = CW-M3 [z_tilt] z_positions = -15,192 355,192 points = 44,192 290,192 speed = 50 horizontal_move_z = 5 retries = 10 retry_tolerance = 0.025 [input_shaper] shaper_type_y = mzv shaper_freq_y = 33.2 shaper_type_x = mzv shaper_freq_x = 54.2 [bed_mesh standaard] version = 1 points = 0.252500, 0.138750, 0.132500, 0.227500, 0.352500 0.186250, 0.088750, 0.071250, 0.147500, 0.197500 0.137500, 0.046250, 0.037500, 0.105000, 0.120000 0.160000, 0.112500, 0.097500, 0.140000, 0.117500 0.218750, 0.198750, 0.168750, 0.233750, 0.237500 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = lagrange tension = 0.2 min_x = 28.61 max_x = 289.25 min_y = 15.04 max_y = 255.27999999999997 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' webhooks client 281473808073920: New connection webhooks client 281473808073920: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32h723xx_2A002B001651313238353730-if00' MCU error during connect Traceback (most recent call last): File "/home/klipper/klipper/klippy/mcu.py", line 798, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/klipper/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/klipper/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/klipper/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/klipper/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/klipper/klipper/klippy/mcu.py", line 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/klipper/klipper/klippy/../.config(2720): Wed Jun 21 20:28:51 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set CONFIG_MACH_STM32=y # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set # CONFIG_MACH_LINUX is not set # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="stm32" CONFIG_MCU="stm32h743xx" CONFIG_CLOCK_FREQ=400000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x8000000 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x20000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x8020000 CONFIG_STM32_SELECT=y # CONFIG_MACH_STM32F103 is not set # CONFIG_MACH_STM32F207 is not set # CONFIG_MACH_STM32F401 is not set # CONFIG_MACH_STM32F405 is not set # CONFIG_MACH_STM32F407 is not set # CONFIG_MACH_STM32F429 is not set # CONFIG_MACH_STM32F446 is not set # CONFIG_MACH_STM32F765 is not set # CONFIG_MACH_STM32F031 is not set # CONFIG_MACH_STM32F042 is not set # CONFIG_MACH_STM32F070 is not set # CONFIG_MACH_STM32F072 is not set # CONFIG_MACH_STM32G070 is not set # CONFIG_MACH_STM32G071 is not set # CONFIG_MACH_STM32G0B0 is not set # CONFIG_MACH_STM32G0B1 is not set # CONFIG_MACH_STM32G431 is not set # CONFIG_MACH_STM32H723 is not set CONFIG_MACH_STM32H743=y # CONFIG_MACH_STM32H750 is not set # CONFIG_MACH_STM32L412 is not set # CONFIG_MACH_N32G452 is not set # CONFIG_MACH_N32G455 is not set CONFIG_MACH_STM32H7=y CONFIG_HAVE_STM32_USBOTG=y CONFIG_HAVE_STM32_FDCANBUS=y CONFIG_HAVE_STM32_USBCANBUS=y CONFIG_STM32_DFU_ROM_ADDRESS=0x1ff09800 CONFIG_STM32_FLASH_START_20000=y # CONFIG_STM32_FLASH_START_0000 is not set CONFIG_CLOCK_REF_FREQ=8000000 CONFIG_STM32F0_TRIM=16 CONFIG_STM32_USB_PA11_PA12=y # CONFIG_STM32_USB_PB14_PB15 is not set # CONFIG_STM32_SERIAL_USART1 is not set # CONFIG_STM32_SERIAL_UART4 is not set # CONFIG_STM32_CANBUS_PA11_PA12 is not set # CONFIG_STM32_CANBUS_PA11_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB0_PB1 is not set # CONFIG_STM32_MMENU_CANBUS_PD12_PD13 is not set # CONFIG_STM32_MMENU_CANBUS_PC2_PC3 is not set # CONFIG_STM32_USBCANBUS_PA11_PA12 is not set CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_HAVE_BOOTLOADER_REQUEST=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/klipper/klipper/klippy/../out/klipper.dict(7935): Wed Jun 21 20:29:33 2023 Last MCU build version: v0.11.0-233-g1374c701 Last MCU build tools: gcc: (15:10.3-2021.07-4) 10.3.1 20210621 (release) binutils: (2.38-3ubuntu1+15build1) 2.38 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 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_spi2b=PI2,PI3,PI1 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h743xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/klipper/klipper/klippy/../out/klipper.elf(1757700): Wed Jun 21 20:29:46 2023