===== Config file ===== [stepper_x] step_pin = PC2 dir_pin = PB9 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA5 position_endstop = 0 position_max = 262 homing_speed = 50 [stepper_y] step_pin = PB8 dir_pin = PB7 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA6 position_endstop = 0 position_max = 250 homing_speed = 50 [stepper_z] step_pin = PB6 dir_pin = !PB5 enable_pin = !PC3 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 250 position_min = -5 [extruder] max_extrude_only_distance = 100.0 max_extrude_cross_section = 5.0 step_pin = PB4 dir_pin = !PB3 enable_pin = !PC3 microsteps = 16 rotation_distance = 8.064 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PA1 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = PC5 min_temp = 0 max_temp = 250 control = pid pid_kp = 31.739 pid_ki = 4.232 pid_kd = 59.510 [heater_bed] heater_pin = PA2 sensor_type = EPCOS 100K B57560G104F sensor_pin = PC4 min_temp = 0 max_temp = 130 control = pid pid_kp = 69.887 pid_ki = 1.383 pid_kd = 883.199 [fan] pin = PA0 [mcu] serial = /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 restart_method = command [mcu rpi] serial = /tmp/klipper_host_mcu [output_pin ledlight] pin = rpi:gpiochip0/gpio23 pwm = false value = 1 shutdown_value = 1 [gcode_macro TOGGLE_LIGHT] gcode = SET_PIN PIN=ledlight VALUE={(not printer['output_pin ledlight'].value)|int} [output_pin relay2] pin = rpi:gpiochip0/gpio24 pwm = false value = 1 shutdown_value = 1 [gcode_macro relay2] gcode = SET_PIN PIN=relay2 VALUE={(not printer['output_pin relay2'].value)|int} [printer] kinematics = cartesian max_velocity = 300 max_accel = 3000 max_z_velocity = 5 max_z_accel = 100 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes [display_status] [pause_resume] [exclude_object] [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = False 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 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'] %} {% 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}} %} {% 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]" % 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': park.coord.x, 'y': park.coord.y, 'z': [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min} %} {% 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 X{pos.x} Y{pos.y} Z{pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [gcode_macro G29] gcode = BED_MESH_CALIBRATE [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} [gcode_macro CANCEL_PRINT] description = "Cancel the running print" rename_existing = CANCEL_PRINT_BASE gcode = M117 Canceling Print... M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 M117 CANCEL_PRINT_BASE [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT variable_extrude = 1.0 gcode = {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} [bltouch] sensor_pin = ^PB1 control_pin = PB0 x_offset = -35.5 y_offset = 0 stow_on_each_sample = False probe_with_touch_mode = True z_offset = 2.900 [safe_z_home] home_xy_position = 160.5,117.5 z_hop = 10 z_hop_speed = 5 [bed_mesh] speed = 120 horizontal_move_z = 5 mesh_min = 15, 15 mesh_max = 225, 225 probe_count = 7,7 algorithm = bicubic fade_start = 1 fade_end = 10 fade_target = 0 [screws_tilt_adjust] screw1 = 77.1,40 screw1_name = front left screw screw2 = 247,40 screw2_name = front right screw screw3 = 247,210 screw3_name = rear right screw screw4 = 77.1,210 screw4_name = rear left screw horizontal_move_z = 10 speed = 50 screw_thread = CW-M4 [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 LOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E80 F350 G92 E0.0 M82 [gcode_macro UNLOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E-80 F350 G92 E0.0 M82 [gcode_macro _pause_inner_m700] gcode = {% set extruder = "extruder" ~ params.T|replace('0', '') if "T" in params else printer.toolhead.extruder %} {% if extruder != printer.toolhead.extruder%} ACTIVATE_EXTRUDER EXTRUDER={extruder} {% endif %} {% set z_param = (' Z="%f"' % params.Z) if 'Z' in params else "" %} {% if printer.idle_timeout.state|string == "Printing" %} PAUSE P=2{z_param} {% elif not printer.pause_resume.is_paused%} SET_GCODE_VARIABLE MACRO=_load_unload VARIABLE=is_printing VALUE="{0}" PARK P=2{z_param} {% endif %} [gcode_macro M701] description = Pauses/parks the toolhead then loads filament to the extruder. Usage: M701 [L] [Z] [T] gcode = {% if 'U' in params %} {% if not 'L' in params %} RESPOND TYPE=error MSG="Argument \"U\" substituted for missing \"L\"." {% set dummy = params.__setitem__("L", params.U) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"U\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} LOAD_FILAMENT LENGTH={ params.L|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro M702] description = Pauses/parks the toolhead then unloads filament from the extruder. Usage: M702 [U] [Z] [T] gcode = {% if 'L' in params %} {% if not 'U' in params %} RESPOND TYPE=error MSG="Argument \"L\" substituted for missing \"U\"." {% set dummy = params.__setitem__("U", params.L) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"L\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} UNLOAD_FILAMENT LENGTH={ params.U|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro PRINT_START] variable_parameter_area_start = 0,0 variable_parameter_area_end = 0,0 gcode = {% set BED_TEMP = params.BED_TEMP|default(60)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(210)|float %} M104 S150 M117 Heating bed... M190 S{BED_TEMP} M117 Homing... G28 M117 Calibrating mesh... . . SETUP_KAMP_MESHING DISPLAY_PARAMETERS=1 LED_ENABLE=0 FUZZ_ENABLE=1 SETUP_LINE_PURGE DISPLAY_PARAMETERS=1 ADAPTIVE_ENABLE=1 . . BED_MESH_CLEAR BED_MESH_CALIBRATE M117 Heating Extruder... M109 S{EXTRUDER_TEMP} G92 E0 LINE_PURGE G90 SET_GCODE_OFFSET Z=0.0 M117 [gcode_macro END_PRINT] gcode = M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 [firmware_retraction] retract_length = 0.4 retract_speed = 40 unretract_speed = 40 [bed_mesh default] version = 1 points = 0.275000, 0.202500, 0.125000, 0.132500, 0.210000 0.145000, 0.102500, 0.047500, 0.060000, 0.100000 0.075000, 0.052500, -0.007500, 0.022500, 0.047500 0.145000, 0.095000, 0.050000, 0.060000, 0.075000 0.222500, 0.155000, 0.105000, 0.135000, 0.180000 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = lagrange tension = 0.2 min_x = 15.0 max_x = 225.0 min_y = 15.0 max_y = 225.0 ======================= Loaded MCU 'mcu' 105 commands (v0.11.0-62-gf1203d56 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.35.2-2+14+b2) 2.35.2) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1a=PB8,PB9 BUS_PINS_i2c2=PB10,PB11 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi3=PB4,PB5,PB3 CLOCK_FREQ=72000000 MCU=stm32f103xe PWM_MAX=255 RECEIVE_WINDOW=192 RESERVE_PINS_serial=PA10,PA9 SERIAL_BAUD=250000 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Configured MCU 'mcu' (1024 moves) Loaded MCU 'rpi' 111 commands (v0.11.0-105-g1e7057e9 / gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2) MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Configured MCU 'rpi' (1024 moves) Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-143-gc54d83c9' CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' webhooks client 547820911728: {'program': 'Moonraker', 'version': 'v0.8.0-29-g80920dd'} =============== Log rollover at Wed Jun 21 13:16:22 2023 =============== Stats 38.4: gcodein=0 mcu: mcu_awake=0.001 mcu_task_avg=0.000014 mcu_task_stddev=0.000010 bytes_write=1184 bytes_read=5426 bytes_retransmit=9 bytes_invalid=0 send_seq=135 receive_seq=135 retransmit_seq=2 srtt=0.003 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=72000227 rpi: mcu_awake=0.000 mcu_task_avg=0.000008 mcu_task_stddev=0.000012 bytes_write=882 bytes_read=4676 bytes_retransmit=0 bytes_invalid=0 send_seq=121 receive_seq=121 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=50000428 adj=50000538 heater_bed: target=0 temp=22.3 pwm=0.000 sysload=1.23 cputime=1.562 memavail=1426448 print_time=0.001 buffer_time=0.000 print_stall=0 extruder: target=0 temp=22.1 pwm=0.000 Stats 39.4: gcodein=0 mcu: mcu_awake=0.001 mcu_task_avg=0.000014 mcu_task_stddev=0.000010 bytes_write=1190 bytes_read=5562 bytes_retransmit=9 bytes_invalid=0 send_seq=136 receive_seq=136 retransmit_seq=2 srtt=0.003 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=72000182 rpi: mcu_awake=0.000 mcu_task_avg=0.000008 mcu_task_stddev=0.000012 bytes_write=888 bytes_read=4692 bytes_retransmit=0 bytes_invalid=0 send_seq=122 receive_seq=122 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=50000375 adj=50001049 heater_bed: target=0 temp=22.3 pwm=0.000 sysload=1.23 cputime=1.572 memavail=1421612 print_time=0.001 buffer_time=0.000 print_stall=0 extruder: target=0 temp=22.1 pwm=0.000 Stats 40.4: gcodein=0 mcu: mcu_awake=0.001 mcu_task_avg=0.000014 mcu_task_stddev=0.000010 bytes_write=1196 bytes_read=5681 bytes_retransmit=9 bytes_invalid=0 send_seq=137 receive_seq=137 retransmit_seq=2 srtt=0.003 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=72000160 rpi: mcu_awake=0.000 mcu_task_avg=0.000008 mcu_task_stddev=0.000012 bytes_write=894 bytes_read=4708 bytes_retransmit=0 bytes_invalid=0 send_seq=123 receive_seq=123 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=50000272 adj=50000764 heater_bed: target=0 temp=22.3 pwm=0.000 sysload=1.29 cputime=1.579 memavail=1419256 print_time=0.001 buffer_time=0.000 print_stall=0 extruder: target=0 temp=22.1 pwm=0.000 Stats 41.4: gcodein=0 mcu: mcu_awake=0.001 mcu_task_avg=0.000014 mcu_task_stddev=0.000010 bytes_write=1202 bytes_read=5787 bytes_retransmit=9 bytes_invalid=0 send_seq=138 receive_seq=138 retransmit_seq=2 srtt=0.003 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=72000147 rpi: mcu_awake=0.000 mcu_task_avg=0.000008 mcu_task_stddev=0.000012 bytes_write=900 bytes_read=4724 bytes_retransmit=0 bytes_invalid=0 send_seq=124 receive_seq=124 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=50000194 adj=50000261 heater_bed: target=0 temp=22.3 pwm=0.000 sysload=1.29 cputime=1.586 memavail=1419256 print_time=0.001 buffer_time=0.000 print_stall=0 extruder: target=0 temp=22.1 pwm=0.000 Stats 42.4: gcodein=0 mcu: mcu_awake=0.001 mcu_task_avg=0.000014 mcu_task_stddev=0.000010 bytes_write=1208 bytes_read=5923 bytes_retransmit=9 bytes_invalid=0 send_seq=139 receive_seq=139 retransmit_seq=2 srtt=0.003 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=72000135 rpi: mcu_awake=0.000 mcu_task_avg=0.000008 mcu_task_stddev=0.000012 bytes_write=906 bytes_read=4740 bytes_retransmit=0 bytes_invalid=0 send_seq=125 receive_seq=125 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=50000156 adj=49999924 heater_bed: target=0 temp=22.2 pwm=0.000 sysload=1.29 cputime=1.594 memavail=1417184 print_time=0.001 buffer_time=0.000 print_stall=0 extruder: target=0 temp=22.1 pwm=0.000 Stats 43.4: gcodein=0 mcu: mcu_awake=0.001 mcu_task_avg=0.000014 mcu_task_stddev=0.000010 bytes_write=1214 bytes_read=6029 bytes_retransmit=9 bytes_invalid=0 send_seq=140 receive_seq=140 retransmit_seq=2 srtt=0.003 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=72000135 rpi: mcu_awake=0.000 mcu_task_avg=0.000006 mcu_task_stddev=0.000011 bytes_write=912 bytes_read=4769 bytes_retransmit=0 bytes_invalid=0 send_seq=126 receive_seq=126 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=50000126 adj=49999828 heater_bed: target=0 temp=22.3 pwm=0.000 sysload=1.29 cputime=1.605 memavail=1409004 print_time=0.001 buffer_time=0.000 print_stall=0 extruder: target=0 temp=22.1 pwm=0.000 Stats 44.4: gcodein=0 mcu: mcu_awake=0.001 mcu_task_avg=0.000014 mcu_task_stddev=0.000010 bytes_write=1220 bytes_read=6135 bytes_retransmit=9 bytes_invalid=0 send_seq=141 receive_seq=141 retransmit_seq=2 srtt=0.003 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=72000136 rpi: mcu_awake=0.000 mcu_task_avg=0.000006 mcu_task_stddev=0.000011 bytes_write=918 bytes_read=4785 bytes_retransmit=0 bytes_invalid=0 send_seq=127 receive_seq=127 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=50000107 adj=49999735 heater_bed: target=0 temp=22.2 pwm=0.000 sysload=1.29 cputime=1.613 memavail=1412356 print_time=0.001 buffer_time=0.000 print_stall=0 extruder: target=0 temp=22.0 pwm=0.000 Stats 45.4: gcodein=0 mcu: mcu_awake=0.001 mcu_task_avg=0.000014 mcu_task_stddev=0.000010 bytes_write=1226 bytes_read=6284 bytes_retransmit=9 bytes_invalid=0 send_seq=142 receive_seq=142 retransmit_seq=2 srtt=0.003 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=72000133 rpi: mcu_awake=0.000 mcu_task_avg=0.000006 mcu_task_stddev=0.000011 bytes_write=924 bytes_read=4801 bytes_retransmit=0 bytes_invalid=0 send_seq=128 receive_seq=128 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=50000081 adj=49999710 heater_bed: target=0 temp=22.3 pwm=0.000 sysload=1.27 cputime=1.623 memavail=1390772 print_time=0.001 buffer_time=0.000 print_stall=0 extruder: target=0 temp=22.1 pwm=0.000 Stats 46.4: gcodein=0 mcu: mcu_awake=0.001 mcu_task_avg=0.000014 mcu_task_stddev=0.000010 bytes_write=1232 bytes_read=6390 bytes_retransmit=9 bytes_invalid=0 send_seq=143 receive_seq=143 retransmit_seq=2 srtt=0.003 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=72000134 rpi: mcu_awake=0.000 mcu_task_avg=0.000006 mcu_task_stddev=0.000011 bytes_write=930 bytes_read=4817 bytes_retransmit=0 bytes_invalid=0 send_seq=129 receive_seq=129 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=50000059 adj=49999661 heater_bed: target=0 temp=22.3 pwm=0.000 sysload=1.27 cputime=1.630 memavail=1390536 print_time=0.001 buffer_time=0.000 print_stall=0 extruder: target=0 temp=22.1 pwm=0.000 Stats 47.4: gcodein=0 mcu: mcu_awake=0.001 mcu_task_avg=0.000014 mcu_task_stddev=0.000010 bytes_write=1238 bytes_read=6496 bytes_retransmit=9 bytes_invalid=0 send_seq=144 receive_seq=144 retransmit_seq=2 srtt=0.003 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=72000155 rpi: mcu_awake=0.000 mcu_task_avg=0.000006 mcu_task_stddev=0.000011 bytes_write=936 bytes_read=4833 bytes_retransmit=0 bytes_invalid=0 send_seq=130 receive_seq=130 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=50000040 adj=49999619 heater_bed: target=0 temp=22.3 pwm=0.000 sysload=1.27 cputime=1.638 memavail=1388888 print_time=0.001 buffer_time=0.000 print_stall=0 extruder: target=0 temp=22.1 pwm=0.000 Stats 48.4: gcodein=0 mcu: mcu_awake=0.001 mcu_task_avg=0.000014 mcu_task_stddev=0.000010 bytes_write=1244 bytes_read=6630 bytes_retransmit=9 bytes_invalid=0 send_seq=145 receive_seq=145 retransmit_seq=2 srtt=0.003 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=72000147 rpi: mcu_awake=0.000 mcu_task_avg=0.000006 mcu_task_stddev=0.000009 bytes_write=942 bytes_read=4862 bytes_retransmit=0 bytes_invalid=0 send_seq=131 receive_seq=131 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=50000022 adj=49999509 heater_bed: target=0 temp=22.3 pwm=0.000 sysload=1.27 cputime=1.646 memavail=1388216 print_time=0.001 buffer_time=0.000 print_stall=0 extruder: target=0 temp=22.1 pwm=0.000 Stats 49.4: gcodein=0 mcu: mcu_awake=0.001 mcu_task_avg=0.000014 mcu_task_stddev=0.000010 bytes_write=1250 bytes_read=6729 bytes_retransmit=9 bytes_invalid=0 send_seq=146 receive_seq=146 retransmit_seq=2 srtt=0.003 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=72000142 rpi: mcu_awake=0.000 mcu_task_avg=0.000006 mcu_task_stddev=0.000009 bytes_write=948 bytes_read=4878 bytes_retransmit=0 bytes_invalid=0 send_seq=132 receive_seq=132 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 stalled_bytes=0 freq=50000010 adj=49999540 heater_bed: target=0 temp=22.3 pwm=0.000 sysload=1.27 cputime=1.653 memavail=1387768 print_time=0.001 buffer_time=0.000 print_stall=0 extruder: target=0 temp=22.1 pwm=0.000 Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-233-g1374c701' Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' Building C code module c_helper.so Start printer at Wed Jun 21 13:21:35 2023 (1687368095.3 351.5) ===== Config file ===== [stepper_x] step_pin = PC2 dir_pin = PB9 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA5 position_endstop = 0 position_max = 262 homing_speed = 50 [stepper_y] step_pin = PB8 dir_pin = PB7 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA6 position_endstop = 0 position_max = 250 homing_speed = 50 [stepper_z] step_pin = PB6 dir_pin = !PB5 enable_pin = !PC3 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 250 position_min = -5 [extruder] max_extrude_only_distance = 100.0 max_extrude_cross_section = 5.0 step_pin = PB4 dir_pin = !PB3 enable_pin = !PC3 microsteps = 16 rotation_distance = 8.064 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PA1 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = PC5 min_temp = 0 max_temp = 250 control = pid pid_kp = 31.739 pid_ki = 4.232 pid_kd = 59.510 [heater_bed] heater_pin = PA2 sensor_type = EPCOS 100K B57560G104F sensor_pin = PC4 min_temp = 0 max_temp = 130 control = pid pid_kp = 69.887 pid_ki = 1.383 pid_kd = 883.199 [fan] pin = PA0 [mcu] serial = /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 restart_method = command [mcu rpi] serial = /tmp/klipper_host_mcu [output_pin ledlight] pin = rpi:gpiochip0/gpio23 pwm = false value = 1 shutdown_value = 1 [gcode_macro TOGGLE_LIGHT] gcode = SET_PIN PIN=ledlight VALUE={(not printer['output_pin ledlight'].value)|int} [output_pin relay2] pin = rpi:gpiochip0/gpio24 pwm = false value = 1 shutdown_value = 1 [gcode_macro relay2] gcode = SET_PIN PIN=relay2 VALUE={(not printer['output_pin relay2'].value)|int} [printer] kinematics = cartesian max_velocity = 300 max_accel = 3000 max_z_velocity = 5 max_z_accel = 100 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes [display_status] [pause_resume] [exclude_object] [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = False 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 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'] %} {% 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}} %} {% 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]" % 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': park.coord.x, 'y': park.coord.y, 'z': [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min} %} {% 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 X{pos.x} Y{pos.y} Z{pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [gcode_macro G29] gcode = BED_MESH_CALIBRATE [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} [gcode_macro CANCEL_PRINT] description = "Cancel the running print" rename_existing = CANCEL_PRINT_BASE gcode = M117 Canceling Print... M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 M117 CANCEL_PRINT_BASE [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT variable_extrude = 1.0 gcode = {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} [bltouch] sensor_pin = ^PB1 control_pin = PB0 x_offset = -35.5 y_offset = 0 stow_on_each_sample = False probe_with_touch_mode = True z_offset = 2.900 [safe_z_home] home_xy_position = 160.5,117.5 z_hop = 10 z_hop_speed = 5 [bed_mesh] speed = 120 horizontal_move_z = 5 mesh_min = 15, 15 mesh_max = 225, 225 probe_count = 7,7 algorithm = bicubic fade_start = 1 fade_end = 10 fade_target = 0 [screws_tilt_adjust] screw1 = 77.1,40 screw1_name = front left screw screw2 = 247,40 screw2_name = front right screw screw3 = 247,210 screw3_name = rear right screw screw4 = 77.1,210 screw4_name = rear left screw horizontal_move_z = 10 speed = 50 screw_thread = CW-M4 [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 LOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E80 F350 G92 E0.0 M82 [gcode_macro UNLOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E-80 F350 G92 E0.0 M82 [gcode_macro _pause_inner_m700] gcode = {% set extruder = "extruder" ~ params.T|replace('0', '') if "T" in params else printer.toolhead.extruder %} {% if extruder != printer.toolhead.extruder%} ACTIVATE_EXTRUDER EXTRUDER={extruder} {% endif %} {% set z_param = (' Z="%f"' % params.Z) if 'Z' in params else "" %} {% if printer.idle_timeout.state|string == "Printing" %} PAUSE P=2{z_param} {% elif not printer.pause_resume.is_paused%} SET_GCODE_VARIABLE MACRO=_load_unload VARIABLE=is_printing VALUE="{0}" PARK P=2{z_param} {% endif %} [gcode_macro M701] description = Pauses/parks the toolhead then loads filament to the extruder. Usage: M701 [L] [Z] [T] gcode = {% if 'U' in params %} {% if not 'L' in params %} RESPOND TYPE=error MSG="Argument \"U\" substituted for missing \"L\"." {% set dummy = params.__setitem__("L", params.U) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"U\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} LOAD_FILAMENT LENGTH={ params.L|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro M702] description = Pauses/parks the toolhead then unloads filament from the extruder. Usage: M702 [U] [Z] [T] gcode = {% if 'L' in params %} {% if not 'U' in params %} RESPOND TYPE=error MSG="Argument \"L\" substituted for missing \"U\"." {% set dummy = params.__setitem__("U", params.L) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"L\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} UNLOAD_FILAMENT LENGTH={ params.U|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro PRINT_START] variable_parameter_area_start = 0,0 variable_parameter_area_end = 0,0 gcode = {% set BED_TEMP = params.BED_TEMP|default(60)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(210)|float %} M104 S150 M117 Heating bed... M190 S{BED_TEMP} M117 Homing... G28 M117 Calibrating mesh... . . SETUP_KAMP_MESHING DISPLAY_PARAMETERS=1 LED_ENABLE=0 FUZZ_ENABLE=1 SETUP_LINE_PURGE DISPLAY_PARAMETERS=1 ADAPTIVE_ENABLE=1 . . BED_MESH_CLEAR BED_MESH_CALIBRATE M117 Heating Extruder... M109 S{EXTRUDER_TEMP} G92 E0 LINE_PURGE G90 SET_GCODE_OFFSET Z=0.0 M117 [gcode_macro END_PRINT] gcode = M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 [firmware_retraction] retract_length = 0.4 retract_speed = 40 unretract_speed = 40 [bed_mesh default] version = 1 points = 0.275000, 0.202500, 0.125000, 0.132500, 0.210000 0.145000, 0.102500, 0.047500, 0.060000, 0.100000 0.075000, 0.052500, -0.007500, 0.022500, 0.047500 0.145000, 0.095000, 0.050000, 0.060000, 0.075000 0.222500, 0.155000, 0.105000, 0.135000, 0.180000 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = lagrange tension = 0.2 min_x = 15.0 max_x = 225.0 min_y = 15.0 max_y = 225.0 ======================= Extruder max_extrude_ratio=2.078758 mcu 'mcu': Starting serial connect webhooks client 547861894480: New connection webhooks client 547861894480: Client info {'program': 'Moonraker', 'version': 'v0.8.0-29-g80920dd'} mcu 'mcu': got {'oid': 15, 'next_clock': 391396224, 'value': 31471, '#name': 'analog_in_state', '#sent_time': 352.810749697, '#receive_time': 352.83876571499997} mcu 'mcu': got {'oid': 10, 'next_clock': 409396224, 'value': 31448, '#name': 'analog_in_state', '#sent_time': 353.079835289, '#receive_time': 353.088763919} mcu 'mcu': got {'oid': 15, 'next_clock': 412996224, 'value': 31468, '#name': 'analog_in_state', '#sent_time': 353.133607437, '#receive_time': 353.13878610399996} Loaded MCU 'mcu' 105 commands (v0.11.0-62-gf1203d56 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.35.2-2+14+b2) 2.35.2) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1a=PB8,PB9 BUS_PINS_i2c2=PB10,PB11 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi3=PB4,PB5,PB3 CLOCK_FREQ=72000000 MCU=stm32f103xe PWM_MAX=255 RECEIVE_WINDOW=192 RESERVE_PINS_serial=PA10,PA9 SERIAL_BAUD=250000 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'rpi': Starting connect mcu 'mcu': got {'oid': 10, 'next_clock': 430996224, 'value': 31446, '#name': 'analog_in_state', '#sent_time': 353.247499493, '#receive_time': 353.38886351099995} mcu 'mcu': got {'oid': 15, 'next_clock': 434596224, 'value': 31467, '#name': 'analog_in_state', '#sent_time': 353.247499493, '#receive_time': 353.438835715} mcu 'mcu': got {'oid': 10, 'next_clock': 452596224, 'value': 31445, '#name': 'analog_in_state', '#sent_time': 353.247499493, '#receive_time': 353.68887969599996} Loaded MCU 'rpi' 111 commands (v0.11.0-105-g1e7057e9 / gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2) 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) Configured MCU 'rpi' (1024 moves) Starting heater checks for heater_bed bed_mesh: generated points Index | Tool Adjusted | Probe 0 | (50.5, 15.0) | (15.0, 15.0) 1 | (85.5, 15.0) | (50.0, 15.0) 2 | (120.5, 15.0) | (85.0, 15.0) 3 | (155.5, 15.0) | (120.0, 15.0) 4 | (190.5, 15.0) | (155.0, 15.0) 5 | (225.5, 15.0) | (190.0, 15.0) 6 | (260.5, 15.0) | (225.0, 15.0) 7 | (260.5, 50.0) | (225.0, 50.0) 8 | (225.5, 50.0) | (190.0, 50.0) 9 | (190.5, 50.0) | (155.0, 50.0) 10 | (155.5, 50.0) | (120.0, 50.0) 11 | (120.5, 50.0) | (85.0, 50.0) 12 | (85.5, 50.0) | (50.0, 50.0) 13 | (50.5, 50.0) | (15.0, 50.0) 14 | (50.5, 85.0) | (15.0, 85.0) 15 | (85.5, 85.0) | (50.0, 85.0) 16 | (120.5, 85.0) | (85.0, 85.0) 17 | (155.5, 85.0) | (120.0, 85.0) 18 | (190.5, 85.0) | (155.0, 85.0) 19 | (225.5, 85.0) | (190.0, 85.0) 20 | (260.5, 85.0) | (225.0, 85.0) 21 | (260.5, 120.0) | (225.0, 120.0) 22 | (225.5, 120.0) | (190.0, 120.0) 23 | (190.5, 120.0) | (155.0, 120.0) 24 | (155.5, 120.0) | (120.0, 120.0) 25 | (120.5, 120.0) | (85.0, 120.0) 26 | (85.5, 120.0) | (50.0, 120.0) 27 | (50.5, 120.0) | (15.0, 120.0) 28 | (50.5, 155.0) | (15.0, 155.0) 29 | (85.5, 155.0) | (50.0, 155.0) 30 | (120.5, 155.0) | (85.0, 155.0) 31 | (155.5, 155.0) | (120.0, 155.0) 32 | (190.5, 155.0) | (155.0, 155.0) 33 | (225.5, 155.0) | (190.0, 155.0) 34 | (260.5, 155.0) | (225.0, 155.0) 35 | (260.5, 190.0) | (225.0, 190.0) 36 | (225.5, 190.0) | (190.0, 190.0) 37 | (190.5, 190.0) | (155.0, 190.0) 38 | (155.5, 190.0) | (120.0, 190.0) 39 | (120.5, 190.0) | (85.0, 190.0) 40 | (85.5, 190.0) | (50.0, 190.0) 41 | (50.5, 190.0) | (15.0, 190.0) 42 | (50.5, 225.0) | (15.0, 225.0) 43 | (85.5, 225.0) | (50.0, 225.0) 44 | (120.5, 225.0) | (85.0, 225.0) 45 | (155.5, 225.0) | (120.0, 225.0) 46 | (190.5, 225.0) | (155.0, 225.0) 47 | (225.5, 225.0) | (190.0, 225.0) 48 | (260.5, 225.0) | (225.0, 225.0) Starting heater checks for extruder webhooks: registering remote method 'shutdown_machine' for connection id: 547861894480 webhooks: registering remote method 'reboot_machine' for connection id: 547861894480 webhooks: registering remote method 'pause_job_queue' for connection id: 547861894480 webhooks: registering remote method 'start_job_queue' for connection id: 547861894480 Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-233-g1374c701' Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' Start printer at Wed Jun 21 13:21:45 2023 (1687368105.2 361.4) ===== Config file ===== [stepper_x] step_pin = PC2 dir_pin = PB9 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA5 position_endstop = 0 position_max = 262 homing_speed = 50 [stepper_y] step_pin = PB8 dir_pin = PB7 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA6 position_endstop = 0 position_max = 250 homing_speed = 50 [stepper_z] step_pin = PB6 dir_pin = !PB5 enable_pin = !PC3 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 250 position_min = -5 [extruder] max_extrude_only_distance = 100.0 max_extrude_cross_section = 5.0 step_pin = PB4 dir_pin = !PB3 enable_pin = !PC3 microsteps = 16 rotation_distance = 8.064 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PA1 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = PC5 min_temp = 0 max_temp = 250 control = pid pid_kp = 31.739 pid_ki = 4.232 pid_kd = 59.510 [heater_bed] heater_pin = PA2 sensor_type = EPCOS 100K B57560G104F sensor_pin = PC4 min_temp = 0 max_temp = 130 control = pid pid_kp = 69.887 pid_ki = 1.383 pid_kd = 883.199 [fan] pin = PA0 [mcu] serial = /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 restart_method = command [mcu rpi] serial = /tmp/klipper_host_mcu [output_pin ledlight] pin = rpi:gpiochip0/gpio23 pwm = false value = 1 shutdown_value = 1 [gcode_macro TOGGLE_LIGHT] gcode = SET_PIN PIN=ledlight VALUE={(not printer['output_pin ledlight'].value)|int} [output_pin relay2] pin = rpi:gpiochip0/gpio24 pwm = false value = 1 shutdown_value = 1 [gcode_macro relay2] gcode = SET_PIN PIN=relay2 VALUE={(not printer['output_pin relay2'].value)|int} [printer] kinematics = cartesian max_velocity = 300 max_accel = 3000 max_z_velocity = 5 max_z_accel = 100 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes [display_status] [pause_resume] [exclude_object] [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = False 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 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'] %} {% 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}} %} {% 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]" % 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': park.coord.x, 'y': park.coord.y, 'z': [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min} %} {% 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 X{pos.x} Y{pos.y} Z{pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [gcode_macro G29] gcode = BED_MESH_CALIBRATE [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} [gcode_macro CANCEL_PRINT] description = "Cancel the running print" rename_existing = CANCEL_PRINT_BASE gcode = M117 Canceling Print... M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 M117 CANCEL_PRINT_BASE [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT variable_extrude = 1.0 gcode = {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} [bltouch] sensor_pin = ^PB1 control_pin = PB0 x_offset = -35.5 y_offset = 0 stow_on_each_sample = False probe_with_touch_mode = True z_offset = 2.900 [safe_z_home] home_xy_position = 160.5,117.5 z_hop = 10 z_hop_speed = 5 [bed_mesh] speed = 120 horizontal_move_z = 5 mesh_min = 15, 15 mesh_max = 225, 225 probe_count = 7,7 algorithm = bicubic fade_start = 1 fade_end = 10 fade_target = 0 [screws_tilt_adjust] screw1 = 77.1,40 screw1_name = front left screw screw2 = 247,40 screw2_name = front right screw screw3 = 247,210 screw3_name = rear right screw screw4 = 77.1,210 screw4_name = rear left screw horizontal_move_z = 10 speed = 50 screw_thread = CW-M4 [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 LOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E80 F350 G92 E0.0 M82 [gcode_macro UNLOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E-80 F350 G92 E0.0 M82 [gcode_macro _pause_inner_m700] gcode = {% set extruder = "extruder" ~ params.T|replace('0', '') if "T" in params else printer.toolhead.extruder %} {% if extruder != printer.toolhead.extruder%} ACTIVATE_EXTRUDER EXTRUDER={extruder} {% endif %} {% set z_param = (' Z="%f"' % params.Z) if 'Z' in params else "" %} {% if printer.idle_timeout.state|string == "Printing" %} PAUSE P=2{z_param} {% elif not printer.pause_resume.is_paused%} SET_GCODE_VARIABLE MACRO=_load_unload VARIABLE=is_printing VALUE="{0}" PARK P=2{z_param} {% endif %} [gcode_macro M701] description = Pauses/parks the toolhead then loads filament to the extruder. Usage: M701 [L] [Z] [T] gcode = {% if 'U' in params %} {% if not 'L' in params %} RESPOND TYPE=error MSG="Argument \"U\" substituted for missing \"L\"." {% set dummy = params.__setitem__("L", params.U) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"U\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} LOAD_FILAMENT LENGTH={ params.L|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro M702] description = Pauses/parks the toolhead then unloads filament from the extruder. Usage: M702 [U] [Z] [T] gcode = {% if 'L' in params %} {% if not 'U' in params %} RESPOND TYPE=error MSG="Argument \"L\" substituted for missing \"U\"." {% set dummy = params.__setitem__("U", params.L) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"L\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} UNLOAD_FILAMENT LENGTH={ params.U|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro PRINT_START] variable_parameter_area_start = 0,0 variable_parameter_area_end = 0,0 gcode = {% set BED_TEMP = params.BED_TEMP|default(60)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(210)|float %} M104 S150 M117 Heating bed... M190 S{BED_TEMP} M117 Homing... G28 M117 Calibrating mesh... . . SETUP_KAMP_MESHING DISPLAY_PARAMETERS=1 LED_ENABLE=0 FUZZ_ENABLE=1 SETUP_LINE_PURGE DISPLAY_PARAMETERS=1 ADAPTIVE_ENABLE=1 . . BED_MESH_CLEAR BED_MESH_CALIBRATE M117 Heating Extruder... M109 S{EXTRUDER_TEMP} G92 E0 LINE_PURGE G90 SET_GCODE_OFFSET Z=0.0 M117 [gcode_macro END_PRINT] gcode = M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 [firmware_retraction] retract_length = 0.4 retract_speed = 40 unretract_speed = 40 [bed_mesh default] version = 1 points = 0.275000, 0.202500, 0.125000, 0.132500, 0.210000 0.145000, 0.102500, 0.047500, 0.060000, 0.100000 0.075000, 0.052500, -0.007500, 0.022500, 0.047500 0.145000, 0.095000, 0.050000, 0.060000, 0.075000 0.222500, 0.155000, 0.105000, 0.135000, 0.180000 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = lagrange tension = 0.2 min_x = 15.0 max_x = 225.0 min_y = 15.0 max_y = 225.0 ======================= Extruder max_extrude_ratio=2.078758 mcu 'mcu': Starting serial connect webhooks client 547664477488: New connection webhooks client 547664477488: Client info {'program': 'Moonraker', 'version': 'v0.8.0-29-g80920dd'} mcu 'mcu': got {'oid': 10, 'next_clock': 1100596224, 'value': 31452, '#name': 'analog_in_state', '#sent_time': 362.66736141300004, '#receive_time': 362.68881695} mcu 'mcu': got {'oid': 15, 'next_clock': 1104196224, 'value': 31471, '#name': 'analog_in_state', '#sent_time': 362.721415283, '#receive_time': 362.73888632} mcu 'mcu': got {'oid': 10, 'next_clock': 1122196224, 'value': 31448, '#name': 'analog_in_state', '#sent_time': 362.937389728, '#receive_time': 362.988896839} mcu 'mcu': got {'oid': 15, 'next_clock': 1125796224, 'value': 31470, '#name': 'analog_in_state', '#sent_time': 362.990963191, '#receive_time': 363.03885337599996} Loaded MCU 'mcu' 105 commands (v0.11.0-62-gf1203d56 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.35.2-2+14+b2) 2.35.2) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1a=PB8,PB9 BUS_PINS_i2c2=PB10,PB11 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi3=PB4,PB5,PB3 CLOCK_FREQ=72000000 MCU=stm32f103xe PWM_MAX=255 RECEIVE_WINDOW=192 RESERVE_PINS_serial=PA10,PA9 SERIAL_BAUD=250000 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'rpi': Starting connect mcu 'mcu': got {'oid': 10, 'next_clock': 1143796224, 'value': 31451, '#name': 'analog_in_state', '#sent_time': 363.05060448700004, '#receive_time': 363.288867413} mcu 'mcu': got {'oid': 15, 'next_clock': 1147396224, 'value': 31470, '#name': 'analog_in_state', '#sent_time': 363.05060448700004, '#receive_time': 363.338906024} Loaded MCU 'rpi' 111 commands (v0.11.0-105-g1e7057e9 / gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2) 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) Configured MCU 'rpi' (1024 moves) Starting heater checks for heater_bed bed_mesh: generated points Index | Tool Adjusted | Probe 0 | (50.5, 15.0) | (15.0, 15.0) 1 | (85.5, 15.0) | (50.0, 15.0) 2 | (120.5, 15.0) | (85.0, 15.0) 3 | (155.5, 15.0) | (120.0, 15.0) 4 | (190.5, 15.0) | (155.0, 15.0) 5 | (225.5, 15.0) | (190.0, 15.0) 6 | (260.5, 15.0) | (225.0, 15.0) 7 | (260.5, 50.0) | (225.0, 50.0) 8 | (225.5, 50.0) | (190.0, 50.0) 9 | (190.5, 50.0) | (155.0, 50.0) 10 | (155.5, 50.0) | (120.0, 50.0) 11 | (120.5, 50.0) | (85.0, 50.0) 12 | (85.5, 50.0) | (50.0, 50.0) 13 | (50.5, 50.0) | (15.0, 50.0) 14 | (50.5, 85.0) | (15.0, 85.0) 15 | (85.5, 85.0) | (50.0, 85.0) 16 | (120.5, 85.0) | (85.0, 85.0) 17 | (155.5, 85.0) | (120.0, 85.0) 18 | (190.5, 85.0) | (155.0, 85.0) 19 | (225.5, 85.0) | (190.0, 85.0) 20 | (260.5, 85.0) | (225.0, 85.0) 21 | (260.5, 120.0) | (225.0, 120.0) 22 | (225.5, 120.0) | (190.0, 120.0) 23 | (190.5, 120.0) | (155.0, 120.0) 24 | (155.5, 120.0) | (120.0, 120.0) 25 | (120.5, 120.0) | (85.0, 120.0) 26 | (85.5, 120.0) | (50.0, 120.0) 27 | (50.5, 120.0) | (15.0, 120.0) 28 | (50.5, 155.0) | (15.0, 155.0) 29 | (85.5, 155.0) | (50.0, 155.0) 30 | (120.5, 155.0) | (85.0, 155.0) 31 | (155.5, 155.0) | (120.0, 155.0) 32 | (190.5, 155.0) | (155.0, 155.0) 33 | (225.5, 155.0) | (190.0, 155.0) 34 | (260.5, 155.0) | (225.0, 155.0) 35 | (260.5, 190.0) | (225.0, 190.0) 36 | (225.5, 190.0) | (190.0, 190.0) 37 | (190.5, 190.0) | (155.0, 190.0) 38 | (155.5, 190.0) | (120.0, 190.0) 39 | (120.5, 190.0) | (85.0, 190.0) 40 | (85.5, 190.0) | (50.0, 190.0) 41 | (50.5, 190.0) | (15.0, 190.0) 42 | (50.5, 225.0) | (15.0, 225.0) 43 | (85.5, 225.0) | (50.0, 225.0) 44 | (120.5, 225.0) | (85.0, 225.0) 45 | (155.5, 225.0) | (120.0, 225.0) 46 | (190.5, 225.0) | (155.0, 225.0) 47 | (225.5, 225.0) | (190.0, 225.0) 48 | (260.5, 225.0) | (225.0, 225.0) Starting heater checks for extruder webhooks: registering remote method 'shutdown_machine' for connection id: 547664477488 webhooks: registering remote method 'reboot_machine' for connection id: 547664477488 webhooks: registering remote method 'pause_job_queue' for connection id: 547664477488 webhooks: registering remote method 'start_job_queue' for connection id: 547664477488 Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-233-g1374c701' Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' Start printer at Wed Jun 21 13:21:59 2023 (1687368119.4 375.6) ===== Config file ===== [stepper_x] step_pin = PC2 dir_pin = PB9 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA5 position_endstop = 0 position_max = 262 homing_speed = 50 [stepper_y] step_pin = PB8 dir_pin = PB7 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA6 position_endstop = 0 position_max = 250 homing_speed = 50 [stepper_z] step_pin = PB6 dir_pin = !PB5 enable_pin = !PC3 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 250 position_min = -5 [extruder] max_extrude_only_distance = 100.0 max_extrude_cross_section = 5.0 step_pin = PB4 dir_pin = !PB3 enable_pin = !PC3 microsteps = 16 rotation_distance = 8.064 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PA1 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = PC5 min_temp = 0 max_temp = 250 control = pid pid_kp = 31.739 pid_ki = 4.232 pid_kd = 59.510 [heater_bed] heater_pin = PA2 sensor_type = EPCOS 100K B57560G104F sensor_pin = PC4 min_temp = 0 max_temp = 130 control = pid pid_kp = 69.887 pid_ki = 1.383 pid_kd = 883.199 [fan] pin = PA0 [mcu] serial = /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 restart_method = command [mcu rpi] serial = /tmp/klipper_host_mcu [output_pin ledlight] pin = rpi:gpiochip0/gpio23 pwm = false value = 1 shutdown_value = 1 [gcode_macro TOGGLE_LIGHT] gcode = SET_PIN PIN=ledlight VALUE={(not printer['output_pin ledlight'].value)|int} [output_pin relay2] pin = rpi:gpiochip0/gpio24 pwm = false value = 1 shutdown_value = 1 [gcode_macro relay2] gcode = SET_PIN PIN=relay2 VALUE={(not printer['output_pin relay2'].value)|int} [printer] kinematics = cartesian max_velocity = 300 max_accel = 3000 max_z_velocity = 5 max_z_accel = 100 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes [display_status] [pause_resume] [exclude_object] [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = False 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 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'] %} {% 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}} %} {% 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]" % 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': park.coord.x, 'y': park.coord.y, 'z': [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min} %} {% 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 X{pos.x} Y{pos.y} Z{pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [gcode_macro G29] gcode = BED_MESH_CALIBRATE [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} [gcode_macro CANCEL_PRINT] description = "Cancel the running print" rename_existing = CANCEL_PRINT_BASE gcode = M117 Canceling Print... M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 M117 CANCEL_PRINT_BASE [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT variable_extrude = 1.0 gcode = {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} [bltouch] sensor_pin = ^PB1 control_pin = PB0 x_offset = -35.5 y_offset = 0 stow_on_each_sample = False probe_with_touch_mode = True z_offset = 2.900 [safe_z_home] home_xy_position = 160.5,117.5 z_hop = 10 z_hop_speed = 5 [bed_mesh] speed = 120 horizontal_move_z = 5 mesh_min = 15, 15 mesh_max = 225, 225 probe_count = 7,7 algorithm = bicubic fade_start = 1 fade_end = 10 fade_target = 0 [screws_tilt_adjust] screw1 = 77.1,40 screw1_name = front left screw screw2 = 247,40 screw2_name = front right screw screw3 = 247,210 screw3_name = rear right screw screw4 = 77.1,210 screw4_name = rear left screw horizontal_move_z = 10 speed = 50 screw_thread = CW-M4 [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 LOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E80 F350 G92 E0.0 M82 [gcode_macro UNLOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E-80 F350 G92 E0.0 M82 [gcode_macro _pause_inner_m700] gcode = {% set extruder = "extruder" ~ params.T|replace('0', '') if "T" in params else printer.toolhead.extruder %} {% if extruder != printer.toolhead.extruder%} ACTIVATE_EXTRUDER EXTRUDER={extruder} {% endif %} {% set z_param = (' Z="%f"' % params.Z) if 'Z' in params else "" %} {% if printer.idle_timeout.state|string == "Printing" %} PAUSE P=2{z_param} {% elif not printer.pause_resume.is_paused%} SET_GCODE_VARIABLE MACRO=_load_unload VARIABLE=is_printing VALUE="{0}" PARK P=2{z_param} {% endif %} [gcode_macro M701] description = Pauses/parks the toolhead then loads filament to the extruder. Usage: M701 [L] [Z] [T] gcode = {% if 'U' in params %} {% if not 'L' in params %} RESPOND TYPE=error MSG="Argument \"U\" substituted for missing \"L\"." {% set dummy = params.__setitem__("L", params.U) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"U\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} LOAD_FILAMENT LENGTH={ params.L|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro M702] description = Pauses/parks the toolhead then unloads filament from the extruder. Usage: M702 [U] [Z] [T] gcode = {% if 'L' in params %} {% if not 'U' in params %} RESPOND TYPE=error MSG="Argument \"L\" substituted for missing \"U\"." {% set dummy = params.__setitem__("U", params.L) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"L\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} UNLOAD_FILAMENT LENGTH={ params.U|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro PRINT_START] variable_parameter_area_start = 0,0 variable_parameter_area_end = 0,0 gcode = {% set BED_TEMP = params.BED_TEMP|default(60)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(210)|float %} M104 S150 M117 Heating bed... M190 S{BED_TEMP} M117 Homing... G28 M117 Calibrating mesh... . . SETUP_KAMP_MESHING DISPLAY_PARAMETERS=1 LED_ENABLE=0 FUZZ_ENABLE=1 SETUP_LINE_PURGE DISPLAY_PARAMETERS=1 ADAPTIVE_ENABLE=1 . . BED_MESH_CLEAR BED_MESH_CALIBRATE M117 Heating Extruder... M109 S{EXTRUDER_TEMP} G92 E0 LINE_PURGE G90 SET_GCODE_OFFSET Z=0.0 M117 [gcode_macro END_PRINT] gcode = M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 [firmware_retraction] retract_length = 0.4 retract_speed = 40 unretract_speed = 40 [bed_mesh default] version = 1 points = 0.275000, 0.202500, 0.125000, 0.132500, 0.210000 0.145000, 0.102500, 0.047500, 0.060000, 0.100000 0.075000, 0.052500, -0.007500, 0.022500, 0.047500 0.145000, 0.095000, 0.050000, 0.060000, 0.075000 0.222500, 0.155000, 0.105000, 0.135000, 0.180000 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = lagrange tension = 0.2 min_x = 15.0 max_x = 225.0 min_y = 15.0 max_y = 225.0 ======================= Extruder max_extrude_ratio=2.078758 mcu 'mcu': Starting serial connect webhooks client 548592323888: New connection webhooks client 548592323888: Client info {'program': 'Moonraker', 'version': 'v0.8.0-29-g80920dd'} mcu 'mcu': got {'oid': 10, 'next_clock': 2122996224, 'value': 31448, '#name': 'analog_in_state', '#sent_time': 376.863638997, '#receive_time': 376.88876253399997} mcu 'mcu': got {'oid': 15, 'next_clock': 2126596224, 'value': 31468, '#name': 'analog_in_state', '#sent_time': 376.91748486800003, '#receive_time': 376.93875181199996} mcu 'mcu': got {'oid': 10, 'next_clock': 2144596224, 'value': 31443, '#name': 'analog_in_state', '#sent_time': 377.185456701, '#receive_time': 377.18883607099997} mcu 'mcu': got {'oid': 15, 'next_clock': 2148196224, 'value': 31470, '#name': 'analog_in_state', '#sent_time': 377.185456701, '#receive_time': 377.238902182} Loaded MCU 'mcu' 105 commands (v0.11.0-62-gf1203d56 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.35.2-2+14+b2) 2.35.2) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1a=PB8,PB9 BUS_PINS_i2c2=PB10,PB11 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi3=PB4,PB5,PB3 CLOCK_FREQ=72000000 MCU=stm32f103xe PWM_MAX=255 RECEIVE_WINDOW=192 RESERVE_PINS_serial=PA10,PA9 SERIAL_BAUD=250000 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'rpi': Starting connect mcu 'mcu': got {'oid': 10, 'next_clock': 2166196224, 'value': 31447, '#name': 'analog_in_state', '#sent_time': 377.248008571, '#receive_time': 377.488894904} mcu 'mcu': got {'oid': 15, 'next_clock': 2169796224, 'value': 31470, '#name': 'analog_in_state', '#sent_time': 377.248008571, '#receive_time': 377.53894751499996} Loaded MCU 'rpi' 111 commands (v0.11.0-105-g1e7057e9 / gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2) 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) Configured MCU 'rpi' (1024 moves) Starting heater checks for heater_bed bed_mesh: generated points Index | Tool Adjusted | Probe 0 | (50.5, 15.0) | (15.0, 15.0) 1 | (85.5, 15.0) | (50.0, 15.0) 2 | (120.5, 15.0) | (85.0, 15.0) 3 | (155.5, 15.0) | (120.0, 15.0) 4 | (190.5, 15.0) | (155.0, 15.0) 5 | (225.5, 15.0) | (190.0, 15.0) 6 | (260.5, 15.0) | (225.0, 15.0) 7 | (260.5, 50.0) | (225.0, 50.0) 8 | (225.5, 50.0) | (190.0, 50.0) 9 | (190.5, 50.0) | (155.0, 50.0) 10 | (155.5, 50.0) | (120.0, 50.0) 11 | (120.5, 50.0) | (85.0, 50.0) 12 | (85.5, 50.0) | (50.0, 50.0) 13 | (50.5, 50.0) | (15.0, 50.0) 14 | (50.5, 85.0) | (15.0, 85.0) 15 | (85.5, 85.0) | (50.0, 85.0) 16 | (120.5, 85.0) | (85.0, 85.0) 17 | (155.5, 85.0) | (120.0, 85.0) 18 | (190.5, 85.0) | (155.0, 85.0) 19 | (225.5, 85.0) | (190.0, 85.0) 20 | (260.5, 85.0) | (225.0, 85.0) 21 | (260.5, 120.0) | (225.0, 120.0) 22 | (225.5, 120.0) | (190.0, 120.0) 23 | (190.5, 120.0) | (155.0, 120.0) 24 | (155.5, 120.0) | (120.0, 120.0) 25 | (120.5, 120.0) | (85.0, 120.0) 26 | (85.5, 120.0) | (50.0, 120.0) 27 | (50.5, 120.0) | (15.0, 120.0) 28 | (50.5, 155.0) | (15.0, 155.0) 29 | (85.5, 155.0) | (50.0, 155.0) 30 | (120.5, 155.0) | (85.0, 155.0) 31 | (155.5, 155.0) | (120.0, 155.0) 32 | (190.5, 155.0) | (155.0, 155.0) 33 | (225.5, 155.0) | (190.0, 155.0) 34 | (260.5, 155.0) | (225.0, 155.0) 35 | (260.5, 190.0) | (225.0, 190.0) 36 | (225.5, 190.0) | (190.0, 190.0) 37 | (190.5, 190.0) | (155.0, 190.0) 38 | (155.5, 190.0) | (120.0, 190.0) 39 | (120.5, 190.0) | (85.0, 190.0) 40 | (85.5, 190.0) | (50.0, 190.0) 41 | (50.5, 190.0) | (15.0, 190.0) 42 | (50.5, 225.0) | (15.0, 225.0) 43 | (85.5, 225.0) | (50.0, 225.0) 44 | (120.5, 225.0) | (85.0, 225.0) 45 | (155.5, 225.0) | (120.0, 225.0) 46 | (190.5, 225.0) | (155.0, 225.0) 47 | (225.5, 225.0) | (190.0, 225.0) 48 | (260.5, 225.0) | (225.0, 225.0) Starting heater checks for extruder webhooks: registering remote method 'shutdown_machine' for connection id: 548592323888 webhooks: registering remote method 'reboot_machine' for connection id: 548592323888 webhooks: registering remote method 'pause_job_queue' for connection id: 548592323888 webhooks: registering remote method 'start_job_queue' for connection id: 548592323888 webhooks client 548592323888: Disconnected webhooks client 548592236912: New connection webhooks client 548592236912: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} webhooks: registering remote method 'shutdown_machine' for connection id: 548592236912 webhooks: registering remote method 'reboot_machine' for connection id: 548592236912 webhooks: registering remote method 'pause_job_queue' for connection id: 548592236912 webhooks: registering remote method 'start_job_queue' for connection id: 548592236912 webhooks client 548592236912: Disconnected Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-233-g1374c701' Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' Start printer at Wed Jun 21 13:25:22 2023 (1687368322.4 20.9) ===== Config file ===== [stepper_x] step_pin = PC2 dir_pin = PB9 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA5 position_endstop = 0 position_max = 262 homing_speed = 50 [stepper_y] step_pin = PB8 dir_pin = PB7 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA6 position_endstop = 0 position_max = 250 homing_speed = 50 [stepper_z] step_pin = PB6 dir_pin = !PB5 enable_pin = !PC3 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 250 position_min = -5 [extruder] max_extrude_only_distance = 100.0 max_extrude_cross_section = 5.0 step_pin = PB4 dir_pin = !PB3 enable_pin = !PC3 microsteps = 16 rotation_distance = 8.064 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PA1 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = PC5 min_temp = 0 max_temp = 250 control = pid pid_kp = 31.739 pid_ki = 4.232 pid_kd = 59.510 [heater_bed] heater_pin = PA2 sensor_type = EPCOS 100K B57560G104F sensor_pin = PC4 min_temp = 0 max_temp = 130 control = pid pid_kp = 69.887 pid_ki = 1.383 pid_kd = 883.199 [fan] pin = PA0 [mcu] serial = /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 restart_method = command [mcu rpi] serial = /tmp/klipper_host_mcu [output_pin ledlight] pin = rpi:gpiochip0/gpio23 pwm = false value = 1 shutdown_value = 1 [gcode_macro TOGGLE_LIGHT] gcode = SET_PIN PIN=ledlight VALUE={(not printer['output_pin ledlight'].value)|int} [output_pin relay2] pin = rpi:gpiochip0/gpio24 pwm = false value = 1 shutdown_value = 1 [gcode_macro relay2] gcode = SET_PIN PIN=relay2 VALUE={(not printer['output_pin relay2'].value)|int} [printer] kinematics = cartesian max_velocity = 300 max_accel = 3000 max_z_velocity = 5 max_z_accel = 100 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes [display_status] [pause_resume] [exclude_object] [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = False 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 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'] %} {% 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}} %} {% 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]" % 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': park.coord.x, 'y': park.coord.y, 'z': [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min} %} {% 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 X{pos.x} Y{pos.y} Z{pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [gcode_macro G29] gcode = BED_MESH_CALIBRATE [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} [gcode_macro CANCEL_PRINT] description = "Cancel the running print" rename_existing = CANCEL_PRINT_BASE gcode = M117 Canceling Print... M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 M117 CANCEL_PRINT_BASE [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT variable_extrude = 1.0 gcode = {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} [bltouch] sensor_pin = ^PB1 control_pin = PB0 x_offset = -35.5 y_offset = 0 stow_on_each_sample = False probe_with_touch_mode = True z_offset = 2.900 [safe_z_home] home_xy_position = 160.5,117.5 z_hop = 10 z_hop_speed = 5 [bed_mesh] speed = 120 horizontal_move_z = 5 mesh_min = 15, 15 mesh_max = 225, 225 probe_count = 7,7 algorithm = bicubic fade_start = 1 fade_end = 10 fade_target = 0 [screws_tilt_adjust] screw1 = 77.1,40 screw1_name = front left screw screw2 = 247,40 screw2_name = front right screw screw3 = 247,210 screw3_name = rear right screw screw4 = 77.1,210 screw4_name = rear left screw horizontal_move_z = 10 speed = 50 screw_thread = CW-M4 [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 LOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E80 F350 G92 E0.0 M82 [gcode_macro UNLOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E-80 F350 G92 E0.0 M82 [gcode_macro _pause_inner_m700] gcode = {% set extruder = "extruder" ~ params.T|replace('0', '') if "T" in params else printer.toolhead.extruder %} {% if extruder != printer.toolhead.extruder%} ACTIVATE_EXTRUDER EXTRUDER={extruder} {% endif %} {% set z_param = (' Z="%f"' % params.Z) if 'Z' in params else "" %} {% if printer.idle_timeout.state|string == "Printing" %} PAUSE P=2{z_param} {% elif not printer.pause_resume.is_paused%} SET_GCODE_VARIABLE MACRO=_load_unload VARIABLE=is_printing VALUE="{0}" PARK P=2{z_param} {% endif %} [gcode_macro M701] description = Pauses/parks the toolhead then loads filament to the extruder. Usage: M701 [L] [Z] [T] gcode = {% if 'U' in params %} {% if not 'L' in params %} RESPOND TYPE=error MSG="Argument \"U\" substituted for missing \"L\"." {% set dummy = params.__setitem__("L", params.U) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"U\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} LOAD_FILAMENT LENGTH={ params.L|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro M702] description = Pauses/parks the toolhead then unloads filament from the extruder. Usage: M702 [U] [Z] [T] gcode = {% if 'L' in params %} {% if not 'U' in params %} RESPOND TYPE=error MSG="Argument \"L\" substituted for missing \"U\"." {% set dummy = params.__setitem__("U", params.L) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"L\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} UNLOAD_FILAMENT LENGTH={ params.U|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro PRINT_START] variable_parameter_area_start = 0,0 variable_parameter_area_end = 0,0 gcode = {% set BED_TEMP = params.BED_TEMP|default(60)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(210)|float %} M104 S150 M117 Heating bed... M190 S{BED_TEMP} M117 Homing... G28 M117 Calibrating mesh... . . SETUP_KAMP_MESHING DISPLAY_PARAMETERS=1 LED_ENABLE=0 FUZZ_ENABLE=1 SETUP_LINE_PURGE DISPLAY_PARAMETERS=1 ADAPTIVE_ENABLE=1 . . BED_MESH_CLEAR BED_MESH_CALIBRATE M117 Heating Extruder... M109 S{EXTRUDER_TEMP} G92 E0 LINE_PURGE G90 SET_GCODE_OFFSET Z=0.0 M117 [gcode_macro END_PRINT] gcode = M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 [firmware_retraction] retract_length = 0.4 retract_speed = 40 unretract_speed = 40 [bed_mesh default] version = 1 points = 0.275000, 0.202500, 0.125000, 0.132500, 0.210000 0.145000, 0.102500, 0.047500, 0.060000, 0.100000 0.075000, 0.052500, -0.007500, 0.022500, 0.047500 0.145000, 0.095000, 0.050000, 0.060000, 0.075000 0.222500, 0.155000, 0.105000, 0.135000, 0.180000 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = lagrange tension = 0.2 min_x = 15.0 max_x = 225.0 min_y = 15.0 max_y = 225.0 ======================= Extruder max_extrude_ratio=2.078758 mcu 'mcu': Starting serial connect mcu 'mcu': got {'oid': 15, 'next_clock': 405127040, 'value': 31464, '#name': 'analog_in_state', '#sent_time': 22.452689690000003, '#receive_time': 22.469621745} mcu 'mcu': got {'oid': 10, 'next_clock': 423127040, 'value': 31444, '#name': 'analog_in_state', '#sent_time': 22.66847806, '#receive_time': 22.719540968} mcu 'mcu': got {'oid': 15, 'next_clock': 426727040, 'value': 31464, '#name': 'analog_in_state', '#sent_time': 22.722095227, '#receive_time': 22.769529801} Loaded MCU 'mcu' 105 commands (v0.11.0-62-gf1203d56 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.35.2-2+14+b2) 2.35.2) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1a=PB8,PB9 BUS_PINS_i2c2=PB10,PB11 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi3=PB4,PB5,PB3 CLOCK_FREQ=72000000 MCU=stm32f103xe PWM_MAX=255 RECEIVE_WINDOW=192 RESERVE_PINS_serial=PA10,PA9 SERIAL_BAUD=250000 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'rpi': Starting connect mcu 'mcu': got {'oid': 10, 'next_clock': 444727040, 'value': 31440, '#name': 'analog_in_state', '#sent_time': 22.892335838, '#receive_time': 23.019569949} mcu 'mcu': got {'oid': 15, 'next_clock': 448327040, 'value': 31465, '#name': 'analog_in_state', '#sent_time': 22.892335838, '#receive_time': 23.069589375000003} webhooks client 548450433920: New connection mcu 'mcu': got {'oid': 10, 'next_clock': 466327040, 'value': 31443, '#name': 'analog_in_state', '#sent_time': 22.892335838, '#receive_time': 23.319612763000002} mcu 'mcu': got {'oid': 15, 'next_clock': 469927040, 'value': 31460, '#name': 'analog_in_state', '#sent_time': 22.892335838, '#receive_time': 23.369519078} Loaded MCU 'rpi' 111 commands (v0.11.0-105-g1e7057e9 / gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2) 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... Configured MCU 'rpi' (1024 moves) Starting heater checks for heater_bed webhooks client 548450433920: Client info {'program': 'Moonraker', 'version': 'v0.8.0-55-g0f4276d'} bed_mesh: generated points Index | Tool Adjusted | Probe 0 | (50.5, 15.0) | (15.0, 15.0) 1 | (85.5, 15.0) | (50.0, 15.0) 2 | (120.5, 15.0) | (85.0, 15.0) 3 | (155.5, 15.0) | (120.0, 15.0) 4 | (190.5, 15.0) | (155.0, 15.0) 5 | (225.5, 15.0) | (190.0, 15.0) 6 | (260.5, 15.0) | (225.0, 15.0) 7 | (260.5, 50.0) | (225.0, 50.0) 8 | (225.5, 50.0) | (190.0, 50.0) 9 | (190.5, 50.0) | (155.0, 50.0) 10 | (155.5, 50.0) | (120.0, 50.0) 11 | (120.5, 50.0) | (85.0, 50.0) 12 | (85.5, 50.0) | (50.0, 50.0) 13 | (50.5, 50.0) | (15.0, 50.0) 14 | (50.5, 85.0) | (15.0, 85.0) 15 | (85.5, 85.0) | (50.0, 85.0) 16 | (120.5, 85.0) | (85.0, 85.0) 17 | (155.5, 85.0) | (120.0, 85.0) 18 | (190.5, 85.0) | (155.0, 85.0) 19 | (225.5, 85.0) | (190.0, 85.0) 20 | (260.5, 85.0) | (225.0, 85.0) 21 | (260.5, 120.0) | (225.0, 120.0) 22 | (225.5, 120.0) | (190.0, 120.0) 23 | (190.5, 120.0) | (155.0, 120.0) 24 | (155.5, 120.0) | (120.0, 120.0) 25 | (120.5, 120.0) | (85.0, 120.0) 26 | (85.5, 120.0) | (50.0, 120.0) 27 | (50.5, 120.0) | (15.0, 120.0) 28 | (50.5, 155.0) | (15.0, 155.0) 29 | (85.5, 155.0) | (50.0, 155.0) 30 | (120.5, 155.0) | (85.0, 155.0) 31 | (155.5, 155.0) | (120.0, 155.0) 32 | (190.5, 155.0) | (155.0, 155.0) 33 | (225.5, 155.0) | (190.0, 155.0) 34 | (260.5, 155.0) | (225.0, 155.0) 35 | (260.5, 190.0) | (225.0, 190.0) 36 | (225.5, 190.0) | (190.0, 190.0) 37 | (190.5, 190.0) | (155.0, 190.0) 38 | (155.5, 190.0) | (120.0, 190.0) 39 | (120.5, 190.0) | (85.0, 190.0) 40 | (85.5, 190.0) | (50.0, 190.0) 41 | (50.5, 190.0) | (15.0, 190.0) 42 | (50.5, 225.0) | (15.0, 225.0) 43 | (85.5, 225.0) | (50.0, 225.0) 44 | (120.5, 225.0) | (85.0, 225.0) 45 | (155.5, 225.0) | (120.0, 225.0) 46 | (190.5, 225.0) | (155.0, 225.0) 47 | (225.5, 225.0) | (190.0, 225.0) 48 | (260.5, 225.0) | (225.0, 225.0) Starting heater checks for extruder webhooks: registering remote method 'shutdown_machine' for connection id: 548450433920 webhooks: registering remote method 'reboot_machine' for connection id: 548450433920 webhooks: registering remote method 'pause_job_queue' for connection id: 548450433920 webhooks: registering remote method 'start_job_queue' for connection id: 548450433920 webhooks client 548450433920: Disconnected Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-233-g1374c701' Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' Start printer at Wed Jun 21 13:38:48 2023 (1687369128.2 21.7) ===== Config file ===== [stepper_x] step_pin = PC2 dir_pin = PB9 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA5 position_endstop = 0 position_max = 262 homing_speed = 50 [stepper_y] step_pin = PB8 dir_pin = PB7 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA6 position_endstop = 0 position_max = 250 homing_speed = 50 [stepper_z] step_pin = PB6 dir_pin = !PB5 enable_pin = !PC3 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 250 position_min = -5 [extruder] max_extrude_only_distance = 100.0 max_extrude_cross_section = 5.0 step_pin = PB4 dir_pin = !PB3 enable_pin = !PC3 microsteps = 16 rotation_distance = 8.064 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PA1 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = PC5 min_temp = 0 max_temp = 250 control = pid pid_kp = 31.739 pid_ki = 4.232 pid_kd = 59.510 [heater_bed] heater_pin = PA2 sensor_type = EPCOS 100K B57560G104F sensor_pin = PC4 min_temp = 0 max_temp = 130 control = pid pid_kp = 69.887 pid_ki = 1.383 pid_kd = 883.199 [fan] pin = PA0 [mcu] serial = /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 restart_method = command [mcu rpi] serial = /tmp/klipper_host_mcu [output_pin ledlight] pin = rpi:gpiochip0/gpio23 pwm = false value = 1 shutdown_value = 1 [gcode_macro TOGGLE_LIGHT] gcode = SET_PIN PIN=ledlight VALUE={(not printer['output_pin ledlight'].value)|int} [output_pin relay2] pin = rpi:gpiochip0/gpio24 pwm = false value = 1 shutdown_value = 1 [gcode_macro relay2] gcode = SET_PIN PIN=relay2 VALUE={(not printer['output_pin relay2'].value)|int} [printer] kinematics = cartesian max_velocity = 300 max_accel = 3000 max_z_velocity = 5 max_z_accel = 100 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes [display_status] [pause_resume] [exclude_object] [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = False 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 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'] %} {% 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}} %} {% 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]" % 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': park.coord.x, 'y': park.coord.y, 'z': [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min} %} {% 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 X{pos.x} Y{pos.y} Z{pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [gcode_macro G29] gcode = BED_MESH_CALIBRATE [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} [gcode_macro CANCEL_PRINT] description = "Cancel the running print" rename_existing = CANCEL_PRINT_BASE gcode = M117 Canceling Print... M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 M117 CANCEL_PRINT_BASE [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT variable_extrude = 1.0 gcode = {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} [bltouch] sensor_pin = ^PB1 control_pin = PB0 x_offset = -35.5 y_offset = 0 stow_on_each_sample = False probe_with_touch_mode = True z_offset = 2.900 [safe_z_home] home_xy_position = 160.5,117.5 z_hop = 10 z_hop_speed = 5 [bed_mesh] speed = 120 horizontal_move_z = 5 mesh_min = 15, 15 mesh_max = 225, 225 probe_count = 7,7 algorithm = bicubic fade_start = 1 fade_end = 10 fade_target = 0 [screws_tilt_adjust] screw1 = 77.1,40 screw1_name = front left screw screw2 = 247,40 screw2_name = front right screw screw3 = 247,210 screw3_name = rear right screw screw4 = 77.1,210 screw4_name = rear left screw horizontal_move_z = 10 speed = 50 screw_thread = CW-M4 [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 LOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E80 F350 G92 E0.0 M82 [gcode_macro UNLOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E-80 F350 G92 E0.0 M82 [gcode_macro _pause_inner_m700] gcode = {% set extruder = "extruder" ~ params.T|replace('0', '') if "T" in params else printer.toolhead.extruder %} {% if extruder != printer.toolhead.extruder%} ACTIVATE_EXTRUDER EXTRUDER={extruder} {% endif %} {% set z_param = (' Z="%f"' % params.Z) if 'Z' in params else "" %} {% if printer.idle_timeout.state|string == "Printing" %} PAUSE P=2{z_param} {% elif not printer.pause_resume.is_paused%} SET_GCODE_VARIABLE MACRO=_load_unload VARIABLE=is_printing VALUE="{0}" PARK P=2{z_param} {% endif %} [gcode_macro M701] description = Pauses/parks the toolhead then loads filament to the extruder. Usage: M701 [L] [Z] [T] gcode = {% if 'U' in params %} {% if not 'L' in params %} RESPOND TYPE=error MSG="Argument \"U\" substituted for missing \"L\"." {% set dummy = params.__setitem__("L", params.U) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"U\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} LOAD_FILAMENT LENGTH={ params.L|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro M702] description = Pauses/parks the toolhead then unloads filament from the extruder. Usage: M702 [U] [Z] [T] gcode = {% if 'L' in params %} {% if not 'U' in params %} RESPOND TYPE=error MSG="Argument \"L\" substituted for missing \"U\"." {% set dummy = params.__setitem__("U", params.L) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"L\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} UNLOAD_FILAMENT LENGTH={ params.U|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro PRINT_START] variable_parameter_area_start = 0,0 variable_parameter_area_end = 0,0 gcode = {% set BED_TEMP = params.BED_TEMP|default(60)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(210)|float %} M104 S150 M117 Heating bed... M190 S{BED_TEMP} M117 Homing... G28 M117 Calibrating mesh... . . SETUP_KAMP_MESHING DISPLAY_PARAMETERS=1 LED_ENABLE=0 FUZZ_ENABLE=1 SETUP_LINE_PURGE DISPLAY_PARAMETERS=1 ADAPTIVE_ENABLE=1 . . BED_MESH_CLEAR BED_MESH_CALIBRATE M117 Heating Extruder... M109 S{EXTRUDER_TEMP} G92 E0 LINE_PURGE G90 SET_GCODE_OFFSET Z=0.0 M117 [gcode_macro END_PRINT] gcode = M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 [firmware_retraction] retract_length = 0.4 retract_speed = 40 unretract_speed = 40 [bed_mesh default] version = 1 points = 0.275000, 0.202500, 0.125000, 0.132500, 0.210000 0.145000, 0.102500, 0.047500, 0.060000, 0.100000 0.075000, 0.052500, -0.007500, 0.022500, 0.047500 0.145000, 0.095000, 0.050000, 0.060000, 0.075000 0.222500, 0.155000, 0.105000, 0.135000, 0.180000 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = lagrange tension = 0.2 min_x = 15.0 max_x = 225.0 min_y = 15.0 max_y = 225.0 ======================= Extruder max_extrude_ratio=2.078758 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' webhooks client 548422544880: New connection webhooks client 548422544880: 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-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 798, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/pi/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/pi/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/pi/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/pi/klipper/klippy/../.config(692): Sun Feb 12 21:05:47 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 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set CONFIG_MACH_LINUX=y # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="linux" CONFIG_CLOCK_FREQ=50000000 CONFIG_LINUX_SELECT=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_CANBUS_FREQUENCY=500000 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_GPIO_BITBANGING=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(9215): Sun Feb 12 21:06:09 2023 Last MCU build version: v0.11.0-105-g1e7057e9 Last MCU build tools: gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2 Last MCU build config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Build file /home/pi/klipper/klippy/../out/klipper.elf(818112): Sun Feb 12 21:06:17 2023 Unable to issue reset command on MCU 'mcu' Unable to issue reset command on MCU 'rpi' webhooks client 548422544880: Disconnected Restarting printer Start printer at Wed Jun 21 13:41:41 2023 (1687369301.1 141.6) ===== Config file ===== [stepper_x] step_pin = PC2 dir_pin = PB9 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA5 position_endstop = 0 position_max = 262 homing_speed = 50 [stepper_y] step_pin = PB8 dir_pin = PB7 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA6 position_endstop = 0 position_max = 250 homing_speed = 50 [stepper_z] step_pin = PB6 dir_pin = !PB5 enable_pin = !PC3 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 250 position_min = -5 [extruder] max_extrude_only_distance = 100.0 max_extrude_cross_section = 5.0 step_pin = PB4 dir_pin = !PB3 enable_pin = !PC3 microsteps = 16 rotation_distance = 8.064 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PA1 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = PC5 min_temp = 0 max_temp = 250 control = pid pid_kp = 31.739 pid_ki = 4.232 pid_kd = 59.510 [heater_bed] heater_pin = PA2 sensor_type = EPCOS 100K B57560G104F sensor_pin = PC4 min_temp = 0 max_temp = 130 control = pid pid_kp = 69.887 pid_ki = 1.383 pid_kd = 883.199 [fan] pin = PA0 [mcu] serial = /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 restart_method = command [mcu rpi] serial = /tmp/klipper_host_mcu [output_pin ledlight] pin = rpi:gpiochip0/gpio23 pwm = false value = 1 shutdown_value = 1 [gcode_macro TOGGLE_LIGHT] gcode = SET_PIN PIN=ledlight VALUE={(not printer['output_pin ledlight'].value)|int} [output_pin relay2] pin = rpi:gpiochip0/gpio24 pwm = false value = 1 shutdown_value = 1 [gcode_macro relay2] gcode = SET_PIN PIN=relay2 VALUE={(not printer['output_pin relay2'].value)|int} [printer] kinematics = cartesian max_velocity = 300 max_accel = 3000 max_z_velocity = 5 max_z_accel = 100 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes [display_status] [pause_resume] [exclude_object] [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = False 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 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'] %} {% 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}} %} {% 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]" % 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': park.coord.x, 'y': park.coord.y, 'z': [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min} %} {% 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 X{pos.x} Y{pos.y} Z{pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [gcode_macro G29] gcode = BED_MESH_CALIBRATE [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} [gcode_macro CANCEL_PRINT] description = "Cancel the running print" rename_existing = CANCEL_PRINT_BASE gcode = M117 Canceling Print... M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 M117 CANCEL_PRINT_BASE [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT variable_extrude = 1.0 gcode = {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} [bltouch] sensor_pin = ^PB1 control_pin = PB0 x_offset = -35.5 y_offset = 0 stow_on_each_sample = False probe_with_touch_mode = True z_offset = 2.900 [safe_z_home] home_xy_position = 160.5,117.5 z_hop = 10 z_hop_speed = 5 [bed_mesh] speed = 120 horizontal_move_z = 5 mesh_min = 15, 15 mesh_max = 225, 225 probe_count = 7,7 algorithm = bicubic fade_start = 1 fade_end = 10 fade_target = 0 [screws_tilt_adjust] screw1 = 77.1,40 screw1_name = front left screw screw2 = 247,40 screw2_name = front right screw screw3 = 247,210 screw3_name = rear right screw screw4 = 77.1,210 screw4_name = rear left screw horizontal_move_z = 10 speed = 50 screw_thread = CW-M4 [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 LOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E80 F350 G92 E0.0 M82 [gcode_macro UNLOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E-80 F350 G92 E0.0 M82 [gcode_macro _pause_inner_m700] gcode = {% set extruder = "extruder" ~ params.T|replace('0', '') if "T" in params else printer.toolhead.extruder %} {% if extruder != printer.toolhead.extruder%} ACTIVATE_EXTRUDER EXTRUDER={extruder} {% endif %} {% set z_param = (' Z="%f"' % params.Z) if 'Z' in params else "" %} {% if printer.idle_timeout.state|string == "Printing" %} PAUSE P=2{z_param} {% elif not printer.pause_resume.is_paused%} SET_GCODE_VARIABLE MACRO=_load_unload VARIABLE=is_printing VALUE="{0}" PARK P=2{z_param} {% endif %} [gcode_macro M701] description = Pauses/parks the toolhead then loads filament to the extruder. Usage: M701 [L] [Z] [T] gcode = {% if 'U' in params %} {% if not 'L' in params %} RESPOND TYPE=error MSG="Argument \"U\" substituted for missing \"L\"." {% set dummy = params.__setitem__("L", params.U) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"U\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} LOAD_FILAMENT LENGTH={ params.L|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro M702] description = Pauses/parks the toolhead then unloads filament from the extruder. Usage: M702 [U] [Z] [T] gcode = {% if 'L' in params %} {% if not 'U' in params %} RESPOND TYPE=error MSG="Argument \"L\" substituted for missing \"U\"." {% set dummy = params.__setitem__("U", params.L) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"L\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} UNLOAD_FILAMENT LENGTH={ params.U|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro PRINT_START] variable_parameter_area_start = 0,0 variable_parameter_area_end = 0,0 gcode = {% set BED_TEMP = params.BED_TEMP|default(60)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(210)|float %} M104 S150 M117 Heating bed... M190 S{BED_TEMP} M117 Homing... G28 M117 Calibrating mesh... . . SETUP_KAMP_MESHING DISPLAY_PARAMETERS=1 LED_ENABLE=0 FUZZ_ENABLE=1 SETUP_LINE_PURGE DISPLAY_PARAMETERS=1 ADAPTIVE_ENABLE=1 . . BED_MESH_CLEAR BED_MESH_CALIBRATE M117 Heating Extruder... M109 S{EXTRUDER_TEMP} G92 E0 LINE_PURGE G90 SET_GCODE_OFFSET Z=0.0 M117 [gcode_macro END_PRINT] gcode = M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 [firmware_retraction] retract_length = 0.4 retract_speed = 40 unretract_speed = 40 [bed_mesh default] version = 1 points = 0.275000, 0.202500, 0.125000, 0.132500, 0.210000 0.145000, 0.102500, 0.047500, 0.060000, 0.100000 0.075000, 0.052500, -0.007500, 0.022500, 0.047500 0.145000, 0.095000, 0.050000, 0.060000, 0.075000 0.222500, 0.155000, 0.105000, 0.135000, 0.180000 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = lagrange tension = 0.2 min_x = 15.0 max_x = 225.0 min_y = 15.0 max_y = 225.0 ======================= Extruder max_extrude_ratio=2.078758 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' webhooks client 548422495200: New connection webhooks client 548422495200: 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-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' webhooks client 548422495200: Disconnected Restarting printer Start printer at Wed Jun 21 13:42:01 2023 (1687369321.7 162.2) ===== Config file ===== [stepper_x] step_pin = PC2 dir_pin = PB9 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA5 position_endstop = 0 position_max = 262 homing_speed = 50 [stepper_y] step_pin = PB8 dir_pin = PB7 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA6 position_endstop = 0 position_max = 250 homing_speed = 50 [stepper_z] step_pin = PB6 dir_pin = !PB5 enable_pin = !PC3 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 250 position_min = -5 [extruder] max_extrude_only_distance = 100.0 max_extrude_cross_section = 5.0 step_pin = PB4 dir_pin = !PB3 enable_pin = !PC3 microsteps = 16 rotation_distance = 8.064 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PA1 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = PC5 min_temp = 0 max_temp = 250 control = pid pid_kp = 31.739 pid_ki = 4.232 pid_kd = 59.510 [heater_bed] heater_pin = PA2 sensor_type = EPCOS 100K B57560G104F sensor_pin = PC4 min_temp = 0 max_temp = 130 control = pid pid_kp = 69.887 pid_ki = 1.383 pid_kd = 883.199 [fan] pin = PA0 [mcu] serial = /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 restart_method = command [mcu rpi] serial = /tmp/klipper_host_mcu [output_pin ledlight] pin = rpi:gpiochip0/gpio23 pwm = false value = 1 shutdown_value = 1 [gcode_macro TOGGLE_LIGHT] gcode = SET_PIN PIN=ledlight VALUE={(not printer['output_pin ledlight'].value)|int} [output_pin relay2] pin = rpi:gpiochip0/gpio24 pwm = false value = 1 shutdown_value = 1 [gcode_macro relay2] gcode = SET_PIN PIN=relay2 VALUE={(not printer['output_pin relay2'].value)|int} [printer] kinematics = cartesian max_velocity = 300 max_accel = 3000 max_z_velocity = 5 max_z_accel = 100 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes [display_status] [pause_resume] [exclude_object] [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = False 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 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'] %} {% 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}} %} {% 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]" % 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': park.coord.x, 'y': park.coord.y, 'z': [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min} %} {% 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 X{pos.x} Y{pos.y} Z{pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [gcode_macro G29] gcode = BED_MESH_CALIBRATE [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} [gcode_macro CANCEL_PRINT] description = "Cancel the running print" rename_existing = CANCEL_PRINT_BASE gcode = M117 Canceling Print... M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 M117 CANCEL_PRINT_BASE [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT variable_extrude = 1.0 gcode = {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} [bltouch] sensor_pin = ^PB1 control_pin = PB0 x_offset = -35.5 y_offset = 0 stow_on_each_sample = False probe_with_touch_mode = True z_offset = 2.900 [safe_z_home] home_xy_position = 160.5,117.5 z_hop = 10 z_hop_speed = 5 [bed_mesh] speed = 120 horizontal_move_z = 5 mesh_min = 15, 15 mesh_max = 225, 225 probe_count = 7,7 algorithm = bicubic fade_start = 1 fade_end = 10 fade_target = 0 [screws_tilt_adjust] screw1 = 77.1,40 screw1_name = front left screw screw2 = 247,40 screw2_name = front right screw screw3 = 247,210 screw3_name = rear right screw screw4 = 77.1,210 screw4_name = rear left screw horizontal_move_z = 10 speed = 50 screw_thread = CW-M4 [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 LOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E80 F350 G92 E0.0 M82 [gcode_macro UNLOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E-80 F350 G92 E0.0 M82 [gcode_macro _pause_inner_m700] gcode = {% set extruder = "extruder" ~ params.T|replace('0', '') if "T" in params else printer.toolhead.extruder %} {% if extruder != printer.toolhead.extruder%} ACTIVATE_EXTRUDER EXTRUDER={extruder} {% endif %} {% set z_param = (' Z="%f"' % params.Z) if 'Z' in params else "" %} {% if printer.idle_timeout.state|string == "Printing" %} PAUSE P=2{z_param} {% elif not printer.pause_resume.is_paused%} SET_GCODE_VARIABLE MACRO=_load_unload VARIABLE=is_printing VALUE="{0}" PARK P=2{z_param} {% endif %} [gcode_macro M701] description = Pauses/parks the toolhead then loads filament to the extruder. Usage: M701 [L] [Z] [T] gcode = {% if 'U' in params %} {% if not 'L' in params %} RESPOND TYPE=error MSG="Argument \"U\" substituted for missing \"L\"." {% set dummy = params.__setitem__("L", params.U) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"U\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} LOAD_FILAMENT LENGTH={ params.L|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro M702] description = Pauses/parks the toolhead then unloads filament from the extruder. Usage: M702 [U] [Z] [T] gcode = {% if 'L' in params %} {% if not 'U' in params %} RESPOND TYPE=error MSG="Argument \"L\" substituted for missing \"U\"." {% set dummy = params.__setitem__("U", params.L) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"L\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} UNLOAD_FILAMENT LENGTH={ params.U|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro PRINT_START] variable_parameter_area_start = 0,0 variable_parameter_area_end = 0,0 gcode = {% set BED_TEMP = params.BED_TEMP|default(60)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(210)|float %} M104 S150 M117 Heating bed... M190 S{BED_TEMP} M117 Homing... G28 M117 Calibrating mesh... . . SETUP_KAMP_MESHING DISPLAY_PARAMETERS=1 LED_ENABLE=0 FUZZ_ENABLE=1 SETUP_LINE_PURGE DISPLAY_PARAMETERS=1 ADAPTIVE_ENABLE=1 . . BED_MESH_CLEAR BED_MESH_CALIBRATE M117 Heating Extruder... M109 S{EXTRUDER_TEMP} G92 E0 LINE_PURGE G90 SET_GCODE_OFFSET Z=0.0 M117 [gcode_macro END_PRINT] gcode = M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 [firmware_retraction] retract_length = 0.4 retract_speed = 40 unretract_speed = 40 [bed_mesh default] version = 1 points = 0.275000, 0.202500, 0.125000, 0.132500, 0.210000 0.145000, 0.102500, 0.047500, 0.060000, 0.100000 0.075000, 0.052500, -0.007500, 0.022500, 0.047500 0.145000, 0.095000, 0.050000, 0.060000, 0.075000 0.222500, 0.155000, 0.105000, 0.135000, 0.180000 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = lagrange tension = 0.2 min_x = 15.0 max_x = 225.0 min_y = 15.0 max_y = 225.0 ======================= Extruder max_extrude_ratio=2.078758 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' webhooks client 548422486960: New connection webhooks client 548422486960: 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-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' Unable to issue reset command on MCU 'mcu' Unable to issue reset command on MCU 'rpi' webhooks client 548422486960: Disconnected Restarting printer Start printer at Wed Jun 21 13:42:15 2023 (1687369335.7 176.2) ===== Config file ===== [stepper_x] step_pin = PC2 dir_pin = PB9 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA5 position_endstop = 0 position_max = 262 homing_speed = 50 [stepper_y] step_pin = PB8 dir_pin = PB7 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA6 position_endstop = 0 position_max = 250 homing_speed = 50 [stepper_z] step_pin = PB6 dir_pin = !PB5 enable_pin = !PC3 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 250 position_min = -5 [extruder] max_extrude_only_distance = 100.0 max_extrude_cross_section = 5.0 step_pin = PB4 dir_pin = !PB3 enable_pin = !PC3 microsteps = 16 rotation_distance = 8.064 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PA1 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = PC5 min_temp = 0 max_temp = 250 control = pid pid_kp = 31.739 pid_ki = 4.232 pid_kd = 59.510 [heater_bed] heater_pin = PA2 sensor_type = EPCOS 100K B57560G104F sensor_pin = PC4 min_temp = 0 max_temp = 130 control = pid pid_kp = 69.887 pid_ki = 1.383 pid_kd = 883.199 [fan] pin = PA0 [mcu] serial = /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 restart_method = command [mcu rpi] serial = /tmp/klipper_host_mcu [output_pin ledlight] pin = rpi:gpiochip0/gpio23 pwm = false value = 1 shutdown_value = 1 [gcode_macro TOGGLE_LIGHT] gcode = SET_PIN PIN=ledlight VALUE={(not printer['output_pin ledlight'].value)|int} [output_pin relay2] pin = rpi:gpiochip0/gpio24 pwm = false value = 1 shutdown_value = 1 [gcode_macro relay2] gcode = SET_PIN PIN=relay2 VALUE={(not printer['output_pin relay2'].value)|int} [printer] kinematics = cartesian max_velocity = 300 max_accel = 3000 max_z_velocity = 5 max_z_accel = 100 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes [display_status] [pause_resume] [exclude_object] [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = False 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 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'] %} {% 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}} %} {% 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]" % 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': park.coord.x, 'y': park.coord.y, 'z': [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min} %} {% 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 X{pos.x} Y{pos.y} Z{pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [gcode_macro G29] gcode = BED_MESH_CALIBRATE [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} [gcode_macro CANCEL_PRINT] description = "Cancel the running print" rename_existing = CANCEL_PRINT_BASE gcode = M117 Canceling Print... M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 M117 CANCEL_PRINT_BASE [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT variable_extrude = 1.0 gcode = {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} [bltouch] sensor_pin = ^PB1 control_pin = PB0 x_offset = -35.5 y_offset = 0 stow_on_each_sample = False probe_with_touch_mode = True z_offset = 2.900 [safe_z_home] home_xy_position = 160.5,117.5 z_hop = 10 z_hop_speed = 5 [bed_mesh] speed = 120 horizontal_move_z = 5 mesh_min = 15, 15 mesh_max = 225, 225 probe_count = 7,7 algorithm = bicubic fade_start = 1 fade_end = 10 fade_target = 0 [screws_tilt_adjust] screw1 = 77.1,40 screw1_name = front left screw screw2 = 247,40 screw2_name = front right screw screw3 = 247,210 screw3_name = rear right screw screw4 = 77.1,210 screw4_name = rear left screw horizontal_move_z = 10 speed = 50 screw_thread = CW-M4 [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 LOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E80 F350 G92 E0.0 M82 [gcode_macro UNLOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E-80 F350 G92 E0.0 M82 [gcode_macro _pause_inner_m700] gcode = {% set extruder = "extruder" ~ params.T|replace('0', '') if "T" in params else printer.toolhead.extruder %} {% if extruder != printer.toolhead.extruder%} ACTIVATE_EXTRUDER EXTRUDER={extruder} {% endif %} {% set z_param = (' Z="%f"' % params.Z) if 'Z' in params else "" %} {% if printer.idle_timeout.state|string == "Printing" %} PAUSE P=2{z_param} {% elif not printer.pause_resume.is_paused%} SET_GCODE_VARIABLE MACRO=_load_unload VARIABLE=is_printing VALUE="{0}" PARK P=2{z_param} {% endif %} [gcode_macro M701] description = Pauses/parks the toolhead then loads filament to the extruder. Usage: M701 [L] [Z] [T] gcode = {% if 'U' in params %} {% if not 'L' in params %} RESPOND TYPE=error MSG="Argument \"U\" substituted for missing \"L\"." {% set dummy = params.__setitem__("L", params.U) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"U\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} LOAD_FILAMENT LENGTH={ params.L|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro M702] description = Pauses/parks the toolhead then unloads filament from the extruder. Usage: M702 [U] [Z] [T] gcode = {% if 'L' in params %} {% if not 'U' in params %} RESPOND TYPE=error MSG="Argument \"L\" substituted for missing \"U\"." {% set dummy = params.__setitem__("U", params.L) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"L\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} UNLOAD_FILAMENT LENGTH={ params.U|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro PRINT_START] variable_parameter_area_start = 0,0 variable_parameter_area_end = 0,0 gcode = {% set BED_TEMP = params.BED_TEMP|default(60)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(210)|float %} M104 S150 M117 Heating bed... M190 S{BED_TEMP} M117 Homing... G28 M117 Calibrating mesh... . . SETUP_KAMP_MESHING DISPLAY_PARAMETERS=1 LED_ENABLE=0 FUZZ_ENABLE=1 SETUP_LINE_PURGE DISPLAY_PARAMETERS=1 ADAPTIVE_ENABLE=1 . . BED_MESH_CLEAR BED_MESH_CALIBRATE M117 Heating Extruder... M109 S{EXTRUDER_TEMP} G92 E0 LINE_PURGE G90 SET_GCODE_OFFSET Z=0.0 M117 [gcode_macro END_PRINT] gcode = M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 [firmware_retraction] retract_length = 0.4 retract_speed = 40 unretract_speed = 40 [bed_mesh default] version = 1 points = 0.275000, 0.202500, 0.125000, 0.132500, 0.210000 0.145000, 0.102500, 0.047500, 0.060000, 0.100000 0.075000, 0.052500, -0.007500, 0.022500, 0.047500 0.145000, 0.095000, 0.050000, 0.060000, 0.075000 0.222500, 0.155000, 0.105000, 0.135000, 0.180000 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = lagrange tension = 0.2 min_x = 15.0 max_x = 225.0 min_y = 15.0 max_y = 225.0 ======================= Extruder max_extrude_ratio=2.078758 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' webhooks client 548428940432: New connection webhooks client 548428940432: 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-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' webhooks client 548428940432: Disconnected Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-233-g1374c701' Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' Start printer at Wed Jun 21 13:42:56 2023 (1687369376.9 20.5) ===== Config file ===== [stepper_x] step_pin = PC2 dir_pin = PB9 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA5 position_endstop = 0 position_max = 262 homing_speed = 50 [stepper_y] step_pin = PB8 dir_pin = PB7 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA6 position_endstop = 0 position_max = 250 homing_speed = 50 [stepper_z] step_pin = PB6 dir_pin = !PB5 enable_pin = !PC3 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 250 position_min = -5 [extruder] max_extrude_only_distance = 100.0 max_extrude_cross_section = 5.0 step_pin = PB4 dir_pin = !PB3 enable_pin = !PC3 microsteps = 16 rotation_distance = 8.064 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PA1 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = PC5 min_temp = 0 max_temp = 250 control = pid pid_kp = 31.739 pid_ki = 4.232 pid_kd = 59.510 [heater_bed] heater_pin = PA2 sensor_type = EPCOS 100K B57560G104F sensor_pin = PC4 min_temp = 0 max_temp = 130 control = pid pid_kp = 69.887 pid_ki = 1.383 pid_kd = 883.199 [fan] pin = PA0 [mcu] serial = /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 restart_method = command [mcu rpi] serial = /tmp/klipper_host_mcu [output_pin ledlight] pin = rpi:gpiochip0/gpio23 pwm = false value = 1 shutdown_value = 1 [gcode_macro TOGGLE_LIGHT] gcode = SET_PIN PIN=ledlight VALUE={(not printer['output_pin ledlight'].value)|int} [output_pin relay2] pin = rpi:gpiochip0/gpio24 pwm = false value = 1 shutdown_value = 1 [gcode_macro relay2] gcode = SET_PIN PIN=relay2 VALUE={(not printer['output_pin relay2'].value)|int} [printer] kinematics = cartesian max_velocity = 300 max_accel = 3000 max_z_velocity = 5 max_z_accel = 100 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes [display_status] [pause_resume] [exclude_object] [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = False 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 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'] %} {% 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}} %} {% 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]" % 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': park.coord.x, 'y': park.coord.y, 'z': [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min} %} {% 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 X{pos.x} Y{pos.y} Z{pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [gcode_macro G29] gcode = BED_MESH_CALIBRATE [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} [gcode_macro CANCEL_PRINT] description = "Cancel the running print" rename_existing = CANCEL_PRINT_BASE gcode = M117 Canceling Print... M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 M117 CANCEL_PRINT_BASE [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT variable_extrude = 1.0 gcode = {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} [bltouch] sensor_pin = ^PB1 control_pin = PB0 x_offset = -35.5 y_offset = 0 stow_on_each_sample = False probe_with_touch_mode = True z_offset = 2.900 [safe_z_home] home_xy_position = 160.5,117.5 z_hop = 10 z_hop_speed = 5 [bed_mesh] speed = 120 horizontal_move_z = 5 mesh_min = 15, 15 mesh_max = 225, 225 probe_count = 7,7 algorithm = bicubic fade_start = 1 fade_end = 10 fade_target = 0 [screws_tilt_adjust] screw1 = 77.1,40 screw1_name = front left screw screw2 = 247,40 screw2_name = front right screw screw3 = 247,210 screw3_name = rear right screw screw4 = 77.1,210 screw4_name = rear left screw horizontal_move_z = 10 speed = 50 screw_thread = CW-M4 [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 LOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E80 F350 G92 E0.0 M82 [gcode_macro UNLOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E-80 F350 G92 E0.0 M82 [gcode_macro _pause_inner_m700] gcode = {% set extruder = "extruder" ~ params.T|replace('0', '') if "T" in params else printer.toolhead.extruder %} {% if extruder != printer.toolhead.extruder%} ACTIVATE_EXTRUDER EXTRUDER={extruder} {% endif %} {% set z_param = (' Z="%f"' % params.Z) if 'Z' in params else "" %} {% if printer.idle_timeout.state|string == "Printing" %} PAUSE P=2{z_param} {% elif not printer.pause_resume.is_paused%} SET_GCODE_VARIABLE MACRO=_load_unload VARIABLE=is_printing VALUE="{0}" PARK P=2{z_param} {% endif %} [gcode_macro M701] description = Pauses/parks the toolhead then loads filament to the extruder. Usage: M701 [L] [Z] [T] gcode = {% if 'U' in params %} {% if not 'L' in params %} RESPOND TYPE=error MSG="Argument \"U\" substituted for missing \"L\"." {% set dummy = params.__setitem__("L", params.U) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"U\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} LOAD_FILAMENT LENGTH={ params.L|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro M702] description = Pauses/parks the toolhead then unloads filament from the extruder. Usage: M702 [U] [Z] [T] gcode = {% if 'L' in params %} {% if not 'U' in params %} RESPOND TYPE=error MSG="Argument \"L\" substituted for missing \"U\"." {% set dummy = params.__setitem__("U", params.L) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"L\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} UNLOAD_FILAMENT LENGTH={ params.U|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro PRINT_START] variable_parameter_area_start = 0,0 variable_parameter_area_end = 0,0 gcode = {% set BED_TEMP = params.BED_TEMP|default(60)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(210)|float %} M104 S150 M117 Heating bed... M190 S{BED_TEMP} M117 Homing... G28 M117 Calibrating mesh... . . SETUP_KAMP_MESHING DISPLAY_PARAMETERS=1 LED_ENABLE=0 FUZZ_ENABLE=1 SETUP_LINE_PURGE DISPLAY_PARAMETERS=1 ADAPTIVE_ENABLE=1 . . BED_MESH_CLEAR BED_MESH_CALIBRATE M117 Heating Extruder... M109 S{EXTRUDER_TEMP} G92 E0 LINE_PURGE G90 SET_GCODE_OFFSET Z=0.0 M117 [gcode_macro END_PRINT] gcode = M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 [firmware_retraction] retract_length = 0.4 retract_speed = 40 unretract_speed = 40 [bed_mesh default] version = 1 points = 0.275000, 0.202500, 0.125000, 0.132500, 0.210000 0.145000, 0.102500, 0.047500, 0.060000, 0.100000 0.075000, 0.052500, -0.007500, 0.022500, 0.047500 0.145000, 0.095000, 0.050000, 0.060000, 0.075000 0.222500, 0.155000, 0.105000, 0.135000, 0.180000 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = lagrange tension = 0.2 min_x = 15.0 max_x = 225.0 min_y = 15.0 max_y = 225.0 ======================= Extruder max_extrude_ratio=2.078758 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' webhooks client 548520345072: New connection webhooks client 548520345072: 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-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 798, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/pi/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/pi/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/pi/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/pi/klipper/klippy/../.config(692): Sun Feb 12 21:05:47 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 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set CONFIG_MACH_LINUX=y # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="linux" CONFIG_CLOCK_FREQ=50000000 CONFIG_LINUX_SELECT=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_CANBUS_FREQUENCY=500000 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_GPIO_BITBANGING=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(9215): Sun Feb 12 21:06:09 2023 Last MCU build version: v0.11.0-105-g1e7057e9 Last MCU build tools: gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2 Last MCU build config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Build file /home/pi/klipper/klippy/../out/klipper.elf(818112): Sun Feb 12 21:06:17 2023 Unable to issue reset command on MCU 'mcu' Unable to issue reset command on MCU 'rpi' webhooks client 548520345072: Disconnected Restarting printer Start printer at Wed Jun 21 13:50:11 2023 (1687369811.2 426.0) ===== Config file ===== [stepper_x] step_pin = PC2 dir_pin = PB9 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA5 position_endstop = 0 position_max = 262 homing_speed = 50 [stepper_y] step_pin = PB8 dir_pin = PB7 enable_pin = !PC3 microsteps = 16 rotation_distance = 40 endstop_pin = ^PA6 position_endstop = 0 position_max = 250 homing_speed = 50 [stepper_z] step_pin = PB6 dir_pin = !PB5 enable_pin = !PC3 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 250 position_min = -5 [extruder] max_extrude_only_distance = 100.0 max_extrude_cross_section = 5.0 step_pin = PB4 dir_pin = !PB3 enable_pin = !PC3 microsteps = 16 rotation_distance = 8.064 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = PA1 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = PC5 min_temp = 0 max_temp = 250 control = pid pid_kp = 31.739 pid_ki = 4.232 pid_kd = 59.510 [heater_bed] heater_pin = PA2 sensor_type = EPCOS 100K B57560G104F sensor_pin = PC4 min_temp = 0 max_temp = 130 control = pid pid_kp = 69.887 pid_ki = 1.383 pid_kd = 883.199 [fan] pin = PA0 [mcu] serial = /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 restart_method = command [mcu rpi] serial = /tmp/klipper_host_mcu [output_pin ledlight] pin = rpi:gpiochip0/gpio23 pwm = false value = 1 shutdown_value = 1 [gcode_macro TOGGLE_LIGHT] gcode = SET_PIN PIN=ledlight VALUE={(not printer['output_pin ledlight'].value)|int} [output_pin relay2] pin = rpi:gpiochip0/gpio24 pwm = false value = 1 shutdown_value = 1 [gcode_macro relay2] gcode = SET_PIN PIN=relay2 VALUE={(not printer['output_pin relay2'].value)|int} [printer] kinematics = cartesian max_velocity = 300 max_accel = 3000 max_z_velocity = 5 max_z_accel = 100 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes [display_status] [pause_resume] [exclude_object] [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE variable_led_enable = False variable_status_macro = 'status_meshing' variable_fuzz_enable = False 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 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'] %} {% 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}} %} {% 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]" % 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': park.coord.x, 'y': park.coord.y, 'z': [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min} %} {% 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 X{pos.x} Y{pos.y} Z{pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [gcode_macro G29] gcode = BED_MESH_CALIBRATE [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} [gcode_macro CANCEL_PRINT] description = "Cancel the running print" rename_existing = CANCEL_PRINT_BASE gcode = M117 Canceling Print... M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 M117 CANCEL_PRINT_BASE [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT variable_extrude = 1.0 gcode = {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} [bltouch] sensor_pin = ^PB1 control_pin = PB0 x_offset = -35.5 y_offset = 0 stow_on_each_sample = False probe_with_touch_mode = True z_offset = 2.900 [safe_z_home] home_xy_position = 160.5,117.5 z_hop = 10 z_hop_speed = 5 [bed_mesh] speed = 120 horizontal_move_z = 5 mesh_min = 15, 15 mesh_max = 225, 225 probe_count = 7,7 algorithm = bicubic fade_start = 1 fade_end = 10 fade_target = 0 [screws_tilt_adjust] screw1 = 77.1,40 screw1_name = front left screw screw2 = 247,40 screw2_name = front right screw screw3 = 247,210 screw3_name = rear right screw screw4 = 77.1,210 screw4_name = rear left screw horizontal_move_z = 10 speed = 50 screw_thread = CW-M4 [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 LOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E80 F350 G92 E0.0 M82 [gcode_macro UNLOAD_FILAMENT] gcode = M109 S210 M83 G92 E0.0 G1 E-80 F350 G92 E0.0 M82 [gcode_macro _pause_inner_m700] gcode = {% set extruder = "extruder" ~ params.T|replace('0', '') if "T" in params else printer.toolhead.extruder %} {% if extruder != printer.toolhead.extruder%} ACTIVATE_EXTRUDER EXTRUDER={extruder} {% endif %} {% set z_param = (' Z="%f"' % params.Z) if 'Z' in params else "" %} {% if printer.idle_timeout.state|string == "Printing" %} PAUSE P=2{z_param} {% elif not printer.pause_resume.is_paused%} SET_GCODE_VARIABLE MACRO=_load_unload VARIABLE=is_printing VALUE="{0}" PARK P=2{z_param} {% endif %} [gcode_macro M701] description = Pauses/parks the toolhead then loads filament to the extruder. Usage: M701 [L] [Z] [T] gcode = {% if 'U' in params %} {% if not 'L' in params %} RESPOND TYPE=error MSG="Argument \"U\" substituted for missing \"L\"." {% set dummy = params.__setitem__("L", params.U) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"U\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} LOAD_FILAMENT LENGTH={ params.L|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro M702] description = Pauses/parks the toolhead then unloads filament from the extruder. Usage: M702 [U] [Z] [T] gcode = {% if 'L' in params %} {% if not 'U' in params %} RESPOND TYPE=error MSG="Argument \"L\" substituted for missing \"U\"." {% set dummy = params.__setitem__("U", params.L) %} {% else %} RESPOND TYPE=error MSG="Invalid argument \"L\" ignored." {% endif %} {% endif %} _PAUSE_INNER_M700 {% for k in params %}{' '~k~'="'~params[k]~'"'}{% endfor %} UNLOAD_FILAMENT LENGTH={ params.U|default(printer["gcode_macro _km_globals"].load_length)|float} [gcode_macro PRINT_START] variable_parameter_area_start = 0,0 variable_parameter_area_end = 0,0 gcode = {% set BED_TEMP = params.BED_TEMP|default(60)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(210)|float %} M104 S150 M117 Heating bed... M190 S{BED_TEMP} M117 Homing... G28 M117 Calibrating mesh... . . SETUP_KAMP_MESHING DISPLAY_PARAMETERS=1 LED_ENABLE=0 FUZZ_ENABLE=1 SETUP_LINE_PURGE DISPLAY_PARAMETERS=1 ADAPTIVE_ENABLE=1 . . BED_MESH_CLEAR BED_MESH_CALIBRATE M117 Heating Extruder... M109 S{EXTRUDER_TEMP} G92 E0 LINE_PURGE G90 SET_GCODE_OFFSET Z=0.0 M117 [gcode_macro END_PRINT] gcode = M140 S0 M104 S0 M106 S0 G91 G1 Z10 F3000 G90 G1 X5 Y225 E-3 F3000 M84 [firmware_retraction] retract_length = 0.4 retract_speed = 40 unretract_speed = 40 [bed_mesh default] version = 1 points = 0.275000, 0.202500, 0.125000, 0.132500, 0.210000 0.145000, 0.102500, 0.047500, 0.060000, 0.100000 0.075000, 0.052500, -0.007500, 0.022500, 0.047500 0.145000, 0.095000, 0.050000, 0.060000, 0.075000 0.222500, 0.155000, 0.105000, 0.135000, 0.180000 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = lagrange tension = 0.2 min_x = 15.0 max_x = 225.0 min_y = 15.0 max_y = 225.0 ======================= Extruder max_extrude_ratio=2.078758 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' webhooks client 548519412928: New connection webhooks client 548519412928: 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-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0' MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 798, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/pi/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/pi/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/pi/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/pi/klipper/klippy/../.config(692): Sun Feb 12 21:05:47 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 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set CONFIG_MACH_LINUX=y # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="linux" CONFIG_CLOCK_FREQ=50000000 CONFIG_LINUX_SELECT=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_CANBUS_FREQUENCY=500000 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_GPIO_BITBANGING=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(9215): Sun Feb 12 21:06:09 2023 Last MCU build version: v0.11.0-105-g1e7057e9 Last MCU build tools: gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2 Last MCU build config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Build file /home/pi/klipper/klippy/../out/klipper.elf(818112): Sun Feb 12 21:06:17 2023