I found brush holder here (https://makerworld.com/en/models/488122-ender-3-v2-nozzle-scrubber#profileId-400996), printed it, but it didn't let me home bed, it got stuck on Z bar.
So I remade it to fit Ender 3 (and Pro?).
Should be printed in something heat resistant like ABS or ASA, PETG probably will work too. I'm using PLA for now (you know, “test reasons” that will stay like that until it fails).
Here's my G-code for it (You HAVE TO extend stepper_x range, position_max: 245 in printer.cfg):
[gcode_macro NOZZLE_CLEAN]
gcode:
{% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %}
{% set flow_rate = printer["gcode_macro _KAMP_Settings"].flow_rate | float %}
{% set purge_move_speed = (flow_rate / 5.0) * 60 | float %}
#Check if printer was send home
{% if printer.toolhead.homed_axes == "xyz" %}
M117 Printer is already homed
{% else %}
M117 Sending printer home...
G28
{% endif %}
#Move to begginnig
G0 X243 Y20 Z4.5 F{travel_speed}
#set to mm
G21
#set extrusion distance to 0
G92 E0
#use absolute positions
G90
#purge 5mm of filament
G1 E5 F{purge_move_speed}
#Movement
Y G1 X241 F{travel_speed}
G1 Y0.5 F{travel_speed}
G1 X245 F{travel_speed}
G1 Y20 F{travel_speed}
G1 X241 F{travel_speed}
G1 Y0.5 F{travel_speed}
G1 X245 F{travel_speed}
G1 Y20 F{travel_speed}
G1 X241 F{travel_speed}
G1 Y0.5 F{travel_speed}
G1 X245 F{travel_speed}
G1 Y20 F{travel_speed}
G1 X241 F{travel_speed}
G1 Y0.5 F{travel_speed}
G1 X245 F{travel_speed}
G1 Y20 F{travel_speed}
G1 X241 F{travel_speed}
G1 Y0.5 F{travel_speed}
G1 X245 F{travel_speed}
G1 Y20 F{travel_speed}
G1 X241 F{travel_speed}
G1 Y0.5 F{travel_speed}
G1 X245 F{travel_speed}
G1 Y20 F{travel_speed}
G1 X241 F{travel_speed}
G1 Y0.5 F{travel_speed}
G1 X245 F{travel_speed}
G1 Y20 F{travel_speed}
G1 X241 F{travel_speed}
G1 Y0.5 F{travel_speed}
G1 X245 F{travel_speed}
G1 Y20 F{travel_speed}
#Go back to start position
G0 X243 Y20 F6000The author remixed this model.
Made it fit Ender 3 (probably Ender 3 Pro too)