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.
    • M
      MaggeO last edited by

      Hallo Kunibert,

      im Anhang mal meine Einstellungen im Adapter und ein Export der HoldingRegister. Das sind schon fast alle aus dem Sunspec.pdf. Grundsätzlich läuft es so bei mir jetzt relativ gut und auch die Werte sehen bei mir plausibel aus (gerade noch einmal mit den Werten direkt am WR geprüft).

      Ich hatte bei mir ja noch das Phänomen beobachtet, dass anscheinend die Werte der Register 110 und 114 vertauscht sind. Im Photovoltaikforum (https://www.photovoltaikforum.com/threa … /?pageNo=2) habe ich dafür auch eine erste Bestätigung bekommen. Daher habe ich diese beiden Register bei mir auch vertauscht.

      Zusätzlich habe ich noch das Phänomen/Problem, dass sich wohl der modbus-Adapter aufgrund eines Timeouts beim auslesen immer wieder aufhängt und dann keine neue Daten abholt bis man ihn neu gestartet hat. Dafür habe ich mir jetzt ein Skript geschrieben, welches prüft wie lange die letzte Aktualisierung einer der Werte her ist, und davon abhängig den Adapter neustartet. Und so läuft es eigentlich ziemlich ganz gut. Das Thema scheint wohl auch ein "genreller" Punkt des Modbus-Adapters zu sein (siehe https://github.com/ioBroker/ioBroker.modbus/issues/36)

      Gruß MaggeO

      1112_modbus_instance.png
      1112_holding_register.txt

      mifricke created this issue in ioBroker/ioBroker.modbus

      closed Modbus timeout causes connection termination #36

      1 Reply Last reply Reply Quote 1
      • K
        Kunibert last edited by

        Tausend Dank, mit deinem Screenshot und dem Import des HoldingRegisters funktioniert es! Danke!!

        1 Reply Last reply Reply Quote 0
        • K
          Kunibert last edited by

          Habe für den Kostal Wechselrichter auf Github einen Adapter-Issue aufgemacht, vielleicht findet sich ja jemand der Lust & Zeit zur Entwicklung eines passenden Adapters hat:
          https://github.com/ioBroker/AdapterRequests/issues/170

          Kunibert-007 created this issue in ioBroker/AdapterRequests

          closed Adapter für Kostal Wechselrichter (Solaranlage) #170

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

            Ich habe ein Plenticore Plus 5.5 mit Firmware 1.30 und die Grundeinstellungen vom Adapter wie oben gezeigt.
            Mit TCP, IP, Port und GeräteID, aber die Instanz bleibt leider gelb und im Log steht immer "Serial is not available".
            Was fehlt oder ist falsch?

            Edit: Mit diesen Hinweisen hat es nun funktioniert:
            @Hideloop sagte in IOBroker Anbindung an einen Kostal Plenticore:

            Hallo,

            trage die Werte unter Holdingregisters ein und nutze als Datentyp Float Big Endian Word Swap.

            Bei mir hat dann alles einwandfrei geklappt.

            Grüße,

            Hideloop

            1 Reply Last reply Reply Quote 0
            • B
              Baden18 last edited by

              Hi,
              ich möchte auc gerne über den Modbus meinen kostal PIKO 7 auslesen.

              Leider habe ich eine Verbindungsproblem -> hier das LOG
              modbus.0 2019-06-10 10:29:51.130 info Disconnected from slave 192.168.178.5
              modbus.0 2019-06-10 10:29:50.134 warn Poll error count: 2 code: {"err":"timeout"}
              modbus.0 2019-06-10 10:29:50.134 error Client in error state.
              modbus.0 2019-06-10 10:29:50.133 error Request timed out.
              modbus.0 2019-06-10 10:29:50.132 warn Error: undefined
              modbus.0 2019-06-10 10:29:42.123 info Connected to slave 192.168.178.5

              Als Port habe ich 81 und nicht 1502 angegeben. Da auf 1502 überhaupt keine Verbindung möglich ist.
              Geräte-ID=1
              Auf dem WR habe ich Version 5.44 installiert. Laut Support gibt es keine Neuere für diesen WR.

              Hat jemand eine Idee ? Danke im Voraus.

              1 Reply Last reply Reply Quote 0
              • K
                Kalle last edited by Kalle

                @Kunibert @Diginix

                Hallo zusammen,
                ich habe mal eine Frage in die Runde.
                Ich nutze nun auch den Kostal plenticore plus 7.0 mit der BYD b-box.
                Ich habe den Modbus Adaper bereits installiert und eingerichtet.
                Die Liste mit den Daten habe ich etwas reduziert, auf die Werte welche für mich interessant sind. Wenn ich unter Instanzen den Order öffne Werte alle Werte aktualisiert, danach nurnoch die Register 144, 260 und 270. Die anderen Werte werden nicht aktualisiert bzw erst wenn ich den Ordner zu und wieder auf mache?
                Wie ist das bei euch? Könntet Ihr mal bitte meine Einstellungen mit euren vergleichen (Anhang)?
                Ich verwende die Modbus Version 3.0 und habe eine weitere Instanz für meine Lüftungsanlage laufen, dort ohne Probleme.

                Schonml danke im vorraus.

                VG Marcel

                register.png einstellungen.png

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

                  @Kalle
                  Sieht soweit richtig aus. Lass dir die Werte mal in einer VIS o.ä. ausgeben. Ich hatte schon Datenpunkte (DWD, Parser, ...) die in der Admin Ansicht anscheinend nicht aktuell waren, aber da war nur die Anzeige selbst nicht immer aktuell. Der tatsächliche Wert im Datenpunkt war aber immer korrekt. D.h. in Skripte, in denen sie verwendet werden, kommt der richtige Wert.

                  917e6561-1d29-4768-b8e0-433ee2ef5995-image.png

                  1 Reply Last reply Reply Quote 0
                  • O
                    olfi13 last edited by

                    Hallo,

                    die Adressen der Register scheinen bei meinem Plenticore 8.5 nicht zu passen. Das Register z.B. mit der Adresse 40160 zeigt wohl die gesamte DC-Leistung (Datenpunkt verglichen mit dem Display am Plenticore).
                    Bei "Aliases benutzen" habe ich keinen Haken gesetzt.
                    Mache ich da was falsch? Oder hat jemand eine aktuelle csv-Datei?

                    Danke schonmal!
                    Olfi

                    1 Reply Last reply Reply Quote 0
                    • O
                      olfi13 last edited by

                      Hallo nochmal,
                      die Register 40138 bis 40142 sind bei mir Spannung Aussenleiter,
                      40164 ist die Netzfrequenz.
                      Hat jemand einen Tipp?
                      Gruß ins Forum, Olfi

                      1 Reply Last reply Reply Quote 0
                      • O
                        olfi13 last edited by

                        Hallo nochmal,

                        ich führe hier zwar ein Selbstgespräch, möchte aber für andere Verzweifelte mal zeigen, wie ich es nun gelöst habe:
                        In der Konfiguration des Adapters habe ich den Haken gesetzt bei "Aliases benutzen", ebenso bei "Direkte Adressen benutzen" (Eine andere Konfiguration will nicht funktionieren).

                        Unter "Holding Registers" wird als Start-Adresse 40001 automatisch gesetzt (rechts oben). Alle Adressen der Holding Register musste ich um eins verschieben, also 40101 ist DC-Power-Total anstatt 40100.
                        Alle Register lassen sich so auslesen, so wie im Kostal Datenblatt angegeben.

                        Weder mit anderer manuell eingegebener Start-Adresse noch mit anderer Konfiguration geht es. Warum das so ist, dass erschliesst sich mir nicht.

                        Gruß, Olfi

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

                          Hallo zusammen,

                          ich bin noch neu hier, habe aber einige Threads durchgelesen.
                          Da ich selbst gerade dabei bin, meine Haussteuerung mit ioBroker aufzumöbeln und wir kürzlich eine PV-Anlage mit BYD-Speicher und Plenticore WR bekommen haben, habe ich nach einer vernünftigen Lösung gesucht.

                          Wir in anderen Foren auch zu lesen ist, funktioniert z. B. die "Dynamische SoC-Regelung" nur mäßig und es fehlt die Möglichkeit, via ModBus Werte zu setzen.
                          Also habe ich mich dran gesetzt, meinen ersten Adapter zu entwickeln, der die interne Web-API (kein Screenscraping) des Plenticore nutzt.

                          Ich selbst habe einen Plenticore Plus 10, weiß also nicht, ob die API bei allen Modellen der Reihe identisch ist und somit der Adapter überhaupt funktioniert. Für Rückmeldungen wär ich daher dankbar 🙂

                          Falls jemand Interesse hat, hier das Ergebnis:
                          https://github.com/StrathCole/iobroker.plenticore

                          Liebe Grüße
                          Marius aka StrathCole

                          Diginix Marco Laser 2 Replies Last reply Reply Quote 2
                          • StrathCole
                            StrathCole last edited by StrathCole

                            Da ich mit der Einstellung "dynamisch" für den MinSoC im Plenticore für die BYD Box absolut nicht zufrieden war (teilweise auf 50% gesetzt, obwohl es sonnig wurde und die Batterie hätte auch bei einem Startwert von 0% voll geladen werden können), habe ich in Verbindung mit dem o. g. Plenticore-Adapter und Weatherunderground-Adapter ein Skript geschrieben, das den MinSoC je nach vergangenem Stromverbrauch (tagsüber), prognostizierter PV-Leistung und Wolkenprognose anpasst und zwischen 0 und 50% setzt.
                            Ich habe es noch nicht lang im Einsatz, aber vielleicht hat jemand hier ja Bedarf oder hat Anmerkungen / Verbesserungsvorschläge.

                            const plant_power = 9600; // kWp
                            const battery_capacity = 8960; // Wh
                            const sun_low_power_hours = 2; // this is about the time of very low sun power, may differ due to local environment (hills, buildings etc.)
                            
                            let daynight = ['day', 'night'];
                            
                            //* prepare state objects
                            for(let idx in daynight) {
                                let dn = daynight[idx];
                                for(let d = 0; d < 4; d++) {
                                    let id = 'javascript.0.power.optimize.' + dn + '' + d;
                                    if(!existsState(id + '.samples')) {
                                        createState(id + '.samples', '', {
                                            name: 'Number of samples',
                                            type: 'number'
                                        });
                                    }
                                    if(!existsState(id + '.average')) {
                                        createState(id + '.average', '', {
                                            name: 'Average W over samples',
                                            type: 'number',
                                            unit: 'W'
                                        });
                                    }
                                    if(!existsState(id + '.consumption')) {
                                        createState(id + '.consumption', '', {
                                            name: 'Consumption',
                                            type: 'number',
                                            unit: 'Wh'
                                        });
                                    }
                                }
                            }
                            if(!existsState('javascript.0.power.optimize.daily')) {
                                createState('power.optimize.daily', '', {
                                    name: 'Average daily consumption',
                                    type: 'number',
                                    unit: 'Wh'
                                });
                            }
                            if(!existsState('javascript.0.power.optimize.nightly')) {
                                createState('power.optimize.nightly', '', {
                                    name: 'Average nightly consumption',
                                    type: 'number',
                                    unit: 'Wh'
                                });
                            }
                            if(!existsState('javascript.0.power.optimize.cloudavg')) {
                                createState('power.optimize.cloudavg', '', {
                                    name: 'Average cloud coverage',
                                    type: 'number',
                                    unit: '%'
                                });
                            }
                            if(!existsState('javascript.0.power.optimize.cloudsamples')) {
                                createState('power.optimize.cloudsamples', '', {
                                    name: 'Number of hours for calculated average cloud coverage',
                                    type: 'number',
                                    unit: 'h'
                                });
                            }
                            
                            //* END prepare state objects
                            
                            //* Calculate average power consumption and estimate total power consumption for either day or night (current astrotime)
                            function calcPowerAverages(rotate) {
                                let avg = {
                                    day: 0,
                                    night: 0
                                };
                            
                                for(let idx in daynight) {
                                    let dn = daynight[idx];
                                    let cnt = 0;
                                    let sum = 0;
                                    for(let d = 0; d < 4; d++) {
                                        let val = getState('javascript.0.power.optimize.' + dn + '' + d + '.consumption').val;
                                        if(val) {
                                            cnt++;
                                            sum += val;
                                        }
                                    }
                                    avg[dn] = (cnt > 0 ? sum / cnt : 0);
                                }
                            
                                setState('javascript.0.power.optimize.daily', avg.day, true);
                                setState('javascript.0.power.optimize.nightly', avg.night, true);
                            
                                if(rotate) {
                                    for(let idx in daynight) {
                                        setState('javascript.0.power.optimize.' + daynight[idx] + '3.samples', getState('javascript.0.power.optimize.' + daynight[idx] + '2.samples').val, true);
                                        setState('javascript.0.power.optimize.' + daynight[idx] + '3.average', getState('javascript.0.power.optimize.' + daynight[idx] + '2.average').val, true);
                                        setState('javascript.0.power.optimize.' + daynight[idx] + '3.consumption', getState('javascript.0.power.optimize.' + daynight[idx] + '2.consumption').val, true);
                            
                                        setState('javascript.0.power.optimize.' + daynight[idx] + '2.samples', getState('javascript.0.power.optimize.' + daynight[idx] + '1.samples').val, true);
                                        setState('javascript.0.power.optimize.' + daynight[idx] + '2.average', getState('javascript.0.power.optimize.' + daynight[idx] + '1.average').val, true);
                                        setState('javascript.0.power.optimize.' + daynight[idx] + '2.consumption', getState('javascript.0.power.optimize.' + daynight[idx] + '1.consumption').val, true);
                            
                                        setState('javascript.0.power.optimize.' + daynight[idx] + '1.samples', getState('javascript.0.power.optimize.' + daynight[idx] + '0.samples').val, true);
                                        setState('javascript.0.power.optimize.' + daynight[idx] + '1.average', getState('javascript.0.power.optimize.' + daynight[idx] + '0.average').val, true);
                                        setState('javascript.0.power.optimize.' + daynight[idx] + '1.consumption', getState('javascript.0.power.optimize.' + daynight[idx] + '0.consumption').val, true);
                            
                                        setState('javascript.0.power.optimize.' + daynight[idx] + '0.samples', 0, true);
                                        setState('javascript.0.power.optimize.' + daynight[idx] + '0.average', 0, true);
                                        setState('javascript.0.power.optimize.' + daynight[idx] + '0.consumption', 0, true);
                                    }
                                }
                            }
                            //* END Calculate average power
                            
                            //* Create scedule for power consumption calc and rotate days at 12 am
                            schedule('0 0 * * *', function() {
                                calcPowerAverages(true);
                            });
                            
                            //* Listen on power consumption state of plenticore adapter
                            let subscribeConsumptionId;
                            
                            if(existsState('modbus.0.holdingRegisters.252_Hausverbrauch')) {
                                subscribeConsumptionId = 'modbus.0.holdingRegisters.252_Hausverbrauch';
                            } else if(existsState('plenticore.0.devices.local.Home_P')) {
                                subscribeConsumptionId = 'plenticore.0.devices.local.Home_P';
                            } else {
                                log('NO EXISTING POWER CONSUMPTION STATE FOUND!');
                                stopScript(null);
                            }
                            
                            log('Subscribing to ' + subscribeConsumptionId + ' for home consumption values.');
                            on(subscribeConsumptionId, function(obj) {
                                let dn;
                                if(isAstroDay()) {
                                    dn = 'day';
                                } else {
                                    dn = 'night';
                                }
                            
                                let curavg = getState('javascript.0.power.optimize.' + dn + '0.average').val;
                                let curcnt = getState('javascript.0.power.optimize.' + dn + '0.samples').val;
                            
                                let newavg = ((curavg * curcnt) + obj.state.val) / (curcnt + 1);
                                curcnt++;
                            
                                setState('javascript.0.power.optimize.' + dn + '0.average', newavg, true);
                                setState('javascript.0.power.optimize.' + dn + '0.samples', curcnt, true);
                            
                                //* calc consumption
                                let now = new Date();
                                let sunrise = getAstroDate('sunrise', now.getTime());
                                let sunset = getAstroDate('sunset', now.getTime());
                                if(sunrise > sunset) {
                                    let prevDay = new Date(now.getTime());
                                    prevDay.setDate(prevDay.getDate() - 1);
                                    sunrise = getAstroDate('sunrise', prevDay.getTime());
                                }
                            
                                //* calc hours of (possible) sunshine - daylight
                                let sun_hours = (sunset - sunrise) / 1000 / 60 / 60;
                                sun_hours -= sun_low_power_hours;
                            
                                //* power sum during sun_hours
                                let power_sum;
                                if(dn === 'day') {
                                    power_sum = newavg * sun_hours;
                                } else {
                                    power_sum = newavg * (24 - sun_hours);
                                }
                                setState('javascript.0.power.optimize.' + dn + '0.consumption', power_sum, true);
                            });
                            
                            //* Calculate the minimum SoC for the battery that matches the estimated power generation and consumption values
                            function calcMinSoC() {
                                let tomorrow = new Date();
                            
                                let sunset = getAstroDate('sunset', tomorrow.getTime());
                                if(tomorrow > sunset) {
                                    tomorrow.setDate(tomorrow.getDate() + 1);
                                    sunset = getAstroDate('sunset', tomorrow.getTime());
                                }
                            
                                let sunrise = getAstroDate('sunrise', tomorrow.getTime());
                                if(sunrise > sunset) {
                                    //* We need to get the sunrise from 24h before
                                    let prevDay = new Date(tomorrow.getTime());
                                    prevDay.setDate(prevDay.getDate() - 1);
                                    sunrise = getAstroDate('sunrise', prevDay.getTime());
                                }
                            
                                let mid_summer = new Date(tomorrow.getFullYear(), 5, 21);
                                let mid_winter = new Date(tomorrow.getFullYear(), 11, 21);
                            
                                //* how many days we are from the longest day of the year (21st of June)
                                let days = Math.round((mid_summer - tomorrow) / 1000 / 60 / 60 / 24);
                                days = Math.abs(days);
                                if(days > 182) {
                                days = 364 - days;
                                }
                                if(days > 182) {
                                    //* might occur on leep years
                                    days = 182;
                                }
                            
                                let sun_power_factor = 1 - (0.45 * days / 182); // I experienced about 55% of the summer's maximum power at most when sky is clear
                            
                                //* calc hours of daylight
                                let sun_hours = (sunset - sunrise) / 1000 / 60 / 60;
                                sun_hours -= sun_low_power_hours;
                            
                                let curTime = new Date();
                                let sky = [];
                            
                                //* when will the sun rise (or since how many hours it is already)
                                let sunrise_in = Math.round((sunrise - curTime) / 1000 / 60 / 60);
                                let start = sunrise_in;
                                let end = start;
                                if(sunrise_in < 0) {
                                    start = 0;
                                    end = sunrise_in;
                                }
                                end = Math.round(end + sun_hours - 1);
                                if(end < start) {
                                    end = start;
                                }
                            
                                let hours = 0;
                                let cloudsum = 0;
                                //* get cloud coverage forecast for the daylight hours
                                for(let h = start; h <= end; h++) {
                                    let clouds = getState('weatherunderground.0.forecastHourly.' + h + 'h.sky').val;
                                    cloudsum += clouds;
                                    hours++;
                                }
                            
                                //* reduce estimated sun power by cloud coverage
                                let cloud_avg = cloudsum / hours;
                            
                                let prev_cloud_avg = getState('javascript.0.power.optimize.cloudavg').val;
                                let prevhours = getState('javascript.0.power.optimize.cloudsamples').val;
                                if(prev_cloud_avg) {
                                    if(prevhours >= hours) {
                                        let cur_cloud_avg = cloud_avg;
                                        cloud_avg = Math.round(((2 * prev_cloud_avg) + cloud_avg) / 3);
                                        log('Corrected cloudavg from ' + cur_cloud_avg + ' to ' + cloud_avg + ' (prev was ' + prev_cloud_avg + ').');
                                    }
                                }
                                setState('javascript.0.power.optimize.cloudavg', cloud_avg, true);
                                if(prevhours != hours || !prevhours) {
                                    setState('javascript.0.power.optimize.cloudsamples', hours, true);
                                }
                            
                                let sun_power = plant_power * sun_power_factor * sun_hours * (1 - (cloud_avg / 100));
                            
                                let max_minSoC = 40;
                                let min_minSoC = 0;
                                let minSoC = 40;
                            
                                let daily_cons = getState('javascript.0.power.optimize.daily').val;
                                //* we need at least one daily consumption value otherwise we cannot calc the needed power
                                if(daily_cons) {
                                    //* how many power is left after our estimated home consumption is substracted
                                    let sun_power_left = sun_power - daily_cons;
                                    let possibleCharge;
                                    if(sun_power_left < 0) {
                                        sun_power_left = 0;
                                    }
                            
                                    //* percentage of battery that will possibly be charged tomorrow (or today if we are in astroday time)
                                    possibleCharge = sun_power_left / battery_capacity;
                                    minSoC = Math.round(max_minSoC - (100 * possibleCharge));
                                    //* minSoC must not be below 0
                                    if(minSoC < 0) {
                                        minSoC = 0;
                                    }
                            
                                    log('Avg cloud coverage from ' + (curTime > sunrise ? curTime : sunrise) + ' to ' + sunset + ' is expected to be ' + Math.round(cloud_avg) + '%', 'debug');
                                    log('WU data from ' + start + 'h to ' + end + 'h', 'debug');
                                    log('As possible charge for generated power (' + sun_power + ') reduced by daily consumption (' + daily_cons + ') leads to a max. charge of ' + sun_power_left + 'Wh (' + Math.round(possibleCharge * 100) + '% of ' + battery_capacity + 'Wh) I will set minSoC to ' + minSoC + ' (min ' + min_minSoC + ', max ' + max_minSoC + ').');
                            
                                    let msgadd = '';
                                    let curSoC;
                                    if(existsState('modbus.0.holdingRegisters.514_Battery_SOC')) {
                                        curSoC = getState('modbus.0.holdingRegisters.514_Battery_SOC').val;
                                     } else {
                                        curSoC = getState('plenticore.0.devices.local.battery.SoC').val;
                                    }
                                    //* minSoC to set should not (highly) exceed the current SoC as this would possibly lead to the battery being charged from grid
                                    if(minSoC > curSoC) {
                                        msgadd = ' (von ' + minSoC + ' auf ' + curSoC + ' reduziert)';
                                        minSoC = curSoC;
                                        log('Current SoC of battery is at ' + curSoC + ' so reducing minSoC to this value.');
                                    }
                            
                                    let msg;
                                    let curMinSoC = getState('plenticore.0.devices.local.battery.MinSoc').val;
                                    //* Set new minSoC value if it differs from current
                                    if(curMinSoC != minSoC) {
                                        setState('plenticore.0.devices.local.battery.MinSoc', minSoC);
                                        msg = 'Batterie-MinSoC wurde auf ' + minSoC + ' gesetzt';
                                        msg += msgadd + '.' + "\n";
                                        msg += "Leistung PV: " + Math.round(sun_power) + "Wh\n";
                                        msg += "Verbrauchsprognose: " + Math.round(daily_cons) + "Wh\n";
                                        msg += "Verbleibend: " + Math.round(sun_power_left) + "Wh\n";
                                        msg += "Mögl. Batterieladung: " + Math.round(possibleCharge * 100) + "%\n";
                                        msg += "Bewölkungsprognose: " + Math.round(cloud_avg) + "%\n";
                                        msg += "Sonnenaufgang: " + (new Date(sunrise.getTime())).toGermanTime().toLocaleString() + "\n";
                                        msg += "Sonnenuntergang: " + (new Date(sunset.getTime())).toGermanTime().toLocaleString() + "\n";
                                        sendTo("telegram", {user: "Marius", text: msg});
                                    }
                                }
                            }
                            
                            //* subscribe on weather forecast changes
                            on({id: 'weatherunderground.0.forecastHourly.0h.sky', change: 'any'}, function(obj) {
                                calcMinSoC();
                            });
                            
                            //* Calc on script start (might give javascript errors on first run due to race condition with state object creation)
                            calcPowerAverages(false);
                            
                            //* Calc minimum SoC to set
                            calcMinSoC();
                            
                            1 Reply Last reply Reply Quote 1
                            • StrathCole
                              StrathCole @olfi13 last edited by

                              @olfi13 Bei mir geht es, indem ich folgende Einstellungen mache:

                              Bildschirmfoto von 2019-12-22 13-52-56.png

                              Die Holding Register habe ich wie folgt angelegt, also mit ihrer normalen Adresse laut Beschreibung von Kostal.

                              Bildschirmfoto von 2019-12-22 13-53-08.png

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

                                @StrathCole Kannst du noch etwas konkreter werden was dein Adapter genau macht.
                                Werden damit nur die im Screenshot gezeigten SoC Einstellungen angepasst oder bekommt man auch alle modbus Werte über deinen Adapter?

                                db979796-e74b-4234-b319-eeaa7694c87f-image.png

                                Ich habe mich bisher noch nie mit den SoC Einstellungen befasst und was ich damit optimieren kann.
                                In der Regel lädt mein Akku voll wenn genug Leistung anliegt. Verstehe ich es richtig dass deiner nur bis 50% geladen wird und der Überschuss eingespeist wird und nicht im Akku landet?

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

                                  @Diginix
                                  Also, der Adapter holt sich alle Werte, die es auch im Interface zu sehen gibt (Momentanwerte, Einstellungen …), aktuell lese ich die Statistikdaten (Tag, Monat, Jahr) noch nicht aus, das kommt aber dann noch.
                                  Vorteil ist halt, dass man die Werte auch setzen kann.

                                  Der minSoC bedeutet, wie weit die Batterie entladen wird. Wenn man die intelligente Batteriesteuerung aktiv hat, kann man dort auf "Dynamisch" stellen. Dann passt KOSTAL den Wert automatisch an. Diese Automatik war mir aber zu blöd.

                                  Mein Installateur hat mir geraten, den MinSoC nicht die ganze Zeit zu niedrig zu haben, sondern im Winter Richtung 20 anzupassen. Ich wollte den Wert aber nicht fix für Winter und Sommer setzen, sondern anhand der Wetterprognose und Verbrauchsdaten anpassen.

                                  Nehmen wir an, dass eine Woche lang kaum Sonne scheint, dann wäre ein MinSoC von 5 ungünstig, weil die Batterie die ganze Zeit am unteren Ende rumkrebst. Ist wohl nicht förderlich für die Lebensdauer. Genauso ist es unsinnig, wenn der MinSoc auf 30 oder sogar 50 steht, wenn die Sonne voraussichtlich viel scheint, denn dann entlädt er die Batterie nicht unter diesen %-Wert und somit verschwendet man Leistung.

                                  Es ist also nicht wie du schreibst, die maximale Ladung, sondern die maximale Entladung.

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

                                    Hier ein Screenshot des aktuellen Objekt-Baums (wie gesagt, ist noch frühes Stadium und nicht alles implementiert).

                                    Bildschirmfoto von 2019-12-22 16-10-14.png
                                    Bildschirmfoto von 2019-12-22 16-10-27.png

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

                                      @StrathCole Moin, erstmal cool dass du dir die Arbeit gemacht hast, ich wollte es gerade mal testen, Allerdings bekomme ich auf meinem Slave nur die Meldung : "startInstance system.adapter.plenticore.0: required adapter "admin" not found!".
                                      Kann er ja auch nicht finden da die auf dem Master ist. Wäre cool wenn du das ändern könntest 🙂

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

                                        @Marco-Laser oje. Kannst du mir auf die Sprünge helfen?
                                        Bin komplett neu bei ioBroker und weiß gar nicht, wie master und slave funktionieren. Habe das Adapter-Template als Ausgangspunkt genutzt inkl. der angegebenen Dependencys.

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

                                          @StrathCole habe leider keine Ahnung von der Programmierung von Adaptern aber kannst du vielleicht einfach die Admin Instanz aus den Dependencys raus nehmen?

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

                                            @Marco-Laser Hab das nun mal gemacht. Die Abhängigkeit sollte nicht mehr existieren.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            728
                                            Online

                                            31.6k
                                            Users

                                            79.4k
                                            Topics

                                            1.3m
                                            Posts

                                            83
                                            1298
                                            311784
                                            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