Thanks @blalor and @mwu for this script! I’ve wanted a way to do this so badly I hacked up klippy to do it: Add MAX_SLOPE capability to TEMPERATURE_WAIT by garethky · Pull Request #4796 · Klipper3d/klipper · GitHub But I gave up on getting the PR merged because Kevin has not so much time for this kind of thing. Bit I still wanted this functionality!
My version of the script is here: klipper-voron2.4-config/printer_data/config/heatsoak.cfg at mainline · garethky/klipper-voron2.4-config · GitHub
It uses a second temperature sensor and stops the heat soak when the rate of temperature change on that sensor drops below a target. I have the default set to a rate of change of less than 0.75 degrees C per minute. This means that if the bed is already hot the soak time will be shorter. You call it like this:
HEAT_SOAK HEATER='heater_bed' TARGET=100 SOAKER='temperature_sensor top_bed' RATE=0.75
You also have to split your print start script where you call HEAT_SOAK. The call to PAUSE will not stop the print start script from running, it just stops the next line of GCode in the file being printed from running. So now I have:
PRINT_PREPARE [...] ; ends with a call to HEAT_SOAK
PRINT_START [...] ; does mesh bed leveling after heat soak
The only real gap now is that we cant configure a smooth_time
on temperature sensors so the data we get from the sensor is noisy. I might do something about that but honestly this is working fine for my needs.