This post is part of an ongoing series where Claude is a real collaborator on the build, not autocomplete.
My standing desk has a control box with two RJ45 ports on the back. One goes to the handset — the little display with the up/down buttons and memory presets. The other one just sits there, empty, doing nothing. This is the story of turning that spare port into a working Home Assistant integration for the standing desk.

That’s the kind of thing I can’t leave alone. This time I brought Claude in from the start, and it ended up doing a lot more than autocomplete.
Finding the spare RJ45 port on my standing desk
The handset itself has a USB port for charging your phone, even while it’s plugged into a shared RJ45 line. That told me something: this control box design supports more than one handset, or some kind of accessory port, on the same protocol bus. I ran that theory past Claude. It dug up a few Loctek/FlexiSpot desk-hacking projects that confirmed it — the spare port carries the same signal lines as the handset, just unused.
Before wiring anything, I checked with a multimeter: 5V between two of the eight RJ45 pins. Claude cross-checked that number against a documented pinout it had found. Clean confirmation: this was a genuine signal port, not a motor-power line, which would read a completely different voltage.
Next was figuring out exactly which control box I had. The desk brand (Liftor) doesn’t manufacture its own electronics — like most of the standing desk market, it’s rebadged Loctek hardware. The label on the box: CB38M2L(IB)-1. Claude found the model wasn’t in the explicitly-tested list of an open source reference project — LoctekMotion_IoT, a genuinely excellent repo that’s done the hard reverse-engineering work across a bunch of control box revisions. The maintainers note, though, that one pinout and command set works across nearly all their variants — worth the gamble, and it meant I didn’t have to reverse-engineer the protocol from scratch.
(This isn’t my first smart-home hardware hack — see the Zigbee blinds driver writeup for another one.)
The wiring itself was the easy part
UART on this control box is 9600 baud. Four wires: GND, TX/RX (crossed — control box TX goes to the ESP32’s RX pin, and vice versa), and a wake line. Once Claude and I had the pin mapping confirmed against the multimeter readings, this part went fine. No drama here.
Chasing the wrong problem, together
Here’s where it got interesting. Once wired up, the ESP32 wouldn’t reliably boot. We went through the usual gremlin lineup — a power issue, a bridged pin somewhere on the wiring, a damaged GPIO from all the soldering. The standard list of suspects on any embedded project, right after you’ve been poking at a board with a soldering iron.
None of it was the cause.
The actual problem: the desk’s control box never stops talking on that UART line — it just continuously streams status data. Claude had added debug logging to watch the protocol traffic. That meant the ESP32 was trying to process every single byte of that constant stream as it arrived. That kept it busy enough, early enough in the boot sequence, that it never finished booting. Which meant it never fed the watchdog timer — and the watchdog did exactly what it’s built for: it reset the chip. Boot, get buried in serial traffic, watchdog fires, reboot, repeat.
After desoldering the 5V line so we could actually monitor the serial port over USB, Claude found it — and fixed it. Instead of processing the desk’s chatter inline as it arrived, it rewrote the handling to batch it, giving the RTOS scheduler room to actually finish what it was doing before the watchdog ran out of patience. Once the ESP32 wasn’t fighting the desk’s constant stream for every CPU cycle, boot completed normally and stayed stable.
It’s a good reminder that “add debug logging” isn’t a free action on a board that’s listening to a chatty peer — the observability tool became the failure mode.
Where the standing desk / Home Assistant integration stands

- ✅ Control box identified (CB38M2L(IB)-1) and spare port confirmed safe
- ✅ Wiring confirmed, UART talking to the desk
- ✅ Root-caused and fixed the boot-loop issue (batched the UART handling instead of processing it inline, giving the RTOS room to finish booting)
- ✅ Desk control working — up, down, and presets all fire correctly from Home Assistant
- ⬜ Height measurement — the part I actually wanted this for — still isn’t wired up as a sensor entity. That’s next.
- ⬜ Figure out whether the board can go inside the metal casing (cleanest option) or whether that kills Wi-Fi reception entirely
Not the end of the project, but the desk answers to Home Assistant now, which is most of the battle. Height reporting is the next post, once I’ve got the energy to go another round with this thing.
If you’re hacking on a Loctek-based control box and want the pin table or the exact command bytes, leave a comment.
[…] Wiring an unused RJ45 port on my standing desk into Home Assistant […]