Делаем систему контроля и управления доступом (СКУД) для умного дома

в 15:58, , рубрики: diy или сделай сам, esp32, home assistant, PN532, сигнализация, умный дом

Введение

Примерно год назад я начал готовиться к переезду и собирать прототип умного дома. В качестве системы управления я выбрал наиболее популярное на текущий момент и активно развивающееся решение - Home Assistant. По мере обрастания умного дома датчиками встал вопрос об охранной системе, которая в случае чего поднимет тревогу и сообщит мне (соседям) о незваных гостях. В системе от частных охранных предприятий пока не вижу необходимости, поэтому решил сделать всё сам.

Как это работает: на входной двери размещён датчик открытия, который по протоколу Zigbee сообщает серверу умного дома, что кто-то зашёл в квартиру. Срабатывает сигнализация в "тихом режиме" (событие "triggered" во встроенной интеграции; это никак не проявляется, но идёт обратный отсчёт до запуска сирены). Если за указанное в настройках время не снять блокировку (через ввод кода или NFC-меткой), запустится сирена и световая индикация.

Из чего собрано:

  • ESP32 WROOM DevKit v1 (в теории можно заменить любой ESP, изменив конфиг под неё)

  • RFID/NFC модуль PN532

  • Соединительные провода (6 штук)

  • Напечатанный на 3D-принтере корпус

  • Xiaomi Gateway 2 (который с локальным управлением) я планирую использовать как динамик и световую индикацию

  • Датчик открытия двери от Aqara

  • Опционально можно добавить люстру, LED-ленты, умные колонки и любые другие устройства на ваш вкус, цвет и возможности автоматизаций Home Assistant.

ESP32 WROOM DevKit v1 (30 контактов)
ESP32 WROOM DevKit v1 (30 контактов)
RFID/NFC модуль PN532. Китайцы скопировали версию от Elechouse.
RFID/NFC модуль PN532. Китайцы скопировали версию от Elechouse.

Корпус мне намечал друг, у которого есть 3D-принтер. Хаб и датчики от Xiaomi вынесем за скобки. Остальные элементы покупались на Aliexpress и суммарно обошлись мне в 600 рублей.

Подключение и настройка ESP

Для начала переключим NFC-модуль в режим работы через интерфейс SPI. Ставим первый переключатель в нижнее положение (ближе к цифре 1), а второй - в верхнее (ближе к буквам). Припаиваем гребёнку на 8 контактов и готовим соединительные провода.

Включенный режим I2C и подключенные соединительные провода
Включенный режим I2C и подключенные соединительные провода

Насколько я понял из распиновки, возможно несколько вариантов подключения NFC-модуля к ESP-32: мне было удобнее подключить всё на одну сторону. Если будете использовать другие контакты, внимательно проверяйте конфиг - возможно, он немного изменится.

Распиновка для 30-контактной ESP-32
Распиновка для 30-контактной ESP-32

Подключаем модуль следующим образом (слева ESP, справа PN532):

  • GPIO18 - SKC

  • GPIO19 - MSO

  • GPIO23 - MOSI

  • GPIO5 - SS

  • 3V3 - VCC

  • GND - GND

PN532 подключенная к ESP-32
PN532 подключенная к ESP-32

На следующем этапе нам нужно установить аддон ESPHome и настроить нашу ESP-32. Подробно расписывать базовые моменты не буду, рекомендую следовать данному видео:

Остановлюсь лишь на итоговом конфиге:

esphome:
  name: esp32
  platform: ESP32
  board: nodemcu-32s

wifi:
  ssid: "My Wi-Fi"
  password: "mypassword"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp32 Fallback Hotspot"
    password: "mypassword"

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: "mypassword"

ota:
  password: "mypassword"

web_server:
  port: 80

spi:
  clk_pin: GPIO18
  miso_pin: GPIO19
  mosi_pin: GPIO23

pn532_spi:
  cs_pin: GPIO5
  update_interval: 1s

esp32_ble_tracker:

switch:
  - platform: gpio
    name: "ESP LED"
    pin:
      number: GPIO2
      mode: OUTPUT

binary_sensor:
  - platform: pn532
    uid: 79-EB-08-B4
    name: "NFC Card"

Обратите внимание на блоки spi и pn532_spi, где мы указывает контакты подключения. В блоке switch я задействовал светодиод на плате (им можно мигать, например, при поднесении валидной метки), а в блоке binary_sensor создал сущность для Home Assistant (при поднесении карты с указанным uid сенсор переходит в статус true; uid карты можно найти в логах вашей ESP в аддоне ESPHome). Как показали опыты, можно читать RFID-метки, банковские карты и тройку. NFC в моём телефоне нет, но скорее всего и он будет работать.

Компилируем прошивку и выгружаем её на ESP. Проверяем, что всё работает, открыв логи и поднеся к считывателю RFID-метку. Её uid должен отобразиться в логе:

[17:42:35][D][pn532:149]: Found new tag '79-EB-08-B4'

Со стороны ESP всё готово, теперь нужно настроить автоматизации в Home Assistan

Подключение сигнализации в Home Assistant

Для работы в сигнализацией в Home Assistant есть встроенная интеграция и карточка Lovelace. Начнём с интеграции - чтобы её включить, нужно добавить в configuration.yaml следующий блок:

alarm_control_panel:
  - platform: manual
    code: !secret alarm_pin
    code_arm_required: false
    # Задержка перед постановкой на охрану
    arming_time: 5
    # Задержка перед запуском сигнализации
    delay_time: 10
    # Время сигнализации
    trigger_time: 600

Код для разблокировки я вынес в отдельный файл secrets.yaml. Почитать, как он устроен, можно тут.

Поскольку мы тестируем нашу СКУД, arming_time (время до включения режима охраны, за которое вы успеете выйти из квартиры и закрыть дверь) и delay_time (время после срабатывания датчика двери, через которое запустится сирена) зададим как 5 и 10 секунд соответственно. Сохраняем, перезагружаем Home Assistant.

Далее создаём карточку сигнализации в Lovelace, добавив код в нужное вам место ui-lovelace.yaml

- type: alarm-panel
  name: Сигнализация
  entity: alarm_control_panel.ha_alarm
  states:
    - arm_away

В entity указываем название объекта, который создался после подключения alarm_control_panel. В states можно указать, какие кнопки будут в карточке: я оставил только "Охрана (не дома)".

Автоматизация

Чтобы связать NFC-метки с нашим умным домом, потребуется создать 5 автоматизаций:

  • Срабатывание сигнализации (запускается, когда мы заходим в квартиру)

  • Включение режима охраны (прикладываем метку и уходим из дома)

  • Отключение режима охраны (прикладываем метку, когда пришли домой)

  • Включение сирены

  • Отключение сирены

Срабатывание сигнализации

В качестве триггера используется датчик открытия двери. Когда дверь открывается при условии, что включен режим охраны, запускается наша автоматизация. В блоке с действиями я задал мигание шлюзом Xiaomi и диодом на ESP-32. Вы можете использовать любые другие действия.

- id: '3-0001'
  alias: 'Срабатывание сигнализации'
  trigger:
    platform: state
    entity_id: binary_sensor.158d000446f3fe_contact
    to: 'on'
  condition:
    - condition: state
      entity_id: alarm_control_panel.ha_alarm
      state: armed_away
  action:
  - service: alarm_control_panel.alarm_trigger
    entity_id: alarm_control_panel.ha_alarm
  - repeat:
        sequence:
          - service: light.turn_on
            data:
                entity_id: light.gateway_light_44237c82f751
                color_name: red
                brightness: 255
          - service: switch.turn_on
            entity_id: switch.esp_led
          - delay:
                milliseconds: 500
          - service: light.turn_off
            entity_id: light.gateway_light_44237c82f751
          - service: switch.turn_off
            entity_id: switch.esp_led
          - delay:
                milliseconds: 500
        until:
          condition: or
          conditions:
          - condition: state
            entity_id: alarm_control_panel.ha_alarm
            state: armed_away
          - condition: state
            entity_id: alarm_control_panel.ha_alarm
            state: disarmed

Включение режима охраны

Триггер - чтение метки с заданным на этапе настройки ESP uid. Пока мы выходим из квартиры, шлюз мигает оранжевым светом. После того, как включился режим охраны, загорается диод на ESP, а шлюз включает статичный красный свет на 3 секунды и гаснет.

- id: '3-0002'
  alias: 'Включение режима охраны'
  trigger:
    platform: state
    entity_id: binary_sensor.nfc_card
    to: 'on'
  condition:
    - condition: state
      entity_id: alarm_control_panel.ha_alarm
      state: disarmed
  action:
  - service: alarm_control_panel.alarm_arm_away
    entity_id: alarm_control_panel.ha_alarm
  - repeat:
        sequence:
          - service: light.turn_on
            data:
                entity_id: light.gateway_light_44237c82f751
                color_name: orange
                brightness: 255
          - service: switch.turn_on
            entity_id: switch.esp_led
          - delay:
                milliseconds: 500
          - service: light.turn_off
            entity_id: light.gateway_light_44237c82f751
          - service: switch.turn_off
            entity_id: switch.esp_led
          - delay:
                milliseconds: 500
        until:
          - condition: state
            entity_id: alarm_control_panel.ha_alarm
            state: armed_away
  - service: switch.turn_on
    entity_id: switch.esp_led
  - service: light.turn_on
    data:
        entity_id: light.gateway_light_44237c82f751
        color_name: red
        brightness: 255
  - delay:
        seconds: 3
  - service: light.turn_off
    entity_id: light.gateway_light_44237c82f751

Отключение режима охраны

В этой автоматизации в качестве триггера снова используется RFID-метка. Условием является включенный или включающийся режим охраны. Последний предусмотрен на случай, если собрались уходить из дома, приложили карточку и вспомнили про включенный утюг. При валидной метке коротко включается диод на ESP и зелёная подсветка на шлюзе.

- id: '3-0003'
  alias: 'Отключение режима охраны'
  trigger:
    platform: state
    entity_id: binary_sensor.nfc_card
    to: 'on'
  condition:
    condition: or
    conditions:
    - condition: state
      entity_id: alarm_control_panel.ha_alarm
      state: armed_away
    - condition: state
      entity_id: alarm_control_panel.ha_alarm
      state: pending
  action:
  - service: alarm_control_panel.alarm_disarm
    data:
        entity_id: alarm_control_panel.ha_alarm
        code: !secret alarm_pin
  - delay:
        milliseconds: 100
  - service: switch.turn_off
    entity_id: switch.esp_led
  - service: light.turn_on
    data:
        entity_id: light.gateway_light_44237c82f751
        color_name: green
        brightness: 255
  - delay:
        seconds: 3
  - service: light.turn_off
    entity_id: light.gateway_light_44237c82f751

Включение сирены

Пока что я не особо заморачивался с индикацией, поэтому в автоматизации только сирена из встроенных звуков шлюза. В будущем планирую дополнительно выводить звук на умную колонку и мигать люстрой.

- id: '3-0004'
  alias: 'Запуск звука сигнализации'
  trigger:
  - platform: state
    entity_id: alarm_control_panel.ha_alarm
    to: 'triggered'
  action:
  - service: xiaomi_aqara.play_ringtone
    data:
        gw_mac: 44237C82F751
        ringtone_id: 0
        ringtone_vol: 3

Отключение сирены

От "отключения режима охраны" отличается лишь условием по статусу alarm_control_panel.ha_alarm (здесь triggered) и отключением сирены или другой индикации.

- id: '3-0005'
  alias: 'Отключение сигнализации'
  trigger:
    platform: state
    entity_id: binary_sensor.nfc_card
    to: 'on'
  condition:
    - condition: state
      entity_id: alarm_control_panel.ha_alarm
      state: triggered
  action:
  - service: alarm_control_panel.alarm_disarm
    data:
        entity_id: alarm_control_panel.ha_alarm
        code: !secret alarm_pin
  - service: xiaomi_aqara.stop_ringtone
    data:
        gw_mac: 44237C82F751
  - delay:
        milliseconds: 500
  - service: switch.turn_off
    entity_id: switch.esp_led
  - service: light.turn_on
    data:
        entity_id: light.gateway_light_44237c82f751
        color_name: green
        brightness: 255
  - delay:
        seconds: 3
  - service: light.turn_off
    entity_id: light.gateway_light_44237c82f751

Красивая обёртка

Наверное, очевидно, что две платы без какого-либо корпуса выглядят не очень красиво и безопасно. Я попросил другая спроектировать и напечатать под них корпус. Цвет выбрали белый, чтобы подходил под будущий интерьер. Уже после печати я понял, что белый корпус не гасит свет диодов на ESP, поэтому их можно использовать в автоматизациях. Даже синий диод в условиях коридора должен быть виден.

Основа, на которую ложатся платы, и прищепка (слева) для того, чтобы закрепить PN532
Основа, на которую ложатся платы, и прищепка (слева) для того, чтобы закрепить PN532
К ESP подключается кабель питания, поэтому она не должна болтаться внутри корпуса.
К ESP подключается кабель питания, поэтому она не должна болтаться внутри корпуса.

Ух, наконец-то закончил. Спасибо, что дочитали до конца. Надеюсь, что этот гайд помог вам!

Если возникнут какие-то вопросы, задавайте в комментариях. Постараюсь ответить.

Автор: Антон

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js