最近我把家里的乐歌 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 中有两个按钮:
sit和stand - 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.11Vpin2:GNDpin3:约 4.1Vpin4:约 4.2V- 其它脚约 0V
后续验证下来:
pin1可以给 ESP32 的VIN供电pin2是 GNDpin3/pin4是 UART TX/RX
这里有一个风险点:ESP32 的 GPIO 严格来说不是 5V tolerant,而这里 UART 线测出来有 4V 多。我的实际测试能工作,但长期更严谨的方案应该在桌子 TX 到 ESP32 RX 之间加电平转换或分压。当前版本先按最小改动完成。
ESP32 接线
ESP32 这边使用:
GPIO16/D16GPIO17/D17GNDVIN
最终接线:
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,不要接 3V3。VIN 是 5V 输入,会经过板载稳压芯片变成 ESP32 使用的 3.3V;3V3 是板上已经稳压后的 3.3V 电源脚,把 5V 接上去很可能烧板。
测试桌子 5V 供电时,我先拔掉了电脑 USB,只让桌子的 pin1 -> VIN、pin2 -> GND 给 ESP32 上电。确认它能稳定上线后,再接回 TX/RX 测试 sit 和 stand。
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
- 用万用表电压档测
pin1到pin2,不要用电流档直接短接测量
我还犯过一个小错误:曾经把 GND 接到了旁边的 D13。好在当前固件没有使用 D13,实际没有造成影响。但这个错误提醒我,最后一定要把线固定好,不能让杜邦线长期处于受力和晃动状态。
现在还不完美的地方
功能上已经可用了,但外观还比较工程样机:一根粗 RJ45 线、几根杜邦线、一块裸露 ESP32 板子吊在桌子下面。
后续准备做一个小盒子,把 RJ45 端子和 ESP32 收进去:
- 使用小 ABS 项目盒
- 换短款柔软扁平 RJ45 线
- ESP32 和端子用双面胶或固定座固定
- 线入口做应力释放,避免外部拉扯直接作用到螺丝端子
- 整个盒子用魔术贴固定在桌板底部
目标是最后只看到一个小盒子和一根短线,而不是一团实验线。
这次折腾的收获
这次最大的收获不是“让桌子能被手机控制”,而是把一个原本封闭的普通家具有条理地拆成了几个可理解的问题:
- 它的接口是不是电源和按键?
- 如果不是按键,它在说什么协议?
- 怎么只监听,不冒险干扰原控制器?
- 怎么发最小命令完成坐姿/站姿?
- 怎么让 Home Assistant 和 Apple Home 认为它是一个正常智能家居设备?
- 怎么把临时 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 - 如果传感器判断我不在桌前,就不触发升降,避免空桌子自己动
- 后续如果能解析出桌子的高度数据,再加入“已经在站姿就不重复执行”的判断
这一版的关键不再是“能不能控制桌子”,而是“什么时候应该控制”。智能家居真正有用的地方,往往不是把手机变成遥控器,而是让设备根据场景自己做对的事。