ZNDS智能电视网 推荐当贝市场

TV应用下载 / 资源分享区

软件下载 | 游戏 | 讨论 | 电视计算器

综合交流 / 评测 / 活动区

交流区 | 测硬件 | 网站活动 | Z币中心

新手入门 / 进阶 / 社区互助

新手 | 你问我答 | 免费刷机救砖 | ROM固件

查看: 16118|回复: 4
上一主题 下一主题
[分享]

当贝投影仪通过ESP32接入HA方案 实现开关机自由

[复制链接]
跳转到指定楼层
楼主
发表于 2024-1-11 16:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式 | 来自云南
家里的投影仪是当贝F3 Air,蓝牙遥控器,无红外,支持上电开机。为了接入HA实现自动化,尝试了三个不同的方案:
先是直接接了个智能插座,简单粗暴,开关 = 上下电。觉得不够优雅,尤其是关机,弃用了。

后来买了个Zigbee的手指机器人,通过模拟点按机器上的开关实现自动化。用了一段时间,缺点很明显:

1. 稳定性一般,延迟高。有时候发指令刚执行完,还会隔个十几秒,又执行一次。

2. 无法获取到投影仪真实开机的状态,没法实现更多玩法。当然也可以通过智能插座的功率来判断,但是这就有些多余了。

3. 噪音大,用过的朋友应该知道,这个小电机声音不小。
又弃用了。

最终还是选择ESP32玩点儿花的。这里讲下思路:

1、唤醒方式

官方的APP都不支持网络唤醒,本地也扫了一下mdns,确实在关机状态下没什么能用的服务,所以只能走蓝牙模拟。

拿nf52840抓了一下包,发现在关机状态下,按下开机键,遥控器会持续5秒广播带有特殊Manufactor Data的报文,5秒后消失,那推测大概率就是这段神秘数据触发了唤醒。

当贝投影仪通过ESP32接入HA方案 实现开关机自由


实践证明猜测正确。有没有懂行的老哥知道怎么解析这串数据,求科普。

2、关机方式

起初选择走网络途径,实现直接简单一些,毕竟官方APP自带局域网遥控功能。

抓包发现指令是通过WebSocket明文传输的,地址就是ws://投影仪IP:6689,数据内容忘记截图了,大概就只需要里面的Command和Value两个字段即可。后来代码也写了,通过mdns先找到投影仪的IP,再发送按键指令。不过ESP32上面的mdns一直不是很稳,服务扫描时有时无,也没心情仔细研究,就又转向了蓝牙抓包(有兴趣的朋友可以继续尝试一下)。

同样用nf52840抓了一下按下关机键时刻的BLE报文,发现电源键按下时,对应的HID Report值会变为0x0000660000,松开就会发0x0000000000,那么方向明晰了。

当贝投影仪通过ESP32接入HA方案 实现开关机自由

玩过HID抓包的朋友可能会发现这个数值格式并不是键盘鼠标这类设备的常见格式,又仔细研究了一番他的HID描述符,发现的确是自定义的。

当贝投影仪通过ESP32接入HA方案 实现开关机自由

看来现成的ESP32 HID Keyboard轮子还不能用,只能手撸一个了,说干就干。

最终实现的效果是通过ESP32模拟蓝牙报文触发投影仪开关,同时蓝牙连接的状态也能够反映出投影仪当前的工作状态。把这些信息通过MQTT,就可以接入到Home Assistant中,以一个开关的实体存在,配置代码如下:

  1. mqtt:
  2.   - switch:
  3.       unique_id: esp32_projector_switch
  4.       name: "ESP32 Projector Switch"
  5.       state_topic: "esp32projector006"
  6.       command_topic: "esp32projector006"
复制代码

当贝投影仪通过ESP32接入HA方案 实现开关机自由

至于是否稳定,容我再观察一段时间。

最终代码实现已经开源: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 | 只看该作者 | 来自云南
黑天 发表于 2024-1-11 16:27
char manufacturerData[] = {0x46, 0x00, 0x46, 0xFA, 0xC1, 0x69, 0x04,
                           0xC ...

是的,没错
回复 支持 反对

使用道具 举报

5#
发表于 2024-1-12 09:19 | 只看该作者 | 来自甘肃
你真是大神啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|新帖|标签|软件|Sitemap|ZNDS智能电视网 ( 苏ICP备2023012627号 )

网络信息服务信用承诺书 | 增值电信业务经营许可证:苏B2-20221768 丨 苏公网安备 32011402011373号

GMT+8, 2024-11-21 18:09 , Processed in 0.061299 second(s), 15 queries , Redis On.

Powered by Discuz!

监督举报:report#znds.com (请将#替换为@)

© 2007-2024 ZNDS.Com

快速回复 返回顶部 返回列表