背景
家里的小米智能门锁,有时出门了,总是怀疑门是否已经关上了。小米智能门锁的状态要看,只能通过蓝牙网关来看。但是有了蓝牙网关,也希望它里面的状态能被接入到HA或iob,以便做些自动化。直至遇上killadm。前后折腾了快半年,今天终于调通了。
原理
K大说的很清楚了:小白万能遥控器的PCB上存在串口测试点,该串口会不停输出运行日志,当它作为米家智能门锁的蓝牙网关时,串口同样会明文输出门锁发送给网关的消息。 本项目通过ESP8266接收网关的串口日志,提取米家智能门锁相关的消息,经过处理后,序列化为json数据,并通过mqtt协议输出。
交互图

操作步骤
烧录
连线

烧写模式接线方法:(用USB转TTL串口连接模块与PC)
nodemcu u转串
VCC(对应nodemcu的3V3)-----------3.3
GND----------GND
EN--------3.3
RX-------------TX
TX-------------Rx
gpio0(对应nodemcu中的D3)----------GND
其余引脚为空。

下载固件
开始烧录
特别是SIP我选择了DIO。

验证是否烧录成功
拔掉这根连线gpio0(对应nodemcu中的D3)----------GND (其他的线保持不变) ,重新上电(就是将ttl usb口重新拔插),可以看到一个新的连接热点,表示成功

配网
连接热点


小白万能遥控器 连接 nodemcu
连线
小白 nodemcu
VBUS(它输出5V) —VIN
GND—GND
TX—RX
就连这三条线即可。
nodemcu 如何放得进 小白万能遥控器
我是将nodemcu的脚针都折断(融胶封一下裸露金属脚,避免接触小白上的元件),也将小白万能遥控器的盖子上一个螺丝柱拧断了。
遇到的问题
-
nodemcu 烧录 lock2mqtt固件,已经可以发现热点,连接热点,打开192.168.4.1设置wifi了,在路由器上可以看到重新获取了一个新的IP。这些都已经完成。有么办法重新会到刚才的192.168.4.1的访问页面吗(我想重新设置wifi)。
结论:问了一圈,好像只能重新刷固件。
-
发现一个奇怪的问题(偶现):重新刷固件,也没有重新出现LOCK2MQTT开头的热点
一直误以为是接线的问题,后来发现是上一次配置的wifi信息还在,导致跳过了连热点配网的环节。可能也是没有刷成功,还是上一次的?目前还没找到原因。
-
如何确认nodemcu烧录lock2mqtt固件是没问题的?
首先烧录后能配网成功,另外ping -t {nodemcu获取的IP} 看网络是否稳定
另外可以连接到ttl上,看看串口输出什么。
连线:
nodemcu u转串
VCC(对应nodemcu的3V3)-----------3.3
GND----------GND
EN--------3.3
RX-------------TX
TX-------------Rx
其余引脚为空。
有人的串口调试工具,打印的内容:
微软的串口调试工具(推荐),打印的内容,更具体:
编码就使用ascii

- 如何确认小白万能遥控器能否是输出小米智能门锁的事件?
前提:小米智能门锁 已经 接入到 小白万能遥控器的“蓝牙网关”,在小米APP就可以操纵。
连线:
小白万能遥控器 u转串
GND----------GND (特别注意需要这个连线)
RX-------------TX
TX-------------Rx
其余引脚为空。
刚连接上,可以看到打印的日志:
开门关门,可以看到捕获到的事件的日志:
- 如何确认小白万能遥控器能否是输出小米智能门锁的事件,通过nodemcu 报给了mqtt?
mqtt客户端订阅事件:LOCK2MQTT/event
特别感谢
killadm :
想入坑的1号就可以下单了
问题1:等大神来填坑吧,我只管挖坑,要是能拉罗大入坑的话这都不叫事 
问题2:arduino中点击工具,Erase Flash选项选择sketch+WIFI Settings就可以清wifi信息了
目前还存在的问题:
1.8266接收的串口数据中有乱码,所以只匹配了米家智能门锁的部分json,如果乱码的问题能解决,可以实现蓝牙网关的全功能转发。
2.稳定性还有问题,半年大概失去响应三次,重启可以解决,原因未知。
3.折腾难度还是有点大,如果哪个硬件大佬呢能够画个带贴片弹簧针的板子,再加个射频,再开个车… 
正在用大佬的lock2mqtt,好像确实不太稳定,用esphome或者tasmota之类的,原样把串口数据通过mqtt转发到NR,然后用NR处理数据能不能好一些?应该也更灵活吧
并且门锁可以买京东备件库的,我买的霸王锁体比这个还便宜,带官方保修和安装 
秋雨轩
#6
有人把HA的帖子弄到这里了,不过加上了自己的操作和图片,加上了自己发现的坑,不错的教程。
秋雨轩
#7
k大,有个这个帖子,好像也是在你的成果基础上弄的。
这个是用的是wemos D1 mini开发板,刷的espeasy固件,据说可以把米家各种蓝牙温湿度传感器以及米家智能门锁的传感器都获取到。
https://baijiahao.baidu.com/s?id=1667391131766380269&wfr=spider&for=pc
可以试试,如果转发过去的数据都是完整的就可以,我怀疑是我取串口数据的姿势不对,等大神完善吧
这个在张大妈上看到过
数据都能取到,红外收发的数据也有,只是esp8266得到的数据经常有乱码,不知道是我硬件的问题还是代码的问题,理论上能接入这个网关的蓝牙设备都可以取到数据,就等大佬们入坑了 
秋雨轩
#10
是啊,也不知道他们其他人用的稳定不,还是玩的人少。
我也发现了,在nodered监听到mqtt数据有乱码。这样处理一下:
安装节点:node-red-contrib-iconv
然后就可以使用 converter 节点,它的输入是 Buffer
XCray
#14
感谢k大的开拓!
学习这个思路,我用榉树网关 + 树莓派/NanoPi + Python脚本,实现了榉树门锁、花花草草、蓝牙温湿度2的接入,现在脚本已非常稳定,并且可用于新硬件的前期工作(消息收集,不认识的都记录在syslog里)。
榉树门锁不大符合小米官方的文档说明,所以没办法直接用esp8266刷k大的固件。另外,树莓派/NanoPi的性能、python的便利性,加上esp8266还不会玩,是我没有选择照搬k大方案的原因。
详细信息发在了hassbian,因为我用的移动宽带跟这个论坛有仇、看不到图片、发帖太费劲,感兴趣的请移尊步吧
我按照张大妈有篇文章用wemos d1mini刷espeasy固件,效果很不好。偶尔才收到门锁信息。还没找到原因。
XCray
#16
我有些怀疑是esp性能不足(或者说程序优化不够导致资源被过度消耗)导致的丢失消息。
我用树莓派/NanoPi,python脚本。在从串口接收消息的方法上有一种会导致一个核100%占用,后来找到了另一种优化的代码,串口接收几乎不占cpu了。
虽然我两个多星期没看到丢失消息的现象(我用的门锁每分钟会上报一条状态,我特意把每次上报时间打印出来分析相邻两次的间隔,如果有丢失消息的问题这样就能看出来)。
但是,偶尔会出现一条消息中丢失一个字符的问题,大概三五天出现一次,有时候丢个0,有时候丢个中括号大括号啥的,导致数据解析错误。
不知道这个错误是在哪个环节产生的,蓝牙传感器器件、蓝牙网关、干扰、串口芯片性能?实在不好判断
目前只能简单的把错误消息忽视掉。
不是网关的问题,用usb转ttl接网关不会有乱码,应该还是esp性能的问题
找到一篇文章, 用readStringUntil()读取整行效率更高,有时间试试
更新了一版
XCray
#18
https://bbs.hassbian.com/thread-10218-1-1.html
替偷懒的大神们填坑,我自己用榉树蓝牙网关、esp01s,改造了k神的代码(适应我自己用的榉树门锁、花花草草和蓝牙温湿度2),然后编译、烧写。
已经在成功运行,接下来尝试优化代码(先得学习。。。)
我用的移动宽带,访问这个论坛看不到图,就不在这儿费劲发帖了。。。
robot
#19
大神牛逼!
我最近也出现了用手机看不了论坛的图的情况。。。 
让老妖有空弄弄论坛设置看看
XCray
#20
又挖了一个新坑。。。
使用ESP Home实现TTL到传感器的转换(不用mqtt):
https://bbs.hassbian.com/thread-10250-1-1.html
我的代码能力不够,C++就没好好学过,arduino也没玩过,编程的坑实在填不过来。不过思路很简单,代码也已经实现基本功能,期待有兴趣的高手加以完善优化: