Skip to content
  • Home
  • 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

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Hardware
  4. IOBroker Anbindung an einen Kostal Plenticore

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    21
    1
    938

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.4k

IOBroker Anbindung an einen Kostal Plenticore

Geplant Angeheftet Gesperrt Verschoben Hardware
1.3k Beiträge 83 Kommentatoren 459.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.
  • StrathColeS StrathCole

    @homeuser sagte in IOBroker Anbindung an einen Kostal Plenticore:

    Statt der auskommentierten Zeilen werden jetzt die darunter stehenden verwendet. Diese sind mir unklar (nicht der Code, sondern die Gedanken dahinter).

    Das kann ich dir anhand der Zeilen erklären:

    if(parseInt(curSoCPercentage) < parseInt(curMinSoC) + 8) {
        adapter.log.info('Disabling battery management because ' + curMinSoC + ' is too high for current SoC ' + curSoCPercentage);
        fc_above_70 = false;
    } else if(power_plus >= 2 * adapter.config.battery_capacity) {
        fc_above_70 = true;
    } else {
        fc_above_70 = false;
    }
    

    Die erste Abfrage deaktiviert die Steuerung, wenn die aktuelle SoC des Speichers kleiner ist als die eingestellten minSoC + 8%. KOSTAL hat nämlich die Eigenart, dass das Management im Sommer sonst sofort greift und man mit Pech dann einen Verbrauchspeak hat, der aus dem Netz zieht. Daher 8% Puffer.

    Die zweite Abfrage prüft, ob die Prognose für die verbleibende Tagesleistung mind. das Doppelte der Batteriekapazität ist. Wenn nicht, wird die Steuerung auch deaktiviert. In allen übrigen Fällen ebenso.
    Bei dir müsste also die verbleibende Prognose > 2xSpeicherkapazität gewesen sein.

    H Offline
    H Offline
    HomeUser
    schrieb am zuletzt editiert von
    #1182

    @strathcole said in [IOBroker Anbindung an einen Kostal Plenticore](/post/73446

    Die zweite Abfrage prüft, ob die Prognose für die verbleibende Tagesleistung mind. das Doppelte der Batteriekapazität ist. Wenn nicht, wird die Steuerung auch deaktiviert. In allen übrigen Fällen ebenso.
    Bei dir müsste also die verbleibende Prognose > 2xSpeicherkapazität gewesen sein.

    Vom Code her verstanden, aber was ist der technische Gedanke dahinter? Den verstehe ich bislang nicht.

    StrathColeS 1 Antwort Letzte Antwort
    0
    • H HomeUser

      @strathcole said in [IOBroker Anbindung an einen Kostal Plenticore](/post/73446

      Die zweite Abfrage prüft, ob die Prognose für die verbleibende Tagesleistung mind. das Doppelte der Batteriekapazität ist. Wenn nicht, wird die Steuerung auch deaktiviert. In allen übrigen Fällen ebenso.
      Bei dir müsste also die verbleibende Prognose > 2xSpeicherkapazität gewesen sein.

      Vom Code her verstanden, aber was ist der technische Gedanke dahinter? Den verstehe ich bislang nicht.

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

      @homeuser sagte in IOBroker Anbindung an einen Kostal Plenticore:

      @strathcole said in [IOBroker Anbindung an einen Kostal Plenticore](/post/73446

      Die zweite Abfrage prüft, ob die Prognose für die verbleibende Tagesleistung mind. das Doppelte der Batteriekapazität ist. Wenn nicht, wird die Steuerung auch deaktiviert. In allen übrigen Fällen ebenso.
      Bei dir müsste also die verbleibende Prognose > 2xSpeicherkapazität gewesen sein.

      Vom Code her verstanden, aber was ist der technische Gedanke dahinter? Den verstehe ich bislang nicht.

      Also:
      Kostal hat die Eigenheit, dass die Steuerung in beide Richtungen versagt. Nehmen wir an, du hast ein paar Tage Sonne und dann einen Tag mit mieser Prognose. Dann würde KOSTAL die Batterie erst einmal nicht laden, weil ja die vergangenen Tage gut waren.
      Also schaue ich, dass die KOSTAL-Steuerung deaktiviert wird, wenn die Prognose (restlicher Tag) weniger ist als 2x die Batteriekapazität. Damit wollte ich sicherstellen, dass die Batterie nicht zu spät geladen wird.
      Die andere Richtung kann ich nicht beeinflussen, also dass KOSTAL die Batterie nach mehreren Tagen schlechter Leistung bei einem Sonnentag sofort lädt.

      Optimieren könnte man sicherlich, dass man die Abschaltschwelle der Steuerung selbst festlegen kann, entweder als Faktor der Batteriekapazität oder als absoluten Wh Wert. Aber dazu werde ich erst einmal nicht kommen.
      Warum es bei dir nicht gut funktioniert, verstehe ich aber bisher noch nicht.

      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

      H 1 Antwort Letzte Antwort
      0
      • StrathColeS StrathCole

        @homeuser sagte in IOBroker Anbindung an einen Kostal Plenticore:

        @strathcole said in [IOBroker Anbindung an einen Kostal Plenticore](/post/73446

        Die zweite Abfrage prüft, ob die Prognose für die verbleibende Tagesleistung mind. das Doppelte der Batteriekapazität ist. Wenn nicht, wird die Steuerung auch deaktiviert. In allen übrigen Fällen ebenso.
        Bei dir müsste also die verbleibende Prognose > 2xSpeicherkapazität gewesen sein.

        Vom Code her verstanden, aber was ist der technische Gedanke dahinter? Den verstehe ich bislang nicht.

        Also:
        Kostal hat die Eigenheit, dass die Steuerung in beide Richtungen versagt. Nehmen wir an, du hast ein paar Tage Sonne und dann einen Tag mit mieser Prognose. Dann würde KOSTAL die Batterie erst einmal nicht laden, weil ja die vergangenen Tage gut waren.
        Also schaue ich, dass die KOSTAL-Steuerung deaktiviert wird, wenn die Prognose (restlicher Tag) weniger ist als 2x die Batteriekapazität. Damit wollte ich sicherstellen, dass die Batterie nicht zu spät geladen wird.
        Die andere Richtung kann ich nicht beeinflussen, also dass KOSTAL die Batterie nach mehreren Tagen schlechter Leistung bei einem Sonnentag sofort lädt.

        Optimieren könnte man sicherlich, dass man die Abschaltschwelle der Steuerung selbst festlegen kann, entweder als Faktor der Batteriekapazität oder als absoluten Wh Wert. Aber dazu werde ich erst einmal nicht kommen.
        Warum es bei dir nicht gut funktioniert, verstehe ich aber bisher noch nicht.

        H Offline
        H Offline
        HomeUser
        schrieb am zuletzt editiert von
        #1184

        @strathcole said in IOBroker Anbindung an einen Kostal Plenticore:

        Warum es bei dir nicht gut funktioniert, verstehe ich aber bisher noch nicht.

        Ich habe gerade den Debugoutput eingeschaltet und bin Code und Output durchgegangen. Und siehe, die Ursache ich vermutlich simpel: Ich habe meine Speicherkapazität in kWh (5,12) anstatt Wh (5120) angegeben. Dadurch sind natürlich alle Vergleiche etc. Quatsch.
        Mal schauen, was jetzt so in den nächsten Tagen passiert. Vielleicht lese ich mich auch weiter in den Code ein. Falls ich Vorschläge habe, melde ich mich.

        StrathColeS 1 Antwort Letzte Antwort
        0
        • H HomeUser

          @strathcole said in IOBroker Anbindung an einen Kostal Plenticore:

          Warum es bei dir nicht gut funktioniert, verstehe ich aber bisher noch nicht.

          Ich habe gerade den Debugoutput eingeschaltet und bin Code und Output durchgegangen. Und siehe, die Ursache ich vermutlich simpel: Ich habe meine Speicherkapazität in kWh (5,12) anstatt Wh (5120) angegeben. Dadurch sind natürlich alle Vergleiche etc. Quatsch.
          Mal schauen, was jetzt so in den nächsten Tagen passiert. Vielleicht lese ich mich auch weiter in den Code ein. Falls ich Vorschläge habe, melde ich mich.

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

          @homeuser sagte in IOBroker Anbindung an einen Kostal Plenticore:

          @strathcole said in IOBroker Anbindung an einen Kostal Plenticore:

          Warum es bei dir nicht gut funktioniert, verstehe ich aber bisher noch nicht.

          Ich habe meine Speicherkapazität in kWh (5,12) anstatt Wh (5120) angegeben. Dadurch sind natürlich alle Vergleiche etc. Quatsch.

          Das erklärt natürlich einiges.

          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
          • StrathColeS StrathCole

            Ich habe die Steuerung auch einmal testweise aktiviert. Es funktioniert tatsächlich. Ich hatte noch 40% Ladung in der Batterie und eine Entladung von 700W. Habe dann die externe Steuerung aktiviert und via Modbus das Register 1040 auf 50W gesetzt. Wenige Sekunden später sank die Batterieentladung auf 48W und der Rest wurde aus dem Netz bezogen.

            Ich habe dann mit dem o.g. Trick wieder auf interne Steuerung gestellt und schon hat der Kostal den Registerwert wieder auf ~4750W gesetzt.

            Wichtig ist wohl: Auch wenn man die Steuerung aktiviert und den Wert setzt, schwankt dieser etwas. Habe im Test auf 100W gesetzt und der ModBus Wert schwankte anschließend um ein paar W nach oben und unten.

            B Offline
            B Offline
            Bock.Johannes
            schrieb am zuletzt editiert von
            #1186

            @strathcole Hey, ich glaube das ist genau das was ich such :-)
            Habe eine OpenWB bzw. zwei und möchte wenn dort der Ladevorgang beginnt den Batteriespeicher auf z.B. Max 800W Erzeugung für die Dauer des Ladevorgangs drosseln sofern nicht PV-Laden aktiv ist. Die Holdingregister habe ich glaube ich alle soweit drin und mache auch schon eine Menge damit, aber das Thema Sofort Laden ohne den Speicher leerzusaugen ist aktuell meine Herausforderung. Kannst Du mir hier vielleicht mehr Infos geben?

            DiginixD StrathColeS 2 Antworten Letzte Antwort
            0
            • B Bock.Johannes

              @strathcole Hey, ich glaube das ist genau das was ich such :-)
              Habe eine OpenWB bzw. zwei und möchte wenn dort der Ladevorgang beginnt den Batteriespeicher auf z.B. Max 800W Erzeugung für die Dauer des Ladevorgangs drosseln sofern nicht PV-Laden aktiv ist. Die Holdingregister habe ich glaube ich alle soweit drin und mache auch schon eine Menge damit, aber das Thema Sofort Laden ohne den Speicher leerzusaugen ist aktuell meine Herausforderung. Kannst Du mir hier vielleicht mehr Infos geben?

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

              @bock-johannes sagte in IOBroker Anbindung an einen Kostal Plenticore:

              Thema Sofort Laden ohne den Speicher leerzusaugen ist aktuell meine Herausforderung. Kannst Du mir hier vielleicht mehr Infos geben?

              Damit der Akku nicht verwendet wird, reicht es idR dessen minSOC >= dem istSOC zu setzen.
              Wenn dein Akku also z.B. 65% hat und der minSOC 5% ist und du das Auto laden willst, dann setzt du den minSOC auf 65% und der PV Akku sollte dann nicht entladen werden.

              ..:: 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

              B 2 Antworten Letzte Antwort
              0
              • DiginixD Diginix

                @bock-johannes sagte in IOBroker Anbindung an einen Kostal Plenticore:

                Thema Sofort Laden ohne den Speicher leerzusaugen ist aktuell meine Herausforderung. Kannst Du mir hier vielleicht mehr Infos geben?

                Damit der Akku nicht verwendet wird, reicht es idR dessen minSOC >= dem istSOC zu setzen.
                Wenn dein Akku also z.B. 65% hat und der minSOC 5% ist und du das Auto laden willst, dann setzt du den minSOC auf 65% und der PV Akku sollte dann nicht entladen werden.

                B Offline
                B Offline
                Bock.Johannes
                schrieb am zuletzt editiert von
                #1188

                @diginix Das ist die einfachste Variante ja. Dafür habe ich mir schon den Plenticore Adapter eingerichtet. Worauf ich aber eigentlich hinaus möchte ist, das wenn Sofort geladen wird für die Dauer des Ladevorgangs die Leistung aus dem Speicher auf 1000W z.B. begrenzt wird, ich denke dann hält der auch länger und umladen aus dem Speicher ist ja auch mit vielen Verlusten verbunden...

                1 Antwort Letzte Antwort
                0
                • DiginixD Diginix

                  @bock-johannes sagte in IOBroker Anbindung an einen Kostal Plenticore:

                  Thema Sofort Laden ohne den Speicher leerzusaugen ist aktuell meine Herausforderung. Kannst Du mir hier vielleicht mehr Infos geben?

                  Damit der Akku nicht verwendet wird, reicht es idR dessen minSOC >= dem istSOC zu setzen.
                  Wenn dein Akku also z.B. 65% hat und der minSOC 5% ist und du das Auto laden willst, dann setzt du den minSOC auf 65% und der PV Akku sollte dann nicht entladen werden.

                  B Offline
                  B Offline
                  Bock.Johannes
                  schrieb am zuletzt editiert von
                  #1189

                  @diginix die Lösung habe ich schon etabliert und funktioniert super bisher

                  1 Antwort Letzte Antwort
                  0
                  • B Bock.Johannes

                    @strathcole Hey, ich glaube das ist genau das was ich such :-)
                    Habe eine OpenWB bzw. zwei und möchte wenn dort der Ladevorgang beginnt den Batteriespeicher auf z.B. Max 800W Erzeugung für die Dauer des Ladevorgangs drosseln sofern nicht PV-Laden aktiv ist. Die Holdingregister habe ich glaube ich alle soweit drin und mache auch schon eine Menge damit, aber das Thema Sofort Laden ohne den Speicher leerzusaugen ist aktuell meine Herausforderung. Kannst Du mir hier vielleicht mehr Infos geben?

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

                    @bock-johannes Also, möglich ist das mit einem Skript.

                    Dafür muss aber im Wechselrichter die externe Batteriesteuerung via ModBus erlaubt und aktiviert sein (das kann nur der Installateur-Zugang).

                    Wenn das aktiv ist, kann man im Register modbus.0.holdingRegisters.1078_Max_Discharge Pwr Lim, also 1078 die Entladebegrenzung in W setzen. Wichtig ist dann nur, dass man sie mindestens alle ~10 Sekunden neu setzt, da der WR einen Timeout hat und die Steuerung dann automatisch wieder deaktiviert (auf intern umstellt).

                    Vorgehen wäre also:
                    Javascript schreiben, das

                    1. mit openWB-Adapter ausliest, ob der Lademodus "Sofortladen" ist und das Auto eingesteckt ist
                    2. wenn ja, entsprechend alle paar Sekunden das Register 1078 auf 1000 setzen
                    3. wenn nein, Wert wieder auf Standard zurücksetzen

                    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

                    J 1 Antwort Letzte Antwort
                    0
                    • N Offline
                      N Offline
                      Neo77
                      schrieb am zuletzt editiert von
                      #1191

                      Hallo, vielen Dank für diesen tollen Adapter. Ich habe seit Januar ebenfalls eine Anlage mit dem Kostal Plenticore plus 10. BYD Batterie ist auch geordert, kommt aber wohl erst Mitte des Jahres. Deinen Adpater habe ich schon miteingebunden und sehe Unmengen an Werten. Hier habe ich gerade auch schon eine Frage:

                      Unter den Objekten Forecast bei generated plant power today wird mir ein Wert von 2,2 KW angezeigt, in der Statistik im Wechselrichter stehen für heute aber nur 1,7 KW. Wird dort vielleicht schon der Verbrauch vom Wechselrichter abgezogen?

                      1 Antwort Letzte Antwort
                      0
                      • D Offline
                        D Offline
                        Deven2k
                        schrieb am zuletzt editiert von
                        #1192

                        Hallo,
                        ich habe diesen post hier gefunden und habe die selben Warnmeldungen bei mir auch.
                        Konnte aber die Lösung nicht erlesen, darauf wurde nicht genau geantwortet oder ich hab es nicht verstanden.
                        Liegt das an der Modbus Einstellung?

                        von burnit

                        @strathcole mit einem 20s polling interval sehe ich im log alle 20s eine Warnung vom Adapter

                        2021-04-15 17:16:39.187 - warn: plenticore.0 (9754) Requesting settings - [{"moduleid":"devices:local","processdataids":["Dc_P","DigitalIn","EM_State","HomeBat_P","HomeGrid_P","HomeOwn_P","HomePv_P","Home_P","Inverter:State","LimitEvuAbs"]},{"moduleid":"devices:local:ac","processdataids":["CosPhi","Frequency","L1_I","L1_P","L1_U","L2_I","L2_P","L2_U","L3_I","L3_P","L3_U","P","Q","S"]},{"moduleid":"devices:local:battery","processdataids":["Cycles","SoC","I","U","P"]},{"moduleid":"devices:local:pv1","processdataids":["I","U","P"]},{"moduleid":"devices:local:pv2","processdataids":["I","U","P"]},{"moduleid":"scb:export","processdataids":["PortalConActive"]},{"moduleid":"scb:statistic:EnergyFlow","processdataids":["Statistic:Autarky:Day","Statistic:Autarky:Month","Statistic:Autarky:Total","Statistic:Autarky:Year","Statistic:EnergyHome:Day","Statistic:EnergyHome:Month","Statistic:EnergyHome:Total","Statistic:EnergyHome:Year","Statistic:EnergyHomeBat:Day","Statistic:EnergyHomeBat:Month","Statistic:EnergyHomeBat:Total","Statistic:EnergyHomeBat:Year","Statistic:EnergyHomeGrid:Day","Statistic:EnergyHomeGrid:Month","Statistic:EnergyHomeGrid:Total","Statistic:EnergyHomeGrid:Year","Statistic:EnergyHomePv:Day","Statistic:EnergyHomePv:Month","Statistic:EnergyHomePv:Total","Statistic:EnergyHomePv:Year","Statistic:OwnConsumptionRate:Day","Statistic:OwnConsumptionRate:Month","Statistic:OwnConsumptionRate:Total","Statistic:OwnConsumptionRate:Year","Statistic:Yield:Day","Statistic:Yield:Month","Statistic:Yield:Total","Statistic:Yield:Year","Statistic:CO2Saving:Day","Statistic:CO2Saving:Month","Statistic:CO2Saving:Year","Statistic:CO2Saving:Total"]}]) failed with code 503: {"message":"internal communication error, try again later"}

                        Liegt das evtl. an meiner alten Firmware-Version oder ist das normal? Ich kann nicht erkennen, dass es irgendwelche Fehler in den Datenpunkten gäbe.

                        1 Antwort Letzte Antwort
                        0
                        • StrathColeS StrathCole

                          @bock-johannes Also, möglich ist das mit einem Skript.

                          Dafür muss aber im Wechselrichter die externe Batteriesteuerung via ModBus erlaubt und aktiviert sein (das kann nur der Installateur-Zugang).

                          Wenn das aktiv ist, kann man im Register modbus.0.holdingRegisters.1078_Max_Discharge Pwr Lim, also 1078 die Entladebegrenzung in W setzen. Wichtig ist dann nur, dass man sie mindestens alle ~10 Sekunden neu setzt, da der WR einen Timeout hat und die Steuerung dann automatisch wieder deaktiviert (auf intern umstellt).

                          Vorgehen wäre also:
                          Javascript schreiben, das

                          1. mit openWB-Adapter ausliest, ob der Lademodus "Sofortladen" ist und das Auto eingesteckt ist
                          2. wenn ja, entsprechend alle paar Sekunden das Register 1078 auf 1000 setzen
                          3. wenn nein, Wert wieder auf Standard zurücksetzen
                          J Offline
                          J Offline
                          Jost 1
                          schrieb am zuletzt editiert von
                          #1193

                          @strathcole Erstmal vielen Dank für den Adapter, habe deswegen gleich mal wieder iobroker aktiviert. ;)

                          Da man aktuell leider weder den KSEM noch TQEM kaufen kann, lasse ich den Plenticore mit der baugleichen energybase laufen. Entladen des HVS hat via energybase geklappt, nur das Laden nicht. Deswegen will ich via Modbus das Laden selber steuern. Leider sind meine Versuche über Register 1026 oder 1034 nicht erfolgreich gewesen, jegliche Werte werden sofort wieder genullt. Muss ich weitere Register setzen, damit man die Ladung über Modbus "erzwingen" kann? Über die Digitaleingänge konnte ich laden mit 25% und 50% erzwingen, mehr ging nicht.

                          UI-Version 01.18.05255 / MC-Version 01.47 / IOC-Version 01.45 / HW-Version 0200

                          Installateurscode habe ich und kann dementsprechend die Einstellungen im Plenticore ändern. Würde mich über Erfahrungen mit Modbus-Steuerung freuen.

                          Kostal Plenticore 10 / BYD HVS 12.8 / Victron EMS / energybase / 15.8 kWp

                          StrathColeS 1 Antwort Letzte Antwort
                          0
                          • J Jost 1

                            @strathcole Erstmal vielen Dank für den Adapter, habe deswegen gleich mal wieder iobroker aktiviert. ;)

                            Da man aktuell leider weder den KSEM noch TQEM kaufen kann, lasse ich den Plenticore mit der baugleichen energybase laufen. Entladen des HVS hat via energybase geklappt, nur das Laden nicht. Deswegen will ich via Modbus das Laden selber steuern. Leider sind meine Versuche über Register 1026 oder 1034 nicht erfolgreich gewesen, jegliche Werte werden sofort wieder genullt. Muss ich weitere Register setzen, damit man die Ladung über Modbus "erzwingen" kann? Über die Digitaleingänge konnte ich laden mit 25% und 50% erzwingen, mehr ging nicht.

                            UI-Version 01.18.05255 / MC-Version 01.47 / IOC-Version 01.45 / HW-Version 0200

                            Installateurscode habe ich und kann dementsprechend die Einstellungen im Plenticore ändern. Würde mich über Erfahrungen mit Modbus-Steuerung freuen.

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

                            @jost-1 Du musst via Installateurscode in den Einstellungen die "Externe Steuerung" via Modbus aktivieren. Sobald diese aktiviert ist, musst du mindestens alle 10-30 Sekunden den entsprechenden Modbus Wert setzen, sonst setzt der Kostal wieder auf interne Steuerung zurück.

                            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

                            J 1 Antwort Letzte Antwort
                            0
                            • StrathColeS StrathCole

                              @jost-1 Du musst via Installateurscode in den Einstellungen die "Externe Steuerung" via Modbus aktivieren. Sobald diese aktiviert ist, musst du mindestens alle 10-30 Sekunden den entsprechenden Modbus Wert setzen, sonst setzt der Kostal wieder auf interne Steuerung zurück.

                              J Offline
                              J Offline
                              Jost 1
                              schrieb am zuletzt editiert von
                              #1195

                              @strathcole Hm, so habe ich das auch probiert.

                              Also FC 16, UID 71, ab Adresse 1034 2 Register mit 0;49992 (-200[W]) beschrieben, wurde ohne Fehler quittiert aber praktisch sofort genullt. Parallel habe ich sekündlich 1026-1036 gepollt, die waren alle 0 :man-shrugging:

                              Das Register 1080 wurde vorher abgefragt, das steht auf 2 für externe Modbus-Steuerung.

                              Wenn ich ab Adresse 1044 2 Register mit 0;17086 beschreibe, bleibt der max.SoC wie gewollt einige Zeit bei 95% stehen.

                              Was mich wundert: Als die Entladung via energybase lief, waren die Register ab 1032 alle gefüllt. Daher meine Vermutung ob man evtl. weitere Register setzen muss?

                              Kostal Plenticore 10 / BYD HVS 12.8 / Victron EMS / energybase / 15.8 kWp

                              StrathColeS 1 Antwort Letzte Antwort
                              0
                              • J Jost 1

                                @strathcole Hm, so habe ich das auch probiert.

                                Also FC 16, UID 71, ab Adresse 1034 2 Register mit 0;49992 (-200[W]) beschrieben, wurde ohne Fehler quittiert aber praktisch sofort genullt. Parallel habe ich sekündlich 1026-1036 gepollt, die waren alle 0 :man-shrugging:

                                Das Register 1080 wurde vorher abgefragt, das steht auf 2 für externe Modbus-Steuerung.

                                Wenn ich ab Adresse 1044 2 Register mit 0;17086 beschreibe, bleibt der max.SoC wie gewollt einige Zeit bei 95% stehen.

                                Was mich wundert: Als die Entladung via energybase lief, waren die Register ab 1032 alle gefüllt. Daher meine Vermutung ob man evtl. weitere Register setzen muss?

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

                                @jost-1 Ich denke die Register sind falsch. Schau mal bei Register 1078.

                                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

                                J 1 Antwort Letzte Antwort
                                0
                                • StrathColeS StrathCole

                                  @jost-1 Ich denke die Register sind falsch. Schau mal bei Register 1078.

                                  J Offline
                                  J Offline
                                  Jost 1
                                  schrieb am zuletzt editiert von
                                  #1197

                                  @strathcole Ja, die Register ab 1078 sind Readonly und geben Auskunft über die aktuell verfügbare Lade/Entlade-Leistung. Steuern kann ich ja darüber nichts. Ich habe parallel mal in den FHEM-Adapter geschaut, da sind die Adressen ab 1024 auch für die Setpoints reserviert.

                                  attr WR_1 obj-h1024-len 1
                                  attr WR_1 obj-h1024-reading Battery_Charge_AC_P_Setpoint
                                  attr WR_1 obj-h1024-set 1
                                  attr WR_1 obj-h1025-len 1
                                  attr WR_1 obj-h1025-reading Battery_P_ScaleFactor
                                  attr WR_1 obj-h1026-reading Battery_Charge_AC_P_SetpointAbs
                                  attr WR_1 obj-h1026-set 1
                                  attr WR_1 obj-h1028-reading Battery_Charge_DC_I_SetpointRel
                                  attr WR_1 obj-h1028-set 1
                                  attr WR_1 obj-h1030-reading Battery_Charge_AC_P_SetpointRel
                                  attr WR_1 obj-h1030-set 1
                                  attr WR_1 obj-h1032-reading Battery_Charge_DC_I_SetpointAbs
                                  attr WR_1 obj-h1032-set 1
                                  attr WR_1 obj-h1034-reading Battery_Charge_DC_P_SetpointAbs
                                  attr WR_1 obj-h1034-set 1
                                  attr WR_1 obj-h1036-reading Battery_Charge_DC_P_SetpointRel
                                  attr WR_1 obj-h1036-set 1
                                  attr WR_1 obj-h1038-reading Battery_MaxChargePowerLimitAbs
                                  attr WR_1 obj-h1038-set 1

                                  Ich bin nun am Überlegen, ob man zum 1034 auch den 1038 setzen muss...

                                  Kostal Plenticore 10 / BYD HVS 12.8 / Victron EMS / energybase / 15.8 kWp

                                  StrathColeS 1 Antwort Letzte Antwort
                                  0
                                  • J Jost 1

                                    @strathcole Ja, die Register ab 1078 sind Readonly und geben Auskunft über die aktuell verfügbare Lade/Entlade-Leistung. Steuern kann ich ja darüber nichts. Ich habe parallel mal in den FHEM-Adapter geschaut, da sind die Adressen ab 1024 auch für die Setpoints reserviert.

                                    attr WR_1 obj-h1024-len 1
                                    attr WR_1 obj-h1024-reading Battery_Charge_AC_P_Setpoint
                                    attr WR_1 obj-h1024-set 1
                                    attr WR_1 obj-h1025-len 1
                                    attr WR_1 obj-h1025-reading Battery_P_ScaleFactor
                                    attr WR_1 obj-h1026-reading Battery_Charge_AC_P_SetpointAbs
                                    attr WR_1 obj-h1026-set 1
                                    attr WR_1 obj-h1028-reading Battery_Charge_DC_I_SetpointRel
                                    attr WR_1 obj-h1028-set 1
                                    attr WR_1 obj-h1030-reading Battery_Charge_AC_P_SetpointRel
                                    attr WR_1 obj-h1030-set 1
                                    attr WR_1 obj-h1032-reading Battery_Charge_DC_I_SetpointAbs
                                    attr WR_1 obj-h1032-set 1
                                    attr WR_1 obj-h1034-reading Battery_Charge_DC_P_SetpointAbs
                                    attr WR_1 obj-h1034-set 1
                                    attr WR_1 obj-h1036-reading Battery_Charge_DC_P_SetpointRel
                                    attr WR_1 obj-h1036-set 1
                                    attr WR_1 obj-h1038-reading Battery_MaxChargePowerLimitAbs
                                    attr WR_1 obj-h1038-set 1

                                    Ich bin nun am Überlegen, ob man zum 1034 auch den 1038 setzen muss...

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

                                    @jost-1 Wäre zumindest nicht unlogisch.

                                    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
                                    • H HomeUser

                                      @gjo said in IOBroker Anbindung an einen Kostal Plenticore:

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

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

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

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

                                      @homeuser bei mir wird schin ein paar tage nun kein forecast mehr dargestellt.

                                      Ich nutze den
                                      yr.no Adapter in V5.00 (wobei es vor dem Update auf die letzte Verson schon nicht mehr ging
                                      Plenticore Adapter V2.2.1

                                      Funktioniert es be dir noch bzw. hast du Änderunge machen müssen damit es weiterhin funktioneirt?

                                      Gruß

                                      H 1 Antwort Letzte Antwort
                                      0
                                      • G gjo

                                        @homeuser bei mir wird schin ein paar tage nun kein forecast mehr dargestellt.

                                        Ich nutze den
                                        yr.no Adapter in V5.00 (wobei es vor dem Update auf die letzte Verson schon nicht mehr ging
                                        Plenticore Adapter V2.2.1

                                        Funktioniert es be dir noch bzw. hast du Änderunge machen müssen damit es weiterhin funktioneirt?

                                        Gruß

                                        H Offline
                                        H Offline
                                        HomeUser
                                        schrieb am zuletzt editiert von
                                        #1200

                                        @gjo Beim mir geht es ohne Probleme. Auch keine vorübergehenden Probleme in den vergangene Tagen.

                                        G 1 Antwort Letzte Antwort
                                        0
                                        • Bernd 0B Offline
                                          Bernd 0B Offline
                                          Bernd 0
                                          schrieb am zuletzt editiert von
                                          #1201

                                          Hallo,
                                          wenn ich den DynamicSoc Wert auf true oder auch false setzen möchte, bekomme ich die folgende Meldung:

                                          	PUT to settings devices:local / Battery:DynamicSoc:Enable (true) resulted in code 500: {"message":"Internal Server Error"}
                                          

                                          Ich habe den Datenpunkt
                                          plenticore.0.devices.local.battery.DynamicSoc und
                                          plenticore.0.devices.local.battery.SmartBatteryControl
                                          so verstanden, wie in den Settings. Habe ich hier einen Denkfehler?

                                          6eb59eb6-1ff8-4e10-986c-1c8b80284b31-image.png

                                          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

                                          687

                                          Online

                                          32.5k

                                          Benutzer

                                          81.6k

                                          Themen

                                          1.3m

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

                                          • Du hast noch kein Konto? Registrieren

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