Solar – Batterie-Einspeiseregelung mit Node-Red

DISCLAIMER: Ich beschreibe hier meine Erfahrungen beim Aufbau einer Solaranlage mit Speicher im DIY Verfahren und übernehme keine Verantwortung für das von euch realisierte Konstrukt. Use at your own risk! Bedenkt, dass elektrischer Strom unter Umständen auch lebensgefährlich oder gar tödlich verletzen kann. Arbeiten am Stromnetz des eigenen Haushalts besser einem ausgebildeten Elektiker überlassen.

Was

Eine Einspeiseregelung hat den Zweck, immer genau so viel Strom aus einer Batterie ins Hausnetz zu füttern, wie im selben Augenblick verbraucht wird. Zumindest bis die Leistungsgrenze des Wechselrichters erreicht ist. Alles darüber hinaus kommt aus dem Netz vom Energieversorger. Mit einem 600W Wechselrichter zur Einspeisung ist mein Ziel eher die Abdeckung der Grundlast im Haushalt. Und das idealerweise in all  den Stunden, in denen kein oder zu wenig Solarstrom erzeugt wird.

Ich hatte mir ganz am Anfang meiner Solarexperimente einen Hoymiles HM-600 Wechselrichter zugelegt. Aber der Appetit kommt mit dem Essen, weshalb ich dann sehr schnell auf einen HMS-1600 aufgerüstet habe. Der HM-600 war also übrig, um ihn für die Batterie-Einspeisung zweckzuentfremden.

Funfact: Übrig war auch das openDTU Interface zum Wechselrichter und zwar aus einem ganz trivialen Grund: Die neueren Hoymiles Wechselrichter mit der Kennung HMS haben einen anderen Funkstandard, der ein anderes Funkinterface benötigt. Dieses gibt es zusammen mit dem openDTU Bausatz für wenig Geld bei Blinkyparts. Nun ist dieser CMT2300A Funkchip so winzig und fummelig, dass ich es einfach nicht geschafft habe, das Teil so auf die Platine zu löten, dass es hinterher auch funktioniert hat.(Update: Inzwischen gibt es den Chip bei Blinkyparts auch verlötet). Ich habe mich seinerzeit auf die Suche nach einem anderen Anbieter gemacht bei dem der Chip schon montiert war und bin bei wechselrichter-versand.de fündig geworden. Leider wird das Teil dort nicht mehr verkauft. Die zuerst gekaufte OpenDTU kann ich nun in Verbindung mit dem NRF Funkmodul prima für die Einspeisung verwenden. Das Display sieht im Sicherungskasten auch ganz schick aus.

Wann – Einspeisestrategie

Bezüglich der Strategie, also wann wird eingespeist, gibt es viele Möglichkeiten. Man könnte zum Besispiel immer einspeisen, wenn der gerade produzierte Solarstrom nicht ausreicht oder nur dann, wenn kein Solarstrom produziert wird. Oder nur zu bestimmten Tageszeiten, zum Beispiel, wenn der Stromtarif besonders teuer ist. Und so weiter. Ich habe mich vorerst auf die ersten beiden Strategien beschränkt.

Einspeise Dashboard mit Strategieauswahl und aufgelaufenen Tageswerten, aktueller Leistung sowie den Steuerungsparametern untere Entladegrenze und maximale Einspeiseleistung.
Strategie Nodes

Die Einspeise-Strategie wird über einen Drop-Down Node realisiert. Zum Persisitieren wird die Strategie entsprechend weggespeichert und bei Neustart wieder eingelesen. Zur späteren Verwendung, wird eine Flow Variable erzeugt.

Anschließend wird alle 30 Sekunden entschieden, ob der Batterie-WR an- oder ausgeschaltet werden oder sein Status unverändert bleiben soll.

Das geschieht im Node "Einspeisung-Basics":

Vereinfachte WR Steuerung

Die Entscheidung wird wie folgt getroffen:

Anschließend wird anhand der Payload (1/0) verzweigt und der WR an oder ausgeschaltet. Nicht dargestellt ist die Logik zum Einschalten der Batterie und andere Features. Da euer Setup sich mit einiger Sicherheit von meinem unterscheidet, macht es hier (anders als z.B. bei den Viessman API Flows) wenig Sinn, das 1 zu 1 vorzugeben. Jetzt ist euer Hirnschmalz gefragt.

Wieviel – Leistungssteuerung

Mathematik ist nicht unbedingt meine Stärke, wenn es über die Grundrechenarten hinausgeht. Die Frage war: Wie passe ich die Leistung des Einspeise Wechselrichters an meinen Verbrauch an?

Eine Bezugsgröße ist der Strom, der aus dem Netz gezogen wird – dieser soll möglichst bei Null oder knapp darüber liegen. Dadurch, dass ich mit der Einspeisung diese Bezugsgröße laufend ändere und ich auch keine Voraussage über den gerade benötigten Strom (Licht an, Herd aus…) oder die gerade herrschende Solarprodukton machen kann, wird es schnell sehr kompliziert – finde ich.

Ich habe mit verschiedenen Algorithmen und auch mit einem PID Regler Verfahren experimentiert und bin zu keinem Ergebnis gekommen. Zuviel Mathematik. Auch die PID Nodes die man in Node-Red einbauen kann, haben mich eher verwirrt.

Dann bin ich von "Der Kanal" bei Youtube auf einen guten Ansatz gebracht worden. Christian Waller hat in seinem Beitrag zwar ein Ladegerät angesteuert und keinen Wechselrichter – dazu noch mit IO Broker 😖- aber der Ansatz war ausgesprochen zielführend: Ich nenne es Iterativ Dynamische Nachführung.

Etwas Theorie

Benötigt werden im Grunde 2 Werte: Der aktuelle Bezug aus dem Netz und die aktuelle Leistung des Wechselrichters. Sehr stark vereinfacht sieht das dann so aus.

Beispiel: Die Endlosschleife prüft laufend, ob der bezogene Strom aus den Netz über Null liegt – wenn ja, wird die Leistung des Wechselrichters um 1% erhöht. Dadurch ändert sich der Netzbezug – er wird kleiner. Der Vorgang wird so lange wiederholt, bis der Netzbezug Null ist. Liegt der Netzbezug unter Null wird mit negativem Vorzeichen geregelt.

Jetzt könnte man fragen, warum nimmt man nicht einfach die Differenz und regelt den Wechselrichter auf einen Schlag so aus, dass der Netzbezug Null ist?
Darum: Nehmen wir an, der Netzbezug liegt bei 30W. Die Leistung des WR wird deshalb in einem Schritt um 30W erhöht. Der Netzbezug ist danach auf Null aber der WR liefert  immer noch 30W zusätzlich. Aufgrund der Regelungsträgheit des Systems im Allgemeinen und des Wechselrichters im Besonderen, kann die Erhöhung nicht augenblicklich zurückgefahren werden – die Regelung überschießt und es werden jetzt 30W ins Netz eingespeist. Flugs wird mit -30W gegengesteuert und der Überschuss ist wieder da. So geht es hin und her bis sich irgend einer der anderen Parameter unabhängig davon ändert (z.B. Licht an).
Der Stromverbrauch im Haushalt ändert sich laufend. Es kommt also zu sehr starken und unerwünschten Ausschlägen nach oben (WR speist zuviel ein, das Zuviel geht ins Netz) oder nach unten (WR speist zu wenig ein und es wird Strom aus dem Netz bezogen).
Das passiert mehrmals in wenigen Sekunden und die Stromverlaufskurve sieht dann aus wie ein Oszillogramm von Beethovens Fünfter Symphonie. Das ist ineffizient und stresst die Komponenten.

Natürlich ist der im Flussdiagramm dargestellte Algorithmus mit +-1% Anpassung viel zu langsam. Also wird die Änderungsrate abhängig von der Differenz zum Zielwert größer oder kleiner gewählt aber eben nicht um den absoluten Differenzbetrag.

Anwendungsbeispiel

Basierend auf der oben erwähnten Anregung durch "Der Kanal" habe ich folgende Regelung gebaut. Eine Besonderheit bei den Hoymiles Wechselrichtern ist, dass die Regelung über Prozentwerte besser funktioniert als über die absolute Leistung in Watt, da die interne Regelungs prozentgenau ( dh.h. beim HM-600 auf 6W genau) erfolgt. Die minimale Leistung des verwendeten Hoymiles 600 liegt bei 2% also 12W.

Die Logik lässt sich auf jeden Wechselrichter anwenden, der über eine API, MQTT oder sonstwie fernsteuerbar ist.

Erläuterung:

feed bzw. flow.feedWRLimit ist ein Prozentwert und repräsentiert die aktuell dem WR übermittelte bzw. zu übermittelnde Leistung in Prozent. Die von mir angegebenen Prozentwerte gelten für meinen 600W Wechselrichter. Bei anderen WR Leistungen müsst ihr die Prozentwerte entsprechend anpassen!
power bzw. global.gpowerTotal ist der aktuelle Strombezug oder Überschuss vom Netz in Watt. Ausgelesen über den Strommesser – bei mir ein Shelly 3EM.
maxFeedProz bzw.  flow.maxfeed ist die Leistungsbegrenzung, die ich entweder über das Dashboard eingegeben habe oder die maximale Leistung des Wechselrichters.

Auf der Plus Seite (zu hoher Netzbezug) fängt die Regelung an, wenn mehr als 6 Watt aus dem Netz bezogen werden. Null Watt hat sich nicht bewährt, die Regelung wird "zittrig".

Abhängig von der Differenz des Netzbezugs zum Zielwert wird mit entsprechenden stärkeren oder schwächeren Leistungserhöhungen gegengesteuert.

Beispiel:
Ist der Netzbezug gleich oder höher als 150W, wird die Leistung feed um 20% (entspricht 120W) erhöht.
Bei 100W Überschreitung wird feed um 15% (= 90W) erhöht und so fort. Je niedriger der Netzbezug desto kleiner die Änderung. Irgendwann ist der Netzbezug nahe Null und die Regelung hört auf, so lange sich der Zustand nicht ändert.
Bei negativem Netzbezug (Überschuss und Einspeisung ins Netz) passiert dasselbe nur mit umgekehrten Vorzeichen.

Je nach eurer eigenen Situation müsst ihr mit den Anpassungswerten etwas spielen, damit eine möglichst glatte Anpassungskurve entsteht.

Alternativen

Das obige Javascript bzw. der NR Function-Node kommt vielleicht etwas  "hölzern" daher, da hier in Stufen reguliert wird und nicht kontinuierlich. Immerhin hat das Stufenkonzept den Vorteil, dass ich bei starker Abweichung vom Sollwert einen proportional viel höheren Korrekturwert einstellen kann, als bei einer strikt linearen Steuerung – bei der ich z.B. die Differenz immer auf 60% dämpfe und als Anpassungswert einspiele.
Eine lineare Korrektur des Steuerparameters sähe so aus:

Da wir ja möglichst einen Netzbezug von Null haben wollen ist der Zielwert logischerweise auch Null. Die Differenz zwischen Soll und Ist ist also gleich dem Netzbezug.

Der Korrekturwert errechnet sich aus dem in %WR Leistung umgerechneten Netzbezug /Einspeisung multipliziert mit einem passenden Dämpfungsfaktor – hier 60%.

Beispiel: Die Abweichung  beträgt +120W  bzw. 20%
–> Korrekturwert  ist also 20% * 0,6 = 12%

Das Javascript ist nun sehr viel überschaubarer und auch ein paar Microsekunden  schneller abgearbeitet. Der  optimale Dämpfungswert muss durch Ausprobieren herausgefunden werden. Je größer, desto schneller ist der Zielwert erreicht aber desto leichter überschießt die Regelung.
Man könnte sich auch anstatt einer linearen Dämpfung (Attenuation) auch eine geometrische Funktion überlegen – mir ist das zuviel Mathematik, zumal meine Methode für den Hausgebrauch ausreicht.

Umsetzung

Getriggert wird der Regelungs-Node durch das von mir so vorgegebene MQTT Topic batterie/WR/114183112536/status/limit_relative  also die relative Leistung des Wechselrichters, die ca. alle 5 Sekunden upgedated wird. Ihr habt sicher eine andere Topicbezeichnung am Start. Schöner wäre natürlich ein schnellerer Takt aber da macht die openDTU leider nicht mit – aber die Regelung ist trotzdem hinreichend genau.

Der Output läuft bei mir noch über einen Filter, der die Message nur bei geänderten Werten weiterleitet. Damit wird der Wechselrichter nicht laufend mit demselben Wert beaufschlagt.

Der nachfolgende "Gate" Node dient dazu, den Wechselrichter logisch abzukoppeln, wenn er nicht benötigt wird. Sonst wird die den Wechselrichter gerne mal unnötig aufweckt. Hätte hätte ich sicher auch eleganter lösen können – aber es funktioniert.

Ladestrategie und Basissteuerung (gelb) – Wechselrichter Steuerung (hellblau) Anklicken für große Darstellung

Woher – der Akku

Wie schon andernorts geschildert, habe ich zwei Pylontech US2000C mit 48V und insgesamt theoretisch 4800Wh im Einsatz. Der Hoymiles Wechselrichter zieht – wenn er kann – auch im ausgeschalteten Zustand ca. 2 Watt aus dem Akku. Das fand ich irgendwie blöd – gerade in der dunkleren Jahreszeit kommt es auf jedes Watt an. Deshalb habe ich eine  Steuerung für die Akkus gebaut, die das verhindert. Der Akkustatus wird über eine kleine HW Komponente ausgelesen, die ebenfalls in diesem Beitrag beschrieben ist und Links zur Anleitung enthält.

Keine Komplettlösung

Ich zeige oben nur die Node Darstellung  meines Setups und nicht die komplette Lösung als Node Red JSON. Es müssen eine Menge Parameter quer übers System eingelesen und in Kontext Variable gesteckt werden. Das zu dokumentieren ist ausgesprochen aufwändig und macht auch wenig Sinn, da es bei euch mit Sicherheit anders aussieht als bei mir.

Bei Interesse stelle ich das JSON gerne zur Verfügung, kann aber nur wenig Support leisten.

Bei Fragen zu den Prinzipien der Steuerung (wie hast du das … gelöst?) etc. helfe ich gerne weiter.

20 Gedanken zu „Solar – Batterie-Einspeiseregelung mit Node-Red

  1. Hi,
    beschäftige mich grade mit Nulleinspeisung für die Nacht mit HM-800 und Growatt Noach2000. Würde es gerne in node red umsetzen und wäre für deinen flow sehr dankbar.

    lg
    Joachim

  2. Hallo Chris,

    Du hast genau das gebaut, was ich vor mir habe – wenn auch mit einem HM1500.

    Ich wäre Dir sehr dankbar, wenn Du den kompletten Flow mit mir teilen könntest.

    Gruß,
    ULI

  3. Hallo Chris,
    ich habe deinen Beitrag sehr interessiert gelesen. Ich bin zur Zeit am verzweifeln für eine vernünftige Nulleinspeisung hin zubekommen. Ich wäre an Deiner lösung sehr interessiert. Ist es noch möglich den Flow zubekommen?
    Grüße Walter

  4. Super Arbeit!
    Würde mich ebenfalls gerne inspirieren lassen, aktuell ist allerdings noch kein Akku vorhanden, sprich aktuell nur für den Zero Export.
    Hoymiles WR, AhoyDTU und ShellyPro3em sind vorhanden.
    Vielen Dank

  5. Hallo Chris,

    vielen Dank für das Dokumentieren und Vorstellen Deiner Lösung. Ich bin auch über die Videos von Offys Kanal auf das Thema Nulleinspeisung mit Solarspeicher gekommen. Da ich den HM-600 nach Upgrade auf einen 'größeren' WR übrig habe, gefällt mir Dein Lösungsansatz, den HM-600 als Einspeise-WR zu nutzen sehr gut.
    Würdest Du mir Deinen Node Flow als Ausgangsbasis zur Verfügung stellen?

    Greetinx, Udo

  6. Hallo Chris,
    danke für den sehr interessanten Beitrag. Könnte ich mit dir Kontakt aufnehmen um dir mein Problem zu schildern? Ansonsten hätten ich auch Interesse an deinen Flow. Vielleicht kannst du mir diesen zukommen lassen. Vielen Dank im voraus.

    Beste Grüße

    Ulf

  7. Moin,

    danke dir für den interessanten Beitrag. Ich würde deinen Flow gerne als Inspiration für mein eigenes Projekt verwenden. Würdest du mir den Flow als JSON zuschicken?

    Danke dir im voraus!

    Beste Grüße
    Seb

  8. Moin,

    der Flow ist der Hammer und könnte mir wirklich weiterhelfen.
    Sofern du ihn teilen würdest, melde dich bitte bei mir …

    Habe zwar Deye und einen BLuepalm 2,2 KWh im Einsatz aber ich hoffe das umgebaut zu bekommen 🙂

    Beste Grüße,
    Snot

      1. Hi Chris,

        Deine Lösung sieht echt gut aus. Die würde ich gerne als Basis verwenden.
        Magst Du mir die bitte auch zusenden?

        Grüße SSC

Schreibe einen Kommentar

Ich freue mich über Lob und Kritik.
Falls du Probleme mit der hier vorgestellten Anleitung hast und nicht weiter kommst:
Bitte das Problem oder die Fehlermeldung(en) möglichst genau beschreiben, auch an welcher Stelle (z.B. in welchem Node oder Befehl) und unter welchen Umständen der Fehler auftritt.
Gerne kannst du mir auch ein Mail schreiben. Die Adresse findest du im Impressum.
Ich gebe mir viel Mühe, meinen Lesern weiterzuhelfen. Je konkreter du bist, desto einfacher und schneller kann ich versuchen zu helfen.
Deine E-Mail-Adresse wird nicht veröffentlicht.
Erforderliche Felder sind mit * markiert