MODBUS Stromzähler WE517 und SDM 72 auslesen

  • Moin zusammen,

    ich hatte diese Frage bereits in einem anderen Forum gestellt, wurde dort aber hierher verwiesen. Deshalb soll das mein erster Beitrag werden.


    Ich habe ein Problem mit zwei verschiedene Modbus-Stromzähler, welche ich über Tasmota auslesen möchte. Leider versuche ich mich daran bereits seit ein paar Tagen vergebens.


    Zu meinem Problem: Ich habe einen Orno WE517 und einen Eastron SDM 72M-D, die jeweils über einen WEMOS D1 mini und einen RS485 auf TTL Adapter angeschlossen sind. Verdrahtet sind die wie hier zu sehen: https://github.com/jarcikw/SDM…-&-nodemcu-&-RS485-wiring Nur das ich einen Wemos nutze.


    Der Wemos ist mit einer angepassten Tasmota Version geflasht, die ich mit Gidpod gebaut habe. Dabei habe ich anfangs die häufig dokumentierte SML Variante ohne Erfolg versucht. Danach habe ich gelesen, dass beide Zähler auch direkt unterstützt werden sollten und habe die Zähler direkt in der entsprechenden Config Datei (my_user_config.h -> #define USE_WE517 bzw. #define USE_SDM72 ) aktiviert. -> siehe auch hier: https://www.michael-heck.net/i…-630-mit-tasmota-auslesen


    Stellt man dann in den Tasmota-Einstellungen den TX und RX GPIO ein, erscheint auch die Messwerttabelle im Tasmota. Allerdings sind alle Werte NULL.

    Die TX und RX LEDs auf dem RS485 Board blinken regelmäßig (etwas jede Sekunde). Zuerst leuchtet die TX LED und sofort danach die RX LED.


    Mit dem Oszi konnte ich auch sehen, dass Signale auf dem Wemos TX&RX Pin ankommen.

    Die Daten werden dann per mqtt zum IObroker übertragen werden. Aber auch hier ist natürlich alles NULL.


    Hat jemand einen Tipp für mich? Ich habe schon alle Drähte einmal getauscht, 3,3v und 5v ausprobiert, 120Ohm Abschlusswiderstand eingebaut usw..


    Ich habe bereits das komplette Netz durchforstet, tappe aber noch völlig im Dunkeln.


    Danke Dirk

  • Zur hilfreichsten Antwort springen
  • der Zähler gibt Antwort, also sollte die Baudrate eigentlich stimmen, ebenso die Adresse.

    das Signal kommt auch am RX an wie du mit dem Oszi gecheckt hast.


    jetzt musst du feststellen was da zurückkommt.


    erst mal den SDM72 treiber testen.

    im Modbus Treiber Kommentarstriche weg (TasmotaModbus.cpp)

    //#define TASMOTAMODBUSDEBUG

    und neu kompilieren


    dann debug level more im Tasmota logging GUI einstellen.


    jetzt solltest du Hilfreiche Ausgaben in der Konsole bekommen.


    andere Möglichkeit wäre mit dem PC (Terminalprogramm) die seriellen Daten "mitzulesen"


    falls das nicht weiterhilft, nimm meinen SML Treiber, dort kann ich dir beliebige Debug Möglichkeiten einbauen.

  • Hallo zusammen,

    dank für eure Hinweise, denen ich auf Grund von Zeitmangel leider noch nicht nachgehen konnte.


    Ich habe schon einige Geräte auf Tasmota geflasht, aber musste mir noch nie selbst eine eigene Version erstellen. Deshalb würde ich gerne mal ein paar grundsätzliche Fragen stellen.


    Wie ich inzwischen festellen musste, gibt es viele sehr ähnliche geschriebene Befehle und deshalb würde ich gerne mal weiter vorne anfangen:


    Wie muss ich die Module in der user_config_override.h aufrufen und welche Module benötige ich? Nutze ich #ifdef... oder #ifndef...


    Aktuell sieht meine Ergänzung in der user_config_override.h wie folgt aus (leider noch immer erfolglos):


    #ifndef USE_SDM72
    #define USE_SDM72
    #endif

    #ifndef USE_ENERGY_SENSOR
    #define USE_ENERGY_SENSOR
    #endif

    #ifndef USE_MODBUS_ENERGY
    #define USE_MODBUS_ENERGY
    #endif


    Ist das richtig und brauche ich noch weiter Module?


    Unter den GPIO-Einstellungen kann ich zwischen SDM72 TX / RX und NrgMbs TX / RX wählen. Hier ist vermutlich SDM72 TX / RX zu wählen!?!?


    Sorry für diese Noob-Fragen und Danke für eure Unterstützung.

    Gruß Dirk


    PS: Der Telefonhörer im Display vom SDM72 blink. Da scheint ja kein ganz schlechtes Zeichen zu sein.

  • Du hast anscheinend RX und TX a die Pins 3 und 1 angeschlossen. Das geht selten gut weil dort der usb seriell Konverter parallel geschaltet ist, nimm mal andere Pins dann sollte es gehen.

    Moin,

    genau das scheint es gewesen zu sein!!!


    Ich habe das Ganze noch mal mit einem ESP32 und dem Orno WE517 aufprobiert und auch hier war ich erfolglos. GPIO 1 und 3 (wie in so vielen Anleitungen beschrieben) funktionieren einfach nicht!


    Ich habe jetzt auf GPIO 22 und 23 gewechselt und der Orno zeigt schon mal erste Werte.


    Danke für den Tipp!!! Das scheint es gewesen zu sein. Ich werde es nachher noch mal mit dem SDM72 und einem Wemos D1 mini testen. Hoffentlich klappt das damit auch.


    Wie ich gelesen habe, wird der Orno ab Tasmota32-Version 12.3.1.3 oder 12.3.1.4 direkt unterstützt.


    Für alle, die vor dem gleichen Problem stehen, hier noch ein paar Erkenntnisse:

    • Der RS485 Adapter läuft bei mir nicht mit 3,3V, obwohl er für 3,3 und 5V ausgelegt ist.
    • Den 120 Ohm Widerstand habe ich weggelassen. Scheint ohne zu funktionieren.
    • Das sekündliche Aufblitzen der beiden LEDs (TX / RX) ist noch kein Zeichen das es funktioniert. Wenn Daten übertragen werden, flackern beide LEDs durchgängig.

    Vielen Dank an alle und besonders an gemu. Das war der entscheidende Tipp!


    Gruß Dirk

  • d.j.

    Hat einen Beitrag als hilfreichste Antwort ausgewählt.
  • Hat schon mal jemand versucht die angegebenen und per mqtt übermittelten Daten zu ändern.

    Beim SDM72 sollten die Werte für Spannung und Strom anzeigen, aber beide Werte bleiben bei NULL.

    Auch die Angaben für Energie heute, Engergy gestern und Energy gesamt sind in der Größenordung von 0,002kwh, was ebenfalls keinen Sinn ergibt.


    Beim Orno wäre es ganz schön, wenn die Frequenz mit 2 Nachkommastellen und die 3 Spannungen mit einer Nachkommastelle angezeigt würden. Ohne Nachkommastelle mach das besonders bei der Frequenz wenig Sinn.


    Falls jemand schon mal etwas darüber gelesen hat, wäre ich dankbar für einen Link.

    Gruß Dirk

  • Servus,


    ich habe ein ähnliches Problem mit dem SDM72D-M, aber V2...

    Ich habe einen Wemos D1 mit nem IR um die Schnittstelle vom meinem Hauszähler (Holley) auszulesen. Das klappt wunderbar, über die SML Schnittstelle kann ich alles auslesen was der Zähler hergibt.


    Jetzt wollte ich einen Zwischenzähler, den SDM72D-M V2 auch noch am Wemos anschließen, aber verstehe ein paar Dinge nicht.


    Um es einfacher zu machen, hab ich jetzt erstmal den IR abgeklemmt und den SDM72D-M V2 wie folgt angeklemmt:

    SDM72D-M per Modbus an den RS485 auf TTL Adapter ohne extra Widerstand. A an A und B and B. 3,3V.

    Dann TX an D6 und RX an D8 vom Wemos.


    Softwaretechnisch habe ich in der my_user_config.h diese Funktionen aktiviert und das ganze kompiliert und hochgeladen.

    #define USE_SDM72 // Add support for Eastron SDM72-Modbus energy monitor (+0k3 code)
      #define SDM72_SPEED          9600 // SDM72-Modbus RS485 serial speed (default: 9600 baud)
    #define SDM72_IMPEXP // Show additonal import/export active energy and power in MQTT and Web (+0k5 code)


    In den Einstellung von Tasmota hab ich dann die GPIO Ports entsprechend dem SDM72 TX / RX zugewiesen.


    Restart und alles läuft. Der Telefonhörer ist jetzt aktiv im SDM und die TX/RX Lampen auf dem Adapter blinken wie wild.

    Wenn ich einen Verbraucher an Phase 1 anschließe, dann kommt auch ein Wert.



    Aber der SDM72 V2 bietet ja viel mehr Werte an... ähnlich dem SDM630.

    Wie komme ich jetzt an alle Werte? Aktuell ist aber nur eine Phase angeschlossen.


    Ich übertrage die Werte nach FHEM... dort werden aktuell auch nur die werte aktualisiert, die im Tasmota-Display angezeigt werden.


    Wenn ich bisl im Code vom sdm72.ino nachschauen, dann meine ich dort auch nur diese Werte definiert zu sehen:

    const uint16_t sdm72_register[] {
      0x0034, // 0 SDM72D_POWER [W]
      0x0156, // 3 SDM72D_TOTAL_ACTIVE [kWh]
    #ifdef SDM72_IMPEXP
      0x0500, // 1 SDM72D_IMPORT_POWER [W]
      0x0502, // 2 SDM72D_EXPORT_POWER [W]
      0x0048, // 4 SDM72D_IMPORT_ACTIVE [kWh]
      0x004A // 5 SDM72D_EXPORT_ACTIVE [kWh]
    #endif // SDM72_IMPEXP
    };


    Aber es gibt genug Projekte, die die Version V2 schon integriert haben:

    Hier der Link zu V2 vom SDM72 mit den ModbusRegistern:

    Eastron SDM220M* User Manual (xn--stromzhler-v5a.eu)

    Kann ich die in der sdm72.ino einfach an der gleichen Stelle erweitern?

    Hier das Projekt: SMD_Energy_Meter, die haben scheinbar alle ModbusRegister aller SDMs :

    SDM_Energy_Meter/SDM.h at master · reaper7/SDM_Energy_Meter (github.com)


    Laut Tasmota SML Schnittstelle müsste der SDM72 aber auch über SML auslesbar sein, nur wie? Das kriege ich nicht hin.

    Smart Meter Interface - Tasmota

    Dieses Script scheint alles auszulesen?!

    Ich habe da schon einzeln oder beide Zähler mal eingebaut, aber da kommt nix...


    Also meine Fragen wäre , da meine Verbindung ja scheinbar steht:

    1. Modbus direkt mit dem SDM Modul oder SML Script?

    2. Wie komme ich an alle Werte?

    3. Kann ich an unterschiedlichen GPIOs den IR und den SDM betreiben?


    VG+Danke

    René

  • du kannst problemlos mehrere Zähler mit einem ESP32 mit dem SML Treiber abfragen. bei eine ESP8266 kann es Probleme geben da es nur eine Hardware serielle Schnittstelle gibt. Falls du nur einen Transmit und 2 Receive brauchst geht es auch mit einem ESP8266.


    Den Tasmota eigenen SDM72 Treiber kannst du nicht ohne Quelltextänderungen anpassen.


    Ich würde also zunächst einmal den SDM72 Treiber aus den SML Beispielen hernehmen und dabei mit den Hardware Ports 1 und 3 arbeiten.


    Wenn das funktioniert würde ich versuchen den Holley mit einer Software Serial dazu zunehmen.


    Falls der Holley aber auch einen Transmit braucht musst du auf ESP32 umstellen.

  • Servus,


    ich hab es geschafft, mein Problem konnte ich lösen und ich brauchte dafür gar keinen SDM72 Modul.

    Ich habe jetzt ganz normal nur SML aktiviert und folgende Zähler "als" Script eingebunden:

    bisl gekürzt:

    Mein Problem war, das ich bei dem Weg über das SDM72 Modul ja einen Sender und Empfänger GPIO angeben musste.

    Als ich die SML Doku zu MODBUS-Konfig nochmal genauer gelesen hatte, viel es mir auf einmal auf...

    Code
    +2,15,mN1,0,9600,WP,26,1,

    die 2. Stelle ist ja der READ-GPIO, aber die 7. Stelle ist der SEND-GPIO, den hatte ich nie angepasst und einfach "kopiert".


    Jetzt kann ich nur über SML den IR auslesen und ebenfalls die Modbusschnittstelle nuzten...



    BZW: Sollte ich weitere Zwischenzähler benötigen, dann kann ich die ja auf den gleichen Modbus hängen und mit auslesen? Aber die würden ja die selben Modbusregister beschreiben?

    Halt stop, man gibt ja in den SDM Zählern eine Modubus ID mit....

    <strong>01</strong> = Modbus slave device ID

    Dann wäre der zweite SDM Zähler ja sicherlich 02040000 ... oder ?


    VG

    René


    PS: Ich hatte schon angefangen die xnrg_18_sdm72.ino umzuschreiben, aber da ich da nicht so fit bin, konnte ich zwar Werte ändern, aber nicht erweitern.

    Das hatte auch funktioniert, aber wie gesagt, man hätte irgendwie das Array erweitern müssen.

  • Zuerst vielen Dank für Eure Beiträge, die wirklich informativ und hilfreich sind.

    An einer Stelle klemmt es bei mir, vielleicht weiß jemand eine Lösung.

    Mein ESP8266 ist mit Tasmota mit


    Code
    #ifndef USE_SCRIPT
    #define USE_SCRIPT
    #endif
    #ifndef USE_SML_M
    #define USE_SML_M
    #endif
    #ifdef USE_RULES
    #undef USE_RULES
    #endif

    geflasht. Angeschlossen ist ein SMD72DM, Dazwischen ein RS485-Konverter. Ich kann auf die Console und kann Skripte erstellen.


    Das folgende Skript (zum Testen nur Spannung):

    Code
    >D
    >B
    ->sensor53 r
    >M 1
    +1,14,m,0,9600,SDM72D,12,1,01040000
    1,010404ffffffff@i0:1,Voltage P1,V,voltage_phase1,2
    #


    Hier die der Dump (Auszug):

    Code
    09:26:37.500 > 01 04 00 00 00 02 71 cb 
    09:26:37.555 : fe 01 04 04 43 64 8f d4 cb b0 
    09:26:37.606 > 01 04 00 00 00 02 71 cb 
    09:26:37.661 : fe 01 04 04 43 64 8f d4 cb b0 
    09:26:37.712 > 01 04 00 00 00 02 71 cb 
    09:26:37.766 : fe 01 04 04 43 64 8f d4 cb b0 

    Ich verstehe das so, dass mit

    Code
    > 01 04 00 00 00 02

    der Spannungs-Wert angefordert wird. Als Ergebnis kommt

    Code
    fe 01 04 04 43 64 8f d4 cb b0

    wovon 43 64 8f d4 dem Wert 228.49995 entsprechen. Oder?


    Dummerweise kann Tasmota das anscheinend nicht richtig verarbeiten. Ich bekomme auf der Tasmota-Weboberfläche 0 V angezeigt, die entsprechende MQTT-Meldung ist daher immer

    tele/tasmota_022F0C/SENSOR = {"Time":"2023-08-23T09:24:44","SDM72D":{"voltage_phase1":0.00}}.


    Ich bin mit meinem Latein am Ende.

    * Habe es mit einem ESP32 versucht,

    * einem 8266,

    * habe verschiedene Ports ausprobiert und nutze die

    * aktuelle Version 13.1.0.

    * Auch die 12.4-Version habe ich nach Hinweisen in dem Forum ausprobiert - ohne Erfolg.


    Ich habe auch die Tasmota Sensor-Variante ausprobiert mit SDM630 (die Pins als RX/TX deklariert. Dieser Einsatz liefert tatsächlich Werte. Leider kann ich da nicht per Skript rein und die gewünschten Werte für letzten Tag etc. anfordern. Einen Dump kann ich dabei über "sensor53 d1" nicht kriegen, um einen evtl. Unterschied in den Antworten des Smartmeters herauszufinden (Danke für den Hinweis, den ich zuerst hier gefunden habe).


    Bin dankbar für jeden Vorschlag.


    Grüße

    MIchael