
Hier ist ein kleines Programm, mit dem man den Inhalt abgehörter Pakete von TuyaMCU analysieren kann. Das Programm zeigt Typ, Länge und Inhalt des Pakets an, aufgeschlüsselt nach dpID-Variablen, deren Typen und Werten. Mit dem Programm kann man schnell herausfinden, was die belauschte dpID enthält – ob es sich beispielsweise um einen Dimmerwert oder beispielsweise einen Relaiszustand oder vielleicht um einen Spannungs- oder Stromwert handelt. Das hier gezeigte Programm ist bei der Freigabe eines bestimmten IoT-Produkts von der Cloud nützlich, da dieser Prozess erfordert, dass wir die verfügbaren dpIDs für ein bestimmtes Produkt ermitteln, da diese dpIDs für verschiedene Produkte unterschiedlich sind.
TuyaMCU ist ein UART-basiertes Protokoll, über das das WiFi-Modul mit einem zusätzlichen Mikrocontroller an Bord des Geräts kommuniziert. Bei Geräten mit TuyaMCU meldet das WiFi-Modul meist nur Daten an das Netzwerk und die MCU selbst unterstützt Relais, Tasten, LCD oder Sensoren und Messsysteme.
TuyaMCU-Paketerfassung
Das Erfassen von TuyaMCU-Paketen ist wirklich sehr einfach. Ein USB-zu-UART-Konverter reicht aus:

Es reicht unser Gerät einfach über USB einzuspeisen (nicht über das Stromnetz! Alles sollte vom Stromnetz getrennt sein ), 5 V von USB vor den 3,3 V-LDO-Regler an Bord anschließen, was ebenfalls stabile 3,3 V füs WiFi-Modul liefert und dann Masse- und Signalleitungen an RX und TX verlöten. Zum Beispiel für WB3S:

Bei Tuya-Modulen wird derselbe UART verwendet, um das Modul über den Bootloader zu programmieren und mit TuyaMCU zu kommunizieren, was manchmal problematisch sein kann. Beim Wechsel der Firmware muss ich in diesem Fall oft das Wi-Fi-Modul auslöten oder die Leiterbahn unterbrechen (und dann neu aufbauen).
UART ist ein bidirektionaler Bus, also erfassen wir zuerst von der TuyaMCU TX-Leitung -> Wi-Fi RX-Modul und dann von der WiFi-Leitung TX-Modul -> TuyaMCU RX.
Die Erfassung ist in RealTerm ganz einfach:

Am besten wählt man Hex mit Leerzeichen (nicht Binär):

Dann sollte man das Schreiben in die Datei aktivieren, damit es bequemer ist:

Schritte bei der Erfassung:
1. Den USB-zu-UART-Konverter an das Gerät anschließen, aber die 5 V von USB noch nicht an die Stromversorgung anschließen (das Gerät nicht einschalten).
2. Die Erfassung starten, zuerst z. B. von der TuyaMCU TX-Leitung -> WiFi RX-Modul
3. Ausgewählte Vorgänge am Gerät ausführen
4. Die Erfassung beebden
5. Die Punkte 1, 2, 3 und 4 wiederhohlen, aber in Punkt 2 eine Verbindung zur WiFi-Leitung des TX-Moduls her -> TuyaMCU RX herstellen
Ich empfehle, für verschiedene Vorgänge separate Paketerfassungen durchzuführen, z. B.:
- separat zum Starten des Gerätes
- separat, z.B. für Dimmerstatusänderungen (Änderungen des Helligkeitswerts)
- separat für Ein/Aus
- separat für andere Einstellungen (falls vorhanden), z. B. bei Geräten mit Energiemessung lohnt es sich, für verschiedene Spannungen eine separate Erfassung vorzunehmen und diese Spannungen zu speichern, dann kann man auf dieser Basis Pakete vergleichen und schauen, wo der Spannungswert gespeichert wird usw. Das Gleiche gilt für die Leistung – die Erfassung bei der Messung der Last 30 W und dann 100 W usw. durchführen.
Mit zwei USB-zu-UART-Konvertern könnte es verbessert werden, aber es wäre auch schön, eine Software zu haben, die die Kommunikation von zwei COM-Ports gleichzeitig speichert.
TuyaMCU-Analysator
Das Programm kann bereits kompiliert von Github heruntergeladen werden:
https://github.com/openshwprojects/TuyaMCUAnalyzer
Nach dem Starten des Programms haben wir bereits ein Beispielpaket eingegeben:

Im Feld Raw packets data können wir die Aufzeichnung der Hex-Pakete einfügen, die beispielsweise von Realterm erfasst wurden. Das System erlaubt Leerzeichen und Übergänge zur nächsten Zeile zwischen Hex-Codes, dies dient der Verbesserung der Lesbarkeit.
Das Feld Tuya packets display zeigt jedes Paket zweimal an – zuerst werden seine Bytes in ihre Rollen unterteilt und gefärbt, und darunter werden ihre Rollen und Interpretationen aufgelistet.
Darüber hinaus enthält der Abschnitt List of automatically detected variable IDs eine Zusammenfassung der erkannten dpIDs zusammen mit ihren erfassten Werten. Dies kann beispielsweise bei der Bestimmung helfen, welcher Wert beispielsweise die Helligkeitsstufe des Dimmers ist, d. h. er hat normalerweise Werte von 0 bis 1000. Andererseits können die Relaiszustände nur 0 oder 1 sein.
Darüber hinaus bietet das Programm eine Reihe von Beispielpaketen an, die aus dem Ordner samples geladen werden. Sie sind in diesem Menü verfügbar:

Die Erweiterung .bin bedeutet eine Binärdatei mit Paketen als Bytes, während .txt eine Textdatei bedeutet, in der die Pakete bereits als Hex-Codes gespeichert sind (bereits in ASCII, human readable).
Darüber hinaus gibt es die Registerkarte Compare tool, ein kleines Tool, mit dem man feststellen kann, was sich in den Paketen geändert hat, wenn wir beispielsweise die Farbe der Lampe geändert haben (z. B. der Miboxer-LED-Streifen-Controller vom TuyaMCU verwendet):

Das Programm behandelt jede Zeile als separates Paket. Wenn das angegebene Byte in jeder Zeile gleich ist, wird es grün hervorgehoben, andernfalls rot.
Ein paar Beispiele
Beispiele sind im Ordner samples enthalten. Hier eine kurze Vorstellung einiger davon.
Dimmer mit TuyaMCU:

Die oben genannten Pakete wurden auf der Leitung Wi-Fi-Modul TX -> TuyaMCU RX abgefangen. Hier in der Zusammenfassung sieht man, dass dpID 1 vom Typ bool die Werte 1 und 0 hat, also den Zustand des Schalters, on oder off. dpID 2 wiederum vom Typ value hat Werte von 0 bis 570, was wahrscheinlich ein Dimmer ist. 570 ist der bei den Tests gemessene Maximalwert, während man daraus erraten kann, dass die volle Helligkeit der Leuchte wie üblich bei 1000 liegt.
Thermometer/Hygrometer/Uhr/Kalender TH06:

Dieser Paketsatz zeigt, wie das Wi-Fi-Modul Zeit von TH06 an die Haupt-MCU sendet. Auf der anderen Seite haben wir durch MCU gesendet:

Die MCU unterstützt Thermometer und Hygrometer und sendet diese Messwerte an das Wi-Fi-Modul. Die Temperatur wird mit 10 multipliziert, da die Werte hier ganze Zahlen sein müssen und der Hersteller bis zu einer Nachkommastelle unterstützen wollte.
Wobei hilft das Programm nicht?
Grundsätzlich gibt es eine Situation, in der dieses Programm nicht helfen kann. Einige der fortschrittlicheren Tuya-Stromzähler (hochpreisige, bereits auf DIN-Schiene, in der Preisklasse von 25 € oder mehr) verwenden TuyaMCU, um Messungen zu melden, melden aber oft eine Gruppe von Messungen in einer dpID. Dann ist eine solche dpID vom Typ Raw (nicht mehr Value) und enthält mehrere Bytes, in denen (je nach Gerät) Daten wie der aktuelle Wert von Spannung, Strom, Leistung und manchmal auch Frequenz gespeichert sind. Ein solches Rohpaket hat ein geräteabhängiges Format und es ist schwierig, es allgemeiner zu dekodieren.
Günstigere Produkte mit Energiemessung nutzen wiederum keinen TuyaMCU, sondern BL0937 oder BL0942 werden dort direkt an das Wi-Fi-Modul angeschlossen.
Anwendung für OpenBeken
Mit diesem Analysator kann man OpenBeken schnell für die Arbeit auf einem Gerät mit TuyaMCU konfigurieren. Hier ist die fertige autoexec.bat aus dem OBK. Diese Skripte ordnen Werte von TuyaMCU (diese dpID) OBK-Variablen zu und ermöglichen die weitere Verarbeitung dieser Werte, legen fest, wie Werte im Webpanel angezeigt werden usw.:
- EDM-01AA-EU-Dimmer
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 ist ein Bool-Typ, es ist der on/off-Zustand des Lichts. dpID 2 ist der Wert, ein Wert von 1 bis 1000 ist der Dimmerpegel.
- QIACHIP Universal Wi-Fi Ceiling Fan Light (Ventilator und Licht)
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
Hier ist dpID 1 bool, es schaltet den Lüfter ein und aus. dpID 9 ist der Zustand des Lichts – on oder off, ebenfalls boolean. dpID 3 ist die Lüftergeschwindigkeit – drei mögliche Werte: 0, 1, 2, low, mid oder high. Als nächstes ist dpID 6 die Einstellung des Timers (Countdown), nach dem sich das Gerät ausschaltet. Dieser Timer unterstützt bereits die MCU. Dann ist dpID 7 die read only Variable, der aktuelle Wert des Countdown-Timers. Es gibt auch dpID 17, das das Tonsignal bei Konfiguration steuert, z. B. über die RF-Fernbedienung (on oder off).
- Konfiguration TH06 Hygrometer/LCD/Kalender
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
Hier ist dpID 2 die Luftfeuchtigkeit und dpID 1 die Temperatur, wobei die Temperatur mit 10 multipliziert wird, da val ein ganzzahliger Typ ist und der Hersteller Werte vom Typ 20,5 Grad übertragen wollte.
- BlitzWolf BW-AF1 Fritteuse
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"
- Energiezähler ATORCH AT4P(WP/BW):
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
Ohne viel Kommentar, aber hier wird deutlich, wie viele verschiedene Variablen verfügbar sein können, normalerweise in der Form multipliziert mit 10 oder 100 (oder sogar 1000), um Zahlen mit einem Dezimalpunkt als ganze Zahlen darzustellen.
Zusammenfassung
Das Programm war schnell geschrieben, erwies sich aber als wirklich sehr nützlich. Dadurch kann ich die erfassten Daten von Tuya-Produkten schnell analysieren, sehen, welche dpIDs verwendet werden und wie ihre Werte aussehen. Auch die Syntaxfärbung (spezifische Bytes) aus dem Paket beschleunigt den gesamten Prozess und erhöht für mich die Lesbarkeit erheblich.
Cool? DIY-Rangliste