Как то я писал обзор замка Motorlock. В целом девайс не совсем однозначный, но по прошествии времени к нему привыкли, плюсов по ощущениям у него больше. Особенно вау эффект конечно бомбический. Замок не остался незамеченным)
Но есть и минусы. Нет никакой обратной связи от собственно замка. Замок не знает закрыт он в данный момент или нет. Для полноценного управления замком нужно приобретать шлюз для него. Но опять же это управление будет через свое приложение, которое работает через китайские облака. В комплекте есть пульт которым пользуется жена. Одновременно с моей статьёй вышла статья ESP32 + Grow R503 + Gimdow. Вход в квартиру по отпечатку пальца + кнопка звонка, где наш товарищ сделал отличную доработку к аналогичному замку с алиэкспресс.
.
Дальше сел за компьютер программировать. Алгоритм работы будет такой: Прикладываем палец к считывателю. Если палец опознан, то идет команда на открытие замка через пульт. Если палец не распознан, то нажимаем кнопку звонка. При этом, если замок открыт, то команда не выдаётся. Так же реализованы свичи для записи отпечатков пальцев в память. Можно задать порядковый номер записи. Если не задавать, то он инкрементируется автоматически. Есть параметр, количество повторений считывания, при записи отпечатка. Я так понял, чем больше, тем выше достоверность, но снижается общее количество записанных отпечатков. Код автора соответственно переделал под свою конфигурацию. Код считывателя практически без изменений из примеров Esphome. Добавлены датчик двери, датчик замка, датчик движения. Так как я буду подключать к Sprut.hub убрал API и включил MQTT.
esphome: name: fingerprint friendly_name: Fingerprint on_boot: priority: -800 then: - script.execute: breathing_light esp32: board: pico32 framework: type: arduino substitutions: device_name: Fingerprint web_server: port: 80 wifi: ssid: !secret wifi_ssid password: !secret wifi_password
ap: ssid: "Fingerprint Fallback Hotspot" password: "123456789" captive_portal:
logger:ota: password: "esphome"
mqtt: broker: 192.168.1.116 port: 44444 discovery: false reboot_timeout: 0s
uart:
rx_pin: GPIO13 tx_pin: GPIO15 baud_rate: 57600
number: - platform: template name: "Finger ID" id: finger_id
optimistic: true restore_value: true initial_value: 1
min_value: 0 max_value: 200 step: 1
- platform: template name: "Num scan" id: num_scans
optimistic: true restore_value: true initial_value: 2
min_value: 1 max_value: 10 step: 1
fingerprint_grow: sensing_pin: number: GPIO14 allow_other_uses: true on_finger_scan_matched: # палец распознан - text_sensor.template.publish: id: fingerprint_state state: !lambda 'return "Finger " + to_string(finger_id) + ", confidence " + to_string(confidence);' - lock.unlock: Motorlock #открываем замок - binary_sensor.template.publish: # включаем сеснор о правильном распозновании id: success_scanned state: ON - fingerprint_grow.aura_led_control: state: FLASHING speed: 25 color: GREEN count: 5 - delay: 2s - script.execute: breathing_light on_finger_scan_unmatched: # палец не распознан - text_sensor.template.publish: id: fingerprint_state state: "Unauthorized finger" - fingerprint_grow.aura_led_control: state: FLASHING speed: 25 color: RED count: 5 - delay: 1s - script.execute: breathing_light on_enrollment_scan: # запись пальца в память - text_sensor.template.publish: id: fingerprint_state state: "Finger scanned" - fingerprint_grow.aura_led_control: state: FLASHING speed: 25 color: GREEN count: 3 - fingerprint_grow.aura_led_control: state: ALWAYS_ON speed: 0 color: PURPLE count: 0 - switch.turn_off: enroll on_enrollment_done: # запись пальца прошла успешно - text_sensor.template.publish: id: fingerprint_state state: "Enrolled fingerprint" - fingerprint_grow.aura_led_control: state: FLASHING speed: 15 color: WHITE count: 5 - number.increment: finger_id - delay: 2s
- script.execute: breathing_light on_enrollment_failed: # неудачная запись пальца - text_sensor.template.publish: id: fingerprint_state state: "Failed to enroll fingerprint" - fingerprint_grow.aura_led_control: state: FLASHING speed: 25 color: RED count: 4 - delay: 2s - script.execute: breathing_light # Optional template text sensor for visual feedbacktext_sensor: - platform: template id: fingerprint_state name: "Fingerprint State"
switch: # выход на управление брелком замка - platform: gpio pin: GPIO27 inverted: true id: gatecl name: "Switch gate close" - platform: gpio pin: GPIO26 inverted: true id: gateop name: "Switch gate open" - platform: gpio pin: GPIO10 inverted: true id: zvonok
# button: - platform: template name: enroll id: enroll turn_on_action: - switch.turn_off: cancel - fingerprint_grow.enroll: finger_id: !lambda "return id(finger_id).state;" num_scans: !lambda "return id(num_scans).state;" - platform: template name: cancel id: cancel turn_on_action: - fingerprint_grow.cancel_enroll: - platform: template name: delete turn_on_action: - switch.turn_off: enroll - fingerprint_grow.delete: finger_id: !lambda "return id(finger_id).state;" - platform: template name: delete_all turn_on_action: - fingerprint_grow.delete_all: - number.set: id: finger_id value: 1
binary_sensor: - platform: fingerprint_grow id: fingerprint_enrolling name: "Fingerprint Enrolling" on_state: then: - fingerprint_grow.aura_led_control: state: ALWAYS_ON speed: 0 color: PURPLE count: 0 - platform: gpio # сенсор прикосновения к сканеру filters: - delayed_on: 10ms - invert: pin: number: GPIO14 allow_other_uses: true id: Finger_touch name: "Finger touch" icon: mdi:gesture-tap on_press: then: - if: # включаем звонок condition: - binary_sensor.is_off: fingerprint_enrolling then: - fingerprint_grow.aura_led_control: state: ALWAYS_ON speed: 0 color: YELLOW count: 0 - number.set: id: finger_id value: !lambda "return id(fprncnt).state + 1;" on_release: then: - if: # включаем звонок condition: - binary_sensor.is_off: success_scanned - binary_sensor.is_off: fingerprint_enrolling then: - switch.turn_on: zvonok - delay: 100ms - switch.turn_off: zvonok - script.execute: breathing_light - platform: gpio # вход бинарного датчика открытия двери id: Door_sensor name: "Door sensor" pin: number: 32 mode: INPUT_PULLUP
- platform: gpio # вход бинарного датчика открытия замка id: Lock_sensor name: "Lock sensor" filters: - delayed_on: 200ms pin: number: 33 mode: INPUT_PULLUP on_state: then: - script.execute: breathing_light_zamok
# Motion detection - platform: gpio name: "Motion sensor" id: motion_detected device_class: motion filters: - delayed_on: 400ms pin: number: 4 mode: INPUT_PULLUP inverted: True
- platform: template # сенсор удачного распознавания пальца name: success_scanned id: success_scanned icon: mdi:line-scan on_state: then: - delay: 5 s - binary_sensor.template.publish: id: success_scanned state: OFF - platform: status name: "${device_name}_status" sensor: - platform: fingerprint_grow fingerprint_count: name: "Fingerprint Count" id: fprncnt last_finger_id: name: "Fingerprint Last Finger ID" last_confidence: name: "Fingerprint Last Confidence" status: name: "Fingerprint Status" capacity: name: "Fingerprint Capacity" security_level: name: "Fingerprint Security Level" - platform: wifi_signal name: "${device_name}_rssi" update_interval: 5min - platform: uptime id: uptime_sec name: "${device_name}_uptime" update_interval: 5min
lock: # кнопки открытия/закрытия Motorlock с датчиком замка двери из ХА - platform: template name: Motorlock id: Motorlock optimistic: true assumed_state: true lock_action: - switch.turn_on: gatecl - delay: 500ms - switch.turn_off: gatecl unlock_action: - switch.turn_on: gateop - delay: 500ms - switch.turn_off: gateop lambda: |- if (id(Lock_sensor).state) { return LOCK_STATE_UNLOCKED; } else { return LOCK_STATE_LOCKED; }
script: #режим светодиода в зависимости от замка двери для возвращения значения после операций - id: breathing_light then: if: condition: - binary_sensor.is_off: Lock_sensor then: - fingerprint_grow.aura_led_control: state: BREATHING speed: 255 color: CYAN count: 0 else: - fingerprint_grow.aura_led_control: state: BREATHING speed: 85 color: CYAN count: 0 - id: breathing_light_zamok #режим светодиода в зависимости от замка двери только для самого замка then: if: condition: - binary_sensor.is_off: Lock_sensor then: - fingerprint_grow.aura_led_control: state: FLASHING speed: 35 color: GREEN count: 1 - fingerprint_grow.aura_led_control: state: BREATHING speed: 255 color: CYAN count: 0 else: - fingerprint_grow.aura_led_control: state: FLASHING speed: 35 color: GREEN count: 1 - fingerprint_grow.aura_led_control: state: BREATHING speed: 85 color: CYAN count: 0
Теперь замком стало пользоваться стало гораздо удобнее. Можно открыть дверь через хаб, или через Алису. Видно статус замка и статус входной двери. Настроил оповещение в телеграм, при открытии и закрытии двери. Так же есть сценарий, в 23:30 если дверь не заперта, то прилетает уведомление в телегу. Для открытия двери теперь пользуюсь считывателем. Достоверность считывания довольно высокая. В прихожей у меня датчик движения, который управляет освещением, стоит у входной двери. И была небольшая проблема: открываешь дверь и заходишь в темноту, cвет включается когда попадешь в зону действия датчика. Добавил в сценарии включение света по открытию двери. И теперь, открываешь дверь, и свет уже горит. Датчик движения раньше был подключен к умному домофону, и соответственно прошивка для него была своя доработанная на esphome, теперь никаких доработок нет, а значит могу перейти на нашу прошивку smartintercom.
Так как у меня ESP32 решил включить BLE и попробовать считать с замка параметры, хотя бы заряд батареи. Но включение ble tracker в коде, вызвало зависание еспхи. Пришлось опять разбирать щиток и снимать девайс для перепрошивки. В общем пока забросил идею.
Ниже небольшие видео, как работает считыватель, и открытие замка Алисой. Сенсор плавно моргает бирюзовым в исходном состоянии, при закрытом замке период моргания длинный, при открытом короткий. Сразу видно открыт замок или нет. При прикосновении загорается желтым. При успешном распознавании зеленым. Если не распознал, то красным. В режиме записи отпечатков горит фиолетовым. Успешная запись подтверждается белыми вспышками.