本帖最后由 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选择串口 
 
 
    2.Firmware选择XCray大神最新固件的bin文件,点击Flash ESP,会先清除原身固件再刷入,成功应该会出现这个界面 
 
 
 
 
二、ESP联网 
 
三、ESP与网关接线 
       TB家买了最便宜的电烙铁,十几块的套装,第一次自己动手搞这东西,觉得几条线的焊接去外面找人也麻烦,不值几个钱人家懒得给你做,自己多学点手艺以后还要捣鼓点什么也方便。具体接线就是: 
- ESP模块的RX——遥控器的TX0
 - ESP模块的GND——遥控器的GND
 - ESP模块的5V——遥控器的VBUS(5V)
 
 
         我是给wemos D1 mini焊上排针,然后杜邦线焊在网关焊点上,然后线的母头插wemos D1 mini排针上的,方便以后要更换。 
 
 
       ps.遥控器3.3V输出是下面这个(我这是借别人的图,wemos D1 mini是接VBUS(5V)的,别搞错!别搞错!别搞错!) 
 
 
 
四、收集数据 
       遥控器通电后,在HA配置——集成——MQTT配置——监听一个主题(Topic)——输入“mqttl/#”——开始监听,留在这个界面,然后去开门关门几下,有这样格式的数据反馈就说明软硬件都OK了 
 
 
       根据实际需要,可以监听特定eid数据,如输入“mqttl/你的did/特定eid/#” 
 
五、我整理的数据 
       以上都是整理大神们几个帖子的内容,最后才是我自己参照XCray和小米IoT开发文档测试整理的鹿客指纹锁Classic 2X的代码数据。 
| eid | eid属性 | edata | edata属性 | 匹配结果 | 描述 | KeyID | 描述 |  |  |  | 6 | 指纹事件 | 01ffffffff | 匹配结果,KeyID | 01 | 匹配失败 | ffffffff | 未知操作者 |  |  |  | 6 | 指纹事件 | 05ffffffff | 匹配结果,KeyID | 05 | 面积不足or 
皮肤太湿? | ffffffff | 未知操作者 |  |  |  | eid | eid属性 | edata | edata属性 | 操作 | 描述 |  |  |  |  |  | 7 | 物理锁事件 | 5f258f0001 | 时间戳,操作 | 01 | 上锁(不分内外) |  |  |  |  |  | 7 | 物理锁事件 | 5f26ef0802 | 时间戳,操作 | 02 | 开门 |  |  |  |  |  | 7 | 物理锁事件 | 5f258eff05 | 时间戳,操作 | 05 | 解锁(不分内外) |  |  |  |  |  | 7 | 物理锁事件 | 5f28500af3 | 时间戳,操作 | f3 | 门虚掩 |  |  |  |  |  | eid | eid属性 | edata | edata属性 | 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 | 异常 |  | eid | eid属性 | edata | edata属性 |  |  |  |  |  |  |  | 4106 | 电量 | 60 | 门锁电量 | yaml怎么转换十进制 |  |  |  |  |  |  | eid | eid属性 | edata | edata属性 | 描述 |  |  |  |  |  |  | 4110 | 反锁舌状态 | 00 | 未反锁 | 反锁方舌缩入 |  |  |  |  |  |  | 4110 | 反锁舌状态 | 02 | 已反锁 | 反锁方舌弹出 |  |  |  |  |  |  | eid | eid属性 | edata | edata属性 | 描述 |  |  |  |  |  |  | 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监听时也可以翻查出现过的事件,不想探索的话不要也行。 
 
 
 
 
        最后附上一些相关的链接: 
 
 
 
 
 |