# \[Firmware bug\] Part cooling fan (M106) switches 2–4 s too early — not synced with motion

**URL:** <https://forum.snapmaker.com/t/firmware-bug-part-cooling-fan-m106-switches-2-4-s-too-early-not-synced-with-motion/43655>\
**Category:** U1 Toolchanger\
**Tags:** Firmware\
**Created:** [October 15, 2026, 10:29am UTC](https://forum.snapmaker.com/t/firmware-bug-part-cooling-fan-m106-switches-2-4-s-too-early-not-synced-with-motion/43655 "2026-10-15T10:29:17Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Alternativ](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.snapmaker.com/alternativ/32/36848_2.png) [@Alternativ](https://forum.snapmaker.com/u/Alternativ)\
**Post date:** [October 15, 2026, 10:29am UTC](https://forum.snapmaker.com/t/firmware-bug-part-cooling-fan-m106-switches-2-4-s-too-early-not-synced-with-motion/43655/1 "2026-10-15T10:29:18Z")

</div>

Hi all,

I found that on the U1 the part cooling fan reacts to M106/M107 noticeably **earlier** than the toolhead reaches the command: about 2–4 seconds, or ~one full 130 mm move at F2000 in my test. The fan turns on and off in the wrong places on the model, so slicer settings like first-layer fan, bridge/overhang fan and per-feature cooling are applied in the wrong spots.

**Minimal test (no extrusion):**

```auto
G28
G90
G1 F2000
M106 S0
G1 X10 Y10
G1 X140 Y10 ; should be OFF here
M106 S255
G1 X140 Y140 ; should turn ON here
G1 X10 Y140

```

Repeat the block a few times: the fan switches one edge too early.

**Cause:** in `klippy/extras/fan.py`, `set_speed_from_command()` schedules the fan at “current time + 100 ms” instead of using `toolhead.register_lookahead_callback()` like upstream Klipper. Klipper buffers ~2 s of moves ahead, so the fan fires before the move it belongs to.

Full analysis and a suggested one-line fix are in the GitHub issue: [M106/M107 (part cooling fan) not synchronized with motion queue — fan switches 2–4 s before the toolhead reaches the command · Issue #18 · Snapmaker/u1-klipper · GitHub](https://github.com/Snapmaker/u1-klipper/issues/18)

Workaround to confirm: `M400` before `M106` fixes the position, but stalls motion, so it is not usable for real prints.

Has anyone else noticed cooling kicking in early on overhangs or bridges?

---

<div class="post-metadata">

**Author:** ![ColdCoffee](https://avatars.discourse-cdn.com/v4/letter/c/b9e5f3/32.png) [@ColdCoffee](https://forum.snapmaker.com/u/ColdCoffee)\
**Post date:** [October 15, 2026, 10:38am UTC](https://forum.snapmaker.com/t/firmware-bug-part-cooling-fan-m106-switches-2-4-s-too-early-not-synced-with-motion/43655/2 "2026-10-15T10:38:37Z")

</div>

HI,

Since this is the community based forum, could I suggest you complete the below form with your findings so the engineers at SnapMaker can look into it further

> **[U1 Troubleshooting Request](https://snapmaker.formcrafts.com/u1-troubleshooting-request)**

---

<div class="post-metadata">

**Author:** ![CrazyIvan](https://avatars.discourse-cdn.com/v4/letter/c/7bcc69/32.png) [@CrazyIvan](https://forum.snapmaker.com/u/CrazyIvan)\
**Post date:** [October 15, 2026, 11:33am UTC](https://forum.snapmaker.com/t/firmware-bug-part-cooling-fan-m106-switches-2-4-s-too-early-not-synced-with-motion/43655/3 "2026-10-15T11:33:27Z")

</div>

> [@ColdCoffee](#):
>
> Since this is the community based forum, could I suggest you complete the below form with your findings so the engineers at SnapMaker can look into it further

…but please continue to post these things on the forum as well, so other users can be aware and also confirm.

---

<div class="post-metadata">

**Author:** ![MasterPrinter1](https://avatars.discourse-cdn.com/v4/letter/m/f0a364/32.png) [@MasterPrinter1](https://forum.snapmaker.com/u/MasterPrinter1)\
**Post date:** [October 15, 2026, 3:11pm UTC](https://forum.snapmaker.com/t/firmware-bug-part-cooling-fan-m106-switches-2-4-s-too-early-not-synced-with-motion/43655/4 "2026-10-15T15:11:21Z")

</div>

yeah this tracks, klipper buffers ~2s of moves so a ‘set it now’ fan command lands early. the lookahead callback is exactly how upstream keeps it in sync 🤞
