请选择 进入手机版 | 继续访问电脑版

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

 找回密码
 立即注册
查看: 58349|回复: 42

[经验分享] 鹿客指纹锁Classic 2X接入HomeAssistant过程分享

[复制链接]

24

主题

882

帖子

4960

积分

论坛元老

Rank: 8Rank: 8

积分
4960
金钱
4073
HASS币
20
发表于 2020-8-8 03:38:50 | 显示全部楼层 |阅读模式
本帖最后由 chenquanhao 于 2020-8-10 23:42 编辑

       这些年在论坛潜水学了很多东西特别是近期看XCray的帖子获益良多,可以看出真的很用心分享和交流自己的技术成果(虽然文字有点冗余),今天也让我站在巨人的肩膀上分享一下鹿客指纹锁Classic 2X接入的过程吧。
开始之前,先贴上XCray大神的几个教程

[修仙教程] 米家蓝牙器件接入HA的最佳方案:蓝牙网关+TTL+MQTT,ex榉树锁
[其他设备] 给小白看的:ESPHome刷机的基本逻辑,尤其是第一次
[其他设备] 可能是史上最简单、最适合小白的 初次 ESPHome固件烧写过程
[新奇玩法] (多个)蓝牙网关 TTL->MQTT,支持任意米家蓝牙设备接入HA/NR
https://bbs.hassbian.com/thread-10434-1-1.html
       我的这个帖子就只是根据XCray大神、killadm大神还有SMZDM上面的一个教程总结而来的。
       首先说说坑,XCray大神的设备是榉树门锁+榉树网关,我的设备是鹿客门锁+创米小白万能遥控器声控版,这就注定了他的作业我不能完全照抄。看到有人说小白万能遥控器也有3.3V输出,就买了ESP-01S(小巧、自带针脚接杜邦线)跟随大神步伐,刷固件连WIFI都挺顺的,可是不知为什么我这ESP-01S连着烧录器上插在电脑USB,连上WIFI后几分钟会自己断连,加上问了几个地方都没人给我确定小白万能遥控器上的3.3V输出位置,就只好又搭车SMZDM的大神买了5V的wemos D1 mini,后来才看到帖子小白万能遥控器确实有3.3V输出

      入正题,步骤:
一、ESP刷固件
    1.ESP模块插入电脑USB,打开ESPHome-Flasher,Serial port选择串口
图片1.png
    2.Firmware选择XCray大神最新固件的bin文件,点击Flash ESP,会先清除原身固件再刷入,成功应该会出现这个界面

图片2.png


、ESP联网
  • 一、用电脑或者手机打开WIFI,找到“mqttl_xxxx”的信号,密码是“mqttlpassword”;
  • 进入Configgure WiFi,选择你家WIFI的SSID,输入密码,MQTT服务器、端口、账号、密码,Save;


三、ESP与网关接线
       TB家买了最便宜的电烙铁,十几块的套装,第一次自己动手搞这东西,觉得几条线的焊接去外面找人也麻烦,不值几个钱人家懒得给你做,自己多学点手艺以后还要捣鼓点什么也方便。具体接线就是:
  • ESP模块的RX——遥控器的TX0
  • ESP模块的GND——遥控器的GND
  • ESP模块的5V——遥控器的VBUS(5V)

       我是给wemos D1 mini焊上排针,然后杜邦线焊在网关焊点上,然后线的母头插wemos D1 mini排针上的,方便以后要更换。
esp.jpg
       ps.遥控器3.3V输出是下面这个(我这是借别人的图,wemos D1 mini是接VBUS(5V)的,别搞错!别搞错!别搞错!)
图片3.png

四、收集数据
       遥控器通电后,在HA配置——集成——MQTT配置——监听一个主题(Topic)——输入“mqttl/#”——开始监听,留在这个界面,然后去开门关门几下,有这样格式的数据反馈就说明软硬件都OK了
图片4.png
       根据实际需要,可以监听特定eid数据,如输入“mqttl/你的did/特定eid/#”


五、我整理的数据
       以上都是整理大神们几个帖子的内容,最后才是我自己参照XCray和小米IoT开发文档测试整理的鹿客指纹锁Classic 2X的代码数据。
eideid属性edataedata属性匹配结果描述KeyID描述
6指纹事件01ffffffff匹配结果,KeyID01匹配失败ffffffff未知操作者
6指纹事件05ffffffff匹配结果,KeyID05面积不足or
皮肤太湿?
ffffffff未知操作者
eideid属性edataedata属性操作描述
7物理锁事件5f258f0001时间戳,操作01上锁(不分内外)
7物理锁事件5f26ef0802时间戳,操作02开门
7物理锁事件5f258eff05时间戳,操作05解锁(不分内外)
7物理锁事件5f28500af3时间戳,操作f3门虚掩
eideid属性edataedata属性KeyID前四位描述KeyID后四位描述操作描述
11电子锁事件5f2afac60000000000时间戳,KeyID,操作方式0000人工0000蓝牙00蓝牙解锁
11电子锁事件5f259bf500000003a2时间戳,KeyID,操作方式0000人工0003反锁舌a2反锁
11电子锁事件5f284c5100000003a3时间戳,KeyID,操作方式0000人工0003反锁舌a3解除反锁
11电子锁事件5f258ef08001000020时间戳,KeyID,操作方式8001指纹0001指纹1(按米家中录入时间排序)20指纹解锁
11电子锁事件5f26df7080020fa010时间戳,KeyID,操作方式8002密码0fa0密码1(按米家中录入时间先后,固定密码、周期性密码一起排序)10固定密码解锁
11电子锁事件5f2ae09280020fa160时间戳,KeyID,操作方式8002密码0fa1周期密码(按米家中录入时间先后,固定密码、周期性密码一起排序)60临时密码解锁
11电子锁事件5f2ae4ac800203e710时间戳,KeyID,操作方式8002密码03e7管理员(修改密码不变。与普通密码有什么区别?)10固定密码解锁
11电子锁事件5f2ad4e98002138860时间戳,KeyID,操作方式8002密码1388一次性(无论几个,固定不变)60临时密码解锁
11电子锁事件5f2af8a5c0de0000ff时间戳,KeyID,操作方式c0de异常0000错误密码频繁开锁ff异常
11电子锁事件5f28d566c0de0001ff时间戳,KeyID,操作方式c0de异常0001错误指纹频繁开锁ff异常
11电子锁事件5f2af349c0de000aff时间戳,KeyID,操作方式c0de异常000a多种方式频繁开锁失败ff异常
eideid属性edataedata属性
4106电量60门锁电量yaml怎么转换十进制
eideid属性edataedata属性描述
4110反锁舌状态00未反锁反锁方舌缩入
4110反锁舌状态02已反锁反锁方舌弹出
eideid属性edataedata属性描述
4111锁舌状态00门打开角舌弹出,不论斜舌、方舌状态
4111锁舌状态01已上锁斜舌弹出,角舌缩入,方舌弹出
4111锁舌状态f3门虚掩斜舌、角舌缩入,不论方舌状态
4111锁舌状态f5已关门斜舌弹出,角舌缩入,方舌缩入
4111锁舌状态f6开门上锁角舌、方舌弹出,不论斜舌状态

       这是我目前能够测试出来eid和edata,像电量、撬锁、NFC、错误钥匙、静脉开锁等暂时没条件试验,期望抛砖引玉大家一起补全。
另外锁舌状态好像是约每两分钟反馈一次,其他事件是发生后三秒左右反馈。
       还有几个很让我疑惑的情况:
  • 用物理钥匙操作,竟然没有特定的信息,在eid11没任何消息,只在eid7有消息,跟人工下拉或上提把手是相同的反馈情况。。。
  • 超时未关门和开门,这两个状态应该怎么区分
  • 门锁电量怎么在yaml中转换成十进制表示
  • 时间戳用value_template: "{{  value[0:8]|int(0,16)|timestamp_local }}",转换后的时间比HA时间早两个小时,怎么解决

六、YAML配置
sensor:
  - platform: mqtt
    name: DoorStatus
    icon: 'mdi:door-closed-lock'
    state_topic: 'mqttl/10200xxxxx/4111' #替换成正确的did和eid
    value_template: >-
      {% if value == '00' %}
      门未关!
      {% elif value == '01' %}
      已上锁
      {% elif value == 'f3' %}
      门虚掩
      {% elif value == 'f5' %}
      已关门
      {% elif value == 'f6' %}
      开门上锁
      {% else %}
      {{value}}
      {% endif %}
  - platform: mqtt
    name: IndoorLock
    icon: 'mdi:lock-reset'
    state_topic: 'mqttl/10200xxxxx/4110' #替换成正确的did和eid
    value_template: >-
      {% if value == '00' %}
      未反锁
      {% elif value == '02' %}
      已反锁
      {% else %}
      {{value}}
      {% endif %}
  - platform: mqtt
    name: SmartLock
    icon: 'mdi:lock-smart'
    state_topic: 'mqttl/10200xxxxx/11' #替换成正确的did和eid
    value_template: >-
      {% if value[8:16] == '00000000' %}
      手机
      {% elif value[8:16] == '00000003' %}
      
      {% elif value[8:16] == '80010000' %}
      指纹1(可根据实际显示需要更改)
      {% elif value[8:16] == '80010001' %}
      指纹2(可根据实际显示需要更改)
      {% elif value[8:16] == '80020fa0' %}
      密码1(可根据实际显示需要更改)
      {% elif value[8:16] == '800203e7' %}
      管理员
      {% elif value[8:16] == '80021388' %}
      一次性
      {% elif value[8:16] == 'c0de0000' %}
      错误密码频繁开锁
      {% elif value[8:16] == 'c0de0001' %}
      错误指纹频繁开锁
      {% elif value[8:16] == 'c0de000a' %}
      多种方式开锁失败
      {% else %}
      {{value[8:16]}}
      {% endif %}
      {% if value[16:18] == '00' %}
      蓝牙解锁
      {% elif value[16:18] == '10' %}
      密码解锁
      {% elif value[16:18] == '20' %}
      指纹解锁
      {% elif value[16:18] == '60' %}
      临时密码
      {% elif value[16:18] == 'a2' %}
      反锁
      {% elif value[16:18] == 'a3' %}
      解除反锁
      {% elif value[16:18] == 'ff' %}
      异常
      {% else %}
      {{value[16:18]}}
      {% endif %}
  - platform: mqtt
    name: OpTime
    icon: 'mdi:clock-in'
    state_topic: 'mqttl/10200xxxxx/11' #替换成正确的did和eid
    value_template: "{{ value[0:8]|int(0,16)|timestamp_local }}"
  - platform: mqtt
    name: PhysicalLock
    icon: 'mdi:human-handsdown'
    state_topic: 'mqttl/10200xxxxx/7' #替换成正确的did和eid
    value_template: >-
      {{ value[0:8]|int(0,16)|timestamp_local }}
      {% if value[8:10] == '01' %}
      上锁
      {% elif value[8:10] == '02' %}
      开门
      {% elif value[8:10] == '05' %}
      解锁
      {% elif value[8:10] == 'f3' %}
      门虚掩
      {% else %}
      {{ value[8:10] }}
      {% endif %}
  - platform: mqtt
    name: Battery
    icon: 'mdi:battery-80'
    state_topic: 'mqttl/10200xxxxx/4106' #替换成正确的did和eid
    value_template: "{{ value|int(0,16) }}"
    unit_of_measurement: '%'
  - platform: mqtt
    name: eid6
    state_topic: 'mqttl/10200xxxxx/6' #替换成正确的did和eid
    value_template: "{{ value[0:20] }}"
  - platform: mqtt
    name: eid7
    state_topic: 'mqttl/10200xxxxx/7' #替换成正确的did和eid
    value_template: "{{ value[8:10] }}"
  - platform: mqtt
    name: eid11
    state_topic: 'mqttl/10200xxxxx/11' #替换成正确的did和eid
    value_template: "{{ value[8:18] }}"
  - platform: mqtt
    name: eid4106
    state_topic: 'mqttl/10200xxxxx/4106' #替换成正确的did和eid
    value_template: "{{ value[0:20] }}"
  - platform: mqtt
    name: eid4110
    state_topic: 'mqttl/10200xxxxx/4110' #替换成正确的did和eid
    value_template: "{{ value[0:20] }}"
  - platform: mqtt
    name: eid4111
    state_topic: 'mqttl/10200xxxxx/4111' #替换成正确的did和eid
    value_template: "{{ value[0:20] }}"

       KeyID传感器还可以根据实际对应的对象列举写清楚,其他事件的时间也可以自己单独写传感器加入。后面6个eid传感器,是为了在不用mqtt监听时也可以翻查出现过的事件,不想探索的话不要也行。

图片5.png

        最后附上一些相关的链接:




评分

参与人数 4金钱 +52 HASS币 +20 收起 理由
+ 20 + 20 厉害了word楼主!
whxciotw + 12 论坛有你更精彩!
killadm + 10 论坛有你更精彩!
XCray + 10 精彩的总结!

查看全部评分

回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
11435
金钱
8504
HASS币
460

教程狂人突出贡献

发表于 2020-8-8 07:22:36 | 显示全部楼层

注意:这已经不是最佳方案了!用esp32直接解码蓝牙消息才是

本帖最后由 XCray 于 2023-8-31 12:08 编辑

20230831鉴于此贴被坛友顶出,特意强调一下:
小米蓝牙网关在云端转一圈之后才会从TTL接口输出关键消息,时延依然很大。所以这个方案并不是最佳。
后来有了更接近于最佳的方案:用esp32刷esphome、直接接收解码蓝牙消息,纯本地、0时延,具体翻我的帖子看吧。
~~~~~~~~~~~
以下为三年多之前,20200808写的:
被称作大神,诚惶诚恐啊(虽然心里也美滋滋~)。我也觉得自己有时候比较啰嗦~~写的时候总怕说不清楚误导别人~~但是写得再详细也有人不看照样问一些很基础的问题。。。

~~~~~~~~~~~
楼主总结的非常好,全面细致,也为用小白遥控器的朋友们提供了一个更详细的参考。另外,鹿客这款锁的消息也很多,羡慕。。。

我用的榉树网关也确实用起来太省心了,连烙铁都不用动,3.3v也是现成的。

帖子里提到的几个问题尝试分析一下:

1、“不知为什么我这ESP-01S连着烧录器上插在电脑USB,连上WIFI后几分钟会自己断连”,可能烧录器供电不好?ESP官方经常强调不要用USB-TTL小板给ESP模块供电,不过我也一直这么用没出过问题。

2、根据小米文档,eid=7是门事件、eid=4110是锁属性(0x100E)、eid=4111是门属性(0x100F),和楼主的总结稍有不同。

3、eid=4106电量这个,我用的榉树是同时还有个时间戳,你这个只有电量?只有一个数值的话,在yaml里转十进制这么写即可:"{{ value|int(0,16) }}",如果需要截取,还是value[x:y]。

4、“其他事件是发生后三秒左右反馈”,这个有点儿不好接受。按说都是本地处理,不应该有这么明显的时延,建议再设法精确测试一下,看看到底是哪个环节造成的。

5、物理钥匙操作,只有eid=7的消息,逻辑上也说得通(把锁芯CPU啥的绕过去了)。

6、超时未关和开门,如果鹿客的实现没问题,应该是每次开门都有开门的事件报告,但只有开门后超过一定时间(比如2分钟)没有关才会产生超时未关事件,算是一个告警吧。

7、时间戳早两个小时,是不是你的HA时区没设对?
回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
发表于 2020-8-8 08:26:40 | 显示全部楼层
家里也是用鹿客····还没空搞····灯都没搞完···感觉过年前都搞不好····
Nero
回复

使用道具 举报

9

主题

519

帖子

2281

积分

金牌会员

Rank: 6Rank: 6

积分
2281
金钱
1762
HASS币
0
发表于 2020-8-8 09:36:29 | 显示全部楼层
8266怎么供电的? 从门锁上吗?
回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
11435
金钱
8504
HASS币
460

教程狂人突出贡献

发表于 2020-8-8 10:01:55 | 显示全部楼层
yylwhy 发表于 2020-8-8 09:36
8266怎么供电的? 从门锁上吗?

楼主,看到了没?虽然你我以及几乎每个发文分享这个玩法的人,都会交待模块供电的问题(包括警告注意5v和3.3v),但总有人会问这种让人哭笑不得的问题~~~

这位朋友莫怪,只是有感而发,楼主说我的文字冗余太多,我也觉得自己有时为了说清楚陷入了啰嗦。

你的问题是没好好看帖子,交流讨论问问题是好事,值得欢迎。但你这种提问确实不值得提倡。

帖子里说的很清楚了,5v的怎么接、3.3v怎么接,都有。

门锁基本都是用电池的,不大可能给8266供电。再说了,8266靠近门锁没什么意义,它连的是蓝牙网关。
回复

使用道具 举报

9

主题

519

帖子

2281

积分

金牌会员

Rank: 6Rank: 6

积分
2281
金钱
1762
HASS币
0
发表于 2020-8-8 10:06:14 | 显示全部楼层
XCray 发表于 2020-8-8 10:01
楼主,看到了没?虽然你我以及几乎每个发文分享这个玩法的人,都会交待模块供电的问题(包括警告注意5v和 ...

我改。仔细看看去
回复

使用道具 举报

24

主题

882

帖子

4960

积分

论坛元老

Rank: 8Rank: 8

积分
4960
金钱
4073
HASS币
20
 楼主| 发表于 2020-8-8 10:28:47 | 显示全部楼层
XCray 发表于 2020-8-8 07:22
被称作大神,诚惶诚恐啊(虽然心里也美滋滋~)。我也觉得自己有时候比较啰嗦~~写的时候总怕说不清楚误导别 ...

1、同样是USB-TTL小板给ESP模块供电,esp01s过一会会断wifi连接,但wemos D1 mini不会,我也想过可能usb供电的问题,不过现在能用就没时间再测试01s的,等其他设备要用01s再搞了。

2、我也对照小米文档看了很久,鹿客确实和小米门锁的eid有些不同。

3、eid=4106确实是只有2两位数,不过有当前电量也足够了,历史电量意义不大。

4、“其他事件是发生后三秒左右反馈”,我都是在大神基础上黏贴复制的,没有自主钻研能力,我猜测会不会是我网关距离锁比较远的原因(直线距离7米左右,隔了一堵和柜子),迟点放近试试看。

5、物理钥匙操作,如果有小米开发文档上的,能识别钥匙开门和区分门内门外开锁就更好了。

6、超时未关和开门,要用时间差是可以判断,米家app上是两个不同的判断,不知是不是也是用时间差判断的。
回复

使用道具 举报

24

主题

882

帖子

4960

积分

论坛元老

Rank: 8Rank: 8

积分
4960
金钱
4073
HASS币
20
 楼主| 发表于 2020-8-8 10:33:11 | 显示全部楼层
yylwhy 发表于 2020-8-8 09:36
8266怎么供电的? 从门锁上吗?

如果是5V的,接网关上的VBUS;
如果是3.3V的,接我帖子图片标注的那个3.3V焊点。
回复

使用道具 举报

4

主题

224

帖子

1302

积分

金牌会员

Rank: 6Rank: 6

积分
1302
金钱
1078
HASS币
0
发表于 2020-8-8 12:51:14 | 显示全部楼层
本帖最后由 gtyun 于 2020-8-8 13:05 编辑

同样鹿客的OJJ的返回数据就比较少,蛋疼。
回复

使用道具 举报

24

主题

882

帖子

4960

积分

论坛元老

Rank: 8Rank: 8

积分
4960
金钱
4073
HASS币
20
 楼主| 发表于 2020-8-8 13:07:27 | 显示全部楼层
gtyun 发表于 2020-8-8 12:51
OJJ的返回数据就比较少,蛋疼

其实日常会用到的eid事件也不多,只是我有点完美主义和强迫症,对照小米IoT文档,开着监听开门关门反锁故意输错的捣鼓了几个晚上。你要花时间监听收集,可能会发现多一点(没用)的数据
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-16 22:02 , Processed in 0.162865 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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