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.7k 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.
  • X xfirf

    Irgendwie stehe ich auf dem Schlauch:
    Wo finde ich denn die einzelnen Watt-Werte der beiden Solareingänge des Powerstream? Ich würde sie gerne in den History-Adapter aufnehmen um mir Grafen dafür zu bauen. Ich finde ähnliche Werte aber die sind um Faktor 10 zu hoch?

    Die Summe habe ich gefunden: ecoflow.totalPV

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

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

    Irgendwie stehe ich auf dem Schlauch:
    Wo finde ich denn die einzelnen Watt-Werte der beiden Eingänge des Powerstream? Ich würde sie gerne in den History-Adapter aufnehmen um mir Grafen dafür zu bauen. Die Summe habe ich gefunden: ecoflow.totalPV

    0_userdata.0.ecoflow.app_device_property_HWXXXXXXXXXXXXXXXX.data.InverterHeartbeat.pv1InputWatts
    0_userdata.0.ecoflow.app_device_property_HWXXXXXXXXXXXXXXXX.data.InverterHeartbeat.pv2InputWatts
    

    Die Werte weichen etwas von denen der App ab. Man kann aber damit gut arbeiten. Du musst diesen Wert nur durch 10 teilen.

    X 1 Reply Last reply
    1
    • W Waly_de

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

      Irgendwie stehe ich auf dem Schlauch:
      Wo finde ich denn die einzelnen Watt-Werte der beiden Eingänge des Powerstream? Ich würde sie gerne in den History-Adapter aufnehmen um mir Grafen dafür zu bauen. Die Summe habe ich gefunden: ecoflow.totalPV

      0_userdata.0.ecoflow.app_device_property_HWXXXXXXXXXXXXXXXX.data.InverterHeartbeat.pv1InputWatts
      0_userdata.0.ecoflow.app_device_property_HWXXXXXXXXXXXXXXXX.data.InverterHeartbeat.pv2InputWatts
      

      Die Werte weichen etwas von denen der App ab. Man kann aber damit gut arbeiten. Du musst diesen Wert nur durch 10 teilen.

      X Offline
      X Offline
      xfirf
      wrote on last edited by
      #182

      @waly_de
      Ah okay. Vielen Dank.
      Dann schaue ich mal ob ich das mit dem Multiplyer in flot abgebildet bekomme.

      1 Reply Last reply
      0
      • W Waly_de

        @ponti92 war die Delta denn noch über die App erreichbar? Auch mit WLAN und nicht per Bluetooth?

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

        @waly_de
        Das weiß ich leider nicht mehr, ich schaue beim nächsten Mal drauf.

        Edit:
        Gerade ist sie in iobroker auf 0 Prozent, aber in der App sehe ich das wlan Symbol und die aktuelle Ladung.
        IMG_1915.png IMG_1914.png

        W 1 Reply Last reply
        0
        • P Ponti92

          @waly_de
          Das weiß ich leider nicht mehr, ich schaue beim nächsten Mal drauf.

          Edit:
          Gerade ist sie in iobroker auf 0 Prozent, aber in der App sehe ich das wlan Symbol und die aktuelle Ladung.
          IMG_1915.png IMG_1914.png

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

          @ponti92 die Batterie ist leer und darum stellt die Delta vermutlich alle Aktivitäten ein... stell besser die Ladeuntergrenze höher ein...

          P D 2 Replies Last reply
          0
          • W Waly_de

            @ponti92 die Batterie ist leer und darum stellt die Delta vermutlich alle Aktivitäten ein... stell besser die Ladeuntergrenze höher ein...

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

            @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..
            A W 2 Replies Last reply
            0
            • 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..
              A Offline
              A Offline
              aherby
              wrote on last edited by
              #186

              @ponti92 Welche Firmware-Versionen hast du installiert oder auch ggf. mal die App erneuert?
              Dann gab es bei mir auch neue Firmware-Versionen für den Powerstream, Delta 2 Max und Smart Plugs.
              Bei Ecoflow im Forum oder wie auch immer es an der Stelle heißt wurde die Probleme auch beschrieben und angeblich soll ein Update helfen.
              Diese Probleme hatte ich nicht wirklich.

              Aktuell habe ich:
              Powerstream : V1.0.0.154 V1.1.3.31 (WLAN)

              Delta 2 Max: V1.0.0.107 V1.0.0.44 (WLAN)

              Smart Plugs: V2.0.3.41 (WLAN)

              P 1 Reply Last reply
              0
              • A aherby

                @ponti92 Welche Firmware-Versionen hast du installiert oder auch ggf. mal die App erneuert?
                Dann gab es bei mir auch neue Firmware-Versionen für den Powerstream, Delta 2 Max und Smart Plugs.
                Bei Ecoflow im Forum oder wie auch immer es an der Stelle heißt wurde die Probleme auch beschrieben und angeblich soll ein Update helfen.
                Diese Probleme hatte ich nicht wirklich.

                Aktuell habe ich:
                Powerstream : V1.0.0.154 V1.1.3.31 (WLAN)

                Delta 2 Max: V1.0.0.107 V1.0.0.44 (WLAN)

                Smart Plugs: V2.0.3.41 (WLAN)

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

                @aherby welche Ladegrenzen hast du eingestellt?
                Bei mir ist die FW aktuell, bis auf die plugs, da ich diese noch nicht im Einsatz habe.. sie liegen hier rum, aber durch das Skript brauche ich sie noch nicht 🙂

                1 Reply Last reply
                0
                • W Waly_de

                  @ponti92 die Batterie ist leer und darum stellt die Delta vermutlich alle Aktivitäten ein... stell besser die Ladeuntergrenze höher ein...

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

                  @waly_de
                  Gibt es schon Pläne die Steuerung auf mehrere Powerstreams zu erweitern?
                  Aktuell stehe ich vor der Frage welchen Powerstream ich durch das Script regeln lasse und welchen ich "dumm" steuere.

                  W 1 Reply Last reply
                  0
                  • D Dreffi

                    @waly_de
                    Gibt es schon Pläne die Steuerung auf mehrere Powerstreams zu erweitern?
                    Aktuell stehe ich vor der Frage welchen Powerstream ich durch das Script regeln lasse und welchen ich "dumm" steuere.

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

                    @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 1 Reply Last reply
                    0
                    • 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
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          701

                                          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