把乐歌 E2 升降桌改造成智能家居:ESP32 + ESPHome + Home Assistant 实战

从 RJ45 手控接口到 Apple Home,一张普通升降桌的智能化改造记录

作者: shisaq 日期: May 31, 2026

最近我把家里的乐歌 E2 升降桌接入了 Home Assistant,并进一步暴露到 Apple Home 里。最后的效果是:在 Home App 里点一下“sit”或“stand”,桌子就会自动去到坐姿或站姿记忆高度。

这件事一开始看起来像是“找两根线上下短接一下”的简单小活,实际折腾下来才发现,乐歌这类桌子的手控器接口并不是传统按键短接,而是一套跑在 RJ45 线里的 UART 串口协议。

这篇文章记录完整过程:怎么识别引脚、怎么确认协议、怎么用 ESP32 + ESPHome 接入 Home Assistant,以及最后如何解决供电和 HomeKit 控制。

最终成果

硬件上,桌子的原手控面板仍然保留,ESP32 只是并联接入手控接口的串口线。

软件上,现在有这样一条链路:

1
2
3
4
5
6
7
8
9
Apple Home / Siri
        ↓
Home Assistant
        ↓
ESPHome API
        ↓
ESP32 UART
        ↓
乐歌 E2 升降桌控制器

最终可用能力:

  • Home Assistant 中有两个按钮:sitstand
  • Apple Home 中也可以控制这两个动作
  • ESP32 不需要额外 USB 电源,直接由桌子 RJ45 接口中的 5V 供电
  • 原桌子手控器不受影响,仍然可以正常按实体按钮

硬件清单

这次用到的东西不少,我第一次接触了单片机:

  • 乐歌 E2 升降桌
  • ESP32-WROOM-32 开发板,30Pin,Type-C 口
  • RJ45 转 8Pin 免焊接线端子
  • 杜邦线若干
  • 万用表
  • 一台树莓派,运行 Docker 版 Home Assistant

因为我不会焊接,所以整个方案尽量围绕“免焊、可拆、可回滚”来做。所有连接都是杜邦线加螺丝端子。

第一阶段:确认它不是普通按键

我最开始的直觉是:升降桌手控器上有上升、下降、1、2、3、4 记忆位,那 RJ45 里面也许就是几根按键线,按下某个按钮就是某根线接地。

结果不是。

用 ESP32 的 UART 调试后发现,桌子在静止时也会持续广播数据。波特率测试下来,9600 最稳定。

静止时能看到类似这样的帧:

1
2
9B:04:11:7C:C3:9D
9B:07:12:00:00:00:B8:94:9D

桌子移动时,数据会明显变化,例如:

1
2
3
7F:FD:06:F2:65:9D
7F:87:3F:80:86:9D
06:06:7F:F9:36:9D

这一步非常关键。它说明:手控器接口不是简单按键短接,而是 UART 串口通信。

RJ45 引脚测量

RJ45 水晶头方向按下面这个姿势看:

  • 金属触点朝上
  • 卡扣朝下
  • 线朝远离自己

我测到的结果:

  • pin1:约 5.11V
  • pin2:GND
  • pin3:约 4.1V
  • pin4:约 4.2V
  • 其它脚约 0V

后续验证下来:

  • pin1 可以给 ESP32 的 VIN 供电
  • pin2 是 GND
  • pin3 / pin4 是 UART TX/RX

这里有一个风险点:ESP32 的 GPIO 严格来说不是 5V tolerant,而这里 UART 线测出来有 4V 多。我的实际测试能工作,但长期更严谨的方案应该在桌子 TX 到 ESP32 RX 之间加电平转换或分压。当前版本先按最小改动完成。

ESP32 接线

ESP32 这边使用:

  • GPIO16 / D16
  • GPIO17 / D17
  • GND
  • VIN

最终接线:

1
2
3
4
RJ45 pin1  +5V   -> ESP32 VIN
RJ45 pin2  GND   -> ESP32 GND
RJ45 TX          -> ESP32 RX / GPIO16
RJ45 RX          -> ESP32 TX / GPIO17

注意:ESP32 的 TX 要接桌子 RX,ESP32 的 RX 要接桌子 TX。如果收不到数据,就先交换 TX/RX。

另外,桌子的 5V 要接 ESP32 的 VIN,不要接 3V3VIN 是 5V 输入,会经过板载稳压芯片变成 ESP32 使用的 3.3V;3V3 是板上已经稳压后的 3.3V 电源脚,把 5V 接上去很可能烧板。

测试桌子 5V 供电时,我先拔掉了电脑 USB,只让桌子的 pin1 -> VINpin2 -> GND 给 ESP32 上电。确认它能稳定上线后,再接回 TX/RX 测试 sitstand

ESPHome 配置

最终 ESPHome 配置非常短:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
esphome:
  name: desk

esp32:
  board: esp32dev
  framework:
    type: arduino

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

logger:
  baud_rate: 0

api:

ota:
  platform: esphome

uart:
  id: desk_uart
  baud_rate: 9600
  tx_pin: GPIO17
  rx_pin: GPIO16

button:
  - platform: template
    name: "sit"
    id: sit
    on_press:
      - uart.write:
          id: desk_uart
          data: [0x9b, 0x06, 0x02, 0x04, 0x00, 0xac, 0xa3, 0x9d]

  - platform: template
    name: "stand"
    id: stand
    on_press:
      - uart.write:
          id: desk_uart
          data: [0x9b, 0x06, 0x02, 0x08, 0x00, 0xac, 0xa6, 0x9d]

这里一开始我用的是 switch,后来改成了 button。原因很简单:坐姿和站姿不是“开关状态”,而是“执行一次命令”。如果用开关,Home Assistant 会误以为它有持续的 on/off 状态;但实际上点完 stand 并不代表桌子一定已经到位,也无法知道中途是否被手控器打断。

所以现阶段最准确的模型是:

  • sit:发送一次坐姿记忆位命令
  • stand:发送一次站姿记忆位命令

等以后解析出高度帧,再考虑升级成 sensor + number + select,甚至做成类似窗帘的 cover 模型。

Home Assistant 接入

Home Assistant 是新装在树莓派上的 Docker 版,地址类似:

1
http://192.168.31.123:8123

ESPHome 节点刷好后,Home Assistant 自动发现了 desk。添加 ESPHome integration 后,就能看到两个实体:

1
2
button.desk_sit
button.desk_stand

我还在路由器里给 ESP32 做了 DHCP 静态绑定,这样每次断电重连后,IP 不会漂移,Home Assistant 连接更稳定。

接入 Apple Home

要把 Home Assistant 里的实体暴露到 Apple Home,使用的是 Home Assistant 的 HomeKit Bridge

路径:

1
Settings -> Devices & services -> Add Integration -> HomeKit Bridge

创建 HomeKit Bridge 时,只选择暴露桌子相关实体:

1
2
button.desk_sit
button.desk_stand

然后 Home Assistant 会给出 HomeKit 配对二维码或 PIN。打开 iPhone 的 Home App,添加配件,扫码或输入 PIN 即可。

Docker 版 Home Assistant 如果遇到 HomeKit 找不到 Bridge,通常和网络模式、mDNS 广播有关。最省心的方式是让 Home Assistant 容器使用 host network,让它和局域网设备处在同一网络广播环境中。

供电:从电脑 USB 到桌子 5V

一开始 ESP32 是电脑 USB-C 供电,只接了:

1
2
RJ45 GND -> ESP32 GND
RJ45 TX/RX -> ESP32 RX/TX

这叫“监听模式”,比较安全,但不适合长期使用:桌子下面还要吊一根 USB 电源线,非常不优雅。

后来确认 RJ45 pin1 是约 5.11V 后,我把它接到了 ESP32 的 VIN。测试结果稳定,不需要外接 USB 电源。

这里的注意事项:

  • 5V 接 VIN,不要接 3V3
  • GND 接真正的 GND
  • 测试时不要同时接电脑 USB 和桌子 5V
  • 用万用表电压档测 pin1pin2,不要用电流档直接短接测量

我还犯过一个小错误:曾经把 GND 接到了旁边的 D13。好在当前固件没有使用 D13,实际没有造成影响。但这个错误提醒我,最后一定要把线固定好,不能让杜邦线长期处于受力和晃动状态。

现在还不完美的地方

功能上已经可用了,但外观还比较工程样机:一根粗 RJ45 线、几根杜邦线、一块裸露 ESP32 板子吊在桌子下面。

后续准备做一个小盒子,把 RJ45 端子和 ESP32 收进去:

  • 使用小 ABS 项目盒
  • 换短款柔软扁平 RJ45 线
  • ESP32 和端子用双面胶或固定座固定
  • 线入口做应力释放,避免外部拉扯直接作用到螺丝端子
  • 整个盒子用魔术贴固定在桌板底部

目标是最后只看到一个小盒子和一根短线,而不是一团实验线。

这次折腾的收获

这次最大的收获不是“让桌子能被手机控制”,而是把一个原本封闭的普通家具有条理地拆成了几个可理解的问题:

  1. 它的接口是不是电源和按键?
  2. 如果不是按键,它在说什么协议?
  3. 怎么只监听,不冒险干扰原控制器?
  4. 怎么发最小命令完成坐姿/站姿?
  5. 怎么让 Home Assistant 和 Apple Home 认为它是一个正常智能家居设备?
  6. 怎么把临时 USB 供电改成桌子内部供电?

最后答案很简洁:

1
2
3
4
5
6
乐歌 E2 RJ45 手控接口
  -> UART 9600
  -> ESP32 + ESPHome
  -> Home Assistant
  -> HomeKit Bridge
  -> Apple Home

现在这张桌子终于不只是“电动升降桌”,而是家里智能家居系统的一部分了。

下一步:把桌子变成真正的健康提醒

现在的桌子已经可以被 Home Assistant 和 Apple Home 控制,但它本质上还是“手动触发”:我想坐下或站起来时,点一下按钮。

下一步我想把它做成一个更主动的健康工作流:结合传感器和番茄钟,让桌子在合适的时机自动提醒甚至强制切换坐站状态。

初步设想是:

  • 用传感器判断我是否真的在桌前,比如人体存在传感器、椅子压力传感器,或者电脑是否处于活跃状态
  • 用 Home Assistant 做番茄钟逻辑:工作 25 分钟后自动切到 stand
  • 站立 5 分钟后再允许切回 sit
  • 如果传感器判断我不在桌前,就不触发升降,避免空桌子自己动
  • 后续如果能解析出桌子的高度数据,再加入“已经在站姿就不重复执行”的判断

这一版的关键不再是“能不能控制桌子”,而是“什么时候应该控制”。智能家居真正有用的地方,往往不是把手机变成遥控器,而是让设备根据场景自己做对的事。