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

Jak sprawić, by urządzenie TuyaMCU wysyłało więcej danych? Dlaczego dpID nie są wysyłane?

p.kaczmarek2 27 Lis 2024 21:53 2448 4

TL;DR

  • Analiza dotyczy urządzeń TuyaMCU, m.in. Tuya DIN 4P 1-63A i MGF-T3-SMART, które nie wysyłały pełnych dpID do OpenBeken i Home Assistant.
  • Kluczowy trop dał pakiet MCUConf 0x02: jego niezerowa długość oznacza tryb, w którym moduł Wi‑Fi obsługuje sygnalizację i reset, a nie samo MCU.
  • Ładunek 0807 wskazuje P08 jako pin diody/stanu Wi‑Fi oraz 07 jako przycisk parowania; samo tuyaMcu_defWiFiState 4 i cykliczne tuyaMcu_sendQueryState nie pomagały.
  • Ustawienie P08 na AlwaysHigh lub AlwaysLow odblokowało brakujące dpID i pozwoliło uzyskać pełny zestaw danych z MCU.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA
Treść została przetłumaczona angielski » polski Zobacz oryginalną wersję tematu
📢 Słuchaj (AI):
  • Zrzut ekranu przedstawiający komunikację między modułem WiFi a TuyaMCU.
    Ostatnio natknąłem się na ciekawe urządzenie TuyaMCU, które nie wysyłało wszystkich dpID, mimo że ustawiłem stan WiFi 0x04 w autoexec.bat. Śledzenie komunikacji przechwyconej z oryginalnego oprogramowania również nie spowodowało opublikowania dpID. (Dla przypomnienia dpID są to numeryczne identyfikatory przypisane do konkretnych funkcji urządzenia, każdy dpID odpowiada za konkretną funkcjonalność (np. włącznik, jasność, temperatura)). Nie odpowiadał nawet na zapytania o stan TuyaMCU! Okazało się, że przyczyna była zupełnie nieoczekiwana, więc postanowiłem ją tutaj udokumentować. Mam nadzieję, że pomoże to większej liczbie osób uzyskać urządzenie wolne od chmury.

    Podstawowa lektura
    Ten temat jest rozszerzeniem poprzednich tematów dotyczących protokołu TuyaMCU, więc założę tutaj, że czytelnik jest zaznajomiony z podstawami:
    Protokół TuyaMCU - komunikacja pomiędzy mikrokontrolerem a modułem WiFi
    TuyaMCU flashing, setup and configuration guide - konfiguracja dpID dla Home Assistant
    Analizator TuyaMCU - dekoder pakietów UART dla urządzeń Tuya - detektor dpID
    Wyodrębnianie DpID dla urządzeń TUYA MCU
    Jak uzyskać listę typów i wartości dpID dla sflashowanych urządzeń TuyaMCU z OpenBeken

    Urządzenie użyte do demonstracji
    Poniższa demonstracja opiera się na Tuya DIN 4P 1-63A, który został mi podarowany przez czytelnika. Tutaj jednak skupię się tylko na formacie Raw z pakietów TuyaMCU, pełny teardown zostanie opublikowany osobno.
    Urządzenie Tuya DIN 4P 1-63A z funkcjami WiFi na zielonej macie pomiarowej.
    Poniższy problem występuje również na MGF-T3-SMART, który również został mi podesłany przez innego czytelnika:
    Inteligentny miernik energii elektrycznej MGF-T3-SMART z wyświetlaczem LCD i przyciskami sterującymi
    Dziękuję za podesłanie tych urządzeń i pomoc w ich odkryciu!

    REKLAMA



    Przechwytywanie komunikacji początkowej
    Na początku zdecydowałem się użyć mojego analizatora TuyaMCU , aby wykonać podstawowe przechwytywanie komunikacji między MCU a modułem WiFi:
    Zrzut ekranu z analizą komunikacji między modułem WiFi a MCU. .
    Pierwszą interesującą rzeczą jest to, że pakiet WiFi state nie jest w ogóle wysyłany! Dzieje się tak, ponieważ to urządzenie używa czegoś o nazwie Przetwarzanie przez moduł Wi-Fi , na co wskazuje obecność ładunku pakietu 0x02 (MCUConf).
    Cytat:

    Przetwarzanie przez moduł Wi-Fi - piny GPIO modułu Wi-Fi zmieniają stan wskaźnika Wi-Fi (wskaźnik LED). Moduł Wi-Fi jest resetowany w oparciu o wejścia GPIO.
    W trybie przetwarzania przez moduł Wi-Fi, moduł Wi-Fi wyzwala reset, gdy wykryje, że wejście GPIO jest na niskim poziomie przez ponad 5 sekund. Piny GPIO używane przez wskaźnik Wi-Fi i przycisk resetowania Wi-Fi są konfigurowane za pomocą słowa komendy 0x02.

    Ładunek komendy to 0807, co oznacza, że P08 to dioda LED WiFi, a także wyjście stanu WiFi dla MCU, a 07 to przycisk parowania...
    Uwaga: jeśli pakiet 0x02 (MCUConf) nie ma ładunku, to przetwarzanie jest wykonywane przez MCU i wszystko działa po wyjęciu z pudełka, nie są wymagane żadne dodatkowe piny .

    Pierwsza konfiguracja autoexec.bat i wiele problemów .
    Sflashowałem moduł WiFi za pomocą OpenBeken, ustawiłem autoexec.bat z podstawowym skryptem i próbowałem nakłonić TuyaMCU do wysyłania większej ilości danych, jednak wszystkie moje próby kończyły się jak na razie niepowodzeniem. Uderzenia serca były odbierane poprawnie (więc UART baud był OK) i byłem w stanie kontrolować główny przekaźnik i uzyskać kilka odczytów, ale nie więcej niż to:
    Kod: JSON
    Zaloguj się, aby zobaczyć kod
    .
    i nie otrzymałem żadnych dalszych dpID...
    Próbowałem zwykłego podejścia, 0x04 WiFi state, ale wygląda na to, że wspomniane urządzenie w ogóle go nie używa:
    
    // set TuyaMCU default wifi state 0x04, which means "paired",
    // because some TuyaMCU MCUs will not report all data
    // unless they think they are connected to cloud
    tuyaMcu_defWiFiState 4
    
    .
    ani zapytanie nie odpowiedziało z większą ilością danych:
    
    // every 10 seconds, request update from TuyaMCU
    addRepeatingEvent 10 -1 tuyaMcu_sendQueryState
    
    .
    Wszystko do tej pory zawodziło, aż postanowiłem spróbować ustawić pin diody WiFi...

    Proste rozwiązanie problemu .
    Okazało się, że wspomniany już P08 nie służy tylko do obsługi diody WiFi - ma podłączoną diodę, ale umożliwia też wysyłanie kolejnych dpID. Przetestowałem to za pomocą GPIODoctor:

    Zrzut ekranu z interfejsem ustawień dla wyjść P7 i P8 w urządzeniu TuyaMCU. .
    Oznacza to, że MCU jest fizycznie podłączony do tego pinu i odczytuje jego stan...
    Więc po ustawieniu jego stanu na AlwaysHigh (lub AlwaysLow , w zależności od urządzenia):
    Kod: JSON
    Zaloguj się, aby zobaczyć kod
    .
    Teraz wygląda na to, że mamy pełny zestaw danych! Właśnie tego potrzebowaliśmy do dalszego przetwarzania.

    Podsumowanie
    Jeśli urządzenie TuyaMCU zgłasza pakiet MCUConf o niezerowej długości, zgłaszane wartości bajtów to stan WiFi i piny przycisku reset. Pin stanu WiFi jest używany nie tylko do diody LED - jest również używany do umożliwienia wysyłania dalszych identyfikatorów dpID z MCU. Tak więc, aby uzyskać z niego wszystkie wartości, należy ustawić go na AlwaysLow lub AlwaysHigh w ustawieniach OBK. Tylko ten sposób będzie działał dla urządzeń w trybie przetwarzania WiFi, żadne "WiFistate 0x04", ani "odpytywanie stanu" nie będą tutaj działać.

    Załączyłem powiązany dokument TuyaMCU w formacie PDF, możesz go sprawdzić, aby uzyskać więcej szczegółów . Co ciekawe, NIE pokazuje, że MCU odczytuje również stan diody LED...
    Schemat urządzenia z modułem Wi-Fi Tuya i podłączoną czerwoną diodą LED. .
    Więc chyba nie zadali sobie trudu, aby dobrze udokumentować przypadek, który tu opisałem.
    Załączniki:
    • Guide-to-Interworking-with-the-Tuya-MCU.pdf (1.93 MB) Musisz być zalogowany, aby pobrać ten załącznik.

    Fajne? Ranking DIY
    Pomogłem? Kup mi kawę.
    O autorze
    p.kaczmarek2
    Moderator Smart Home
    Offline 
    Inżynier programista z wieloletnim doświadczeniem embedded i full stack developer.
    Specjalizuje się w: embedded, Full-Stack Developer
    p.kaczmarek2 napisał 14687 postów o ocenie 12717, pomógł 656 razy. Jest z nami od 2014 roku.
  • REKLAMA
  • REKLAMA
  • #3 21322921
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14687
    Pomógł: 656
    Ocena: 12717
    Bardzo dobre pytanie! Jak widać na wspomnianym zrzucie, nie ma żadnego pakietu stanu WiFi w wymianie przetwarzania WiFi:
    Zrzut ekranu z analizą komunikacji między modułem WiFi a MCU. .
    Porównaj to z innym zrzutem komunikacji (tylko WiFi do MCU):
    Zrzut ekranu z narzędzia wyświetlającego pakiety komunikacji Tuya w formacie szesnastkowym.

    Jak widać, są dwa przypadki:
    - jeśli MCUConf (0x02) nie ma ładunku, to stan WiFi jest raportowany przez pakiet 0x03
    - jeśli MCUConf (0x02) ma ładunek, to ładunek MCUConf określa piny używane do stanu WiFi i resetowania, a pakiet 0x03 nie jest wysyłany

    Możesz dowiedzieć się tego samego, jeśli sprawdzisz dokumenty Tuya:
    Schemat połączenia modułu Wi-Fi z MCU oraz informacje na temat przetwarzania współpracy.
    Mój jedyny problem polegał na tym, że dokumentacja Tuya nie pokazuje, że MCU odczytuje również stan WiFi (LED) pin, aby sprawdzić, czy może wysłać więcej dpID! .
    Prawidłowy schemat powinien wyglądać następująco:

    Schemat obwodu z modułem Tuya i połączeniami stanów WiFi. .
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #4 21324901
    Samezrp1
    Poziom 13  
    Posty: 90
    Pomógł: 2
    Ocena: 7
    Wrzucam informację z tego wątku.
    Problem: urządzenie nie wysyła danych na MQTT, pomimo ustawienia:
    
    tuyaMcu_defWiFiState 4
    

    Znacznik połączenia WiFi pojawiał się i znikał, urządzenie co ok. 1 minutę nawiązywało połaczenie z WiFi od początku.
    Rozwiązaniem byłu ustawienie drivera obsługi NTP i poprawny czas na urządzeniu poprzed dodanie:
    startDriver NTP
    //ntp_timeZoneOfs 1 //optional
    tuyaMcu_sendCurTime //wysyła czas z TuyaMCU do MCU, bez tego jak zgubił czas to nie uaktualniał
    

    To spowodowało automatyczne ustawienie czasu oraz ustabilizowanie się połączenia WiFi. Efektem ubocznym było pojawienie się transmisji zdefiniowanych w CB3S kanałów z TuyaMCU.
  • #5 21324964
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14687
    Pomógł: 656
    Ocena: 12717
    Wygląda więc na to, że istnieją co najmniej 3 metody używane przez TuyaMCU (wersja bez zasilania bateryjnego) do sprawdzania poprawności połączenia:
    - Pakiet stanu WiFi (0x04 oznacza połączenie z chmurą i sparowanie)
    - Wyjście GPIO (jeśli długość MCUConf wynosi 2?)
    - Dane NTP (domyślam się, że sprawdza poprawność wysłanego tam czasu innego niż 1970?):
    Zrzut ekranu kodu źródłowego w Microsoft Visual Studio dotyczący ustawienia czasu w TuyaMCU.
    Pomogłem? Kup mi kawę.
📢 Słuchaj (AI):
REKLAMA