Control My IKEA Standing Desktop (UPPSPEL) From Home Assistant

I managed to score a relatively high-quality standing desk at a decent price. Naturally, the next step was integrating it into Home Assistant.

I assumed it wouldn’t be too complicated—and I was right. As it turns out, others have already reverse-engineered similar setups, so I wasn’t starting from scratch.

The desk’s motor controller includes an auxiliary input intended for an external remote, and fortunately, it communicates over RS-232. That made things significantly easier: no need to hack the internals or simulate button presses. All it takes is sending the appropriate serial commands to the controller.

I hooked up an ESP32 to handle the communication and wrote some lightweight glue code to expose the interface to Home Assistant. The result is a fully controllable standing desk, now integrated into my home automation system.

How to recalibrate your IKEA standing desk.

The exact procedure depends on your model:

If your desk has a display (MITTZON):

1. Press and hold the down arrow until the desk reaches its lowest position
2. Keep holding until the display shows “RST”
3. Hold down again — the desk will slowly move down and back up ~4mm
4. When the display shows “72”, calibration is complete

If your controller has a pinhole reset (common with Jiecang):

1. Poke the pinhole at the bottom of the hand controller with a pin (orange light goes steady)
2. Long-press down until the desk reaches its lowest height
3. The desk will automatically raise ~4mm to complete the reset
4. The orange light turns off when done

If it’s a BEKANT (no display):

1. Press and hold Up + Down together for at least 8 seconds
2. The desk will move to the lowest point and recalibrate

After recalibrating, the desk should report accurate physical limits, and the 71.9cm vs 72.0cm discrepancy should resolve.

If the issue persists after recalibration, we can add the percentage clamping fix as a safety net. Want to try the reset first?

The code

esphome:
  name: ikea-standing-desk
  friendly_name: IKEA Standing Desk
  on_boot:
    # don't touch if you don't know what you're doing!
    priority: 0 # when mostly everything else is done
    then:
      - lambda: "id(my_desk).request_physical_limits();"
      - delay: 0.1s # give controller a chance to handle the response before sending the next command
      - lambda: "id(my_desk).request_limits();"
      - delay: 0.1s
      - lambda: "id(my_desk).request_settings();"

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable Home Assistant API
api:
  encryption:
    key: "xxxx"

ota:
  - platform: esphome
    password: "xxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Ikea-Standing-Desk"
    password: "xxx"

captive_portal:


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

# see full example for more options: https://github.com/Rocka84/esphome_components/blob/master/components/jiecang_desk_controller/example_full.yaml
jiecang_desk_controller:
  id: my_desk
  sensors:
    height:
      name: "Height"
    height_min:
      name: "Height Min"
    height_max:
      name: "Height Max"
    height_pct:
      name: "Height Percent"
    position1:
      name: "Position 1"
    position2:
      name: "Position 2"
    position3:
      name: "Position 3"
    position4:
      name: "Position 4"
  buttons:
    stop:
      name: "Stop"
    step_up:
      name: "Step up"
    step_down:
      name: "Step down"
    position1:
      name: "Position 1"
    position2:
      name: "Position 2"
    position3:
      name: "Position 3"
    position4:
      name: "Position 4"
    save_position:
      name: "Save Position"
    move_up:
      name: "Move up"
    move_down:
      name: "Move down"
  numbers:
    height:
      name: "Height"
    height_pct:
      name: "Height Percent"

Resources

  • https://community.home-assistant.io/t/upsy-desky-add-your-standing-desk-uplift-jarvis-omnidesk-ikea-to-home-assistant/542200
  • https://community.home-assistant.io/t/desky-standing-desk-esphome-works-with-desky-uplift-jiecang-assmann-others/383790
  • IKEA FAQ – MITTZON/BEKANT/IDÅSEN reset (https://www.ikea.com/nl/en/customer-service/knowledge/articles/gf126fd9-d4dg-4635-g741-4ed9161ebd45.html)
  • IKEA UPPSPEL reset guide (https://support.itsolver.net/hc/en-au/articles/11251418053519-How-to-Reset-IKEA-UPPSPEL-Standing-Desk-Fix-ASR-Error-Display-Restore-Height-Adjustment)
  • General standing desk reset guide (https://updowndesk.com.au/blogs/news/how-to-reset-standing-desk)

 

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *