ElVit-esphome_components/components/maidesite_desk
ElVit 92c764a105 Maidesite Desk Refactoring 2025-07-12 10:47:37 +02:00
..
button Maidesite Desk Refactoring 2025-07-12 10:47:37 +02:00
number Maidesite Desk Refactoring 2025-07-12 10:47:37 +02:00
sensor Maidesite Desk Refactoring 2025-07-12 10:47:37 +02:00
README.md Renamed all occurences of 'maidsite' with 'maidesite' 2025-06-20 09:50:19 +02:00
__init__.py Maidesite Desk Refactoring 2025-07-12 10:47:37 +02:00
maidesite_desk.cpp Maidesite Desk Refactoring 2025-07-12 10:47:37 +02:00
maidesite_desk.h Maidesite Desk Refactoring 2025-07-12 10:47:37 +02:00

README.md

ESPHome Maidesite Desk Component

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

Usage

What you need

  • ESPHome compatible microcontroller (e.g. ESP8266, ESP32, ESP32-S2, ESP32-C3, ...)
  • RJ12 cable (phone cable, RJ11 may also work)

Wiring

RJ12 connector pinning

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)

Microcontroller pinning

ESP desk
GND GND
5V VCC
GPIO3 TX
GPIO4 RX

IMG_1256

Sometimes the desk controller does not supply enough current, then simply disconnet the VCC pin and plug in a micro-usb/usb-c cable into your ESP board.

Example ESPHome yaml code

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

uart:
  - id: uart_bus
    tx_pin: GPIO3
    rx_pin: GPIO4
    baud_rate: 9600

maidesite_desk:
  id: my_desk

sensor:
  - platform: maidesite_desk
    height_abs:
      name: "Height"

number:
  - platform: maidesite_desk
    height_abs:
      name: "Height"
      mode: SLIDER

button:
  - platform: maidesite_desk
    stop:
      name: "Stop"
    step_up:
      name: "Step up"
    step_down:
      name: "Step down"
    goto_max:
      name: "Move to MAX"
    goto_min:
      name: "Move to MIN"
    goto_m1:
      name: "Move to M1"
    goto_m2:
      name: "Move to M2"
    goto_m3:
      name: "Move to M3"
    goto_m4:
      name: "Move to M4"

Examples

Features

sensors entities

entity description
height_abs current height of the desk
height_pct height in percent
height_min minimal height
height_max maximal height
position_m1 1st stored height
position_m2 2nd stored height
position_m3 3rd stored height
position_m4 4th stored height

number entities

entity description
height_abs current height of the desk
height_pct height in percent

buttons entities

entity description
step_up move up desk by one step (~14mm)
step_down move down desk by one step (~14mm)
goto_max move up until stopped
goto_min move down until stopped
stop stop movement of desk
goto_m1 move to 1st stored height
goto_m2 move to 2nd stored height
goto_m3 move to 3rd stored height
goto_m4 move to 4th stored height
save_m1 save current height to 1th position
save_m2 save current height to 2th position
save_m3 save current height to 3th position
save_m4 save current height to 4th position

lambda methods

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).goto_max_position() move up
id(my_desk).goto_min_position() move down
id(my_desk).stop() stop movement of desk
id(my_desk).goto_mem_position(pos) move to stored height pos
id(my_desk).save_mem_position(pos) save current height to position pos
id(my_desk).goto_height(height) move to specified height

Dev Notes

Jarvis reverse engineering notes

To see and send custom UART messages the following esphome code can be used:

esphome:
  ...
  includes: components/common_includes.h

uart:
  - id: uart_bus
    tx_pin: GPIO3
    rx_pin: GPIO4
    baud_rate: 9600
    debug:
      direction: BOTH
      after:
        bytes: 9
      sequence:
        - lambda: UARTDebug::log_hex(direction, bytes, ',');

text:
  - platform: template
    name: "UART message"
    id: uart_msg
    optimistic: true
    min_length: 0
    max_length: 100
    mode: text
    initial_value: "f1,f1,01,00,01,7e"

button:
  - platform: template
    name: "Send UART message"
    on_press:
      - uart.write: !lambda |-
          auto str = id(uart_msg).state;
          str = std::regex_replace(str, std::regex("0x"), "");
          str = std::regex_replace(str, std::regex(",| "), "");
          std::vector<uint8_t> out;
          auto ret = parse_hex(str.c_str(), out, str.length() / 2);
          return out;

To be able to use the regex command the file "common_includes.h" must be created in the directory "components".
The content of the "common_includes.h" must be:

#include <iostream>
#include <regex>
#include <string.h>

Sources

❤️ A big THANKS to Rocka84 for doing the main work, I've just forked this repo and modified some parts.
❤️ A big THANKS to shades66 for the minimal and easy to setup esphome config.
❤️ A big THANKS to phord/Jarvis for reverse engineering the UART interface and most control messages!
❤️ A big THANKS to OkhammahkO for collecting the scattered information at pimp-my-desk/desk-control!
❤️ Thanks to the whole home assistant community for sharing their knowlege and helping me to create this ESPHome component!