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

标题: 米家蓝牙器件接入HA的较佳方案:蓝牙网关+TTL+MQTT,ex榉树锁 [打印本页]

作者: XCray    时间: 2020-5-23 19:11
标题: 米家蓝牙器件接入HA的较佳方案:蓝牙网关+TTL+MQTT,ex榉树锁
本帖最后由 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接口,针脚都是现成的!
    [attach]23147[/attach]
翻出来串口卡,一番折腾,终于在虚拟机Win7的超级终端(还是从XP现提取的)里看到了可爱的串口吐出来的消息!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!等等!这些消息和 jstormx 的《小米智能门锁状态信息接入hass的非典型方法》帖子里说的不一样啊!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
格式问题先放下,不能老开着电脑啊,先把TTL连到NanoPi上!
其实想先连树莓派来着,但树莓派的串口和蓝牙冲突而我又不想把蓝牙废掉,想了想,先连到NanoPi上吧。
NanoPi上虽然也有UART,但是没有焊接针脚,再说NanoPi现在是主路由,轻易不能停工。
好在NanoPi上的USB口空出来了,好在有USB串口卡,插到NanoPi上,直接认出/dev/ttyUSB0。
找了个测试脚本,简单修改一下,直接输出了榉树网关从TTL输出的消息。脚本内容:
  1. #!/usr/bin/python3
  2. # -*- coding: utf-8 -*
  3. import serial
  4. import time
  5. ser = serial.Serial('/dev/ttyUSB0', 115200)

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

  14.       ser.flushInput()                 # 清空接收缓存区
  15.       time.sleep(0.1)                  # 软件延时
  16. except KeyboardInterrupt:
  17.   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接口完全没有有效消息输出!
正在探索新的解决方案,大家尽情期待吧~~




作者: s2233    时间: 2020-5-23 20:31
一看标题也只有帮顶的份。。。
作者: XCray    时间: 2020-5-23 21:29
本帖最后由 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,这部分似乎可以区分不同的人、不同的指纹/密码/手机等,但明显和小米文档不大一致。

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

作者: XCray    时间: 2020-5-24 14:54
本帖最后由 XCray 于 2020-6-7 20:11 编辑

python脚本:[attach]23172[/attach]

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

当然,最好配成开机自启动项目。
hass上配套的yaml:
  1. sensor:
  2.   - platform: mqtt
  3.     name: Jvshu
  4.     icon: 'mdi:lock'
  5.     state_topic: 'mqttlock/state'
  6.     json_attributes_topic: 'mqttlock/attr'
  7.   - platform: mqtt
  8.     name: doorOpera
  9.     icon: 'mdi:lock-smart'
  10.     state_topic: 'mqttlock/opra'
  11.     json_attributes_topic: 'mqttlock/opattr'
  12. homeassistant:
  13.   customize:
  14.     sensor.Jvshu:
  15.       friendly_name: 门锁状态
  16.     sensor.doorOpera:
  17.       friendly_name: 开门动作
  18. group:
  19.   zelkova_lock:
  20.     name: 榉树门锁
  21.     entities:
  22.       - sensor.Jvshu
  23.       - sensor.doorOpera
复制代码
hass上的自动化就不展开了,玩hass的应该都熟悉。



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

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

作者: s2233    时间: 2020-5-25 19:04
本帖最后由 s2233 于 2020-5-25 19:12 编辑

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

记不太清了
  1. group:
  2.   zelkova_lock:
  3.     name: 榉树门锁
  4.     entities:
  5.       - sensor.Jvshu
  6.       - sensor.doorOpera
  7.     control: hidden
复制代码




作者: dawn98    时间: 2020-5-25 19:23
感谢分享
作者: XCray    时间: 2020-5-25 20:25
s2233 发表于 2020-5-25 19:04
用group?  旧版本States ui?
应该是加
control: hidden

谢谢~~我这是新版,lovelace。
group可以指定一个图标,但没有任何卵用。
点右上角3个点,取消自动配置,改成手动配置,倒是可以修改。
相应card有个属性:show_header_toggle,改成false就可以了。
不过这样有一点不爽,就是以后增加任何实体,都需要手动修改才行,否则不会自动显示在前端。
不知道是否还有其他方法、不影响lavelace自动配置的情况下解决这个问题?
作者: XCray    时间: 2020-5-27 20:45
米家蓝牙器件,主要是智能门锁和温湿度、空气质量、花花草草等传感器,米家方案有一个极大的痛点,就是所有自动化都只能云端执行,没有局域网接口,自动化时延大。比如大家最想要的,正常开锁自动解除警戒状态、打开玄关照明灯这些。之前的时延大的时候,甚至等你进门去厕所撒泡尿之后它才开始执行!

于是各路大神都在想方设法将这些器件接入hass平台,加以更好的利用。看了下大家将这些器件接入Hass的方法,主要有3种:
1. 利用hass主机上的蓝牙,开发量大、权限要求高,涉及到解密,依赖蓝牙(比如群晖就搞不了)。
2. 曲线救国,就是利用米家app的自动化,把蓝牙器件的消息转化为yeelight灯具之类的动作,然后再加以利用。这个方案 人为增加了复杂度、并且依然依赖云端,时延太大以至于基本没有实用价值
3. 蓝牙网关 TTL 输出,以MQTT为主。个人认为这是目前条件下最为合理的方案,硬件改造难度低(就是连两根线的事儿),软件开发难度低(有现成的,自己写也很容易,不涉及解密),最关键的是没有时延!
作者: hugh_jie    时间: 2020-5-27 22:33
感谢分享,,预订了个绿米的锁,买的红米的小爱play,到时候拆开看看能不能搞,不能搞再想想办法
作者: telanx    时间: 2020-5-28 00:11
XCray 发表于 2020-5-25 10:09
花花草草检测仪也可以通过这种方法集成到hass了!
hass原生的集成方法要求有蓝牙4.x才行,很多时候跑hass ...

米家蓝牙温湿度计,圆的那个,大佬研究下啊。谢谢!
作者: XCray    时间: 2020-5-28 08:36
hugh_jie 发表于 2020-5-27 22:33
感谢分享,,预订了个绿米的锁,买的红米的小爱play,到时候拆开看看能不能搞,不能搞再想想办法 ...

绿米的锁?走的是蓝牙?还是zigbee?
如果zigbee的话就是另外一种思路了。
作者: XCray    时间: 2020-5-28 08:40
本帖最后由 XCray 于 2020-6-8 14:33 编辑
telanx 发表于 2020-5-28 00:11
米家蓝牙温湿度计,圆的那个,大佬研究下啊。谢谢!

我手上没有这个,按说只要是符合小米协议标准、可以和小米蓝牙网关协同工作的,都可以应用这个思路。
需要特别针对这个器件做的工作,就是搞清楚它的消息格式和内容。

如果有串口卡的话,你可以用一楼的脚本,收集一段时间的消息,比如三五个小时。然后发上来我帮你看看如何写正式使用的脚本。

或者,你借我一个研究几天~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20200608补充:

刚刚顺手买了个“米家蓝牙温湿度计2”,方的。消息符合小米官方文档,很容易就加进来了,35楼有代码。

作者: nisofer    时间: 2020-5-28 10:43

感谢分享
作者: hugh_jie    时间: 2020-5-28 11:39
telanx 发表于 2020-5-28 00:11
米家蓝牙温湿度计,圆的那个,大佬研究下啊。谢谢!

回错人了哈哈
作者: hugh_jie    时间: 2020-5-28 11:41
XCray 发表于 2020-5-28 08:36
绿米的锁?走的是蓝牙?还是zigbee?
如果zigbee的话就是另外一种思路了。

蓝牙的,我先看看这个小爱里面能不能搞,不能搞就咸鱼淘个榉树的,话说榉树网关能接入其他小米的蓝牙设备么
作者: XCray    时间: 2020-5-28 12:14
hugh_jie 发表于 2020-5-28 11:41
蓝牙的,我先看看这个小爱里面能不能搞,不能搞就咸鱼淘个榉树的,话说榉树网关能接入其他小米的蓝牙设备 ...

按文档理解,榉树网关就是一个标准的“米家蓝牙网关”,或者说“小米蓝牙网关”,或者说所有的小米/米家蓝牙网关逻辑功能都是一样的,不一样的只是外表。
那个Mesh网关还没研究过。
我自己用这个网关接入了花花草草传感器,我理解凡是符合小米规范的蓝牙器件,应该都可以接入。
作者: zmg    时间: 2020-5-28 12:18
这个强,需要认真学习
作者: XCray    时间: 2020-5-28 12:20

                               
登录/注册后可看大图

查看小米github项目文档,成品电路板上的TTL,连接的是Debug串口。
而蓝牙网关自身的功能实现方式,也是串口,用的是另外一个,成为主控串口的。
——————————————————————
那么,一个很有意思的构想就出来了:
如果有一块有两个串口的开发板、连接这个主控串口的收发,那就可以把蓝牙网关的所有中间环节都掌控了。
所有的消息、功能,都可以实现,比如通过Hass设置临时开锁密码!

作者: XCray    时间: 2020-5-29 07:32
本帖最后由 XCray 于 2020-5-31 07:55 编辑

脚本跑了几天,终于看到一条高度疑似电量报告的消息:

{"retry":0,"method":"_async.ble_event","params":{"dev":{"did":"xxxx","mac":"xxxxxx","pdid":407},"evt":[{"eid":4106,"edata":"3000xxxxxx"}],"frmCnt":198,"gwts":462399}}

eid 4106符合小米文档的说明,后面的edata除了第一个字节应该就是电量数值(米家app里看确实是48%)
除此之外,另外4个字节是当天 00:00:00.0 的时间戳(也就是说,只有日期有意义)、小米文档里也说电量只有一个字节。

这个消息每天0点之后十几秒出现一次。
就是一直还没看到花花草草电量报告的消息~


作者: crazysiri    时间: 2020-6-7 19:07
我看了你的帖子收了一个网关,看到了 eid 4110 但是没看到 eid是5的情况?啥情况我是q2锁
作者: XCray    时间: 2020-6-7 19:28
crazysiri 发表于 2020-6-7 19:07
我看了你的帖子收了一个网关,看到了 eid 4110 但是没看到 eid是5的情况?啥情况我是q2锁 ...



q2锁是什么锁?也是榉树的吗?

根据我用的k1,eid:5对应的是开锁事件。你可以用那个打印消息的脚本,看一下开锁时的具体消息是啥?
作者: crazysiri    时间: 2020-6-7 19:44
XCray 发表于 2020-6-7 19:28
q2锁是什么锁?也是榉树的吗?

根据我用的k1,eid:5对应的是开锁事 ...

米家的锁不是榉树的,收到的最多的就是eid 4110 edata 00。偶尔有 eid 4106 edata 5d。我看有说是电量的,但5d是个什么鬼
作者: XCray    时间: 2020-6-7 20:04
本帖最后由 XCray 于 2020-6-7 20:14 编辑
crazysiri 发表于 2020-6-7 19:44
米家的锁不是榉树的,收到的最多的就是eid 4110 edata 00。偶尔有 eid 4106 edata 5d。我看有说是电量的 ...

每个型号的锁,数据格式多少都会有些差异,所以需要先抓取足够多的消息,然后把脚本进行针对性的修正。
~~~~~~~~~~~~~~~~~~~~~~
5d是十六进制的数字,换成十进制,就是93,表示电量是93%——你可以和米家app里看到的数字比对一下。
米家的锁,应该是最符合小米官方文档的吧?

开锁事件的eid可能不是5,而是0x000B,各种事件和数据应该比榉树的锁更丰富。

作者: XCray    时间: 2020-6-7 20:08
本帖最后由 XCray 于 2020-6-8 06:48 编辑

看到有朋友在参考,诚惶诚恐啊!我自己这几天里把脚本做了些优化,包括:
- 异常捕获更周到(更不容易出错退出)

- 采用了更合理的mqtt.client等

不敢独享,赶快贴出来:
[attach]23343[/attach]

如果用作后台进程、由systemctl控制,建议把其中的 print 替换成 syslog.syslog,在日志中记录有用信息。别忘了先import syslog
~~~~~~~~~~~~~~~~~~~~~~
不过,这个还是针对榉树门锁(以及花花草草)的,如果门锁型号不一样,仍然需要对脚本进行针对性修改



作者: crazysiri    时间: 2020-6-7 22:25
XCray 发表于 2020-6-7 20:04
每个型号的锁,数据格式多少都会有些差异,所以需要先抓取足够多的消息,然后把脚本进行针对性的修正。
~~ ...

主要是用榉树的网关和小白万能遥控器ttl获取到的数据应该是一样的么?我怎么感觉我这数据少呢
作者: XCray    时间: 2020-6-7 22:30
crazysiri 发表于 2020-6-7 22:25
主要是用榉树的网关和小白万能遥控器ttl获取到的数据应该是一样的么?我怎么感觉我这数据少呢 ...

我理解(猜测),网关没区别,只是蓝牙终端设备(比如门锁)每种型号上报的消息数量和格式不一样。
~~~~~~~~~~~~~~~~~~~~~~~
也许不同网关会有区别,这个TTL毕竟是个调试口,不同的开发人员认为的需要从调试口输出的内容不一样。
甚至某些恶心的开发人员/厂家会刻意减少调试口的信息输出。
作者: crazysiri    时间: 2020-6-7 22:38
XCray 发表于 2020-6-7 22:30
我理解(猜测),网关没区别,只是蓝牙终端设备(比如门锁)每种型号上报的消息数量和格式不一样。
~~~~~ ...

所以大概率就是我的锁上报的信息少…我跟了一段时间我这就能检测到开锁和电量,也不知道是门外还是门内
作者: 余歌唱晚    时间: 2020-6-7 23:34
准备买小白万能遥控器了
作者: XCray    时间: 2020-6-8 06:14
crazysiri 发表于 2020-6-7 22:38
所以大概率就是我的锁上报的信息少…我跟了一段时间我这就能检测到开锁和电量,也不知道是门外还是门内 ...

也不一定。

按说米家的锁,消息上报应该是最完整的。不妨把你跟的结果整理一下发出来。

门外还是门内,蓝牙还是密码,开门者到底何人,是在edata当中区分的,事件eid都是一个
作者: XCray    时间: 2020-6-8 06:18
余歌唱晚 发表于 2020-6-7 23:34
准备买小白万能遥控器了

我用榉树网关+榉树锁,消息确实很少,只有3种:

- 每分钟一次的状态报告
- 开锁事件
- 每天一次的电量报告

不知道是不是网关并没有把全部的有用消息都在TTL输出?如果能用同一把锁配合不同网关做个对比分析就好了。
作者: XCray    时间: 2020-6-8 14:29
增加了“蓝牙温湿度计2”,就是方方的那个:
  1.             elif db_pdid == 1371: #蓝牙温湿度计2
  2.                   topic = "mqtttmhm/%s/%s"%(db_did,db_eid)
  3.                   payload = int(revstr(db_edata),16)
  4.                   if db_eid == 4100 or db_eid ==4102:
  5.                        payload = payload / 10
  6.                   elif db_eid != 4106:
  7.                        syslog.syslog('蓝牙温湿度未知eid:%s' % respon)
复制代码
这个蓝牙温湿度传感器,只有3条消息:
- 4100——温度,量纲0.1度
- 4102——湿度,量纲0.1%
- 4106——电量,量纲1%

相应地,hass中yaml配置:
  1. sensor:
  2.   - platform: mqtt
  3.     name: btTemp
  4.     icon: 'mdi:thermometer'
  5.     state_topic: 'mqtttmhm/xxxxxx/4100'
  6.     device_class: temperature
  7.     unit_of_measurement: °C
  8.   - platform: mqtt
  9.     name: btHumi
  10.     icon: 'mdi:water-percent'
  11.     state_topic: 'mqtttmhm/xxxxxx/4102'
  12.     device_class: humidity
  13.     unit_of_measurement: '%'
  14.   - platform: mqtt
  15.     name: btBatt
  16.     icon: 'mdi:battery-charging'
  17.     state_topic: 'mqtttmhm/xxxxxx/4106'
  18. homeassistant:
  19.   customize:
  20.     sensor.btTemp:
  21.       friendly_name: 蓝牙温度
  22.     sensor.btHumi:
  23.       friendly_name: 蓝牙湿度
  24.     sensor.btBatt:
  25.       friendly_name: 蓝牙电量
复制代码
把xxxxxx替换成你自己的传感器pdid即可。

作者: XCray    时间: 2020-6-8 14:35
本帖最后由 XCray 于 2020-6-9 20:28 编辑
telanx 发表于 2020-5-28 00:11
米家蓝牙温湿度计,圆的那个,大佬研究下啊。谢谢!

刚顺便买了个米家蓝牙温湿度计2,方的那个。

消息符合标准定义,很容易就加进来了。

圆的估计也差不多,可能pdid产品代码会不一样,稍微修改一下程序应该就可以了。
作者: XCray    时间: 2020-6-9 20:45
观测到一个就连榉树官方都没有用到的、而且比较有用的消息:eid:7——门事件。

在米家app里,榉树门锁可以触发自动化的条件有:电量低于10%/5%、任意(正常)开锁、指定钥匙开锁、门锁面板被撬、错误密码频繁尝试导致键盘被锁这几个。

其对应的TTL接口的消息,推测:
- 电量对应电量报告,每天一次。也许电量低的时候会更频繁。
- 任意(正常)开锁、指定钥匙开锁,确信对应之前的锁事件(就是小米说的已废弃的eid=5)。因为没有观察到其他消息。
- 错误密码频繁尝试导致键盘被锁,很可能也是对应锁事件,用特殊的KeyID来表示,还没有观察到。
- 门锁面板被撬,可能对应这里的门事件。

按照小米文档,门事件eid为7,数据1个字节,取值00~05,分别表示:开门、关门、超时未关、敲门、撬门、门卡住。

我这次观察到的,是“02 超时未关”,当时确实有20多秒的时间没有关门。

敲门肯定不会有了,因为就没有对应的传感器。

撬门可能对应于上面说的门锁面板被撬,无法验证。

门卡住?更不知道了。

就这个“02 超时未关”,很显然榉树官方都没到(开头说的,自动化触发条件没有这个)。而强大的HA,当然可以把它用起来,超过20来秒不关门,放个狗叫声啥的提醒一下~~~

对了,门磁传感器也有类似的能力,但那个时长是1分钟,似乎长了点。

代码很简单:
  1. elif db_eid == 7: #门事件
  2.     timest = revstr(db_edata[2:10])
  3.     timest = time.strftime("%Y-%m-%d",time.localtime(int(timest,16)))
  4.     payload = '{"Status":%d,"UpdTime":"%s"}'%(int(db_edata[0:2],16),timest)
  5.     topic = "mqttlock/door"
  6.     syslog.syslog('发生门事件:%s' % respon)
复制代码
最后一行做个记录,也许还会有其他的消息呢。

作者: XCray    时间: 2020-6-10 08:02
本帖最后由 XCray 于 2020-6-13 15:38 编辑

到现在这个脚本跑了两个星期了,期间也逐步得到优化完善。

值得一说的是,观察到丢数据的现象。

整条丢数据的现象倒是没发现过(我专门分析过接收到门锁状态报告的时间间隔,很规律,一分钟多点一次,如果有数据丢失,这儿应该能看出来),只是偶尔发现丢字符的现象,有时候丢个“]”,有时候丢个数字,大概5天出现一次(两个星期,发生了3次)。

丢“]”那次,导致json解析失败;丢数字的两次,一次导致不知道啥设备,一次导致数值错误,不过这几次都是发生在花花草草上,也许是传感器上报的数据就有问题,也许是因为我用杜邦线连接不够稳定?
两天后,又发生了一次丢字符现象,这次是结尾丢了一个大括号‘{’,导致json解析错误。差不多隔了两个小时,还有一次错误消息,说是'utf-8' codec can't decode byte 0xea in position 65: invalid continuation byte。这两次错误,一个是另一个花花草草,一个是门锁的状态报告。

因为每次丢失字符或者接收误码都不一样、数量也不算多,暂时不做处理。如果以后发现规律再从代码上进行弥补吧。

现在还不好判断丢字符或误码到底是发生在哪个环节,传感器、蓝牙干扰、TTL连线、串口芯片?都有可能

作者: 余歌唱晚    时间: 2020-6-11 16:47
XCray 发表于 2020-6-8 06:18
我用榉树网关+榉树锁,消息确实很少,只有3种:

- 每分钟一次的状态报告

感觉也够了
作者: XCray    时间: 2020-6-11 17:07
余歌唱晚 发表于 2020-6-11 16:47
感觉也够了

嗯,怎么说呢?

满足基本要求没问题了,最关键的开锁事件有就解决了最急迫的需求。

而且每分钟一次的状态报告显得还啰嗦、多余,我更倾向于基于事件的报告而不是这种频繁的周期性报告。

电量报告每天一次,也够用了。

门事件算是锦上添花,可以省去一个门磁传感器。

比较欠缺的,是传感器比较少、开锁事件太简单、附加信息太少,不像米家的锁,上锁和开锁都有事件,还可以区分门内操作还是门外操作
作者: shidaisky    时间: 2020-6-13 15:24
膜拜大神,帮顶了。
作者: XCray    时间: 2020-6-15 15:31
尝试使用仅需5块钱、可以塞到蓝牙网关内部的、小巧可爱的esp01s模块完成蓝牙网关ttl到mqtt的转发任务,详情:

https://bbs.hassbian.com/thread-10218-1-1.html
作者: 白云纷飞    时间: 2020-6-26 18:05
感谢大佬分享!
作者: 漫步时光    时间: 2020-6-27 17:29
XCray 发表于 2020-5-29 07:32
脚本跑了几天,终于看到一条高度疑似电量报告的消息:

{"retry":0,"method":"_async.ble_event","params": ...

我想问下提到的文档是什么文档,哪里可以看到?
作者: XCray    时间: 2020-6-27 18:44
漫步时光 发表于 2020-6-27 17:29
我想问下提到的文档是什么文档,哪里可以看到?

iot.mi.com,小米的官方开发者平台,上面的文档
作者: zwbjsnt    时间: 2020-10-9 08:43
请问小爱万能遥控版,可以支持TTL么
作者: XCray    时间: 2020-10-9 11:31
zwbjsnt 发表于 2020-10-9 08:43
请问小爱万能遥控版,可以支持TTL么

之前有人问小爱触屏音响,看了几个帖子,结论是不行。你说的的这个还真不了解
作者: goldstep    时间: 2020-10-9 15:50
本帖最后由 goldstep 于 2020-10-9 15:52 编辑
XCray 发表于 2020-5-24 14:54
python脚本:

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

大神,我用的是榉树kx 门锁,已经完成米家接入,能按你的方式接入hass吗?
作者: XCray    时间: 2020-10-9 16:47
goldstep 发表于 2020-10-9 15:50
大神,我用的是榉树kx 门锁,已经完成米家接入,能按你的方式接入hass吗? ...

我用的就是榉树门锁,没问题。只要是能接入米家的蓝牙设备,都可以这么接入。
作者: goldstep    时间: 2020-10-9 23:55
XCray 发表于 2020-10-9 16:47
我用的就是榉树门锁,没问题。只要是能接入米家的蓝牙设备,都可以这么接入。 ...

看的好复杂,榉树网关要烧写?
作者: XCray    时间: 2020-10-10 06:57
goldstep 发表于 2020-10-9 23:55
看的好复杂,榉树网关要烧写?

你的中文阅读理解能力不过关啊~~~不是在中国学的吧???

不是烧写网关,是烧写一个esp模块然后连接到网关的ttl接口。
作者: goldstep    时间: 2020-10-10 14:43
XCray 发表于 2020-10-10 06:57
你的中文阅读理解能力不过关啊~~~不是在中国学的吧???

不是烧写网关,是烧写一个esp模块然后连接到 ...

好吧, 中文不行的我就不折腾了,反正有这个门锁在米家里面用的有通知和推送比hass这个哑巴推送方便的多,就不折腾了
作者: zeze247    时间: 2020-10-29 00:24
大神,yeelight 语音助手接入,MQTT只显示了上午12:17 收到关于 mqttl/status 的消息[ 1 ]
alive
QoS: 0 - Retain: false  ,不知什么意思。
作者: XCray    时间: 2020-10-29 06:54
zeze247 发表于 2020-10-29 00:24
大神,yeelight 语音助手接入,MQTT只显示了上午12:17 收到关于 mqttl/status 的消息[ 1 ]
alive
QoS: 0 -  ...

这条消息是esp模块发出来的,表示自己进入工作状态。

没收到其他消息,如果确定该蓝牙网关已经关联蓝牙设备、连接也没有问题的话,那就是只有一个解释:yeelight语音助手的ttl接口没有输出预期的内容。

这个语音助手我没用过,你可以用usb-ttl连接其ttl接口,看看输出内容都是啥
作者: leon_xi    时间: 2020-10-29 08:23
你这都已经搞定了,我就不费劲了哈(~ ̄▽ ̄)→))* ̄▽ ̄*)o
作者: XCray    时间: 2020-10-29 09:52
leon_xi 发表于 2020-10-29 08:23
你这都已经搞定了,我就不费劲了哈(~ ̄▽ ̄)→))* ̄▽ ̄*)o

不一样的。

我这个方法依赖于蓝牙网关,并且涉及硬件改造(增加esp模块、连接ttl),这个方案还有一个致命缺陷就是依赖于外网(外网断了蓝牙网关就不工作了,ttl接口也就没有有用信息了)。

如果能用蓝牙适配器打造成更加通用的蓝牙网关、直接解析蓝牙消息,可以摆脱对网关和外网的依赖,肯定更有价值。
作者: goldstep    时间: 2021-8-23 17:07
本帖最后由 goldstep 于 2021-8-23 17:14 编辑
XCray 发表于 2020-6-7 19:28
q2锁是什么锁?也是榉树的吗?

根据我用的k1,eid:5对应的是开锁事 ...

最近闲来,想试着按你的教程,烧写一个esp模块然后连接到网关的ttl接口,大神能否指导一下,买来并烧写。
作者: XCray    时间: 2021-8-23 22:04
goldstep 发表于 2021-8-23 17:07
最近闲来,想试着按你的教程,烧写一个esp模块然后连接到网关的ttl接口,大神能否指导一下,买来并烧写。 ...

你咋把这个旧帖子给翻出来了……

最新的方案是在esphome里实现,有两种思路:
- 连接蓝牙网关的TTL接口
- 用esp32直接接收解密蓝牙门锁的消息

当然,两个思路也可以同时用。

有任何问题发帖讨论就好,不用客气!
作者: roomac    时间: 2021-8-24 10:32
趕緊試試看
作者: goldstep    时间: 2021-8-24 12:30
XCray 发表于 2021-8-23 22:04
你咋把这个旧帖子给翻出来了……

最新的方案是在esphome里实现,有两种思路:

我现在通过椰奶灯带和米家自动化联动形式曲线救国将榉树kx接入hass,
但是榉树指纹锁已经停止后续支持米家服务了,这种曲线救国没有后续扩展。
你这个esp32模块长啥样,能分享一下购买地址和接入教程吗
作者: XCray    时间: 2021-8-24 12:41
goldstep 发表于 2021-8-24 12:30
我现在通过椰奶灯带和米家自动化联动形式曲线救国将榉树kx接入hass,
但是榉树指纹锁已经停止后续支持米 ...

随便,长啥样的esp模块都能用!

最小的,esp-01s,跑mqttl(就是把ttl消息转发至mqtt)固件都是足够的;

最便宜的esp32模块,都可以直接接收蓝牙消息并解密。

也没啥教程不教程的,该说的帖子里都说了,碰到具体问题具体讨论吧
作者: goldstep    时间: 2021-8-24 15:05
本帖最后由 goldstep 于 2021-8-27 22:10 编辑
XCray 发表于 2021-8-24 12:41
随便,长啥样的esp模块都能用!

最小的,esp-01s,跑mqttl(就是把ttl消息转发至mqtt)固件都是足够的; ...

你好,写入后连不上wifi,也就是输入wifi账号密码后,连接进度没有,esP8266本身的wifi热点也一直存在

另外我一共买了两个esp -01s

两个都刷了哪个bin固件,刷完以后,连上热点发现两个的名字都叫esp-4DFFBC,这肯定不符合逻辑啊,名字重复了不说,最主要的还是卡再这里,无法连wifi。肯定大神协助找一下是哪儿的问题

顺带提一下,访问现在的论坛发帖回帖,找到了20年前我56k拨号上网的感觉!那叫一个爽啊

[attach]31578[/attach]

[attach]31577[/attach]

[attach]31580[/attach]



作者: XCray    时间: 2021-10-17 10:52
goldstep 发表于 2021-8-24 15:05
你好,写入后连不上wifi,也就是输入wifi账号密码后,连接进度没有,esP8266本身的wifi热点也一直存在

另 ...

奇怪,怎么之前没看到这个回复呢?抱歉了~

这个问题前提说过,你要是翻翻的话肯定能找到,高度怀疑是原来的固件没清除的缘故。

不过现在有更好的方案了!都是在esphome里面弄,稳定性可用性更佳。

首选用esp32直接解密蓝牙消息。详见我的签名。

其次,mqttl 方案也移植到了esphome里,见我另一个帖子:https://bbs.hassbian.com/thread-10434-1-1.html





欢迎光临 『瀚思彼岸』» 智能家居技术论坛 (https://bbs.hassbian.com/) Powered by Discuz! X3.4