(多个)蓝牙网关 TTL

您所在的位置:网站首页 米家wifi设备本地化 (多个)蓝牙网关 TTL

(多个)蓝牙网关 TTL

2023-11-20 04:39| 来源: 网络整理| 查看: 265

本帖最后由 XCray 于 2021-6-16 11:26 编辑

20210527更新: 改用n大的ESPHome实现方案,我对N大的代码稍微做了修改,主要是mqtt的topic和我以前的代码保持一致,这样之前做的ha侧的配置就不用动了,无缝切换。 mqttl_ESP.zip (2.2 KB, 下载次数: 218) 2021-5-27 11:02 上传 点击文件名下载附件 直接解压到esphome目录,然后根据自己的需要修改后编译、下载后利用原固件的ota升级即可。以后的修改就完全在ESPHome里完成了。

感谢n大,把我之前想做但没有做到的思路给实现了。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 20201103补充,重大缺陷: 小米蓝牙网关只有在完成云端通讯之后才会从TTL接口输出我们需要的消息,这样在网络状况不佳时,时延问题仍然不可避免!并且在外网中断时,TTL接口根本没有有用输出。

20210616补充: 可用的解决方案:用esp32等具备蓝牙接口的东西直接接收解密门锁发出的蓝牙消息,真正的零时延、真本地,详见签名贴。

当然,这个玩法的价值还是有的,只不过不像原来想的辣么好。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 最重要的一句话:可以同时支持多个蓝牙网关、任意蓝牙设备(只要能连接蓝牙网关)本地接入HA/NR,通用固件不用自己编译,含配网、OTA等功能。

当然,说的都是米家app里的东西,包括小米/米家和各个生态链企业的各种蓝牙产品。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 前段时间在killadm和jstormx等大神神贴的基础上,使用ESP-01S模块实现了从蓝牙网关TTL接口获取数据、转发至MQTT,从而实现了将蓝牙门锁、花花草草、蓝牙温湿度计2等蓝牙设备接入HASS,解决了之前最为头疼的门锁无法本地利用的问题。详见之前的帖子:

        - 米家蓝牙器件接入HA的最佳方案:蓝牙网关+TTL+MQTT,ex榉树锁             https://bbs.hassbian.com/thread-10055-1-1.html            注:这个帖子一定要看,硬件连接、来龙去脉、整体思路等等内容这儿就不再重复了。         - 填坑:killadm大神的LOCK2MQTT代码改造、编译、烧录             https://bbs.hassbian.com/thread-10218-1-1.html           注:这个帖子也要看,如何编译、烧写固件等重要内容这儿也不再重复。         - !ESP Home实现基于蓝牙网关-TTL的智能门锁等蓝牙设备接入             https://bbs.hassbian.com/thread-10250-1-1.html            注:这个帖子可以不看,算是一个分支,实验性的,我自己都不用。         - 我好像找到了ESP8266转发TTL串口发生丢消息问题的根本原因             https://bbs.hassbian.com/thread-10276-1-1.html            注:这个也要看,丢消息问题会造成自动化不触发等严重问题。

上面这几个帖子加上本贴,足以把整个事情交代的清清楚楚了。思路理清楚,实际操作才能心中有数。 另外,8楼有硬件连接信息,包括榉树网关和小白万能遥控器声控版。

正式开始: 经过两个月的运行,代码倒是基本稳定,一度造成困扰的丢消息现象也得到了解决。可是这个版本总是有一点不爽:只能适应手上有的这几个蓝牙设备。如果以后增加新的设备,还需要重新修改代码、重新编译升级,其他机油也难以直接拿去使用。

这两天突然想出了一个以不变应万变的方法:尽量简化ESP模块的任务、剩下的全部让HA承担。

具体来说,就是:

- ESP只负责从TTL获取数据、最简单的筛选(挑出含ble_event的行并从中摘出did/eid/edata这3项数据)、最无脑的转发(mqtt topic设为mqttl/did/eid,payload就是edata)。必须强调的是,对于长度超过1个字节的edata,根据格式要求进行逆序调整。 这样,不管是什么类型的蓝牙设备,只要可以连接蓝牙网关,就直接可以适应,不需要在ESP这边做任何适配工作。

- HA侧基于mqtt topic设置传感器,利用强大的template完成数据适配工作,包括edata串的截取、十六进制转换、时间戳转换等。

ESP侧核心代码:

//提取did/eid/edata String did = params["dev"]["did"]; int eid = params["evt"][0]["eid"]; String edata = params["evt"][0]["edata"]; if (edata.length() > 2) edata = revstr(edata);//凡长度超过2的edata一律调整逆序 String topic = "mqttl/"+did+"/"; topic += eid; //核心语句 mqtt_client.publish( topic.c_str(),edata.c_str(),false); HA侧,根据自己的需要和相应设备的消息格式,在yaml里完成所有的适配工作,比如榉树门锁的状态报告和开锁事件的4个传感器: sensor: - platform: mqtt name: LockStatus icon: 'mdi:door-closed-lock' state_topic: 'mqttl/设备did/4110' #替换成正确的did和eid value_template: >- {% if value == '00' %} 门未关! {% elif value == '01' %} 已关,未闩 {% elif value == '02' %} 已上闩 {% endif %} - platform: mqtt name: LockOpera icon: 'mdi:lock-smart' state_topic: 'mqttl/设备did/5' #替换成正确的did和eid value_template: >- {% if value[16:20] == '0200' %} 指纹 {% elif value[16:20] == '0100' %} 密码 {% elif value[16:20] == '0000' %} 蓝牙 {% endif %} - platform: mqtt name: KeyID icon: 'mdi:human-handsdown' state_topic: 'mqttl/设备did/5' #替换成正确的did和eid value_template: "{{ value[8:16] }}" - platform: mqtt name: OpTime icon: 'mdi:clock-in' state_topic: 'mqttl/设备did/5' #替换成正确的did和eid value_template: "{{ value[0:8]|int(0,16)|timestamp_local }}" 4个传感器分别为门锁状态、开锁方式、keyid、开锁时间。

完整的源码(WiFi、MQTT硬编码,需要自己编辑、编译): mqttl.zip (2.72 KB, 下载次数: 127) 2020-7-16 18:17 上传 点击文件名下载附件 第12~16以及22~25行,为wifi和mqtt相关配置参数,根据自己的情况修改即可

注:更新的通用版在本贴最后

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 20200717补充: 免编译通用版固件(含源码),直接在killadm最新版源码基础修改,保留配网功能。懒得自己编译的,可以直接刷入bin文件、配网(设置wifi名称密码和mqtt服务器参数)后即可使用。如果原固件支持OTA,也可以OTA刷入。 mqttl200717.zip (290.28 KB, 下载次数: 98) 2020-7-17 17:22 上传 点击文件名下载附件 配网方法: 如果没有配置wifi,模块就会启动热点,名称为 mqttl_xxxx,密码为 mqttlpassword 。

用手机等任何设备连接此热点就会自动进入配网页面,选择ssid,输入wifi密码、mqtt服务器地址端口号、用户名密码(如果有的话),保存。

保存后模块会重启,以后就都会以刚才保存的这套参数工作,直到重新刷。

之所以设置密码,是防止周围闲的蛋疼的人瞎连

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 20200718补充:

免编译通用版固件(含源码)更新,参阅18楼dscao朋友的说明,进一步提高适应性,根据模块序列号自动生成主机名(用作mqtt客户端id,和配网时自动生成的ssid名称一样,mqttl_xxxx),避免了多个模块使用同一个clientid连接至同一个mqtt服务器造成冲突的问题。这样,家里有多个蓝牙网关的,可以放心大胆地给每一个蓝牙网关接一个esp8266模块同时使用了。 mqttl200718.zip (290.87 KB, 下载次数: 92) 2020-7-18 14:24 上传 点击文件名下载附件

同样,压缩包里有源码和编译好的固件,懒得自己编译的可以直接刷。 可能有人还不知道,这个系列的固件(从killadm的代码开始)都是支持OTA的,通过http://ip地址/update访问、输入用户名和密码(默认都是admin)就可以上传升级固件了(上传后会自动用新的固件重启)。

~~~~~~~~~~~~~~~~~~分割线也升级了~~~~~~~~~~~~~~~~~~ 20200719补充:

小修改,倒数第二行,主循环最后的delay(100)修改为dely(1)。

100可能延时偏大,造成了消息丢失现象(很可能是、也可能不是这个原因)。 100msLost.png 登录/注册后可看大图

100msLost.png (18.63 KB, 下载次数: 0)

下载附件

2020-7-19 06:34 上传

12个小时里丢失7条,已经达到无法忍受的程度了!

之前用10,几天偶尔可见一次丢失,一直不确定是不是延时造成的。

改成1观察了一段时间,效果非常好,连续几天没有发现丢消息的问题,运行很稳定(我一直把网关敞着盖、ESP-01S模块露在外面)。

同样,源码和编译好的固件都在包里,直接OTA即可 mqttl200719.zip (290.83 KB, 下载次数: 385) 2020-7-19 06:37 上传 点击文件名下载附件

没有特别原因的话,这个版本基本不需要再做修改,可以长期使用了。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 剩下的事情才是最重要的:兼容所有米家蓝牙设备! ESP这边的工作没问题了,我们需要在HA侧针对每种设备定制yaml。我在3楼放上了我自己根据实际收集到的消息和小米文档定制的榉树门锁、花花草草监测仪和蓝牙温湿度2的配套yaml,同时我把看到的其他坛友提供的配套yaml信息也都放在3楼,大家多多沟通。

接下来,我有个提议:如果你用的是其他坛友未提及的种类的蓝牙设备,请上传你的yaml(可以把did隐去)。

或者你不知道如何定制yaml的话,可以把收集到的消息发出来,我们一起讨论如何编辑yaml(3楼有小米官方文档链接)。

相信经过大家的共同积累,用不了多久,这个程序一定可以纳入全部米家蓝牙设备、给更多的人带来更大的便利。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3