Jak ożywiłem silnik karnisza Tuya po spaleniu CB3S: OpenBeken + Home Assistant + wirtualna kurtyna
Miałem problem: płyta Wi-Fi w moim silniku kurtyny (CB3S / BK7231N) spaliła się. Nie miałem oryginalnej kopii zapasowej, a flashowanie zrzutu z innego silnika spowodowało konflikt w Tuya (jedno urządzenie łączy się, podczas gdy drugie spada, a następnie odwrotnie). W końcu zbudowałem odpowiednie rozwiązanie lokalne: OpenBeken + MQTT + Home Assistant i wszystko działa bez chmury.
Czego potrzebujesz
Płytka CB3S / BK7231N
USB-UART (użyłem CP2102, zasilanie 3,3 V)
BK7231Flasher
Oprogramowanie OpenBeken dla BK7231N
Asystent domowy + broker Mosquitto
Skąd wziąć płytę CB3S
Płytkę Tuya CB3S (BK7231N) można łatwo kupić na AliExpress - tak właśnie zrobiłem. Kupiłem jedną заранее "jako zapasową" i siedziała nieużywana przez długi czas, aż oryginalna płytka w silniku się przepaliła.
1) Flash CB3S z OpenBeken
Do flashowania CB3S potrzebny jest zwykły adapter USB-UART (ja użyłem CP2102).
Wymagane przewody
Zasadniczo potrzebne są tylko 4 linie:
GND ↔ GND
3.3V ↔ VCC (tylko 3,3V!)
TX (adapter) ↔ RX (karta)
RX (adapter) ↔ TX (karta)
⚠️ Ważne: zasilanie musi być ściśle 3,3V. NIE podawaj 5V - możesz zabić moduł.
Wejście w tryb flash
Zazwyczaj BK7231Flasher pokazuje coś w stylu "restart urządzenia / cykl zasilania".
Ponieważ miałem dostępne tylko zasilanie + TX/RX, po prostu:
odłączyłem zasilanie na sekundę
i ponownie podłączyłem zasilanie, gdy program czekał na ponowne uruchomienie.
Wskazówki
Jeśli nie chce się połączyć, najpierw zamień TX/RX.
Upewnij się, że adapter i płyta mają wspólne GND.
Jeśli moduł ciągle się restartuje, użyj stabilnego zasilania 3,3 V, a nie słabego regulatora 3,3 V w niektórych adapterach UART (zależy to od adaptera).
Flashuj moduł CB3S (BK7231N) za pomocą BK7231Flasher.
ważne: w najnowszych wersjach BK7231Flasher, OpenBeken jest wbudowany (są gotowe obrazy/firmware wewnątrz programu), więc zazwyczaj nie trzeba szukać i pobierać oddzielnego pliku .bin - wystarczy wybrać OpenBeken w interfejsie użytkownika i flashować.
2) Konfiguracja kanałów w OpenBeken
Otwórz interfejs użytkownika urządzenia:
Launch Web Application → Config → Channel Types
Ustaw:
Kanał 0 - Domyślny
Kanał 1 - OpenStopClose
Kanał 2 - Ściemniacz
Kanał 3 - Tylko do odczytu
Uwaga: można również ustawić typy kanałów poprzez autoexec.bat (poniżej). Pozostawiłem to zarówno w interfejsie użytkownika, jak i w autoexec - łatwiejsze do odtworzenia.
3) Utwórz autoexec.bat (TuyaMCU + dpID)
Otwórz:
FileSystem → Create File → autoexec.bat
Wklej:
# Inicjalizacja komunikacji ze sterownikiem silnika
startDriver TuyaMCU
baud 9600
# dpID 1: Sterowanie główne (Enum)
# 0 - Open, 1 - Stop, 2 - Close
setChannelType 1 OpenStopClose
linkTuyaMCUOutputToChannel 1 enum 1
# dpID 2: Ustaw pozycję (wartość)
# Wyślij tutaj wartość procentową (0-100)
setChannelType 2 Dimmer
linkTuyaMCUOutputToChannel 2 val 2
# dpID 3: Aktualna pozycja (wartość)
# Silnik zgłasza swoją aktualną pozycję (0-100)
setChannelType 3 Tylko do odczytu
linkTuyaMCUOutputToChannel 3 val 3
Zapisz plik i uruchom ponownie moduł:
Index → Restart (czerwony przycisk)
Następnie w menu głównym OpenBeken powinieneś zobaczyć 3-pozycyjny kontroler (Otwórz/Zatrzymaj/Zamknij), suwak (Kanał 2) i wyświetlacz aktualnej pozycji (Kanał 3).
4) Konfiguracja MQTT w OpenBeken
Config → Configure MQTT
Wypełnij dane Mosquitto (IP Home Assistant, nazwa użytkownika/hasło). Ty może znaleźć hasło w HA:
Mosquitto broker → Konfiguracja / Loginy
Pole klucza:
Temat klienta (Temat bazowy): curtain_1
(Możesz nadać mu inną nazwę, ale użyj tej samej nazwy w dalszej części kodu)
Następnie Home Assistant utworzy encje z OpenBeken, ale zwykle nie jest to jeszcze "osłona kurtyny" - tylko oddzielne selektory / czujniki. W porządku - naprawimy to w następnej kolejności.
5) Utwórz "wirtualną zasłonę" (osłonę) w Home Assistant
Otwórz:
/config/configuration.yaml
⚠️ Ważne: musi istnieć tylko jeden blok template:. Jeśli masz już jeden, nie twórz drugiego - dodaj okładkę wewnątrz istniejącego bloku.
Wklej (jest to wersja sformatowana dla witryn, które łamią wcięcia YAML; zamień .. na spacje później):
template:
..- cover:
....- name: "Kurtyna północna (wirtualna)"
......unique_id: curtain_virtual
......# Bieżąca pozycja (0-100) z czujnika, odwrócona
......position: "{{ 100 - (states('sensor.curtain_3') | int(0)) }}"
......open_cover:
........- usługa: mqtt.publish
..........data:
............topic: "curtain_1/1/set"
............payload: "0"
......stop_cover:
........- usługa: mqtt.publish
..........data:
............topic: "curtain_1/1/set"
............payload: "1"
......close_cover:
........- usługa: mqtt.publish
..........data:
............topic: "curtain_1/1/set"
............payload: "2"
......# Suwak pozycji: wyślij % do OpenBeken przez MQTT do kanału 2
......set_cover_position:
........- usługa: mqtt.publish
..........data:
............topic: "curtain_1/2/set"
............payload: "{{ 100 - position }}"
............retain: false
............qos: 0
Jak czytać:
.. = 2 spacje
.... = 4 spacje
...... = 6 spacji
i tak dalej.
Przed wklejeniem do Home Assistant, po prostu zamień każde .. na dwie normalne spacje (Znajdź/Zamień w dowolnym edytorze).
Uruchom ponownie Home Assistant. Pojawi się nowa jednostka, np:
cover.north_curtain_virtual (dokładna nazwa zależy od wybranej nazwy).
6) Jeśli kierunek jest odwrócony
Istnieją trzy niezależne "inwersje" - zmieniaj je po kolei (nie zmieniaj wszystkiego naraz):
A) Tylko kierunek wyświetlania (odwrócony suwak HA)
Inwersja jest wykonywana w pozycji::
Brak inwersji:
position: "{{ states('sensor.curtain_3') | int(0) }}"
Odwrócone (jak w przykładzie):
position: "{{ 100 - (states('sensor.curtain_3') | int(0)) }}"
B) Suwak przesuwa kurtynę w niewłaściwą stronę
Zmień ładunek w set_cover_position:
Brak inwersji:
payload: "{{ position }}"
Odwrócone:
payload: "{{ 100 - position }}"
C) Zamiana otwarcia/zamknięcia
Zamiana ładunku "0" i "2" w open_cover i close_cover.
7) Wynik
Na koniec:
silnik działa lokalnie na OpenBeken
sterowanie w HA jest właściwą jednostką pokrywy z suwakiem + przyciskami
możesz później wystawić go na Yandex Alice, budować automatyzacje, harmonogramy, czujniki itp.
Alternatywa: ESP8266 / ESPHome
Teoretycznie (i w praktyce) zamiast CB3S można w pełni przejść na ESP8266/ESPHome i sterować silnikiem za pomocą własnego kontrolera. Taka opcja istnieje i wiele osób ją stosuje.
Próbowałem wcześniej ESP8266 + ESPHome z komponentem TuyaMCU. Ale z tym konkretnym silnikiem nie działało to poprawnie: albo TuyaMCU w ESPHome nie mógł poprawnie sterować silnikiem, albo nie mogłem dowiedzieć się, które parametry i dpID są wymagane dla protokołu tego urządzenia.
Możliwe jest również, że sterownik TuyaMCU w OpenBeken jest lepiej zaimplementowany / dostrojony do takich urządzeń: natychmiast odebrał komunikację UART (9600) i zarówno raportowanie pozycji, jak i polecenia działały poprawnie.
Dlatego początkowo wybrałem drogę "najbliższą fabryce" - używając oryginalnego CB3S. A kiedy już działał na OpenBeken i można było nim sterować z Home Assistant bez chmury, nie wróciłem do ESP8266: oznaczałoby to więcej lutowania, debugowania protokołów i czasu.
W skrócie: jeśli działa - nie ruszaj go 😄
Miałem problem: płyta Wi-Fi w moim silniku kurtyny (CB3S / BK7231N) spaliła się. Nie miałem oryginalnej kopii zapasowej, a flashowanie zrzutu z innego silnika spowodowało konflikt w Tuya (jedno urządzenie łączy się, podczas gdy drugie spada, a następnie odwrotnie). W końcu zbudowałem odpowiednie rozwiązanie lokalne: OpenBeken + MQTT + Home Assistant i wszystko działa bez chmury.
Czego potrzebujesz
Płytka CB3S / BK7231N
USB-UART (użyłem CP2102, zasilanie 3,3 V)
BK7231Flasher
Oprogramowanie OpenBeken dla BK7231N
Asystent domowy + broker Mosquitto
Skąd wziąć płytę CB3S
Płytkę Tuya CB3S (BK7231N) można łatwo kupić na AliExpress - tak właśnie zrobiłem. Kupiłem jedną заранее "jako zapasową" i siedziała nieużywana przez długi czas, aż oryginalna płytka w silniku się przepaliła.
1) Flash CB3S z OpenBeken
Do flashowania CB3S potrzebny jest zwykły adapter USB-UART (ja użyłem CP2102).
Wymagane przewody
Zasadniczo potrzebne są tylko 4 linie:
GND ↔ GND
3.3V ↔ VCC (tylko 3,3V!)
TX (adapter) ↔ RX (karta)
RX (adapter) ↔ TX (karta)
⚠️ Ważne: zasilanie musi być ściśle 3,3V. NIE podawaj 5V - możesz zabić moduł.
Wejście w tryb flash
Zazwyczaj BK7231Flasher pokazuje coś w stylu "restart urządzenia / cykl zasilania".
Ponieważ miałem dostępne tylko zasilanie + TX/RX, po prostu:
odłączyłem zasilanie na sekundę
i ponownie podłączyłem zasilanie, gdy program czekał na ponowne uruchomienie.
Wskazówki
Jeśli nie chce się połączyć, najpierw zamień TX/RX.
Upewnij się, że adapter i płyta mają wspólne GND.
Jeśli moduł ciągle się restartuje, użyj stabilnego zasilania 3,3 V, a nie słabego regulatora 3,3 V w niektórych adapterach UART (zależy to od adaptera).
Flashuj moduł CB3S (BK7231N) za pomocą BK7231Flasher.
ważne: w najnowszych wersjach BK7231Flasher, OpenBeken jest wbudowany (są gotowe obrazy/firmware wewnątrz programu), więc zazwyczaj nie trzeba szukać i pobierać oddzielnego pliku .bin - wystarczy wybrać OpenBeken w interfejsie użytkownika i flashować.
2) Konfiguracja kanałów w OpenBeken
Otwórz interfejs użytkownika urządzenia:
Launch Web Application → Config → Channel Types
Ustaw:
Kanał 0 - Domyślny
Kanał 1 - OpenStopClose
Kanał 2 - Ściemniacz
Kanał 3 - Tylko do odczytu
Uwaga: można również ustawić typy kanałów poprzez autoexec.bat (poniżej). Pozostawiłem to zarówno w interfejsie użytkownika, jak i w autoexec - łatwiejsze do odtworzenia.
3) Utwórz autoexec.bat (TuyaMCU + dpID)
Otwórz:
FileSystem → Create File → autoexec.bat
Wklej:
# Inicjalizacja komunikacji ze sterownikiem silnika
startDriver TuyaMCU
baud 9600
# dpID 1: Sterowanie główne (Enum)
# 0 - Open, 1 - Stop, 2 - Close
setChannelType 1 OpenStopClose
linkTuyaMCUOutputToChannel 1 enum 1
# dpID 2: Ustaw pozycję (wartość)
# Wyślij tutaj wartość procentową (0-100)
setChannelType 2 Dimmer
linkTuyaMCUOutputToChannel 2 val 2
# dpID 3: Aktualna pozycja (wartość)
# Silnik zgłasza swoją aktualną pozycję (0-100)
setChannelType 3 Tylko do odczytu
linkTuyaMCUOutputToChannel 3 val 3
Zapisz plik i uruchom ponownie moduł:
Index → Restart (czerwony przycisk)
Następnie w menu głównym OpenBeken powinieneś zobaczyć 3-pozycyjny kontroler (Otwórz/Zatrzymaj/Zamknij), suwak (Kanał 2) i wyświetlacz aktualnej pozycji (Kanał 3).
4) Konfiguracja MQTT w OpenBeken
Config → Configure MQTT
Wypełnij dane Mosquitto (IP Home Assistant, nazwa użytkownika/hasło). Ty może znaleźć hasło w HA:
Mosquitto broker → Konfiguracja / Loginy
Pole klucza:
Temat klienta (Temat bazowy): curtain_1
(Możesz nadać mu inną nazwę, ale użyj tej samej nazwy w dalszej części kodu)
Następnie Home Assistant utworzy encje z OpenBeken, ale zwykle nie jest to jeszcze "osłona kurtyny" - tylko oddzielne selektory / czujniki. W porządku - naprawimy to w następnej kolejności.
5) Utwórz "wirtualną zasłonę" (osłonę) w Home Assistant
Otwórz:
/config/configuration.yaml
⚠️ Ważne: musi istnieć tylko jeden blok template:. Jeśli masz już jeden, nie twórz drugiego - dodaj okładkę wewnątrz istniejącego bloku.
Wklej (jest to wersja sformatowana dla witryn, które łamią wcięcia YAML; zamień .. na spacje później):
template:
..- cover:
....- name: "Kurtyna północna (wirtualna)"
......unique_id: curtain_virtual
......# Bieżąca pozycja (0-100) z czujnika, odwrócona
......position: "{{ 100 - (states('sensor.curtain_3') | int(0)) }}"
......open_cover:
........- usługa: mqtt.publish
..........data:
............topic: "curtain_1/1/set"
............payload: "0"
......stop_cover:
........- usługa: mqtt.publish
..........data:
............topic: "curtain_1/1/set"
............payload: "1"
......close_cover:
........- usługa: mqtt.publish
..........data:
............topic: "curtain_1/1/set"
............payload: "2"
......# Suwak pozycji: wyślij % do OpenBeken przez MQTT do kanału 2
......set_cover_position:
........- usługa: mqtt.publish
..........data:
............topic: "curtain_1/2/set"
............payload: "{{ 100 - position }}"
............retain: false
............qos: 0
Jak czytać:
.. = 2 spacje
.... = 4 spacje
...... = 6 spacji
i tak dalej.
Przed wklejeniem do Home Assistant, po prostu zamień każde .. na dwie normalne spacje (Znajdź/Zamień w dowolnym edytorze).
Uruchom ponownie Home Assistant. Pojawi się nowa jednostka, np:
cover.north_curtain_virtual (dokładna nazwa zależy od wybranej nazwy).
6) Jeśli kierunek jest odwrócony
Istnieją trzy niezależne "inwersje" - zmieniaj je po kolei (nie zmieniaj wszystkiego naraz):
A) Tylko kierunek wyświetlania (odwrócony suwak HA)
Inwersja jest wykonywana w pozycji::
Brak inwersji:
position: "{{ states('sensor.curtain_3') | int(0) }}"
Odwrócone (jak w przykładzie):
position: "{{ 100 - (states('sensor.curtain_3') | int(0)) }}"
B) Suwak przesuwa kurtynę w niewłaściwą stronę
Zmień ładunek w set_cover_position:
Brak inwersji:
payload: "{{ position }}"
Odwrócone:
payload: "{{ 100 - position }}"
C) Zamiana otwarcia/zamknięcia
Zamiana ładunku "0" i "2" w open_cover i close_cover.
7) Wynik
Na koniec:
silnik działa lokalnie na OpenBeken
sterowanie w HA jest właściwą jednostką pokrywy z suwakiem + przyciskami
możesz później wystawić go na Yandex Alice, budować automatyzacje, harmonogramy, czujniki itp.
Alternatywa: ESP8266 / ESPHome
Teoretycznie (i w praktyce) zamiast CB3S można w pełni przejść na ESP8266/ESPHome i sterować silnikiem za pomocą własnego kontrolera. Taka opcja istnieje i wiele osób ją stosuje.
Próbowałem wcześniej ESP8266 + ESPHome z komponentem TuyaMCU. Ale z tym konkretnym silnikiem nie działało to poprawnie: albo TuyaMCU w ESPHome nie mógł poprawnie sterować silnikiem, albo nie mogłem dowiedzieć się, które parametry i dpID są wymagane dla protokołu tego urządzenia.
Możliwe jest również, że sterownik TuyaMCU w OpenBeken jest lepiej zaimplementowany / dostrojony do takich urządzeń: natychmiast odebrał komunikację UART (9600) i zarówno raportowanie pozycji, jak i polecenia działały poprawnie.
Dlatego początkowo wybrałem drogę "najbliższą fabryce" - używając oryginalnego CB3S. A kiedy już działał na OpenBeken i można było nim sterować z Home Assistant bez chmury, nie wróciłem do ESP8266: oznaczałoby to więcej lutowania, debugowania protokołów i czasu.
W skrócie: jeśli działa - nie ruszaj go 😄