跳转到内容

Grow 指纹读取器

fingerprint_grow 组件允许你将 R307、R503、R503-RGB、ZFM-20 等指纹传感器与 ESPHome 一起使用。

R307/ZFM-20 光学指纹读取器(数据手册,Adafruit)。图片来源:Adafruit。
R503 电容式指纹读取器,带双色光环 LED(数据手册,Adafruit)。图片来源:Adafruit。

读取器可以由 NodeMCU 的 3.3V 输出供电。由于与读取器的通信使用 UART(默认波特率为 57600),你需要在配置中有一个 UART 总线,并将 rx_pin 连接到读取器的 TX,将 tx_pin 连接到读取器的 RX。

如果你的读取器型号支持,建议将 3.3VT(触摸感应电源)和 3.3V 连接到 3.3V;将 WAKEUP(手指检测信号)连接到一个空闲 GPIO 引脚,并使用 sensing_pin 选项定义它,以便轮询功能在读取器上没有手指时能快速返回。

# Example configuration entry
fingerprint_grow:
sensing_pin: GPIOXX
sensor_power_pin:
number: GPIOXX
inverted: true
idle_period_to_sleep: 5s
on_finger_scan_start:
...
on_finger_scan_matched:
...
on_finger_scan_unmatched:
...
on_finger_scan_misplaced:
...
on_finger_scan_invalid:
...
on_enrollment_scan:
...
on_enrollment_done:
...
on_enrollment_failed:
...

配置由三个部分组成:中心组件、可选的各个传感器以及可选的注册(enrolling)二进制传感器。

基础配置:

  • fingerprint_count: 存储在读取器上的已注册指纹数量。 来自传感器的所有选项。

  • last_finger_id: 由 on_finger_scan_matched 触发器设置的最后一个匹配的已注册指纹。 来自传感器的所有选项。

  • last_confidence: 由 on_finger_scan_matched 触发器设置的最后一个匹配的置信度。 来自传感器的所有选项。

  • status: 读取器内部状态寄存器的整数表示。 来自传感器的所有选项。

  • capacity: 读取器的指纹存储容量。 来自传感器的所有选项。

  • security_level: 读取器当前配置的安全级别的整数表示。较高的安全级别以增加错误拒绝率(FRR)为代价来降低错误接受率(FAR)。范围为 1(最低)到 5(最高)。 来自传感器的所有选项。

传感器的空闲功耗约为 20mA。如果你计划让设备持续运行,明智的做法是实现睡眠模式,它会在最后一次通信后几秒将传感器置于睡眠状态(断电)(可通过 idle_period_to_sleep 配置)。它只能与触摸感应功能一起实现,因为它使用触摸反馈来唤醒传感器。要实现此功能,你需要一个额外的空闲 GPIO 引脚来切换传感器电源的开和关,以及两个外部组件:一个 10kOhms 电阻和一个 PNP 晶体管(如 BC327)。

这是 R503 的接线示例,你可以在下面找到相应的配置:

uart:
rx_pin: GPIOXX
tx_pin: GPIOXX
baud_rate: 57600
fingerprint_grow:
sensing_pin: GPIOXX
sensor_power_pin:
number: GPIOXX
inverted: true
idle_period_to_sleep: 5s

WARNING

忘记密码将使你的指纹读取器无法使用!

你可以使用 new_password: 配置选项为你的指纹读取器设置新密码。密码被定义为一个 32 位无符号整数。

fingerprint_grow:
password: 0x275FE3D2 # Existing password, can be omitted if it's the default of 0x00
new_password: 0x72AB96CD # New password

new_password: 配置选项意在编译、刷写到 ESP 设备上并运行一次,之后它会被移除,并在 password: 配置选项中定义新密码,以便再次编译并刷写。

fingerprint_grow:
password: 0x72AB96CD # Update the existing password with the new one

使用此配置选项,你可以在一根手指被检测到触摸传感器时触发自动化。这对于通过 AuraLed 向用户指示传感器已检测到手指触摸并将执行扫描非常有用。此触发器仅在**你的指纹传感器配置了 sensing_pin 选项时才会激活。

on_finger_scan_start:
- fingerprint_grow.aura_led_control:
state: ALWAYS_ON
color: GREEN
speed: 0
count: 0

使用此配置选项,你可以每当扫描失败时编写复杂的自动化,例如当手指没有正确放置在读取器上时。这与 on_finger_scan_unmatched 不同,后者是在扫描到未知指纹时触发的。此选项在与 sensing_pin 选项一起定义时效果最好。

on_finger_scan_invalid:
- text_sensor.template.publish:
id: fingerprint_state
state: "Invalid finger"

使用此配置选项,你可以每当手指扫描与已注册的指纹匹配时编写复杂的自动化。 要使用这些变量,请使用 lambda 模板,匹配的插槽号和置信度可在该 lambda 中以名为 finger_id 和 confidence 的变量获得。

on_finger_scan_matched:
- text_sensor.template.publish:
id: fingerprint_state
state: !lambda 'return "Authorized finger " + to_string(finger_id) + ", confidence " + to_string(confidence);'
# Pushing a tag_scanned event based on finger_id only if confidence is greater than 50
- if:
condition:
lambda: 'return confidence > 50;'
then:
- homeassistant.tag_scanned: !lambda |-
switch (finger_id) {
case 0:
return "person_a";
case 1:
return "person_b";
...
default:
return "person_unknown";
}

使用此配置选项,你可以每当扫描到未知指纹时编写复杂的自动化。

on_finger_scan_unmatched:
- text_sensor.template.publish:
id: fingerprint_state
state: "Unauthorized finger"

使用此配置选项,你可以为手指接触传感器但没有完全覆盖它的情况创建自动化,从而让你能够成功进行扫描。 此触发器仅在你的指纹传感器配置了 sensing_pin 选项时才会激活。它作为一个有用的指示器,在用户手指触摸不够充分时提醒用户。

on_finger_scan_misplaced:
- text_sensor.template.publish:
id: fingerprint_state
state: "Misplaced finger"

使用此配置选项,你可以每当在注册过程中扫描手指时编写复杂的自动化。 要使用这些变量,请使用 lambda 模板,扫描次数和要注册到的插槽号可在该 lambda 中以名为 scan_num 和 finger_id 的变量获得。

on_enrollment_scan:
- text_sensor.template.publish:
id: fingerprint_state
state: !lambda 'return "Enrolling into slot " + to_string(finger_id) + ", scanned " + to_string(scan_num) + " time(s)";'

使用此配置选项,你可以每当手指成功注册时编写复杂的自动化。 要使用这些变量,请使用 lambda 模板,注册到的插槽号可在该 lambda 中以名为 finger_id 的变量获得。

on_enrollment_done:
- text_sensor.template.publish:
id: fingerprint_state
state: !lambda 'return "Enrolled into slot " + to_string(finger_id);'

使用此配置选项,你可以每当手指注册失败时编写复杂的自动化。 要使用这些变量,请使用 lambda 模板,注册失败的插槽号可在该 lambda 中以名为 finger_id 的变量获得。

on_enrollment_failed:
- text_sensor.template.publish:
id: fingerprint_state
state: !lambda 'return "Failed to enroll into slot " + to_string(finger_id);'
# Retry enrollment into the same slot
- delay: 3s
- text_sensor.template.publish:
id: fingerprint_state
state: !lambda 'return "Retrying enrollment into slot " + to_string(finger_id) + " in 3 seconds...";'
- delay: 3s
- fingerprint_grow.enroll: !lambda 'return finger_id;'

在定义的插槽号上开始指纹注册过程。

on_...:
then:
- fingerprint_grow.enroll:
finger_id: 0
num_scans: 2
# Shorthand
- fingerprint_grow.enroll: 0
# Update the template text sensor for visual feedback
- text_sensor.template.publish:
id: fingerprint_state
state: "Place a finger on the reader"
  • finger_id (Required, int, templatable): 要将新指纹注册到的插槽号。限于读取器上可用的指纹容量。
  • num_scans (Optional, int, templatable): 扫描要注册的手指的次数。限于读取器上可用的字符缓冲区数量。默认为 2。

取消当前的指纹注册过程。触发 on_enrollment_failed 触发器。

on_...:
then:
- fingerprint_grow.cancel_enroll:

从定义的插槽号移除已注册的指纹。

on_...:
then:
- fingerprint_grow.delete:
finger_id: 0
# Shorthand
- fingerprint_grow.delete: 0
  • finger_id (Required, int, templatable): 要删除的已注册指纹的插槽号。

移除所有已注册的指纹。

on_...:
then:
- fingerprint_grow.delete_all:

打开或关闭读取器上的 LED。仅在特定型号上可用。如果你有 R503 或 R503-RGB,请改用 fingerprint_grow.aura_led_control 操作。

on_...:
then:
- fingerprint_grow.led_control:
state: ON
# Shorthand
- fingerprint_grow.led_control: ON
  • state (Required, boolean, templatable): 要设置的 LED 状态。

控制读取器上的 Aura LED。仅在特定型号上可用。注意:R503 有 2 个颜色选项不同的型号。

on_...:
then:
- fingerprint_grow.aura_led_control:
state: BREATHING
speed: 100
color: BLUE
count: 2
# Sample Aura LED config for all reader triggers
fingerprint_grow:
on_finger_scan_start:
- fingerprint_grow.aura_led_control:
state: ALWAYS_ON
color: GREEN
speed: 0
count: 0
on_finger_scan_matched:
- fingerprint_grow.aura_led_control:
state: BREATHING
speed: 200
color: BLUE
count: 1
on_finger_scan_unmatched:
- fingerprint_grow.aura_led_control:
state: FLASHING
speed: 25
color: RED
count: 2
on_finger_scan_misplaced:
- fingerprint_grow.aura_led_control:
state: FLASHING
speed: 25
color: PURPLE
count: 2
on_enrollment_scan:
- fingerprint_grow.aura_led_control:
state: FLASHING
speed: 25
color: BLUE
count: 2
- fingerprint_grow.aura_led_control:
state: ALWAYS_ON
speed: 0
color: PURPLE
count: 0
on_enrollment_done:
- fingerprint_grow.aura_led_control:
state: BREATHING
speed: 100
color: BLUE
count: 2
on_enrollment_failed:
- fingerprint_grow.aura_led_control:
state: FLASHING
speed: 25
color: RED
count: 4
on...:
then:
- fingerprint_grow.enroll: ...
- fingerprint_grow.aura_led_control:
state: ALWAYS_ON
speed: 0
color: PURPLE
count: 0
  • state (Required, string, templatable): 要设置的 LED 状态。为 BREATHING、FLASHING、ALWAYS_ON、ALWAYS_OFF、GRADUAL_ON 和 GRADUAL_OFF 之一。
  • speed (Required, int, templatable): 每个循环的持续时间,为 10ms 的倍数。仅与 BREATHING、FLASHING、GRADUAL_ON 和 GRADUAL_OFF 状态相关。总持续时间由 10ms * speed 定义。范围为 0 到 255。
  • color (Required, string, templatable): 要激活的 LED 颜色。对于 R503,为 RED、BLUE 和 PURPLE 之一。对于 R503-RGB,为 RED、BLUE、PURPLE、GREEN、YELLOW、CYAN 和 WHITE 之一。
  • count (Required, int, templatable): 图案重复的次数。仅与 BREATHING 和 FLASHING 状态相关。0 表示无限,或 1 到 255。

使用以下代码,你可以快速设置一个节点,并在开发者工具中使用 Home Assistant 的操作。 例如,调用 fingerprint_grow.enroll 时,选择操作 esphome.test_node_enroll,并在操作数据中输入

{ "finger_id": 0, "num_scans": 2 }
uart:
rx_pin: GPIOXX
tx_pin: GPIOXX
baud_rate: 57600
fingerprint_grow:
sensing_pin: GPIOXX
on_finger_scan_invalid:
- homeassistant.event:
event: esphome.test_node_finger_scan_invalid
on_finger_scan_matched:
- homeassistant.event:
event: esphome.test_node_finger_scan_matched
data:
finger_id: !lambda 'return finger_id;'
confidence: !lambda 'return confidence;'
on_finger_scan_unmatched:
- homeassistant.event:
event: esphome.test_node_finger_scan_unmatched
on_finger_scan_misplaced:
- homeassistant.event:
event: esphome.frontdoor_finger_scan_misplaced
on_enrollment_scan:
- homeassistant.event:
event: esphome.test_node_enrollment_scan
data:
finger_id: !lambda 'return finger_id;'
scan_num: !lambda 'return scan_num;'
on_enrollment_done:
- homeassistant.event:
event: esphome.test_node_enrollment_done
data:
finger_id: !lambda 'return finger_id;'
on_enrollment_failed:
- homeassistant.event:
event: esphome.test_node_enrollment_failed
data:
finger_id: !lambda 'return finger_id;'
api:
actions:
- action: enroll
variables:
finger_id: int
num_scans: int
then:
- fingerprint_grow.enroll:
finger_id: !lambda 'return finger_id;'
num_scans: !lambda 'return num_scans;'
- action: cancel_enroll
then:
- fingerprint_grow.cancel_enroll:
- action: delete
variables:
finger_id: int
then:
- fingerprint_grow.delete:
finger_id: !lambda 'return finger_id;'
- action: delete_all
then:
- fingerprint_grow.delete_all: