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

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

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

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

IOBroker Anbindung an einen Kostal Plenticore

Geplant Angeheftet Gesperrt Verschoben Hardware
1.3k Beiträge 83 Kommentatoren 452.7k 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.
  • M Offline
    M Offline
    MaggeO
    schrieb am zuletzt editiert von
    #5

    Hi,

    vielen Dank erst einmal für den Screenshot. Damit dürfte soweit eigentlich alles klar sein, zumindest in der Theorie ;) .

    Ich bin gerade dabei mir mehr oder weniger einfach alle Register aus dem pdf in das passende Tabulator-getrennte Format zu bringen, so dass man es über den Import-Button innerhalb der Modbus-Config ganz einfach importieren kann. Es sollte ja hoffentlich dann kein Problem sein, dass in dem ein oder anderen Register kein sinnvoller Wert oder auch gar kein Wert drin steht, weil man z.B. gar keine Batterie hat. Aber keine Ahung, ob es dann zu Problemen mit dem Modbus-Adapter kommt.

    Hab eigentlich bis auf die Rolle auch schon soweit alles zusammengebaut. Sobald ich das fertig habe, werde ich es hier zur Verfügung stellen. Ist aber eben aktuell auch nur graue Theorie, da meine PV-Anlage noch gar nicht vorhanden ist.

    Gruß MaggeO

    1 Antwort Letzte Antwort
    0
    • D Offline
      D Offline
      davesteel
      schrieb am zuletzt editiert von
      #6

      Ich weiss nicht, ob Du mittlerweile die Abfrage hinbekommen hast. Ich habe das gerade eben auch umgesetzt. Das Entscheidende ist, dass die Start Adresse auch auf 0 steht. Bei mir stand sie per Default auf 40001. Siehe Screenshot. Allerdings wurde dann bei mir automatisch auf die Addresse der Startwert addiert. aus 104 wurde 40105. Damit geht es dann. Weshalb das dort zusammengefasst wird erschliesst sich mir nicht.

      Ich hänge noch eine Excel dran wo alle Register drin sind und man den Export konfigurieren kann. Das Ganze dann in einen Texteditor kopieren.
      9862_2018-11-19_22_07_41-iobroker.admin.png
      9862_register_bersicht.xlsx

      1 Antwort Letzte Antwort
      0
      • H Offline
        H Offline
        Hideloop
        schrieb am zuletzt editiert von
        #7

        Wenn Du Aliases benutzen das Häckchen entfernst sind die Adressen korrekt einzugeben.

        1 Antwort Letzte Antwort
        0
        • M Offline
          M Offline
          MaggeO
          schrieb am zuletzt editiert von
          #8

          Hi,

          seit heute sind die Module auf dem Dach montiert und der Kostal Plenticore liegt zu meinen Füßen. Angeschlossen wird dann hoffentlich alles am Montag. Genau so eine Excelliste hatte ich mittlerweile auch fast fertig, und mit dem Hinweis auf den Haken bezüglich "Alias" sind Sie auch mehr oder weniger gleich. Wenn dann ab Montag die Anlage läuft kann ich noch einmal berichten, ob alles wie gewünscht funktioniert.

          Danke

          1 Antwort Letzte Antwort
          0
          • M Offline
            M Offline
            MaggeO
            schrieb am zuletzt editiert von
            #9

            Hallo,

            seit gestern läuft jetzt die PV-Anlage grundsätzlich. Allerdings noch ohne Speicher, der muss erst noch angeschlossen werden. Zum Großteil läuft auch das Auslesen der Daten per Modbus, wobei einige Adressen anscheinend Fehler beim Modbus-Adapter erzeugen. Aber die wichtigsten Größen scheinen bis auf 2 Ausnahmen problemlos zu klappen.

            Wie gesagt, ist mein Speicher noch nicht angeschlossen, aber ich bekomme unter der Adresse "0x72 114 Total home consumption Battery" bereits Werte geliefert. Dafür bekomme ich aber auf der Adresse "0x6E 110 Total home consumption PV" aktuell noch keine Werte geliefert, bzw. der Wert ist 0 kWh. Für mich sieht es gerade so aus, als ob diese beiden Adressen in der Bedeutung genau andersherum sein müssten.

            Habt ihr die beiden Adressen (bzw. eine davon) bei euch auch drin und passt der Wert bei euch?

            Danke

            1 Antwort Letzte Antwort
            0
            • K Offline
              K Offline
              Kunibert
              schrieb am zuletzt editiert von
              #10

              Hallo @Maggeo,

              habe seit heute auch einen Kostal Wechselrichter und würde ihn gerne via Modbus einbinden. Bekomme allerdings im Log immer eine Fehlermeldung. Könntest du mir einen Screenshot deiner Einstellungen und einen Export deines Holding-Registers zuschicken? Es wäre schön wenn ich das importieren könnte.

              Danke und liebe Grüße

              1 Antwort Letzte Antwort
              0
              • S Offline
                S Offline
                SvenVJ
                schrieb am zuletzt editiert von
                #11

                Hi zusammen,

                ich habe die Anbindung dank Euch relativ problemlos hinbekommen (Plenticore 8.5), allerdings stimmt der PV-Wert nicht. Die ID100(Total DC Power) liefert mir gerade um die 500W zurück, wenn ich am WR selber schaue, produziert die Anlage aber mehr als das doppelte.

                Hat jemand eine Idee?

                Danke!

                Sven

                1 Antwort Letzte Antwort
                0
                • M Offline
                  M Offline
                  MaggeO
                  schrieb am zuletzt editiert von
                  #12

                  Hallo Kunibert,

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

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

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

                  Gruß MaggeO

                  1112_modbus_instance.png
                  1112_holding_register.txt

                  1 Antwort Letzte Antwort
                  1
                  • K Offline
                    K Offline
                    Kunibert
                    schrieb am zuletzt editiert von
                    #13

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

                    1 Antwort Letzte Antwort
                    0
                    • K Offline
                      K Offline
                      Kunibert
                      schrieb am zuletzt editiert von
                      #14

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

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

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

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

                        Hallo,

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

                        Bei mir hat dann alles einwandfrei geklappt.

                        Grüße,

                        Hideloop

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

                        1 Antwort Letzte Antwort
                        0
                        • B Offline
                          B Offline
                          Baden18
                          schrieb am zuletzt editiert von
                          #16

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

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

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

                          Hat jemand eine Idee ? Danke im Voraus.

                          1 Antwort Letzte Antwort
                          0
                          • K Offline
                            K Offline
                            Kalle
                            schrieb am zuletzt editiert von Kalle
                            #17

                            @Kunibert @Diginix

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

                            Schonml danke im vorraus.

                            VG Marcel

                            register.png einstellungen.png

                            DiginixD 1 Antwort Letzte Antwort
                            0
                            • K Kalle

                              @Kunibert @Diginix

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

                              Schonml danke im vorraus.

                              VG Marcel

                              register.png einstellungen.png

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

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

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

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

                              1 Antwort Letzte Antwort
                              0
                              • O Offline
                                O Offline
                                olfi13
                                schrieb am zuletzt editiert von
                                #19

                                Hallo,

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

                                Danke schonmal!
                                Olfi

                                1 Antwort Letzte Antwort
                                0
                                • O Offline
                                  O Offline
                                  olfi13
                                  schrieb am zuletzt editiert von
                                  #20

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

                                  1 Antwort Letzte Antwort
                                  0
                                  • O Offline
                                    O Offline
                                    olfi13
                                    schrieb am zuletzt editiert von
                                    #21

                                    Hallo nochmal,

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

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

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

                                    Gruß, Olfi

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

                                      Hallo zusammen,

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

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

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

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

                                      Liebe Grüße
                                      Marius aka StrathCole

                                      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 Marco LaserM 2 Antworten Letzte Antwort
                                      2
                                      • StrathColeS Offline
                                        StrathColeS Offline
                                        StrathCole
                                        schrieb am zuletzt editiert von StrathCole
                                        #23

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

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

                                        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
                                        1
                                        • O olfi13

                                          Hallo nochmal,

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

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

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

                                          Gruß, Olfi

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

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

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

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

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

                                          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
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          603

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          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