From bc10d38b4879b96954373c67523d5cfba5b7fd26 Mon Sep 17 00:00:00 2001 From: Tom Glastonbury Date: Tue, 3 Mar 2026 23:46:01 +0000 Subject: [PATCH 1/4] fix(heatsoaking): for heatsoaking helper macros, make the source of default values configurable - accommodates different workflow preferences --- configuration/macros/heatsoaking.cfg | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/configuration/macros/heatsoaking.cfg b/configuration/macros/heatsoaking.cfg index 932ca65f3..d048c74be 100644 --- a/configuration/macros/heatsoaking.cfg +++ b/configuration/macros/heatsoaking.cfg @@ -33,13 +33,20 @@ gcode: {% if settings is not defined %} { action_raise_error("No settings found for [gcode_macro RatOS]") } {% endif %} + {% set defsrc = params.DEFAULT|default(printer["gcode_macro HEATSOAK_SETTINGS"].default_source)|lower %} + {% set current = printer["gcode_macro RatOS"] %} + {% if not defsrc in ('startup', 'current') %} + { action_raise_error("DEFAULT must be either 'startup' or 'current'.") } + {% endif %} + {% set default_quality = (settings.variable_beacon_adaptive_heat_soak_layer_quality if defsrc == 'startup' else current.beacon_adaptive_heat_soak_layer_quality)|default(3)|int %} + {% set default_first_layer_duration_secs = (settings.variable_beacon_adaptive_heat_soak_maximum_first_layer_duration if defsrc == 'startup' else current.beacon_adaptive_heat_soak_maximum_first_layer_duration)|default(1800)|int %} {% if params.QUALITY is defined %} {% set quality = params.QUALITY|int %} {% if quality < 1 or quality > 5 %} { action_raise_error("QUALITY must be between 1 (rough) and 5 (maximum). Use 3 (normal) if unsure.") } {% endif %} {% else %} - {% set quality = settings.variable_beacon_adaptive_heat_soak_layer_quality|default(3)|int %} + {% set quality = default_quality %} {% endif %} {% if params.FIRST_LAYER_DURATION is defined %} {% set first_layer_duration_mins = params.FIRST_LAYER_DURATION|float %} @@ -48,8 +55,8 @@ gcode: {% endif %} {% set first_layer_duration_secs = (first_layer_duration_mins * 60.0)|int %} {% else %} - {% set first_layer_duration_secs = settings.variable_beacon_adaptive_heat_soak_maximum_first_layer_duration|default(1800)|int %} - {% set first_layer_duration_mins = (first_layer_duration_secs / 60.0)|round(2) %} + {% set first_layer_duration_secs = default_first_layer_duration_secs %} + {% set first_layer_duration_mins = first_layer_duration_secs / 60.0 %} {% endif %} HEATSOAK_SETTINGS QUIET=1 beacon_adaptive_heat_soak=True beacon_adaptive_heat_soak_layer_quality={quality} beacon_adaptive_heat_soak_maximum_first_layer_duration={first_layer_duration_secs} RATOS_ECHO MSG="Will use adaptive bed heatsoak with quality {quality} and maximum first layer duration of {"%.2g"|format(first_layer_duration_mins)} minutes." @@ -62,6 +69,12 @@ gcode: {% if settings is not defined %} { action_raise_error("No settings found for [gcode_macro RatOS]") } {% endif %} + {% set defsrc = params.DEFAULT|default(printer["gcode_macro HEATSOAK_SETTINGS"].default_source)|lower %} + {% set current = printer["gcode_macro RatOS"] %} + {% if not defsrc in ('startup', 'current') %} + { action_raise_error("DEFAULT must be either 'startup' or 'current'.") } + {% endif %} + {% set default_duration = (settings.variable_bed_heat_soak_time if defsrc == 'startup' else current.bed_heat_soak_time)|default(0)|int %} {% if params.DURATION is defined %} {% set duration_mins = params.DURATION|float %} {% if duration_mins < 0 %} @@ -69,8 +82,8 @@ gcode: {% endif %} {% set duration_secs = (duration_mins * 60.0)|int %} {% else %} - {% set duration_secs = settings.variable_bed_heat_soak_time|default(0)|int %} - {% set duration_mins = (duration_secs / 60.0)|round(2) %} + {% set duration_secs = default_duration %} + {% set duration_mins = duration_secs / 60.0 %} {% endif %} {% set has_beacon = printer.fastconfig.settings.beacon is defined %} {% if has_beacon %} @@ -93,6 +106,11 @@ gcode: description: Shows or adjusts heatsoak settings - With no arguments: shows current heatsoak settings, specify VERBOSE=1 for detailed output - With arguments: sets the specified settings. Use the full setting name without the variable_ prefix, e.g. bed_heat_soak_time=300 or beacon_adaptive_heat_soak_layer_quality=4. See printer.cfg for available settings. +variable_default_source: "startup" + # "startup" or "current", determines where default values are taken from when using the USE_ADAPTIVE_HEATSOAK and + # USE_FIXED_HEATSOAK commands. This can be overridden per call using the DEFAULT parameter with those commands. + # "startup" will use the original printer.cfg values from when Klipper was started, while "current" + # will use the current values which may have been modified by previous commands. gcode: # Avoid unwanted param detection by mainsail: uses of params2 won't be noticed. {% set params2 = params %} From 2dcac0f8f8459d3f5a7c31c66193d23e7b1d0e9e Mon Sep 17 00:00:00 2001 From: Tom Glastonbury Date: Tue, 3 Mar 2026 23:46:49 +0000 Subject: [PATCH 2/4] fix(heatsoaking): add sanity check clipping of large duration values in helper macros --- configuration/macros/heatsoaking.cfg | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/configuration/macros/heatsoaking.cfg b/configuration/macros/heatsoaking.cfg index d048c74be..42e05ad24 100644 --- a/configuration/macros/heatsoaking.cfg +++ b/configuration/macros/heatsoaking.cfg @@ -53,6 +53,10 @@ gcode: {% if first_layer_duration_mins <= 0 %} { action_raise_error("FIRST_LAYER_DURATION must be a positive number specifying the maximum first layer duration in minutes.") } {% endif %} + {% if first_layer_duration_mins > 120 %} + CONSOLE_ECHO MSG="FIRST_LAYER_DURATION will be limited to 120 minutes. Values larger than this will not have an effect on soak time." + {% set first_layer_duration_mins = 120 %} + {% endif %} {% set first_layer_duration_secs = (first_layer_duration_mins * 60.0)|int %} {% else %} {% set first_layer_duration_secs = default_first_layer_duration_secs %} @@ -80,6 +84,10 @@ gcode: {% if duration_mins < 0 %} { action_raise_error("DURATION must be a non-negative number specifying the heatsoak duration in minutes.") } {% endif %} + {% if duration_mins > 720 %} + CONSOLE_ECHO MSG="DURATION will be limited to 720 minutes (6 hours). If you really need a larger value, adjust printer.cfg instead." + {% set duration_mins = 720 %} + {% endif %} {% set duration_secs = (duration_mins * 60.0)|int %} {% else %} {% set duration_secs = default_duration %} From 2b623d50b4933dbe51f62b5bb1dbffda69c94c9c Mon Sep 17 00:00:00 2001 From: Tom Glastonbury Date: Tue, 3 Mar 2026 23:47:30 +0000 Subject: [PATCH 3/4] fix(heatsoaking): improve number formatting --- configuration/macros/heatsoaking.cfg | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/configuration/macros/heatsoaking.cfg b/configuration/macros/heatsoaking.cfg index 42e05ad24..e3515ff08 100644 --- a/configuration/macros/heatsoaking.cfg +++ b/configuration/macros/heatsoaking.cfg @@ -63,7 +63,7 @@ gcode: {% set first_layer_duration_mins = first_layer_duration_secs / 60.0 %} {% endif %} HEATSOAK_SETTINGS QUIET=1 beacon_adaptive_heat_soak=True beacon_adaptive_heat_soak_layer_quality={quality} beacon_adaptive_heat_soak_maximum_first_layer_duration={first_layer_duration_secs} - RATOS_ECHO MSG="Will use adaptive bed heatsoak with quality {quality} and maximum first layer duration of {"%.2g"|format(first_layer_duration_mins)} minutes." + RATOS_ECHO MSG="Will use adaptive bed heatsoak with quality {quality} and maximum first layer duration of {first_layer_duration_mins|int if (first_layer_duration_mins|float).is_integer() else first_layer_duration_mins|round(2)} minutes." [gcode_macro USE_FIXED_HEATSOAK] description: Temporarily enables fixed bed heatsoaking, will reset to printer.cfg settings when Klipper is restarted. @@ -102,7 +102,7 @@ gcode: {% if duration_mins < 1e-3 %} RATOS_ECHO MSG="Will use no bed heatsoak." {% else %} - RATOS_ECHO MSG="Will use fixed-duration bed heatsoak of {"%.2g"|format(duration_mins)} minutes." + RATOS_ECHO MSG="Will use fixed-duration bed heatsoak of {duration_mins|int if (duration_mins|float).is_integer() else duration_mins|round(2)} minutes." {% endif %} [gcode_macro USE_NO_HEATSOAK] @@ -165,11 +165,11 @@ gcode: {% if is_adaptive %} {% set quality = current.beacon_adaptive_heat_soak_layer_quality|default(3)|int %} {% set first_layer_duration_secs = current.beacon_adaptive_heat_soak_maximum_first_layer_duration|default(1800)|int %} - {% set first_layer_duration_mins = (first_layer_duration_secs / 60.0)|round(2) %} - RATOS_ECHO MSG="Will use adaptive bed heatsoak with quality {quality} and maximum first layer duration of {"%.2g"|format(first_layer_duration_mins)} minutes." + {% set first_layer_duration_mins = first_layer_duration_secs / 60.0 %} + RATOS_ECHO MSG="Will use adaptive bed heatsoak with quality {quality} and maximum first layer duration of {first_layer_duration_mins|int if (first_layer_duration_mins|float).is_integer() else first_layer_duration_mins|round(2)} minutes." {% elif current.bed_heat_soak_time|default(0)|int > 0 %} - {% set duration_mins = (current.bed_heat_soak_time|int / 60.0)|round(2) %} - RATOS_ECHO MSG="Will use fixed-duration bed heatsoak of {"%.2g"|format(duration_mins)} minutes." + {% set duration_mins = (current.bed_heat_soak_time|int / 60.0) %} + RATOS_ECHO MSG="Will use fixed-duration bed heatsoak of {duration_mins|int if (duration_mins|float).is_integer() else duration_mins|round(2)} minutes." {% else %} RATOS_ECHO MSG="Will use no bed heatsoak." {% endif %} From 0a7ddbd03d697d01388eb4b9a0dd4265668b10d7 Mon Sep 17 00:00:00 2001 From: Tom Glastonbury Date: Wed, 4 Mar 2026 00:15:22 +0000 Subject: [PATCH 4/4] chore: fix typo --- configuration/macros/heatsoaking.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration/macros/heatsoaking.cfg b/configuration/macros/heatsoaking.cfg index e3515ff08..5d292f77b 100644 --- a/configuration/macros/heatsoaking.cfg +++ b/configuration/macros/heatsoaking.cfg @@ -85,7 +85,7 @@ gcode: { action_raise_error("DURATION must be a non-negative number specifying the heatsoak duration in minutes.") } {% endif %} {% if duration_mins > 720 %} - CONSOLE_ECHO MSG="DURATION will be limited to 720 minutes (6 hours). If you really need a larger value, adjust printer.cfg instead." + CONSOLE_ECHO MSG="DURATION will be limited to 720 minutes (12 hours). If you really need a larger value, adjust printer.cfg instead." {% set duration_mins = 720 %} {% endif %} {% set duration_secs = (duration_mins * 60.0)|int %}