D0 Zähler SML auslesen mit Tasmota

  • Wir sind erheblich weiter gekommen. Kalle kann seinen Venus-E mit Tasmota verbinden und die Meter Werte werden übertragen.

    Wenn jemand testen will, Otello stellt die binaries zur Verfügung und das aktuelle script liegt bei mir auf Github:

    Sonoff-Tasmota/tasmota/scripting/shelly_emu_script.tas at universal · gemu2015/Sonoff-Tasmota
    Tasmota Fork TCS34725,PN532_i2,ccc1101 Moritz support,m5stack 4,7 epaper, bresser 868 Mhz sensors and wether stations, loadable binary drivers -…
    github.com

    man muss natürlich seinen eigenen meter descriptor in >M ersetzen und entsprechend anpassen.

    meine Änderungen an scripter.ino sind noch nicht bei github Tasmota integriert. wenn jemand selbst kompilieren will muss er meinen Fork oder die scripter.ino aus meinem Fork verwenden.

  • Super Arbeit ! Großes Lob an Euch.

    Die Images sind bereits erstellt und liegen hier (ein paar ESP32 Varianten fehlen noch): https://github.com/ottelo9/tasmota-sml-images/releases

    Mein Google Chart Script habe ich auch um die Shelly und Ecotracker Emulation erweitert (Teile aus gemus Script verwendet): https://github.com/ottelo9/tasmota-sml-script

    2_SML_Script_Chart_PV_ShellyEcotracker.tas (nur für ESP32)

    2_SML_Script_Chart_PV_Ecotracker.tas (für ESP8266/ESP32)


    Die Emulation auf meinem ESP01s (ESP8266) lief nicht, der ESP rebootete ständig bzw. war nicht erreichbar. Getestet hatte ich allerdings mit den ganzen anderen Features (z.B. Home Assistant Integration), die ich sonst auch immer mit anbiete. Man könnte natürlich alles soweit reduzieren und ein extra ESP8266 Image nur für SML und Shelly Emulation anbieten (ohne extra Features) und es dann nochmal testen. Oder man lässt es und holt sich einen ESP32-C3 IR Lesekopf wie den Hichi v2, dann ist man für die Zukunft gerüstet und das ganze läuft viel schneller.

    Aus diesem Grund ist die Shelly Emulation nur bei den ESP32 Images mit drin!


    Das Ganze kann ich selbst noch nicht testen. Aber der Marstek Jupiter C Plus ist bereits bestellt und sollte bald ankommen. Mal sehn ob das alles auch damit läuft.

  • Hallo Ottelo,

    vielen Dank für eure tolle Arbeit!
    Würde die Version für esp8266 mit dem abgespeckten Script auf den 1M oder 4 M funktionieren?

    Nur zur Info bei der ESP32 Version steht noch +Berry im Versionshinweiss

  • Danke für den Hinweis Thomas, werde ich korrigieren. Nun zu deiner Frage: Ich konnte mit dem Image nichtmal Tasmota Scripting aktivieren (leeres Script, nur >D war drin), mein ESP hat sich sofort aufgehängt und nach ein paar Minuten war er wieder da, mit deaktiviertem Script. Ich werde mal alle unnötigen Features rausschmeissen und dann nochmal testen, aber dann fehlt halt z.B Home Assistant. Ich denk mal der kleine ESP hat einfach zu wenig RAM.

    Mein Marstek Jupiter C Plus ist heute angekommen. Die App hat den virtuellen Shelly Pro 3EM sofort gefunden und bekommt die Daten :D. Bislang hängt da noch mein SML Simulator (IR-Lesekopf mit SML Simulator Script) dran, der zufällige Leistungswerte an den ESP32-C3 Lesekopf sendet.

  • habe gerade mal die esp8266 Version getestet. Der RAM Verbrauch der Emulation ist hoch so dass wirklich nur das minimale script ohne Graphen funktioniert.

    Ausserdem muss man den scriptbuffer so klein wie möglich einstellen.

    Bei der Kompilation wird er ja mit 8192 vorgegeben. Den muss man mit dem Konsolenbefehl scriptsize 4000 auf 4k einschränken und man muss das script mit dem scripteditor komprimiert übertragen damit es in die 4k passt.

    in dieser Konstellation bleiben 13,7k RAM übrig. das ist schon wenig, sollte aber funktionieren.

    das sollte otello mal mit seinem Akku ausprobieren.


    um dennoch alle Werte von SML verfügbar zu machen hatte ich neulich einige spezielle Befehle implementiert.

    man hat z.B. 9 Zeilen im SML descriptor wie im Beispielscript.

    man definiert nun ein Array mit 9 Elementen in >D

    Code
    >D
    ; lokales array mit 9 Elementen (kein g:)
    M:xsml=0 9
    res=0
    >S
    ; dann kopiert man z.B. jede Sekunde die sml Werte in dieses Array und versendet sie als globales array
    res=acp(xsml sml)
    res=gvrsa(xsml)


    in jedem anderen Tasmota ESP im WLAN hat man jetzt die Daten zur Verfügung und kann die Graphen dort anzeigen.

    Code
    >D
    ; globales array
    g:M:xsml=0 9


    für diese Funktionen braucht man für Sender und Empfänger meine aktuelle scripter Version.

  • Danke für die Info bzgl. ESP8266! Ich habe ein angepasstes Image tasmota1m_shelly_ottelo erstellt und mit deinem Beispielscript getestet. Funktioniert einwandfrei! Natürlich passt mein großes Script mit den Diagrammen nicht mehr hinein.

    Downloads via https://github.com/ottelo9/tasmota-sml-images

    Ich habe alle anderen Features (Home Assistant API) drin lassen können. Es reichte wirklich nur den Scriptspeicher zu reduzieren #define EEP_SCRIPT_SIZE 4096. Siehe auch user_config_override.h.

  • Du weist dass du den Script Speicher seit einer Weile schon per Konsole einstellen kannst ?
    Du kannst mit 8192 kompilieren und den Speicher dann permanent in der Größe anpassen.

    Das Konsolenkommando scriptsize zeigt die momentane Größe an und stellst sie auch ein.

    Beim Einstellen wird sofort neu gestartet und er übernimmt die neue Größe

  • Das wusste ich noch nicht! Danke für die Info.

    Update:

    Die Simulation klappt auch mit einem B2500 Akku. Der Port muss ggf. Nur im Script geändert werden, je nach Firmwarestand:

    Shelly Pro 3EM

    • Uses port 1010 (B2500 firmware up to version 224) and port 2220 (B2500 firmware version 226+)
    • Can be specifically targeted with shellypro3em_old (port 1010) or shellypro3em_new (port 2220)

    Einmal editiert, zuletzt von ottelo (24. Juli 2025 um 17:40)

  • Hallo Gemu,
    ich habe nun die verschiedenen Versionen sowohl auf ESP32 als auch auf 8266. Scheint auch zu laufen.
    Hab noch keinen Akku, meine Frau ist noch dagegen, aber ist halt eine Frage der Zeit.
    Nun möchte ich noch meine Überschussteuerung für meinen Heizer auf den ESP des Heizers umziehen.
    Ich habe deinen Vorschlag oben mit dem Array probiert, leider ohne Erfolg bekomme immer 0.
    ich brauche eigendlich nur den wert power. Kannst du mir da bitte einen Tipp geben wie ich den Wert auf dem
    anderen Tasmota bekomme. Hier mein Versuch.

    >D
    za=0
    g:M:xsml=0 9
    >S
    let za=g:M:xsml[1]
    print za %za%

    >W
    ;web button
    Zaehler %4,0(za)%

  • Thomas

    Hier ist ein Beispiel mit globalen Variablen: https://tasmota.github.io/docs/Scripting…riables-example

    Das Beispiel oben sendet ein ARRAY als globale Variable. Du benötigst ja nur ein Wert. Falls du mein Script verwendest musst du nur eine Variable im Script bei ändern:

    Lesekopf:

    Code
    ; Aktuelle Leistung +/- [W]
    g:power=0

    oder wenn du die gefilterte Leistung global haben willst:

    Code
    g:power2=0

    Im Script, das den Heizer steuern soll, muss du die Variable ebenfalls so deklarieren. Glaube ich jedenfalls. Habe mit globalen Variablen noch nicht gearbeitet.

  • Danke für den Hinweis Thomas, werde ich korrigieren. Nun zu deiner Frage: Ich konnte mit dem Image nichtmal Tasmota Scripting aktivieren (leeres Script, nur >D war drin), mein ESP hat sich sofort aufgehängt und nach ein paar Minuten war er wieder da, mit deaktiviertem Script. Ich werde mal alle unnötigen Features rausschmeissen und dann nochmal testen, aber dann fehlt halt z.B Home Assistant. Ich denk mal der kleine ESP hat einfach zu wenig RAM.

    Mein Marstek Jupiter C Plus ist heute angekommen. Die App hat den virtuellen Shelly Pro 3EM sofort gefunden und bekommt die Daten :D. Bislang hängt da noch mein SML Simulator (IR-Lesekopf mit SML Simulator Script) dran, der zufällige Leistungswerte an den ESP32-C3 Lesekopf sendet.

    Hallo ottelo und gemu2015 ,


    nochmal vielen vielen Dank für den Einsatz und das tolle Stück Software!

    Ich habe meinen Hichi v2 mit der aktuellen V15.0.1 geflasht und es läuft soweit alles rund.

    Nun habe ich diesen mit meinem Venus E als Shelly Pro 3EM verbunden. Das scheint nun auch zu funktionieren.

    ABER:

    Bei der "Referenz der Ausgangsleistung" läuft die Diagnose immer in einen Fehler. Somit funktioniert die Einstellung "Eigenverbrauch" nicht.


    Kann das evtl. an eurer Tasmota-Lösung liegen? Ich möchte erstmal abklären ob noch jemand das Problem hat bevor ich den Marstek-Support bemühe.

  • Mhhh ich hab mein Marstek noch nicht installiert. Hatte alles nur so trocken getestet und hatte die Meldung ebenfalls. Aber ich dachte mir das ist normal weil der ich einen Test Lesekopf mit fester Leistung verwendet hatte (SML Simulator Script).

    Ich glaube der Akku versucht sich einzuregeln und schaut immer auf die Leistung vom Lesekopf. Der Emulator greift im Script auf die Variable power2 zurück, das ist die Leistung gefiltert. Versuche das mal auf power zu ändern, dann wird die ungefilterte Leistung verwendet. Gemu meinte aber dann könnte der Akku anfangen zu schwingen.


    Hast du auf 1Phase in der App gestellt oder 3 Phasen?

  • Hallo, ich hänge mich mal hier an. Ich möchte mir auch bald einen Marstek Venus E zulegen. Ich habe aber folgendes Problem.

    Mein Stromzähler ist ein Elster AS1440. Das ist ein Zweitarifzähler der den Verbrauch wie auch die Einspeisung getrennt anzeigt.

    Ist es damit möglich einen Shelly oder EcoTracker zu emulieren? Der zeigt ja die Einspeisung nicht mit einem "-" an.

    Ich hänge hier mal einen Screenshot und mein Script an.:



    Ich nutze zur Zeit den "power_out" Wert per "status" in OpenDTU-OnBattery um die Einspeisung etwas einzudämmen. Dort lässt sich das "-" ja hinzufügen, so das OpenDTU-OnBattery diesen Wert als Einspeisung erkennt.

    Die Statusabfrage sieht im Momement so aus.:


    bzw.:


    Der Powerwert ist der für die Einspeisung. Diesem Wert müsste man ja irgendwie noch ein "-" hinzufügen um ihn nutzen zu können.

    4 Mal editiert, zuletzt von Omega13 (11. August 2025 um 15:03)

  • Ich hab letztens in dem PV Forum ein Extra Thread für die Marstek Shelly Emulation erstellt:

    Marstek Venus Jupiter B2500 - Shelly Pro 3EM Emulator Tasmota Lesekopf - Photovoltaikforum
    Dieser Thread richtet sich an alle, die einen smarten Akku für ihr BKW/PV-Anlage (z.B. von Marstek) besitzen und gerne die Nulleinspeisung (Work Mode = Auto)…
    www.photovoltaikforum.com

    Vielleicht sollte ich hier auch einen extra Thread erstellen oder soll es in dem anderen Forum weiter gehen?

  • Omega13

    Sofern ich dein Problem richtig verstanden habe ist es doch total simpel:

    An dieser Stelle musst du statt cpwr=sml[4] doch einfach nur cpwr=sml[1]-sml[4] eintragen um den Saldo der aktuellen Leistung (Bezug - Leistung) zu erhalten.

    >S
    if year<2000 {
    break
    }
    ; adapt this to your meter
    ; update every 3 seconds
    if upsecs%3==0 {
    cpwr=sml[4]
    c1p=sml[4]
    c2p=sml[5]
    c3p=sml[6]
    }


    Oder habe ich das Problem nicht richtig verstanden?