
Platine
nv1t/standing-desk-interceptor
I wanted to intercept the communication between my Flexispot standing desk buttons. This is the progress on the project

I wanted to intercept the communication between my Flexispot standing desk buttons. This is the progress on the project
Interceptor is an open-source printed circuit board by nv1t, from the nv1t/standing-desk-interceptor repository on GitHub, published under the CC0-1.0 licence. It is a 2-layer board of 52.1 × 50.8 mm with 5 parts on 16 nets, routed with 50 tracks and 16 vias.
It is built around the RJ45.
I wanted to intercept the communication between my Flexispot E5B standing desk buttons. This is the progress on the project. It should work on any other flexispot desk as well, as i suspect they use the same button interface with nearly the same protocol. But this needs testing!
| PIN | Colour | Name |
|---|---|---|
| 1 | brown | RES |
| 2 | white | SWIM |
| 3 | purple | ? |
| 4 | red | WAKE |
| 5 | green | RX/TX (cp/mc) |
| 6 | black | TX/RX (cp/mc) |
| 7 | blue | GND |
| 8 | yellow | VCC |
The SWIM Debug interface is on the RJ45 Port, but not possible to use, due to set Read Protection, which can only be disabled by overwriting the Chip itself.
Every Command starts with 0x9b and ends with 0x9d. The second byte is the length of the Message with the Endbyte included. It seems like the Byte after the length is some kind of messagetype, because it stays constant for button presses, height configuration and different messages.
| Start Byte | Length | Type | Payload | Checksum | End Byte |
|---|---|---|---|---|---|
| 9b | 06 | 02 | 00 00 | 6c a1 | 9d |
| 9b | 07 | 12 | 06 06 7d | 38 b7 | 9d |
| 9b | 04 | 11 | 7c c3 | 9d | |
| 9b | 04 | 13 | bd 42 | 9d | |
| 9b | 04 | 15 | bf c2 | 9d |
The checksum is a CRC16 Modbus Checksum (07 12 06 06 7d results in 0x38b7) over the Length+Type+Payload
A button press has the message type 0x02 and can be used as a fixed command. The checksum is steady and doesn't have to be recalculated.
Those are the known commands from the button controller to the motor controller with their respective button names.
| Start Byte | Length | Type | Payload | Checksum | End Byte | Name |
|---|---|---|---|---|---|---|
| 9b | 06 | 02 | 01 00 | FC A0 | 9d | UP |
| 9b | 06 | 02 | 02 00 | 0C A0 | 9d | DOWN |
| 9b | 06 | 02 | 04 00 | AC A3 | 9d | M1 |
| 9b | 06 | 02 | 08 00 | AC A6 | 9d | M2 |
| 9b | 06 | 02 | 10 00 | AC AC | 9d | M3 |
| 9b | 06 | 02 | 20 00 | AC B8 | 9d | M |
(Credit goes to mikrocontroller forum https://www.mikrocontroller.net/topic/493524)
The height has the MessageType 0x12 and the payload is a simple 7 Segment display output.
As an example we look at the height answer: 9b 07 12 06 06 7d 38 b7 9d which represents 116
| P1 | P2 | P3 |
|---|---|---|
| 06 | 06 | 7d |
If we convert this to a regular 7 Segment Display:
| a | a | a | |||
| f | b | ||||
| f | b | ||||
| f | b | ||||
| g | g | g | |||
| e | c | ||||
| e | c | ||||
| e | c | ||||
| d | d | d | dp |
Converting each byte to is binary representation and mapping each bit to a segment, we can generate the following table:
| Name | a | b | c | d | e | f | g | dp |
|---|---|---|---|---|---|---|---|---|
| P1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
| P2 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
| P3 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 |
Mapping this to the example above we can display the number 116 as a 7-Segment output. (don't want to include pictures, just believe me or try it out)
We don't know about the MessageTypes 0x11, 0x13, 0x15. They are send by the motorcontroller.
They seem to be constant across different tables and don't bear any payload.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 2 | Conn_01x08_Male | Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical | A, B |
| 2 | RJ45 | Custom-Connectors:MEBP_8-8G | A, B |
| 1 | SW_DIP_x08 | Button_Switch_THT:SW_DIP_SPSTx08_Slide_6.7x21.88mm_W7.62mm_P2.54mm_LowProfile | SW1 |
It measures 52.1 × 50.8 mm and has 2 copper layers, 1.6 mm thick.
5 parts, built around the RJ45. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the nv1t/standing-desk-interceptor repository on GitHub, at the commit this page was made from: the board is hardware/interceptor/interceptor.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the CC0-1.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

nv1t/standing-desk-interceptor
I wanted to intercept the communication between my Flexispot standing desk buttons. This is the progress on the project

UtilitechAS/amsreader-firmware
ESP8266 and ESP32 compatible firmware to read, interpret and publish data to MQTT from smart electrical meters, both DLMS and DSMR is supported

travisgoodspeed/goodfet
An embedded bus adapter for various microcontrollers and radios.




Severson-Group/AMDC-Hardware
Circuit board designs for controlling advanced motor systems

mfkiwl/KiwiSDR_PCB
KiCAD PCB files for KiwiSDR project including active antenna and bias tee

GBert/railroad
git clone https://github.com/arendst/Tasmota.git cd Tasmota git tag pio run