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.0k

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

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

ecoflow-connector-Script zur dynamischen Leistungsanpassung

ecoflow-connector-Script zur dynamischen Leistungsanpassung

Scheduled Pinned Locked Moved JavaScript
1.6k Posts 127 Posters 741.3k 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.
  • umeleU umele

    Ich brauche bitte auch noch mal Hilfe.

    • Das Script Version 1.1.4 läuft auf einem Raspi 4.
    • Ein PowerStream mit Delta Pro und Zusatzakku.
    • RealPower wird korrekt angelegt. History aktiv.
    • 0_userdata.0.ecoflow.app_device_property_HW51ZOxxxxxxxxxxxx.data.InverterHeartbeat.batSoc ist auch nach mehreren Stunden noch auf "0" und entsprechend bekomme ich auch die Nachricht "Batteriestand unter Limit" => entsprechend ist SetAC auch immer = 0
    • Die Kommunikation an sich klappt - wenn ich die Einspeisung in der App manuell auf z.B. 200 Watt stelle, ist sie eine Minute später wieder auf 0...

    Was kann ich noch nachprüfen?
    raspi batsoc.png
    raspi 1.png

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

    @umele das sieht nach Kommunikationsproblemen zwischen PS und Delta aus. Der Wert batSoc wird selten, u.U. nur nach Änderung aktualisiert. Das kann also etwas dauern. Wenn er aber immer auf 0 steht, stimmt da was auf der EcoFlow Seite nicht.

    Die PS muss mit dem Eingang 1 der Delta verbunden sein, der Zusatzakku mit Eingang 2.

    umeleU 1 Reply Last reply
    0
    • W Waly_de

      @umele das sieht nach Kommunikationsproblemen zwischen PS und Delta aus. Der Wert batSoc wird selten, u.U. nur nach Änderung aktualisiert. Das kann also etwas dauern. Wenn er aber immer auf 0 steht, stimmt da was auf der EcoFlow Seite nicht.

      Die PS muss mit dem Eingang 1 der Delta verbunden sein, der Zusatzakku mit Eingang 2.

      umeleU Offline
      umeleU Offline
      umele
      wrote on last edited by
      #560

      @waly_de Danke für die schnelle Antwort. Habe gleich mal die Ports geprüft - sieht so aus, als wäre der Zusatzakku auf Port 1. Ich änder das gleich mal und melde mich wieder.
      Delta Ports.jpg

      umeleU 1 Reply Last reply
      0
      • umeleU umele

        @waly_de Danke für die schnelle Antwort. Habe gleich mal die Ports geprüft - sieht so aus, als wäre der Zusatzakku auf Port 1. Ich änder das gleich mal und melde mich wieder.
        Delta Ports.jpg

        umeleU Offline
        umeleU Offline
        umele
        wrote on last edited by
        #561

        @Waly_de - passt 👍
        Vielen lieben Dank!!

        Das bedeutet dann im Umkehrschluss wohl, dass nur Port 1 ein "echter" Kommunikationsport ist - richtig? Dann muss ich bei einem Firmware-Update PowerStream und Zusatzakku kurzfristig wieder tauschen?

        Super Arbeit!!

        1 Reply Last reply
        0
        • W Waly_de

          @pasch Ich denke du hast mitgelesen?
          Bitte prüfe noch mal ob Du den History-Adapter installiert hast und dieses auch läuft.

          P Offline
          P Offline
          pasch
          wrote on last edited by
          #562

          @waly_de Danke das du mich noch mal mit der Nase darauf gestoßen hast. 🙂
          Das war auch bei mir die Lösung. Ich hatte es nicht mit meinem Problem in Verbindung gebracht, weil ich keine Fehlermeldung in dieser Richtung bekommen hatte.

          1 Reply Last reply
          0
          • K Offline
            K Offline
            kaiausBrieselang
            wrote on last edited by
            #563

            Hallo,
            ich habe mal eine Verständnisfrage:
            wozu benötige ich die Parameter:
            lowBatLimitPozOn: 30,
            lowBatLimitPozOff:40,
            lowBatLimit: 150,

            Bei mir wird der Akku bis zum letzten % "leer" gezogen. Ich hätte erwartet, dass zumindest ab 30% "nur" noch auf 150W reduziert wird. Das klappt bei mir gar nicht.
            Aber ich verstehe auch den Hintergrund nicht so ganz. Warum sollte ich "kurz vor Leer" die Ausgabeleistung "nur" auf 150W (oder einen beliebigen Wert) reduzieren. Entweder ich möchte die volle benötigte Leistung bis zur definierten Restladung haben oder nicht, aber was bringt eine reduzierte Abgabe?
            Vielleicht verstehe ich das auch nicht richtig.

            Dann habe ich noch eine weitere Frage.
            Der Ladestand der Batterie wird ja hier angezeigt:
            0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_bmsStatus.f32ShowSoc
            0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_bmsStatus.soc
            0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_emsStatus.f32LcdShowSoc
            0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_emsStatus.lcdShowSoc

            Aber um an die Werte heran zu kommen muss ich ja den D2M abfragen. Das wiederum erzeugt ja viel Datenstrom.
            In den Einstellungen des PS in der APP wird ja auch der Batteriestand angezeigt.
            Finde ich vielleicht den Wert irgendwo versteckt in den "userdaten" wieder ohne de D2M abzufragen?

            vielen Lieben Dank für eure Hilfe.
            Und vor allen für das tolle Script.

            gruß Kai

            P 1 Reply Last reply
            0
            • K kaiausBrieselang

              Hallo,
              ich habe mal eine Verständnisfrage:
              wozu benötige ich die Parameter:
              lowBatLimitPozOn: 30,
              lowBatLimitPozOff:40,
              lowBatLimit: 150,

              Bei mir wird der Akku bis zum letzten % "leer" gezogen. Ich hätte erwartet, dass zumindest ab 30% "nur" noch auf 150W reduziert wird. Das klappt bei mir gar nicht.
              Aber ich verstehe auch den Hintergrund nicht so ganz. Warum sollte ich "kurz vor Leer" die Ausgabeleistung "nur" auf 150W (oder einen beliebigen Wert) reduzieren. Entweder ich möchte die volle benötigte Leistung bis zur definierten Restladung haben oder nicht, aber was bringt eine reduzierte Abgabe?
              Vielleicht verstehe ich das auch nicht richtig.

              Dann habe ich noch eine weitere Frage.
              Der Ladestand der Batterie wird ja hier angezeigt:
              0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_bmsStatus.f32ShowSoc
              0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_bmsStatus.soc
              0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_emsStatus.f32LcdShowSoc
              0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_emsStatus.lcdShowSoc

              Aber um an die Werte heran zu kommen muss ich ja den D2M abfragen. Das wiederum erzeugt ja viel Datenstrom.
              In den Einstellungen des PS in der APP wird ja auch der Batteriestand angezeigt.
              Finde ich vielleicht den Wert irgendwo versteckt in den "userdaten" wieder ohne de D2M abzufragen?

              vielen Lieben Dank für eure Hilfe.
              Und vor allen für das tolle Script.

              gruß Kai

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

              @kaiausbrieselang ja das geht auch über

              *.data.InverterHeartbeat.batSoc
              
              K 1 Reply Last reply
              0
              • P Offline
                P Offline
                pasch
                wrote on last edited by
                #565

                Läuft super bisher. 🙂

                Mir ist aufgefallen, dass "Other Loads" bei mir oft um 1-3 Watt schwankt. Gibt es die Möglichkeit zu sagen, nur bei Änderungen größer X den neuen Wert setzten? In den Einstellungen habe ich nichts gefunden.

                Grüße
                Patrick

                1 Reply Last reply
                0
                • R Offline
                  R Offline
                  resilient
                  wrote on last edited by
                  #566

                  Gestern Abend ist mir was aufgefallen, das eventuell noch ein Bug sein könnte. Der erste PS mit Speicher war leer und der 2. hatte noch 60% aber das Script wollte/konnte
                  dem 2. PS die angeforderte Leistung nicht zuweisen er wollte immer den ersten bei dem die Batterie bereits leer war. Half nur das script zu stoppen und es manuell über die app zu machen.
                  Aber ansonsten läuft die Regelung ziemlich gut auch bei Echtzeit-Regelung.

                  1 Reply Last reply
                  0
                  • P Ponti92

                    @kaiausbrieselang ja das geht auch über

                    *.data.InverterHeartbeat.batSoc
                    
                    K Offline
                    K Offline
                    kaiausBrieselang
                    wrote on last edited by
                    #567

                    @ponti92
                    wieder was gelernt 🙂
                    Danke dir!!

                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      sirdir
                      wrote on last edited by sirdir
                      #568

                      Hm, das neue Script funktioniert für mich nicht. Es regelt überhaupt nichts. Der Debug Modus gibt leider auch keine sinnvollen Meldungen mehr aus sondern im Prinzip nur MQTT geschnatter. Disregard, beim cut&paste ist bei der Smartmeter ID was schief gegangen.

                      1 Reply Last reply
                      0
                      • umeleU Offline
                        umeleU Offline
                        umele
                        wrote on last edited by
                        #569

                        Hallo zusammen,

                        Ich habe mal für mich selber zusätzlich zum Script mit Blockly was entworfen, was mir erlaubt, den täglichen Strombezug vom Netz zu monitoren.
                        blockly Strombezug.png

                        Die dafür nötigen Objekte habe ich manuell erstellt:
                        neue Objekte.png

                        Falls das interessant erscheint - vielleicht mag ja jemand das ins Script integrieren?

                        1 Reply Last reply
                        0
                        • umeleU Offline
                          umeleU Offline
                          umele
                          wrote on last edited by umele
                          #570

                          Hallo zusammen,

                          Das Script läuft bei mir inzwischen reibungslos - vielen Dank @Waly_de für die super Arbeit!

                          Ich möchte "lowBatLimitPozOn" von der Wettervorhersage abhängig machen.
                          Wenn der kommende Tag sonnig wird, dann soll lowBatLimitPozOn = 10 sein, sonst lowBatLimitPozOn = 30 (möchte genügend Reserve für Stromausfälle behalten).
                          Die Wettervorhersage bekomme ich vom Adapter "DasWetter". Über die Objekte

                          • daswetter.0.NextDays.Location_1.Day_1.Wetter_Symbol_id

                          und

                          • daswetter.0.NextDays.Location_1.Day_1.Wetter_Symbol_id2

                          kommt die Info, ob Vormittag, bzw. Nachmittag sonnig werden.

                          Darauf basierend habe ich ein Objekt ("AkkuReserve") erstellt, das den gewünschten Wert für lowBatLimitPozOn enthält.

                          "AkkuReserve" soll an lowBatLimitPozOn übergeben werden.

                          Leider kann ich wirklich kein JavaScript...
                          Kann mir bitte jemand dabei helfen?
                          7535bac0-4d05-422e-a372-1de59c654df7-image.png

                          Vielen Dank!

                          W 1 Reply Last reply
                          0
                          • umeleU umele

                            Hallo zusammen,

                            Das Script läuft bei mir inzwischen reibungslos - vielen Dank @Waly_de für die super Arbeit!

                            Ich möchte "lowBatLimitPozOn" von der Wettervorhersage abhängig machen.
                            Wenn der kommende Tag sonnig wird, dann soll lowBatLimitPozOn = 10 sein, sonst lowBatLimitPozOn = 30 (möchte genügend Reserve für Stromausfälle behalten).
                            Die Wettervorhersage bekomme ich vom Adapter "DasWetter". Über die Objekte

                            • daswetter.0.NextDays.Location_1.Day_1.Wetter_Symbol_id

                            und

                            • daswetter.0.NextDays.Location_1.Day_1.Wetter_Symbol_id2

                            kommt die Info, ob Vormittag, bzw. Nachmittag sonnig werden.

                            Darauf basierend habe ich ein Objekt ("AkkuReserve") erstellt, das den gewünschten Wert für lowBatLimitPozOn enthält.

                            "AkkuReserve" soll an lowBatLimitPozOn übergeben werden.

                            Leider kann ich wirklich kein JavaScript...
                            Kann mir bitte jemand dabei helfen?
                            7535bac0-4d05-422e-a372-1de59c654df7-image.png

                            Vielen Dank!

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

                            @umele hehe das ist eine tolle Idee 👍😊

                            Vorschlag: wenn du schon ein Objekt selbst anlegst, dann scheib doch da den gewünschten wert für dein Limit rein, und wir ersetzen die entsprechende Variable im Script mit diesem Object…

                            umeleU 1 Reply Last reply
                            0
                            • W Waly_de

                              @umele hehe das ist eine tolle Idee 👍😊

                              Vorschlag: wenn du schon ein Objekt selbst anlegst, dann scheib doch da den gewünschten wert für dein Limit rein, und wir ersetzen die entsprechende Variable im Script mit diesem Object…

                              umeleU Offline
                              umeleU Offline
                              umele
                              wrote on last edited by
                              #572

                              @waly_de - bist ein Schatz 🙂

                              Ich habe es für mich jetzt erst mal so probiert - hoffe, damit zerschiesse ich mir das Script nicht:

                              59c8603e-858d-41b1-a3bf-417a2e9e9b7f-image.png

                              W 1 Reply Last reply
                              0
                              • umeleU umele

                                @waly_de - bist ein Schatz 🙂

                                Ich habe es für mich jetzt erst mal so probiert - hoffe, damit zerschiesse ich mir das Script nicht:

                                59c8603e-858d-41b1-a3bf-417a2e9e9b7f-image.png

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

                                @umele das könnte gehen, allerdings greift das nur beim starten des Scripts und nicht während der Laufzeit.

                                Ich hab mir dazu was flexibles überlegt, das ich auch in die nächste Version fest einbaue.
                                Damit kann man das easy für jeden Punkt der Config machen und es ist auch während der Laufzeit alles änderbar:

                                Füge das hier unmittelbar nach der "ConfigData" definition ein:

                                //  EXTERNE STATES zum Manipulieren von Configurationsvariablen 
                                var externConfig = [
                                    //############# Diesen Abschnitt für jeden einzelne Wert anlegen ################
                                    {
                                        VarName: "seriennummern[0].lowBatLimitPozOn",       //Variabelname aus "ConfigData" bei Aufzählungen [0...X] in der Reigenfolge der Angaben 
                                        id: "0_userdata.0.ecoflow.ExStateTest"              //Das Objekt (State) das den Wert für diese variable enthalten soll 
                                    },
                                    //#######################################################################
                                ];
                                //#######################################################################
                                
                                // Funktion zum Setzen einer verschachtelten Eigenschaft in einem Objekt
                                function setNestedProperty(obj, path, value) {
                                    let keys = path.split('.');
                                    let lastKey = keys.pop();
                                    let tempObj = obj;
                                
                                    keys.forEach(key => {
                                        if (key.match(/\[\d+\]/)) {
                                            let index = parseInt(key.match(/\[(\d+)\]/)[1]);
                                            key = key.split('[')[0];
                                            tempObj = tempObj[key][index];
                                        } else {
                                            tempObj = tempObj[key];
                                        }
                                    });
                                
                                    tempObj[lastKey] = value;
                                }
                                
                                function setConfigValueFromId(VarName, id) {
                                    if (isState2(id)) {
                                        let value = getState(id).val;  // Wert von ioBroker abrufen
                                        setNestedProperty(ConfigData, VarName, value);  // Wert in ConfigData setzen
                                    }
                                }
                                
                                // Initialisierung bei Programmstart
                                externConfig.forEach(config => {
                                    setConfigValueFromId(config.VarName, config.id);
                                });
                                
                                // Änderungen während der Laufzeit überwachen
                                externConfig.forEach(config => {
                                    if (isState2(config.id)) {
                                        on(config.id, function (obj) {
                                            setConfigValueFromId(config.VarName, obj.id);
                                            //log("ExternesEvent:" + obj.id + " : " + config.VarName + ":" + obj.state.val)
                                        });
                                    }
                                });
                                //#######################################################################
                                
                                

                                solle sich selbst erklären 😉

                                umeleU 2 Replies Last reply
                                0
                                • W Waly_de

                                  @umele das könnte gehen, allerdings greift das nur beim starten des Scripts und nicht während der Laufzeit.

                                  Ich hab mir dazu was flexibles überlegt, das ich auch in die nächste Version fest einbaue.
                                  Damit kann man das easy für jeden Punkt der Config machen und es ist auch während der Laufzeit alles änderbar:

                                  Füge das hier unmittelbar nach der "ConfigData" definition ein:

                                  //  EXTERNE STATES zum Manipulieren von Configurationsvariablen 
                                  var externConfig = [
                                      //############# Diesen Abschnitt für jeden einzelne Wert anlegen ################
                                      {
                                          VarName: "seriennummern[0].lowBatLimitPozOn",       //Variabelname aus "ConfigData" bei Aufzählungen [0...X] in der Reigenfolge der Angaben 
                                          id: "0_userdata.0.ecoflow.ExStateTest"              //Das Objekt (State) das den Wert für diese variable enthalten soll 
                                      },
                                      //#######################################################################
                                  ];
                                  //#######################################################################
                                  
                                  // Funktion zum Setzen einer verschachtelten Eigenschaft in einem Objekt
                                  function setNestedProperty(obj, path, value) {
                                      let keys = path.split('.');
                                      let lastKey = keys.pop();
                                      let tempObj = obj;
                                  
                                      keys.forEach(key => {
                                          if (key.match(/\[\d+\]/)) {
                                              let index = parseInt(key.match(/\[(\d+)\]/)[1]);
                                              key = key.split('[')[0];
                                              tempObj = tempObj[key][index];
                                          } else {
                                              tempObj = tempObj[key];
                                          }
                                      });
                                  
                                      tempObj[lastKey] = value;
                                  }
                                  
                                  function setConfigValueFromId(VarName, id) {
                                      if (isState2(id)) {
                                          let value = getState(id).val;  // Wert von ioBroker abrufen
                                          setNestedProperty(ConfigData, VarName, value);  // Wert in ConfigData setzen
                                      }
                                  }
                                  
                                  // Initialisierung bei Programmstart
                                  externConfig.forEach(config => {
                                      setConfigValueFromId(config.VarName, config.id);
                                  });
                                  
                                  // Änderungen während der Laufzeit überwachen
                                  externConfig.forEach(config => {
                                      if (isState2(config.id)) {
                                          on(config.id, function (obj) {
                                              setConfigValueFromId(config.VarName, obj.id);
                                              //log("ExternesEvent:" + obj.id + " : " + config.VarName + ":" + obj.state.val)
                                          });
                                      }
                                  });
                                  //#######################################################################
                                  
                                  

                                  solle sich selbst erklären 😉

                                  umeleU Offline
                                  umeleU Offline
                                  umele
                                  wrote on last edited by
                                  #574

                                  @waly_de - super Danke!! 😊 😊 👍 👍

                                  1 Reply Last reply
                                  0
                                  • W Waly_de

                                    @umele das könnte gehen, allerdings greift das nur beim starten des Scripts und nicht während der Laufzeit.

                                    Ich hab mir dazu was flexibles überlegt, das ich auch in die nächste Version fest einbaue.
                                    Damit kann man das easy für jeden Punkt der Config machen und es ist auch während der Laufzeit alles änderbar:

                                    Füge das hier unmittelbar nach der "ConfigData" definition ein:

                                    //  EXTERNE STATES zum Manipulieren von Configurationsvariablen 
                                    var externConfig = [
                                        //############# Diesen Abschnitt für jeden einzelne Wert anlegen ################
                                        {
                                            VarName: "seriennummern[0].lowBatLimitPozOn",       //Variabelname aus "ConfigData" bei Aufzählungen [0...X] in der Reigenfolge der Angaben 
                                            id: "0_userdata.0.ecoflow.ExStateTest"              //Das Objekt (State) das den Wert für diese variable enthalten soll 
                                        },
                                        //#######################################################################
                                    ];
                                    //#######################################################################
                                    
                                    // Funktion zum Setzen einer verschachtelten Eigenschaft in einem Objekt
                                    function setNestedProperty(obj, path, value) {
                                        let keys = path.split('.');
                                        let lastKey = keys.pop();
                                        let tempObj = obj;
                                    
                                        keys.forEach(key => {
                                            if (key.match(/\[\d+\]/)) {
                                                let index = parseInt(key.match(/\[(\d+)\]/)[1]);
                                                key = key.split('[')[0];
                                                tempObj = tempObj[key][index];
                                            } else {
                                                tempObj = tempObj[key];
                                            }
                                        });
                                    
                                        tempObj[lastKey] = value;
                                    }
                                    
                                    function setConfigValueFromId(VarName, id) {
                                        if (isState2(id)) {
                                            let value = getState(id).val;  // Wert von ioBroker abrufen
                                            setNestedProperty(ConfigData, VarName, value);  // Wert in ConfigData setzen
                                        }
                                    }
                                    
                                    // Initialisierung bei Programmstart
                                    externConfig.forEach(config => {
                                        setConfigValueFromId(config.VarName, config.id);
                                    });
                                    
                                    // Änderungen während der Laufzeit überwachen
                                    externConfig.forEach(config => {
                                        if (isState2(config.id)) {
                                            on(config.id, function (obj) {
                                                setConfigValueFromId(config.VarName, obj.id);
                                                //log("ExternesEvent:" + obj.id + " : " + config.VarName + ":" + obj.state.val)
                                            });
                                        }
                                    });
                                    //#######################################################################
                                    
                                    

                                    solle sich selbst erklären 😉

                                    umeleU Offline
                                    umeleU Offline
                                    umele
                                    wrote on last edited by umele
                                    #575

                                    @waly_de - gerade getestet. Bekomme diese Fehler:
                                    95c9f581-6368-4ac9-90e4-032f6a02e043-image.png

                                    Weil mein Objekt eine andere ID hat, habe ich die für den Test im Script angepasst:
                                    9faaa1f3-0ceb-48b1-a25e-b535b86054b4-image.png

                                    In Zeile 282 und 283 steht das hier:
                                    6b4ad1f8-ddef-45a0-ac6f-a44a841c8838-image.png

                                    Zeile 2513 gibt es gar nicht:
                                    7e532ff0-f540-4923-9762-ada27f1fcfdd-image.png

                                    W 1 Reply Last reply
                                    0
                                    • umeleU umele

                                      @waly_de - gerade getestet. Bekomme diese Fehler:
                                      95c9f581-6368-4ac9-90e4-032f6a02e043-image.png

                                      Weil mein Objekt eine andere ID hat, habe ich die für den Test im Script angepasst:
                                      9faaa1f3-0ceb-48b1-a25e-b535b86054b4-image.png

                                      In Zeile 282 und 283 steht das hier:
                                      6b4ad1f8-ddef-45a0-ac6f-a44a841c8838-image.png

                                      Zeile 2513 gibt es gar nicht:
                                      7e532ff0-f540-4923-9762-ada27f1fcfdd-image.png

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

                                      @umele hmmm guck noch mal, ob du es an der richtigen Stelle eingefügt hast. Es muss hinter der. Letzten }; der ConfigData Definition eingesetzt werden

                                      umeleU 1 Reply Last reply
                                      0
                                      • W Waly_de

                                        @umele hmmm guck noch mal, ob du es an der richtigen Stelle eingefügt hast. Es muss hinter der. Letzten }; der ConfigData Definition eingesetzt werden

                                        umeleU Offline
                                        umeleU Offline
                                        umele
                                        wrote on last edited by umele
                                        #577

                                        Hab ich - hier ist der Code bis zum Ende des neuen Codes von config-date bis zum Ende des neuen Codes:

                                        var ConfigData = {
                                            email: "xxxxxx@gmail.com",                             // Die App-Zugangsdaten von ecoFlow
                                            passwort: "yyyyyyyyyy",
                                            SmartmeterID: "sonoff.0.Stromzaehler.SENSOR.E320.Power_in",     // State, der den aktuellen Gesamtverbrauch in Watt anzeigt
                                            seriennummern: [
                                                //############# Diesen Abschnitt für jedes einzelne Gerät anlegen ################
                                                {
                                                    seriennummer: "HWxxxxxxxxxx",              // Die Seriennummer des Gerätes
                                                    name: "PowerStream",                        // beliebiger Namen
                                                    MaxPower: 600,                              // Der höchstmögliche Wert in Watt für die Einspeiseleistung
                                                    subscribe: true,                            // "true": Alle Daten für dieses Gerät werden angefragt. "false": Es werden keine Statusdaten abgefragt
                                                    typ: "PS",                                  // Welches Gerät ist es: Powerstrem:"PS"; DeltaMax:"DM"; Delta2: "D2" ; Delta2 Max: "D2M"; SmartPlug: "SM"; Andere: "NA" 
                                                    // Parameter an hier nur für PowerStream.     
                                                    regulation: true,                           // "true": Dieser PowerStream soll vom Script reguliert werden
                                                    RegulationOffPower: -1,                     // Wird die Regulation per State abgestellt, wird die Einspeiseleistung des ersten Powerstreams auf diesen Wert gesetzt (-1 = keine Änderung, -2 = Batterie Priomodus)
                                                    hasBat: true,                               // "true": Eine Batterie ist angeschlossen. Nur für PowerStream relevant.
                                                    battPozOn: 99, battPozOff: 96,              // Wenn die Batterie bei battPozOn ist, Einspeisung auf MaxPower. Bei BattPozOff Normalbetrieb
                                                    battOnSwitchPrio: true,                    // "true": Bei battPozOn wird in den Batterie-Prioritätsmodus gewechselt
                                                    prioOffOnDemand: 30,                        // Wattwert des Bedarfs, bei dem zurück in den Strom-Priomodus gechaltet wird. 0 für kein Rückschalten.   
                                                    lowBatLimitPozOn: 30, lowBatLimitPozOff: 35,// Bei Unterschreiten der Batterieladung von "lowBatLimitPozOn" % ist die maximale Einspeiseleistung auf 
                                                    lowBatLimit: 0,                           // "lowBatLimit" limitiert, bis der Ladezustand wieder bei "lowBatLimitPozOff" ist
                                                },
                                                //#######################################################################
                                                {
                                                    seriennummer: "DCExxxxx",
                                                    name: "DELTA Pro",
                                                    typ: "NA",
                                                    subscribe: false,                            // "true": Alle Daten für dieses Gerät werden angefragt. "false": Es werden keine Statusdaten abgefragt
                                                },
                                                //#######################################################################
                                                {
                                                    seriennummer: "XXXXXXXXXXXXX",
                                                    name: "SmartPlug 1",
                                                    typ: "SM",
                                                    subscribe: true,                            // "true": Alle Daten für dieses Gerät werden angefragt. "false": Es werden keine Statusdaten abgefragt
                                                },
                                                //#######################################################################
                                            ],
                                            AdditionalPower: [                                     // Wenn es weitere Wechselrichter gibt, die in IOBroker erfasst werden, können diese hier Angelegt werden
                                                //############# Diesen Abschnitt für jedes einzelne Gerät anlegen ################
                                                {
                                                    name: "Hoymiles2000",                       // Beliebiger Name
                                                    id: "mqtt.0.solar.1234567890.0.power"       // Der Objektpfad zu dem Leistungswert in Watt (W)
                                                },
                                                //#######################################################################
                                            ],
                                            //****************************************
                                            // Erweiterte Einstellungen:
                                            //****************************************
                                            SmartmeterTimeoutMin: 4,                            // Wenn der letzte Wert vom Smartmeter älter als "SmartmeterTimeoutMin" ist, wird das Script mit...
                                            SmartmeterFallbackPower: 150,                       // SmartmeterFallbackPower als aktuellem Realpowerwert weiter arbeiten, bis wieder aktuelle Daten geliefert werden. 
                                            Regulation: true,                                   // 'false' stellt das Setzen der Einspeiseleistung ab 
                                            RegulationState: "Regulate",                        // Wenn angegeben, kann mit diesem State die Regulation ein- und ausgeschaltet werden (Wird automatisch unter 0_userdata.0.ecoflow angelegt)
                                            RegulationMultiPsMode: 0,                           // Wenn mehrere PS reguliert werden sollen. "balance" = 0 oder "serial" = 1
                                            BasePowerOffset: 20,                                // Wird vom aktuellen Verbrauch abgezogen, um die Einspeiseleistung zu berechnen 
                                            Zusatzpower_Offset: 10,                             // Zusatzpower startet ab einer Batterieladeleistung von MaxPower - Zusatzpower_Offset
                                            MinValueMin: 1,                                     // Der Zeitraum in Minuten, aus dem der niedrigste Gesamtverbrauchswert geholt werden soll. 0 für Echtzeitwert
                                            MinValueAg: 0,                                      // Art der Ermittlung des kleinsten Wertes: 0 = Minimalwert, 1 = Durchschnittswert
                                            ReconnectMin: 30,                                   // Zeit in Minuten, nach der die Anwendung neu gestartet wird, wenn keine neuen Daten eintreffen
                                            statesPrefix: "0_userdata.0.ecoflow",               // Hier werden die ecoFlow States angelegt
                                            latitude: latitude,                                 // Breitengrad des Standortes (wird automatisch eingesetzt)
                                            longitude: longitude,                               // Längengrad des Standortes (wird automatisch eingesetzt)
                                            //****************************************
                                            // Überschuss Ladung:
                                            //****************************************
                                            ExcessCharge: false,                                //
                                            ExcessChargePowerID: "0_userdata.0.ecoflow.app_xxxxxxxxxxxxxxxxxxxx_DAxxxxxxxxxxxxxxxxxx_thing_property_set.writeables.slowChgPower",
                                            ExcessChargeSwitchID: "hm-rpc.3.xxxxxxxxxxxxxxxxxx.3.STATE",
                                            ExcessChargeSwitchOn: true,
                                            ExcessChargeSwitchOff: false,
                                            ExcessChargeSwitchMin: 10,
                                            ExcessChargeMaxPower: 1500,
                                            ExcessChargeStartPower: 50,
                                            ExcessChargeStartPowerDurationMin: 5,
                                            //****************************************
                                            Debug: false,
                                            PlotCmdID: 99999,
                                        };
                                        
                                        
                                        //  EXTERNE STATES zum Manipulieren von Configurationsvariablen 
                                        var externConfig = [
                                            //############# Diesen Abschnitt für jeden einzelne Wert anlegen ################
                                            {
                                                VarName: "seriennummern[0].lowBatLimitPozOn",       //Variabelname aus "ConfigData" bei Aufzählungen [0...X] in der Reigenfolge der Angaben 
                                                id: "0_userdata.0.eigene_Berechnungen.AkkuReserve"              //Das Objekt (State) das den Wert für diese variable enthalten soll 
                                            },
                                            //#######################################################################
                                        ];
                                        //#######################################################################
                                         
                                        // Funktion zum Setzen einer verschachtelten Eigenschaft in einem Objekt
                                        function setNestedProperty(obj, path, value) {
                                            let keys = path.split('.');
                                            let lastKey = keys.pop();
                                            let tempObj = obj;
                                         
                                            keys.forEach(key => {
                                                if (key.match(/[\d+]/)) {
                                                    let index = parseInt(key.match(/[(\d+)]/)[1]);
                                                    key = key.split('[')[0];
                                                    tempObj = tempObj[key][index];
                                                } else {
                                                    tempObj = tempObj[key];
                                                }
                                            });
                                         
                                            tempObj[lastKey] = value;
                                        }
                                         
                                        function setConfigValueFromId(VarName, id) {
                                            if (isState2(id)) {
                                                let value = getState(id).val;  // Wert von ioBroker abrufen
                                                setNestedProperty(ConfigData, VarName, value);  // Wert in ConfigData setzen
                                            }
                                        }
                                         
                                        // Initialisierung bei Programmstart
                                        externConfig.forEach(config => {
                                            setConfigValueFromId(config.VarName, config.id);
                                        });
                                         
                                        // Änderungen während der Laufzeit überwachen
                                        externConfig.forEach(config => {
                                            if (isState2(config.id)) {
                                                on(config.id, function (obj) {
                                                    setConfigValueFromId(config.VarName, obj.id);
                                                    //log("ExternesEvent:" + obj.id + " : " + config.VarName + ":" + obj.state.val)
                                                });
                                            }
                                        });
                                        //#######################################################################
                                        
                                        W 1 Reply Last reply
                                        0
                                        • umeleU umele

                                          Hab ich - hier ist der Code bis zum Ende des neuen Codes von config-date bis zum Ende des neuen Codes:

                                          var ConfigData = {
                                              email: "xxxxxx@gmail.com",                             // Die App-Zugangsdaten von ecoFlow
                                              passwort: "yyyyyyyyyy",
                                              SmartmeterID: "sonoff.0.Stromzaehler.SENSOR.E320.Power_in",     // State, der den aktuellen Gesamtverbrauch in Watt anzeigt
                                              seriennummern: [
                                                  //############# Diesen Abschnitt für jedes einzelne Gerät anlegen ################
                                                  {
                                                      seriennummer: "HWxxxxxxxxxx",              // Die Seriennummer des Gerätes
                                                      name: "PowerStream",                        // beliebiger Namen
                                                      MaxPower: 600,                              // Der höchstmögliche Wert in Watt für die Einspeiseleistung
                                                      subscribe: true,                            // "true": Alle Daten für dieses Gerät werden angefragt. "false": Es werden keine Statusdaten abgefragt
                                                      typ: "PS",                                  // Welches Gerät ist es: Powerstrem:"PS"; DeltaMax:"DM"; Delta2: "D2" ; Delta2 Max: "D2M"; SmartPlug: "SM"; Andere: "NA" 
                                                      // Parameter an hier nur für PowerStream.     
                                                      regulation: true,                           // "true": Dieser PowerStream soll vom Script reguliert werden
                                                      RegulationOffPower: -1,                     // Wird die Regulation per State abgestellt, wird die Einspeiseleistung des ersten Powerstreams auf diesen Wert gesetzt (-1 = keine Änderung, -2 = Batterie Priomodus)
                                                      hasBat: true,                               // "true": Eine Batterie ist angeschlossen. Nur für PowerStream relevant.
                                                      battPozOn: 99, battPozOff: 96,              // Wenn die Batterie bei battPozOn ist, Einspeisung auf MaxPower. Bei BattPozOff Normalbetrieb
                                                      battOnSwitchPrio: true,                    // "true": Bei battPozOn wird in den Batterie-Prioritätsmodus gewechselt
                                                      prioOffOnDemand: 30,                        // Wattwert des Bedarfs, bei dem zurück in den Strom-Priomodus gechaltet wird. 0 für kein Rückschalten.   
                                                      lowBatLimitPozOn: 30, lowBatLimitPozOff: 35,// Bei Unterschreiten der Batterieladung von "lowBatLimitPozOn" % ist die maximale Einspeiseleistung auf 
                                                      lowBatLimit: 0,                           // "lowBatLimit" limitiert, bis der Ladezustand wieder bei "lowBatLimitPozOff" ist
                                                  },
                                                  //#######################################################################
                                                  {
                                                      seriennummer: "DCExxxxx",
                                                      name: "DELTA Pro",
                                                      typ: "NA",
                                                      subscribe: false,                            // "true": Alle Daten für dieses Gerät werden angefragt. "false": Es werden keine Statusdaten abgefragt
                                                  },
                                                  //#######################################################################
                                                  {
                                                      seriennummer: "XXXXXXXXXXXXX",
                                                      name: "SmartPlug 1",
                                                      typ: "SM",
                                                      subscribe: true,                            // "true": Alle Daten für dieses Gerät werden angefragt. "false": Es werden keine Statusdaten abgefragt
                                                  },
                                                  //#######################################################################
                                              ],
                                              AdditionalPower: [                                     // Wenn es weitere Wechselrichter gibt, die in IOBroker erfasst werden, können diese hier Angelegt werden
                                                  //############# Diesen Abschnitt für jedes einzelne Gerät anlegen ################
                                                  {
                                                      name: "Hoymiles2000",                       // Beliebiger Name
                                                      id: "mqtt.0.solar.1234567890.0.power"       // Der Objektpfad zu dem Leistungswert in Watt (W)
                                                  },
                                                  //#######################################################################
                                              ],
                                              //****************************************
                                              // Erweiterte Einstellungen:
                                              //****************************************
                                              SmartmeterTimeoutMin: 4,                            // Wenn der letzte Wert vom Smartmeter älter als "SmartmeterTimeoutMin" ist, wird das Script mit...
                                              SmartmeterFallbackPower: 150,                       // SmartmeterFallbackPower als aktuellem Realpowerwert weiter arbeiten, bis wieder aktuelle Daten geliefert werden. 
                                              Regulation: true,                                   // 'false' stellt das Setzen der Einspeiseleistung ab 
                                              RegulationState: "Regulate",                        // Wenn angegeben, kann mit diesem State die Regulation ein- und ausgeschaltet werden (Wird automatisch unter 0_userdata.0.ecoflow angelegt)
                                              RegulationMultiPsMode: 0,                           // Wenn mehrere PS reguliert werden sollen. "balance" = 0 oder "serial" = 1
                                              BasePowerOffset: 20,                                // Wird vom aktuellen Verbrauch abgezogen, um die Einspeiseleistung zu berechnen 
                                              Zusatzpower_Offset: 10,                             // Zusatzpower startet ab einer Batterieladeleistung von MaxPower - Zusatzpower_Offset
                                              MinValueMin: 1,                                     // Der Zeitraum in Minuten, aus dem der niedrigste Gesamtverbrauchswert geholt werden soll. 0 für Echtzeitwert
                                              MinValueAg: 0,                                      // Art der Ermittlung des kleinsten Wertes: 0 = Minimalwert, 1 = Durchschnittswert
                                              ReconnectMin: 30,                                   // Zeit in Minuten, nach der die Anwendung neu gestartet wird, wenn keine neuen Daten eintreffen
                                              statesPrefix: "0_userdata.0.ecoflow",               // Hier werden die ecoFlow States angelegt
                                              latitude: latitude,                                 // Breitengrad des Standortes (wird automatisch eingesetzt)
                                              longitude: longitude,                               // Längengrad des Standortes (wird automatisch eingesetzt)
                                              //****************************************
                                              // Überschuss Ladung:
                                              //****************************************
                                              ExcessCharge: false,                                //
                                              ExcessChargePowerID: "0_userdata.0.ecoflow.app_xxxxxxxxxxxxxxxxxxxx_DAxxxxxxxxxxxxxxxxxx_thing_property_set.writeables.slowChgPower",
                                              ExcessChargeSwitchID: "hm-rpc.3.xxxxxxxxxxxxxxxxxx.3.STATE",
                                              ExcessChargeSwitchOn: true,
                                              ExcessChargeSwitchOff: false,
                                              ExcessChargeSwitchMin: 10,
                                              ExcessChargeMaxPower: 1500,
                                              ExcessChargeStartPower: 50,
                                              ExcessChargeStartPowerDurationMin: 5,
                                              //****************************************
                                              Debug: false,
                                              PlotCmdID: 99999,
                                          };
                                          
                                          
                                          //  EXTERNE STATES zum Manipulieren von Configurationsvariablen 
                                          var externConfig = [
                                              //############# Diesen Abschnitt für jeden einzelne Wert anlegen ################
                                              {
                                                  VarName: "seriennummern[0].lowBatLimitPozOn",       //Variabelname aus "ConfigData" bei Aufzählungen [0...X] in der Reigenfolge der Angaben 
                                                  id: "0_userdata.0.eigene_Berechnungen.AkkuReserve"              //Das Objekt (State) das den Wert für diese variable enthalten soll 
                                              },
                                              //#######################################################################
                                          ];
                                          //#######################################################################
                                           
                                          // Funktion zum Setzen einer verschachtelten Eigenschaft in einem Objekt
                                          function setNestedProperty(obj, path, value) {
                                              let keys = path.split('.');
                                              let lastKey = keys.pop();
                                              let tempObj = obj;
                                           
                                              keys.forEach(key => {
                                                  if (key.match(/[\d+]/)) {
                                                      let index = parseInt(key.match(/[(\d+)]/)[1]);
                                                      key = key.split('[')[0];
                                                      tempObj = tempObj[key][index];
                                                  } else {
                                                      tempObj = tempObj[key];
                                                  }
                                              });
                                           
                                              tempObj[lastKey] = value;
                                          }
                                           
                                          function setConfigValueFromId(VarName, id) {
                                              if (isState2(id)) {
                                                  let value = getState(id).val;  // Wert von ioBroker abrufen
                                                  setNestedProperty(ConfigData, VarName, value);  // Wert in ConfigData setzen
                                              }
                                          }
                                           
                                          // Initialisierung bei Programmstart
                                          externConfig.forEach(config => {
                                              setConfigValueFromId(config.VarName, config.id);
                                          });
                                           
                                          // Änderungen während der Laufzeit überwachen
                                          externConfig.forEach(config => {
                                              if (isState2(config.id)) {
                                                  on(config.id, function (obj) {
                                                      setConfigValueFromId(config.VarName, obj.id);
                                                      //log("ExternesEvent:" + obj.id + " : " + config.VarName + ":" + obj.state.val)
                                                  });
                                              }
                                          });
                                          //#######################################################################
                                          
                                          W Offline
                                          W Offline
                                          Waly_de
                                          wrote on last edited by Waly_de
                                          #578

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

                                          Hab ich - hier ist der Code bis zum Ende des neuen Codes von config-date bis zum Ende des neuen Codes:

                                          da muss irgendwo anders im Script was kaputt sein.
                                          Hier das komplette neue Script mit der eingebauten Änderung. Versuch das bitte noch mal:

                                          ecoflow-connector_v115.txt

                                          umeleU 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

                                          586

                                          Online

                                          32.4k

                                          Users

                                          81.3k

                                          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