{"id":2769,"date":"2024-04-21T19:52:22","date_gmt":"2024-04-21T17:52:22","guid":{"rendered":"https:\/\/www.rustimation.eu\/?p=2769"},"modified":"2026-02-22T11:27:09","modified_gmt":"2026-02-22T10:27:09","slug":"solar-einspeiseregelung-mit-node-red","status":"publish","type":"post","link":"https:\/\/www.rustimation.eu\/index.php\/solar-einspeiseregelung-mit-node-red\/","title":{"rendered":"Solar &#8211; Batterie-Einspeiseregelung mit Node-Red"},"content":{"rendered":"<p><strong>DISCLAIMER: <\/strong>Ich beschreibe hier meine Erfahrungen beim Aufbau einer Solaranlage mit Speicher im DIY Verfahren und \u00fcbernehme keine Verantwortung f\u00fcr das von euch realisierte Konstrukt. <strong>Use at your own risk! <\/strong>Bedenkt, dass elektrischer Strom unter Umst\u00e4nden auch lebensgef\u00e4hrlich oder gar t\u00f6dlich verletzen kann. Arbeiten am Stromnetz des eigenen Haushalts besser einem ausgebildeten Elektiker \u00fcberlassen.<\/p>\n<h2>Was<\/h2>\n<p>Eine Einspeiseregelung hat den Zweck, immer genau so viel Strom aus einer Batterie ins Hausnetz zu f\u00fcttern, wie im selben Augenblick verbraucht wird. Zumindest bis die Leistungsgrenze des Wechselrichters erreicht ist. Alles dar\u00fcber 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\u00a0 den Stunden, in denen kein oder zu wenig Solarstrom erzeugt wird.<!--more--><\/p>\n<p>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\u00fcstet habe. Der HM-600 war also \u00fcbrig, um ihn f\u00fcr die Batterie-Einspeisung zweckzuentfremden.<\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #808080;\"><span style=\"color: #999999;\">Funfact: \u00dcbrig 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\u00f6tigt. Dieses gibt es zusammen mit dem openDTU Bausatz f\u00fcr wenig Geld bei<\/span><span style=\"color: #800000;\"> <a style=\"color: #800000;\" href=\"https:\/\/shop.blinkyparts.com\/de\/Ebyte-Funkmodul-CMT2300A-868-915MHz-Breakoutboard\/blink238542\" target=\"_blank\" rel=\"noopener\">Blinkyparts<\/a><\/span>. Nun ist dieser CMT2300A Funkchip so winzig und fummelig, dass ich es einfach nicht geschafft habe, das Teil so auf die Platine zu l\u00f6ten, dass es hinterher auch funktioniert hat.(Update: Inzwischen gibt es den Chip bei Blinkyparts auch verl\u00f6tet). Ich habe mich seinerzeit auf die Suche nach einem anderen Anbieter gemacht bei dem der Chip schon montiert war und bin beim, inzwischen nicht mehr existierenden, Shop\u00a0 <a href=\"https:\/\/wechselrichter-versand.de\/openDTU-S-fuer-Hoymiles-Serie-HMT-HMS-Bausatz\/HY10012\" target=\"_blank\" rel=\"noopener\">wechselrichter-versand.de<\/a> f\u00fcndig geworden. Die zuerst gekaufte OpenDTU kann ich nun in Verbindung mit dem NRF Funkmodul prima f\u00fcr die Einspeisung verwenden. Das Display sieht im Sicherungskasten auch ganz schick aus.<br \/>\n<\/span><\/p>\n<p><span style=\"color: #000000;\">Wohlgemerkt, dieses Konzept braucht f\u00fcr die AC Einspeisung\u00a0 einen eigenen Wechselrichter. Ferner muss es nicht unbedingt ein Hoymiles WR sein. Wichtig ist, dass er in irgend einer Weise, sei es \u00fcber MQTT, Modbus oder anders in seiner Leistung geregelt\u00a0 werden kann. <\/span><\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/01\/Setup-e1705571171755.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-2630\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/01\/Setup-1024x576.jpg\" alt=\"\" width=\"604\" height=\"340\" \/><\/a><\/p>\n<h2>Wann &#8211; Einspeisestrategie<\/h2>\n<p>Bez\u00fcglich der Strategie, also <strong>wann<\/strong> wird eingespeist, gibt es viele M\u00f6glichkeiten. Man k\u00f6nnte 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\u00e4nkt.<\/p>\n<figure id=\"attachment_2789\" aria-describedby=\"caption-attachment-2789\" style=\"width: 723px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-17_20_55-Centralina-\u2013-Mozilla-Firefox.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2789 size-full\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-17_20_55-Centralina-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"723\" height=\"620\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-17_20_55-Centralina-\u2013-Mozilla-Firefox.png 723w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-17_20_55-Centralina-\u2013-Mozilla-Firefox-300x257.png 300w\" sizes=\"auto, (max-width: 723px) 100vw, 723px\" \/><\/a><figcaption id=\"caption-attachment-2789\" class=\"wp-caption-text\">Einspeise Dashboard mit Strategieauswahl und aufgelaufenen Tageswerten, aktueller Leistung sowie den Steuerungsparametern untere Entladegrenze und maximale Einspeiseleistung.<\/figcaption><\/figure>\n<figure id=\"attachment_2788\" aria-describedby=\"caption-attachment-2788\" style=\"width: 555px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-17_17_06-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2788 size-full\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-17_17_06-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"555\" height=\"216\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-17_17_06-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox.png 555w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-17_17_06-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox-300x117.png 300w\" sizes=\"auto, (max-width: 555px) 100vw, 555px\" \/><\/a><figcaption id=\"caption-attachment-2788\" class=\"wp-caption-text\">Strategie Nodes<\/figcaption><\/figure>\n<p>Die Einspeise-Strategie wird \u00fcber einen Drop-Down Node realisiert. Zum Persisitieren wird die Strategie entsprechend weggespeichert und bei Neustart wieder eingelesen. Zur sp\u00e4teren Verwendung, wird eine Flow Variable erzeugt.<\/p>\n<p>Anschlie\u00dfend wird alle 30 Sekunden entschieden, ob der Batterie-WR an- oder ausgeschaltet werden oder sein Status unver\u00e4ndert bleiben soll.<\/p>\n<p>Das geschieht im Node \"Einspeisung-Basics\":<\/p>\n<figure id=\"attachment_2818\" aria-describedby=\"caption-attachment-2818\" style=\"width: 1356px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-22-17_32_49-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2818 size-full\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-22-17_32_49-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"1356\" height=\"432\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-22-17_32_49-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox.png 1356w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-22-17_32_49-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox-300x96.png 300w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-22-17_32_49-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox-1024x326.png 1024w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-22-17_32_49-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox-768x245.png 768w\" sizes=\"auto, (max-width: 1356px) 100vw, 1356px\" \/><\/a><figcaption id=\"caption-attachment-2818\" class=\"wp-caption-text\">Vereinfachte WR Steuerung<\/figcaption><\/figure>\n<p>Die Entscheidung wird wie folgt getroffen:<\/p>\n<pre class=\"height-set:true lang:js decode:true\">let strategy = msg.payload;\r\nlet socMinimum = flow.get(\"minSoc\");           \/\/ untere Entladegrenze des Akkus\r\nlet soc = global.get(\"SoC\");                   \/\/State of Charge\r\nlet consump =global.get(\"gpowerTotal\");        \/\/aktueller Netzbezug\/\u00dcberschuss\r\nlet solarProd = global.get(\"solarProducing\");  \/\/status Solarproduktion\r\nlet setWRStatus=1;\r\nlet canDo = 1\r\n\r\n\/\/ Genereller Ausschluss --&gt; WR wird nicht eingeschaltet wenn:\r\n    \/\/ SoC unter Minimum\r\nif (soc &lt;= socMinimum)\r\n    {\r\n        setWRStatus = 0;\r\n        canDo=0;\r\n    }\r\n\r\n    \/\/bei Batterieladen keine Einspeisung\r\nif (global.get(\"chargeWatt\")&gt;0) \r\n    {\r\n        setWRStatus=0;\r\n        canDo=0\r\n    }\r\n\r\nif (consump &lt; -20 &amp;&amp; solarProd &gt; 0)  \/\/ bei niedrigem Export verhindern, dass WR anspringt. Morgens\r\n{\r\n    setWRStatus = 0;\r\n    canDo = 0;\r\n}\r\n\/\/ Ende genereller Ausschluss\r\n\r\n\/\/wenn generell m\u00f6glich: Aktion gem\u00e4\u00df Strategieauswahl \r\nif (canDo == 1)\r\n    {\r\n        if (strategy == 0)  \/\/ WR \"Aus\" gesetzt\r\n            {\r\n                setWRStatus=0\r\n\r\n            }\r\n        else if (strategy == 1)  \/\/ Nach Bedarf - Nullimport\r\n            {\r\n                setWRStatus = 1;\r\n            }\r\n        else if (strategy == 2)  \/\/ nach Bedarf wenn kein Solarertrag\r\n            {\r\n                if (solarProd == 1)\r\n                {\r\n                    setWRStatus = 0;\r\n                }\r\n                else \r\n                {\r\n                    setWRStatus = 1;\r\n                }\r\n            }\r\n    }\r\n\r\nmsg.payload = setWRStatus;      \r\nreturn msg;<\/pre>\n<p>Anschlie\u00dfend 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.<\/p>\n<h2>Wieviel &#8211; Leistungssteuerung<\/h2>\n<p>Mathematik ist nicht unbedingt meine St\u00e4rke, wenn es \u00fcber die Grundrechenarten hinausgeht. Die Frage war: Wie passe ich die Leistung des Einspeise Wechselrichters an meinen Verbrauch an?<\/p>\n<p>Eine Bezugsgr\u00f6\u00dfe ist der Strom, der aus dem Netz gezogen wird &#8211; dieser soll m\u00f6glichst bei Null oder knapp dar\u00fcber liegen. Dadurch, dass ich mit der Einspeisung diese Bezugsgr\u00f6\u00dfe laufend \u00e4ndere und ich auch keine Voraussage \u00fcber den gerade ben\u00f6tigten Strom (Licht an, Herd aus&#8230;) oder die gerade herrschende Solarprodukton machen kann, wird es schnell sehr kompliziert &#8211; finde ich.<\/p>\n<p>Ich habe mit verschiedenen Algorithmen und auch mit einem<a href=\"https:\/\/de.wikipedia.org\/wiki\/Regler#PID-Regler\"> PID Regler Verfahren<\/a> experimentiert und bin zu keinem Ergebnis gekommen. Zuviel Mathematik. Auch die PID Nodes die man in Node-Red einbauen kann, haben mich eher verwirrt.<\/p>\n<p>Dann bin ich von \"Der Kanal\" bei Youtube auf einen guten Ansatz gebracht worden. Christian Waller hat in seinem <a href=\"https:\/\/www.youtube.com\/watch?v=7OJ89K7kDEo\" target=\"_blank\" rel=\"noopener\">Beitrag<\/a> zwar ein Ladeger\u00e4t angesteuert und keinen Wechselrichter &#8211; dazu noch mit IO Broker \ud83d\ude16- aber der Ansatz war ausgesprochen zielf\u00fchrend: Ich nenne es <em>Iterativ Dynamische Nachf\u00fchrung<\/em>.<\/p>\n<h3>Etwas Theorie<\/h3>\n<p>Ben\u00f6tigt 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.<\/p>\n<p><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-18_39_19-Solarspeicher.pptx-PowerPoint.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2793\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-18_39_19-Solarspeicher.pptx-PowerPoint.png\" alt=\"\" width=\"607\" height=\"544\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-18_39_19-Solarspeicher.pptx-PowerPoint.png 607w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-18_39_19-Solarspeicher.pptx-PowerPoint-300x269.png 300w\" sizes=\"auto, (max-width: 607px) 100vw, 607px\" \/><\/a><\/p>\n<p><strong>Beispiel<\/strong>: Die Endlosschleife pr\u00fcft laufend, ob der bezogene Strom aus den Netz \u00fcber Null liegt &#8211; wenn ja, wird die Leistung des Wechselrichters um 1% erh\u00f6ht. Dadurch \u00e4ndert sich der Netzbezug &#8211; er wird kleiner. Der Vorgang wird so lange wiederholt, bis der Netzbezug Null ist. Liegt der Netzbezug unter Null wird mit negativem Vorzeichen geregelt.<\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #808080;\">Jetzt k\u00f6nnte man fragen, <strong>warum<\/strong> nimmt man nicht einfach die Differenz und regelt den Wechselrichter auf einen Schlag so aus, dass der Netzbezug Null ist?<\/span><br \/>\n<span style=\"color: #808080;\"><strong>Darum<\/strong>: Nehmen wir an, der Netzbezug liegt bei 30W. Die Leistung des WR wird deshalb in einem Schritt um 30W erh\u00f6ht. Der Netzbezug ist danach auf Null aber der WR liefert\u00a0 immer noch 30W zus\u00e4tzlich. Aufgrund der Regelungstr\u00e4gheit des Systems im Allgemeinen und des Wechselrichters im Besonderen, kann die Erh\u00f6hung nicht augenblicklich zur\u00fcckgefahren werden &#8211; die Regelung \u00fcberschie\u00dft und es werden jetzt 30W ins Netz eingespeist. Flugs wird mit -30W gegengesteuert und der \u00dcberschuss ist wieder da. So geht es hin und her bis sich irgend einer der anderen Parameter unabh\u00e4ngig davon \u00e4ndert (z.B. Licht an).<\/span><br \/>\n<span style=\"color: #808080;\">Der Stromverbrauch im Haushalt \u00e4ndert sich laufend. Es kommt also zu sehr starken und unerw\u00fcnschten Ausschl\u00e4gen 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).<\/span><br \/>\n<span style=\"color: #808080;\">Das passiert mehrmals in wenigen Sekunden und die Stromverlaufskurve sieht dann aus wie ein Oszillogramm von Beethovens F\u00fcnfter Symphonie. Das ist ineffizient und stresst die Komponenten.<br \/>\n<\/span><\/p>\n<p>Nat\u00fcrlich ist der im Flussdiagramm dargestellte Algorithmus mit +-1% Anpassung viel zu langsam. Also wird die \u00c4nderungsrate abh\u00e4ngig von der Differenz zum Zielwert gr\u00f6\u00dfer oder kleiner gew\u00e4hlt aber eben nicht um den absoluten Differenzbetrag.<\/p>\n<h3>Anwendungsbeispiel<\/h3>\n<p>Basierend auf der oben erw\u00e4hnten Anregung durch \"Der Kanal\" habe ich folgende Regelung gebaut. Eine Besonderheit bei den Hoymiles Wechselrichtern ist, dass die Regelung \u00fcber Prozentwerte besser funktioniert als \u00fcber die absolute Leistung in Watt, da die interne Regelungs prozentgenau ( d.h. beim HM-600 auf 6W genau) erfolgt. Die minimale Leistung des verwendeten Hoymiles 600 liegt bei 2% also 12W.<\/p>\n<p>Die Logik l\u00e4sst sich auf jeden Wechselrichter anwenden, der \u00fcber eine API, MQTT oder sonstwie fernsteuerbar ist.<\/p>\n<pre class=\"height-set:true lang:js decode:true \">let feed = flow.get(\"feedWRLimit\");     \/\/ Leistungseinstellung des WR auslesen\r\nlet power = global.get(\"gpowerTotal\");  \/\/ aktueller Netzbezug bzw. \u00dcberschuss\r\nlet maxFeedProz=flow.get(\"maxfeed\")\/6;  \/\/im Dashboard eingestellte oder tats\u00e4chliche Maximalleistung des WR\r\n                                        \/\/maxFeedProz wird errechnet z.B. HM-600 --&gt;Einstellung 300 --&gt; 300\/600*100=50%\r\nlet feedWRActive = flow.get(\"feedWRActive\"); \/\/ Status des Einspeise WR (1\/0)\r\n\r\n\/\/ ACHTUNG: feed = PROZENTWERTE zwischen 0 und 100%\r\n\/\/          power = Netzbezug\/\u00dcberschuss in WATT(!)\r\n\/\/ msg.ff ist optional zum debuggen\r\n\r\nif (feedWRActive = 1)  \/\/ Schleife l\u00e4uft nur, wenn WR aktiv ist\r\n{   \r\n    if (power &gt; 12)       \/\/ beruhigt die zittrige Regelung im Sollbereich\r\n    {\r\n        if (power &gt;= 150)\r\n        {\r\n            msg.ff=20;\r\n            feed=feed +20;         \r\n        }        \r\n       else if (power &gt;= 100)\r\n        {\r\n            msg.ff=15;\r\n            feed=feed + 15;  \r\n        }\r\n        else if (power &gt;= 50)  \r\n        {\r\n            msg.ff=8;\r\n            feed=feed + 8;             \r\n        }         \r\n        else if (power &gt;= 25) \r\n        {\r\n            msg.ff=3;\r\n            feed = feed + 2;\r\n        }                         \r\n        else if (power &gt;= 10)  \r\n        {\r\n            msg.ff=1;\r\n            feed+1;             \r\n        }\r\n        else if (power &gt;0)  \r\n        {\r\n            msg.ff=1;\r\n            feed++;             \r\n        }\r\n        else if (power =0)  \r\n        {\r\n            msg.ff=\"BINGO!!!\";  \/\/ wird nicht vorkommen       \r\n        }\r\n    }\r\n    else if (power &lt; 0) \/\/power &lt; 0 also Einspeisung ins ENEL Netz\r\n    {\r\n        if (power &lt;= -150) \r\n            {   \r\n                msg.ff=-20;\r\n                feed = feed - 20;\r\n            }\r\n        else if (power &lt;= -100) \r\n            {\r\n                msg.ff=-15;\r\n                feed = feed - 15;\r\n            }\r\n        else if (power &lt;= -50) \r\n            {\r\n                msg.ff=-8;\r\n                feed = feed - 8;\r\n            }\r\n        else if (power &lt;= -25) \r\n            {\r\n                msg.ff=-5;\r\n                feed = feed - 5;\r\n            }                    \r\n        else if (power &lt;= -10) \r\n            {\r\n                msg.ff=-4;\r\n                feed = feed-4;\r\n            } \r\n        else if (power &lt; -3) \r\n            {\r\n                msg.ff=-1;\r\n                feed--;\r\n            } \r\n    }\r\n}\r\n\r\nif (feed &gt; maxFeedProz)   \/\/PROZENT!!\r\n{\r\n    feed = maxFeedProz;\r\n}\r\nelse if (feed &lt; 0)\r\n    {\r\n        feed = 2;\r\n    }     \r\nmsg.power=power;\r\nmsg.payload = feed;\r\nflow.set(\"feedWRLimit\",feed);\r\nreturn msg;<\/pre>\n<h4>Erl\u00e4uterung:<\/h4>\n<p><strong>feed <\/strong>bzw.<strong> flow.feedWRLimit<\/strong> ist ein Prozentwert und repr\u00e4sentiert die aktuell dem WR \u00fcbermittelte bzw. zu \u00fcbermittelnde Leistung in Prozent. Die von mir angegebenen Prozentwerte gelten f\u00fcr meinen 600W Wechselrichter. Bei anderen WR Leistungen m\u00fcsst ihr die Prozentwerte entsprechend anpassen!<br \/>\n<strong>power<\/strong> bzw. <strong>global.gpowerTotal<\/strong> ist der aktuelle Strombezug oder \u00dcberschuss vom Netz in Watt. Ausgelesen \u00fcber den Strommesser &#8211; bei mir ein Shelly 3EM.<br \/>\n<strong>maxFeedProz<\/strong> bzw.\u00a0 <strong>flow.maxfeed<\/strong> ist die Leistungsbegrenzung, die ich entweder \u00fcber das Dashboard eingegeben habe oder die maximale Leistung des Wechselrichters.<\/p>\n<p>Auf der <strong>Plus<\/strong> Seite (zu hoher Netzbezug) f\u00e4ngt die Regelung an, wenn mehr als 12 Watt aus dem Netz bezogen werden. Null Watt hat sich nicht bew\u00e4hrt, die Regelung wird \"zittrig\".<\/p>\n<p>Abh\u00e4ngig von der Differenz des Netzbezugs zum Zielwert wird mit entsprechenden st\u00e4rkeren oder schw\u00e4cheren Leistungserh\u00f6hungen gegengesteuert.<\/p>\n<p><strong><em>Beispiel<\/em><\/strong>:<br \/>\nIst der Netzbezug gleich oder h\u00f6her als 150W, wird die Leistung <em>feed<\/em> um 20% (entspricht 120W) erh\u00f6ht.<br \/>\nBei 100W \u00dcberschreitung wird <em>feed<\/em> um 15% (= 90W) erh\u00f6ht und so fort. Je niedriger der Netzbezug desto kleiner die \u00c4nderung. Irgendwann ist der Netzbezug nahe Null und die Regelung h\u00f6rt auf, so lange sich der Zustand nicht \u00e4ndert.<br \/>\nBei <strong>negativem<\/strong> Netzbezug (\u00dcberschuss und Einspeisung ins Netz) passiert dasselbe nur mit umgekehrten Vorzeichen.<\/p>\n<p>Je nach eurer eigenen Situation m\u00fcsst ihr mit den Anpassungswerten etwas spielen, damit eine m\u00f6glichst glatte Anpassungskurve entsteht.<\/p>\n<h4>Alternativen<\/h4>\n<p>Das obige Javascript bzw. der NR Function-Node kommt vielleicht etwas\u00a0 \"h\u00f6lzern\" 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\u00f6heren Korrekturwert einstellen kann, als bei einer strikt linearen Steuerung &#8211; bei der ich z.B. die Differenz immer auf 60% d\u00e4mpfe und als Anpassungswert einspiele.<br \/>\nEine lineare Korrektur des Steuerparameters s\u00e4he so aus:<\/p>\n<pre class=\"height-set:true height:350 lang:js decode:true\" title=\"Anpassung mit linearer D\u00e4mpfung\">let korrektur = 0;\r\nlet feed = flow.get(\"feedWRLimit\");     \/\/ Leistungseinstellung des WR auslesen\r\nlet power = global.get(\"gpowerTotal\");  \/\/ aktueller Netzbezug bzw. \u00dcberschuss\r\nlet maxFeedProz=flow.get(\"maxfeed\")\/6;  \/\/im Dashboard eingestellte oder tats\u00e4chliche Maximalleistung des WR\r\n                                        \/\/maxFeedProz wird errechnet z.B. HM-600 --&gt;Einstellung 300 --&gt; 300\/600*100=50%\r\nlet feedWRActive = flow.get(\"feedWRActive\"); \/\/ Status des Einspeise WR (1\/0)\r\n\r\n\/\/ ACHTUNG: feed = PROZENTWERTE zwischen 0 und 100%\r\n\/\/          power = Netzbezug\/\u00dcberschuss in WATT(!)\r\n\/\/ msg.ff ist optional zum debuggen\r\n\r\nif (feedWRActive = 1)  \/\/ Schleife l\u00e4uft nur, wenn WR aktiv ist\r\n{\r\n    if (power &gt; 12 || power &lt; 0) \/\/ keine Regelung wenn Netzbezug leicht positiv (0-12W) ruhigere Regelung im Sollbereich.\r\n    {\r\n        let korrektur =  power\/6 * 0.55;  \/\/Leistung in WR% mal D\u00e4mpfung (Attenuation)\r\n        feed = Math.round(feed + korrektur); \r\n        msg.korrektur=Math.round(korrektur); \r\n    }\r\n    else\r\n    {\r\n        korrektur = 0;\r\n        msg.korrektur = 0;\r\n    }\r\n}\r\nif (feed &gt; maxFeedProz)   \/\/PROZENT!!\r\n{\r\n    feed = maxFeedProz;\r\n}\r\nelse if (feed &lt; 0)\r\n    {\r\n        feed = 2;\r\n    }     \r\nmsg.power=power;\r\nmsg.payload = feed;  \/\/zum debuggen\r\nmsg.korrektur = korrektur; \/\/zum debuggen\r\nflow.set(\"feedWRLimit\",feed);\r\nreturn msg;<\/pre>\n<p>Da wir ja m\u00f6glichst einen Netzbezug von Null haben wollen ist der Zielwert logischerweise auch Null. Die Differenz zwischen Soll und Ist ist also gleich dem Netzbezug.<\/p>\n<p>Der Korrekturwert errechnet sich aus dem in %WR Leistung umgerechneten Netzbezug \/Einspeisung multipliziert mit einem passenden D\u00e4mpfungsfaktor &#8211; hier 55%.<\/p>\n<p><strong>Beispiel<\/strong>: Die Abweichung\u00a0 betr\u00e4gt +120W\u00a0 bzw. 20% der Wechselrichter Maximalleistung<br \/>\n&#8211;&gt; Korrekturwert\u00a0 ist also 20% * 0,55 = 11%<\/p>\n<p>Das Javascript ist nun sehr viel \u00fcberschaubarer und auch ein paar Microsekunden\u00a0 schneller abgearbeitet. Der\u00a0 optimale D\u00e4mpfungswert muss durch Ausprobieren herausgefunden werden. Je gr\u00f6\u00dfer, desto schneller ist der Zielwert erreicht aber desto leichter \u00fcberschie\u00dft die Regelung.<br \/>\nMan k\u00f6nnte sich auch anstatt einer linearen D\u00e4mpfung (Attenuation) auch eine geometrische Funktion \u00fcberlegen &#8211; mir ist das zuviel Mathematik, zumal meine Methode f\u00fcr den Hausgebrauch ausreicht.<\/p>\n<h4>Umsetzung<\/h4>\n<p>Getriggert wird der Regelungs-Node durch das von mir so vorgegebene MQTT Topic <span class=\"lang:default decode:true crayon-inline\">batterie\/WR\/114183112536\/status\/limit_relative<\/span>\u00a0 also die relative Leistung des Wechselrichters, die ca. alle 5 Sekunden upgedated wird. Ihr habt sicher eine andere Topicbezeichnung am Start. Sch\u00f6ner w\u00e4re nat\u00fcrlich ein schnellerer Takt aber da macht die openDTU leider nicht mit &#8211; aber die Regelung ist trotzdem hinreichend genau.<\/p>\n<p>Der Output l\u00e4uft bei mir noch \u00fcber einen Filter, der die Message nur bei ge\u00e4nderten Werten weiterleitet. Damit wird der Wechselrichter nicht laufend mit demselben Wert beaufschlagt. Aber Achtung: Der Filter kann dazu f\u00fchren, dass sich die Regelung verschluckt. Besonders bei sehr hohen, Pl\u00f6tzlichen Verbrauchserh\u00f6hungen (Backofen, Elektroauto) passiert das gerne einmal. Ich habe den Filter inzwischen wieder ausgebaut.<\/p>\n<p>Der nachfolgende \"Gate\" Node dient dazu, den Wechselrichter logisch abzukoppeln, wenn er nicht ben\u00f6tigt wird. Sonst wird der Wechselrichter gerne mal unn\u00f6tig aufweckt. H\u00e4tte h\u00e4tte ich sicher auch eleganter l\u00f6sen k\u00f6nnen &#8211; aber es funktioniert.<\/p>\n<figure id=\"attachment_2797\" aria-describedby=\"caption-attachment-2797\" style=\"width: 1672px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-19_45_08-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2797 size-full\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-19_45_08-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox.png\" alt=\"\" width=\"1672\" height=\"625\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-19_45_08-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox.png 1672w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-19_45_08-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox-300x112.png 300w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-19_45_08-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox-1024x383.png 1024w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-19_45_08-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox-768x287.png 768w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2024\/04\/2024-04-21-19_45_08-Node-RED-_-Batterie-Einspeisung-\u2013-Mozilla-Firefox-1536x574.png 1536w\" sizes=\"auto, (max-width: 1672px) 100vw, 1672px\" \/><\/a><figcaption id=\"caption-attachment-2797\" class=\"wp-caption-text\">Einspeisestrategie und Basissteuerung (gelb) &#8211; Wechselrichter Steuerung (hellblau) Anklicken f\u00fcr gro\u00dfe Darstellung<\/figcaption><\/figure>\n<h2>Woher &#8211; der Akku<\/h2>\n<p style=\"text-align: left;\">Wie schon andernorts geschildert, habe ich zwei Pylontech US2000C mit 48V und insgesamt theoretisch 4800Wh im Einsatz. Der Hoymiles Wechselrichter zieht &#8211; wenn er kann &#8211; auch im ausgeschalteten Zustand ca. 2 Watt aus dem Akku. Das fand ich irgendwie bl\u00f6d &#8211; gerade in der dunkleren Jahreszeit kommt es auf jedes Watt an. Deshalb habe ich eine\u00a0 Steuerung f\u00fcr die Akkus gebaut, die das verhindert. Der Akkustatus wird \u00fcber eine kleine HW Komponente ausgelesen, die ebenfalls in diesem <a href=\"https:\/\/www.rustimation.eu\/index.php\/solar-pylontech-akku-ueber-konsole-aufwecken\/\" target=\"_blank\" rel=\"noopener\">Beitrag <\/a>beschrieben ist und Links zur Anleitung enth\u00e4lt.<\/p>\n<h2>Keine Komplettl\u00f6sung<\/h2>\n<p>Ich zeige oben nur die Node Darstellung\u00a0 meines Setups und nicht die komplette L\u00f6sung als Node Red JSON. Es m\u00fcssen eine Menge Parameter quer \u00fcbers System eingelesen und in Kontext Variable gesteckt werden. Das zu dokumentieren ist ausgesprochen aufw\u00e4ndig und macht auch wenig Sinn, da es bei euch mit Sicherheit anders aussieht als bei mir.<\/p>\n<p>Bei Interesse stelle ich das bei mir implementierte JSON &#8211; inklusive der Steuerung des Pylontech Akkus und des Hoymiles HM600 Wechselrichters &#8211; gerne zur Verf\u00fcgung, kann aber nur wenig Support leisten. Auf jeden Fall solltet ihr den SoC des Akkus auslesen und verarbeiten k\u00f6nnen &#8211; rein aufs BMS zur Regelung der <em>Depth of Discharge<\/em> bzw. <em>Max. Charge<\/em> w\u00fcrde ich mich nicht verlassen wollen.<\/p>\n<p>Bei Fragen zu den Prinzipien der Steuerung (wie hast du das &#8230; gel\u00f6st?) etc. helfe ich gerne weiter.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>DISCLAIMER: Ich beschreibe hier meine Erfahrungen beim Aufbau einer Solaranlage mit Speicher im DIY Verfahren und \u00fcbernehme keine Verantwortung f\u00fcr das von euch realisierte Konstrukt. Use at your own risk! Bedenkt, dass elektrischer Strom unter Umst\u00e4nden auch lebensgef\u00e4hrlich oder gar t\u00f6dlich verletzen kann. Arbeiten am Stromnetz des eigenen Haushalts besser einem ausgebildeten Elektiker \u00fcberlassen. Was &hellip; <a href=\"https:\/\/www.rustimation.eu\/index.php\/solar-einspeiseregelung-mit-node-red\/\" class=\"more-link\"><span class=\"screen-reader-text\">Solar &#8211; Batterie-Einspeiseregelung mit Node-Red<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[151,181],"tags":[100,99,191],"class_list":["post-2769","post","type-post","status-publish","format-standard","hentry","category-node-red","category-solar","tag-esp8266","tag-mqtt","tag-opendtu"],"_links":{"self":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/2769","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/comments?post=2769"}],"version-history":[{"count":1,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/2769\/revisions"}],"predecessor-version":[{"id":3808,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/2769\/revisions\/3808"}],"wp:attachment":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/media?parent=2769"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/categories?post=2769"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/tags?post=2769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}