Elektroda.de
Elektroda.de
X

TuyaMCU-Analysator – UART-Paketdecoder für Tuya-Geräte – dpID-Detektor

p.kaczmarek2 330 0
  • TuyaMCU-Analysator – UART-Paketdecoder für Tuya-Geräte – dpID-Detektor
    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:
    TuyaMCU-Analysator – UART-Paketdecoder für Tuya-Geräte – dpID-Detektor
    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:
    TuyaMCU-Analysator – UART-Paketdecoder für Tuya-Geräte – dpID-Detektor
    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:
    TuyaMCU-Analysator – UART-Paketdecoder für Tuya-Geräte – dpID-Detektor
    Am besten wählt man Hex mit Leerzeichen (nicht Binär):
    TuyaMCU-Analysator – UART-Paketdecoder für Tuya-Geräte – dpID-Detektor
    Dann sollte man das Schreiben in die Datei aktivieren, damit es bequemer ist:
    TuyaMCU-Analysator – UART-Paketdecoder für Tuya-Geräte – dpID-Detektor
    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:
    TuyaMCU-Analysator – UART-Paketdecoder für Tuya-Geräte – dpID-Detektor
    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:
    TuyaMCU-Analysator – UART-Paketdecoder für Tuya-Geräte – dpID-Detektor
    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):
    TuyaMCU-Analysator – UART-Paketdecoder für Tuya-Geräte – dpID-Detektor
    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:
    TuyaMCU-Analysator – UART-Paketdecoder für Tuya-Geräte – dpID-Detektor
    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:
    TuyaMCU-Analysator – UART-Paketdecoder für Tuya-Geräte – dpID-Detektor
    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:
    TuyaMCU-Analysator – UART-Paketdecoder für Tuya-Geräte – dpID-Detektor
    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 Frit­teu­se
    
    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
    Über den Autor
    p.kaczmarek2
    Moderator Smart Home
    Offline 
    p.kaczmarek2 hat 5777 Beiträge geschrieben mit der Bewertung 5783, und dabei 272 Mal geholfen. Er ist seit 2014 bei uns.