logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART

p.kaczmarek2 26 Cze 2023 13:53 3060 6
  • Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Przedstawię tu analizę wnętrza oraz krótką inżynierię wsteczną protokołu UART kolejnego ściemniacza Tuya, tym razem opartego o dość nietypowy moduł LMB54 (BK7231N) oraz dwa mikrokontrolery HC32F003. W pełni tutaj opiszę, jak można go zaprogramować i dodać jego wsparcie OpenBeken przy użyciu języka skryptowego oferowanego przez te firmware. Przedstawiony ściemniacz będzie dość nietypowy, ponieważ nie korzysta on z protokołu TuyaMCU tak jak omawiane już wcześniej produkty, tylko z nieco innej, prostszej komunikacji UART, która w tym przypadku jest jednokierunkowa.


    Zakup WXDM2
    Ściemniacz podrzucił mi czytelnik (wraz z zestawem innych gadżetów), abym wgrał do nich OpenBeken, tak jak zresztą pisałem w poprzedniej części. Natomiast sam zakup ściemniacza odbył się na polskim portalu aukcyjnym:
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Ściemniacz kosztował całe 80 zł, to jest dość dużo, ale przynajmniej wspiera on dwie żarówki i dwa włączniki.
    Opis od sprzedawcy:
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Ważna uwaga - w oryginalnym firmware ściemnia się wciskając przycisk, więc preferowany jest przycisk monostabilny:
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Schemat montażowy:
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Ale uwaga, produkt wysyłany ma zamienione miejsca N i L, należy sugerować się oznaczeniami na jego obudowie, to one mają "ostatnie słowo"


    Otrzymany zestaw
    Ten sprzedawca nie daje nawet śrubek mocujących ani taśmy w zestawie...
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART

    Wnętrze WXDM2, wyprowadzenia modułu i analiza PCB
    Wystarczy podważyć pokrywę:
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Części ściemniacza na analizowałem. Widać tu regulator LDO 3.3V, transoptor, MOSFET (7N65C), 8 diod S3M i kontroler przetwornicy PN8016.
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Patrzymy dalej - moduł WiFI nie jest podpisany, to nie WB3S:
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Wylutujmy górne PCB:
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Oto i jest drugi MOSFET, 7N65C... i duży kondensator, ale nie analizowałem jego roli.
    Na spodzie PCB z modułem WiFi, są aż dwa mikrokontrolery HC32F003 - czyżby to był produkt z TuyaMCU? Ale jak to dwa? Jeden na kanał ściemniania?
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Teraz trzeba odlutować ekran z modułu WiFi, by zobaczyć co jest w środku.
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    BK7231N! Są szanse na zmianę firmware. Ale gdzie jest RX i TX?
    Odlutujmy zatem moduł WiFi, by sprawdzić jego opis wyprowadzeń.
    Gorące powietrze jest tu wręcz niezbędne.
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART

    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Ostatecznie opracowałem szkic:
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Wyjaśnienia:
    - 3.3V i GND to wiadomo, zasilanie
    - S1 i S2 to wejścia przycisków, one są podłączone do modułu WiFi
    - RX i TX od modułu WiFi jest wyprowadzone na zewnątrz
    - TX od modułu WiFi idzie do obu HC32F003
    - R1 i R2 to wyjścia do ściemniaczy, każdy obsługuje jeden HC32F003
    - ZC to wykrycie zera by ściemniacz wiedział kiedy zacząć przewodzić (podłączone jest przez tranzystor, do obu HC)
    Spróbowałem podsłuchać również komunikację UART. Tylko na TX od układu WiFi coś się dzieje.
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Zebrane dane jako tekst:
    
    FF 55 01 3F 59 00 00 0A
    FF 55 02 3F 3F 00 00 0A
    FF 55 01 59 3F 00 00 0A 
    FF 55 02 59 59 00 00 0A
    FF 55 01 3F 59 00 00 0A
    FF 55 02 3F 3F 00 00 0A 
    FF 55 01 59 3F 00 00 0A
    FF 55 02 59 59 00 00 0A        
    
    
    
    00
    FF 55 01 FF 00 05 DC 0A
    0A FF 55 02 FF FF 05 DC 0A
    
    00 FF 55 01 FF 00 05 DC 0A FF 55 02 FF FF 05 DC 0A                         
     FF 
    55 01 FF 00 05 DC 0A FF 55 02 FF FF 05 DC 0A    
    

    Bajt 0x55 wygląda jak protokół TuyaMCU, ale TuyaMCU to nie jest.
    0x01 i 0x02 wyglądają jak identyfikatory który ściemniacz nastawiamy.
    Postanowiłem wgrać OpenBeken i sprawdzić, czy jestem w stanie sam wysłać pakiet UART kontrolujący ściemniacz.

    Wgranie firmware i pierwsze próby kontroli
    Szybko się jednak okazało, że cała zabawa z wylutem była zbędna - tak naprawdę tutaj tylko "odzywa się" na UART moduł WiFI, więc można go programować w układzie. Nic nam MCU nie zakłóci. Pady oznaczyłem w poprzednim akapicie. Oto podłączenie programatora:
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART
    Wsad wgrałem poprzez:
    https://github.com/openshwprojects/BK7231GUIFlashTool
    zgodnie z instrukcją na stronie powyżej.
    potem już w OpenBeken korzystałem z komendy uartSendHex aby testować wysyłanie różnych pakietów do ściemniaczy. Chciałem zasymulować działanie oryginalnego firmware. Jest to niezbędne, by te ściemniacze wysterować.
    Po kilku testach doszedłem do wniosku, że następujący pakiet działa:
    
    uartSendHex 0A FF 55 02 00 9F 00 00 0A
    

    A 9F to wartość poziomu jasności, od 0 do 255, jeden bajt. Nie ma tu sumy kontrolnej. Nie wiem czym jest reszta bajtów, za wyjątkiem 0x02, który jest identyfikatorem który z dwóch ściemniaczy na pokładzie kontrolujemy.

    Proof of concept - skrypt testowy
    Mam już podejrzenie, jak to działa. Mogę zatem przygotować prosty skrypt OpenBeken, który w pętli zmienia jasność lampy. Czy skrypt zadziała zgodnie z oczekiwaniami?
    
    again:
    addChannel 10 1 0 255 1
    delay_ms 100
    uartSendHex 0A FF 55 02 00 $CH10$ 00   00 0A
    
    goto again
    

    Skrypt powyżej operuje na kanale 10 OpenBeken. Stopniowo go zwiększa, po osiągnięciu 255 go zapętla od 0. Wartość kanału 10 używana jest jako wartość bajtu w wysyłanym pakiecie.
    Dokumentacja komend OBK:
    https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/commands.md
    Skrypt działa:




    Finalny przykład - pasek i mapowanie jego zmiany na wartość UART
    OpenBeken oferuje możliwość ustawienia typu kanałów, czyli sposobu, w jaki są one wyświetlane. Typ Dimmer256 to pasek ściemniacza o zakresie od 0 do 255, więc jest tutaj jak znalazł. W połączeniu z poniższym skryptem, możemy uzyskać kontrolę ściemniacza na panelu WWW:
    
    addEventHandler OnChannelChange 0 uartSendHex 0A FF 55 02 00 $CH0$ 00   00 0A
    

    W momencie zmiany kanału 0 wysłany zostanie dany komunikat na UART. To wystarczy, by mieć prawdziwą kontrolę nad tym ściemniaczem..
    Rezultat:
    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART





    Podsumowanie
    To był dość nietypowy produkt. Nie spotkałem się wcześniej ze ściemniaczem od Tuya ale bez TuyaMCU, korzystającym zamiast tego z uproszczonego, "jednokierunkowego" protokołu UART (tj. tu tylko moduł WiFi wysyła informacje, nie odbiera nic). Ta "jednokierunkowość" jest jednak dla mnie troszkę uzasadniona dlatego, że w środku są osobne MCU do ściemnienia każdego z kanałów. Oba są podłączone do jednej linii TX1 od BK7231N i tylko wybierają sobie przeznaczone dla nich pakiety po ich zawartości (jeden z bajtów to 0x01 lub 0x02). Ściemniacz już działa w OpenBeken, chociaż można by go usprawnić nieco i np. dodać pamiętanie stanu ściemniacza (na ten moment jest tylko jedna zmienna, więc wyłączenie lampy jest równoznaczne z ustawieniem ściemniacza na 0). To wszystko jest możliwe do wykonania przez skrypty OBK, więc mimo wszystko uznaję już ściemniacz za wspierany a w przyszłości dam osobny temat o wspomnianych już skryptach.

    Fajne? Ranking DIY
    Pomogłem? Kup mi kawę.
    O autorze
    p.kaczmarek2
    Moderator Smart Home
    Offline 
  • #3 20635703
    pedropaislopes
    Poziom 3  
    Cześć! To mój pierwszy post więc proszę o wyrozumiałość...

    Mam podobny moduł. Kupiłem go w sklepie internetowym w moim kraju (Brazylia) za około 20 USD. Wykorzystuje inteligentną aplikację Tuya i obsługuje dwa obwody ściemniacza: L1 i L2. Można nimi sterować niezależnie za pomocą aplikacji i przycisku na ścianie zewnętrznej (S1 i S2). S1 i S2 należy podłączyć do napięcia zmiennego, co jest szczególnie ważne, jeśli moduł ściemniacza jest montowany np. na suficie.

    Tutaj jest parę zdjęć.

    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART

    Otwiera się łatwo z tyłu.

    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART

    Oto piny kontrolera CB3S, które są przylutowane na tylnej zielonej płytce.

    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART

    Ma więc komunikację tylko TX z (innym) kontrolowanym lub chipem, który istnieje z tyłu tej małej zielonej płytki.

    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART

    Z tyłu kontroler to HK32F030MF4P6.

    Główną różnicą, moim zdaniem, jest to, że ten moduł wykorzystuje tylko jeden układ ARM do sterowania ściemniaczem. Moduł Original Post (OP) wykorzystuje dwa układy scalone, po jednym dla każdego obwodu ściemniacza.

    Po pewnym wylutowaniu i wąchaniu protokołu UART doszedłem do tych samych ustaleń, co OP. Wysyłanie na pin TX, z szybkością 9600 8n1, specjalnie zakodowanych ciągów szesnastkowych zmienia ściemniacz. Zasadą jest:

    - 0a ff 55 01_or_02 L1jasność L2jasność Dimmer_ramp Dimmer_ramp 0a

    Wyjaśniono trochę więcej, bajt po bajcie:

    - 0a ff 55: początek wiadomości. Nie mogę znaleźć wyjaśnienia (związanego z TuyaMCU?)
    - 01_or_02: wysłanie 01 zmienia jasność L1. Wysłanie 02 zmienia jasność L2.
    - L1brightness: jasność ściemniacza L1. 00 to jasność 0 (wyłączona, jak rozumiem), FF to jasność 255 (maksymalna jasność)
    - L2brightness: to samo co L1brightness
    - Dimmer_ramp (dwa bajty): oryginalny komunikat mojego modułu to "05 dc", który przedstawia płynną zmianę jasności (około pół sekundy). Zmiana obu na 00 powoduje natychmiastową zmianę jasności. W moich testach nie mogę niezależnie zmienić płynnej zmiany jasności L1 i L2.
    - 0a: ostatni bajt

    Po flashowaniu OpenBEKEN na CB3S, przylutowaniu rzeczy z powrotem, nadszedł czas na konfigurację.

    Kołki CB3S są opisane na poniższym rysunku.

    Podwójny ściemniacz WXDM2 - inżynieria wsteczna - dziwny protokół UART

    Ale zapytałem: czy OpenBEKEN można skonfigurować tak, aby umożliwiał zmianę ściemniacza za pomocą pinów S1 i S2? Oczywiście!

    Oto mój autoexec.bat z komentarzami wyjaśnionymi w prostej linii (tylko dla L1, ponieważ L2 jest bardzo podobny):

    
    // Enabling and setting ntp driver
    startDriver ntp
    ntp_setServer 200.160.0.8
    ntp_timeZoneOfs -3:00
    // TuyaMCU driver that permits sending hex coding on TX pin to communicate with dimmer controller
    startDriver TuyaMCU
    // Clearing any handler that was used on debugging
    clearAllHandlers
    // Starts with both dimmers at 0 brightness (off state)
    uartSendHex 0A FF 55 01 00 00 05 DC 0A
    uartSendHex 0A FF 55 02 00 00 05 DC 0A
    //
    //
    // L1 channels and configurations
    // Dimmer256 has 0 to 255 range
    setChannelType 11 dimmer256
    // Channel 21 will act as a "variable"...
    setChannelType 21 TextField
    // ... initialized with 1.
    setChannel 21 1
    // Channel 21 represents the long press of S1. If S1 is long pressed the brightness will change 15 points. It will increase
    // brightness if channel 21 is 1, and decrease brightness if channel 21 is -1
    // So this way I could mimic the original Tuya firmware behavior.
    //
    // A label for channel 11, that represents L1 brightness state
    SetChannelLabel 11 Espelho_Sala 0
    // Clamping channel 11 to its values. I think that this command is redundant...
    ClampChannel 11 0 255
    // Channel 11 starts with 0, reflecting L1 state (see first uartSendHex above)
    setChannel 11 0
    //
    // Events with S1 (Botton switch that links to L1)
    // If a fast click is captured on PIN 8 (S1 module AC connector), and channel 11 is 0 (off), set its brightness (channel value) to 255 (max)
    // if not, set to 0 (off)
    // BUT, at the same time, changes channel 21 value. If dimmer is switched on, long press on S1 will (of course) decrease brightness.
    // If dimmer is switched off, long press on S1 will (of course) increase.
    addEventHandler OnClick 8 if $CH11==0 then "backlog setChannel 11 255; setChannel 21 -1" else "backlog setChannel 11 0; setChannel 21 1"
    // The OnHold event. Observe that the conditional is based do $CH21.
    addEventHandler OnHold 8 if $CH21==1 then "addChannel 11 15 0 255" else "addChannel 11 -15 0 255"
    // And, after release of a OnHold (long press) event, changes the direction of the next long press.
    addEventHandler OnRelease 8 if $CH21==1 then "setChannel 21 -1" else "setChannel 21 1"
    // Finally sends the hex string to the dimmer controller, based on Channel 11 value
    addEventHandler OnChannelChange 11 uartSendHex 0A FF 55 01 $CH11$ 00 05 DC 0A
    
    // channel 12 links to module L2
    setChannelType 12 dimmer256
    setChannelType 22 TextField
    setChannel 22 1
    SetChannelLabel 12 Espelho_Sala 0
    ClampChannel 12 0 255
    setChannel 12 0
    addEventHandler OnClick 9 if $CH12==0 then "backlog setChannel 12 255; setChannel 22 -1" else "backlog setChannel 12 0; setChannel 22 1"
    addEventHandler OnHold 9 if $CH22==1 then "addChannel 12 15 0 255" else "addChannel 12 -15 0 255"
    addEventHandler OnRelease 9 if $CH22==1 then "setChannel 22 -1" else "setChannel 22 1"
    addEventHandler OnChannelChange 12 uartSendHex 0A FF 55 02 00 $CH12$ 05 DC 0A
    


    Niesamowite, co potrafi OpenBEKEN!!!!!

    Teraz część asystenta domowego, która będzie komunikować się z modułem ściemniacza przez MQTT. W OpenBEKEN tematem klienta MQTT jest DM02.

    
    mqtt:
      light:
        - name: "Espelho Sala"
          # Defines the HASS entity
          unique_id: dm02_espelho_sala
          schema: template
          # Defines light entity online/offline based on the whole module state
          availability_topic: "DM02/connected"
          # State definition. 11 is the channel of L1
          state_topic: "DM02/11/get"
          state_template: '{{ "off" if value | int == 0 else "on" }}'
          # Command to switch on/off
          command_topic: "DM02/11/set"
          # This "brightness" is a variable that reflects the click on the HASS web/app interface light slide
          # But the button bellow this slide should turn ON the light, too. Turn on on maximum brightness.
          command_on_template: "{%- if brightness is defined -%}
            {{ brightness }}
            {%- else -%}
            {{ 255 }}
            {%- endif -%}"
          # Zero brightness is off, as OpenBEKEN configuration
          command_off_template: "0"
          # Brightness value (that comes from the "get" topic)
          brightness_template: "{{value}}"
          # Details of MQTT
          qos: 1
          retain: true
          # We infer state based on brightness so optimistic can be disabled
          optimistic: false
    


    I to działa! Jestem absolutnie podziwiany, jak potężny i prosty jest OpenBEKEN!

    Mam kilka innych pomysłów. Planuję użyć operacji arytmetycznych z kanałem 21 (lub 22, w przypadku ściemniacza L2), aby usunąć niektóre warunki ze Zdarzeń i umieścić na innym kanale (powiedzmy, kanał 31 i 32) wartość kroku jasności dla każdego ściemniacza, więc użytkownik może zmienić swój krok w interfejsie internetowym. I umieść kilka nazw na tych kanałach pomocniczych. Jeśli wdrożę te pomysły, mógłbym wysłać nowy plik autoexec.bat.

    Mam nadzieję, że pomogę komuś z tym wyjaśnieniem, które ma podobny moduł ściemniacza, w taki sam sposób, w jaki pomógł mi oryginalny post.

    I zmieniając ten ostatni moduł ściemniacza na OpenBEKEN, integracja Tuya jest oficjalnie wyłączona w moim Home Assistant! Koniec z zależnością od chmury!

    Dzięki!
  • #4 20635728
    p.kaczmarek2
    Moderator Smart Home
    Dziękuję za głębszy wgląd w to urządzenie. Nie byłem świadomy płynnych danych rampy przejścia zawartych w pakietach UART.

    0a ff 55 wydaje mi się jak „magiczna” stała nagłówka, która jest podobna do tej w TuyaMCU. Może po prostu Tuya lubi używać tej stałej do oznaczania początku swoich pakietów danych.

    Dziwi mnie, że 0a na końcu nie jest sumą kontrolną. Gdybym miał zaprojektować ten protokół, umieściłbym prostą sumę kontrolną w danych pakietowych.

    W każdym razie dobra robota! Dziękuję za szczegółowe uzupełnienie mojej pracy.
    Pomogłem? Kup mi kawę.
  • #5 20680315
    ferbulous
    Poziom 17  
    Cześć, jak naciskasz przycisk na przełączniku chwilowym, jeśli chcesz przyciemnić lub zwiększyć jasność?
    Czy każde długie naciśnięcie przełącza po prostu na ściemnianie i odwrotnie?
  • #6 20680356
    p.kaczmarek2
    Moderator Smart Home
    Witaj @ferbulous , dawno nie miałem do czynienia z tym urządzeniem (robiłem to dla naszego czytelnika) i nie mam już do niego dostępu, przekażę Twoje pytanie, ale o ile pamiętam przycisk jest chwilowy, a przytrzymanie go reguluje jasność.

    Czy jesteś zainteresowany zakupem tego konkretnego urządzenia, biorąc pod uwagę, że teraz OBK może je obsługiwać?
    Pomogłem? Kup mi kawę.
  • #7 20680378
    ferbulous
    Poziom 17  
    Tak, po prostu nie do końca rozumiem, jak go używać z przełącznikiem chwilowym.

    p.kaczmarek2 napisał:
    przycisk jest chwilowy, a przytrzymanie reguluje jasność.

    Rzeczywiście, ale które działanie zwiększa lub zmniejsza jasność, jeśli pamiętasz

    Mam zwykły inteligentny ściemniacz z pokrętłami do regulacji jasności, obracając zgodnie z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara.
REKLAMA