本帖最后由 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监听时也可以翻查出现过的事件,不想探索的话不要也行。
最后附上一些相关的链接:
|