Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Hardware
    4. IOBroker Anbindung an einen Kostal Plenticore

    NEWS

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    • Save The Date: ioBroker@Smart Living Forum Solingen, 14.06.

    IOBroker Anbindung an einen Kostal Plenticore

    This topic has been deleted. Only users with topic management privileges can see it.
    • G
      gjo @Diginix last edited by gjo

      @diginix image.png

      der pv forecast adapter stellt dafür eine JSONGraph / JSONTable zur Vergügung
      evtl ist das hier auch integrierbar ... fände ich mehr als klasse.

      StrathCole 2 Replies Last reply Reply Quote 0
      • StrathCole
        StrathCole @gjo last edited by

        @gjo Schaue mir die API mal an, ob die nicht auch direkt integrierbar wäre.

        1 Reply Last reply Reply Quote 0
        • H
          HomeUser last edited by

          Hallo,

          gestern abend habe ich mal per Browser auf den Wechselrichter geschaut. Da war komischerweise kein Eintrag beim min. SoC gewählt:
          5db5878c-b0e2-45fc-ab5b-1bde6d003209-image.png

          Jetzt sind wohl neue Werte gesetzt und alles ist wieder okay:
          e6efff3d-4eb4-440d-a511-ae658c11a620-image.png

          StrathCole 1 Reply Last reply Reply Quote 0
          • StrathCole
            StrathCole @HomeUser last edited by

            @homeuser Nein, das ist normal. Das Interface vom WR kann nur 5%-Schritte. Ich kann aber auch z. B. 8% setzen im Adapter, dann ist die Anzeige im UI des WR leer.

            1 Reply Last reply Reply Quote 0
            • H
              HomeUser last edited by

              Hallo,

              nach und nach verstehe ich mehr, was wie gedacht ist und warum.

              Trotzdem habe ich wieder eine neue Frage:
              Neben unserem Haus steht quer ein höheres Haus. Im Sommer ist das kein Problem, aber bei der aktuell niedrig stehenden Sonne verschwindet unsere Anlage im Laufe des Nachmittags im Schatten.
              Lernt die Regelung so etwas auch? Wenn nein, kann ich etwas einstellen, um das in der Regelung zu berücksichtigen?
              In den vergangenen Tagen war am Ende des Tages der Speicher zweimal nur zu 90% voll und ich vermute, dass das an unserem "früheren Sonnenuntergang liegt".

              StrathCole 1 Reply Last reply Reply Quote 0
              • StrathCole
                StrathCole @HomeUser last edited by

                @homeuser sagte in IOBroker Anbindung an einen Kostal Plenticore:

                In den vergangenen Tagen war am Ende des Tages der Speicher zweimal nur zu 90% voll und ich vermute, dass das an unserem "früheren Sonnenuntergang liegt".

                Das wäre natürlich möglich. Allerdings hat das mit der (Adapter-)Steuerung nicht sooo viel zu tun, denn sie begrenzt nicht die Ladung. Sie begrenzt nur die Entladung. Daher ist es irrelevant, ob du z. B. am Morgen bis 10% entladen hast und den Tag über auf 90% kommst oder nur bis 20% entlädst und dann auf 100% kommst. Ersteres wäre mir sogar lieber, sonst besteht das Risiko, dass ich unnötig einspeise.

                H 1 Reply Last reply Reply Quote 0
                • StrathCole
                  StrathCole @gjo last edited by StrathCole

                  @gjo Ich habe mir bei meiner Anlage den Forecast mal angesehen.
                  Bisher bin ich nicht so überzeugt insgesamt.

                  Meine Beobachtung (Werte in kWh):

                  Tag | PVForecast | Plenticore Adapter | Realertrag
                  1   |       38,9 |               18,8 |       35,9
                  2   |       15,2 |                5,0 |        2,6
                  3   |       32,3 |               15,1 |       21,7
                  4   |       22,8 |               30,5 |       35,7
                  5   |       17,7 |               10,2 |       18,4
                  6   |       40,0 |               27,4 |       34,1
                  7   |       44,3 |               23,2 |       15,6
                  8   |       11,8 |                1,8 |        3,5
                  9   |       12,9 |                4,9 |        4,9
                  10  |       21,9 |                3,4 |        1,3
                  11  |       12,3 |                2,9 |        1,7
                  12  |        8,7 |                4,2 |        4,3
                  13  |        9,3 |                7,0 |       12,4
                  14  |        7,4 |                3,4 |        3,4
                  15  |       30,0 |               15,6 |       11,9
                  16  |       14,0 |                2,7 |        3,0
                  17  |       12,5 |                7,4 |        5,5
                  

                  Wie man sieht, liegt PVForecast oft extrem daneben und eher zu hoch, was für meine automatische Steuerung problematisch wäre. Die Vorhersage des Adapters selbst ist auch nicht perfekt, aber passt für mich einfach viel besser, daher haber ich zumindest derzeit keine Notwendigkeit, PVForecast zu integrieren. Sorry.

                  Liebe Grüße

                  G 1 Reply Last reply Reply Quote 0
                  • G
                    gjo @StrathCole last edited by

                    @strathcole
                    Hi, das passt für mich. Es macht aus meiner Sicht auf wenig Sinn wieder eine neue Forecast-Quelle zu nehmen.

                    Meinst du es ist möglich die Forecast Daten des Plenticore-Adapters als Json Tabelle/Graph mit auszugeben? Wie ich das verstehe liegen die Daten ja alle vor und würde so eine Visualisierung der zu erwartenden PV-Erträge ermöglichen. Quasi wie in dem Bild im ursprünglichen Post zu miner Frage. image.png

                    Für nicht Batterie Nutzer gibt es so die Möglichkeit Großverbraucher (Waschmaschine, Trocker, Spühlmaschine) nach dem optimiert zu starten.

                    Gruß

                    StrathCole H 2 Replies Last reply Reply Quote 0
                    • StrathCole
                      StrathCole @gjo last edited by

                      @gjo Ich müsste mal schauen. Das Problem ist, dass ich noch ein Problem in der Vorhersage habe. Im Grunde korrigiert der Adapter über den Tag die Vorhersage immer wieder, aber wird dann immer "falscher". Ich beachte daher im Grunde nur den Wert, den er so ca. ~6-9 Uhr morgens hat.
                      Ich weiß noch nicht, woran das liegt und konnte es noch nicht untersuchen.

                      Die historischen Daten der Vorhersagen speichert der Adapter nicht, daher kann ich solch eine Tabelle nicht ausgeben. Er speichert allerdings die Stundenwerte für den aktuellen Tag (nur wie gesagt spinnt da der Adapter im Tagesverlauf).

                      1 Reply Last reply Reply Quote 0
                      • H
                        HomeUser @StrathCole last edited by

                        @strathcole said in IOBroker Anbindung an einen Kostal Plenticore:
                        [...]

                        Das wäre natürlich möglich. Allerdings hat das mit der (Adapter-)Steuerung nicht sooo viel zu tun, denn sie begrenzt nicht die Ladung. Sie begrenzt nur die Entladung. Daher ist es irrelevant, ob du z. B. am Morgen bis 10% entladen hast und den Tag über auf 90% kommst oder nur bis 20% entlädst und dann auf 100% kommst. Ersteres wäre mir sogar lieber, sonst besteht das Risiko, dass ich unnötig einspeise.

                        Jetzt bin ich verwirrt. Ich dachte, dass das Hauptziel ist, dass der Speicher möglichst dann geladen wird, wenn "zu viel" Strom da ist. Wie geht das, wenn nur die Entladung begrenzt wird?
                        Oder bedeutet das, dass wenn die Ladung aktiv ist, dies von der Kostal-Logik gesteuert wird, aber diese Logik zwischendurch "ausgeschaltet" wird, damit sie z.B. nicht zu früh voll lädt.

                        H 1 Reply Last reply Reply Quote 0
                        • H
                          HomeUser @gjo last edited by

                          @gjo said in IOBroker Anbindung an einen Kostal Plenticore:

                          Meinst du es ist möglich die Forecast Daten des Plenticore-Adapters als Json Tabelle/Graph mit auszugeben?

                          Ich habe mir hierfür ein Script geschrieben, das zyklisch ausgeführt wird. Es nimmt den dann gerade aktuellen Forecast (über alle Stunden des aktuellen Tages und Folgetages) und schreibt ihn als JSON in ein Datenobjekt. Das kann ich dann nehmen und in einer Tabelle ausgeben.
                          Wenn das hilft, kann ich das Skript posten.

                          G 1 Reply Last reply Reply Quote 0
                          • G
                            gjo @HomeUser last edited by

                            @homeuser
                            Genau sowas habe ich mir vorgestellt. Wenn du das teilen könntest …
                            Vielen Dank
                            Gruß

                            H 1 Reply Last reply Reply Quote 0
                            • StrathCole
                              StrathCole last edited by

                              Würde empfehlen, das dann nur einmal am Tag zwischen 6 und 8 auszuführen, bis ich das Problem gelöst habe.

                              StrathCole 1 Reply Last reply Reply Quote 0
                              • H
                                HomeUser @gjo last edited by

                                @gjo said in IOBroker Anbindung an einen Kostal Plenticore:

                                @homeuser
                                Genau sowas habe ich mir vorgestellt. Wenn du das teilen könntest …
                                Vielen Dank
                                Gruß

                                Disclaimer und Erklärung:
                                Ich bin kein Javascript-Entwickler. Vielleicht sind manche Dinge daher sehr unschön gelöst. Außerdem ist es geschrieben nach dem Motto: Hauptsache es klappt.
                                UpdateJson(): Der erste Teil der Schleife erstellt ein Json aus den Forecast-Daten. Der zweite konsolidiert das etwas, um eine leicht verständliche Ansicht für den Rest der Familie zu haben.
                                UpdateFreeEnergy(): Berechnet wie viel Strom im Moment gerade übrig ist. Der "Moment" sind die letzten 10 Minuten, wobei die letzten drei doppelt gewichtet werden.

                                Ich habe mal alles drin gelassen, falls es nützlich ist. Wenn nicht, ist es ja einfach zu löschen 🙂

                                schedule ("*/1 * * * *", UpdatePlenticore)
                                
                                function UpdatePlenticore() {
                                    // free energy must be updated first because it is used by UpdateJson()
                                    UpdateFreeEnergy();
                                    UpdateJson();
                                }
                                
                                
                                function UpdateJson() {
                                    let data = [];
                                    let consolidatedData = [];
                                    let time2;
                                    let power;
                                    let generated;
                                    let c = 0; // used to group always 3 hours in one
                                    let timeNow = new Date(Date.now());
                                    let consolidatedPower = 0;
                                    let consolidatedStars = 0;
                                    let consolidatedTimeEnd = timeNow.getHours(); // default: if no full period is consolidated, start with now
                                
                                    // set value for now (based on the calculated currently free energy)
                                    let freeEnergy = getState('0_userdata.0.Plenticore.FreeEnergy').val;
                                    consolidatedData.push({'time' : 'jetzt','power' : Math.round(freeEnergy) + " Wh", 'stars' : ((freeEnergy-200)/500)}); 
                                
                                    // Day 1
                                    data.length = 0;
                                    for (let i = 1; i <= 20; i++) {
                                        let forecastHour = "plenticore.0.forecast.day1.power." + i + "h"
                                
                                        // Day 1
                                        if (existsState(forecastHour + '.time')) {
                                            let time  = new Date(getState(forecastHour + '.time').val);
                                
                                            // convert hourly forecast to JSON
                                            time2 = time.toLocaleTimeString();
                                            power = getState(forecastHour + '.power').val;
                                            if (existsState(forecastHour + '.generated')) {
                                                generated = getState(forecastHour + '.generated').val;
                                            } else {
                                                generated = 0;
                                            }
                                            data.push({'time' : time2,'power' : Math.round(power), 'generated' : Math.round(generated)});
                                
                                            // consolidate to timespan and quality (JSON)
                                            //
                                            // check if the period is in the future (don't show forecast for past hours)
                                            if (time.getHours() > timeNow.getHours()) {
                                
                                                consolidatedPower += power;
                                                if ( (c % 3) == 2) {
                                                    consolidatedTimeEnd = time.getHours();
                                                    time2 = (time.getHours()-2) + " - " + consolidatedTimeEnd + " Uhr";
                                                    consolidatedStars = Math.round(consolidatedPower / 2000); // translate power in stars
                                                    consolidatedData.push({'time' : time2,'power' : Math.round(consolidatedPower) + " Wh", 'stars' : consolidatedStars}); 
                                                    consolidatedPower = 0; // rest fo next timespan
                                                }
                                                c++;
                                            }
                                        }
                                    }
                                
                                    // check if there a partially consolidated period pending
                                    if ( (c % 3) == 1) { 
                                        time2 = (consolidatedTimeEnd + 1) + " Uhr";
                                
                                        consolidatedStars = Math.round(consolidatedPower / (2000/3)); // translate power in stars; use number of remaining items as factor
                                        consolidatedData.push({'time' : time2,'power' : Math.round(consolidatedPower) + " Wh", 'stars' : consolidatedStars}); 
                                    } else if ( (c % 3) == 2) { 
                                        time2 = (consolidatedTimeEnd + 1) + " - " + (consolidatedTimeEnd + 2) + " Uhr";
                                
                                        consolidatedStars = Math.round(consolidatedPower / ((2000*2)/3)); // translate power in stars; use number of remaining items as factor
                                        consolidatedData.push({'time' : time2,'power' : Math.round(consolidatedPower) + " Wh", 'stars' : consolidatedStars}); 
                                    }
                                
                                    setState('0_userdata.0.Plenticore.ForecastDay1', JSON.stringify(data), true);
                                    setState('0_userdata.0.Plenticore.ConsolidatedDay1', JSON.stringify(consolidatedData), true);
                                
                                    // Day 2
                                    c = 0; // used to group always 3 hours in one
                                    consolidatedPower = 0;
                                    consolidatedStars = 0;
                                    consolidatedTimeEnd = 0;
                                
                                    data.length = 0;
                                    consolidatedData.length = 0;
                                
                                    for (let i = 1; i <= 20; i++) {
                                        let forecastHour = "plenticore.0.forecast.day2.power." + i + "h"
                                
                                        // Day 1
                                        if (existsState(forecastHour + '.time')) {
                                            let time  = new Date(getState(forecastHour + '.time').val);
                                
                                            // convert hourly forecast to JSON
                                            time2 = time.toLocaleTimeString();
                                            power = getState(forecastHour + '.power').val;
                                            data.push({'time' : time2,'power' : Math.round(power)})
                                
                                            // consolidate to timespan and quality (JSON)
                                            consolidatedPower += power;
                                            if ( (c % 3) == 2) {
                                                consolidatedTimeEnd = time.getHours();
                                                time2 = (time.getHours()-2) + " - " + consolidatedTimeEnd + " Uhr";
                                                consolidatedStars = Math.round(consolidatedPower / 2000); // translate power in stars
                                                consolidatedData.push({'time' : time2,'power' : Math.round(consolidatedPower) + " Wh", 'stars' : consolidatedStars}); 
                                                consolidatedPower = 0; // rest fo next timespan
                                            }
                                            c++;
                                        }
                                    }
                                    if ( (c % 3) != 0) { // not all hours are pushed to the consolidation
                                        time2 = (consolidatedTimeEnd + 1) + " - " + (consolidatedTimeEnd + 1 + (c % 3) ) + " Uhr";
                                
                                        consolidatedStars = Math.round(consolidatedPower / 2000); // translate power in stars
                                        consolidatedData.push({'time' : time2,'power' : Math.round(consolidatedPower) + " Wh", 'stars' : consolidatedStars}); 
                                        consolidatedPower = 0; // rest fo next timespan
                                    }
                                
                                    setState('0_userdata.0.Plenticore.ForecastDay2', JSON.stringify(data), true);
                                    setState('0_userdata.0.Plenticore.ConsolidatedDay2', JSON.stringify(consolidatedData), true);
                                
                                }
                                
                                // Save free watt of past N minutes; calc average
                                function UpdateFreeEnergy() {
                                    let freeEnergy = 0;
                                    let batterySoc = 0;
                                    const pastMinutes = 10;
                                
                                    // with forst call, create the array are set values to 0
                                    if ( typeof UpdateFreeEnergy.pastValues == 'undefined' ) {
                                            UpdateFreeEnergy.pastIndex = 0;
                                            UpdateFreeEnergy.pastValues= [];    
                                
                                        for (let i = 0; i < pastMinutes; i++) {
                                            UpdateFreeEnergy.pastValues[i] = 0;
                                        }
                                    }
                                
                                    // calculate the current free value
                                    freeEnergy = getState('plenticore.0.devices.local.Pv_P').val;
                                    freeEnergy -= getState('plenticore.0.devices.local.Home_P').val;
                                
                                    if (freeEnergy < 0) {
                                        freeEnergy = 0;
                                    }
                                    // put into array
                                    UpdateFreeEnergy.pastValues[UpdateFreeEnergy.pastIndex] = freeEnergy;
                                
                                    // calc average of past values
                                    for (let i = 0; i < pastMinutes; i++) {
                                        //for the 3 most current values double the impact
                                        if ( (i == UpdateFreeEnergy.pastIndex) || (i == (UpdateFreeEnergy.pastIndex + pastMinutes - 1) % pastMinutes)  || (i == (UpdateFreeEnergy.pastIndex + pastMinutes - 2) % pastMinutes) ){
                                            freeEnergy = freeEnergy + 2 * UpdateFreeEnergy.pastValues[i];
                                        } else {
                                            freeEnergy = freeEnergy + UpdateFreeEnergy.pastValues[i];
                                        }
                                    }
                                    freeEnergy = freeEnergy / (pastMinutes + 3);  // +3 for the doubled impact of the the 3 most current values
                                
                                    // if the battery is below the defined minimum, the battery has priority; so there is no free energy
                                    // recommendation: 
                                    //    Use same value as in the settings of the plenticore adapter for "minimaler SoC zur Aktivierung des Batteriemanagements".
                                    //    The plenticore adapter stops charging a little before the limit. So the value should be 2-3% lower.
                                    batterySoc = getState('plenticore.0.devices.local.battery.SoC').val;
                                    if (batterySoc <= 12) {
                                        freeEnergy = 0;
                                    }
                                
                                    // save calculated average 
                                    setState('0_userdata.0.Plenticore.FreeEnergy', freeEnergy, true);
                                
                                    // inc counter for cyclic buffer
                                    UpdateFreeEnergy.pastIndex = (UpdateFreeEnergy.pastIndex + 1) % pastMinutes;
                                }
                                
                                G 1 Reply Last reply Reply Quote 1
                                • StrathCole
                                  StrathCole @StrathCole last edited by

                                  @strathcole So, ich habe jetzt im git eine neue Version (nur dort), bei der ich die Vorhersage für den aktuellen Tag nur noch bis Sonnenaufgang aktualisiere.

                                  H 1 Reply Last reply Reply Quote 0
                                  • H
                                    HME last edited by

                                    @StrathCole: Ich bekomme immer folgenden Warning im iobroker Protokoll angezeigt:

                                    plenticore.0
                                    2021-11-30 16:12:16.165 warn Failed starting plenticore adapter (login sequence failed). Trying again in 30 seconds.
                                    plenticore.0
                                    2021-11-30 16:12:16.164 warn Login failed with code 0:
                                    plenticore.0
                                    2021-11-30 16:12:16.163 warn API request failed with error {"errno":"ECONNREFUSED","code":"ECONNREFUSED","syscall":"connect","address":"192.168.178.20","port":80}

                                    Was mache ich falsch? Falsch PW?

                                    Freundlichen Gruß
                                    HME

                                    StrathCole 1 Reply Last reply Reply Quote 0
                                    • StrathCole
                                      StrathCole @HME last edited by

                                      @hme Hi, der Fehler bedeutet, dass auf der IP Adresse kein Port 80 verfügbar ist. Entweder ist es die falsche IP oder eine Firewall blockt Port 80 oder der WR lauscht nicht auf Port 80.

                                      H 1 Reply Last reply Reply Quote -1
                                      • H
                                        HME @StrathCole last edited by

                                        @strathcole many thx. Tatsächlich hab ich bei der Portfreigabe realisieren müssen, dass zwei Geräte die selbe IP nutzen...

                                        Nice support. 🙂

                                        1 Reply Last reply Reply Quote 0
                                        • Diginix
                                          Diginix last edited by

                                          @StrathCole
                                          Hatte heute mal wieder den Fall dass etwas mit der Regenvorhersage nicht passte, was ja mal passieren kann. Aber der Adapter haut dann mehrfach eine nicht unerhebliche Menge an "Müll" in das Log:

                                          2021-12-04 05:28:23.512  - warn: plenticore.0 (1269342) Processing cloud data failed: 
                                          
                                          
                                          <div id="temp_graph"></div>
                                              <p class="graph-headline-compact">Mittelwind</p>
                                          <div id="wind_graph"></div>
                                          <div id="sun_graph"></div>
                                          <div id="clouds_graph"></div>
                                          <p class="graph-headline-compact">Niederschlag 3h + Summe (mm/Liter pro m²) + Niederschlagswahrscheinlichkeit <span style="color:#005288;margin-left: 20px;">●</span> Regen<span style="color:#7dbbea;margin-left: 10px;">●</span> Schnee</p>
                                          <div id="rain_graph"></div>
                                          <div id="rainsum_graph"></div>
                                          <div id="rainpop_graph"></div>
                                          <div id="humidity_graph"></div>
                                          <p class="graph-headline-compact">Luftdruck</p>
                                          <div id="pressure_graph"></div>
                                          <div id="visibility_graph"></div>
                                          
                                          <script type="text/javascript">
                                          
                                          
                                          
                                          
                                          
                                          
                                          
                                              
                                              
                                                      var hccompact_tempmax = -100;
                                              
                                              
                                              
                                                  ];
                                              
                                              
                                              
                                              
                                              
                                              
                                          
                                              
                                              
                                              
                                              
                                              var hccompact_sunsum=[  ];
                                          
                                              var hccompact_rainsum=[  ];
                                          
                                          
                                                  var hclanding_sunrise = 8;
                                              var hclanding_sunset = 7;
                                          </script>
                                          
                                          
                                          
                                          
                                          2021-12-04 05:28:23.528  - warn: plenticore.0 (1269342) Could not process weather data.
                                          
                                          

                                          Dieser Block hat sich 10 mal wiederholt.

                                          Diginix 1 Reply Last reply Reply Quote 0
                                          • H
                                            HomeUser @StrathCole last edited by HomeUser

                                            "So, ich habe jetzt im git eine neue Version (nur dort), bei der ich die Vorhersage für den aktuellen Tag nur noch bis Sonnenaufgang aktualisiere."

                                            @strathcole Jetzt muss ich ganz naiv fragen, wie ich das von dort installiere!? Aktuell habe ich keine Buildumgebung o.ä. auf meinem Rechner.

                                            Diginix 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            515
                                            Online

                                            31.6k
                                            Users

                                            79.4k
                                            Topics

                                            1.3m
                                            Posts

                                            83
                                            1298
                                            312345
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo