Статья

Доработка к замку motorlock

Как то я писал обзор замка Motorlock. В целом девайс не совсем однозначный, но по прошествии времени к нему привыкли, плюсов по ощущениям у него больше. Особенно вау эффект конечно бомбический. Замок не остался незамеченным)

 Но есть и минусы. Нет никакой обратной связи от собственно замка. Замок не знает закрыт он в данный момент или нет.  Для полноценного управления замком нужно приобретать шлюз для него. Но опять же это управление будет через свое приложение, которое работает через китайские облака. В комплекте есть пульт которым пользуется жена.  Одновременно с моей статьёй вышла статья ESP32 + Grow R503 + Gimdow. Вход в квартиру по отпечатку пальца + кнопка звонка, где наш товарищ сделал отличную доработку к аналогичному замку с алиэкспресс.   

Заказал себе считыватель отпечатков пальцев. Такой же длиной 15 мм. Считыватель управляется через uart. Довольно увесистый. Есть световое кольцо, управляемое программно. Есть дискретный выход прикосновения. Память позволяет записать до 200 отпечатков пальцев.
Плата ESP32-pico-kit нашлась в закромах. У этой платы интересная 3D антенна. Водрузил это на макетную плату.
Для управления использовал пульт. Пульты есть на алиэкспресс, находятся по тегу TTLock. Родной пульт потерян где-то в квартире. Приложуха его видит, но найти не смогли пока)) Кстати из двух пультов, с одним произошел какой-то казус. При сопряжении в приложении глюкнуло. Теперь этот пульт управляет замком, но в приложении нет сведений о нём. Распотрошил этот пульт от замка. Питается от одной литиевой таблетки. Построен он на чипе TLSR. Открытие и закрытие производится с разных кнопок. Долгое нажатие кнопки включает режим сопряжения.
Припаял на макетную плату, питание подал 3.3 вольт с платы ESP. Кнопки вывел на пины ESP. Для общего питания схемы, взял неиспользуемый зарядник от мобилы. С помощью термосоплей приклеил к макетке.
Для подключения считывателя и датчиков, приобрел простой разветвитель RJ45. Развел на них питание и шлейф данных. Для считывателя нужно 6 проводов, так что укладываемся. Недавно подключился к другому оператору интернета, соответственно бурили отверстие в стене, попросил кинуть дополнительный кусок кабеля UTP для считывателя.
Стал изучать вопрос воспроизведения звука с помощью Esphome. Но что то реализация его мне не понравилась. Решил звук сделать не программным, а аппаратным: купил проводной музыкальный звонок. Извлек из него плату с синтезатором звука, ну и динамик заодно. Плата может воспроизводить несколько музыкальных фрагментов, но я использую один - Дин-Дон. Питание платы 3.3 вольт. Кнопку так же вывел на пин ESP.

В итоге получился такой компактный девайс. По началу думал нарисовать корпус и распечатать, но плата будет внутри щитка, особой нужды в корпусе нет. 
Разместить его решил в щитке с сетевым оборудованием. К свободному порту USB на блоке питания подключил питание умного домофона, от одного известного производителя. Красный это провод от датчиков двери. Оконцевал его и кабель UTP с подъезда разъёмом RJ45. Так же сюда подключил датчик движения. Раньше он у меня был подключен к плате домофона. На фото есть косяк: не везде синяя изолента. Она внезапно закончилась))
Так же у меня давно были датчики на двери: Датчик закрытия ригеля замка, и датчик открытия двери. На али был куплен геркон в круглом корпусе. На фотографии он вверху. В косяке рассверлено отверстие, и вставлен заподлицо. Это датчик открытия двери. Датчик замка это геркон в глубине косяка. Подпаял к ним плоский шлейф. Пустил его под обоями. На видном месте закрою шпатлевкой. Как раз в планах небольшой ремонт.
На ригеле установил магнит. Причем засверлил углубление в торце ригеля. Решил примерить магнит. Он туда подошел идеально, и обратно я его уже не смог выковырять) Капнул немного суперклея для верности и так оставил. Выше виден белый магнит комплектный к круглому геркону

 Дальше сел за компьютер программировать. Алгоритм работы будет такой: Прикладываем палец к считывателю. Если палец опознан, то идет команда на открытие замка через пульт. Если палец не распознан, то нажимаем кнопку звонка. При этом, если замок открыт, то команда не выдаётся. Так же реализованы свичи для записи отпечатков пальцев в память. Можно задать порядковый номер записи. Если не задавать, то он инкрементируется автоматически. Есть параметр, количество повторений считывания, при записи отпечатка. Я так понял, чем больше, тем выше достоверность, но снижается общее количество записанных отпечатков. Код автора соответственно переделал под свою конфигурацию. Код считывателя практически без изменений из примеров Esphome. Добавлены датчик двери, датчик замка, датчик движения. Так как я буду подключать к Sprut.hub убрал API и включил MQTT.

yaml
Копировать
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 feedback
text_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 в коде, вызвало зависание еспхи. Пришлось опять разбирать щиток и снимать девайс для перепрошивки. В общем пока забросил идею.

Ниже небольшие видео, как работает считыватель, и открытие замка Алисой. Сенсор плавно моргает бирюзовым в исходном состоянии, при закрытом замке период моргания длинный, при открытом короткий. Сразу видно открыт замок или нет. При прикосновении загорается желтым. При успешном распознавании зеленым. Если не распознал, то красным. В режиме записи отпечатков горит фиолетовым. Успешная запись подтверждается белыми вспышками.

0

Вернуться назад
Вернуться назад