

Умные ворота на DoorHan CV01 и Home Assistant: как я обошёл плавающий код
Давно установил ролетные ворота с приводом DoorHan CV01. Блок управления общается с брелком на частоте 433,92 МГц, но там используется «плавающий код». Это значит, что просто так «перехватить» сигнал и подружить ворота с Home Assistant не получится — каждый раз код новый.
Но безвыходных ситуаций не бывает! Можно пойти другим путём :)
Важно: Это не пошаговая инструкция «бери и делай», а идея реализации. Комплектующие и способы могут отличаться, главное — понять принцип.

Железо: как подключиться без брелка
Вместо того чтобы ломать голову над радиосигналом, мы снимем данные напрямую с платы управления. Нас интересуют контакты, на которые подаётся напряжение при загорании светодиодов "UP" (открытие) и "DWN" (закрытие).
Для этого понадобится любой микроконтроллер и реле. У меня в закромах пылились ESP8266 (модуль ESP-01S с реле и отдельно плата ESP12F). В идеале всё можно собрать на одной плате, но в тот момент мне было удобнее разнести функции на два устройства. Вы, конечно, можете сделать всё по фэншую и уместить в одном.
Питание: Взял 12В прямо с блока DoorHan CV01. Для ESP использовал понижайку LM2596S.
Корпус: Всё это с небольшим трудом, но влезает в родной корпус CV01. Однако, поскольку у меня есть 3D-принтер, я распечатал отдельный бокс и разместил его рядом — так аккуратнее.
Что это даёт:
1. Статус: Когда ворота едут вверх или вниз, загорается соответствующий светодиод. ESP считывает это и передаёт в Home Assistant. На этих данных строятся автоматизации.
2. Управление: Через реле мы эмулируем нажатие кнопки, открывая и закрывая ворота без брелка.

Прошивка для отслеживания статуса (ESPHome)
Первая плата отвечает за сенсоры. Вот пример конфигурации. Обратите внимание на фильтры — они помогают убрать дребезг контактов.
esphome:
name: doorhan-cv01-esp12f
friendly_name: doorhan_cv01_esp12f
esp8266:
board: esp01_1m
# Enable Home Assistant API
api:
encryption:
key: "ВАШ КЛЮЧ"
ota:
- platform: esphome
password: "ВАШ ПАРОЛЬ"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Doorhan-Cv01-Esp12F"
password: "ВАШ ПАРОЛЬ"
logger:
web_server:
port: 80
captive_portal:
status_led:
pin:
number: GPIO2
inverted: true
binary_sensor:
# Сырые сигналы — с усиленной фильтрацией для UP (открытие)
- platform: gpio
pin: GPIO12 # D6 ← LED DWN → закрытие
id: dwn_raw
internal: true
filters:
- delayed_on: 10ms
- delayed_off: 10ms
- platform: gpio
pin:
number: GPIO13 # Гейт опеннинг
mode: INPUT_PULLUP # ← внутренняя подтяжка к 3.3V
id: up_raw
internal: true
filters:
- invert: # ← инвертируем логику
- delayed_on: 10ms
- delayed_off: 10ms
# Логические сенсоры — для автоматизаций
- platform: template
name: "Gate Closing"
lambda: return not id(dwn_raw).state; # Инвертируем состояние!
id: gate_closing
device_class: opening
Небольшой лайфхак: Я немного ошибся с распайкой контактов, но перепаивать было лень. Поэтому просто инвертировал логику в прошивке. Софт исправляет железо!
Прошивка для управления реле (ESPHome)
Вторая плата (ESP-01S) отвечает за команду «Открыть/Закрыть». Она замыкает реле на короткое время, имитируя нажатие кнопки на пульте.
esphome:
name: esp01s
friendly_name: ESP01S
esp8266:
board: esp01_1m
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "ВАШ КЛЮЧ"
ota:
- platform: esphome
password: "ВАШ ПАРОЛЬ"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Esp01S Fallback Hotspot"
password: "ВАШ ПАРОЛЬ"
web_server:
port: 80
captive_portal:
# Все переключатели — в одном блоке
switch:
# Физическое реле (внутреннее, не отображается в HA)
- platform: gpio
pin:
number: GPIO0
inverted: true
mode: OUTPUT
id: relay_output
internal: true
restore_mode: ALWAYS_OFF
# Выключатель для управления воротами (виден в HA)
- platform: template
name: "Roller Gate Control"
turn_on_action:
- switch.turn_on: relay_output
- delay: 500ms
- switch.turn_off: relay_output
# Опционально: статусный LED
status_led:
pin:
number: GPIO2
inverted: true
# Опционально: текстовый сенсор состояния реле
text_sensor:
- platform: template
name: "Relay Status"
lambda: |-
if (id(relay_output).state) {
return {"ON"};
} else {
return {"OFF"};
}
Магия автоматизаций
Теперь, когда ворота «в сети», можно творить чудеса. Вот что у меня работает:
Сами автоматизации несложные, справится даже новичок. Покажу пример сценария: Ворота открылись → Фото в Telegram → Голосовое предупреждение.
alias: Ворота открываются
description: ""
triggers:
- type: opened
device_id: ID ВАШЕГО ДЕВАЙСА
entity_id: И ТУТ СВОЁ ДОБАВИТЬ
domain: binary_sensor
trigger: device
for:
hours: 0
minutes: 0
seconds: 3
conditions: []
actions:
- action: camera.snapshot
target:
entity_id: camera.192_168_1_162
data:
filename: /config/www/snapshots/door_knock.jpg
- action: telegram_bot.send_photo
data:
verify_ssl: true
config_entry_id: ВАШ ID
file: /config/www/snapshots/door_knock.jpg
caption: Ворота открываются
target:
- "тут кому отправляем"
- "тут ещё один абонент"
parse_mode: html
- action: media_player.volume_set
metadata: {}
data:
volume_level: 0.45
target:
entity_id:
- media_player.esp32_s3_esphome_pcm5102a_media_player
- action: tts.google_translate_say
data:
cache: false
entity_id: media_player.esp32_s3_esphome_pcm5102a_media_player
message: Внимание! Ворота открываются!
- delay:
hours: 0
minutes: 0
seconds: 7
milliseconds: 0
- action: tts.google_translate_say
data:
cache: false
entity_id: media_player.yandex_station_id колонки
message: Внимание! Ворота открываются!
mode: single
Надеюсь, мой опыт сэкономит вам время и вдохновит на эксперименты.
P.S. Отдельное спасибо супруге — именно она подала идею сделать всё это! :)