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

от автора

Введение

Примерно год назад я начал готовиться к переезду и собирать прототип умного дома. В качестве системы управления я выбрал наиболее популярное на текущий момент и активно развивающееся решение — 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://habr.com/ru/post/543446/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *