本帖最后由 XCray 于 2021-6-16 11:26 编辑
20210527更新:
改用n大的ESPHome实现方案,我对N大的代码稍微做了修改,主要是mqtt的topic和我以前的代码保持一致,这样之前做的ha侧的配置就不用动了,无缝切换。
mqttl_ESP.zip
(2.2 KB, 下载次数: 260)
直接解压到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, 下载次数: 133)
第12~16以及22~25行,为wifi和mqtt相关配置参数,根据自己的情况修改即可
注:更新的通用版在本贴最后
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20200717补充:
免编译通用版固件(含源码),直接在killadm最新版源码基础修改,保留配网功能。懒得自己编译的,可以直接刷入bin文件、配网(设置wifi名称密码和mqtt服务器参数)后即可使用。如果原固件支持OTA,也可以OTA刷入。
mqttl200717.zip
(290.28 KB, 下载次数: 100)
配网方法:
如果没有配置wifi,模块就会启动热点,名称为 mqttl_xxxx,密码为 mqttlpassword 。
用手机等任何设备连接此热点就会自动进入配网页面,选择ssid,输入wifi密码、mqtt服务器地址端口号、用户名密码(如果有的话),保存。
保存后模块会重启,以后就都会以刚才保存的这套参数工作,直到重新刷。
之所以设置密码,是防止周围闲的蛋疼的人瞎连
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20200718补充:
免编译通用版固件(含源码)更新,参阅18楼dscao朋友的说明,进一步提高适应性,根据模块序列号自动生成主机名(用作mqtt客户端id,和配网时自动生成的ssid名称一样,mqttl_xxxx),避免了多个模块使用同一个clientid连接至同一个mqtt服务器造成冲突的问题。这样,家里有多个蓝牙网关的,可以放心大胆地给每一个蓝牙网关接一个esp8266模块同时使用了。
mqttl200718.zip
(290.87 KB, 下载次数: 94)
同样,压缩包里有源码和编译好的固件,懒得自己编译的可以直接刷。
可能有人还不知道,这个系列的固件(从killadm的代码开始)都是支持OTA的,通过http://ip地址/update访问、输入用户名和密码(默认都是admin)就可以上传升级固件了(上传后会自动用新的固件重启)。
~~~~~~~~~~~~~~~~~~分割线也升级了~~~~~~~~~~~~~~~~~~
20200719补充:
小修改,倒数第二行,主循环最后的delay(100)修改为dely(1)。
100可能延时偏大,造成了消息丢失现象(很可能是、也可能不是这个原因)。
12个小时里丢失7条,已经达到无法忍受的程度了!
之前用10,几天偶尔可见一次丢失,一直不确定是不是延时造成的。
改成1观察了一段时间,效果非常好,连续几天没有发现丢消息的问题,运行很稳定(我一直把网关敞着盖、ESP-01S模块露在外面)。
同样,源码和编译好的固件都在包里,直接OTA即可
mqttl200719.zip
(290.83 KB, 下载次数: 402)
没有特别原因的话,这个版本基本不需要再做修改,可以长期使用了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
剩下的事情才是最重要的:兼容所有米家蓝牙设备!
ESP这边的工作没问题了,我们需要在HA侧针对每种设备定制yaml。我在3楼放上了我自己根据实际收集到的消息和小米文档定制的榉树门锁、花花草草监测仪和蓝牙温湿度2的配套yaml,同时我把看到的其他坛友提供的配套yaml信息也都放在3楼,大家多多沟通。
接下来,我有个提议:如果你用的是其他坛友未提及的种类的蓝牙设备,请上传你的yaml(可以把did隐去)。
或者你不知道如何定制yaml的话,可以把收集到的消息发出来,我们一起讨论如何编辑yaml(3楼有小米官方文档链接)。
相信经过大家的共同积累,用不了多久,这个程序一定可以纳入全部米家蓝牙设备、给更多的人带来更大的便利。
|