『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 1874|回复: 24

[经验分享] 当贝投影仪通过ESP32接入HA方案,代码已开源

[复制链接]

1

主题

5

帖子

148

积分

注册会员

Rank: 2

积分
148
金钱
143
HASS币
0
发表于 2023-12-19 01:16:02 | 显示全部楼层 |阅读模式
本帖最后由 fentensoft 于 2023-12-19 10:51 编辑

家里的投影仪是一年多前买的当贝F3 Air,蓝牙遥控器,无红外,支持上电开机。为了接入HA实现自动化,尝试了三个不同的方案:
先是直接接了个智能插座,简单粗暴,开关 = 上下电。觉得不够优雅,尤其是关机,弃用了。

后来买了个Zigbee的手指机器人,通过模拟点按机器上的开关实现自动化。用了一段时间,缺点很明显:
1. 稳定性一般,延迟高。有时候发指令刚执行完,还会隔个十几秒,又执行一次。
2. 无法获取到投影仪真实开机的状态,没法实现更多玩法。当然也可以通过智能插座的功率来判断,但是这就有些多余了。
3. 噪音大,用过的朋友应该知道,这个小电机声音不小。
又弃用了。

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

唤醒方式
官方的APP都不支持网络唤醒,本地也扫了一下mdns,确实在关机状态下没什么能用的服务,所以只能走蓝牙模拟。
拿nf52840抓了一下包,发现在关机状态下,按下开机键,遥控器会持续5秒广播带有特殊Manufactor Data的报文,5秒后消失,那推测大概率就是这段神秘数据触发了唤醒。
1.jpg
实践证明猜测正确。有没有懂行的老哥知道怎么解析这串数据,求科普。

关机方式
起初选择走网络途径,实现直接简单一些,毕竟官方APP自带局域网遥控功能。
抓包发现指令是通过WebSocket明文传输的,地址就是ws://投影仪IP:6689,数据内容忘记截图了,大概就只需要里面的Command和Value两个字段即可。后来代码也写了,通过mdns先找到投影仪的IP,再发送按键指令。不过ESP32上面的mdns一直不是很稳,服务扫描时有时无,也没心情仔细研究,就又转向了蓝牙抓包(有兴趣的朋友可以继续尝试一下)。
同样用nf52840抓了一下按下关机键时刻的BLE报文,发现电源键按下时,对应的HID Report值会变为0x0000660000,松开就会发0x0000000000,那么方向明晰了。
2.JPG
玩过HID抓包的朋友可能会发现这个数值格式并不是键盘鼠标这类设备的常见格式,又仔细研究了一番他的HID描述符,发现的确是自定义的。
3.png
看来现成的ESP32 HID Keyboard轮子还不能用,只能手撸一个了,说干就干。

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

4.png

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

最终代码实现已经开源:https://github.com/fentensoft/esp32-dangbei-projector ,README还没写,后面再补上。
欢迎大家自由尝试,目前当贝F3 Air能够正确控制,其余设备未测试,但原理雷同。新人第一篇帖子,有问题也欢迎一起讨论。


评分

参与人数 6金钱 +74 收起 理由
dongjianwei + 4 用楼主代码已测试OK
gmshiwoge + 12 厉害了word楼主!
sirakawa + 12 纳尼,还有这种操作?
隔壁的王叔叔 + 10 墙都不扶,就服楼主!
dscao + 20 感谢楼主分享!
sorrypqa + 16 大神666!

查看全部评分

回复

使用道具 举报

1

主题

90

帖子

535

积分

高级会员

Rank: 4

积分
535
金钱
445
HASS币
0
发表于 2023-12-19 09:39:50 来自手机 | 显示全部楼层
当贝X3观望一下
回复

使用道具 举报

7

主题

1072

帖子

3361

积分

论坛元老

Rank: 8Rank: 8

积分
3361
金钱
2289
HASS币
0
发表于 2023-12-19 09:50:05 | 显示全部楼层
大佬是真牛b啊
回复

使用道具 举报

5

主题

62

帖子

683

积分

高级会员

Rank: 4

积分
683
金钱
621
HASS币
0
发表于 2023-12-19 18:12:31 | 显示全部楼层
极米z6x,看大佬的帖子,https://bbs.hassbian.com/thread-16308-1-1.html
实现了抓包用 安卓手机发送蓝牙命令来开机,但是我的ha没有能发送蓝牙指令的硬件在里面,
有多余的esp32,但是没研究出用什么方式可以让esp32接入ha发送蓝牙指令
回复

使用道具 举报

1

主题

5

帖子

148

积分

注册会员

Rank: 2

积分
148
金钱
143
HASS币
0
 楼主| 发表于 2023-12-19 18:16:41 | 显示全部楼层
shenmirenQUQ 发表于 2023-12-19 18:12
极米z6x,看大佬的帖子,https://bbs.hassbian.com/thread-16308-1-1.html
实现了抓包用 安卓手机发送蓝 ...

接入HA我用的MQTT
回复

使用道具 举报

5

主题

62

帖子

683

积分

高级会员

Rank: 4

积分
683
金钱
621
HASS币
0
发表于 2023-12-19 18:17:40 | 显示全部楼层
楼主能说说你这固件在哪改Manufactor Data吗,我看了一圈好像没找到,
我有我投影仪的Manufactor Data,我想尝试下改掉刷进esp32里面试试看
回复

使用道具 举报

1

主题

5

帖子

148

积分

注册会员

Rank: 2

积分
148
金钱
143
HASS币
0
 楼主| 发表于 2023-12-19 18:22:27 | 显示全部楼层
shenmirenQUQ 发表于 2023-12-19 18:17
楼主能说说你这固件在哪改Manufactor Data吗,我看了一圈好像没找到,
我有我投影仪的Manufactor Data,我 ...

噢噢,代码README我还在写,抱歉。

Manufactor Data在src/ble_remote.cpp的第24行,有一个13位的数组。

接入HA的话,需要本地部署一个MQTT的服务器(EMQX、Mosquito都可以),然后把WiFi密码、MQTT服务器和端口改到src/main.cpp的第20行开始。
在HA端,添加一个MQTT集成,然后configuration.yaml里面用我帖子里面那段代码就可以啦。
回复

使用道具 举报

5

主题

62

帖子

683

积分

高级会员

Rank: 4

积分
683
金钱
621
HASS币
0
发表于 2023-12-19 18:24:17 | 显示全部楼层
char manufacturerData[] = {0x46, 0x00, 0x46, 0xFA, 0xC1, 0x69, 0x04,
                           0xC8, 0x38, 0xFF, 0xFF, 0xFF, 0xFF};


z6x pro:cfbb25d6e69b20ffffff3043524b544d

应该把这个替换掉就可以了把
回复

使用道具 举报

1

主题

5

帖子

148

积分

注册会员

Rank: 2

积分
148
金钱
143
HASS币
0
 楼主| 发表于 2023-12-19 18:28:13 | 显示全部楼层
shenmirenQUQ 发表于 2023-12-19 18:24
char manufacturerData[] = {0x46, 0x00, 0x46, 0xFA, 0xC1, 0x69, 0x04,
                           0xC8 ...

是的,没错
回复

使用道具 举报

5

主题

62

帖子

683

积分

高级会员

Rank: 4

积分
683
金钱
621
HASS币
0
发表于 2023-12-19 18:33:01 | 显示全部楼层
fentensoft 发表于 2023-12-19 18:22
噢噢,代码README我还在写,抱歉。

Manufactor Data在src/ble_remote.cpp的第24行,有一个13位的数组。

我试下,感谢
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-28 03:11 , Processed in 3.845884 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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