Как я оживил Tuya-мотор штор после сгоревшей CB3S: OpenBeken + Home Assistant + виртуальная штора
Была задача: у мотора штор сгорела Wi-Fi плата CB3S (BK7231N). Родного бэкапа не было, заливка дампа от другого мотора дала конфликт в Tuya (то один подключается, то другой отваливается). В итоге сделал нормальный локальный вариант: OpenBeken + MQTT + Home Assistant, и всё работает без облака.
Что нужно
Плата CB3S / BK7231N
USB-UART (у меня CP2102, питание 3.3V)
Программа BK7231Flasher
Прошивка OpenBeken для BK7231N
Home Assistant + Mosquitto broker
Где взять плату CB3S
Плату Tuya CB3S (BK7231N) можно спокойно купить на AliExpress — я так и сделал: купил заранее “про запас”, и она у меня долго лежала без дела, пока не сгорела родная плата в моторе.
1) Прошиваем CB3S на OpenBeken
Для прошивки CB3S нужен обычный USB-UART, у меня CP2102.
Какие провода нужны




По сути достаточно 4 линий:
GND ↔ GND
3.3V ↔ VCC (только 3.3V!)
TX адаптера ↔ RX на плате
RX адаптера ↔ TX на плате
⚠️ Важно: питание строго 3.3V, 5V подавать нельзя — есть шанс убить модуль.
Как ловится режим прошивки
Обычно BK7231Flasher при старте пишет что-то вроде “перезагрузите устройство / power cycle”.
Так как у меня были выведены только питание + TX/RX, я просто:
снимал питание на секунду
и подавал снова в момент, когда программа ждёт перезапуск.
Полезные советы
Если не коннектится — первым делом поменять местами TX/RX.
Обязательно общий GND между платой и адаптером.
Если модуль перезагружается/глючит — лучше питать от стабильного 3.3V, а не от слабого стабилизатора на UART (зависит от адаптера).
Прошиваем модуль CB3S (BK7231N) через BK7231Flasher.
✅ Важно: в актуальных версиях BK7231Flasher OpenBeken уже встроен (есть готовые образы/прошивки внутри программы), поэтому отдельно искать и скачивать .bin обычно не нужно — выбираем OpenBeken прямо в интерфейсе и шьём.
2) Настраиваем каналы в OpenBeken
Заходим в веб OpenBeken устройства:
Launch Web Application → Config → Channel Types
Ставим:
Channel 0 — Default
Channel 1 — OpenStopClose
Channel 2 — Dimmer
Channel 3 — ReadOnly
Примечание: типы каналов можно задавать и через autoexec.bat (ниже). Я оставил и в UI, и в autoexec — так проще повторить.
3) Создаём autoexec.bat (TuyaMCU + dpID)
Открываем:
FileSystem → Create File → autoexec.bat
Вставляем:
# Инициализация связи с контроллером мотора
startDriver TuyaMCU
baud 9600
# dpID 1: Основное управление (Enum)
# 0 - Открыть, 1 - Стоп, 2 - Закрыть
setChannelType 1 OpenStopClose
linkTuyaMCUOutputToChannel 1 enum 1
# dpID 2: Установка позиции (Value)
# Сюда шлем проценты (0-100)
setChannelType 2 Dimmer
linkTuyaMCUOutputToChannel 2 val 2
# dpID 3: Текущая позиция (Value)
# Мотор сообщает, где он сейчас (0-100)
setChannelType 3 ReadOnly
linkTuyaMCUOutputToChannel 3 val 3
Сохраняем файл и перезагружаем модуль:
Index → Restart (красная кнопка)
После этого в главном меню OpenBeken появится переключатель из трёх позиций (Открыть, Стоп, Закрыть), ползунок (Channel 2) и показ текущей позиции (Channel 3).
4) Настраиваем MQTT в OpenBeken
Config → Configure MQTT
Заполняем данные Mosquitto (IP Home Assistant, логин/пароль). Пароль смотрим в HA:
Mosquitto broker → Configuration / Logins
Ключевое поле:
Client Topic (Base Topic): curtain_1
(Можно назвать иначе, но дальше в коде используйте то же имя.)
После этого в Home Assistant появятся сущности от OpenBeken, но обычно это не “штора”, а отдельные select/сенсоры. Это нормально — исправляем дальше.
5) Делаем “виртуальную штору” (cover) в Home Assistant
Открываем файл:
/config/configuration.yaml
⚠️ Важно: блок template: должен быть один. Если он уже есть — не создавайте второй, добавляйте внутрь существующего.
Вставляем:
template:
..- cover:
....- name: "Штора северная виртуальная"
......unique_id: curtain_virtual
......# Текущая позиция (0-100) берётся из сенсора, ИНВЕРТИРУЕМ
......position: "{{ 100 - (states('sensor.curtain_3') | int(0)) }}"
......open_cover:
........- service: mqtt.publish
..........data:
............topic: "curtain_1/1/set"
............payload: "0"
......stop_cover:
........- service: mqtt.publish
..........data:
............topic: "curtain_1/1/set"
............payload: "1"
......close_cover:
........- service: mqtt.publish
..........data:
............topic: "curtain_1/1/set"
............payload: "2"
......# Ползунок позиции: шлём % в OpenBeken по MQTT на Channel 2
......set_cover_position:
........- service: mqtt.publish
..........data:
............topic: "curtain_1/2/set"
............payload: "{{ 100 - position }}"
............retain: false
............qos: 0
Как читать
.. = 2 пробела
.... = 4 пробела
...... = 6 пробелов
и т.д.
В Home Assistant перед вставкой просто замени все .. на 2 пробела (в любом редакторе: “Найти/заменить”).
Перезагружаем Home Assistant. Появится новая сущность типа:
cover.shtora_virtualnaia (название будет зависеть от твоего имени).
6) Если направление перепутано
Есть три независимых “переворота” — меняем по очереди, не всё сразу:
A) Только отображение (ползунок в HA наоборот)
Инверсия делается строкой position::
без инверсии:
position: "{{ states('sensor.curtain_3') | int(0) }}"
с инверсией (как в примере):
position: "{{ 100 - (states('sensor.curtain_3') | int(0)) }}"
B) Ползунок двигает “не туда”
Меняем payload в set_cover_position:
без инверсии:
payload: "{{ position }}"
с инверсией:
payload: "{{ 100 - position }}"
C) Open/Close перепутаны местами
Поменять местами payload "0" и "2" в open_cover и close_cover.
7) Итог
В итоге:
мотор живёт локально на OpenBeken
управление в HA — как нормальная сущность cover с ползунком и кнопками
можно дальше пробрасывать в Алису, делать сценарии, расписания, датчики и т.д.
Альтернатива: ESP8266/ESPHome
Теоретически (да и в практически), вместо CB3S можно полностью уйти на ESP8266/ESPHome и управлять мотором через свой контроллер. Такой вариант существует, и многие так делают.
Раньше я пробовал сделать всё на ESP8266 + ESPHome, используя компонент TuyaMCU. Но именно с этим мотором нормально не завелось: либо TuyaMCU в ESPHome не смог корректно управлять мотором, либо я так и не понял, какие именно параметры и dpID нужно правильно настроить под протокол этого устройства.
Возможно, дело ещё и в том, что драйвер TuyaMCU в OpenBeken реализован/отлажен удачнее под такие устройства: у меня он сразу нормально подхватил обмен по UART (9600) и корректно заработали и позиция, и команды.
Поэтому изначально я и пошёл по пути “как с завода” — использовал родную CB3S. А когда всё уже завелось на OpenBeken и стало нормально управляться из Home Assistant без облака, я не стал возвращаться к ESP8266: это снова перепайка, отладка протокола и куча времени.
Короче — работает — не трогай 😄


