Fixing my Ender 3 (Again)

Today I needed to start a print (quite urgently). However, the tech gods decided: Not today

Since I am running Klipper, I need to restart the firmware after powering the ender3 on. Thats usually no problem. However, today the screen stayed blank.

My initial thought was, that the firmware was somehow broken. I didn’t have an explanation for that, but I tried reflashing the firmware with the newest version of klipper. Well, would it have been that easy, there is no way that I would have written this.

The screen was still blank. A look into the kipper log file revealed another error message: 'Error: Serial connection closed'

I found out, that the path I use for the printer /dev/serial/by-id/<printer-id-here was suddenly missing. Since I needed the print to start as fast as possible, I simply tried other paths (/dev/ttyUSB0 and /dev/serial/by-path/... after verifying them). Still broken.

Solution

The solution that worked was quite simple: An update somehow broke the by-id directory. LordOfTheSnow on reddit provided a udev rule, that fixes the problem. Thank you so much for that! The main purpose of this post: Keep this available for me, should this ever happen again.

/usr/lib/udev/rules.d/60-serial.rules

# do not edit this file, it will be overwritten on update

ACTION=="remove", GOTO="serial_end"
SUBSYSTEM!="tty", GOTO="serial_end"

SUBSYSTEMS=="pci", ENV{ID_BUS}="pci", ENV{ID_VENDOR_ID}="$attr{vendor}", ENV{ID_MODEL_ID}="$attr{device}"
# We already ran the hwdb builtin for devices with MODALIAS in 50-default.rules.
# Let's cover the remaining case here, where we walk up the tree to find a node with $MODALIAS.
ENV{MODALIAS}=="", SUBSYSTEMS=="pci", IMPORT{builtin}="hwdb --subsystem=pci"

# /dev/serial/by-path/, /dev/serial/by-id/ for USB devices
KERNEL!="ttyUSB[0-9]*|ttyACM[0-9]*", GOTO="serial_end"

SUBSYSTEMS=="usb-serial", ENV{.ID_PORT}="$attr{port_number}"

IMPORT{builtin}="path_id"
ENV{ID_PATH}=="?*", ENV{.ID_PORT}=="", SYMLINK+="serial/by-path/$env{ID_PATH}"
ENV{ID_PATH}=="?*", ENV{.ID_PORT}=="?*", SYMLINK+="serial/by-path/$env{ID_PATH}-port$env{.ID_PORT}"

IMPORT{builtin}="usb_id"
SUBSYSTEMS=="usb", ENV{ID_BUS}="usb"
ENV{ID_USB_INTERFACE_NUM}=="", GOTO="serial_end"
ENV{.ID_PORT}=="", SYMLINK+="serial/by-id/$env{ID_BUS}-$env{ID_USB_SERIAL}-if$env{ID_USB_INTERFACE_NUM}"
ENV{.ID_PORT}=="?*", SYMLINK+="serial/by-id/$env{ID_BUS}-$env{ID_USB_SERIAL}-if$env{ID_USB_INTERFACE_NUM}-port$env{.ID_PORT}"

LABEL="serial_end"

afterwards run sudo udevadm control --reload-rules && sudo udevadm trigger

Afterwards, the printer works again. Why does this always happen when I’m stressed.