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

 找回密码
 立即注册
查看: 42021|回复: 62

[修仙教程] 米家蓝牙器件接入HA的较佳方案:蓝牙网关+TTL+MQTT,ex榉树锁

  [复制链接]

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

发表于 2020-5-23 19:11:06 | 显示全部楼层 |阅读模式
本帖最后由 XCray 于 2021-8-24 12:47 编辑

2121年8月补充:
这个只是较佳方案,不是最佳。。。
看我的签名贴,用esp32直接接收解密蓝牙消息,无论从原理还是效果上看,都比这个方案更好。

另,本贴所述方案已被n大在esphome里实现,比arduino自己编译的固件更便于维护管理,建议参阅相关帖子。

~~~~~~~~~~~~~~~以下是2020年11月份发的内容~~~~~~~~~~~
偶然间看到几个神贴:《小米智能门锁状态信息接入hass的非典型方法》https://bbs.hassbian.com/thread-8444-1-1.html《小米万能遥控器里的秘密-米家蓝牙传感器及门锁接入homeassistant》https://post.smzdm.com/p/a4wmp04x/
《米家智能门锁接入开源智能家居系统》https://github.com/killadm/LOCK2MQTT
深受感动!
我自己一直对门锁通过蓝牙网关联网这种方案非常痛恨(最大的原因是所有自动化都只能云端执行,时延太大以至于没啥实际价值)。蓝牙网关没有局域网接口,一直耿耿于怀。
看到这几位大神的文章,突然受到启发:
- 我用的虽然是榉树送的蓝牙网关,应该也有TTL、也可以输出我想要的一些消息吧?
- 我用的虽然不是米家自己品牌的门锁,可是榉树也支持米家app,消息格式是否也一致?
- 虽然我不想再增加ESP8266的开发版,可是手上有树莓派、NanoPi、群晖、USB串口卡,找个连TTL转发mqtt的东西很容易啊


该出手时就出手!
先把榉树网关拆开,简直就是想要啥有啥!妥妥的TTL接口,针脚都是现成的!
    jsgw.jpg
翻出来串口卡,一番折腾,终于在虚拟机Win7的超级终端(还是从XP现提取的)里看到了可爱的串口吐出来的消息!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!等等!这些消息和 jstormx 的《小米智能门锁状态信息接入hass的非典型方法》帖子里说的不一样啊!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
格式问题先放下,不能老开着电脑啊,先把TTL连到NanoPi上!
其实想先连树莓派来着,但树莓派的串口和蓝牙冲突而我又不想把蓝牙废掉,想了想,先连到NanoPi上吧。
NanoPi上虽然也有UART,但是没有焊接针脚,再说NanoPi现在是主路由,轻易不能停工。
好在NanoPi上的USB口空出来了,好在有USB串口卡,插到NanoPi上,直接认出/dev/ttyUSB0。
找了个测试脚本,简单修改一下,直接输出了榉树网关从TTL输出的消息。脚本内容:
#!/usr/bin/python3
# -*- coding: utf-8 -*
import serial
import time
ser = serial.Serial('/dev/ttyUSB0', 115200)

if ser.isOpen == False:
  ser.open()                # 打开串口
try:
  while True:
    size = ser.inWaiting()               # 获得缓冲区字符
    if size != 0:
      response = ser.read(size)        # 读取内容并显示
      print (response)

      ser.flushInput()                 # 清空接收缓存区
      time.sleep(0.1)                  # 软件延时
except KeyboardInterrupt:
  ser.close()


                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图


                               
登录/注册后可看大图

接下来一边研读小米IoT开发平台上的文档,一边用上面的小程序记录消息,然后结合分析
1. 榉树门锁的消息格式,和小米文档不太一致,和米家门锁也有明显差异
2. 有了格式,就可以挑选出需要的内容,通过mqtt协议发出来供hass使用了。

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图


6楼有重大进展。实现了榉树智能锁、花花草草传感器的本地接入——最大的好处就是没有时延、不依赖云端。顺便说一嘴,上面这段代码来自pyserial官方样例,但非常弱,会占用一个CPU内核几乎100%的时间。后来找到了高手给的合理的方法,CPU占用不到1%。

28楼有优化后的脚本,更稳定、更合理。

35楼增加了“米家蓝牙温湿度计2”的适配代码,就是方方、小小的那个。

后来,禁不住诱惑,迁移到了esp8266,我用的是最小巧的esp01-s模块,塞到榉树网关里很轻松,3v3的供电都是现成的。
这里有如何修改代码、如何编译、烧写的详细步骤:
https://bbs.hassbian.com/thread-10218-1-1.html

再后来,了解到了强大方便的ESP Home,也可以实现这个应用:
https://bbs.hassbian.com/thread-10250-1-1.html
如果C++的功力有,这应该是最佳方案了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20200716补充:
改进后的固件(硬件连接不变):
         https://bbs.hassbian.com/thread-10434-1-1.html
        【全新改版】蓝牙网关-TTL-MQTT-HA,适应米家所有蓝牙设备,支持多个蓝牙网关(每个网关搭配一个ESP模块)

可以适用于所有米家蓝牙设备的版本(只要可以连蓝牙网关,就直接可以用)。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20201103补充:
这个方案存在一个重大缺陷:
小米蓝牙网关的设计:只有在完成云端通讯之后,才会从TTL接口输出我们想要的消息!这样,网络状况不佳时,时延、丢消息也就依然存在;在外网中断的情况下,TTL接口完全没有有效消息输出!
正在探索新的解决方案,大家尽情期待吧~~



回复

使用道具 举报

8

主题

367

帖子

4015

积分

论坛元老

Rank: 8Rank: 8

积分
4015
金钱
3648
HASS币
10
发表于 2020-5-23 20:31:47 来自手机 | 显示全部楼层
一看标题也只有帮顶的份。。。
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-5-23 21:29:14 | 显示全部楼层
本帖最后由 XCray 于 2020-5-24 15:32 编辑
s2233 发表于 2020-5-23 20:31
一看标题也只有帮顶的份。。。

感谢帮顶!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
根据小米IoT开发者平台上的文档和实际消息来看,榉树使用的是小米已经废弃的和自己定制的格式,没有权威文档的话,只能慢慢猜。目前基本可以确定的是:
1. "eid":4110,"edata":"00" 表示门开着
    "eid":4110,"edata":"01" 表示门关着但没有上提反锁
    "eid":4110,"edata":"02" 表示门关着且已经上提反锁
2. "eid":5 表示锁事件,小米文档说的已废弃部分。但后面的edata格式和小米已废弃部分的说明也不一致。大概可以明确的是:
  - 开头两个字节表示“操作”和“操作方式”,具体含义分别为:
操作:
0x00:门外开锁 #貌似榉树只用了这一个
0x01:门外上锁
0x02:门内反锁
0x03:解除反锁
0x04:门内开锁
0x05:门内上锁
0xFF:异常

操作方式:
0x00:蓝牙
0x01:密码
0x02:指纹
0x03:钥匙
0x04:转盘
0x05:NFC
0x10:人工反锁
0x20:自动反锁
0xFF:异常

按照小米文档,后面跟的应该是4个字节的key,这部分似乎可以区分不同的人、不同的指纹/密码/手机等,但明显和小米文档不大一致。

电量和其他内容还没看到对应的消息
回复

使用道具 举报

35

主题

714

帖子

4765

积分

论坛元老

Rank: 8Rank: 8

积分
4765
金钱
4041
HASS币
60
发表于 2020-5-23 21:43:23 | 显示全部楼层
没有门锁,,但按论坛折腾精神,帮顶支持...........
回复

使用道具 举报

0

主题

24

帖子

159

积分

注册会员

Rank: 2

积分
159
金钱
135
HASS币
0
发表于 2020-5-23 21:43:55 | 显示全部楼层
关键没有锁啊
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-5-24 14:47:55 | 显示全部楼层
感谢楼上两位帮顶的朋友!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
折腾了一天,基本达到了可用的程度。
效果:这是在前端显示的状态数据:
js1.png
点开门锁,进一步显示更新时间(属性):
js2.png
点开开门动作,显示详细信息,KeyID可以识别出每个人、每种开锁手段(哪个指纹、哪个密码等):
js3.png
结合小米文档说明,总结我的观察结果,榉树蓝牙网关的TTL输出的关于榉树智能锁的消息没几条,主要是:
1、状态报告,差不多每分钟一次,eid为4110,edata有00、01、02三种,分别对应开门、关门未上提、关门且已上提;
2、开门动作报告,eid为5(小米说已废弃),edata长度10个字节:
  - 前面两个为操作和操作方式,我已经观察到0000、0001、0002,分别对应手机蓝牙开锁、密码开锁和指纹开锁,和小米文档一致。
  - 接下来4个字节为Key ID,可以识别出每个人、每种开锁手段(哪个指纹、哪个密码等),以及异常事件等。可以展开加以应用。
  - 最后4个字节为时间戳,逆序。上面途中的开锁时间就是用这个时间戳转换来的。
小米文档中说的其他事件,比如门内开门、上提等等,都没有看到有对应的消息。
电池电量也没有看到对应消息。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这样,正常开锁后,第一时间就可以在局域网内获取到开锁事件,观察不到延迟,比通过云端服务器执行的自动化强多了。解决了我长久以来一直感到别扭的时延问题。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
额外收获:
家里还有两个花花草草传感器,也可以通过这个方法加以集成了。只是花花草草的事件消息更多,还没来得及分析。
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-5-24 14:54:18 | 显示全部楼层
本帖最后由 XCray 于 2020-6-7 20:11 编辑

python脚本: uart2mqtt.py (3.33 KB, 下载次数: 24)

注:28楼有优化后的脚本,比这个更稳定、更合理

当然,最好配成开机自启动项目。
hass上配套的yaml:
sensor:
  - platform: mqtt
    name: Jvshu
    icon: 'mdi:lock'
    state_topic: 'mqttlock/state'
    json_attributes_topic: 'mqttlock/attr'
  - platform: mqtt
    name: doorOpera
    icon: 'mdi:lock-smart'
    state_topic: 'mqttlock/opra'
    json_attributes_topic: 'mqttlock/opattr'
homeassistant:
  customize:
    sensor.Jvshu:
      friendly_name: 门锁状态
    sensor.doorOpera:
      friendly_name: 开门动作
group:
  zelkova_lock:
    name: 榉树门锁
    entities:
      - sensor.Jvshu
      - sensor.doorOpera
hass上的自动化就不展开了,玩hass的应该都熟悉。


回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-5-25 10:09:49 | 显示全部楼层
js4.png
花花草草检测仪也可以通过这种方法集成到hass了!
hass原生的集成方法要求有蓝牙4.x才行,很多时候跑hass的平台还真不一定有蓝牙,比如群晖、路由器等。
花花草草上报的事件可以观察到的有如下几种:
"eid":4100——温度,单位是0.1摄氏度
"eid":4103——光照
"eid":4104——土壤湿度
"eid":4105——土壤肥力

这儿eid其实是10进制的(小米文档为十六进制,转换后能对上),而后面的edata是实际数据,为十六进制逆序。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
对了,哪位知道 group 卡片右上角那个讨厌的开关如何去掉?根本没有任何意义
回复

使用道具 举报

8

主题

367

帖子

4015

积分

论坛元老

Rank: 8Rank: 8

积分
4015
金钱
3648
HASS币
10
发表于 2020-5-25 19:04:53 | 显示全部楼层
本帖最后由 s2233 于 2020-5-25 19:12 编辑

用group?  旧版本States ui?
应该是加
control: hidden

记不太清了
group:
  zelkova_lock:
    name: 榉树门锁
    entities:
      - sensor.Jvshu
      - sensor.doorOpera
    control: hidden



回复

使用道具 举报

2

主题

302

帖子

1675

积分

金牌会员

Rank: 6Rank: 6

积分
1675
金钱
1372
HASS币
0
发表于 2020-5-25 19:23:20 | 显示全部楼层
感谢分享
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-12-25 13:23 , Processed in 0.115911 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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