Умный дом на Home Assistant и 3D печать.
 
Telegram-канал FoxJoy
Почта: dm@foxfoy.ru
Автоматизация роллетных ворот на DoorHan

Автоматизация роллетных ворот на DoorHan

Умные ворота на 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"};
      }


Магия автоматизаций

Теперь, когда ворота «в сети», можно творить чудеса. Вот что у меня работает:

  • Управление из HA: Кнопки в интерфейсе или на дашборде.
  • Голос: Открытие/закрытие через Яндекс.Станцию с Алисой.
  • Безопасность: Если ворота открываются — камера делает снимок, фото летит в Telegram с подписью «Ворота открываются», плюс голосовое оповещение в колонки.
  • Свет: Если вечер (после заката + 10 мин) и ворота открылись — включается освещение под навесом на 5 минут.

Сами автоматизации несложные, справится даже новичок. Покажу пример сценария: Ворота открылись → Фото в 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. Отдельное спасибо супруге — именно она подала идею сделать всё это! :)