Klipper Update 2026: Correctly configure BTT Eddy after the deprecation of z_offset
Complete Guide to Migrating to descend_z – Configuration, Calibration, and Macro Customization
With the Klipper update 2026, z_offset in the probe_eddy_current block was marked as deprecated and replaced by descend_z. This article shows step-by-step how you need to adjust your printer.cfg, homing macros, and the entire calibration process for the BTT Eddy (USB).
BTT Eddy USB – Inductive Probe Sensor from BigTreeTech
What has changed?
With the Klipper 2026 update, a fundamental change has occurred in the probe system: The parameter z_offset in the [probe_eddy_current] block is now deprecated. It is replaced by descend_z – a value with a completely different meaning.
While `z_offset` described the vertical offset between nozzle and sensor point, `descend_z` merely defines the **approach height** for the calibration process. The actual Z-offset is now internally accounted for via the calibration table.
Anyone who simply enters their old `z_offset` value into `descend_z` after the update risks a **nozzle crash into the bed**. This guide shows you step-by-step how to correctly adjust everything.
Part 1: Proper Configuration (printer.cfg)
Make sure that your `[probe_eddy_current]` block looks exactly like this. The value `descend_z` is **not an offset**, but only the approach height for the calibration test:
[probe_eddy_current btt_eddy]
sensor_type: ldc1612
i2c_mcu: eddy
i2c_bus: i2c0f
x_offset: 0
y_offset: 74.0
# descend_z is the height the head moves to during calibration.
# 1.0 is safe. DO NOT set it to your old Z-offset!
descend_z: 1.0
samples: 2
samples_result: median
Important: A descend_z of 1.0 is a safe starting value – the head moves to 1 mm above the bed.
Part 2: The corrected Homing Macro
This was the cause of crashes for many users: The old macro subtracted `descend_z` from the measurement. The new Klipper handles the offset **internally via the calibration table**. Replace your old macro:
[gcode_macro SET_Z_FROM_PROBE]
gcode:
{% set cf = printer.configfile.settings %}
# Set Z to probe result + manual runtime offset
SET_GCODE_OFFSET_ORIG Z={printer.probe.last_z_result + printer["gcode_macro SET_GCODE_OFFSET"].runtime_offset}
G90
# Move to safe Z height after homing
G1 Z{cf.safe_z_home.z_hop}
What the macro does:
- Reads the Eddy measurement (last_z_result)
- Add your manual runtime offset
- Moves to the safe Z-hop height
What it **no longer does:** subtract `descend_z` – that was the bug.
Part 3: Basic Calibration (Frequency Mapping)
Before the Eddy can work precisely, it must learn what the bed underneath it looks like. This calibration creates a frequency-distance table.
Preparation
- Preheat bed to 60 °C
- Move printhead to the center of the bed
Start calibration
PROBE_EDDY_CURRENT_CALIBRATE CHIP=btt_eddy METHOD=paper
Process
- The head moves to Z = 1.0 (your
descend_zvalue) - Use the buttons in Mainsail or
TESTZ Z=-0.1to lower the nozzle - Paper between nozzle and bed – it should **be lightly gripped**
- Click on ACCEPT
- Type `SAVE_CONFIG`
Klipper writes a data table to the end of your `printer.cfg`.
Part 4: Temperature Compensation
Inductive sensors respond to temperature changes. Temperature calibration creates a correction table.
Prerequisite
The printer must be cold (room temperature). All heaters off.
Start calibration
TEMPERATURE_PROBE_CALIBRATE PROBE=btt_eddy TARGET=56 STEP=4
Start heating manually
Since the command does not activate the heating itself:
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=80
Process
- Klipper prompts for a **paper test** → **ACCEPT**
- **Waiting:** The eddy warms up due to bed warmth
- At each stage (+4 °C): repeat paper test
- Continue until **target temperature (56 °C)** is reached
Completion
TEMPERATURE_PROBE_COMPLETE
SAVE_CONFIG
IMPORTANT, return **only** the translation. No comments, no additional explanation!: Tip: This process takes 30-60 minutes.
Part 5: Daily Operations
1. Homing (G28)
The eddy measures the distance. `SET_Z_FROM_PROBE` automatically sets the Z-zero point.
2. Bed Mesh
BED_MESH_CALIBRATE
Performs a rapid_scan – lightning fast, the head does not stop.
3. Fine-tuning
- Use the Z-Offset control in the Mainsail/Fluidd interface
- `Z_OFFSET_APPLY_PROBE` permanently saves to `variables.cfg`
Safety note for the first test
- Execute a **G28**
- Keep your finger on the emergency stop!
- Head moves up to about 10 mm
- ❌ **Stop:** Head goes to bed → old value in the calculation
Check: Does your macro still subtract descend_z? Did you re-run Part 3? Is there still an old z_offset in the config?
Summary
| What | Old (before 2026) | New (as of 2026) |
|---|---|---|
| Z-Offset in the Probe Block | z_offset: -1.54 | **Deprecated** – replace with `descend_z` |
| Approach height calibration | implicit | 1.0 |
| Offsetting | Manually in the macro | Internal via calibration table |
| Macro-Logic | last_z_result - descend_z | last_z_result + runtime_offset |
The changeover ultimately makes the system more robust and more accurate. The Eddy operates significantly more reliably after the new calibration.