Skip to content

Latest commit

 

History

History

jiecang_desk_controller

ESPHome Jiecang Desk Controller

ESPHome component for controlling Jiecang desk controllers via their serial protocol.

Attention: I only have one RJ12 model to test this but it's likely that other Jiecang controllers are supported as their serial protocol should be compatible.

Usage

What you need

  • ESPHome compatible microcontroller
  • depending on your model of desk controller
    • cable with RJ12 connector (phone cable, RJ11 may also work)
    • cable with RJ45 connector (network cable)

Wiring

RJ12

Please double check this for your specific model!

pin function
1 NC (pulled up)
2 GND
3 TX
4 VCC
5 RX
6 NC (pulled up)

RJ45

Untested and only for reference!

pin function
1 HS3 1
2 TX
3 GND
4 RX
5 VCC
6 HS2 1
7 HS1 1
8 HS0 1

microcontroller

ESP desk
GND GND
5V VCC
RX TX
TX RX

Usage

esphome:
  ...
  on_boot:
    # This script is required to initialize the following sensors:
    #    height_pct, height_min, height_max, position1 - position4
    # You can skip this if you don't use those.
    priority: 0 # when mostly everything else is done
    then:
      - lambda: "id(my_desk).request_physical_limits();"
      - delay: 0.1s
      - lambda: "id(my_desk).request_limits();"
      - delay: 0.1s
      - lambda: "id(my_desk).request_settings();"

external_components:
  - source:
      type: git
      url: https://github.com/Rocka84/esphome_components/
    components: [ jiecang_desk_controller ]

uart:
  id: uart_bus
  tx_pin: TX
  rx_pin: RX
  baud_rate: 9600

logger:
  baud_rate: 0 # disable logging over uart, required when using the RX/TX pins for the controller

jiecang_desk_controller:
  id: my_desk
  sensors:
    height:
      name: "Height"
  numbers:
    height:
      name: "Height"
  buttons:
    move_up:
      name: "Move up"
    move_down:
      name: "Move down"
    stop:
      name: "Stop"
    position1:
      name: "Position 1"

button:
  - platform: template
    name: "Step down"
    on_press:
      lambda: "id(my_desk).goto_height(84.0);"

Examples

Features

sensors

sensor description
height current height of the desk
height_pct height in percent
height_min minimal height
height_max maximal height
position1 1st stored height
position2 2nd stored height
position3 3rd stored height
position4 4th stored height

number entities

Hold current values read from the desk and set values to desk when changed.

sensor description
height current height of the desk

buttons

button description
step_up move up desk by one step (~14mm)
step_down move down desk by one step (~14mm)
move_up move up until stopped
move_down move down until stopped
stop stop movement of desk
position1 move to 1st stored height
position2 move to 2nd stored height
position3 move to 3rd stored height
position4 move to 4th stored height
save_position press position button afterwards to store current height to that position

lambda methods

lambda method description
id(my_desk).step_up() step_up desk by one step (~14mm)
id(my_desk).step_down() step_down desk by one step (~14mm)
id(my_desk).move_up() move up
id(my_desk).move_down() move down
id(my_desk).stop() stop movement of desk
id(my_desk).goto_position(pos) move to stored height pos
id(my_desk).save_position(pos) save current height to position pos
id(my_desk).goto_height(height) move to specified height

Case

You can find a 3D-printable case in the stl folder or on onshape.

Sources

Thanks to phord/Jarvis for reverse engineering the UART interface and most control messages!
Thanks to OkhammahkO for collecting the scattered information at pimp-my-desk/desk-control and for his work in the home assistant community!

Footnotes

  1. not used here 2 3 4