不知道大家在折腾 Home Assistant 中控大屏的时候,有没有遇到过这个痛点:想实现“人来亮屏、人走灭屏”,结果发现无论是 iPad 还是安卓平板,都挺难搞。iPad 基本上只能靠推送通知或者特定的 App 保持前台,安卓虽然能用 ADB,但很多品牌的电视和平板一旦关机重启,ADB 调试开关就自动关了,非常心累。
最近,“瀚思彼岸”论坛的网友 “keepwin2023” 给我安利了一个神器——ESPHome-espidf_ble_keyboard。这是一个专门为 ESPHome 开发的外部组件,基于 ESP-IDF 框架。它的原理非常硬核且巧妙:直接把 ESP32 模拟成一个原生的 BLE(蓝牙低功耗)HID 键盘。
适用于 ESPHome 的 ESP32 BLE HID 键盘 GitHub 文档(https://github.com/markusg1234/ESPHome-espidf_ble_keyboard)
为什么是蓝牙键盘?(对比 ADB 的优势)
其实不管是 iPad 人来亮屏,还是安卓平板的人来亮屏,都要折腾一番才能实现。
- 安卓方案:通常要通过 ADB 命令或者安装 HA 官方 App,利用 App 的通知命令来控制亮屏。这不仅需要后台权限,最头疼的是稳定性——特别是有些品牌安卓的平板或者电视,关机或者重启后,ADB 调试开关会自动关闭,导致自动化失效。
- 蓝牙键盘方案:这款 ESPHome-espidf_ble_keyboard 插件的主要功能就是利用 ESP32 开发板,把它模拟成一个原生的蓝牙键盘。它可以控制安卓手机/平板/电视、苹果手机/iPad,甚至是 Windows 电脑。
最核心的优势在于: 只要在设备端蓝牙连接成功后,即使设备关机重开,蓝牙也会自动重连。它是系统底层的输入协议,不需要任何额外的 App 权限,丝滑稳定。
核心功能一:平板中控的人来亮屏/人走灭屏
这是该组件最常用的场景。配合人体传感器、毫米波雷达或者摄像头,你可以实现真正的“原生丝滑”体验。
当有人靠近时,HA 触发自动化,命令 ESP32 发送一个“电源键”或“媒体按键”指令。平板收到指令后,会像被物理键盘唤醒一样瞬间亮屏。相比于网络通知,这种方式几乎是零延迟,而且 iPad 对外部键盘唤醒的支持非常友好,避免了各种复杂的推送配置。
核心功能二:替代红外,实现电视“穿墙”遥控
我家里客厅的电视是安卓系统的,以前一直在HA中用红外遥控方案。红外方案最大的缺点就是“怕遮挡、不能穿墙”。
我尝试把这个插件集成到了我卧室的一个 Sonoff 开关里(刷了 ESPHome 固件)。由于它是基于 BLE 低功耗蓝牙的射频信号,只要加上几行代码,这个开关就变成了一个“蓝牙遥控器”。
我在次卧按开关,隔着一堵墙,客厅电视的音量依然可以精准加减。这种“盲操”的快感是红外方案给不了的。
目前的一个小局限:
实测发现,如果电视处于完全关机(断电)状态,蓝牙遥控暂时还无法唤醒开机。我后续打算研究一下 BLE 广播唤醒。如果能实现开机,那它就是一个完美的、可定制的万能蓝牙遥控器。
核心功能三:获取 IRK 密钥,实现精准手机存在检测
这是在最新的 v1.8.0 版本中,作者根据我提出的需求新增的功能!
什么是 IRK 密钥?
现代手机为了隐私,蓝牙 MAC 地址是每隔几分钟就会改变的随机地址。普通的蓝牙追踪器会发现“设备 ID”一直在变,根本没法判断是谁。而 IRK (Identity Resolving Key) 是唯一能将这些随机地址与已知主机关联起来的东西。
以前获取 IRK 非常麻烦,通常要用 ESPresense 这种固件,折腾半天。现在,只要你的手机连接了这个 ESP32 键盘,插件就会直接显示该设备的身份解析密钥。
将这个密钥交给 Home Assistant 或另一个 ESP32 运行存在检测,就可以精准识别手机。这对于判断主人“回家/离家”非常有用。
⚠️ 重要避坑指南(必须看!)
不要将 esp32_ble_tracker 和这个 hid键盘 安装在同一个 ESP32 芯片上!
虽然程序可以编译通过且启动正常,但它们都会调用 esp32_ble。这会导致两个组件争用同一个回调函数,追踪器最终无法获取任何扫描结果。日志里不会报错,但你会发现手机明明在旁边,HA 却显示“永久不在”。
正确做法: 用第二个 ESP32 专门跑存在检测。示例代码如下:
esp32_ble_tracker:
binary_sensor:
- platform: ble_presence
name: "My iPhone Presence"
irk: 0123***********************def # 这里填你获取到的密钥
专属 Web 控制页:一键变身实体控制器
该插件内置了一个非常强大的 Web 控制页面。只需要在代码里配置 web_control: true,并在 esphome 里开启 web_server。
后续你可以通过访问 http://<esphome-device-ip>/ble_keyboard 进入。在这个页面里,你拥有:
- 全键盘模拟:直接在手机浏览器里给电视输入文字。
- 鼠标与触摸板:远程控制电视的光标。
- 媒体控制按钮:播放、暂停、音量调节。
这对于调试代码或者临时找不到遥控器的时候,简直是救命神器。
如何配置与使用?
注意:ESP8266 没有蓝牙,是不行的。必须使用 ESP32 芯片的设备(目前测试 ESP32 原生芯片完美支持,C3/S3 理论上也支持)。
以下是完整的 ESPHome 示例代码:
esphome:
name: cwd
friendly_name: cwd
esp32:
board: esp32dev
framework:
type: esp-idf
sdkconfig_options:
CONFIG_BT_ENABLED: y
CONFIG_BT_CONTROLLER_ENABLED: y
CONFIG_BT_BLUEDROID_ENABLED: y
CONFIG_BT_NIMBLE_ENABLED: n
CONFIG_BT_BLE_ENABLED: y
CONFIG_BT_GATTS_ENABLE: y
CONFIG_BT_BLE_42_FEATURES_SUPPORTED: y
CONFIG_BT_BLE_50_FEATURES_SUPPORTED: n
CONFIG_BT_BLE_42_ADV_EN: y
CONFIG_BT_BLE_42_SCAN_EN: y
CONFIG_BT_BLE_SMP_ENABLE: y
CONFIG_BT_ACL_CONNECTIONS: "4"
# 日志输出
logger:
# HA API 接入
api:
encryption:
key: "Cde********U="
ota:
- platform: esphome
password: "dd*********86"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Cwd Fallback Hotspot"
password: "5L*****7"
captive_portal:
web_server:
port: 80
# 引入外部组件
external_components:
- source:
type: git
url: https://github.com/markusg1234/ESPHome-espidf_ble_keyboard.git
ref: main
path: components
refresh: 0s
components: [ espidf_ble_keyboard ]
# 核心键盘配置
espidf_ble_keyboard:
id: my_keyboard
device_name: "cwdble" # 蓝牙搜索到的名字
api_services: true
key_delay_ms: 80
passkey_mode: legacy
host_slots: 2
web_control: true # 开启网页控制台
# 实体化控制按钮
button:
- platform: restart
name: "重启 ESP32"
- platform: espidf_ble_keyboard
keyboard_id: my_keyboard
name: "电视音量+"
action: "volume_up"
- platform: espidf_ble_keyboard
keyboard_id: my_keyboard
name: "电视音量-"
action: "volume_down"
- platform: espidf_ble_keyboard
keyboard_id: my_keyboard
name: "电视关机"
action: "remote_power"
代码刷入后,打开电视或平板的蓝牙设置,你会看到一个叫 cwdble 的键盘,点击配对。配对成功后,你在 HA 里的这些按钮就生效了,实际效果见下图!
插件评价与 v1.8.0 更新总结
这个组件的原作者 Markusg 非常给力,更新极其频繁,在 GitHub 社区的讨论也特别热烈。插件整体代码质量很高,基于原生的 ESP-IDF 框架,比普通的 Arduino 蓝牙库要稳定得多。
最近的 v1.8.0 版本更新了以下重点内容:
- IRK 密钥读取:在 Host Actions 中可以直接查看已配对设备的身份密钥,这是做高阶存在追踪的基石。
- 独立遥控器页面:支持
/ble_keyboard#remote 直接访问遥控器界面,并支持窗口弹出与置顶。
- 样式完全自定义:遥控器皮肤现在存储在设备上,支持圆形导航环、音量/频道摇杆、每按键颜色自定义。你可以通过导出的 JSON 自由定义布局。
- HA 动作映射:允许遥控器按键直接触发 HA 的 Native API 动作,打破了蓝牙设备与网关自动化之间的隔阂。
- 报错排查优化:新增了冲突检测,会明确告知哪个蓝牙组件占用了资源。
- 请求频率优化:大幅减少了 Web 端的 Polling 轮询请求,即使页面在后台也会自动停止请求,极大地减轻了 ESP32 的性能负担。
结语
如果你也正在为 HA 的平板中控亮屏而烦恼,或者想给电视做一个“不瞄准”的遥控器,这个 ESP32 蓝牙键盘组件绝对是目前的“标准答案”。
它不仅解决了 ADB 的不稳定性,还带来了 IRK 追踪这种高阶玩法。赶紧拿出你吃灰的 ESP32 试试吧!