Jump to content

Heat soaking and when is it ready


bdejong11129

Recommended Posts

I am back into a project that requires a ton of ASA printing.  So I am also back to having to heat up and soak my printer so it is ready.  Lessons learned her are the obvious but bear repeating since I keep forgetting these lessons. 

  1. DO NOT do QGL with a cold bed. Changes quite a bit as it heats up.
  2. Printers will timeout and turn off the bed heaters BEFORE its stable. real PITA if you ask me. 
  3. I have not automated this process and there is my question.

 

So, I want to be able to, by manual means, figure out the timing from cold to ready to print ABS/ASA materials successfully.  I have a means to check chamber temperature and the sweet spot for me is @101F.  Not bed temp, but ambient temp in the enclosed area.  My issue is that it takes more than the timeout of the printer and I get busy and forget and therefore when I check in the bed temp is falling and I have to click on things to get it back heating up. 

What I would like is a printer startup routine that keeps it alive, heats the bed for (n) time and then executes homing, QGL and then keeps the thing awake for up to (n) hours.  The last part is for safety, but it should be several hours before it shuts down.  I mean, they print for days at temp s it should be able to wait.  

What is the communities process for the initial start up and pre conditioning for printing materials that need hot chambers?

 

Thanks in advance for the input. 

 

Link to comment
Share on other sites

You should be able to achieve this by changing the idle timeout value in your printer.cfg file:

[idle_timeout]
timeout: 1800 # Idle time in seconds to wait before running the G-Code commands

Change this to 7200 as an example, and the printer should stay active for 2 hours

  • Like 1
Link to comment
Share on other sites

I put the request into AI and got the following:

To prevent the printer from timing out even after the bed has reached the target temperature, you can keep sending periodic temperature reports (M105) or messages (M117) at intervals. This approach keeps Klipper’s idle timeout from triggering while waiting for further actions — such as manual start or user confirmation.

Here’s the macro that:

  1. Heats the bed.

  2. Waits until the target temperature is reached.

  3. Keeps the printer “alive” indefinitely after the target is reached by periodically sending temperature or status updates (you can break this loop manually or through another macro/event).

[gcode_macro HEAT_BED_AND_HOLD_NO_TIMEOUT]
description: "Heat bed to target temp, wait, and prevent timeout after"
gcode:
    {% set BED_TEMP = params.BED_TEMP|default(110)|float %}
    M117 Heating bed to {BED_TEMP}°C
    M140 S{BED_TEMP}

    # Wait for bed to reach temperature
    {% while printer.heater_bed.temperature < BED_TEMP - 1 %}
        G4 P5000  ; wait 5 seconds
        M117 Heating bed... {printer.heater_bed.temperature|int}°C / {BED_TEMP}°C
    {% endwhile %}

    M117 Bed reached {BED_TEMP}°C - Holding...

    # Keep-alive loop
    {% set counter = 0 %}
    {% loop %}
        G4 P10000  ; 10-second pause
        M105       ; send temperature to keep connection alive
        {% set counter = counter + 10 %}
        M117 Holding at {BED_TEMP}°C - {counter}s elapsed
    {% endloop %}

 

  • Like 3
Link to comment
Share on other sites

I don't think any single temperature reading will tell you when the printer is ready. It's a question of equilibrating to a stable state. Different components are exposed to different amounts of heat, and they expand differently depending on the materials they're made of, their shape, air currents, ambient chamber temperature, etc. If you have access to a thermal camera, it might be interesting to just watch the process and see.

Barring that, it's an asymptotic process, so every additional 5 minutes of heat soak makes less and less of a difference. Somewhere between 30 minutes and an hour is a good rule of thumb, but you can push that either way depending on how it works and your degree of perfectionism.

  • Like 2
Link to comment
Share on other sites

mvdveer

This is a good start.  Can you ask it to allow for a parameter how long to do this instead of infinite?  It would be nice to be able to configure it to do this for a specified number of minutes.  I may ask the same thing and see what solution it gives me.  Would you mind sharing your prompt?

Edited by bdejong11129
Link to comment
Share on other sites

2 hours ago, bdejong11129 said:

mvdveer

This is a good start.  Can you ask it to allow for a parameter how long to do this instead of infinite?  It would be nice to be able to configure it to do this for a specified number of minutes.  I may ask the same thing and see what solution it gives me.  Would you mind sharing your prompt?

I started with:

 

"write a klipper macro the heat bead and not timeout"

then added:

 

"change macro so printer does not time out once bed temperature is reached"

Should have posted the explanation after this as well:

image.thumb.png.719bd6d4d38e6eb3c8a7aad7e6023ac2.png

 

 

  • Like 1
Link to comment
Share on other sites

2 hours ago, bdejong11129 said:

Can you ask it to allow for a parameter how long to do this instead of infinite?

Added the following to the above prompts:

 

"Rather than infinite loop, incorporate option for time limit set by user"

And the result:

Great — adding a user-defined time limit is a cleaner solution than an infinite loop. Below is a revised macro that:

  • Heats the bed to the specified temperature.

  • Waits until the target is reached.

  • Then holds the bed at that temperature for a user-specified duration (in seconds) while preventing printer timeout.

  • After the time elapses, the macro ends — optionally turning off the bed if desired.

[gcode_macro HEAT_BED_AND_HOLD]
description: "Heat bed to target temperature and hold it for a user-defined time (in seconds) to prevent timeout"
gcode:
    {% set BED_TEMP = params.BED_TEMP|default(60)|float %}
    {% set HOLD_TIME = params.HOLD_TIME|default(300)|int %}  # in seconds
    M117 Heating bed to {BED_TEMP}°C
    M140 S{BED_TEMP}

    # Wait for bed to reach temperature
    {% while printer.heater_bed.temperature < BED_TEMP - 1 %}
        G4 P5000
        M117 Heating bed... {printer.heater_bed.temperature|int}°C / {BED_TEMP}°C
    {% endwhile %}

    M117 Bed reached {BED_TEMP}°C - Holding for {HOLD_TIME}s

    {% set elapsed = 0 %}
    {% while elapsed < HOLD_TIME %}
        G4 P10000  ; wait 10 seconds
        M105       ; temperature report keeps system alive
        {% set elapsed = elapsed + 10 %}
        M117 Holding... {elapsed}/{HOLD_TIME}s
    {% endwhile %}

    M117 Hold complete - Bed remains on

image.thumb.png.31605e8fac6b257e3838e4b403bd9d03.png

 

 

  • Like 1
Link to comment
Share on other sites

Excellent, thanks.  Interesting to see the different approaches AI takes.  After a few back and forth with the original prompt of 

"What I would like is a printer startup routine that keeps it alive, heats the bed for (n) time and then executes homing, QGL and then keeps the thing awake for up to (n) hours. The last part is for safety, but it should be several hours before it shuts down. I mean, they print for days at temp s it should be able to wait."

I ended up with this.  Most of the iterations were fixing AI's use of Python formatting when klipper cannot do that.   Nice enough is that when an error occurred, I posted the error and it fixed the underlying issue. 

I am testing this now, but seems to be working, with defaults, it sets 60 degrees, waits 5 minutes, does home and QGL and then waits. Working with AI to figure out how to cancel the operation via KlipperScreen.  Initial attempts were not successful.

[gcode_macro PREPARE_PRINTER]
description: "Heat bed, soak, home, QGL, and stay awake"
gcode:
    {% set bed_temp = params.BED_TEMP|default(60)|float %}
    {% set soak_minutes = params.SOAK_MINUTES|default(5)|int %}
    {% set awake_hours = params.AWAKE_HOURS|default(4)|int %}
    {% set soak_seconds = soak_minutes * 60 %}
    {% set awake_seconds = awake_hours * 3600 %}
    {% set temp_idle_timeout = 86400 %}

    M117 Starting printer prep...

    SET_IDLE_TIMEOUT TIMEOUT={temp_idle_timeout}
    M117 Waiting for bed to reach {bed_temp}C...
    SET_DISPLAY_TEXT MSG="Heating bed to reach temp..."
    M140 S{bed_temp}
    M117 Bed soak started...
    SET_DISPLAY_TEXT MSG="Starting bed soak.."
    
    {% for i in range(soak_seconds) %}
        {% set remaining = soak_seconds - i %}
        {% set mins = remaining // 60 %}
        {% set secs = remaining % 60 %}
        {% if mins < 10 %}
            {% set mins_str = "0" ~ mins %}
        {% else %}
            {% set mins_str = mins|string %}
        {% endif %}
        {% if secs < 10 %}
            {% set secs_str = "0" ~ secs %}
        {% else %}
            {% set secs_str = secs|string %}
        {% endif %}

        M117 Bed soak: {mins_str}:{secs_str} - Tap 'CANCEL' to stop
        SET_DISPLAY_TEXT MSG="Bed soak: {mins}m {secs}s remaining"
        RESPOND PREFIX="status" MSG="Bed soak: {mins}m {secs}s remaining"


        G4 P5000
    {% endfor %}

    M117 Homing printer...
    SET_DISPLAY_TEXT MSG="Soak Done, Homing.."
    RESPOND PREFIX="status" MSG="Soak Done, Homing.."
    G28

    M117 Running Quad Gantry Leveling...
    SET_DISPLAY_TEXT MSG="QGL."
    RESPOND PREFIX="status" MSG="QGL."
    QUAD_GANTRY_LEVEL

    M117 Prep complete. Staying awake for {awake_hours} hours...
    SET_DISPLAY_TEXT MSG="Prep complete, waiting"
    RESPOND PREFIX="status" MSG="Prep complete, waiting"
    SET_IDLE_TIMEOUT TIMEOUT={awake_seconds}

 

  • Like 2
Link to comment
Share on other sites

This is what I got when putting your macro in AI:

Thanks — now it’s clear you only want the bed soak portion to be skippable by the user, while the rest of the macro (homing, QGL, staying awake) continues regardless.

Because Klipper does not support conditional G-code logic based on button presses mid-macro, the workaround is to offer a timed opportunity to cancel the macro early and split the soak into short, cancellable steps. Here’s how:

✅ Revised Macro — 

Only the Soak is Cancellable

  • The soak loop is split into 1-second intervals (G4 P1000) so that Klipper checks for user cancellation between each step.

  • If the user presses “Cancel” during the soak, only the soak stops — the rest of the macro continues.

  • This is possible using a [gcode_macro] wrapper and a separate soak macro with CANCEL detection.

 

🔧 Step 1: Create a separate soak macro (optional but cleaner)

[gcode_macro SOAK_BED]
description: "Soak bed for specified seconds with cancel option"
gcode:
    {% set seconds = params.SECONDS|default(300)|int %}
    {% for i in range(seconds) %}
        {% set remaining = seconds - i %}
        {% set mins = remaining // 60 %}
        {% set secs = remaining % 60 %}

        M117 Bed soak: {{'%02d' % mins}}:{{'%02d' % secs}} - Tap CANCEL to skip
        SET_DISPLAY_TEXT MSG="Bed soak: {{mins}}m {{secs}}s remaining"
        RESPOND PREFIX="status" MSG="Bed soak: {{mins}}m {{secs}}s remaining"
        G4 P1000  ; short delay to allow cancel detection
    {% endfor %}

 

🔧 Step 2: Use it in your main macro

 

[gcode_macro PREPARE_PRINTER]
description: "Heat bed, soak (optional), home, QGL, and stay awake"
gcode:
    {% set bed_temp = params.BED_TEMP|default(60)|float %}
    {% set soak_minutes = params.SOAK_MINUTES|default(5)|int %}
    {% set awake_hours = params.AWAKE_HOURS|default(4)|int %}
    {% set soak_seconds = soak_minutes * 60 %}
    {% set awake_seconds = awake_hours * 3600 %}
    {% set temp_idle_timeout = 86400 %}

    M117 Starting printer prep...
    SET_IDLE_TIMEOUT TIMEOUT={temp_idle_timeout}

    M117 Waiting for bed to reach {bed_temp}C...
    SET_DISPLAY_TEXT MSG="Heating bed to {bed_temp}C"
    M140 S{bed_temp}

    M117 Starting soak (tap CANCEL to skip)...
    SET_DISPLAY_TEXT MSG="Starting bed soak.."
    RESPOND PREFIX="status" MSG="Soaking bed for {soak_minutes} min"

    # This part is cancellable — user can skip soak by cancelling here
    SOAK_BED SECONDS={soak_seconds}

    # From here on, macro continues no matter what
    M117 Homing printer...
    SET_DISPLAY_TEXT MSG="Soak done (or skipped). Homing..."
    RESPOND PREFIX="status" MSG="Homing printer..."
    G28

    M117 Running Quad Gantry Leveling...
    SET_DISPLAY_TEXT MSG="QGL..."
    RESPOND PREFIX="status" MSG="Running QGL..."
    QUAD_GANTRY_LEVEL

    M117 Prep complete. Staying awake for {awake_hours} hour(s)...
    SET_DISPLAY_TEXT MSG="Prep done. Staying awake."
    RESPOND PREFIX="status" MSG="Staying awake"
    SET_IDLE_TIMEOUT TIMEOUT={awake_seconds}

 

✅ Behavior Summary

Step

Can be Cancelled?

What Happens?

Heating bed

❌ No

Continues regardless

Bed soak

✅ Yes

Can be skipped by pressing CANCEL

Homing

❌ No

Always runs

QGL

❌ No

Always runs

Idle timeout

❌ No

Always applied

 

 

 

 

  • Like 1
Link to comment
Share on other sites

Interesting, what AI are you using?

I did attempt to get ChatGPT to work out a cancelable solution but that just didn't work out so I abandoned it and figured I could always reboot as this is something done at the start of the printing day.   Using 60c, and a 5 minute soak it performed as expected. Later today, after I get some sleep, I am going to run it with 105c and 45 minutes and expect it to perform as well.  I also need to wait for my AI credits to refresh to continue the chat. 

I would like it to respond to a cancel button on klipper screen.

Link to comment
Share on other sites

I approached this topic on my printer with the mindset that the heatsoak process would only and always be invoked for ABS & ASA; I found the following reddit post and adapted its concept to my needs:  https://github.com/rootiest/zippy-klipper_config/blob/master/macros/SET_MATERIAL.cfg

My Superslicer start G-code:

print_start FILAMENT=[filament_type] TOOL=[first_layer_temperature[initial_tool]] BED=[first_layer_bed_temperature]

my print_start macro: 

[gcode_macro PRINT_START]
gcode:
    {% set FILAMENT = params.FILAMENT|string %}
    {% set TOOL = params.TOOL|int %}
    {% set BED = params.BED|int %}
    RESPOND TYPE=echo MSG="Setting bed temp for alignment"
    M190 S{BED}
      {% if FILAMENT == 'ABS' or FILAMENT == 'ASA' %}
      HEATSOAK
    {% endif %}
   #home & level
    RESPOND TYPE=echo MSG="Starting Home & QGL"
    G32                            ; home all axes
    G90                            ; absolute positioning
   #filament & mesh & clear
    RESPOND TYPE=echo MSG="Setting filament type, adaptive mesh & tool temp"
    SKEW_PROFILE LOAD=calilantern_skew_profile
    SET_MATERIAL MATERIAL={FILAMENT}
    G1 Z20 F3000                   ; move nozzle away from bed
   #set print temps & wait
    M109 S{TOOL}
   #purge & wipe
    SET_FILAMENT_SENSOR SENSOR=filament_sensor ENABLE=1                   ; enable filament sensor
    SET_FILAMENT_SENSOR SENSOR=filament_switch ENABLE=1
    clean_nozzle
    G28
    #up & center
    G1 X175 Y175 Z20 F3000         ; move nozzle away from bed
   #GO!
    RESPOND TYPE=echo MSG="Starting print"

By using RESPOND type=echo, the message will be displayed both on the printer screen and with a timestamp in the printer console log.

I also have KAMP installed, which only builds a bed mesh under the printed object, so there's no point in storing bed profiles; the jump to the SET_MATERIAL macro does that bed mesh in addition to setting pressure advance and z offset 
 

the heatsoak macro could be for however long you need--mine is an hour:

[gcode_macro HEATSOAK]
gcode:
      RESPOND TYPE=echo MSG="Starting 1hr Heatsoak"
      G4 P3600000

I haven't had issues with idle timeout, so it stays set to the default 1800

My current filament sensor has both a switch and encoder wheel, and it isn't enabled until it is needed.

Link to comment
Share on other sites

My first question is what size is the printer?

My Trident 250 takes about 5 minutes to get the bed stabilized. From cold, it takes about 7-10 minutes to hit a suitable chamber temp to start printing. For me that's 30C, with the chamber getting up to low to mid 50's during printing. 

Link to comment
Share on other sites

My specific printers are both 350x350 V2.4.  I have had varying results in both QGL and Auto_Z depending on how long I soak the bed.  I am also looking at how tight my bed bolts are since on one of them when I preheat for ABS/ASA I can hear a distinct ping when it has been soaking for @5-10 minutes. 

Link to comment
Share on other sites

So this is what I ended up with for testing today.  Ran it on both printers, one which is printing ASA and the other printing PLA.  I did change the [respond] section in my Printer,cfg so that I could use M118 commands.  There is a space at the end of the second line. 

[respond]
default_type: echo
default_prefix: 

 

This is the main macro which I simply put in a .cfg file and included in my printer.cfg.  I added a material parameter so that from Mainsail I can change it. That will set the soak and temp based on what I am using at this time. 

[gcode_macro PREPARE_PRINTER]
description: "Heat bed, soak, home, QGL, and stay awake"
gcode:
    {% set bed_temp = params.BED_TEMP|default(105)|float %}
    {% set soak_minutes = params.SOAK_MINUTES|default(30)|int %}
    {% set awake_hours = params.AWAKE_HOURS|default(4)|int %}
    {% set soak_seconds = soak_minutes * 60 %}
    {% set awake_seconds = awake_hours * 3600 %}
    {% set temp_idle_timeout = 86400 %}
    {% set FILAMENT = params.FILAMENT|default('PLA')|string %}
    
    M118 Starting printer prep...
    {% if FILAMENT == 'ABS' or FILAMENT == 'ASA' %}
      {% set soak_minutes = 45 %}
      {% set bed_temp = 105 %}
    {% else %}
      {% set soak_minutes = 15 %}
      {% set bed_temp = 60 %}
    {% endif %}
    
    SET_IDLE_TIMEOUT TIMEOUT={temp_idle_timeout}
    M118 Waiting for bed to reach {bed_temp}C...
    M190 S{bed_temp}
    M118 Bed soak started...
    
    {% for i in range(soak_minutes) %}
        {% set remaining = soak_minutes - i %}
        {% set mins = remaining %}
        {% if mins < 10 %}
            {% set mins_str = "0" ~ mins %}
        {% else %}
            {% set mins_str = mins|string %}
        {% endif %}

        M118 Bed soak remaining: {mins_str}

        G4 P60000
    {% endfor %}

    M118 Homing printer...
    G28

    M118 Running Quad Gantry Leveling...
    QUAD_GANTRY_LEVEL

    M118 Prep complete. Staying awake for {awake_hours} hours...
    SET_IDLE_TIMEOUT TIMEOUT={awake_seconds}

This is meant to be run when I first fire them up for the day or anytime they are idle to the point of cooling off.

So far, for the PLA printer it worked perfect.  I got up, fired off the macro, had coffee, made some changes and the macro completed and kept the printer alive for long enough for me to send off a print.   Still waiting on the ASA printer to be ready for its first print. 

And this is independent on my Print_Start since its purpose is to get it ready so doesn't need to be part of that routine. 

Edited by bdejong11129
Link to comment
Share on other sites

A little off topic of the macro, but very important things to consider about preheat/heat soaking:

I have found the most critical part to success or failure of higher temperature parts is the first layer/bed adhesion. This comes down to the gantry itself warping as it heats up. It is made of different materials and they expand differently as they heat. (Note I have the single, large linear rail vs the two smaller ones, this helps a little). If you rely on the chamber temp for this you will be waiting a very long time, and it will be thrown off once you do your leveling and the gantry gets close to the heated bed.

The bed itself heats up and stabilizes very quickly so that isn't much of a concern.

My routine is to home XYZ, which then parks the too head centered and slightly above the bed (note I have a cartographer probe, and a 350mm printer). I turn on the bed heat to whatever it will be when printing and let it sit for about an hour. Typically I will see the temp sensors for the cartographer, extruder, and the tool head board all flatten out and stabilize which is my que that it is ready. Another giveaway for bed temps up around 100c is that the extruder fan will start cycling. If I am distracted with other stuff that usually lets me know it is ready.

Since the gantry has been low it not only heats up quickly but all of the critical parts are also at close to them same temp they will be when you do your z calibration routines and then start printing the first layer. You don't want to calibrate and then heat soak off to the side or way up in the air because as soon as the gantry starts absorbing the radiant bed heat it will deform. Deformation is inevitable and fine, you just want it to be consistent.

Finally I have found that calibrating the Z offset for each bed temperature I use is the last piece of the puzzle. I am not sure why this isn't automatically compensated for with the eddy current probe which makes me suspect is isn't necessarily a mechanical variance, but possibly the conductive properties of the materials are slightly changing or even the electronics of the probe behaving differently under higher temperatures and throwing it off. Or it could be the delta between the nozzle and sensing probe is different... or all of the above, but regardless, I have a different offset for say 50c and 100c and enter that in depending on what bed temp I am using.

 

This isn't quite a set and forget macro, but it has been working very well for me.

  • Like 1
Link to comment
Share on other sites

On my system I am using he Euclid probe and the Auto_Z plug in that sets my Z-Offset for every print.  It has been very reliable at finding a value that is very close and only occasionally do I need to do a small baby step at the start of a print. 

I am not having any bed adhesion issues right now but I did see some variability in the prints spread over the bed if QGL and the mesh were done on a bed that was not sufficiently heat soaked and stable.  This occurred at the start of a print day so that was my first clue that it was something to do with pre-conditioning.  I started to watch the time but since I am a scatter brain at times I would lose track of time and the printer would timeout and I had to start over.  This macro is there to help me with a process to start up the printer in a consistent manner. 

  • Like 1
Link to comment
Share on other sites

I've been running the hotend and part cooling fan while heat soaking. I run the hotend below where it will soften whatever plastic is to be extruded which can still be fairly hhot. Then I cool it down to (forget exact value) about 150C (or whatever is needed for the build plate to not get damaged) for leveling and re-homing, right before printing. Without running my auxiliary base heater it takes over an hour for  my printer to get truly thermally stable. My printer is insulated, but I run chamber quite a bit higher than you all do. The insulation does NOT reduce the warmup time! It's more mass to get warmed up, even if it traps the heat better. No free lunch.

I have thermal sensors on bed, hot end, chamber temp at the top of the hot end, and base preheater (plus some readings from the electronics bay). So I can see fairly well how the warmup is progressing.

BTW, if you add a layer of insulation to the top of the printer, you'll probably decrease the heat soak time, and increase your chamber temp a couple of degrees for the hotter materials. The top loses the most heat.

Gerald

Link to comment
Share on other sites

On 8/6/2025 at 4:59 PM, mvdveer said:

I put the request into AI and got the following:

Nice! I'm getting a lot of utility out of AI. Good to see others getting some as well.

This is one of the "good" parts of the whole AI subject and what I can get around. Some of the other stuff... I can see why some are concerned.

Link to comment
Share on other sites

On 8/6/2025 at 4:32 PM, bdejong11129 said:

What is the communities process for the initial start up and pre conditioning for printing materials that need hot chambers?

Thanks in advance for the input. 

My printers are certainly not as automated as they could/should be. That being said... I mostly print ABS/ASA on my VzBoT since it's all CNC'd parts and I don't have to worry about creep or other heat related degradation on 3D printed plastic structural components. I also like the VzBoT for any heated chamber prints because the XY is fixed to the top and that where all the heat rises to, so it makes for a faster better warm-up IMO. I do a 20-minute warm-up with the bed at 110c. Then I heat up the nozzle to 150c and soak for another 10-20 minutes and I'm just using the windows clock app and/or my phone to time my warm-ups. I'll be refurbing the VzBoT soon so this will probably be something that implement at that time.

Link to comment
Share on other sites

I am on the second day of using the refined macro and it has been working as expected and addresses my main requirements. 

  • Automate the soaking based on material type that I am printing for the day. 
  • Taking me out of the loop for the timing
  • Keeping the system alive and heating for a reasonably long enough time in case I get distracted. 

I got up this morning, turned on the printers, set them to their respective material type, poured my coffee, checked my email, and when I was ready, so were they.  First prints were perfect as far as initial startup would have been involved in.

 

  • Like 2
Link to comment
Share on other sites

So on day three I forgot something. lol.  The night before when I finished printing I left the doors open to cool down.  Well, in the morning while sipping coffee I fired them up with the warm up macro and all was well in the world, until I started the prints and did check until an hour or so in(other than watching the camera.  When I did I saw the doors and well, one part was already lifting up.  Booo, only 1 of 4 but now I need a check for the doors. lol.  It never ends. 

Link to comment
Share on other sites

10 hours ago, bdejong11129 said:

Booo, only 1 of 4 but now I need a check for the doors. lol.  It never ends. 

HA HA HA……Should not laugh, but as I have done this in the past, I can relate!

  • Haha 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...