本帖最后由 fentensoft 于 2023-12-19 10:51 编辑
家里的投影仪是一年多前买的当贝F3 Air,蓝牙遥控器,无红外,支持上电开机。为了接入HA实现自动化,尝试了三个不同的方案:
先是直接接了个智能插座,简单粗暴,开关 = 上下电。觉得不够优雅,尤其是关机,弃用了。
后来买了个Zigbee的手指机器人,通过模拟点按机器上的开关实现自动化。用了一段时间,缺点很明显:
1. 稳定性一般,延迟高。有时候发指令刚执行完,还会隔个十几秒,又执行一次。
2. 无法获取到投影仪真实开机的状态,没法实现更多玩法。当然也可以通过智能插座的功率来判断,但是这就有些多余了。
3. 噪音大,用过的朋友应该知道,这个小电机声音不小。
又弃用了。
最终还是选择ESP32玩点儿花的。这里讲下思路:
唤醒方式
官方的APP都不支持网络唤醒,本地也扫了一下mdns,确实在关机状态下没什么能用的服务,所以只能走蓝牙模拟。
拿nf52840抓了一下包,发现在关机状态下,按下开机键,遥控器会持续5秒广播带有特殊Manufactor Data的报文,5秒后消失,那推测大概率就是这段神秘数据触发了唤醒。
实践证明猜测正确。有没有懂行的老哥知道怎么解析这串数据,求科普。
关机方式
起初选择走网络途径,实现直接简单一些,毕竟官方APP自带局域网遥控功能。
抓包发现指令是通过WebSocket明文传输的,地址就是ws://投影仪IP:6689,数据内容忘记截图了,大概就只需要里面的Command和Value两个字段即可。后来代码也写了,通过mdns先找到投影仪的IP,再发送按键指令。不过ESP32上面的mdns一直不是很稳,服务扫描时有时无,也没心情仔细研究,就又转向了蓝牙抓包(有兴趣的朋友可以继续尝试一下)。
同样用nf52840抓了一下按下关机键时刻的BLE报文,发现电源键按下时,对应的HID Report值会变为0x0000660000,松开就会发0x0000000000,那么方向明晰了。
玩过HID抓包的朋友可能会发现这个数值格式并不是键盘鼠标这类设备的常见格式,又仔细研究了一番他的HID描述符,发现的确是自定义的。
看来现成的ESP32 HID Keyboard轮子还不能用,只能手撸一个了,说干就干。
最终实现的效果是通过ESP32模拟蓝牙报文触发投影仪开关,同时蓝牙连接的状态也能够反映出投影仪当前的工作状态。把这些信息通过MQTT,就可以接入到Home Assistant中,以一个开关的实体存在,配置代码如下:
mqtt:
- switch:
unique_id: esp32_projector_switch
name: "ESP32 Projector Switch"
state_topic: "esp32projector006"
command_topic: "esp32projector006"
至于是否稳定,容我再观察一段时间。
最终代码实现已经开源:https://github.com/fentensoft/esp32-dangbei-projector ,README还没写,后面再补上。
欢迎大家自由尝试,目前当贝F3 Air能够正确控制,其余设备未测试,但原理雷同。新人第一篇帖子,有问题也欢迎一起讨论。
|