My Zero has been plagued with intermittent first layer issues. Most of the time it’s good but approximately 10% of the time it prints too high with little to no bed adhesion and the print fails. This issue was discussed as part of the “Z-Offset is not saved” thread, where cardoc made a very useful observation. After cleaning the nozzle, it’s parked at 30,30 while it cools, leaving a tiny plastic blob on the bed.
Here’s what the Zero does before printing:
Move to X=96 Y=76 Z=5
Bed pre-heating
Home X & Y
CLEAN_NOZZLE macro
Move to X=96 Y=76 Z=5
Preheat nozzle to 200 C
Nozzle cleaning on silicone scrubber
X=30, Y=30, Z touching bed to prevent nozzle ooze
Cool nozzle to 130 C
Move to X=76 Y=76
Nozzle contact probe build plate a few times to determine Z offset in middle of bed
X=96 Y=76 (Eddy to X=76 Y=76)
Get Eddy reading of the same Z offset spot (calibrate Eddy to nozzle touch)
Eddy probe scan to produce bed mesh
Home X and Y
X=0 Y=0 Z=0.30
Pre-heat nozzle
The previous manual Z offset in Mainsail is cleared by the bed probing. The Zero isn’t interested in the user’s Z offset because it has fully automated that process for a “perfect first layer”.
On other Klipper printers, I set the Z offset to the proper value and then save the configuration, and Mainsail then reports a Z offset of 0.00 but that’s after internally resetting to my desired Z offset. The Zero’s Save restarts Klipper but apparently is not saving the Z offset or that value is reset during the automated Z offset at the start of each print.
Even weirder, sometimes my Zero has very good bed adhesion with a Z offset of 0.00, and sometimes it has weak bed adhesion with a Z offset of -0.075, with all other factors the same on subsequent prints. It feels as if something is occasionally and randomly adjusting the Z offset internal to the Zero, with no way for me to see the true Z height for the first layer. The Zero mostly works, but occasionally it doesn’t, for no reason that I could understand.
When all of this is under my manual control, I could adjust the Z height with a sheet of paper as a shim and set it. With the Zero, it seems that the intermittent problem occurs between the bed probing and start of the print. I now believe, based on the Zero’s behavior, that the Z offset is overwritten by the bed probing (just before bed mesh scanning) and occasionally a small bit of nozzle ooze results in the 130 C nozzle contacting the build plate at a higher elevation, causing the Z offset to be too high, resulting in poor bed adhesion.
When I first watched my new Zero doing the pre-print operations, I thought I would have designed it to slowly scrub the 200 C nozzle on the silicone pad while cooling it to 130 C to constantly wipe off any ooze until the nozzle was too cold to ooze, to prevent exactly this problem of nozzle ooze resulting in a too-high contact Z offset. Pressing the nozzle against the bed while cooling in an attempt to prevent nozzle ooze is leaving little bits of plastic that can be picked up later to result in a too-high Z offset calibration. Be sure to scrape clean the X=30 Y=30 spot before every print.
I tried an experiment to simulate a worst case nozzle blob when doing the contact probing at X=76 Y=76. While it was doing that probing, I slid four sheets of paper between the nozzle and the build plate, with a thickness of 0.45 mm. As expected, the subsequent first layer printed way too high. That’s the left half of this image. The right side was printed by reprinting the same file and not shimming the nozzle while the Zero was contact probing the build plate.
Conclusion: It would be great to take Z offset control away from the user and have the printer contact probe the build plate, then calibrate the nozzle contact with the Eddy probe, and then use the Eddy probe to create a bed mesh before each print, but only if every step of that process is accurate and repeatable. Occasionally picking up a tiny leftover piece of plastic that causes the nozzle contact probing to be higher than the actual nozzle results in a Z offset that’s too high and a failed first layer. The problem isn’t that the user input Z offset isn’t saved. That’s deliberate. The problem is that the nozzle isn’t always scrupulously clean when the Zero recalibrates its Z offset automatically at the start of each print. When it works, it works great. It’ll even automatically compensate for swapping to a different nozzle, which is very convenient. But like all fully automated processes, when it doesn’t work there is little the user can do other than watch to see if the first layer is too high and manually adjust the Z offset or restart the print. If the nozzle cleaning can’t be 100% effective, I’d prefer to be able to save a good Z offset and use that each time with a new Eddy bed mesh rather than relying on the automated nozzle contact Z offset before each print that may or may not work properly. Hopefully, a future update will change the CLEAN_NOZZLE macro, but until then, I edited that macro to do what I initially thought the Zero should do - cool the nozzle as it’s being cleaned and NOT touch the build plate afterward. Here is the CLEAN_NOZZLE macro I’m now using. Every line that I added or edited has a comment. The macro could be cleaner but I wanted to leave it as close to the original so it’d be easy to understand my changes and easy to revert to the original.
[gcode_macro CLEAN_NOZZLE]
gcode:
BED_MESH_CLEAR
{% if printer.toolhead.homed_axes != “xyz” %}
G28
{% endif %}
M109 S200
G90
G1 X30 Y30 F9000
G4 P100
M400
RUN_PROBE_VIR_CONTACT
G91
G1 Z2
G90
G1 X-9.2 Y0
G91
G1 Z-2.4
G90
M106 S255 ; Start cooling nozzle
M104 S130 ; Nozzle setpoint of 130 C, but don’t wait for it
G1 Y45 F350 ; Slow clean nozzle while waiting for nozzle to cool - was F2400
G1 X-8.2 Y10
G1 Y45
G1 X-8.2 Y10
G1 Y38
G1 X-9.2 Y12
G1 Y38
G1 X-9.2 Y12
G1 Y33
G1 X-8.2 Y14
G1 Y33
G1 X-8.2 Y14
G1 Y28
G1 X-9.2 Y16
G1 Y28 F2400 ; Fast clean at the end to dislodge any remaining booger
G1 X-9.2 Y16
G1 Z3
G1 X30 Y30 F9000
G4 P300
M400
; RUN_PROBE_VIR_CONTACT No longer need to press nozzle into build plate
M106 S255
M109 S130
M106 S0
G1 Z5
If you try this alternate CLEAN_NOZZLE macro, be sure to save your entire Klipper configuration so you can restore it in case anything goes wrong, and of course, I take no responsibility for any harm that may be caused if something goes wrong.
I’ve been using the revised CLEAN_NOZZLE macro and so far I have no random intermittent first layer issues, the nozzle is cool and clean, and the little blob of plastic is no longer being deposited at X=30 Y=30.
I printed eleven different parts which I wouldn’t have been able to do without a first layer failure. Then I printed 21 consecutive “perfect first layer” 150x150 mm test sheets, with three each of seven different materials.
From top to bottom:
ABS-CF - eSun, dark red
ABS - MakeShaper, orange
PET-CF - Siraya, black
Rapid PETG - Elegoo, white
Rapid PLA+ - Elegoo, black
TPU-LW - eSun, black
TPU - 3DBest, black
All were solid uniform sheets with no thick or thin spots despite the front of my Zero bed drooping 0.3 mm. The only adjustments for each material was the bed temperature and the nozzle temperature in the middle of the manufacturer’s recommended values as appropriate for each material. The extrusion rate was 1.0 for all test prints. The carbon fiber test prints had a rougher top surface but the unfilled ABS, PETG and PLA were the promised “perfect first layer” - smooth on top and bottom.
Caveats: I used a Microswiss 0.6 mm CM2 nozzle with a hardened steel insert for all of the test prints and I printed 150x150 mm test sheets that are 0.32 mm thick. I usually print a 0.25 mm first layer with a 0.4 mm nozzle so I scaled up the thickness of the first layer for the 0.6 mm nozzle and to better accommodate the carbon fiber materials. I print all first layers at 30 mm/s, around 5 mm^3/sec volumetric flow. I’m not printing speed Benchy boats so there is no need to rush that critical first layer.
There is no more nozzle ooze with the new nozzle cleaning macro but it’s important to use tweezers to remove the post print nozzle ooze and remove previous nozzle cleaning debris from the silicone nozzle scrubbing pad before each print to start with a clean build area. I failed to clean the silicone scrubbing pad in the earlier test prints and it flicked some black material onto the build plate that is visible on a couple of the orange and white test prints.

