Oto mały program pozwalający przeanalizować zawartość podsłuchanych pakietów TuyaMCU. Program pokazuje typ, długość oraz zawartość pakietu, z podziałem na dpID zmiennych, ich typy oraz wartości. Program pozwala szybko zorientować się co zawierają podsłuchane przez nas dpID - czy np. jest to wartość ściemniacza, czy też np. stan przekaźnika, a może czy jest to wartość napięcia bądź prądu. Pokazany tu program jest przydatny w procesie uwalniania danego produktu IoT od chmury, gdyż ten proces wymaga od nas określenia dostępnych dpID dla danego produktu, gdyż te dpID są różne dla różnych produktów.
Powiązane tematy
TuyaMCU jest to protokół oparty o UART, poprzez który komunikuje się moduł WiFi z dodatkowym mikrokontrolerem na pokładzie urządzenia. W przypadku urządzeń z TuyaMCU moduł WiFi z reguły tylko raportuje dane do sieci, a to sam MCU obsługuje przekaźniki, przyciski, czy tam LCD bądź czujniki i układy pomiarowe.
Po więcej szczegółów zapraszam do tematu o samym TuyaMCU: Protokół TuyaMCU - komunikacja pomiędzy mikrokontrolerem a modułem WiFi
Oprócz tego warto zobaczyć przykładowe urządzenia korzystające z TuyaMCU:
- Włącznik/ściemniacz WF-DS01 SmartLife/Tuya WiFi do puszki - schemat
- Ściemniacz EDM-01AA-EU 300W na BK7231 i TuyaMCU - konfiguracja
- HomeMate Wi-Fi + Bluetooth Smart 4 Gang Touch Switch
- Tuya ATORCH AT4P(WP/BW) Smartlife Energy monitor (BK7231N) (C3BS) (CH573F) (BL0924)
- QIACHIP Universal WIFI Ceiling Fan Light Remote Control Kit - BK7231N - CB2S
- Energooszczędny (?) bateryjny sensor otwarcia drzwi/okna na WiFi DS06
Przechwytywanie pakietów TuyaMCU
Przechwytywanie pakietów TuyaMCU jest naprawdę bardzo proste. Wystarczy jeden konwerter USB na UART:
Wystarczy zasilić z USB (nie z sieci! wszystko powinno być odłączone od sieci) nasze urządzenie, wpiąć 5V z USB przed regulator LDO 3.3V na pokładzie, co zapewni też stabilne 3.3V dla modułu WiFi, a potem wlutować się z masą i przewodami sygnałowymi na RX i TX. Przykładowo, dla WB3S:
W przypadku modułów Tuya ten sam UART jest używany do programowania modułu poprzez bootloader i do komunikacji z TuyaMCU, co może być czasem problematyczne. Przy zmianie firmware często muszę wylutować moduł WiFI w takim przypadku bądź przerwać ścieżkę (a potem ją zrekonstruować).
UART jest magistralą dwukierunkową, więc najpierw przechwytujemy z linii TuyaMCU TX -> WiFi moduł RX, a potem z linii WiFi moduł TX -> TuyaMCU RX
Przechwytywania łatwo jest dokonać w RealTerm:
Najlepiej jest wybrać format zapisu hex ze spacjami (nie binarny):
Potem należy włączyć zapis do pliku, tak wygodniej:
Kroki przechwytywania:
1. podłącz USB na UART konwerter do urządzenia, ale nie podłączaj jeszcze 5V z USB do jego zasilania (nie włączaj urządzenia)
2. rozpocznij przechwytywanie, najpierw np. z linii TuyaMCU TX -> WiFi moduł RX
3. dokonaj wybranych operacji na urządzeniu
4. zakończ przechwytywanie
5. powtórz punkty 1, 2, 3 i 4, ale w punkcie 2 podłącz się do linii WiFi moduł TX -> TuyaMCU RX
Polecam wykonywać osobne przechwytywania pakietów dla różnych operacji, np:
- osobno dla uruchomienia urządzenia
- osobno np. dla zmian stanu ściemniacza (zmian poziomu jasności)
- osobno dla on/off
- osobno dla innych ustawień (jeśli dostępne), np. w przypadku urządzeń z pomiarem energii warto zrobić osobno przechwytywanie dla różnych napięć i te napięcia zapisać, potem można na bazie tego porównywać pakiety i szukać gdzie wartość napięcia jest zapisana, itd. Tak samo z mocą - zrobić przechwytywanie przy pomiarze obciążenia 30W a potem 100W, itd.
Przy użyciu dwóch konwerterów USB na UART można by to usprawnić, ale przydałby się też soft co zapisuje komunikację z dwóch portów COM na raz.
Analizator TuyaMCU
Program można pobrać z Github, już w skompilowanej formie:
https://github.com/openshwprojects/TuyaMCUAnalyzer
Po uruchomieniu programu mamy już wpisany przykładowy pakiet:
Do pola Raw packets data możemy wkleić zapis hex pakietów przechwycony przez przykładowo Realterm. System dopuszcza stawianie spacji oraz przejść do następnej linii między kodami hex, stosowane jest to w celu zwiększenia czytelności.
Pole Tuya packets display pokazuje każdy pakiet dwukrotnie - najpierw rozbija jego bajty na podział wedle ich roli oraz je koloruje, a poniżej podaje ich role i interpretacje.
Dodatkowo sekcja List of automatically detected variable IDs zawiera podsumowanie wykrytych dpID wraz z ich przechwyconymi wartościami. Może to pomóc np. przy określeniu która wartość jest np. poziomem jasności ściemniacza, czyli z reguły ma wartości od 0 do 1000. Z kolei stany przekaźników mogą być tylko 0 lub 1.
Dodatkowo program oferuje zbiór przykładowych pakietów ładowanych z folderu samples, dostępne są one w tym menu:
Rozszerzenie .bin oznacza plik binarny, z pakietami jako bajty, natomiast .txt oznacza plik jako tekstowy, gdzie pakiety są już zapisane jako kody hex (już w ASCII, human readable).
Oprócz tego jest zakładka Compare tool, która stanowi malutkie narzędzie przydatne przy określaniu co zmieniło się w pakietach gdy np. zmieniliśmy kolor świecenia lampy (np. kontroler paska led Miboxer z TuyaMCU korzysta):
Program traktuje każdą linię jako osobny pakiet. Jeśli dany bajt w każdej linii jest taki sam, to jest on podświetlany na zielono, w przeciwnym razie jest na czerwono.
Kilka przykładów
Przykłady zawarte są w katalogu samples. Oto krótka prezentacja kilku z nich.
Ściemniacz z TuyaMCU:
Powyższy pakiety zostały przechwycone na linii WiFi moduł TX -> TuyaMCU RX. Widać tu w podsumowaniu, że dpID 1 typu bool ma wartości 1 i 0, czyli stan włącznika, on lub off. Z kolei dpID 2, typu value, ma wartości od 0 do 570, czyli pewnie ściemniacz. 570 to maksymalna wartość zanotowana w trakcie testów, natomiast można na bazie tego się domyśleć, że pełna jasność światła to wartość 1000, tak jak zwykle.
Termometr/higrometr/zegar/kalendarzyk TH06:
Ten zbiór pakietów pokazuje w jaki sposób moduł WiFi wysyła czas do głównego MCU z TH06. Z kolei w drugą stronę, nadawane przez MCU mamy:
MCU obsługuje termometr i higrometr, więc to on wysyła do modułu WiFi te pomiary. Temperatura jest pomnożona przez 10, gdyż wartości muszą tu być całkowite, a producent chciał wspierać do jednej cyfry po przecinku.
Z czym program nie pomaga?
Zasadniczo jest jedna sytuacja w której ten program nie może pomóc. Niektóre bardziej zaawansowane mierniki energii elektrycznej Tuya (te z wyższej półki, już na szynę DIN, w przedziale cenowym od 100 zł w górę lub więcej), korzystają z TuyaMCU do raportowania pomiarów, ale często raportują grupę pomiarów w jednym dpID. Wtedy takie dpID jest typu Raw (już nie Value) i zawiera kilkanaście bajtów, w których zapisane są kolejno (w zależności od urządzenia) dane takie jak bieżąca wartość napięcia, prądu, mocy, czasem częstotliwość. Taki pakiet raw ma format już zależny od danego urządzenia i ciężko jest go bardziej uniwersalnie rozkodować.
Tańsze produkty z pomiarem energii z kolei nie korzystają z TuyaMCU, raczej BL0937 bądź BL0942 są tam bezpośrednio podłączone do modułu WiFI.
Zastosowanie dla OpenBeken
Ten analizator pozwala szybko skonfigurować OpenBeken do pracy na urządzeniu z TuyaMCU. Oto gotowe autoexec.bat z OBK. Skrypty te mapują wartości z TuyaMCU (właśnie te dpID) na zmienne OBK i pozwalają dalej te wartości przetwarzać, określają sposób wyświetlania wartości na panelu WWW, itd:
- ściemniacz EDM-01AA-EU
setChannelType 1 toggle
setChannelType 2 dimmer
tuyaMcu_setBaudRate 115200
tuyaMcu_setDimmerRange 1 1000
// linkTuyaMCUOutputToChannel dpId verType tgChannel
linkTuyaMCUOutputToChannel 1 bool 1
linkTuyaMCUOutputToChannel 2 val 2
dpID 1 to typ bool, to jest stan on/off światła. dpID 2 to value, wartość od 1 do 1000, to poziom ściemniacza.
- QIACHIP Universal WIFI Ceiling Fan Light (wentylator i światło)
startDriver TuyaMCU
// let's say that channel 1 is dpid1 - fan on/off
setChannelType 1 toggle
// map dpid1 to channel1, var type 1 (boolean)
linkTuyaMCUOutputToChannel 1 1 1
// let's say that channel 2 is dpid9 - light on/off
setChannelType 2 toggle
// map dpid9 to channel2, var type 1 (boolean)
linkTuyaMCUOutputToChannel 9 1 2
//channel 3 is dpid3 - fan speed
setChannelType 3 LowMidHigh
// map dpid3 to channel3, var type 4 (enum)
linkTuyaMCUOutputToChannel 3 4 3
//dpId 17 = beep on/off
setChannelType 4 toggle
linkTuyaMCUOutputToChannel 17 1 4
//
//
//dpId 6, dataType 4-DP_TYPE_ENUM = set timer
setChannelType 5 TextField
linkTuyaMCUOutputToChannel 6 4 5
//
//
//dpId 7, dataType 2-DP_TYPE_VALUE = timer remaining
setChannelType 6 ReadOnly
linkTuyaMCUOutputToChannel 7 2 6
Tutaj dpID 1 to bool, włącza i wyłącza wentylator. dpID 9 to stan światła - on lub off, też boolean. dpID 3 to szybkość wentylatora - trzy możliwe wartości, 0, 1, 2, wartości low, mid lub high. Dalej dpID 6 to ustawienie timeru (odliczania) po jakim wyłączy się urządzenie, ten timer obsługuje już MCU. Następnie dpID 7 to zmienna read only, bieżąca wartość timera odliczania. Jest jeszcze dpID 17, który kontroluje sygnał dźwiękowy przy konfiguracji np. z pilotu RF (on lub off)
- konfiguracja TH06 higrometr/LCD/kalendarzyk
startDriver TuyaMCU
startDriver NTP
// dpID 1 is tempererature div 10
setChannelType 1 temperature_div10
linkTuyaMCUOutputToChannel 1 val 1
// dpID 2 is % humidity
setChannelType 2 Humidity
linkTuyaMCUOutputToChannel 2 val 2
Tutaj dpID 2 to poziom wilgotności, a dpID 1 to temperatura, przy czym temperatura jest przemnożona przez 10 bo val to typ całkowity a producent chciał przekazywać wartości typu 20.5 stopni
- BlitzWolf BW-AF1 frytkownica:
startDriver TuyaMCU
// cook on/off
setChannelType 1 Toggle
setChannelLabel 1 "Cook"
linkTuyaMCUOutputToChannel 111 bool 1
// power on/off
setChannelLabel 2 "Power"
setChannelType 2 Toggle
linkTuyaMCUOutputToChannel 101 bool 2
// set temperature
setChannelLabel 3 "New Temperature"
setChannelType 3 TextField
linkTuyaMCUOutputToChannel 103 val 3
// currenttemperature
setChannelLabel 4 "Current Temperature"
setChannelType 4 ReadOnly
linkTuyaMCUOutputToChannel 104 val 4
// set time
setChannelLabel 5 "New Time"
setChannelType 5 TextField
linkTuyaMCUOutputToChannel 105 val 5
// read time
setChannelLabel 6 "Current Time"
setChannelType 6 ReadOnly
linkTuyaMCUOutputToChannel 106 val 6
alias cook185c15min backlog setChannel 2 1; setChannel 3 185; setChannel 5 15; setChannel 1 1
alias cook170c30min backlog setChannel 2 1; setChannel 3 170; setChannel 5 30; setChannel 1 1
startDriver httpButtons
setButtonEnabled 0 1
setButtonLabel 0 "Set 185C 15minutes"
setButtonCommand 0 "cook185c15min "
setButtonColor 0 "orange"
setButtonEnabled 1 1
setButtonLabel 1 "Set 170C 30minutes"
setButtonCommand 1 "cook170c30min "
setButtonColor 1 "orange"
O frytkownicy temat jest tutaj:
https://www.elektroda.pl/rtvforum/topic3958909.html#20448156
- ATORCH AT4P(WP/BW) miernik monitor energii:
startDriver TuyaMCU
startDriver NTP
tuyaMcu_setBaudRate 115200
setChannelType 1 toggle
setChannelType 2 Voltage_div10
setChannelType 3 Power
setChannelType 4 Current_div1000
setChannelType 5 Frequency_div100
setChannelType 6 ReadOnly
setChannelType 7 Temperature
setChannelType 8 ReadOnly
setChannelType 9 ReadOnly
//ch 1 (dpid 1) power relay control
linkTuyaMCUOutputToChannel 1 bool 1
//ch 2(dpid 20) voltage
linkTuyaMCUOutputToChannel 20 1 2
//ch 3(dpid 19) power watts
linkTuyaMCUOutputToChannel 19 1 3
//ch 4 (dpid 18)current Amps
linkTuyaMCUOutputToChannel 18 1 4
//ch 5 (dpid (133) frequency
linkTuyaMCUOutputToChannel 133 1 5
//ch 6 (dpid 102) energy cost used
linkTuyaMCUOutputToChannel 102 1 6
// ch 7 (dpid 135) temp
linkTuyaMCUOutputToChannel 135 1 7
//ch 8 (dpid 134) power factor
linkTuyaMCUOutputToChannel 134 raw 8
//ch 9 (dpid 123) energy consumed
linkTuyaMCUOutputToChannel 123 1 9
Już bez większego komentarza, ale tu dobrze widać jak wiele różnych zmiennych moze być dostępnych, zazwyczaj w formie przemnożonej przez 10 lub 100 (a nawet 1000) by przepychać liczby z przecinkiem jako całkowite.
Podsumowanie
Program został napisany na szybko, wręcz "na kolanie" ale okazał się być naprawdę bardzo przydatny. Dzięki niemu mogę szybko przeanalizować przechwycone dane z produktów Tuya, zobaczyć jakie dpID są używane oraz jak wyglądają ich wartości. Kolorowanie składni (konkretnych bajtów) z pakietu również przyśpiesza cały proces, i jak dla mnie bardzo mocno zwiększa ich czytelność.
Fajne? Ranking DIY Pomogłem? Kup mi kawę.