Я не нашёл клавиатуру с нужными мне функциями для Home Assistant, поэтому собрал свою на ESPHome.

Когда-то я модернизировал старую охранную систему с помощью Konnected, который позволяет подключить прежние датчики к Home Assistant и через интеграцию Alarmo заново собрать систему. Всё работало отлично, но управлять только с телефона оказалось немного утомительно.

Представьте: вы входите или уходите, система взведена, вы открываете дверь, запускается задержка, и вы лихорадочно ищете телефон, чтобы успеть снять систему с охраны до срабатывания.

Удалённый доступ — это хорошо, но для повседневного использования мне больше нравится отдельный контроллер. Эта сборка решает задачу: модуль отпечатков для быстрой локальной аутентификации, клавиатура как запасной вариант для ввода PIN-кода и световой индикатор состояния.

Прим.редактора: осторожно, в статье много картинок.

Комплектующие и материалы

Комплектующие и материалы
  • Печатная плата клавиатуры → файлы Gerber

  • Спецификация клавиатуры → BOM

Комплектующие

  • Емкостный датчик отпечатков R503 (UART).

  • Опционально. Датчик качества воздуха SGP30 (I²C, модуль Adafruit или аналог).

  • Опционально. Датчик BME680 (I²C/SPI, модуль Adafruit или аналог).

  • Опционально. Кабель STEMMA QT / Qwiic (JST-SH, 4-контактный).

Крепёж

  • Набор самонарезающих винтов M2 

  • Крепёжные полоски Command или саморезы по гипсокартону

Инструменты

  • FDM-3D-принтер (например, Bambu Lab P1S)

  • Пластик PLA, матовый (например, Bambu Filament)

  • Электрическая прецизионная отвёртка (набор)

  • Набор прецизионных отвёрток

  • Паяльная станция / паяльник

  • Держатель «третья рука»

  • Стриппер для проводов

  • Кримпер для обжима

  • Термоусадка

  • Флюс, припой

  • Бокорезы

  • Пинцет, плоскогубцы

Шаг 1: Посмотрите видео

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

Шаг 2: 3D-печать корпуса

Файлы корпуса находятся в репозитории проекта на GitHub, либо вы можете экспортировать их в нужном формате из встроенного виджета Autodesk Fusion.

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

Кейкапы тоже печатаются на 3D-принтере. Конкретно эти я делал из смолы в более раннем проекте, но их совершенно спокойно можно печатать FDM. Рекомендую высоту слоя 0,08 мм и печать под углом, уложив кейкапы на одну из боковых граней.

Шаг 3: Электроника

Я начал с нижней стороны печатной платы, где размещено большинство SMD-компонентов. Шприцом с паяльной пастой вручную нанес пасту на площадки, расставил компоненты, затем пропаял эту сторону на термоплитке. Это можно сделать и вручную — так я и поступил для верхней стороны, где установил четыре NeoPixel и их конденсаторы.

Обычно после этого требуется небольшая доработка: убрать мостики припоя и добавить припой там, где нужно.

⚠️ Примечание: диоды нужно паять в обратной полярности относительно того, как указано на шелкографии. Я выяснил это, когда матрица клавиатуры не заработала при первом тесте. Компонент ESPHome ожидает, что строки будут выходами, а я развёл наоборот. Думаю, это можно перевернуть и в конфигурации, но так чище.

Шаг 4: Настройка ESPHome

Когда SMD-часть закончена, подготовьте ESP к первому запуску в Home Assistant. Можно ориентироваться на руководство ESPHome.

Если плата не входит в режим загрузчика (bootloader), удерживайте кнопку BOOT, нажмите и отпустите RESET, затем отпустите BOOT.

Обязательно настройте OTA, чтобы загружать прошивку и изменения по воздуху. После первичной настройки вы должны увидеть устройство онлайн в ESPHome Dashboard (аддоне) Home Assistant.

Если всё так, добавьте этот фрагмент в ваш YAML ESPHome и нажмите Install, чтобы скомпилировать и загрузить прошивку.

# Keypad Matrix
matrix_keypad:
  id: mykeypad
  rows:
    - pin: GPIO4
    - pin: GPIO5
    - pin: GPIO6
    - pin: GPIO7
  columns:
    - pin: GPIO10
    - pin: GPIO11
    - pin: GPIO12
  keys: "123456789*0#"
  has_diodes: True

# Key Collector
key_collector:
  - id: pincode_reader
    source_id: mykeypad
    min_length: 4
    max_length: 4
    end_keys: "#"
    end_key_required: True
    clear_keys: "*"
    allowed_keys: "0123456789"
    timeout: 5s
    on_progress:
      - logger.log:
          format: "input progress: '%s', started by '%c'"
          args: [ 'x.c_str()', "(start == 0 ? '~' : start)" ]
    on_result:
      - logger.log:
          format: "input result: '%s', started by '%c', ended by '%c'"
          args: [ 'x.c_str()', "(start == 0 ? '~' : start)", "(end == 0 ? '~' : end)" ]
    on_timeout:
      - logger.log:
          format: "input timeout: '%s', started by '%c'"
          args: [ 'x.c_str()', "(start == 0 ? '~' : start)" ]

# Status Light
light:
  - platform: esp32_rmt_led_strip
    rgb_order: GRB
    chipset: WS2811
    pin: GPIO21
    num_leds: 4
    name: "Status Light"
    id: status_light
    restore_mode: ALWAYS_O

Если всё прошло нормально, после загрузки вы увидите вывод логов. Проверьте светодиоды, меняя цвет света напрямую через сущность Home Assistant.

Чтобы проверить клавиатуру, замкните контактные площадки кнопок пинцетом (как на фото). В логах ESPHome (Dashboard) должны появиться соответствующие цифры.

Шаг 5: Сборка

Я начал с припайки 2-контактного углового штырькового разъёма к посадочному месту рядом с разъёмом USB-C. Планировал питать плату 90-градусным USB-C-кабелем, но под рукой такого не было, поэтому я обжал 2-контактный коннектор Dupont на обычный USB-кабель и подключил его к этому разъёму.

Далее установил датчик отпечатков во внешнюю оболочку и затянул комплектной гайкой. Добавил опциональные датчики окружающей среды с помощью кабеля STEMMA QT/Qwiic, проложил провода вокруг корпуса и зафиксировал датчики саморезами M2. ⚠️ Перед тем как закреплять датчики, нужно установить пластину под переключатели (switch plate).

После этого установил основную печатную плату и закрепил и её, и пластину под переключатели дополнительными саморезами M2.

Затем защёлкнул переключатели MX в пластину под переключатели (switch plate) и припаял их к основной плате. Также припаял датчик отпечатков к штырьковому разъёму (UART header) и один конец кабеля STEMMA к штырьковому разъёму I²C (I2C header).

Несколько замечаний по проводке:

  • UART: TX на датчике идёт к RX на разъёме, а RX — к TX.

  • Power: красный провод датчика — на площадку с меткой PWR.

  • Wake: белый провод — на площадку 3.3 V.

  • Touch sense: синий провод — на площадку TS; 

С установленным на плате транзистором ESPHome может усыплять датчик.

На этом этапе всё «железо» установлено и готово к финальной прошивке.

Шаг 6: Прошивка ESPHome

При включённой клавиатуре, которая уже отображается в ESPHome Dashboard (аддоне) Home Assistant, возьмите YAML с GitHub и вставьте его поверх текущей конфигурации. Параметры Wi-Fi, шифрования и OTA скрыты через переменные !secret, поэтому я добавляю эти значения в свой secrets.yaml (или вставляю напрямую), используя те же учётные данные, что применялись при первой прошивке устройства.

Когда всё готово, нажмите Install, чтобы обновить прошивку на устройстве.

Шаг 7: Автоматизации Home Assistant

Прежде чем настраивать автоматизации, зарегистрируйте несколько отпечатков. Используйте кнопки, которые теперь видны на странице устройства в Home Assistant: нажмите Add, дважды отсканируйте палец — готово. Начиная с этого момента сканирование даёт визуальную обратную связь: зелёный — совпадение, красный — неизвестный отпечаток, фиолетовый — палец приложен неверно.

Как только отпечатки сохранены и скан совпадает, устройство отправляет событие Home Assistant с именем esphome.fingerprint_authenticated. Я создал автоматизацию, которая слушает это событие и вызывает скрипт, переключающий состояние охраны: если система взведена — снимает, и наоборот.

То же самое происходит, когда вы вводите 4-значный PIN-код и нажимаете # (нижняя правая клавиша). Это действие отправляет esphome.keypad_code_entered с PIN-кодом в качестве полезной нагрузки. Вторая автоматизация перехватывает это событие и вызывает тот же скрипт, передавая PIN.

Внутри скрипта Alarmo получает PIN. Если код принадлежит валидному пользователю, Alarmo переключает систему; если нет — ничего не происходит.

Третья автоматизация просто отслеживает состояние охранной системы и меняет цвет у сущности light (свет) устройства, чтобы это состояние отражать.

⚠️ Примечание по безопасности:

Для более жёсткого контроля можно ограничить автоматизации событиями, приходящими только от конкретного устройства. Перед тем как полагаться на это в критически важных сценариях безопасности, самостоятельно изучите вопрос. Все мои «умные» устройства находятся в отдельном VLAN, который не имеет доступа к остальной сети. Общая безопасность этого устройства всё равно зависит от того, как вы настроите Home Assistant, Alarmo и вашу сеть.

Шаг 8: Монтаж на стену

Сначала я закрепил клавиатуру на полосках Command, чтобы пару дней потестировать расположение. Если предпочитаете, можно использовать винты и зафиксировать настенную монтажную пластину постоянно.

Проложите кабель питания либо внутри стены через отверстие в монтажной пластине, либо прямо вниз через нижний кабельный ввод. В обоих случаях зафиксируйте USB-кабель нейлоновой стяжкой на одной из точек крепления на монтажной пластине, чтобы он не выдёргивался.

Когда кабель закреплён, подключите его к 2-контактному разъёму (GND обозначен на шелкографии), защёлкните узел клавиатуры на монтажной пластине — и готово.

Шаг 9: Готово


Если после такой самоделки хочется копнуть инфраструктуру глубже, можно заглянуть на два демо-урока OTUS:

  • «Собираем собственные Docker-контейнеры» — про то, как аккуратно упаковывать сервисы вроде Home Assistant и ESPHome. 18 ноября. Записаться

  • «Flutter Mesh — синхронизация данных между устройствами без интернета и серверов» — про связки устройств, которые обмениваются данными локально, без облака. 26 ноября. Записаться

Комментарии (1)


  1. vazir
    14.11.2025 15:37

    Вот зачем тут это? Если бы наш перец сделал для себя и сделал пост по результату - респект и уважуха, просто за труд. Да и заинтересованным пообщаться с автором позадавать вопросы.
    А перевод залитого за 5 минут в чатгпт того что можно почитать на буржуйских ресурсах? Мы все по английски читаем и если надо почитаем оригинал. Неуважуха.