Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. ecoflow-connector-Script zur dynamischen Leistungsanpassung

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.1k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.8k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.1k

ecoflow-connector-Script zur dynamischen Leistungsanpassung

Scheduled Pinned Locked Moved JavaScript
1.6k Posts 127 Posters 741.5k Views 127 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P Ponti92

    @waly_de
    Wenn ich die Ladegrenze höher stelle, dann fängt der Powerstream nicht mit dem Ernten an.. Deshalb lasse ich sie zurzeit leer werden, dann startet der MPTT auch automatisch in der Früh bei wenigen Watt. Danach muss ich nur noch die Delta2Max einschalten und das AC-Einspeisekabel der Powerstream trennen (mit einem shelly) und dann speist er korrekt in die Batterie ein.

    offtopic:
    Ich weiß auch nicht warum das noch nicht richtig läuft, aber ich habe folgende Szenarien:

    • Akku ist komplett leer und Powerstream ist aus in der Früh:
      • Powerstream schaltet sich automatisch ein und erntet erste Watt, aber schaltet Delta2Max nicht ein, es verhält sich so als ob kein Akku vorhanden sei.
      • Delta2Max muss manuell eingeschalten werden und AC von Powerstream muss getrennt werden, damit es dann weiter läuft
    • Akku ist in der Entladegrenze und hat sich in den stand-by geschaltet:
      • Das System wacht nicht automatisch auf in der Früh, keine Solarproduktion, obwohl schon "Sonne" da ist
      • Da hilft nur Trennen aller Kabel, um den Powerstream neu zu starten, dann fängt er mit Solar-Ernte an
    • Akku ist noch voll und Powerstream hat die ganze Nacht die Grundlast versorgt:
      • Kein PV Input, aber Powerstream versorgt weiterhin die Grundlast
      • Man kriegt das System nicht dazu weiterzumachen und muss alle Kabel trennen..
    W Offline
    W Offline
    Waly_de
    wrote on last edited by Waly_de
    #190

    @ponti92 Ich hatte anfangs exakt die gleichen Probleme. Das habe ich aber dann aber tatsächlich mit Software-Updates in den Griff bekommen. Ich habe im Moment die untere Ladegrenze bei 7 % liegen und es funktioniert genauso wie es soll: das System legt sich gegen 0:00 Uhr schlafen wenn die Batterie leer ist, und wacht mit den ersten Sonnenstrahlen wieder auf, läd die Batterie auf ca. 10% und beginnt dann mit dem Einspeisen.

    Allerdings habe ich ja wie schon gesagt zwei PS und da ich diese Probleme hatte, dass mein DeltaMax Morgens nicht von der PS eingeschaltet wurde. Habe ich die beiden PS einmal gegeneinander ausgetauscht. Und siehe da, die zweite PS konnte problemlos meine Delta einschalten. Seitdem habe ich keine Probleme mehr. Der zweite PS hat bei mir keine Batterie.

    Vielleicht ist das also auch ein Hardware Problem. Wenn du die Möglichkeit hast, würde ich das mal ausprobieren.

    P 1 Reply Last reply
    0
    • W Waly_de

      @dreffi darüber habe ich mir noch keine detaillierten Gedanken macht. Bei mir funktioniert es im Moment fantastisch so, dass ich den zweiten PowerStream einfach mit voller Leistung einspeisen lasse. Bei mir ist die Grundlast tagsüber zwischen 500W und 600W Überschuss habe ich nur in extrem sonnigen Tagen.

      Hast du schon detaillierte Ideen, wie das funktionieren soll? Soll die Leistung dann aufgeteilt werden, oder soll zunächst eine und dann, wenn die nicht mehr reicht eine weitere PS Leistung ins Netz liefern? Was ist das Sinnvollste, auch um die Verluste durch das Speichern in der Batterie so klein wie möglich zu halten?

      D Offline
      D Offline
      Dreffi
      wrote on last edited by Dreffi
      #191

      @waly_de
      Das ist eine gute Frage. Ich denke da wird es kein perfektes Patentrezept für jeden geben.

      Angenommen alle Powerstreams sind weitgehend identisch (Solarertrag, Batteriekapazität) würde ich den Bedarf einfach durch die Anzahl Powerstreams teilen und einspeisen lassen. In der Realität sieht das sicher meist anders aus.

      Meine Ausgangssituation:
      PV1:
      Powerstream
      750 Wp, Südausrichtung, nie Schatten
      2 kWh Zusatzakku

      PV2:
      Powerstream
      1640 Wp, halb Süd- halb Westausrichtung, Fassadenmontage (senkrecht), Schatten bis 09:30
      1 kWh Powerstation (mit 250 Wp extra Modul, früher Ertrag, voraussichtlich nutzbar ab Oktober nach Update der Delta 2)

      Grundlast im Minimum 173 W

      Einstellung aktuell:
      PV 1 wird über dein Script gesteuert und versucht auf 10 W Bezug zu regeln.
      battPoz 90/85 %
      lowBatLimitPoz 15/20 % (50 W)
      Ladegrenzen 10-91 %

      PV 2 wird über Home Assistant geregelt, das Senden der Befehle übernimmt dein Script.
      Einspeisung fest auf 190 W (ergibt Bezug ungefähr 0, bei Bedarf stelle ich das noch hoch oder runter damit PV 1 nicht ständig anspringt)
      Ladegrenzen 10-90 %
      zzgl. Steuerung per Home Assistant (hierzu lese ich die Daten der Delta 2 an PV 2 mit Home Assistant aus der cloud):
      Akku >= 90 % --> Prio Akku (Überschuss wird voll eingespeist)
      Bezug >= 30 W oder Einspeisung PV 1 >= 30 W und <= 500 W, für 5 min --> Prio Einspeisung (ich arbeite noch an Details)
      Akku <= 15 % --> Einspeisung auf 50 W
      Akku >= 20 % --> Einspeisung wieder auf 190 W

      Im Großen und Ganzen sollte PV 2 damit die Grundlast decken und PV 1 übernimmt den weiteren Verbrauch.
      Ist der Akku von PV 1 voll geht die auf Prio Akku, alles verfügbare wird eingespeist und PV 1 hat kaum noch was zu tun und lädt auch den Akku voll. Wenn der Akku voll ist greift battPoz bei 90 %.
      PV 2 sollte die Grundlast durch die Westausrichtung ziemlich lange decken können. PV 1 bringt mich dann bis weit in die Nacht.

      Was noch nicht berücksichtig ist: Anheben der Leistung für PV 2 bei noch mehr Bedarf als den 190 W von PV 2 und den maximalen 600 W von PV 1. Luxusproblem. Der Strom landet dann im Akku bis dieser voll ist und automatisch Volleinspeisung erfolgt.
      Es gibt noch ein paar Extremsituationen die ich nicht abgedeckt habe. Darum kümmere ich mich bei Bedarf. Das dürfte hauptsächlich Situationen betreffen, wo eh Sonne im Überfluss verfügbar ist.

      Praxiserfahrungen stehen noch aus.

      Ich hoffe das ist halbwegs nachvollziehbar.

      W 1 Reply Last reply
      0
      • W Waly_de

        So, meine Anbindung läuft jetzt seit einigen Tagen sauber. Daher spendiere ich dem Skript mal einen eigenen Thread.

        Anbei findet ihr ein Skript, das eine Verbindung zwischen euren ecoflow-Geräten und ioBroker herstellen kann. Dabei nutzt es die gleiche Schnittstelle wie die ecoFlow App. Ihr benötigt lediglich eure Zugangsdaten zur App und die Seriennummern eurer Geräte, um dieses Skript nutzen zu können. Alle bekannten übermittelten Daten werden in ioBroker als Zustände angelegt. Viele davon sind noch unbekannt. Wenn ihr herausfindet, was sich hinter den unbekannten Daten verbirgt, kann ich die Zustandsnamen anpassen.

        Achtung: Der ecoflow-Server sendet unfassbar viele Nachrichten. Wenn ihr mehrere Geräte habt, kann dies euer System stark belasten und sogar zu Abstürzen führen. Vielleicht bekommt Ihr auch diese Meldung und das Script wird beendet:

         [error]: javascript.0 (5490) Script script.js.EcoFlow is calling setState more than 1000 times per minute! Stopping Script now! Please check your script!
        

        Daher empfehle ich, nicht alle Geräte dauerhaft zu abonnieren (dies kann über einen Parameter in der Einstellungssektion festgelegt werden). Es werden nur die PowerStreams benötigt, um die Einspeiseleistung anpassen zu können.
        Sonst kann dieser Grenzwert aber auch in den Einstellungen der Javascript-Instanz heraufgesetzt werden. 3000 dürfte für die meisten Szenarien reichen. (Siehe Screenshot weiter unten. Der Wert befindet sich unten links)

        Damit kommen wir zur eigentlichen interessanten Funktion des Skripts:
        Wenn ihr ein Smartmeter habt, das euren aktuellen Stromverbrauch in Echtzeit anzeigen kann, könnt ihr es an ioBroker anbinden. Informationen dazu findet ihr im Netz.

        Hier hab ich das Ding gekauft (Wenn ihr über die Links kauft, bekomme ich ein paar Cent Provision ab ;-)):
        Hichi Wifi, IR Lesekopf für Stromzähler
        https://ebay.us/3X1pkH
        Der Verkäufer hat auch ein tolles Video gemacht, wie man es einrichtet 😉

        Es funktionieren aber auch viele andere Zähler wie z.B.:
        Der Shelly 3EM

        Tibber-Kunden mit Pulse empfehle ich die lokale Einbindung des Pulse als Smartmeter mit meinem Script:
        https://forum.iobroker.net/topic/70758/tibber-pulse-verbrauchsdaten-lokal-auslesen

        Das Skript passt dann die Einspeiseleistung des PowerStream dynamisch an, sodass möglichst der gesamte Verbrauch durch die Einspeisung gedeckt wird, aber nichts ins Netz verschenkt wird. Erst wenn die Batterie voll geladen ist, wird die gesamte Leistung ins Netz eingespeist (wenn ihr das möchtet).

        Das Smartmeter muss den aktuellen Verbrauch möglichst in Echtzeit und in der Einheit Watt in einem Objekt von IOBroker zur Verfügung stellen. Im Script muss dann nur noch der Pfad zu diesem Objekt unter "SmartmeterID:" eingetragen werden. Am einfachsten geht das über die Adminoberfläche von IOBroker. Klickt auf Objekte und sucht das Objekt eures Smartmeters mit dem "Watt"-Wert im Objektbaum:
        Bildschirmfoto 2023-09-04 um 09.55.08.jpg
        Wenn Ihr auf das markierte Symbol klickt, ist der Pfad in euerer Zwischenablage gespeichert.
        Jetzt müsst Ihr ihn nur noch hinter "SmartmeterID:" im Script einfügen. Achtet darauf, dass Ihr es zwischen die "" einfügt.
        Wenn alles geklappt hat, der Pfad stimmt und das Script läuft, solltet Ihr unter Objekte: "0_userdata.0.ecoflow.RealPower" sehen, dass sich dieser Wert regelmäßig anpasst.

        Es können mehrere PowerStreams konfiguriert werden. Im Moment wird jedoch nur der erste in der Konfiguration gesteuert. Ich habe zum Beispiel zwei PowerStreams, einen mit und einen ohne Batterie. Dadurch steht tagsüber mehr Leistung zum Laden der Batterie zur Verfügung. Die Daten werden vom Skript verwendet, um die optimale Einspeiseleistung zu berechnen. In Zukunft könnten auch mehrere PowerStreams gesteuert werden.

        Nochmals vielen Dank an alle hier im Forum, die mit Ihrer Arbeit die Anbindung erst möglich gemacht haben!
        Ursprünglicher Beitrag: https://forum.iobroker.net/topic/54929/adapter-für-ecoflow-einbindung/

        Wichtig: Zur Installation müssen 2 Module installiert werden. Einfach in den Einstellungen der Javascriptinstanz unter Zusätzliche Module die beiden Namen eintragen und speichern ("mqtt" und "protobufjs")

        Bildschirmfoto 2023-07-17 um 10.56.49.jpg

        Erweiterungen:
        Tibber Modul
        Kann als eigenes, neues Script neben dem Hauptscript angelegt werden.

        //*************************************************************
        // Tibber Modul
        //*************************************************************
        // Schaltet die Regelung der Powerstation ab, wenn der Strom billig ist 
        // und einen beliebigen Schalter zum Aktivieren der AC-Ladung ein, bis die Batterie 
        // den durch der "BatMax" festgelegten Ladestand in % erreicht hat
        // 
        // Diese Parameter aus dem Hauptscript sind wichtig:
        // RegulationOffPower: -2 // Wird die Regulation per State abgestellt, wird die Einspeiseleistung des ersten Powerstreams auf diesen Wert gesetzt (-1 = keine Änderung, -2 = Batterie Priomodus)
        // RegulationState: "Regulate" // Erzeugt der State zum Ein und Aus-Schalten der Regulation.
        //
        // Das Script versucht selbst die ID's für den TibberStatus und den Batteriestand zu ermitteln.
        // Wenn das nicht klappt bitte einfach die richtigen ID's hinter "batSocID" und "tibberID" angeben.
        //
        //*************************************************************
        
        //*************************************************************
        // Konfiguration laden, wenn nicht im Originalscript eingefügt
        //*************************************************************
        var ConfigData = {
            statesPrefix: '0_userdata.0.ecoflow',
            RegulationState: "Regulate"
        }
        if (typeof ConfigData.email === 'undefined') {
            try {
                let tempConfigData = getState("0_userdata.0.ecoflow.Settings.ConfigData").val
                if (typeof tempConfigData !== 'object' && tempConfigData !== null) {
                    tempConfigData = JSON.parse(tempConfigData)
                }
                if (typeof tempConfigData === 'object' && tempConfigData !== null) {
                    if (tempConfigData.email !== undefined) {
                        ConfigData = tempConfigData;
                        //log("wurde geladen als object")
                    }
                }
            } catch (error) {
                log("Konfiguration wurde nicht geladen: " + error.message)
            }
        }
        
        /***************************************
        **********  YOUR DATA HERE  ************ 
        ****************************************/
        var tibberConfig = {
            BatMax: 99,                                  //Bei diesem Ladestand stoppt die AC-Ladung und das Script wird wieder eingeschaltet 
            BatMin: 95,                                  //Der Ladestand der Batterie muss kleiner sein als BatMin , damit der Akku per AC-Ladung geladen wird 
            SwitchID: "sonoff.0.NOUS-DVES_F0A844.POWER", //ID des Schalters, der die AC-Ladung einschaltet. "true" und "false" werden gesetzt
            LevelToSwitch: [                             //Hier die Werte definieren, bei denen die AC-Ladung eingeschaltet werden soll
                //"NORMAL",
                //"CHEAP",                                 //Einkommentieren falls gewüscht 
                "VERY_CHEAP"
            ],
        }
        //***************************************/
        // Nur angeben, wenn automatische Ermittlung fehlschlägt
        //***************************************/
        let batSocID = getState(ConfigData.statesPrefix + ".Settings.Tibber.tibberBatSocID").val
        let tibberID = getState(ConfigData.statesPrefix + ".Settings.Tibber.tibberID").val
        //***************************************/
        
        
        var idOK = false
        if (!batSocID || !tibberID) {
            log("Versuche die IDs für Tibber und Batterielevel zu finden")
            $("tibberlink.*.Homes.*.CurrentPrice.level").each(function (id, i) {
                tibberID = id
                createState(ConfigData.statesPrefix + ".Settings.Tibber.tibberID", tibberID, false)
                log("TibberID gefunden und gespeichert:" + id)
            })
            $(ConfigData.statesPrefix + ".app_device_property_*.data.InverterHeartbeat.batSoc").each(function (id, i) {
                if (getState(id).val > 0) {
                    batSocID = id
                    createState(ConfigData.statesPrefix + ".Settings.Tibber.tibberBatSocID", batSocID, false)
                    log("batSocID gefunden und gespeichert:" + id)
                }
            })
            if (!batSocID || !tibberID) {
                log("Fehler bei der Ermittlung der IDs. Bitte händisch ins Script eintragen", 'error')
            } else {
                idOK = true
            }
        } else {
            idOK = true
        }
        if (idOK) {
            checkTibber()
            on({ id: tibberID, change: "ne" }, function (obj) {
                //log("Tibber Modul. tibberID Event:" + obj.state.val)
                checkTibber()
            });
            on({ id: batSocID, change: "ne" }, function (obj) {
                //log("Tibber Modul. batSocID Event:" + obj.state.val + "%")
                checkTibber()
            });
        }
        function checkTibber() {
            if (tibberID && batSocID) {
                const RegulateID = ConfigData.statesPrefix + "." + ConfigData.RegulationState
                let priceLevel = getState(tibberID).val;
                let batsoc = Number(getState(batSocID).val)
                let OldRegulate = toBoolean(getState(RegulateID).val)
                //log("Tibber Preislevel: " + priceLevel + " OldRegulate: " + OldRegulate + " batsoc: " + (batsoc))
                if ((tibberConfig.LevelToSwitch.includes(priceLevel))) {
                    if (OldRegulate) {
                        if (batsoc <= tibberConfig.BatMin) {
                            setState(RegulateID, false);  // Regulierung aus
                            setState(tibberConfig.SwitchID, true) //Schalter einschalten
                            log("Script abgeschaltet AC-Ladung Ein, weil priceLevel:" + priceLevel + " batsoc:" + batsoc + "%")
                        }
                    } else {
                        if (batsoc >= tibberConfig.BatMax) {
                            setState(RegulateID, true);  // Regulierung an
                            setState(tibberConfig.SwitchID, false) //Schalter ausschalten
                            log(" Batterie bei BatMax. Script eingeschaltet AC-Ladung Aus. priceLevel:" + priceLevel + " batsoc:" + batsoc + "%")
                        }
                    }
                } else {
                    if (!OldRegulate) {
                        setState(RegulateID, true);  // Regulierung an
                        setState(tibberConfig.SwitchID, false) //Schalter ausschalten
                        log("Script eingeschaltet AC-Ladung Aus. priceLevel:" + priceLevel + " batsoc:" + batsoc + "%")
                    }
                }
            } else {
                //log("checkTibber skip. batsocID und/oder tibberID fehlen.")
            }
        }
        //*************************************************************
        

        Tibber-Pulse als Smartmeter nutzen und lokal auslesen:
        https://forum.iobroker.net/topic/70758/tibber-pulse-verbrauchsdaten-lokal-auslesen

        Unterstütze das Projekt 'ecoflow-connector'
        Wenn dir das Script zur dynamischen Leistungsanpassung für den IObroker gefällt und du es nützlich findest, ziehe bitte in Erwägung, eine kleine Spende via PayPal zu hinterlassen.
        Jeder Beitrag hilft, das Projekt am Laufen zu halten und weitere Updates zu ermöglichen.
        Danke für deine Unterstützung!
        Jetzt Spenden

        Dieses Script wird bei Änderungen und Updates immer aktualisiert:
        Nutzung auf eigene Gefahr !

        [Bildschirmfoto 2024-03-29 um 09.37.51.jpg

        • Installation von ioBroker und Skript unter UNRAID in nur 12 Minuten
        • Video mit Erklärung der Basiskonfiguration
        • Video mit Erklärung zu AdditionalPower und Überschussladung

        Download (neues JS-Script in IOBroker anlegen und den Inhalt der Datei einfügen):

        • ecoflow-connector_v125.txt (13.05.2024)
        • 1.2.5.f1 Fork von Florian Vogt (25.06.2024)
          Feature hinzugefügt, um die Größe der Delta-Speicher beim Ausbalancieren der Entladeleistung zu berücksichtigen, damit die Batterien gleichmäßig geleert werden.
          Parameter battCapacity bei den Einstellungen für PowerStream = Kapazität der angeschlossenen Batterie in kWh, default = 1
          ecoflow-connector_v125_mod_FV.txt (25.06.2024)

        ältere Versionen:

        • ecoflow-connector_v124.txt (22.04.2024)
        • ecoflow-connector_v123.txt (21.02.2024)
        • ecoflow-connector_v121_05.01.2024.txt
        • ecoflow-connector_v12_.04.12.2023.txt
        • ecoflow-connector_v1162_04.11.2023.txt
        • ecoflow-connector_v115_02.10.2023.txt
        • ecoflow-connector_v1142_26.09.2023
        • ecoflow-connector_v1132_31.08.2023
        • ecoflow-connector_v112_17.08.2023)
        A Offline
        A Offline
        aherby
        wrote on last edited by
        #192

        @waly_de
        Ich habe gerade mal ein Smartplug der ausgeschaltet ist, im Namen (Hallo, Moin oder Drucker kann nicht sagen von welcher Änderung dieser Wert ist) geändert
        Ob die aufgefangenen Zeilen wirklich die Namensänderung sind kann ich nicht genau sagen.

        /thing/property/set:0a3d0a0408c58801102018352001280138034020480b5004580170d489ced006800113880101ba0103696f73ca0110485735325a4448345346364b36303745
        

        Was steckt denn in so Daten, wird von den Plugs also auch unterschiedlichen Plugs gesendet:

        thing/property/get:0a101020182070a2a0f3d006ba0103696f73
        thing/property/get:0a101020182070dde5f2d006ba0103696f73
        thing/property/get:0a101020182070dbe5f2d006ba0103696f73
        

        ?

        Was hat es mit diesen Daten von : https://github.com/tolwi/hassio-ecoflow-cloud/issues/54
        aus sicht, klingt nach der History aber war in einem frühren Stadium im Beitrag

        135 power history

        This is an array of smaller units with this data structure
        Field Type Name
        1 UInt32 timestamp
        2 SInt32 timezone
        3 UInt32 invToGridPower
        4 UInt32 invToPlugPower
        5 Int32 batteryPower
        6 UInt32 pv1OutputPower
        7 UInt32 pv2OutputPower

        Wie kann ich bei der Decodierung unterstützen?

        1 Reply Last reply
        0
        • W Offline
          W Offline
          Waly_de
          wrote on last edited by
          #193

          @aherby sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:

          Ich habe gerade mal ein Smartplug der ausgeschaltet ist, im Namen (Hallo, Moin oder Drucker kann nicht sagen von welcher Änderung dieser Wert ist) geändert
          Ob die aufgefangenen Zeilen wirklich die Namensänderung sind kann ich nicht genau sagen.
          Was steckt denn in so Daten, wird von den Plugs also auch unterschiedlichen Plugs gesendet:
          thing/property/get:0a101020182070a2a0f3d006ba0103696f73 thing/property/get:0a101020182070dde5f2d006ba0103696f73 thing/property/get:0a101020182070dbe5f2d006ba0103696f73
          ?

          Nein, da steckt leider nichts interessantes drin, das sind die ganz normalen "I'm alive" Meldungen des Skriptes.
          Du kannst den HexString hiermit genauer untersuchen:
          https://protobuf-decoder.netlify.app

          Wäre da ein name drin, könntest Du ihn damit sehen.

          Die Historydaten kenne ich auch schon... das muss ich mir mal vornehmen, wenn schlechtes Wetter ist und ich sonst nichts vor habe 😉 Im Moment arbeite ich an einer anderen Front.

          @aherby sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:

          Wie kann ich bei der Decodierung unterstützen?

          Schwierig... mit dem https://protobuf-decoder.netlify.app kannst du schon mal einiges machen. Sonst halte mal im Netz Ausschau nach neuen Meldungen zum Thema ecoflow .proto Daten. Bei dem Github Beitrag warst du schon sehr gut. Da habe ich einen Großteil der Definitionen her.

          1 Reply Last reply
          0
          • D Dreffi

            @waly_de
            Das ist eine gute Frage. Ich denke da wird es kein perfektes Patentrezept für jeden geben.

            Angenommen alle Powerstreams sind weitgehend identisch (Solarertrag, Batteriekapazität) würde ich den Bedarf einfach durch die Anzahl Powerstreams teilen und einspeisen lassen. In der Realität sieht das sicher meist anders aus.

            Meine Ausgangssituation:
            PV1:
            Powerstream
            750 Wp, Südausrichtung, nie Schatten
            2 kWh Zusatzakku

            PV2:
            Powerstream
            1640 Wp, halb Süd- halb Westausrichtung, Fassadenmontage (senkrecht), Schatten bis 09:30
            1 kWh Powerstation (mit 250 Wp extra Modul, früher Ertrag, voraussichtlich nutzbar ab Oktober nach Update der Delta 2)

            Grundlast im Minimum 173 W

            Einstellung aktuell:
            PV 1 wird über dein Script gesteuert und versucht auf 10 W Bezug zu regeln.
            battPoz 90/85 %
            lowBatLimitPoz 15/20 % (50 W)
            Ladegrenzen 10-91 %

            PV 2 wird über Home Assistant geregelt, das Senden der Befehle übernimmt dein Script.
            Einspeisung fest auf 190 W (ergibt Bezug ungefähr 0, bei Bedarf stelle ich das noch hoch oder runter damit PV 1 nicht ständig anspringt)
            Ladegrenzen 10-90 %
            zzgl. Steuerung per Home Assistant (hierzu lese ich die Daten der Delta 2 an PV 2 mit Home Assistant aus der cloud):
            Akku >= 90 % --> Prio Akku (Überschuss wird voll eingespeist)
            Bezug >= 30 W oder Einspeisung PV 1 >= 30 W und <= 500 W, für 5 min --> Prio Einspeisung (ich arbeite noch an Details)
            Akku <= 15 % --> Einspeisung auf 50 W
            Akku >= 20 % --> Einspeisung wieder auf 190 W

            Im Großen und Ganzen sollte PV 2 damit die Grundlast decken und PV 1 übernimmt den weiteren Verbrauch.
            Ist der Akku von PV 1 voll geht die auf Prio Akku, alles verfügbare wird eingespeist und PV 1 hat kaum noch was zu tun und lädt auch den Akku voll. Wenn der Akku voll ist greift battPoz bei 90 %.
            PV 2 sollte die Grundlast durch die Westausrichtung ziemlich lange decken können. PV 1 bringt mich dann bis weit in die Nacht.

            Was noch nicht berücksichtig ist: Anheben der Leistung für PV 2 bei noch mehr Bedarf als den 190 W von PV 2 und den maximalen 600 W von PV 1. Luxusproblem. Der Strom landet dann im Akku bis dieser voll ist und automatisch Volleinspeisung erfolgt.
            Es gibt noch ein paar Extremsituationen die ich nicht abgedeckt habe. Darum kümmere ich mich bei Bedarf. Das dürfte hauptsächlich Situationen betreffen, wo eh Sonne im Überfluss verfügbar ist.

            Praxiserfahrungen stehen noch aus.

            Ich hoffe das ist halbwegs nachvollziehbar.

            W Offline
            W Offline
            Waly_de
            wrote on last edited by Waly_de
            #194

            @dreffi
            🙂 ja, ein komplexes Thema... Ganz so individuell kann ich das mit dem Script kaum abbilden.
            Aber ich bin schon dabei die Steuerung für mehrere PS zu realisieren.

            Modus 0 "balance" ist der Einfachste: Die PS werden der Reihen nach angesprochen. Jeder durchläuft den Regel-Algo. Am Ende passt die Einspeiseleistung. Aber man kann nicht priorisieren, nur mit BatLimits vielleicht.

            Modus 1 "serial" bearbeite ich grade und macht mir noch Probleme... Zuerst wird die 1. PS voll ausgereizt. Erst wenn die nicht mehr liefern kann, wird die nächste in der Reihe angesprochen.

            Ich denke das kann dann für ziemlich jeden irgendwie funktionieren.

            D 2 Replies Last reply
            0
            • W Waly_de

              @dreffi
              🙂 ja, ein komplexes Thema... Ganz so individuell kann ich das mit dem Script kaum abbilden.
              Aber ich bin schon dabei die Steuerung für mehrere PS zu realisieren.

              Modus 0 "balance" ist der Einfachste: Die PS werden der Reihen nach angesprochen. Jeder durchläuft den Regel-Algo. Am Ende passt die Einspeiseleistung. Aber man kann nicht priorisieren, nur mit BatLimits vielleicht.

              Modus 1 "serial" bearbeite ich grade und macht mir noch Probleme... Zuerst wird die 1. PS voll ausgereizt. Erst wenn die nicht mehr liefern kann, wird die nächste in der Reihe angesprochen.

              Ich denke das kann dann für ziemlich jeden irgendwie funktionieren.

              D Offline
              D Offline
              Dreffi
              wrote on last edited by Dreffi
              #195

              @waly_de
              Was mir grundsätzlich lieb wäre: (optional) statt BattPoz bei vollem Akku, die Priorität umstellen. Also SOC = SOCMax --> umstellen auf Prio Akku. Wenn Mindest- oder Durschnittsbezug >= X für Betrachtungszeitraum --> zurückstellen auf Prio Einspeisung.
              Dabei wird die Solarenergie 1:1 durchgeschleift. Also keine Verluste und der Akku wird nicht unnötig verschlissen.

              Mein Ansatz ist aktuell: 1 Powerstrem deckt die Grundlast (PV 2) und einer liefert bei Bedarf den Rest dazu (PV 1).

              Dazu die Möglichkeit diese Regelungen für vollen und leeren Akku auch auf den zweiten Powerstream anzuwenden. Mehr braucht es gar nicht.

              Meine Spielerei mit Home Assistant mache ich nur, weil die Regelungen aus dem Skript für hohen und niedrigen Akkustand sonst für den zweiten Powerstream nicht angewendet werden. Das bilde ich damit nur extern nach.

              Nur ein Szenario habe ich derzeit nicht abgedeckt: PV 1 ist voll geladen und geht auf Prio Akku (aktuell würde die Einspeisung durch BattPoz greifen). In dem Fall würde PV 2 weiter die eingestellte Grundlast einspeisen. Praktisch ist in dem Fall immer Sonne im Überfluss vorhanden. Eleganter wäre in dem speziellen Fall (PV 1 Akku voll) PV 2 zu drosseln. Luxusproblem. Da würde ich mir im Moment gar keine Gedanken machen.
              So lange beide Akkus über Nacht leer werden, reguliert sich das immer wieder selbst ein. Falls die Akkus nicht leer werden, sind wir wieder beim Luxus. Sonne im Überfluss.

              Das passt natürlich erstmal nur für insgesamt zwei Powerstreams.
              Hätte ich drei Powerstreams, würde ich die Grundlast fest auf zwei aufteilen und wieder nur den dritten nach Bezug regeln lassen. Noch mehr Powerstreams sind dann doch eher unwahrscheinlich und fernab jeglicher Zulässigkeit.

              Grundsätzlich würde ich versuchen das nicht zu komplex zu machen. Keep it simple!
              Es ist nur eine Frage der Zeit bis Ecoflow wieder was an den Daten oder der Regelung ändert. Dann sollte das Skript einfach und robust sein.
              Beispiel: ich hoffe noch, dass die Überschusseinspeisung bei vollem Akku irgendwann auch für den Modus Prio Einspeisung kommt. Dann würde ein Problem schonmal wegfallen. Vielleicht schafft es Ecoflow irgendwann auch das Verhalten bei fast leerem Akku zu optimieren. Dann wäre unterm Strich wieder nur die Regelung eines einzigen Powersteams nach Bezug erforderlich.

              1 Reply Last reply
              1
              • W Waly_de

                @ponti92 Ich hatte anfangs exakt die gleichen Probleme. Das habe ich aber dann aber tatsächlich mit Software-Updates in den Griff bekommen. Ich habe im Moment die untere Ladegrenze bei 7 % liegen und es funktioniert genauso wie es soll: das System legt sich gegen 0:00 Uhr schlafen wenn die Batterie leer ist, und wacht mit den ersten Sonnenstrahlen wieder auf, läd die Batterie auf ca. 10% und beginnt dann mit dem Einspeisen.

                Allerdings habe ich ja wie schon gesagt zwei PS und da ich diese Probleme hatte, dass mein DeltaMax Morgens nicht von der PS eingeschaltet wurde. Habe ich die beiden PS einmal gegeneinander ausgetauscht. Und siehe da, die zweite PS konnte problemlos meine Delta einschalten. Seitdem habe ich keine Probleme mehr. Der zweite PS hat bei mir keine Batterie.

                Vielleicht ist das also auch ein Hardware Problem. Wenn du die Möglichkeit hast, würde ich das mal ausprobieren.

                P Offline
                P Offline
                Ponti92
                wrote on last edited by
                #196

                @waly_de said in ecoflow-connector-Script zur dynamischen Leistungsanpassung:

                @ponti92 Ich hatte anfangs exakt die gleichen Probleme. Das habe ich aber dann aber tatsächlich mit Software-Updates in den Griff bekommen. Ich habe im Moment die untere Ladegrenze bei 7 % liegen und es funktioniert genauso wie es soll: das System legt sich gegen 0:00 Uhr schlafen wenn die Batterie leer ist, und wacht mit den ersten Sonnenstrahlen wieder auf, läd die Batterie auf ca. 10% und beginnt dann mit dem Einspeisen.

                Hab den Tipp mit den 7% min ausprobiert und heute hat es prima geklappt und die delta2Max ist wieder aufgewacht und der PS liefert Strom für die Batterie.
                Danke schon mal, hoffe das bleibt so ☺️

                1 Reply Last reply
                1
                • W Waly_de

                  @dreffi
                  🙂 ja, ein komplexes Thema... Ganz so individuell kann ich das mit dem Script kaum abbilden.
                  Aber ich bin schon dabei die Steuerung für mehrere PS zu realisieren.

                  Modus 0 "balance" ist der Einfachste: Die PS werden der Reihen nach angesprochen. Jeder durchläuft den Regel-Algo. Am Ende passt die Einspeiseleistung. Aber man kann nicht priorisieren, nur mit BatLimits vielleicht.

                  Modus 1 "serial" bearbeite ich grade und macht mir noch Probleme... Zuerst wird die 1. PS voll ausgereizt. Erst wenn die nicht mehr liefern kann, wird die nächste in der Reihe angesprochen.

                  Ich denke das kann dann für ziemlich jeden irgendwie funktionieren.

                  D Offline
                  D Offline
                  Dreffi
                  wrote on last edited by Dreffi
                  #197

                  @waly_de
                  Zwischenbericht:
                  an und für sich läuft die Steuerung von zwei Powerstreams in meiner jetzigen Konfiguration einwandfrei.
                  Alles was mir noch fehlt:

                  • Umstellung auf Prio Akku bei Erreichen von BatLimitHigh.
                  • Steuerung der weiteren Powerstreams bei vollem/leeren Akku wie auch den ersten (Leistungsbegrenzung und Umstellen der Priorisierung)

                  Einfach volle Pulle einzuspeisen bei vollem Akku missfällt mir. Das geht unnötig auf den Akku. Verschenken des Potentials wäre aber auch schade.

                  Nachtrag:
                  Heute scheint die Sonne reichlich. Ich nutze das um die Trigger zum Umstellen der Priorisierung zu optimieren.
                  Ladegrenze erreicht (SOC = BatLimitHigh) --> stelle auf Prio Akku
                  Tatsächliche Einspeiseleistung fällt einige Zeit deutlich unter Bedarf --> stelle zurück auf Prio Einspeisung. Das sollte sowohl mit fest eingestellter Grundlast als auch mit einem durch das Script gesetzten Bedarf funktionieren. Ich warte hier ab bis der Wert für durchgehend 5 Minuten mindestens 20 W unter den eingestellten Bedarf fällt.

                  Wenn beide Powerstreams dank vollem Akku auf Prio Akku stehen, wird aus dem gesamten System wieder ein normales Balkonkraftwerk, inkl Bezug bei Wolken. Hier muss man entscheiden ob das so wirklich sinnvoll ist. Ich weiß aber nicht ob die aktuelle Regelung (BattPozON/Off) besser funktioniert. Als Kompromiss sehe ich erstmal nur meinen Powerstream für die Grundlast auf Prio Akku zu stellen und den zweiten per Script nach Bedarf regeln zu lassen. Da wird eventuell weiteres PV-Potential verschenkt, aber es erfolgt möglichst kein Bezug.

                  Aktuelles Problem: nachdem zurück auf Einspeisung gestellt wurde, wird der Trigger zum erneuten Umstellen auf Prio Akku (SOC) erstmal nicht mehr erreicht werden. Das funktioniert so nur einmalig. Also wohl doch entweder die aktuelle Regelung beibehalten oder auf Überschusseinspeisung verzichten.

                  So richtig perfekt ist das alles nicht. Ideal wäre wenn Ecoflow einfach im normalen Modus Stromversorgung priorisieren auch den Überschuss mit einspeist. Das extern durch Regelung zu korrigieren ist doof.

                  D 1 Reply Last reply
                  1
                  • W Waly_de

                    So, meine Anbindung läuft jetzt seit einigen Tagen sauber. Daher spendiere ich dem Skript mal einen eigenen Thread.

                    Anbei findet ihr ein Skript, das eine Verbindung zwischen euren ecoflow-Geräten und ioBroker herstellen kann. Dabei nutzt es die gleiche Schnittstelle wie die ecoFlow App. Ihr benötigt lediglich eure Zugangsdaten zur App und die Seriennummern eurer Geräte, um dieses Skript nutzen zu können. Alle bekannten übermittelten Daten werden in ioBroker als Zustände angelegt. Viele davon sind noch unbekannt. Wenn ihr herausfindet, was sich hinter den unbekannten Daten verbirgt, kann ich die Zustandsnamen anpassen.

                    Achtung: Der ecoflow-Server sendet unfassbar viele Nachrichten. Wenn ihr mehrere Geräte habt, kann dies euer System stark belasten und sogar zu Abstürzen führen. Vielleicht bekommt Ihr auch diese Meldung und das Script wird beendet:

                     [error]: javascript.0 (5490) Script script.js.EcoFlow is calling setState more than 1000 times per minute! Stopping Script now! Please check your script!
                    

                    Daher empfehle ich, nicht alle Geräte dauerhaft zu abonnieren (dies kann über einen Parameter in der Einstellungssektion festgelegt werden). Es werden nur die PowerStreams benötigt, um die Einspeiseleistung anpassen zu können.
                    Sonst kann dieser Grenzwert aber auch in den Einstellungen der Javascript-Instanz heraufgesetzt werden. 3000 dürfte für die meisten Szenarien reichen. (Siehe Screenshot weiter unten. Der Wert befindet sich unten links)

                    Damit kommen wir zur eigentlichen interessanten Funktion des Skripts:
                    Wenn ihr ein Smartmeter habt, das euren aktuellen Stromverbrauch in Echtzeit anzeigen kann, könnt ihr es an ioBroker anbinden. Informationen dazu findet ihr im Netz.

                    Hier hab ich das Ding gekauft (Wenn ihr über die Links kauft, bekomme ich ein paar Cent Provision ab ;-)):
                    Hichi Wifi, IR Lesekopf für Stromzähler
                    https://ebay.us/3X1pkH
                    Der Verkäufer hat auch ein tolles Video gemacht, wie man es einrichtet 😉

                    Es funktionieren aber auch viele andere Zähler wie z.B.:
                    Der Shelly 3EM

                    Tibber-Kunden mit Pulse empfehle ich die lokale Einbindung des Pulse als Smartmeter mit meinem Script:
                    https://forum.iobroker.net/topic/70758/tibber-pulse-verbrauchsdaten-lokal-auslesen

                    Das Skript passt dann die Einspeiseleistung des PowerStream dynamisch an, sodass möglichst der gesamte Verbrauch durch die Einspeisung gedeckt wird, aber nichts ins Netz verschenkt wird. Erst wenn die Batterie voll geladen ist, wird die gesamte Leistung ins Netz eingespeist (wenn ihr das möchtet).

                    Das Smartmeter muss den aktuellen Verbrauch möglichst in Echtzeit und in der Einheit Watt in einem Objekt von IOBroker zur Verfügung stellen. Im Script muss dann nur noch der Pfad zu diesem Objekt unter "SmartmeterID:" eingetragen werden. Am einfachsten geht das über die Adminoberfläche von IOBroker. Klickt auf Objekte und sucht das Objekt eures Smartmeters mit dem "Watt"-Wert im Objektbaum:
                    Bildschirmfoto 2023-09-04 um 09.55.08.jpg
                    Wenn Ihr auf das markierte Symbol klickt, ist der Pfad in euerer Zwischenablage gespeichert.
                    Jetzt müsst Ihr ihn nur noch hinter "SmartmeterID:" im Script einfügen. Achtet darauf, dass Ihr es zwischen die "" einfügt.
                    Wenn alles geklappt hat, der Pfad stimmt und das Script läuft, solltet Ihr unter Objekte: "0_userdata.0.ecoflow.RealPower" sehen, dass sich dieser Wert regelmäßig anpasst.

                    Es können mehrere PowerStreams konfiguriert werden. Im Moment wird jedoch nur der erste in der Konfiguration gesteuert. Ich habe zum Beispiel zwei PowerStreams, einen mit und einen ohne Batterie. Dadurch steht tagsüber mehr Leistung zum Laden der Batterie zur Verfügung. Die Daten werden vom Skript verwendet, um die optimale Einspeiseleistung zu berechnen. In Zukunft könnten auch mehrere PowerStreams gesteuert werden.

                    Nochmals vielen Dank an alle hier im Forum, die mit Ihrer Arbeit die Anbindung erst möglich gemacht haben!
                    Ursprünglicher Beitrag: https://forum.iobroker.net/topic/54929/adapter-für-ecoflow-einbindung/

                    Wichtig: Zur Installation müssen 2 Module installiert werden. Einfach in den Einstellungen der Javascriptinstanz unter Zusätzliche Module die beiden Namen eintragen und speichern ("mqtt" und "protobufjs")

                    Bildschirmfoto 2023-07-17 um 10.56.49.jpg

                    Erweiterungen:
                    Tibber Modul
                    Kann als eigenes, neues Script neben dem Hauptscript angelegt werden.

                    //*************************************************************
                    // Tibber Modul
                    //*************************************************************
                    // Schaltet die Regelung der Powerstation ab, wenn der Strom billig ist 
                    // und einen beliebigen Schalter zum Aktivieren der AC-Ladung ein, bis die Batterie 
                    // den durch der "BatMax" festgelegten Ladestand in % erreicht hat
                    // 
                    // Diese Parameter aus dem Hauptscript sind wichtig:
                    // RegulationOffPower: -2 // Wird die Regulation per State abgestellt, wird die Einspeiseleistung des ersten Powerstreams auf diesen Wert gesetzt (-1 = keine Änderung, -2 = Batterie Priomodus)
                    // RegulationState: "Regulate" // Erzeugt der State zum Ein und Aus-Schalten der Regulation.
                    //
                    // Das Script versucht selbst die ID's für den TibberStatus und den Batteriestand zu ermitteln.
                    // Wenn das nicht klappt bitte einfach die richtigen ID's hinter "batSocID" und "tibberID" angeben.
                    //
                    //*************************************************************
                    
                    //*************************************************************
                    // Konfiguration laden, wenn nicht im Originalscript eingefügt
                    //*************************************************************
                    var ConfigData = {
                        statesPrefix: '0_userdata.0.ecoflow',
                        RegulationState: "Regulate"
                    }
                    if (typeof ConfigData.email === 'undefined') {
                        try {
                            let tempConfigData = getState("0_userdata.0.ecoflow.Settings.ConfigData").val
                            if (typeof tempConfigData !== 'object' && tempConfigData !== null) {
                                tempConfigData = JSON.parse(tempConfigData)
                            }
                            if (typeof tempConfigData === 'object' && tempConfigData !== null) {
                                if (tempConfigData.email !== undefined) {
                                    ConfigData = tempConfigData;
                                    //log("wurde geladen als object")
                                }
                            }
                        } catch (error) {
                            log("Konfiguration wurde nicht geladen: " + error.message)
                        }
                    }
                    
                    /***************************************
                    **********  YOUR DATA HERE  ************ 
                    ****************************************/
                    var tibberConfig = {
                        BatMax: 99,                                  //Bei diesem Ladestand stoppt die AC-Ladung und das Script wird wieder eingeschaltet 
                        BatMin: 95,                                  //Der Ladestand der Batterie muss kleiner sein als BatMin , damit der Akku per AC-Ladung geladen wird 
                        SwitchID: "sonoff.0.NOUS-DVES_F0A844.POWER", //ID des Schalters, der die AC-Ladung einschaltet. "true" und "false" werden gesetzt
                        LevelToSwitch: [                             //Hier die Werte definieren, bei denen die AC-Ladung eingeschaltet werden soll
                            //"NORMAL",
                            //"CHEAP",                                 //Einkommentieren falls gewüscht 
                            "VERY_CHEAP"
                        ],
                    }
                    //***************************************/
                    // Nur angeben, wenn automatische Ermittlung fehlschlägt
                    //***************************************/
                    let batSocID = getState(ConfigData.statesPrefix + ".Settings.Tibber.tibberBatSocID").val
                    let tibberID = getState(ConfigData.statesPrefix + ".Settings.Tibber.tibberID").val
                    //***************************************/
                    
                    
                    var idOK = false
                    if (!batSocID || !tibberID) {
                        log("Versuche die IDs für Tibber und Batterielevel zu finden")
                        $("tibberlink.*.Homes.*.CurrentPrice.level").each(function (id, i) {
                            tibberID = id
                            createState(ConfigData.statesPrefix + ".Settings.Tibber.tibberID", tibberID, false)
                            log("TibberID gefunden und gespeichert:" + id)
                        })
                        $(ConfigData.statesPrefix + ".app_device_property_*.data.InverterHeartbeat.batSoc").each(function (id, i) {
                            if (getState(id).val > 0) {
                                batSocID = id
                                createState(ConfigData.statesPrefix + ".Settings.Tibber.tibberBatSocID", batSocID, false)
                                log("batSocID gefunden und gespeichert:" + id)
                            }
                        })
                        if (!batSocID || !tibberID) {
                            log("Fehler bei der Ermittlung der IDs. Bitte händisch ins Script eintragen", 'error')
                        } else {
                            idOK = true
                        }
                    } else {
                        idOK = true
                    }
                    if (idOK) {
                        checkTibber()
                        on({ id: tibberID, change: "ne" }, function (obj) {
                            //log("Tibber Modul. tibberID Event:" + obj.state.val)
                            checkTibber()
                        });
                        on({ id: batSocID, change: "ne" }, function (obj) {
                            //log("Tibber Modul. batSocID Event:" + obj.state.val + "%")
                            checkTibber()
                        });
                    }
                    function checkTibber() {
                        if (tibberID && batSocID) {
                            const RegulateID = ConfigData.statesPrefix + "." + ConfigData.RegulationState
                            let priceLevel = getState(tibberID).val;
                            let batsoc = Number(getState(batSocID).val)
                            let OldRegulate = toBoolean(getState(RegulateID).val)
                            //log("Tibber Preislevel: " + priceLevel + " OldRegulate: " + OldRegulate + " batsoc: " + (batsoc))
                            if ((tibberConfig.LevelToSwitch.includes(priceLevel))) {
                                if (OldRegulate) {
                                    if (batsoc <= tibberConfig.BatMin) {
                                        setState(RegulateID, false);  // Regulierung aus
                                        setState(tibberConfig.SwitchID, true) //Schalter einschalten
                                        log("Script abgeschaltet AC-Ladung Ein, weil priceLevel:" + priceLevel + " batsoc:" + batsoc + "%")
                                    }
                                } else {
                                    if (batsoc >= tibberConfig.BatMax) {
                                        setState(RegulateID, true);  // Regulierung an
                                        setState(tibberConfig.SwitchID, false) //Schalter ausschalten
                                        log(" Batterie bei BatMax. Script eingeschaltet AC-Ladung Aus. priceLevel:" + priceLevel + " batsoc:" + batsoc + "%")
                                    }
                                }
                            } else {
                                if (!OldRegulate) {
                                    setState(RegulateID, true);  // Regulierung an
                                    setState(tibberConfig.SwitchID, false) //Schalter ausschalten
                                    log("Script eingeschaltet AC-Ladung Aus. priceLevel:" + priceLevel + " batsoc:" + batsoc + "%")
                                }
                            }
                        } else {
                            //log("checkTibber skip. batsocID und/oder tibberID fehlen.")
                        }
                    }
                    //*************************************************************
                    

                    Tibber-Pulse als Smartmeter nutzen und lokal auslesen:
                    https://forum.iobroker.net/topic/70758/tibber-pulse-verbrauchsdaten-lokal-auslesen

                    Unterstütze das Projekt 'ecoflow-connector'
                    Wenn dir das Script zur dynamischen Leistungsanpassung für den IObroker gefällt und du es nützlich findest, ziehe bitte in Erwägung, eine kleine Spende via PayPal zu hinterlassen.
                    Jeder Beitrag hilft, das Projekt am Laufen zu halten und weitere Updates zu ermöglichen.
                    Danke für deine Unterstützung!
                    Jetzt Spenden

                    Dieses Script wird bei Änderungen und Updates immer aktualisiert:
                    Nutzung auf eigene Gefahr !

                    [Bildschirmfoto 2024-03-29 um 09.37.51.jpg

                    • Installation von ioBroker und Skript unter UNRAID in nur 12 Minuten
                    • Video mit Erklärung der Basiskonfiguration
                    • Video mit Erklärung zu AdditionalPower und Überschussladung

                    Download (neues JS-Script in IOBroker anlegen und den Inhalt der Datei einfügen):

                    • ecoflow-connector_v125.txt (13.05.2024)
                    • 1.2.5.f1 Fork von Florian Vogt (25.06.2024)
                      Feature hinzugefügt, um die Größe der Delta-Speicher beim Ausbalancieren der Entladeleistung zu berücksichtigen, damit die Batterien gleichmäßig geleert werden.
                      Parameter battCapacity bei den Einstellungen für PowerStream = Kapazität der angeschlossenen Batterie in kWh, default = 1
                      ecoflow-connector_v125_mod_FV.txt (25.06.2024)

                    ältere Versionen:

                    • ecoflow-connector_v124.txt (22.04.2024)
                    • ecoflow-connector_v123.txt (21.02.2024)
                    • ecoflow-connector_v121_05.01.2024.txt
                    • ecoflow-connector_v12_.04.12.2023.txt
                    • ecoflow-connector_v1162_04.11.2023.txt
                    • ecoflow-connector_v115_02.10.2023.txt
                    • ecoflow-connector_v1142_26.09.2023
                    • ecoflow-connector_v1132_31.08.2023
                    • ecoflow-connector_v112_17.08.2023)
                    A Offline
                    A Offline
                    aherby
                    wrote on last edited by
                    #198

                    @waly_de
                    Hallo ich habe mal wieder etwas versucht mitzulesen was bei der Delta 2 Max passiert:

                    Bei der Delta 2 Max schein dies der Befehl für "AC immer eingeschaltet" zu sein.

                    script.js.Ecoflow_Skript_1_0_2_2_: Unbekannter Delta2 Set Befehl: {"params":{"enabled":1,"minAcSoc":18},"from":"iOS","lang":"de-de","id":"xxxxxxxxx","moduleSn":"R351ZEB4Hxxxxxxx","moduleType":1,"operateType":"newAcAutoOnCfg","version":"1.0"}
                    
                    Unbekannter Delta2 Set Befehl: {"params":{"enabled":0,"minAcSoc":18},"from":"iOS","lang":"de-de","id":"xxxxxxxxx","moduleSn":"R351ZEB4Hxxxxxxx","moduleType":1,"operateType":"newAcAutoOnCfg","version":"1.0"}
                    

                    Piepen ein /aus

                    set:{"params":{"enabled":1},"from":"iOS","lang":"de-de","id":"xxxxxxxxx","moduleSn":"R351ZEB4Hxxxxxxx","moduleType":1,"operateType":"quietCfg","version":"1.0"}
                    
                    JSON-Nachricht empfangen:/app/1669741nnnnnnnnnnnn/R351ZEB4Hxxxxxxx/thing/property/set:{"params":{"min":0,"taskIndex":1,"taskPrior":0,"sec":0,"timeMode":3,"timeScale":[0,0,0,0,0,0,192,255,255,0,0,0,0,0,0,0,0,0],"day":13,"type":1,"timeParam":1036045,"year":2023,"week":1,"isEnable":1,"month":8,"hour":0,"isCfg":1},"from":"iOS","lang":"de-de","id":"134213505","moduleSn":"R351ZEB4Hxxxxxxx","moduleType":1,"operateType":"taskCfg","version":"1.0"}
                    

                    Laden über Wechselstrom, täglich von 00:00 bis 00:10 ein

                    : JSON-Nachricht empfangen:/app/1669741nnnnnnnnnnnn/R351ZEB4Hxxxxxxx/thing/property/set:{"params":{"min":0,"taskIndex":0,"taskPrior":0,"sec":0,"timeMode":0,"timeScale":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"day":13,"type":0,"timeParam":1036045,"year":2023,"week":1,"isEnable":1,"month":8,"hour":0,"isCfg":1},"from":"iOS","lang":"de-de","id":"381970403","moduleSn":"R351ZEB4Hxxxxxxx","moduleType":1,"operateType":"taskCfg","version":"1.0"}
                    

                    aus

                    JSON-Nachricht empfangen:/app/1669741nnnnnnnnnnnn/R351ZEB4Hxxxxxxx/thing/property/set:{"params":{"min":0,"taskIndex":0,"taskPrior":0,"sec":0,"timeMode":0,"timeScale":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"day":13,"type":0,"timeParam":1036045,"year":2023,"week":1,"isEnable":0,"month":8,"hour":0,"isCfg":1},"from":"iOS","lang":"de-de","id":"475118161","moduleSn":"R351ZEB4Hxxxxxxx","moduleType":1,"operateType":"taskCfg","version":"1.0"}
                    

                    Laden über Solarenergie, täglich von 01:00 bis 01:20 ein

                    JSON-Nachricht empfangen:/app/1669741nnnnnnnnnnnn/R351ZEB4Hxxxxxxx/thing/property/set:{"params":{"min":0,"taskIndex":1,"taskPrior":0,"sec":0,"timeMode":0,"timeScale":[192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"day":13,"type":1,"timeParam":1036045,"year":2023,"week":1,"isEnable":1,"month":8,"hour":0,"isCfg":1},"from":"iOS","lang":"de-de","id":"809540083","moduleSn":"R351ZEB4Hxxxxxxx","moduleType":1,"operateType":"taskCfg","version":"1.0"}
                    

                    aus

                    JSON-Nachricht empfangen:/app/1669741nnnnnnnnnnnn/R351ZEB4Hxxxxxxx/thing/property/set:{"params":{"min":0,"taskIndex":1,"taskPrior":0,"sec":0,"timeMode":0,"timeScale":[192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"day":13,"type":1,"timeParam":1036045,"year":2023,"week":1,"isEnable":0,"month":8,"hour":0,"isCfg":1},"from":"iOS","lang":"de-de","id":"920093803","moduleSn":"R351ZEB4Hxxxxxxx","moduleType":1,"operateType":"taskCfg","version":"1.0"}
                    

                    Entladen über AC-Port, einmal von 2023/8/13 von 02:20

                    JSON-Nachricht empfangen:/app/1669741nnnnnnnnnnnn/R351ZEB4Hxxxxxxx/thing/property/set:{"params":{"min":16,"taskIndex":2,"taskPrior":0,"sec":35,"timeMode":3,"timeScale":[0,192,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],"day":13,"type":2,"timeParam":1036045,"year":2023,"week":1,"isEnable":1,"month":8,"hour":19,"isCfg":1},"from":"iOS","lang":"de-de","id":"75226284","moduleSn":"R351ZEB4Hxxxxxxx","moduleType":1,"operateType":"taskCfg","version":"1.0"}
                    

                    aus

                    JSON-Nachricht empfangen:/app/1669741nnnnnnnnnnnn/R351ZEB4Hxxxxxxx/thing/property/set:{"params":{"min":16,"taskIndex":2,"taskPrior":0,"sec":35,"timeMode":3,"timeScale":[0,192,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],"day":13,"type":2,"timeParam":1036045,"year":2023,"week":1,"isEnable":0,"month":8,"hour":19,"isCfg":1},"from":"iOS","lang":"de-de","id":"171579324","moduleSn":"R351ZEB4Hxxxxxxx","moduleType":1,"operateType":"taskCfg","version":"1.0"}
                    

                    Entladen über 12-V-DC-Port, Wöchentlich, täglich von 03:30 bis 04:40

                     JSON-Nachricht empfangen:/app/1669741nnnnnnnnnnnn/R351ZEB4Hxxxxxxx/thing/property/set:{"params":{"min":0,"taskIndex":3,"taskPrior":0,"sec":0,"timeMode":1,"timeScale":[0,0,224,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"day":31,"type":3,"timeParam":127,"year":0,"week":1,"isEnable":1,"month":3,"hour":0,"isCfg":1},"from":"iOS","lang":"de-de","id":"410094715","moduleSn":"R351ZEB4Hxxxxxxx","moduleType":1,"operateType":"taskCfg","version":"1.0"}
                    

                    aus

                     JSON-Nachricht empfangen:/app/1669741nnnnnnnnnnnn/R351ZEB4Hxxxxxxx/thing/property/set:{"params":{"min":0,"taskIndex":3,"taskPrior":0,"sec":0,"timeMode":1,"timeScale":[0,0,224,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"day":31,"type":3,"timeParam":127,"year":0,"week":1,"isEnable":0,"month":3,"hour":0,"isCfg":1},"from":"iOS","lang":"de-de","id":"495554381","moduleSn":"R351ZEB4Hxxxxxxx","moduleType":1,"operateType":"taskCfg","version":"1.0"}
                    
                    1 Reply Last reply
                    0
                    • W Waly_de

                      @aherby sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:

                      Habe einen Powerstream, zwei PV-Module direkt an der PS angeschlossen, eine Delta 2 Max auch mit zwei angeschlossenen PV-Modulen. Hätte sogar einen Finderzähler, der "live" die Leistungsdaten vom Haus auslesen kann.
                      Würde es auch bedeuten ich müsste an der Stelle:
                      "SmartmeterID: "sonoff.0.Stromzaehler1.MT175_P" trage ich den Namen oder Alias vom Momentanwert vom Zähler ein?

                      richtig... in dem State sollte die live Leistung in Watt abrufbar sein. Wenn der State angegeben ist, fängt das script an zu regeln. Die Prio sollte dabei immer auf "Stromversorgung" stehen, sonst lässt sich die Einspeiseleistung nicht regeln.

                      Und alle Änderungen nehme ich nur im Bereich
                      "********** YOUR DATA HERE ************ " vor,
                      ist das richtigt?
                      Den Offset habe ich noch nicht verstanden

                      Richtig. Offset bestimmt die Zielleistung der Regulation. 50 bedeutet, das Script versucht einen Netzbezug von 50W einzuregeln.

                      Die Werte
                      "InverterHeartbeat.dynamicWatts" und "InverterHeartbeat2.X_Unknown_13"
                      scheinen identisch zu sein.

                      Danke für die Muster! Damit kann ich auf jeden fall schon was machen 🙂

                      A Offline
                      A Offline
                      aherby
                      wrote on last edited by
                      #199

                      @waly_de in welchem Format, Darstellung oder wie auch immer muss der Smartmeter:ID aufweisen und sehe ich das Ergebnis oder den Wert vom Smartmeter irgendwo im Skript oder den Objektdaten

                      1 Reply Last reply
                      0
                      • W Waly_de

                        So, meine Anbindung läuft jetzt seit einigen Tagen sauber. Daher spendiere ich dem Skript mal einen eigenen Thread.

                        Anbei findet ihr ein Skript, das eine Verbindung zwischen euren ecoflow-Geräten und ioBroker herstellen kann. Dabei nutzt es die gleiche Schnittstelle wie die ecoFlow App. Ihr benötigt lediglich eure Zugangsdaten zur App und die Seriennummern eurer Geräte, um dieses Skript nutzen zu können. Alle bekannten übermittelten Daten werden in ioBroker als Zustände angelegt. Viele davon sind noch unbekannt. Wenn ihr herausfindet, was sich hinter den unbekannten Daten verbirgt, kann ich die Zustandsnamen anpassen.

                        Achtung: Der ecoflow-Server sendet unfassbar viele Nachrichten. Wenn ihr mehrere Geräte habt, kann dies euer System stark belasten und sogar zu Abstürzen führen. Vielleicht bekommt Ihr auch diese Meldung und das Script wird beendet:

                         [error]: javascript.0 (5490) Script script.js.EcoFlow is calling setState more than 1000 times per minute! Stopping Script now! Please check your script!
                        

                        Daher empfehle ich, nicht alle Geräte dauerhaft zu abonnieren (dies kann über einen Parameter in der Einstellungssektion festgelegt werden). Es werden nur die PowerStreams benötigt, um die Einspeiseleistung anpassen zu können.
                        Sonst kann dieser Grenzwert aber auch in den Einstellungen der Javascript-Instanz heraufgesetzt werden. 3000 dürfte für die meisten Szenarien reichen. (Siehe Screenshot weiter unten. Der Wert befindet sich unten links)

                        Damit kommen wir zur eigentlichen interessanten Funktion des Skripts:
                        Wenn ihr ein Smartmeter habt, das euren aktuellen Stromverbrauch in Echtzeit anzeigen kann, könnt ihr es an ioBroker anbinden. Informationen dazu findet ihr im Netz.

                        Hier hab ich das Ding gekauft (Wenn ihr über die Links kauft, bekomme ich ein paar Cent Provision ab ;-)):
                        Hichi Wifi, IR Lesekopf für Stromzähler
                        https://ebay.us/3X1pkH
                        Der Verkäufer hat auch ein tolles Video gemacht, wie man es einrichtet 😉

                        Es funktionieren aber auch viele andere Zähler wie z.B.:
                        Der Shelly 3EM

                        Tibber-Kunden mit Pulse empfehle ich die lokale Einbindung des Pulse als Smartmeter mit meinem Script:
                        https://forum.iobroker.net/topic/70758/tibber-pulse-verbrauchsdaten-lokal-auslesen

                        Das Skript passt dann die Einspeiseleistung des PowerStream dynamisch an, sodass möglichst der gesamte Verbrauch durch die Einspeisung gedeckt wird, aber nichts ins Netz verschenkt wird. Erst wenn die Batterie voll geladen ist, wird die gesamte Leistung ins Netz eingespeist (wenn ihr das möchtet).

                        Das Smartmeter muss den aktuellen Verbrauch möglichst in Echtzeit und in der Einheit Watt in einem Objekt von IOBroker zur Verfügung stellen. Im Script muss dann nur noch der Pfad zu diesem Objekt unter "SmartmeterID:" eingetragen werden. Am einfachsten geht das über die Adminoberfläche von IOBroker. Klickt auf Objekte und sucht das Objekt eures Smartmeters mit dem "Watt"-Wert im Objektbaum:
                        Bildschirmfoto 2023-09-04 um 09.55.08.jpg
                        Wenn Ihr auf das markierte Symbol klickt, ist der Pfad in euerer Zwischenablage gespeichert.
                        Jetzt müsst Ihr ihn nur noch hinter "SmartmeterID:" im Script einfügen. Achtet darauf, dass Ihr es zwischen die "" einfügt.
                        Wenn alles geklappt hat, der Pfad stimmt und das Script läuft, solltet Ihr unter Objekte: "0_userdata.0.ecoflow.RealPower" sehen, dass sich dieser Wert regelmäßig anpasst.

                        Es können mehrere PowerStreams konfiguriert werden. Im Moment wird jedoch nur der erste in der Konfiguration gesteuert. Ich habe zum Beispiel zwei PowerStreams, einen mit und einen ohne Batterie. Dadurch steht tagsüber mehr Leistung zum Laden der Batterie zur Verfügung. Die Daten werden vom Skript verwendet, um die optimale Einspeiseleistung zu berechnen. In Zukunft könnten auch mehrere PowerStreams gesteuert werden.

                        Nochmals vielen Dank an alle hier im Forum, die mit Ihrer Arbeit die Anbindung erst möglich gemacht haben!
                        Ursprünglicher Beitrag: https://forum.iobroker.net/topic/54929/adapter-für-ecoflow-einbindung/

                        Wichtig: Zur Installation müssen 2 Module installiert werden. Einfach in den Einstellungen der Javascriptinstanz unter Zusätzliche Module die beiden Namen eintragen und speichern ("mqtt" und "protobufjs")

                        Bildschirmfoto 2023-07-17 um 10.56.49.jpg

                        Erweiterungen:
                        Tibber Modul
                        Kann als eigenes, neues Script neben dem Hauptscript angelegt werden.

                        //*************************************************************
                        // Tibber Modul
                        //*************************************************************
                        // Schaltet die Regelung der Powerstation ab, wenn der Strom billig ist 
                        // und einen beliebigen Schalter zum Aktivieren der AC-Ladung ein, bis die Batterie 
                        // den durch der "BatMax" festgelegten Ladestand in % erreicht hat
                        // 
                        // Diese Parameter aus dem Hauptscript sind wichtig:
                        // RegulationOffPower: -2 // Wird die Regulation per State abgestellt, wird die Einspeiseleistung des ersten Powerstreams auf diesen Wert gesetzt (-1 = keine Änderung, -2 = Batterie Priomodus)
                        // RegulationState: "Regulate" // Erzeugt der State zum Ein und Aus-Schalten der Regulation.
                        //
                        // Das Script versucht selbst die ID's für den TibberStatus und den Batteriestand zu ermitteln.
                        // Wenn das nicht klappt bitte einfach die richtigen ID's hinter "batSocID" und "tibberID" angeben.
                        //
                        //*************************************************************
                        
                        //*************************************************************
                        // Konfiguration laden, wenn nicht im Originalscript eingefügt
                        //*************************************************************
                        var ConfigData = {
                            statesPrefix: '0_userdata.0.ecoflow',
                            RegulationState: "Regulate"
                        }
                        if (typeof ConfigData.email === 'undefined') {
                            try {
                                let tempConfigData = getState("0_userdata.0.ecoflow.Settings.ConfigData").val
                                if (typeof tempConfigData !== 'object' && tempConfigData !== null) {
                                    tempConfigData = JSON.parse(tempConfigData)
                                }
                                if (typeof tempConfigData === 'object' && tempConfigData !== null) {
                                    if (tempConfigData.email !== undefined) {
                                        ConfigData = tempConfigData;
                                        //log("wurde geladen als object")
                                    }
                                }
                            } catch (error) {
                                log("Konfiguration wurde nicht geladen: " + error.message)
                            }
                        }
                        
                        /***************************************
                        **********  YOUR DATA HERE  ************ 
                        ****************************************/
                        var tibberConfig = {
                            BatMax: 99,                                  //Bei diesem Ladestand stoppt die AC-Ladung und das Script wird wieder eingeschaltet 
                            BatMin: 95,                                  //Der Ladestand der Batterie muss kleiner sein als BatMin , damit der Akku per AC-Ladung geladen wird 
                            SwitchID: "sonoff.0.NOUS-DVES_F0A844.POWER", //ID des Schalters, der die AC-Ladung einschaltet. "true" und "false" werden gesetzt
                            LevelToSwitch: [                             //Hier die Werte definieren, bei denen die AC-Ladung eingeschaltet werden soll
                                //"NORMAL",
                                //"CHEAP",                                 //Einkommentieren falls gewüscht 
                                "VERY_CHEAP"
                            ],
                        }
                        //***************************************/
                        // Nur angeben, wenn automatische Ermittlung fehlschlägt
                        //***************************************/
                        let batSocID = getState(ConfigData.statesPrefix + ".Settings.Tibber.tibberBatSocID").val
                        let tibberID = getState(ConfigData.statesPrefix + ".Settings.Tibber.tibberID").val
                        //***************************************/
                        
                        
                        var idOK = false
                        if (!batSocID || !tibberID) {
                            log("Versuche die IDs für Tibber und Batterielevel zu finden")
                            $("tibberlink.*.Homes.*.CurrentPrice.level").each(function (id, i) {
                                tibberID = id
                                createState(ConfigData.statesPrefix + ".Settings.Tibber.tibberID", tibberID, false)
                                log("TibberID gefunden und gespeichert:" + id)
                            })
                            $(ConfigData.statesPrefix + ".app_device_property_*.data.InverterHeartbeat.batSoc").each(function (id, i) {
                                if (getState(id).val > 0) {
                                    batSocID = id
                                    createState(ConfigData.statesPrefix + ".Settings.Tibber.tibberBatSocID", batSocID, false)
                                    log("batSocID gefunden und gespeichert:" + id)
                                }
                            })
                            if (!batSocID || !tibberID) {
                                log("Fehler bei der Ermittlung der IDs. Bitte händisch ins Script eintragen", 'error')
                            } else {
                                idOK = true
                            }
                        } else {
                            idOK = true
                        }
                        if (idOK) {
                            checkTibber()
                            on({ id: tibberID, change: "ne" }, function (obj) {
                                //log("Tibber Modul. tibberID Event:" + obj.state.val)
                                checkTibber()
                            });
                            on({ id: batSocID, change: "ne" }, function (obj) {
                                //log("Tibber Modul. batSocID Event:" + obj.state.val + "%")
                                checkTibber()
                            });
                        }
                        function checkTibber() {
                            if (tibberID && batSocID) {
                                const RegulateID = ConfigData.statesPrefix + "." + ConfigData.RegulationState
                                let priceLevel = getState(tibberID).val;
                                let batsoc = Number(getState(batSocID).val)
                                let OldRegulate = toBoolean(getState(RegulateID).val)
                                //log("Tibber Preislevel: " + priceLevel + " OldRegulate: " + OldRegulate + " batsoc: " + (batsoc))
                                if ((tibberConfig.LevelToSwitch.includes(priceLevel))) {
                                    if (OldRegulate) {
                                        if (batsoc <= tibberConfig.BatMin) {
                                            setState(RegulateID, false);  // Regulierung aus
                                            setState(tibberConfig.SwitchID, true) //Schalter einschalten
                                            log("Script abgeschaltet AC-Ladung Ein, weil priceLevel:" + priceLevel + " batsoc:" + batsoc + "%")
                                        }
                                    } else {
                                        if (batsoc >= tibberConfig.BatMax) {
                                            setState(RegulateID, true);  // Regulierung an
                                            setState(tibberConfig.SwitchID, false) //Schalter ausschalten
                                            log(" Batterie bei BatMax. Script eingeschaltet AC-Ladung Aus. priceLevel:" + priceLevel + " batsoc:" + batsoc + "%")
                                        }
                                    }
                                } else {
                                    if (!OldRegulate) {
                                        setState(RegulateID, true);  // Regulierung an
                                        setState(tibberConfig.SwitchID, false) //Schalter ausschalten
                                        log("Script eingeschaltet AC-Ladung Aus. priceLevel:" + priceLevel + " batsoc:" + batsoc + "%")
                                    }
                                }
                            } else {
                                //log("checkTibber skip. batsocID und/oder tibberID fehlen.")
                            }
                        }
                        //*************************************************************
                        

                        Tibber-Pulse als Smartmeter nutzen und lokal auslesen:
                        https://forum.iobroker.net/topic/70758/tibber-pulse-verbrauchsdaten-lokal-auslesen

                        Unterstütze das Projekt 'ecoflow-connector'
                        Wenn dir das Script zur dynamischen Leistungsanpassung für den IObroker gefällt und du es nützlich findest, ziehe bitte in Erwägung, eine kleine Spende via PayPal zu hinterlassen.
                        Jeder Beitrag hilft, das Projekt am Laufen zu halten und weitere Updates zu ermöglichen.
                        Danke für deine Unterstützung!
                        Jetzt Spenden

                        Dieses Script wird bei Änderungen und Updates immer aktualisiert:
                        Nutzung auf eigene Gefahr !

                        [Bildschirmfoto 2024-03-29 um 09.37.51.jpg

                        • Installation von ioBroker und Skript unter UNRAID in nur 12 Minuten
                        • Video mit Erklärung der Basiskonfiguration
                        • Video mit Erklärung zu AdditionalPower und Überschussladung

                        Download (neues JS-Script in IOBroker anlegen und den Inhalt der Datei einfügen):

                        • ecoflow-connector_v125.txt (13.05.2024)
                        • 1.2.5.f1 Fork von Florian Vogt (25.06.2024)
                          Feature hinzugefügt, um die Größe der Delta-Speicher beim Ausbalancieren der Entladeleistung zu berücksichtigen, damit die Batterien gleichmäßig geleert werden.
                          Parameter battCapacity bei den Einstellungen für PowerStream = Kapazität der angeschlossenen Batterie in kWh, default = 1
                          ecoflow-connector_v125_mod_FV.txt (25.06.2024)

                        ältere Versionen:

                        • ecoflow-connector_v124.txt (22.04.2024)
                        • ecoflow-connector_v123.txt (21.02.2024)
                        • ecoflow-connector_v121_05.01.2024.txt
                        • ecoflow-connector_v12_.04.12.2023.txt
                        • ecoflow-connector_v1162_04.11.2023.txt
                        • ecoflow-connector_v115_02.10.2023.txt
                        • ecoflow-connector_v1142_26.09.2023
                        • ecoflow-connector_v1132_31.08.2023
                        • ecoflow-connector_v112_17.08.2023)
                        A Offline
                        A Offline
                        aherby
                        wrote on last edited by
                        #200

                        @waly_de
                        ich muss doch noch was fragen
                        was wird hier gemeldet?

                        at Timeout._onTimeout (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:2723:34)
                        javascript.0
                        	2023-08-13 20:55:05.445	warn	at Object.<anonymous> (script.js.Ecoflow_Skript_1_0_2_2_1:1344:9)
                        javascript.0
                        	2023-08-13 20:55:05.445	warn	at CheckforReconnect (script.js.Ecoflow_Skript_1_0_2_2_1:1982:16)
                        
                        1 Reply Last reply
                        0
                        • A Offline
                          A Offline
                          aherby
                          wrote on last edited by
                          #201

                          @waly_de
                          Smart Plug Überspannungsschutz auf 2000 und auf 1800 verändert

                           0a3d0a0308d00f1020183520012801380340024889015003580170a2ffcf8207800113880101ba0103696f73ca0110485735325a4448345346363636353845
                          
                          0a3d0a0308880e102018352001280138034002488901500358017095c4d58207800113880101ba0103696f73ca0110485735325a4448345346363636353845
                          

                          Mesh "aus" geschaltet:

                          0a36102018352001280138034002488a01580170e696e68207800113880101ba0103696f73ca0110485735325a4448345346363636353845
                          

                          Mesh "ein" geschaltet

                           0a3c0a020801102018352001280138034002488a015002580170fbd5e98207800113880101ba0103696f73ca0110485735325a4448345346363636353845
                          
                          1 Reply Last reply
                          0
                          • F Offline
                            F Offline
                            funkflash
                            wrote on last edited by
                            #202

                            @waly_de: Vielen Dank für die Mühe. Habe es bei mir als HomeAssistant (Regelung der Delta2 AC Ladung, Vorverarbeitung SmartMeter) / IOBroker (Regelung der AC Einspeisung vom PowerStream) erfolgreich in Betrieb genommen. Habe ich das richtig verstanden:

                            Die Batterieladung wird im Skript ausschließlich via angeschlossener PV Ladung berücksichtigt?
                            Hintergrund: Meine PV Anlage ist nicht via PowerStream ansgeschlossen und AC-Ladung steuere ich deshalb gerade via HomeAssistant Automation auf Basis SmartMeter in Zeiten mit Überschuss.

                            1 Reply Last reply
                            0
                            • D Dreffi

                              @waly_de
                              Zwischenbericht:
                              an und für sich läuft die Steuerung von zwei Powerstreams in meiner jetzigen Konfiguration einwandfrei.
                              Alles was mir noch fehlt:

                              • Umstellung auf Prio Akku bei Erreichen von BatLimitHigh.
                              • Steuerung der weiteren Powerstreams bei vollem/leeren Akku wie auch den ersten (Leistungsbegrenzung und Umstellen der Priorisierung)

                              Einfach volle Pulle einzuspeisen bei vollem Akku missfällt mir. Das geht unnötig auf den Akku. Verschenken des Potentials wäre aber auch schade.

                              Nachtrag:
                              Heute scheint die Sonne reichlich. Ich nutze das um die Trigger zum Umstellen der Priorisierung zu optimieren.
                              Ladegrenze erreicht (SOC = BatLimitHigh) --> stelle auf Prio Akku
                              Tatsächliche Einspeiseleistung fällt einige Zeit deutlich unter Bedarf --> stelle zurück auf Prio Einspeisung. Das sollte sowohl mit fest eingestellter Grundlast als auch mit einem durch das Script gesetzten Bedarf funktionieren. Ich warte hier ab bis der Wert für durchgehend 5 Minuten mindestens 20 W unter den eingestellten Bedarf fällt.

                              Wenn beide Powerstreams dank vollem Akku auf Prio Akku stehen, wird aus dem gesamten System wieder ein normales Balkonkraftwerk, inkl Bezug bei Wolken. Hier muss man entscheiden ob das so wirklich sinnvoll ist. Ich weiß aber nicht ob die aktuelle Regelung (BattPozON/Off) besser funktioniert. Als Kompromiss sehe ich erstmal nur meinen Powerstream für die Grundlast auf Prio Akku zu stellen und den zweiten per Script nach Bedarf regeln zu lassen. Da wird eventuell weiteres PV-Potential verschenkt, aber es erfolgt möglichst kein Bezug.

                              Aktuelles Problem: nachdem zurück auf Einspeisung gestellt wurde, wird der Trigger zum erneuten Umstellen auf Prio Akku (SOC) erstmal nicht mehr erreicht werden. Das funktioniert so nur einmalig. Also wohl doch entweder die aktuelle Regelung beibehalten oder auf Überschusseinspeisung verzichten.

                              So richtig perfekt ist das alles nicht. Ideal wäre wenn Ecoflow einfach im normalen Modus Stromversorgung priorisieren auch den Überschuss mit einspeist. Das extern durch Regelung zu korrigieren ist doof.

                              D Offline
                              D Offline
                              Dreffi
                              wrote on last edited by Dreffi
                              #203

                              @dreffi
                              Ich ergänze mal meine Erfahrungen, denn ich bin weiter davon überzeugt bei vollem Akku auf Prio Akku umzustellen.

                              Das Wichtigste vorweg: die Powerstream schalten beim Umstellen der Priorisierung nahtlos um. Es erfolgt also keine Unterbrechung der Einspeisung.

                              Die Logik dazu sieht wie folgt aus:

                              Der Powerstream, der über dieses Script geregelt wird, lässt sich relativ einfach regeln:
                              permanentWatts = 0 --> setPrio 1 (Akku)
                              batSoc = upperLimit --> setPrio 1 (Akku) ich habe hier statt upperLimit fix den eingestellten Wert von 90 eingetragen
                              permanentWatts > 0 --> setPrio 0 (Einspeisung) ich habe hier als Grenzwert derzeit 100, also 10 W eingestellt

                              Etwas schwieriger fällt mir das zuverlässige Umstellen des Powerstreams mit der festen Einspeiseleistung:
                              batSoc = upperLimit --> setPrio 1 (Akku)
                              jetzt wird's komplexer:
                              Auslöser:
                              Netzbezug > 30 W für 5 Minuten ODER
                              Einspeisung des anderen Powerstreams > 30 W für 5 Minuten ODER
                              eigene Einspeiseleistung < permanentWatts - 10 W
                              Bedingungen:
                              eigene Einspeiseleistung < permanentWatts - 10 W

                              eigene Einspeiseleistung < permanentWatts - 10 W
                              Aktion:
                              setPrio 0 (Einspeisung)

                              Problem: es kann bei einer Wolkenphase von mehr als 5 Minuten dazu kommen, dass auf Prio Einspeisung zurückgestellt wird. Dieser Powerstream arbeitet damit wieder gedrosselt. Gleichzeitig wird der Akku aber nicht ent- und wieder geladen um den Trigger auszulösen.
                              Eventuell ergänze ich das noch mit:
                              Einspeiseleistung > permanentWatts - 10W UND
                              Auswertung des Ladestroms (battInputWatts)

                              Letztere Logik steuere ich über Home Assistant, weil ich nicht weiß wie ich das in ioBroker geregelt bekomme. Diese scheint noch nicht 100% zuverlässig zu arbeiten. Die Stromversorgung läuft allerdings immer noch genau wie sie soll. Ich glaube es liegt am betroffenen Powerstream. Der hatte heute wieder massive Netzwerkprobleme.

                              W 1 Reply Last reply
                              0
                              • M Offline
                                M Offline
                                madjuju
                                wrote on last edited by
                                #204

                                Hello Nice job !

                                L'm in France and we use 'linky'

                                L can get linky data from MQTT.
                                How can l use the value of consummation from my linky instead of SmartmeterID ?

                                W 1 Reply Last reply
                                0
                                • W Offline
                                  W Offline
                                  Waly_de
                                  wrote on last edited by
                                  #205

                                  @aherby sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:

                                  @waly_de in welchem Format, Darstellung oder wie auch immer muss der Smartmeter:ID aufweisen und sehe ich das Ergebnis oder den Wert vom Smartmeter irgendwo im Skript oder den Objektdaten

                                  Danke für die Daten. Leider Hab ich vorerst keine Zeit neue Geräte zu integrieren. Ich hab gerade noch jede Menge Arbeit mit den Regulierungsalgorithmen. Außerdem steht Ende der Woche Urlaub an. Aber ich schau es mir an, sobald ich Gelegenheit dazu habe.

                                  Zu deiner Frage: SmartmeterID ist einfach die ID eines States(Objekts) in IOBroker. In diesem State steht der aktuelle Verbrauch in Watt. Wenn du also irgend ein Smartmeter besitzt, musst du dafür sorgen, dass es Daten an IOBroker sendet. Das geht zum Beispiel per im MQTT. Es soll auch für Anbieter wie Tibber Schnittstellen geben. Ohne Echtzeitdaten zum aktuellen Verbrauch macht das Skript nicht so viel Sinn. Seine Hauptaufgabe ist ja das Regeln der Einspeisung. Eine funktionierende Lösung dazu hab ich in der Beschreibung verlinkt.

                                  1 Reply Last reply
                                  0
                                  • D Dreffi

                                    @dreffi
                                    Ich ergänze mal meine Erfahrungen, denn ich bin weiter davon überzeugt bei vollem Akku auf Prio Akku umzustellen.

                                    Das Wichtigste vorweg: die Powerstream schalten beim Umstellen der Priorisierung nahtlos um. Es erfolgt also keine Unterbrechung der Einspeisung.

                                    Die Logik dazu sieht wie folgt aus:

                                    Der Powerstream, der über dieses Script geregelt wird, lässt sich relativ einfach regeln:
                                    permanentWatts = 0 --> setPrio 1 (Akku)
                                    batSoc = upperLimit --> setPrio 1 (Akku) ich habe hier statt upperLimit fix den eingestellten Wert von 90 eingetragen
                                    permanentWatts > 0 --> setPrio 0 (Einspeisung) ich habe hier als Grenzwert derzeit 100, also 10 W eingestellt

                                    Etwas schwieriger fällt mir das zuverlässige Umstellen des Powerstreams mit der festen Einspeiseleistung:
                                    batSoc = upperLimit --> setPrio 1 (Akku)
                                    jetzt wird's komplexer:
                                    Auslöser:
                                    Netzbezug > 30 W für 5 Minuten ODER
                                    Einspeisung des anderen Powerstreams > 30 W für 5 Minuten ODER
                                    eigene Einspeiseleistung < permanentWatts - 10 W
                                    Bedingungen:
                                    eigene Einspeiseleistung < permanentWatts - 10 W

                                    eigene Einspeiseleistung < permanentWatts - 10 W
                                    Aktion:
                                    setPrio 0 (Einspeisung)

                                    Problem: es kann bei einer Wolkenphase von mehr als 5 Minuten dazu kommen, dass auf Prio Einspeisung zurückgestellt wird. Dieser Powerstream arbeitet damit wieder gedrosselt. Gleichzeitig wird der Akku aber nicht ent- und wieder geladen um den Trigger auszulösen.
                                    Eventuell ergänze ich das noch mit:
                                    Einspeiseleistung > permanentWatts - 10W UND
                                    Auswertung des Ladestroms (battInputWatts)

                                    Letztere Logik steuere ich über Home Assistant, weil ich nicht weiß wie ich das in ioBroker geregelt bekomme. Diese scheint noch nicht 100% zuverlässig zu arbeiten. Die Stromversorgung läuft allerdings immer noch genau wie sie soll. Ich glaube es liegt am betroffenen Powerstream. Der hatte heute wieder massive Netzwerkprobleme.

                                    W Offline
                                    W Offline
                                    Waly_de
                                    wrote on last edited by
                                    #206

                                    @dreffi Danke für den Input... das ist sehr hilfreich. Einiges davon hab ich ja schon verwertet. 😉

                                    1 Reply Last reply
                                    0
                                    • M madjuju

                                      Hello Nice job !

                                      L'm in France and we use 'linky'

                                      L can get linky data from MQTT.
                                      How can l use the value of consummation from my linky instead of SmartmeterID ?

                                      W Offline
                                      W Offline
                                      Waly_de
                                      wrote on last edited by
                                      #207

                                      @madjuju if you get the data from your electricity meter via MQTT, you can easily integrate it into IOBroker. There is an MQTT adapter for IOBroker. It can be set up as a MQTT host as well as a client. Once the data is available in IOBroker the script can easily work with it.

                                      M 1 Reply Last reply
                                      0
                                      • W Waly_de

                                        @madjuju if you get the data from your electricity meter via MQTT, you can easily integrate it into IOBroker. There is an MQTT adapter for IOBroker. It can be set up as a MQTT host as well as a client. Once the data is available in IOBroker the script can easily work with it.

                                        M Offline
                                        M Offline
                                        madjuju
                                        wrote on last edited by
                                        #208

                                        @waly_de
                                        Thank you very much for this first encouraging reply.

                                        Will I have to change your script? I'm not a computer scientist. It's complicated for me.
                                        Yes, I can retrieve the called power in volts amperes via mqtt. An intier
                                        If value = 0 then no consumption
                                        if the value > 0 then consumption.
                                        If you could be so kind as to guide me, I'd be very grateful.

                                        W 1 Reply Last reply
                                        0
                                        • M madjuju

                                          @waly_de
                                          Thank you very much for this first encouraging reply.

                                          Will I have to change your script? I'm not a computer scientist. It's complicated for me.
                                          Yes, I can retrieve the called power in volts amperes via mqtt. An intier
                                          If value = 0 then no consumption
                                          if the value > 0 then consumption.
                                          If you could be so kind as to guide me, I'd be very grateful.

                                          W Offline
                                          W Offline
                                          Waly_de
                                          wrote on last edited by
                                          #209

                                          @madjuju I'm afraid that's a bit beyond the scope here. I suggest you start with the basics of IOBroker and set up everything so that the consumption data (real-time power in watts) are available in IOBroker. If you still have questions about the setup of the script, I will be happy to help.

                                          A 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          329

                                          Online

                                          32.4k

                                          Users

                                          81.4k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe