家里的投影仪是当贝F3 Air,蓝牙遥控器,无红外,支持上电开机。为了接入HA实现自动化,尝试了三个不同的方案:
先是直接接了个智能插座,简单粗暴,开关 = 上下电。觉得不够优雅,尤其是关机,弃用了。
最终还是选择ESP32玩点儿花的。这里讲下思路:
1、唤醒方式
官方的APP都不支持网络唤醒,本地也扫了一下mdns,确实在关机状态下没什么能用的服务,所以只能走蓝牙模拟。
拿nf52840抓了一下包,发现在关机状态下,按下开机键,遥控器会持续5秒广播带有特殊Manufactor Data的报文,5秒后消失,那推测大概率就是这段神秘数据触发了唤醒。
实践证明猜测正确。有没有懂行的老哥知道怎么解析这串数据,求科普。
2、关机方式
起初选择走网络途径,实现直接简单一些,毕竟官方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中,以一个开关的实体存在,配置代码如下:
至于是否稳定,容我再观察一段时间。
最终代码实现已经开源:https://github.com/fentensoft/esp32-dangbei-projector,README还没写。
欢迎大家自由尝试,目前当贝F3 Air能够正确控制,其余设备未测试,但原理雷同。
先是直接接了个智能插座,简单粗暴,开关 = 上下电。觉得不够优雅,尤其是关机,弃用了。
最终还是选择ESP32玩点儿花的。这里讲下思路:
1、唤醒方式
官方的APP都不支持网络唤醒,本地也扫了一下mdns,确实在关机状态下没什么能用的服务,所以只能走蓝牙模拟。
拿nf52840抓了一下包,发现在关机状态下,按下开机键,遥控器会持续5秒广播带有特殊Manufactor Data的报文,5秒后消失,那推测大概率就是这段神秘数据触发了唤醒。
实践证明猜测正确。有没有懂行的老哥知道怎么解析这串数据,求科普。
2、关机方式
起初选择走网络途径,实现直接简单一些,毕竟官方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中,以一个开关的实体存在,配置代码如下:
至于是否稳定,容我再观察一段时间。
最终代码实现已经开源:https://github.com/fentensoft/esp32-dangbei-projector,README还没写。
欢迎大家自由尝试,目前当贝F3 Air能够正确控制,其余设备未测试,但原理雷同。
上一篇:当贝F6的节能模式如何打开 当贝F6节能模式打开教程
下一篇: 当贝X5 Ultra的节能模式如何打开 当贝X5 Ultra节能模式打开...
-
发表于 2024-1-11 16:27|当贝X3观望一下
-
发表于 2024-1-11 16:27|char manufacturerData[] = {0x46, 0x00, 0x46, 0xFA, 0xC1, 0x69, 0x04,0xC8, 0x38, 0xFF, 0xFF, 0xFF, 0xFF};z6x pro:cfbb25d6e69b20ffffff3043524b544d应该把这个替换掉就可以了把
-
楼主|发表于 2024-1-11 16:27|char manufacturerData[] = {0x46, 0x00, 0x46, 0xFA, 0xC1, 0x69, 0x04,0xC ...是的,没错