Files
mangavalkandClaude Opus 5.5 eaf9c82617 Group macros by topic, add Blobifier, fix first tool change
- Split the macro files into folders by topic (print, heating, afc,
  pressure_advance, spoolman, leds, sensors); klipper-macros.cfg is the
  one file printer.cfg includes. Macros moved unchanged; the effective
  config is identical apart from the paths of the PA shell scripts.
- Add the modified Blobifier (Turtleblobifier for AFC) and define
  [save_variables] once in save_variables.cfg instead of in both
  blobifier.cfg and the PA macros (same file, bd_pa_variables.cfg).
- PRINT_WARMUP: heat to the loaded lane's temperature before the first
  tool change. AFC skips heating when the loaded lane's tool number is
  not in the print file's temperature list, and the unload then failed
  below min_extrude_temp.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 14:24:37 +02:00

174 lines
5.0 KiB
INI

# Bed fans driven by the bed heater (based on Ellis' bed fan macros)
############### Config options ##################
[gcode_macro _BEDFANVARS]
variable_threshold: 50 # If bed temp target is above this threshold, fans will be enabled. If temp is set to below this threshold, fans will be disabled.
variable_fast: 1.0 # Fan speed once bed temp is reached
variable_slow: 0.5 # Fan speed while bed is heating
variable_cooldown_temp: 40 # NEW: fans stop below this temp
gcode:
########## Aliases #########
[gcode_macro BEDFANSSLOW]
gcode:
# Vars
{% set SLOW = printer["gcode_macro _BEDFANVARS"].slow|float %}
SET_FAN_SPEED FAN=BedFans SPEED={SLOW}
[gcode_macro BEDFANSFAST]
gcode:
# Vars
{% set FAST = printer["gcode_macro _BEDFANVARS"].fast|float %}
SET_FAN_SPEED FAN=BedFans SPEED={FAST}
[gcode_macro BEDFANSOFF]
gcode:
SET_FAN_SPEED FAN=BedFans SPEED=0
############ Command overrides ############
# Override, set fan speeds to low and start monitoring loop.
[gcode_macro SET_HEATER_TEMPERATURE]
rename_existing: _SET_HEATER_TEMPERATURE
gcode:
# Parameters
{% set HEATER = params.HEATER|default("None") %}
{% set TARGET = params.TARGET|default(0)|int %}
# Vars
{% set THRESHOLD = printer["gcode_macro _BEDFANVARS"].threshold|int %}
{% set COOLDOWN = printer["gcode_macro _BEDFANVARS"].cooldown_temp|int %}
{% if HEATER|lower == "extruder" %}
M104 S{TARGET}
# {% elif HEATER|lower == "iHeater_H" %}
# _SET_HEATER_TEMPERATURE {rawparams}
{% elif HEATER|lower == "heater_bed" %}
M99140 S{TARGET}
# Always cancel cooldown loop first (prevents overlap)
UPDATE_DELAYED_GCODE ID=bedfancooldown DURATION=0
# --- NEW LOGIC BLOCK ---
{% if TARGET == 0 %}
# Bed turning off → start cooldown behavior
{% if printer.heater_bed.temperature|int > COOLDOWN %}
BEDFANSSLOW
UPDATE_DELAYED_GCODE ID=bedfancooldown DURATION=5
{% else %}
BEDFANSOFF
{% endif %}
# Stop normal heating loop if running
UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=0
{% elif TARGET >= THRESHOLD %}
# Heating above threshold
BEDFANSSLOW
UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=1
{% else %}
# Low temp request
BEDFANSOFF
UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=0
{% endif %}
# --- END NEW LOGIC ---
{% else %}
# {action_respond_info("(Bedfans macro)Heater %s not supported (trying classic _SET_HEATER_TEMPERATURE)" % HEATER)}
_SET_HEATER_TEMPERATURE {rawparams}
{% endif %}
# Override M190 (Wait for Bed Temperature)
# As a bonus, use TEMPERATURE_WAIT so we don't have to wait for PID to level off.
[gcode_macro M190]
rename_existing: M99190
gcode:
# Parameters
{% set S = params.S|int %}
# Vars
{% set THRESHOLD = printer["gcode_macro _BEDFANVARS"].threshold|int %}
{% if S >= THRESHOLD %}
BEDFANSSLOW # >= Threshold temp: Low speed fans while heating
{% else %}
BEDFANSOFF # < Threshold temp: Turn bed fans off
{% endif %}
M140 {% for p in params
%}{'%s%s' % (p, params[p])}{%
endfor %} # Set bed temp
{% if S != 0 %}
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={S|int} MAXIMUM={S|int + 5} # Wait for bed temp within 5 degrees
{% endif %}
# Post-heating fan speeds
{% if S >= THRESHOLD %}
BEDFANSFAST # >= Threshold temp: Higher speed fans after heating finished
{% endif %}
# Replace M140 (Set Bed Temperature) to just be an alias of SET_HEATER_TEMPERATURE (which has associated bed fan logic if enabled)
[gcode_macro M140]
rename_existing: M99140
gcode:
# Parameters
{% set S = params.S|float %}
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={S}
# Replace TURN_OFF_HEATERS
# [gcode_macro TURN_OFF_HEATERS]
# rename_existing: _TURN_OFF_HEATERS
# gcode:
# BEDFANSOFF
# _TURN_OFF_HEATERS
[gcode_macro TURN_OFF_HEATERS]
rename_existing: _TURN_OFF_HEATERS
gcode:
# Vars
{% set COOLDOWN = printer["gcode_macro _BEDFANVARS"].cooldown_temp|int %}
# Only keep fans running if bed is still hot
{% if printer.heater_bed.temperature|int > COOLDOWN %}
BEDFANSSLOW
UPDATE_DELAYED_GCODE ID=bedfancooldown DURATION=5
{% else %}
BEDFANSOFF
{% endif %}
_TURN_OFF_HEATERS
################ Monitoring loop #####################
# Turns bed fans to "fast" speed once target bed temp is reached.
[delayed_gcode bedfanloop]
gcode:
# Vars
{% set THRESHOLD = printer["gcode_macro _BEDFANVARS"].threshold|int %}
{% if printer.heater_bed.target >= THRESHOLD %} # Continue only if target temp greater than threshold.
{% if printer.heater_bed.temperature|int >= (printer.heater_bed.target|int - 1) %}
BEDFANSFAST # If within 1 degree of target temp: Higher speed fans
{% else %}
UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=5 # If temp not reached yet: loop again
{% endif %}
{% endif %}
[delayed_gcode bedfancooldown]
gcode:
# Vars
{% set COOLDOWN = printer["gcode_macro _BEDFANVARS"].cooldown_temp|int %}
{% if printer.heater_bed.temperature|int > COOLDOWN %}
BEDFANSSLOW
UPDATE_DELAYED_GCODE ID=bedfancooldown DURATION=10
{% else %}
BEDFANSOFF
{% endif %}