Skip to content
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Hardware
  4. IOBroker Anbindung an einen Kostal Plenticore

NEWS

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

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

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

IOBroker Anbindung an einen Kostal Plenticore

Geplant Angeheftet Gesperrt Verschoben Hardware
1.3k Beiträge 83 Kommentatoren 452.0k Aufrufe 72 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • Marco LaserM Marco Laser

    @StrathCole Und das soll jetzt funktionieren ? Also auf was anderes als 0 setzten klappt, ohne Probleme aber 0 iwie nicht (V1.4)

    StrathColeS Offline
    StrathColeS Offline
    StrathCole
    schrieb am zuletzt editiert von
    #73

    @Marco-Laser Seltsam. Und es dauert auch nicht nur einen Moment, bis er es aktualisiert? Bei mir kann ich problemlos auf 0 setzen. 😕

    SolarWatt-Anlage mit 9,6 kWp – KOSTAL Plenticore Plus 10 – BYD B-Box HV 8,96 – Viessmann Vitocal 333g – Zehnder ComfoD 350 (Comfoair 350) mit RS232-Ethernet-Konverter

    Marco LaserM 1 Antwort Letzte Antwort
    0
    • StrathColeS StrathCole

      @Marco-Laser Seltsam. Und es dauert auch nicht nur einen Moment, bis er es aktualisiert? Bei mir kann ich problemlos auf 0 setzen. 😕

      Marco LaserM Offline
      Marco LaserM Offline
      Marco Laser
      schrieb am zuletzt editiert von
      #74

      @StrathCole Ui das ging schnell 😛 ne bei 0 wirds Rot und beim nächsten Poll zurück gesetzt alle anderen werden Grün und dann auch nicht zurück gesetzt. Gleiches gilt auch für ext. module control, kann ich auch nicht ändern wird auch zurück gesetzt

      1 Antwort Letzte Antwort
      0
      • StrathColeS Offline
        StrathColeS Offline
        StrathCole
        schrieb am zuletzt editiert von
        #75

        Ext. Module Control habe ich deaktiviert. Das wird im UI immer automatisch auf 0 gesetzt, wenn man die Einstellungen für das Schattenmanagement ändert.
        Hast du den Datenpunkt denn gelöscht gehabt, sodass er nun eine Auswahlbox zeigt, wenn du etwas ändern willst (mit Text)?

        SolarWatt-Anlage mit 9,6 kWp – KOSTAL Plenticore Plus 10 – BYD B-Box HV 8,96 – Viessmann Vitocal 333g – Zehnder ComfoD 350 (Comfoair 350) mit RS232-Ethernet-Konverter

        Marco LaserM 1 Antwort Letzte Antwort
        0
        • StrathColeS StrathCole

          Ext. Module Control habe ich deaktiviert. Das wird im UI immer automatisch auf 0 gesetzt, wenn man die Einstellungen für das Schattenmanagement ändert.
          Hast du den Datenpunkt denn gelöscht gehabt, sodass er nun eine Auswahlbox zeigt, wenn du etwas ändern willst (mit Text)?

          Marco LaserM Offline
          Marco LaserM Offline
          Marco Laser
          schrieb am zuletzt editiert von
          #76

          @StrathCole Jap hab Auswahlboxen gehabt und auch jetzt nochmal gelöscht aber ändert nix 🤔

          StrathColeS 1 Antwort Letzte Antwort
          0
          • Marco LaserM Marco Laser

            @StrathCole Jap hab Auswahlboxen gehabt und auch jetzt nochmal gelöscht aber ändert nix 🤔

            StrathColeS Offline
            StrathColeS Offline
            StrathCole
            schrieb am zuletzt editiert von
            #77

            @Marco-Laser Gibt's doch nicht …
            Da bräuchte ich jetzt vermutlich Infos aus der Developer-Konsole von deinem Browser, während du in der UI den Wert auf "Disabled" stellst. Nutzt du dafür Chrome oder Firefox?

            SolarWatt-Anlage mit 9,6 kWp – KOSTAL Plenticore Plus 10 – BYD B-Box HV 8,96 – Viessmann Vitocal 333g – Zehnder ComfoD 350 (Comfoair 350) mit RS232-Ethernet-Konverter

            1 Antwort Letzte Antwort
            0
            • DiginixD Offline
              DiginixD Offline
              Diginix
              schrieb am zuletzt editiert von Diginix
              #78

              @StrathCole Habe eben von 0.1.4 auf 2.0.0 aktualisiert (alle vorherigen Updates wurden mir nie angeboten).
              Soweit scheint alles zu funktionieren.

              Hab die Doku in Git nur kurz überflogen. Kannst du vllt hier noch bissel was zum neuen Bereich "Leistungsprognose" schreiben.

              ..:: So long! Tom ::..

              NUC7i3 (Ubuntu Proxmox VM) | Echo Dots 2+3. Gen | Xiaomi Sensoren | Mi Robot 1S | Yeelight | Sonoff | Shelly | H801 RGB | Gosund SP1 | NodeMCU+ESP32 | Kostal Plenticore PV+BYD | openWB

              StrathColeS 1 Antwort Letzte Antwort
              0
              • DiginixD Diginix

                @StrathCole Habe eben von 0.1.4 auf 2.0.0 aktualisiert (alle vorherigen Updates wurden mir nie angeboten).
                Soweit scheint alles zu funktionieren.

                Hab die Doku in Git nur kurz überflogen. Kannst du vllt hier noch bissel was zum neuen Bereich "Leistungsprognose" schreiben.

                StrathColeS Offline
                StrathColeS Offline
                StrathCole
                schrieb am zuletzt editiert von StrathCole
                #79

                @Diginix sagte in IOBroker Anbindung an einen Kostal Plenticore:

                @StrathCole Habe eben von 0.1.4 auf 2.0.0 aktualisiert (alle vorherigen Updates wurden mir nie angeboten).
                Soweit scheint alles zu funktionieren.

                Hab die Doku in Git nur kurz überflogen. Kannst du vllt hier noch bissel was zum neuen Bereich "Leistungsprognose" schreiben.

                Der Adapter ist gerade erst im latest Repository gelandet, daher gab es die vorherigen Updates immer nur via manuellem Git-Update.

                Zum Forecast:
                Ich habe für mich eine Funktion benötigt, anhand derer ich abschätzen kann, ob ich "stromfressende" Dinge starte, wie z. B. die Warmwasseraufheizung auf 60° statt 50° usw.
                Also habe ich die Basisberechnung zur PV-Leistung aus dem Forum genommen, die anhand der Eingabedaten zu Neigung und Ausrichtung sowie Effizienz und Gesamtfläche der Module eine mögliche Leistung über den Tag verteilt berechnet. Dabei wird dann die Geo-Position und somit der Sonnenstand einbezogen.

                Diese Werte kombiniere ich dann mit den Werten der Wettervorhersagen entweder aus dem DarkSky-Adapter oder Weatherunderground (muss jeder schauen, welcher Dienst die besseren Vorhersagen in der Region liefert).

                Daraus ergibt sich dann eine prognostizierte Leistung der PV-Anlage in den einzelnen Sonnenstunden des Tages.

                Weiterhin nimmt der Adapter die laufenden Verbrauchswerte des Hausverbrauchs (sofern im KOSTAL vorhanden) und bildet daraus einen Nacht- und eine Tagsdurchschnitt. So kann man sehen, wie viel Überschuss voraussichtlich am aktuellen Tag noch produziert wird.

                Bei aktiviertem MinSoC wird dann der minimale Entladestand der Batterie automatisch angepasst, je nachdem wie die Werte für den nächsten Tag erwartet werden (damit keine Energie verschwendet, aber die Batterie auch nicht zu sehr entladen wird, wenn am nächsten Tag nicht genug Leistung zum Wiederaufladen da wäre).

                Ich nutze das Ganze zum Beispiel für meine Viessmann Heizung mit dem Adapter viessmannapi wie folgt:

                
                if(existsState('javascript.0.heizung.dhw.lastrun') === false) {
                    createState('heizung.dhw.lastrun', 0, {name: 'Letzter gestarteter Aufheizprozess', unit: '', type: 'number', role: 'value'});
                }
                if(existsState('javascript.0.heizung.dhw.pvsince') === false) {
                    createState('heizung.dhw.pvsince', 0, {name: 'Beginn des Überschusszeitraums', unit: '', type: 'number', role: 'value'});
                }
                
                let low_power = 0;
                let battery_capacity = 8960;
                
                function calcHeatingPower() {
                    let dc1 = getState('modbus.0.holdingRegisters.260_PV_Leistung 1').val;
                    let dc2 = getState('modbus.0.holdingRegisters.270_PV_Leistung 2').val;
                    
                    //* calculate current overall PV power
                    let pvpower = dc1 + dc2;
                
                    //* get current battery power state of charging (+ for discharging, - for charging)
                    let batt_charge = getState('modbus.0.holdingRegisters.582_Batterieladung').val;
                    let batt_charge_signed = batt_charge;
                    if(batt_charge > 0) {
                        batt_charge = 0;
                    }
                
                    //* current home power consumption
                    let house_usage = getState('modbus.0.holdingRegisters.252_Hausverbrauch').val;
                    //* thereof provided by PV
                    let house_from_pv = getState('modbus.0.holdingRegisters.116_Verbrauch_aus PV').val;
                    //* current battery state of charge in percent
                    let batt_soc = getState('modbus.0.holdingRegisters.514_Battery_SOC').val;
                
                    let inv_output = getState('modbus.0.holdingRegisters.575_Wechselrichteroutput').val;
                
                    //* power adjusted by battery charge
                    let pvpower_real = inv_output - batt_charge_signed;
                    if(pvpower_real < 0) {
                        pvpower_real = 0;
                    }
                
                    //* remaining power that possibly would be sent to grid
                    let rest = pvpower + batt_charge - house_from_pv;
                    let rest_real = rest - 40;
                    //* half of battery charging power is ignored for calculation
                    rest_real = rest - (batt_charge / 2);
                
                    let curTime = new Date();
                
                    log('PV: ' + pvpower + " (" + pvpower_real + "), WR: " + inv_output + ", Charge: " + batt_charge + " (" + batt_charge_signed + ", " + batt_soc + "), House: " + house_from_pv + " (" + house_usage + "), Überschuss: " + rest + " (" + rest_real + ")", 'debug');
                    
                    let sunrise;
                    let sunset = getAstroDate('sunset');
                    if(sunset.getTime() < curTime.getTime()) {
                        let nextDay = new Date(curTime.getTime());
                        nextDay.setDate(nextDay.getDate() + 1);
                        sunset = getAstroDate('sunset', nextDay.getTime());
                        sunrise = getAstroDate('sunrise', nextDay.getTime());
                    } else {
                        sunrise = getAstroDate('sunrise');
                    }
                    if(sunrise > sunset) {
                        let prevDay = new Date(sunrise.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;
                    let highForecast = false;
                
                    let powerUntilSunset = 0;
                    let powerStartTime = new Date(curTime.getTime());
                    if(powerStartTime.getTime() < sunrise.getTime()) {
                        powerStartTime.setTime(sunrise.getTime());
                    }
                    let powerTime = new Date(powerStartTime.getTime()).toGermanTime();
                    let powerHours = (sunset.getTime() - powerStartTime.getTime()) / 1000 / 60 / 60;
                    if(powerHours > 0) {
                        log('There are ' + powerHours + ' of ' + sun_hours + ' hours of sun time left to take into account.');
                        let fcH = 0;
                        for(let p = powerHours; p > 0; p--) {
                            fcH++;
                            let fcPower = (existsState('plenticore.0.forecast.power.' + Math.ceil(sun_hours + 1 - p) + 'h.power') ? getState('plenticore.0.forecast.power.' + Math.ceil(sun_hours + 1 - p) + 'h.power').val : 0);
                            //log('Power for fc hour ' + (powerTime.getHours() + fcH) + ' is ' + fcPower);
                            if(fcPower) {
                                if(p < 1) {
                                    fcPower = fcPower * p;
                                    //log('Power for fc hour ' + (powerTime.getHours() + fcH) + ' is ' + fcPower + ' because of factor ' + p);
                                }
                                powerUntilSunset += fcPower;
                            }
                        }
                
                        let powerUsageForecast = getState('plenticore.0.forecast.consumption.day').val * powerHours / sun_hours;
                        let neededBatteryCharge = 1.1 * battery_capacity * (100 - batt_soc) / 100;
                        log('FC: ' + powerUntilSunset + 'W. Usage forecast is ' + powerUsageForecast + ', needed battery power is about ' + neededBatteryCharge);
                        if(powerUntilSunset > (powerUsageForecast * 1.1) + neededBatteryCharge && powerUntilSunset - powerUsageForecast - neededBatteryCharge >= 3000) {
                            highForecast = true;
                            log('We are at a very high forecast currently.');
                        }
                    }
                
                    let curMinSoC = getState('plenticore.0.devices.local.battery.MinSoc').val;
                
                    //* since when (timestamp) power is sent to grid
                    let pv_plus_since = getState('javascript.0.heizung.dhw.pvsince').val
                    let pv_plus_for = 0;
                    if((highForecast || curMinSoC <= 30 || batt_soc >= 80) && rest_real > 200) {
                        low_power = 0;
                        if(!pv_plus_since) {
                            setState('javascript.0.heizung.dhw.pvsince', (new Date()).getTime());
                        } else {
                            //* how long (minutes) power is already sent to grid
                            let curtime = (new Date()).getTime();
                            pv_plus_for = Math.round((curtime - pv_plus_since) / 1000 / 60);
                        }
                    } else if(low_power > 2) {
                        //* low power for more than 2 loops, so reset the "since" timestamp
                        setState('javascript.0.heizung.dhw.pvsince', 0);
                        low_power = 0;
                    } else {
                        // no rest, so reset the timer if more than 2 times lower than needed
                        low_power++;
                    }
                
                    //* if we have enough power generated for a long enough period
                    if((pv_plus_for >= 5 || (pv_plus_for >= 2 && batt_soc > 85) || (pv_plus_for >= 3 && highForecast === true)) && rest_real > 400 && batt_soc > 40 && (batt_charge < -1500 || batt_soc > 75 || highForecast === true)) {
                        //* check if warm water charging is currently active
                        let dhw_active = getState('viessmannapi.0.heating.dhw.charging.active').val;
                        if(!dhw_active) {
                            //* check current warm water temperature
                            let temp = getState('viessmannapi.0.heating.dhw.sensors.temperature.hotWaterStorage.top.value').val;
                            let targetTemperature = 60;
                            //* if we have enough power but not that much, we lower the warm water temp by 5°C
                            if(pvpower < 3000 || (rest_real < 1000 && batt_soc < 80)) {
                                targetTemperature = 55;
                            }
                            if(targetTemperature > temp + 7.5) {
                                targetTemperature = temp + 8;
                            }
                            if(targetTemperature < 55) {
                                targetTemperature = 55;
                            }
                            log('WW-Temperatur: ' + temp + '°C', 'info');
                            //* if current temperature is less than 6°C below the desired temperature
                            if(temp <= targetTemperature - 5) {
                                //* check if last charging was completed more than 10 minutes ago
                                let last = getState('javascript.0.heizung.dhw.lastrun').val;
                                let checkLast = new Date();
                                checkLast.setMinutes(checkLast.getMinutes() - 10);
                                if(last < checkLast.getTime())  {
                                    //* if this is true the request for one time charging was not fulfilled by the heater
                                    let started = getState('viessmannapi.0.heating.dhw.oneTimeCharge.active').val;
                                    if(!started) {
                                        //* set new desired temperature and start charging now
                                        log('Starte Warmwassergenerierung.');
                                        setState('javascript.0.heizung.dhw.lastrun', (new Date()).getTime());
                                        let curTargetTemp = getState('viessmannapi.0.heating.dhw.temperature.temp2.value').val;
                                        if(curTargetTemp != targetTemperature) {
                                            sendTo('viessmannapi.0', 'action', {
                                                feature: 'heating.dhw.temperature.temp2',
                                                action: 'setTargetTemperature',
                                                payload: {temperature: targetTemperature}
                                            });                        
                                        }
                                        sendTo('viessmannapi.0', 'action', {
                                            feature: 'heating.dhw.oneTimeCharge',
                                            action: 'activate',
                                            payload: {}
                                        });
                                    } else {
                                        log('WW-Generierung bereits angefordert, aber noch nicht gestartet.');
                                    }
                                } else {
                                    log('Warmwassergenerierung nicht lang genug her (' + Math.round(((new Date()).getTime() - last) / 1000 / 60) + ').', 'debug');
                                }
                            }
                        } else {
                            let temp = getState('viessmannapi.0.heating.dhw.sensors.temperature.hotWaterStorage.top.value').val;
                            log('Warmwassergenerierung läuft bereits.', 'debug');
                            log('WW-Temperatur: ' + temp + '°C', 'debug');
                        }
                    } else if(rest_real > 100 && pv_plus_for > 0 && pv_plus_for < 5) {
                        log('PV Überschuss erst seit ' + pv_plus_for + ' Minute(n).', 'debug');
                    }
                }
                
                //* subscribe to changes in modbus value of inverter output
                on({ id: 'modbus.0.holdingRegisters.575_Wechselrichteroutput', change: "ne" }, function (obj) {
                    calcHeatingPower();
                });
                calcHeatingPower();
                
                //* subscribe on hot water charging state
                on({id: 'viessmannapi.0.heating.dhw.charging.active', change: 'ne'}, function(obj) {
                    //* set last run marker (timestamp) on each state change
                    if(obj.state.val == true) {
                        log('Warmwassergenerierung gestartet.');
                        setState('javascript.0.heizung.dhw.lastrun', (new Date()).getTime());
                    } else {
                        log('Warmwassergenerierung beendet.');
                        setState('javascript.0.heizung.dhw.lastrun', (new Date()).getTime());
                
                        //* reset target hot water temperature for one-time-charging to 55°C
                        let targetTemp = getState('viessmannapi.0.heating.dhw.temperature.temp2.value').val;
                        if(targetTemp > 55) {
                            sendTo('viessmannapi.0', 'action', {
                                feature: 'heating.dhw.temperature.temp2',
                                action: 'setTargetTemperature',
                                payload: {temperature: 55}
                            });
                        }
                    }
                });
                
                schedule('*/5 * * * *', function() {
                    let last = getState('javascript.0.heizung.dhw.lastrun').val;
                    let checkLast = new Date();
                    checkLast.setMinutes(checkLast.getMinutes() - 10);
                    if(last < checkLast.getTime())  {
                        //* if this is true the request for one time charging was not fulfilled by the heater
                        let started = getState('viessmannapi.0.heating.dhw.oneTimeCharge.active').val;
                        let dhw_active = getState('viessmannapi.0.heating.dhw.charging.active').val;
                        if(started && !dhw_active) {
                            log('Stoppe Warmwassergenerierung. Charge ist nicht "true".');
                            setState('javascript.0.heizung.dhw.lastrun', (new Date()).getTime());
                            sendTo('viessmannapi.0', 'action', {
                                feature: 'heating.dhw.oneTimeCharge',
                                action: 'deactivate',
                                payload: {}
                            });
                        }
                    }
                });
                

                Es kann sein, dass da noch was optimiert werden müsste, da ich die Prognose vorher in Javascript gemacht hatte statt im Adapter und das im Skript noch nicht 100% angepasst wurde.

                SolarWatt-Anlage mit 9,6 kWp – KOSTAL Plenticore Plus 10 – BYD B-Box HV 8,96 – Viessmann Vitocal 333g – Zehnder ComfoD 350 (Comfoair 350) mit RS232-Ethernet-Konverter

                DiginixD 1 Antwort Letzte Antwort
                2
                • StrathColeS StrathCole

                  @Diginix sagte in IOBroker Anbindung an einen Kostal Plenticore:

                  @StrathCole Habe eben von 0.1.4 auf 2.0.0 aktualisiert (alle vorherigen Updates wurden mir nie angeboten).
                  Soweit scheint alles zu funktionieren.

                  Hab die Doku in Git nur kurz überflogen. Kannst du vllt hier noch bissel was zum neuen Bereich "Leistungsprognose" schreiben.

                  Der Adapter ist gerade erst im latest Repository gelandet, daher gab es die vorherigen Updates immer nur via manuellem Git-Update.

                  Zum Forecast:
                  Ich habe für mich eine Funktion benötigt, anhand derer ich abschätzen kann, ob ich "stromfressende" Dinge starte, wie z. B. die Warmwasseraufheizung auf 60° statt 50° usw.
                  Also habe ich die Basisberechnung zur PV-Leistung aus dem Forum genommen, die anhand der Eingabedaten zu Neigung und Ausrichtung sowie Effizienz und Gesamtfläche der Module eine mögliche Leistung über den Tag verteilt berechnet. Dabei wird dann die Geo-Position und somit der Sonnenstand einbezogen.

                  Diese Werte kombiniere ich dann mit den Werten der Wettervorhersagen entweder aus dem DarkSky-Adapter oder Weatherunderground (muss jeder schauen, welcher Dienst die besseren Vorhersagen in der Region liefert).

                  Daraus ergibt sich dann eine prognostizierte Leistung der PV-Anlage in den einzelnen Sonnenstunden des Tages.

                  Weiterhin nimmt der Adapter die laufenden Verbrauchswerte des Hausverbrauchs (sofern im KOSTAL vorhanden) und bildet daraus einen Nacht- und eine Tagsdurchschnitt. So kann man sehen, wie viel Überschuss voraussichtlich am aktuellen Tag noch produziert wird.

                  Bei aktiviertem MinSoC wird dann der minimale Entladestand der Batterie automatisch angepasst, je nachdem wie die Werte für den nächsten Tag erwartet werden (damit keine Energie verschwendet, aber die Batterie auch nicht zu sehr entladen wird, wenn am nächsten Tag nicht genug Leistung zum Wiederaufladen da wäre).

                  Ich nutze das Ganze zum Beispiel für meine Viessmann Heizung mit dem Adapter viessmannapi wie folgt:

                  
                  if(existsState('javascript.0.heizung.dhw.lastrun') === false) {
                      createState('heizung.dhw.lastrun', 0, {name: 'Letzter gestarteter Aufheizprozess', unit: '', type: 'number', role: 'value'});
                  }
                  if(existsState('javascript.0.heizung.dhw.pvsince') === false) {
                      createState('heizung.dhw.pvsince', 0, {name: 'Beginn des Überschusszeitraums', unit: '', type: 'number', role: 'value'});
                  }
                  
                  let low_power = 0;
                  let battery_capacity = 8960;
                  
                  function calcHeatingPower() {
                      let dc1 = getState('modbus.0.holdingRegisters.260_PV_Leistung 1').val;
                      let dc2 = getState('modbus.0.holdingRegisters.270_PV_Leistung 2').val;
                      
                      //* calculate current overall PV power
                      let pvpower = dc1 + dc2;
                  
                      //* get current battery power state of charging (+ for discharging, - for charging)
                      let batt_charge = getState('modbus.0.holdingRegisters.582_Batterieladung').val;
                      let batt_charge_signed = batt_charge;
                      if(batt_charge > 0) {
                          batt_charge = 0;
                      }
                  
                      //* current home power consumption
                      let house_usage = getState('modbus.0.holdingRegisters.252_Hausverbrauch').val;
                      //* thereof provided by PV
                      let house_from_pv = getState('modbus.0.holdingRegisters.116_Verbrauch_aus PV').val;
                      //* current battery state of charge in percent
                      let batt_soc = getState('modbus.0.holdingRegisters.514_Battery_SOC').val;
                  
                      let inv_output = getState('modbus.0.holdingRegisters.575_Wechselrichteroutput').val;
                  
                      //* power adjusted by battery charge
                      let pvpower_real = inv_output - batt_charge_signed;
                      if(pvpower_real < 0) {
                          pvpower_real = 0;
                      }
                  
                      //* remaining power that possibly would be sent to grid
                      let rest = pvpower + batt_charge - house_from_pv;
                      let rest_real = rest - 40;
                      //* half of battery charging power is ignored for calculation
                      rest_real = rest - (batt_charge / 2);
                  
                      let curTime = new Date();
                  
                      log('PV: ' + pvpower + " (" + pvpower_real + "), WR: " + inv_output + ", Charge: " + batt_charge + " (" + batt_charge_signed + ", " + batt_soc + "), House: " + house_from_pv + " (" + house_usage + "), Überschuss: " + rest + " (" + rest_real + ")", 'debug');
                      
                      let sunrise;
                      let sunset = getAstroDate('sunset');
                      if(sunset.getTime() < curTime.getTime()) {
                          let nextDay = new Date(curTime.getTime());
                          nextDay.setDate(nextDay.getDate() + 1);
                          sunset = getAstroDate('sunset', nextDay.getTime());
                          sunrise = getAstroDate('sunrise', nextDay.getTime());
                      } else {
                          sunrise = getAstroDate('sunrise');
                      }
                      if(sunrise > sunset) {
                          let prevDay = new Date(sunrise.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;
                      let highForecast = false;
                  
                      let powerUntilSunset = 0;
                      let powerStartTime = new Date(curTime.getTime());
                      if(powerStartTime.getTime() < sunrise.getTime()) {
                          powerStartTime.setTime(sunrise.getTime());
                      }
                      let powerTime = new Date(powerStartTime.getTime()).toGermanTime();
                      let powerHours = (sunset.getTime() - powerStartTime.getTime()) / 1000 / 60 / 60;
                      if(powerHours > 0) {
                          log('There are ' + powerHours + ' of ' + sun_hours + ' hours of sun time left to take into account.');
                          let fcH = 0;
                          for(let p = powerHours; p > 0; p--) {
                              fcH++;
                              let fcPower = (existsState('plenticore.0.forecast.power.' + Math.ceil(sun_hours + 1 - p) + 'h.power') ? getState('plenticore.0.forecast.power.' + Math.ceil(sun_hours + 1 - p) + 'h.power').val : 0);
                              //log('Power for fc hour ' + (powerTime.getHours() + fcH) + ' is ' + fcPower);
                              if(fcPower) {
                                  if(p < 1) {
                                      fcPower = fcPower * p;
                                      //log('Power for fc hour ' + (powerTime.getHours() + fcH) + ' is ' + fcPower + ' because of factor ' + p);
                                  }
                                  powerUntilSunset += fcPower;
                              }
                          }
                  
                          let powerUsageForecast = getState('plenticore.0.forecast.consumption.day').val * powerHours / sun_hours;
                          let neededBatteryCharge = 1.1 * battery_capacity * (100 - batt_soc) / 100;
                          log('FC: ' + powerUntilSunset + 'W. Usage forecast is ' + powerUsageForecast + ', needed battery power is about ' + neededBatteryCharge);
                          if(powerUntilSunset > (powerUsageForecast * 1.1) + neededBatteryCharge && powerUntilSunset - powerUsageForecast - neededBatteryCharge >= 3000) {
                              highForecast = true;
                              log('We are at a very high forecast currently.');
                          }
                      }
                  
                      let curMinSoC = getState('plenticore.0.devices.local.battery.MinSoc').val;
                  
                      //* since when (timestamp) power is sent to grid
                      let pv_plus_since = getState('javascript.0.heizung.dhw.pvsince').val
                      let pv_plus_for = 0;
                      if((highForecast || curMinSoC <= 30 || batt_soc >= 80) && rest_real > 200) {
                          low_power = 0;
                          if(!pv_plus_since) {
                              setState('javascript.0.heizung.dhw.pvsince', (new Date()).getTime());
                          } else {
                              //* how long (minutes) power is already sent to grid
                              let curtime = (new Date()).getTime();
                              pv_plus_for = Math.round((curtime - pv_plus_since) / 1000 / 60);
                          }
                      } else if(low_power > 2) {
                          //* low power for more than 2 loops, so reset the "since" timestamp
                          setState('javascript.0.heizung.dhw.pvsince', 0);
                          low_power = 0;
                      } else {
                          // no rest, so reset the timer if more than 2 times lower than needed
                          low_power++;
                      }
                  
                      //* if we have enough power generated for a long enough period
                      if((pv_plus_for >= 5 || (pv_plus_for >= 2 && batt_soc > 85) || (pv_plus_for >= 3 && highForecast === true)) && rest_real > 400 && batt_soc > 40 && (batt_charge < -1500 || batt_soc > 75 || highForecast === true)) {
                          //* check if warm water charging is currently active
                          let dhw_active = getState('viessmannapi.0.heating.dhw.charging.active').val;
                          if(!dhw_active) {
                              //* check current warm water temperature
                              let temp = getState('viessmannapi.0.heating.dhw.sensors.temperature.hotWaterStorage.top.value').val;
                              let targetTemperature = 60;
                              //* if we have enough power but not that much, we lower the warm water temp by 5°C
                              if(pvpower < 3000 || (rest_real < 1000 && batt_soc < 80)) {
                                  targetTemperature = 55;
                              }
                              if(targetTemperature > temp + 7.5) {
                                  targetTemperature = temp + 8;
                              }
                              if(targetTemperature < 55) {
                                  targetTemperature = 55;
                              }
                              log('WW-Temperatur: ' + temp + '°C', 'info');
                              //* if current temperature is less than 6°C below the desired temperature
                              if(temp <= targetTemperature - 5) {
                                  //* check if last charging was completed more than 10 minutes ago
                                  let last = getState('javascript.0.heizung.dhw.lastrun').val;
                                  let checkLast = new Date();
                                  checkLast.setMinutes(checkLast.getMinutes() - 10);
                                  if(last < checkLast.getTime())  {
                                      //* if this is true the request for one time charging was not fulfilled by the heater
                                      let started = getState('viessmannapi.0.heating.dhw.oneTimeCharge.active').val;
                                      if(!started) {
                                          //* set new desired temperature and start charging now
                                          log('Starte Warmwassergenerierung.');
                                          setState('javascript.0.heizung.dhw.lastrun', (new Date()).getTime());
                                          let curTargetTemp = getState('viessmannapi.0.heating.dhw.temperature.temp2.value').val;
                                          if(curTargetTemp != targetTemperature) {
                                              sendTo('viessmannapi.0', 'action', {
                                                  feature: 'heating.dhw.temperature.temp2',
                                                  action: 'setTargetTemperature',
                                                  payload: {temperature: targetTemperature}
                                              });                        
                                          }
                                          sendTo('viessmannapi.0', 'action', {
                                              feature: 'heating.dhw.oneTimeCharge',
                                              action: 'activate',
                                              payload: {}
                                          });
                                      } else {
                                          log('WW-Generierung bereits angefordert, aber noch nicht gestartet.');
                                      }
                                  } else {
                                      log('Warmwassergenerierung nicht lang genug her (' + Math.round(((new Date()).getTime() - last) / 1000 / 60) + ').', 'debug');
                                  }
                              }
                          } else {
                              let temp = getState('viessmannapi.0.heating.dhw.sensors.temperature.hotWaterStorage.top.value').val;
                              log('Warmwassergenerierung läuft bereits.', 'debug');
                              log('WW-Temperatur: ' + temp + '°C', 'debug');
                          }
                      } else if(rest_real > 100 && pv_plus_for > 0 && pv_plus_for < 5) {
                          log('PV Überschuss erst seit ' + pv_plus_for + ' Minute(n).', 'debug');
                      }
                  }
                  
                  //* subscribe to changes in modbus value of inverter output
                  on({ id: 'modbus.0.holdingRegisters.575_Wechselrichteroutput', change: "ne" }, function (obj) {
                      calcHeatingPower();
                  });
                  calcHeatingPower();
                  
                  //* subscribe on hot water charging state
                  on({id: 'viessmannapi.0.heating.dhw.charging.active', change: 'ne'}, function(obj) {
                      //* set last run marker (timestamp) on each state change
                      if(obj.state.val == true) {
                          log('Warmwassergenerierung gestartet.');
                          setState('javascript.0.heizung.dhw.lastrun', (new Date()).getTime());
                      } else {
                          log('Warmwassergenerierung beendet.');
                          setState('javascript.0.heizung.dhw.lastrun', (new Date()).getTime());
                  
                          //* reset target hot water temperature for one-time-charging to 55°C
                          let targetTemp = getState('viessmannapi.0.heating.dhw.temperature.temp2.value').val;
                          if(targetTemp > 55) {
                              sendTo('viessmannapi.0', 'action', {
                                  feature: 'heating.dhw.temperature.temp2',
                                  action: 'setTargetTemperature',
                                  payload: {temperature: 55}
                              });
                          }
                      }
                  });
                  
                  schedule('*/5 * * * *', function() {
                      let last = getState('javascript.0.heizung.dhw.lastrun').val;
                      let checkLast = new Date();
                      checkLast.setMinutes(checkLast.getMinutes() - 10);
                      if(last < checkLast.getTime())  {
                          //* if this is true the request for one time charging was not fulfilled by the heater
                          let started = getState('viessmannapi.0.heating.dhw.oneTimeCharge.active').val;
                          let dhw_active = getState('viessmannapi.0.heating.dhw.charging.active').val;
                          if(started && !dhw_active) {
                              log('Stoppe Warmwassergenerierung. Charge ist nicht "true".');
                              setState('javascript.0.heizung.dhw.lastrun', (new Date()).getTime());
                              sendTo('viessmannapi.0', 'action', {
                                  feature: 'heating.dhw.oneTimeCharge',
                                  action: 'deactivate',
                                  payload: {}
                              });
                          }
                      }
                  });
                  

                  Es kann sein, dass da noch was optimiert werden müsste, da ich die Prognose vorher in Javascript gemacht hatte statt im Adapter und das im Skript noch nicht 100% angepasst wurde.

                  DiginixD Offline
                  DiginixD Offline
                  Diginix
                  schrieb am zuletzt editiert von Diginix
                  #80

                  @StrathCole Da hast du den Adapter aber nun echt mächtig gemacht. Respekt.

                  Mit dem Überschuss erzeuge ich auch warmes Wasser, aber das wird in Echtzeit entschieden.
                  Sobald genug eingespeist wird und der Akku voll oder ausreichend geladen wird, schaltet ein Sonoff Pow Relais die Heizpatrone der Wärmepumpe zu. Sobald Energie aus dem Netz bezogen wird und die Heizpatrone noch Last erzeugt, wird sie abgeschaltet. Einfach und Effektiv.

                  Mich interessiert zukünftig nur die MinSOC Regelung. Hatte das in den sonnenfreien Tagen zuletzt erstmal manuell über deinen Adapter geregelt. Aber langfristig muss das automatisiert werden. Werde mir mal die zwei Wetter Adapter installieren und schauen welcher für meine Region plausiblere Werte liefert.

                  ..:: So long! Tom ::..

                  NUC7i3 (Ubuntu Proxmox VM) | Echo Dots 2+3. Gen | Xiaomi Sensoren | Mi Robot 1S | Yeelight | Sonoff | Shelly | H801 RGB | Gosund SP1 | NodeMCU+ESP32 | Kostal Plenticore PV+BYD | openWB

                  StrathColeS 1 Antwort Letzte Antwort
                  0
                  • DiginixD Diginix

                    @StrathCole Da hast du den Adapter aber nun echt mächtig gemacht. Respekt.

                    Mit dem Überschuss erzeuge ich auch warmes Wasser, aber das wird in Echtzeit entschieden.
                    Sobald genug eingespeist wird und der Akku voll oder ausreichend geladen wird, schaltet ein Sonoff Pow Relais die Heizpatrone der Wärmepumpe zu. Sobald Energie aus dem Netz bezogen wird und die Heizpatrone noch Last erzeugt, wird sie abgeschaltet. Einfach und Effektiv.

                    Mich interessiert zukünftig nur die MinSOC Regelung. Hatte das in den sonnenfreien Tagen zuletzt erstmal manuell über deinen Adapter geregelt. Aber langfristig muss das automatisiert werden. Werde mir mal die zwei Wetter Adapter installieren und schauen welcher für meine Region plausiblere Werte liefert.

                    StrathColeS Offline
                    StrathColeS Offline
                    StrathCole
                    schrieb am zuletzt editiert von
                    #81

                    @Diginix Das mit dem Warmwasser geht so bei mir nicht, weil wir Erdwärme haben und das intern in der Heizung geregelt wird. Ich kann nur die Solltemperatur einstellen und "Bitte einmal Warmwasser"-Befehl geben.

                    Daher löse ich es so, dass je nach Prognose der Befehl gegeben wird und auch die Temperatur entsprechend gesetzt wird (55 oder 60°). Als zusätzliche Regel habe ich noch, dass die Solltemperatur die Ist-Temperatur nicht zu sehr überschreiten darf, da sonst der Stromverbrauch so hochschießt, dass er nicht aus PV und Batterie gedeckt wird (~12kW).

                    SolarWatt-Anlage mit 9,6 kWp – KOSTAL Plenticore Plus 10 – BYD B-Box HV 8,96 – Viessmann Vitocal 333g – Zehnder ComfoD 350 (Comfoair 350) mit RS232-Ethernet-Konverter

                    DiginixD 1 Antwort Letzte Antwort
                    0
                    • StrathColeS StrathCole

                      @Diginix Das mit dem Warmwasser geht so bei mir nicht, weil wir Erdwärme haben und das intern in der Heizung geregelt wird. Ich kann nur die Solltemperatur einstellen und "Bitte einmal Warmwasser"-Befehl geben.

                      Daher löse ich es so, dass je nach Prognose der Befehl gegeben wird und auch die Temperatur entsprechend gesetzt wird (55 oder 60°). Als zusätzliche Regel habe ich noch, dass die Solltemperatur die Ist-Temperatur nicht zu sehr überschreiten darf, da sonst der Stromverbrauch so hochschießt, dass er nicht aus PV und Batterie gedeckt wird (~12kW).

                      DiginixD Offline
                      DiginixD Offline
                      Diginix
                      schrieb am zuletzt editiert von
                      #82

                      @StrathCole Ja, ok, das ist dann etwas komplexer. Bin ja froh dass ich den Überschuss so easy intern verwenden kann.
                      Sinnlos Wäsche waschen o.ä. bringt ja auch nichts 😉 Und fürs Einspeisen bekomme ich halt nicht das was ich für die spätere Entnahme zahlen müsste. Das geht wohl allen so.

                      Für die MinSOC Regelung reicht mir evtl. auch ein eigenes Skript mit Werten aus dem daswetter Adapter. Muss aber mal schauen was der für die Folgetage so liefert und ob es auch mit dem tatsächlichen Wetter übereinstimmt.
                      Parallel werde ich noch die anderen zwei Wetter Adapter installieren. Will aber nicht dauerhaft mehrere laufen haben. Also muss einer sich beweisen.

                      ..:: So long! Tom ::..

                      NUC7i3 (Ubuntu Proxmox VM) | Echo Dots 2+3. Gen | Xiaomi Sensoren | Mi Robot 1S | Yeelight | Sonoff | Shelly | H801 RGB | Gosund SP1 | NodeMCU+ESP32 | Kostal Plenticore PV+BYD | openWB

                      StrathColeS 1 Antwort Letzte Antwort
                      0
                      • DiginixD Diginix

                        @StrathCole Ja, ok, das ist dann etwas komplexer. Bin ja froh dass ich den Überschuss so easy intern verwenden kann.
                        Sinnlos Wäsche waschen o.ä. bringt ja auch nichts 😉 Und fürs Einspeisen bekomme ich halt nicht das was ich für die spätere Entnahme zahlen müsste. Das geht wohl allen so.

                        Für die MinSOC Regelung reicht mir evtl. auch ein eigenes Skript mit Werten aus dem daswetter Adapter. Muss aber mal schauen was der für die Folgetage so liefert und ob es auch mit dem tatsächlichen Wetter übereinstimmt.
                        Parallel werde ich noch die anderen zwei Wetter Adapter installieren. Will aber nicht dauerhaft mehrere laufen haben. Also muss einer sich beweisen.

                        StrathColeS Offline
                        StrathColeS Offline
                        StrathCole
                        schrieb am zuletzt editiert von
                        #83

                        @Diginix Ich hatte auch zuerst "dasWetter" drin, bevor ich den Adapter geschrieben habe. Die Bewölkungswerte waren allerdings in der letzten Woche sehr weit weg von der Realität.
                        Ich versuche mich gerade an einem Parser für Kachelmannwetter. Da scheint es keine (öffentliche) API zu geben, aber die Sonnenscheindauer und Bewölkungsdaten sind vielversprechend.

                        SolarWatt-Anlage mit 9,6 kWp – KOSTAL Plenticore Plus 10 – BYD B-Box HV 8,96 – Viessmann Vitocal 333g – Zehnder ComfoD 350 (Comfoair 350) mit RS232-Ethernet-Konverter

                        DiginixD 1 Antwort Letzte Antwort
                        1
                        • StrathColeS StrathCole

                          @Diginix Ich hatte auch zuerst "dasWetter" drin, bevor ich den Adapter geschrieben habe. Die Bewölkungswerte waren allerdings in der letzten Woche sehr weit weg von der Realität.
                          Ich versuche mich gerade an einem Parser für Kachelmannwetter. Da scheint es keine (öffentliche) API zu geben, aber die Sonnenscheindauer und Bewölkungsdaten sind vielversprechend.

                          DiginixD Offline
                          DiginixD Offline
                          Diginix
                          schrieb am zuletzt editiert von Diginix
                          #84

                          @StrathCole Cool. Am Ende braucht die PV Logik ja auch andere Werte als der Mensch für zB VIS usw.
                          Daher ist es natürlich schön wenn man als Wetter Adapter den wählt der für Menschen brauchbare Werte liefert und dein Adapter könnte sich im Hintergrund die PV relevanten Werte woanders holen. Dann hättest du nicht, wie jetzt , zwei Adapter Abhängigkeiten.

                          ..:: So long! Tom ::..

                          NUC7i3 (Ubuntu Proxmox VM) | Echo Dots 2+3. Gen | Xiaomi Sensoren | Mi Robot 1S | Yeelight | Sonoff | Shelly | H801 RGB | Gosund SP1 | NodeMCU+ESP32 | Kostal Plenticore PV+BYD | openWB

                          StrathColeS 1 Antwort Letzte Antwort
                          0
                          • DiginixD Diginix

                            @StrathCole Cool. Am Ende braucht die PV Logik ja auch andere Werte als der Mensch für zB VIS usw.
                            Daher ist es natürlich schön wenn man als Wetter Adapter den wählt der für Menschen brauchbare Werte liefert und dein Adapter könnte sich im Hintergrund die PV relevanten Werte woanders holen. Dann hättest du nicht, wie jetzt , zwei Adapter Abhängigkeiten.

                            StrathColeS Offline
                            StrathColeS Offline
                            StrathCole
                            schrieb am zuletzt editiert von
                            #85

                            @Diginix Ich habe jetzt eine experimentelle Version in den Adapter gebaut und ins Git geladen. Falls du sie ausprobieren willst. Man kann nun in der Konfig statt eines Wetteradapters die Kachelmanndaten (Sonne oder Wolken) auswählen. Werde das die nächsten Tage bei mir mal beobachten.

                            SolarWatt-Anlage mit 9,6 kWp – KOSTAL Plenticore Plus 10 – BYD B-Box HV 8,96 – Viessmann Vitocal 333g – Zehnder ComfoD 350 (Comfoair 350) mit RS232-Ethernet-Konverter

                            DiginixD 1 Antwort Letzte Antwort
                            0
                            • StrathColeS StrathCole

                              @Diginix Ich habe jetzt eine experimentelle Version in den Adapter gebaut und ins Git geladen. Falls du sie ausprobieren willst. Man kann nun in der Konfig statt eines Wetteradapters die Kachelmanndaten (Sonne oder Wolken) auswählen. Werde das die nächsten Tage bei mir mal beobachten.

                              DiginixD Offline
                              DiginixD Offline
                              Diginix
                              schrieb am zuletzt editiert von Diginix
                              #86

                              @StrathCole Hab das Update installiert und die Kachelmann Sonnenstunden gewählt und die Werte meiner Module eingetragen.
                              Nun habe ich einige neue Objekte. Sind diese alle schon anhand historischer Statistikwerte für meine Anlage berechnet?

                              Die 10102 Wh für morgen müssten also theoretisch erreicht werden?
                              Heute waren es zB real 6130 Wh. Aber war auch nicht durchgehend sonnig.
                              Ich werde die mal mit dem history Adapter erfassen.

                              4f1c90dc-ec38-4915-8439-5d61236316f9-image.png

                              Die 1h-9h unter Power sind also nicht die absoluten Uhrzeiten sondern die Stunden ab Sonnenaufgang?
                              Warum sind bei 1h keine Werte? Scheint da nach kachelmann noch keine Sonne?

                              Unter consumption sind für die Nach 13 kW und für tags 4,2 kW als Verbrauch prognostiziert. Welche Zeiten stecken hinter day und night? Sonnenaufgang bis Untergang?

                              ..:: So long! Tom ::..

                              NUC7i3 (Ubuntu Proxmox VM) | Echo Dots 2+3. Gen | Xiaomi Sensoren | Mi Robot 1S | Yeelight | Sonoff | Shelly | H801 RGB | Gosund SP1 | NodeMCU+ESP32 | Kostal Plenticore PV+BYD | openWB

                              StrathColeS 1 Antwort Letzte Antwort
                              0
                              • DiginixD Diginix

                                @StrathCole Hab das Update installiert und die Kachelmann Sonnenstunden gewählt und die Werte meiner Module eingetragen.
                                Nun habe ich einige neue Objekte. Sind diese alle schon anhand historischer Statistikwerte für meine Anlage berechnet?

                                Die 10102 Wh für morgen müssten also theoretisch erreicht werden?
                                Heute waren es zB real 6130 Wh. Aber war auch nicht durchgehend sonnig.
                                Ich werde die mal mit dem history Adapter erfassen.

                                4f1c90dc-ec38-4915-8439-5d61236316f9-image.png

                                Die 1h-9h unter Power sind also nicht die absoluten Uhrzeiten sondern die Stunden ab Sonnenaufgang?
                                Warum sind bei 1h keine Werte? Scheint da nach kachelmann noch keine Sonne?

                                Unter consumption sind für die Nach 13 kW und für tags 4,2 kW als Verbrauch prognostiziert. Welche Zeiten stecken hinter day und night? Sonnenaufgang bis Untergang?

                                StrathColeS Offline
                                StrathColeS Offline
                                StrathCole
                                schrieb am zuletzt editiert von
                                #87

                                @Diginix
                                Also die Werte in den neuen Objekten für Consumption day/night/remaining werden sich erst innerhalb von etwa 2-3 Tagen einpendeln, da er sich die Historie selbst aufbauen muss. Das heißt, im Moment hat er da nur "Momentaufnahmen", die nicht repräsentativ sind.

                                Ja, die Werte 1h bis 9h sind die Stunden von Sonnenaufgang bis Sonnenuntergang. Eigentlich sollte aber unter 1h auch etwas stehen, selbst wenn es 0 Wh wären.
                                Wegen des fehlenden 1h-Wertes: Hast du mal den Browser ganz neu geladen? Manchmal lädt der ioBroker die neuen Werte nicht richtig nach in der Anzeige.

                                Die 10.000 kWh sind die aktuelle Prognose anhand der Wolkenvorhersage bzw. Sonnenstunden von Kachelmann und deiner eingegebenen Werte. Du könntest mal die Summe der Werte unter 1h bis 9h bilden und schauen, ob das dasselbe ergibt.

                                Die Zeiten hinter Day und Night sind die Stunden von Sonnenauf- bis Sonnenuntergang, damit man das für eine eigene Prognose verwenden kann, wie viel Überschuss am laufenden Tag noch bleibt. Im Grunde also forecast.power.remaining minus forecast.consumption.remaining.

                                SolarWatt-Anlage mit 9,6 kWp – KOSTAL Plenticore Plus 10 – BYD B-Box HV 8,96 – Viessmann Vitocal 333g – Zehnder ComfoD 350 (Comfoair 350) mit RS232-Ethernet-Konverter

                                DiginixD 1 Antwort Letzte Antwort
                                0
                                • StrathColeS StrathCole

                                  @Diginix
                                  Also die Werte in den neuen Objekten für Consumption day/night/remaining werden sich erst innerhalb von etwa 2-3 Tagen einpendeln, da er sich die Historie selbst aufbauen muss. Das heißt, im Moment hat er da nur "Momentaufnahmen", die nicht repräsentativ sind.

                                  Ja, die Werte 1h bis 9h sind die Stunden von Sonnenaufgang bis Sonnenuntergang. Eigentlich sollte aber unter 1h auch etwas stehen, selbst wenn es 0 Wh wären.
                                  Wegen des fehlenden 1h-Wertes: Hast du mal den Browser ganz neu geladen? Manchmal lädt der ioBroker die neuen Werte nicht richtig nach in der Anzeige.

                                  Die 10.000 kWh sind die aktuelle Prognose anhand der Wolkenvorhersage bzw. Sonnenstunden von Kachelmann und deiner eingegebenen Werte. Du könntest mal die Summe der Werte unter 1h bis 9h bilden und schauen, ob das dasselbe ergibt.

                                  Die Zeiten hinter Day und Night sind die Stunden von Sonnenauf- bis Sonnenuntergang, damit man das für eine eigene Prognose verwenden kann, wie viel Überschuss am laufenden Tag noch bleibt. Im Grunde also forecast.power.remaining minus forecast.consumption.remaining.

                                  DiginixD Offline
                                  DiginixD Offline
                                  Diginix
                                  schrieb am zuletzt editiert von
                                  #88

                                  @StrathCole Nun habe ich werte in allen Knoten 1-9h und die Summe entspricht der von "Power forecast for day".
                                  Kann ich Wetterwerte auch auf der Kachelmann Website irgendwo gegenprüfen ob die für mein Ort stimmen?
                                  Du nutzt ja anscheinend die Geokoordinaten vom ioBroker System.

                                  Worin liegt der Unterschied ob ich Sonnenstunden oder Bewölkung im Adapter einstelle?

                                  ..:: So long! Tom ::..

                                  NUC7i3 (Ubuntu Proxmox VM) | Echo Dots 2+3. Gen | Xiaomi Sensoren | Mi Robot 1S | Yeelight | Sonoff | Shelly | H801 RGB | Gosund SP1 | NodeMCU+ESP32 | Kostal Plenticore PV+BYD | openWB

                                  StrathColeS 1 Antwort Letzte Antwort
                                  0
                                  • DiginixD Diginix

                                    @StrathCole Nun habe ich werte in allen Knoten 1-9h und die Summe entspricht der von "Power forecast for day".
                                    Kann ich Wetterwerte auch auf der Kachelmann Website irgendwo gegenprüfen ob die für mein Ort stimmen?
                                    Du nutzt ja anscheinend die Geokoordinaten vom ioBroker System.

                                    Worin liegt der Unterschied ob ich Sonnenstunden oder Bewölkung im Adapter einstelle?

                                    StrathColeS Offline
                                    StrathColeS Offline
                                    StrathCole
                                    schrieb am zuletzt editiert von
                                    #89

                                    @Diginix Ich hab noch ein Update gemacht, das dir die Web-URL in die Objekte einträgt.

                                    Der Unterschied zwischen Sonnenstunden und Bewölkung ist einfach eine andere Datenbasis. Kachelmann gibt eine sehr detaillierte Bewölkungsprognose (niedrige, mittlere und hohe Wolkenschichten). Das muss ich mit der Zeit optimieren, welchen Einfluss das auf den Ertrag hat. Daneben bietet die Webseite aber auch die Sonnenminuten pro Stunde an, die ich dann auf Prozente umrechne.

                                    SolarWatt-Anlage mit 9,6 kWp – KOSTAL Plenticore Plus 10 – BYD B-Box HV 8,96 – Viessmann Vitocal 333g – Zehnder ComfoD 350 (Comfoair 350) mit RS232-Ethernet-Konverter

                                    DiginixD 1 Antwort Letzte Antwort
                                    0
                                    • StrathColeS StrathCole

                                      @Diginix Ich hab noch ein Update gemacht, das dir die Web-URL in die Objekte einträgt.

                                      Der Unterschied zwischen Sonnenstunden und Bewölkung ist einfach eine andere Datenbasis. Kachelmann gibt eine sehr detaillierte Bewölkungsprognose (niedrige, mittlere und hohe Wolkenschichten). Das muss ich mit der Zeit optimieren, welchen Einfluss das auf den Ertrag hat. Daneben bietet die Webseite aber auch die Sonnenminuten pro Stunde an, die ich dann auf Prozente umrechne.

                                      DiginixD Offline
                                      DiginixD Offline
                                      Diginix
                                      schrieb am zuletzt editiert von
                                      #90

                                      @StrathCole Funktioniert. City passt und der Link ist auch da mit "...kompakt1x1".

                                      Zum Eruieren ob Sonnenstunden oder Bewölkung plausibler ist, wäre es natürlich gut wenn man für beides die zu erwartende Leistung in Objekten hätte.

                                      Für Stunde 1+2 (8-10 Uhr) hast du in Summe 196 Wh prognostiziert und meine PV hat bisher 137 Wh erzeugt.
                                      Spannende Sache wenn das irgendwann mal bis auf Ausnahmen gut passt.

                                      ..:: So long! Tom ::..

                                      NUC7i3 (Ubuntu Proxmox VM) | Echo Dots 2+3. Gen | Xiaomi Sensoren | Mi Robot 1S | Yeelight | Sonoff | Shelly | H801 RGB | Gosund SP1 | NodeMCU+ESP32 | Kostal Plenticore PV+BYD | openWB

                                      StrathColeS 1 Antwort Letzte Antwort
                                      0
                                      • DiginixD Diginix

                                        @StrathCole Funktioniert. City passt und der Link ist auch da mit "...kompakt1x1".

                                        Zum Eruieren ob Sonnenstunden oder Bewölkung plausibler ist, wäre es natürlich gut wenn man für beides die zu erwartende Leistung in Objekten hätte.

                                        Für Stunde 1+2 (8-10 Uhr) hast du in Summe 196 Wh prognostiziert und meine PV hat bisher 137 Wh erzeugt.
                                        Spannende Sache wenn das irgendwann mal bis auf Ausnahmen gut passt.

                                        StrathColeS Offline
                                        StrathColeS Offline
                                        StrathCole
                                        schrieb am zuletzt editiert von
                                        #91

                                        @Diginix sagte in IOBroker Anbindung an einen Kostal Plenticore:

                                        @StrathCole Funktioniert. City passt und der Link ist auch da mit "...kompakt1x1".

                                        Zum Eruieren ob Sonnenstunden oder Bewölkung plausibler ist, wäre es natürlich gut wenn man für beides die zu erwartende Leistung in Objekten hätte.

                                        Für Stunde 1+2 (8-10 Uhr) hast du in Summe 196 Wh prognostiziert und meine PV hat bisher 137 Wh erzeugt.
                                        Spannende Sache wenn das irgendwann mal bis auf Ausnahmen gut passt.

                                        Ja, die Berechnung ist ja noch ganz neu. Da werde ich in den nächsten Tagen und Wochen sicher noch einiges dran feilen. Ich habe die Prognoseformel auch eben noch mal angepasst, weil bei mir heute 0 Sonnenstunden prognostiziert sind. Da werde ich die Kurve versuchen ein wenig anzugleichen.

                                        SolarWatt-Anlage mit 9,6 kWp – KOSTAL Plenticore Plus 10 – BYD B-Box HV 8,96 – Viessmann Vitocal 333g – Zehnder ComfoD 350 (Comfoair 350) mit RS232-Ethernet-Konverter

                                        DiginixD 1 Antwort Letzte Antwort
                                        0
                                        • StrathColeS StrathCole

                                          @Diginix sagte in IOBroker Anbindung an einen Kostal Plenticore:

                                          @StrathCole Funktioniert. City passt und der Link ist auch da mit "...kompakt1x1".

                                          Zum Eruieren ob Sonnenstunden oder Bewölkung plausibler ist, wäre es natürlich gut wenn man für beides die zu erwartende Leistung in Objekten hätte.

                                          Für Stunde 1+2 (8-10 Uhr) hast du in Summe 196 Wh prognostiziert und meine PV hat bisher 137 Wh erzeugt.
                                          Spannende Sache wenn das irgendwann mal bis auf Ausnahmen gut passt.

                                          Ja, die Berechnung ist ja noch ganz neu. Da werde ich in den nächsten Tagen und Wochen sicher noch einiges dran feilen. Ich habe die Prognoseformel auch eben noch mal angepasst, weil bei mir heute 0 Sonnenstunden prognostiziert sind. Da werde ich die Kurve versuchen ein wenig anzugleichen.

                                          DiginixD Offline
                                          DiginixD Offline
                                          Diginix
                                          schrieb am zuletzt editiert von
                                          #92

                                          @StrathCole Ok, wenn du Vergleichswerte brauchst, dann musst es sagen oder baust ein erweitertes Logging mit ein, welches zB eine CSV auf die Platte schreibt.

                                          Bis 11 Uhr hätten es 993 Wh sein sollen und 652 Wh sind es.
                                          Sinnvoll wäre sicher wenn man stündlich "plenticore.0.scb.statistic.EnergyFlow.YieldDay" und die Summe der Wh aus forecast bis zu dieser Stunde loggt. Und halt was du sonst noch so für die Formelbildung brauchst.

                                          btw: Ich finds geil! 😉

                                          ..:: So long! Tom ::..

                                          NUC7i3 (Ubuntu Proxmox VM) | Echo Dots 2+3. Gen | Xiaomi Sensoren | Mi Robot 1S | Yeelight | Sonoff | Shelly | H801 RGB | Gosund SP1 | NodeMCU+ESP32 | Kostal Plenticore PV+BYD | openWB

                                          StrathColeS 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          347

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe