PV-Überschuss Steuerung für Heizstab/Boiler am Multiplus 2

Moin Leute,

ich habe das gleiche Problem wie viele hier: Oft ist mein PV-Überschuss kleiner als die Leistung des Heizstabes.

Ziel ist es, einen 15-Liter-Druckboiler in einer Gartenlaube als PV-Überschusslast an einem Victron Multiplus II 3000 zu betreiben – ohne Phasenanschnitt, ohne DC-Anteil, MP2-freundlich.

Hardware:

  • Victron Multiplus II GX 3000

  • GX IO-Extender 150 (PWM-Ausgang)

  • Arduino Nano

  • Fotek SSR-25DA (Zero-Crossing)

Funktionsweise:

Der GX IO-Extender gibt ein PWM-Signal (1562,5 Hz) aus, dessen Tastverhältnis den verfügbaren PV-Überschuss kodiert. Der Arduino liest dieses Signal per Flanken-Interrupt aus und wandelt es in ein verteiltes Schwingungspaket für das Zero-Crossing SSR um.

Pro Paket werden 8 Netzzyklen (160ms) geschaltet. Die eingeschalteten Zyklen werden dabei gleichmäßig über das Paket verteilt statt geblockt am Anfang (normale Schwingungspaketsteuerung) – dadurch sieht der Wechselrichter kleinere, regelmäßigere Lastwechsel. Das ergibt 8 Leistungsstufen von 0 bis 1500W in Schritten von ~188W.

Ein Stufenwechsel wird immer erst am Paketanfang übernommen, nie mittendrin – damit entstehen keine unvollständigen Halbwellen.

Die Steuerlogik (Überschussberechnung, Lastüberwachung, Temperatursensor) läuft in Node-RED direkt auf dem Multiplus II GX.

Was haltet ihr davon? Wird sich der MP2 über die seltsame Last beschweren?

BTW: Der Arduino Nano ist noch nicht gesetzt. Evtl wird es auch ein ESP32 mit Modbus und der GX IO-Extender 150 (PWM-Ausgang) wird wieder verkauft da ich ihn nicht wirklich nutze

Anbei der Arduino Code gezippt. SplitBurstController.zip (2,0 KB)

#include <TimerOne.h> // getestet mit TimerOne Lib Version 1.1.1

// ── Pins ──────────────────────────────────────────────────
const int inputPin  = 2;  // PWM-Eingang vom GX IO-Extender (INT0)
const int outputPin = 9;  // Steuerausgang zum SSR

// ── Schwingungspaket ──────────────────────────────────────
const int  packetSteps     = 8;     // Anzahl Netzzyklen pro Paket
const long cycleDurationUs = 20000; // 20ms = 1 Netzzyklus bei 50Hz

// ── PWM-Eingang ───────────────────────────────────────────
const float periodDurationUs = 640.0; // 1/1562,5Hz in Mikrosekunden

// ── Bitmuster für gleichmäßige Lastverteilung ─────────────
// Zeile = Stufe (0-8), Spalte = Zyklus (0-7)
const bool pattern[9][8] = {
  {0,0,0,0,0,0,0,0},  // Stufe 0 =    0W
  {1,0,0,0,0,0,0,0},  // Stufe 1 = ~188W
  {1,0,0,0,1,0,0,0},  // Stufe 2 = ~375W
  {1,0,0,1,0,0,1,0},  // Stufe 3 = ~563W
  {1,0,1,0,1,0,1,0},  // Stufe 4 = ~750W
  {1,1,0,1,0,1,1,0},  // Stufe 5 = ~938W
  {1,1,1,0,1,1,1,0},  // Stufe 6 =~1125W
  {1,1,1,1,1,1,1,0},  // Stufe 7 =~1313W
  {1,1,1,1,1,1,1,1},  // Stufe 8 = 1500W
};

// ── Geteilte Variablen (ISR + loop) ───────────────────────
volatile unsigned long risingTime   = 0;     // Zeitstempel steigende Flanke
volatile unsigned long highDuration = 0;     // gemessene HIGH-Dauer in µs
volatile bool          newValue     = false; // neuer Messwert verfügbar

// ── Paketsteuerung (nur in Timer-ISR verwendet) ───────────
volatile int counter    = 0; // aktueller Zyklus im Paket (0..packetSteps-1)
volatile int activeStep = 0; // aktive Stufe (wird am Paketanfang übernommen)
volatile int nextStep   = 0; // nächste Stufe (aus loop() geschrieben)

// ── Timer-ISR: läuft exakt alle 20ms ─────────────────────
void timerIsr() {
  // Neue Stufe nur am Paketanfang übernehmen → kein Halbwellenproblem
  if (counter == 0) {
    activeStep = nextStep;
  }

  // Ausgang anhand Bitmuster setzen
  if (pattern[activeStep][counter]) {
    digitalWrite(outputPin, HIGH);
  } else {
    digitalWrite(outputPin, LOW);
  }

  // Zähler weiterschalten
  counter = (counter + 1) % packetSteps;
}

// ── Flanken-ISR: misst HIGH-Dauer des PWM-Eingangs ───────
void edgeIsr() {
  if (digitalRead(inputPin) == HIGH) {
    risingTime = micros();                // steigende Flanke merken
  } else {
    highDuration = micros() - risingTime; // fallende Flanke: Dauer berechnen
    newValue = true;
  }
}

void setup() {
  pinMode(inputPin, INPUT);
  pinMode(outputPin, OUTPUT);

  // Flankenerkennung auf inputPin
  attachInterrupt(digitalPinToInterrupt(inputPin), edgeIsr, CHANGE);

  // Timer auf Zyklusdauer einstellen und ISR verknüpfen
  Timer1.initialize(cycleDurationUs);
  Timer1.attachInterrupt(timerIsr);
}

void loop() {
  if (newValue) {
    newValue = false;

    // Tastverhältnis berechnen und auf 0.0–1.0 begrenzen
    float dutyCycle = constrain(highDuration / periodDurationUs, 0.0, 1.0);

    // Auf Paketstufen abbilden und atomar schreiben
    noInterrupts();
    nextStep = round(dutyCycle * packetSteps);
    interrupts();
  }
}
1 „Gefällt mir“

Mangels Feedback werde ich das Projekt nicht weiter fortsetzen. Um die Leistung zu reduzieren plane ich nun einen 110V / 1000W Spartrafo (ca. 30€) einzusetzen und den I/O-Expander 150 wieder zu verkaufen. Ist sowohl billiger als auch materialschonender / zuverlässiger. Das ganze wurde bereits hier beschrieben: https://akkudoktor.net/t/balkonsolarwasserboiler-1400w-heizstab-auf-360w-gedrosselt-30l-4-std-heizzeit-220v-zu-110v-trafo-bkw-boiler/29138. Wie bereits im Thread erwähnt: Schutzleiter nicht vergessen! Dieser ist offenbar häufig nicht am Gehäuse angeklemmt und nicht zum Verbaucher durchgeschliffen.

Das Schalten der Überschusslast erfolgt nun über das programmierbare AUX-Relais des Multiplus 2 und zwar SOC gesteuert über zwei Regeln im VEConfigure 3: Ist die AC-Last kleiner 500W und der SOC über 95% wird der Boiler eingeschaltet. Fällt der SOC unter 85% wird abgeschaltet. Das Relais schaltet ein weiteres 230V/25A Hutschienen-Relais dass wiederum den Spartrafo schaltet. Das AUX-Relais direkt wäre wohl mit der Induktivität des Spartrafos auf Dauer überfordert. Dem ganzen habe ich noch einen eigenen 10 Ampere B-Automaten (LS) spendiert. Einen eigenen FI-Fehlerstromschutzschalter spendiere ich hingegen nicht, da der Neutralleiter beim Spartrafo durchgeschliffen ist und der allgemeine FI deshalb ganz normal funktioniert.

1 „Gefällt mir“

Den Spartrafo mindestens um Faktor 2 überdimensionieren für Dauerbetrieb .
Ich glaube sogar, besser noch etwas mehr.

Leistung des Heizstabs viertelt sich (ca.) bei halber Spannung.

Welche Ausgangsleistung hast du momentan bei ~230V Nennspannung?

Der Einschaltstrom des Spartrafos ist sehr hoch.
Ich bin gespannt ob dein Lösung mit den 10A B LSS gut funktioniert

LG

Lichtquant

1 „Gefällt mir“

Danke für die Reaktion. Beim 10A LS bin ich auch nicht sicher. Boiler und Trafo sind noch bei DHL und werden am Wochenende verbaut. Zu den Leistungsgrößen:

Der Boiler hat 1500W, also 6,52A bei 230V, also 35,3 Ohm

Der Spartrafo hat bei 230V Eingang 110V am Ausgang: 110 / 230 = 0,478

Die Boilerleistung hinterm Trafo also P = U² * R= 110² / 35,3Ω ≈ 343W

→Ich gehe davon aus dass ein Anlixun 1000VA Spartrafo (mit 2,3kg) nicht zu warm wird. Das werde ich messen.

Zum Einschaltstrom:

  • Nennstrom: 1000W / 230V ≈ 4,3A

  • Einschaltstrom: typisch10x Nennstrom → kurzzeitig 43A– schon über dem Relais-Limit

Andere Spartrafos mit 1000VA wiegen über 5kg: https://www.voelkner.de/products/70586/VOLTCRAFT-AT-1000-NV-1000W-240-V-AC.html . Daher handelt es sich beim Anlixun “1000W” wohl eher um einen mit 500VA (dauer). Dementsprechend halbiert sich der Einschaltstrom. Daher die Annahme dass ein 25A Relais eine Weile leben sollte. Mal sehen was das Zangenmultimeter als Einschaltstrom ausspuckt.

Hier die verwendeten Teile:

Boiler 15L Druckfest https://www.heizungsdiscount24.de/speichertechnik/haier-es15v-sqm1-elektro-warmwasserspeicher-uebertisch-15l-kleinspeicher-1500w-230v.html

Spartrafo 1000VA: https://www.ebay.de/itm/236234095347?var=536792362448

Relais 230V / 25A https://www.ebay.de/itm/127055398018?var=428189143895

1 „Gefällt mir“

Eine Idee um den Einschaltstrom zu begrenzen wäre noch einen 10 Ohm NTC vor den Spartrafo zu schalten. Z.B. einen SL32 10015 https://www.farnell.com/datasheets/1786654.pdf

Da ist es glaube ich interessant, wie heiß der unter Dauer-Nennstrom wird.

Vielleicht reicht der B LSS ja schon.

Ja stimmt. Die Kennlinie steht leider nicht im Datenblatt, ich extrapoliere mal.

10% des Nennstroms (15A)

100%  → 15,0A → 0,05Ω
 50%  →  7,5A → 0,11Ω
 25%  →  3,75A → 0,22Ω (extrapoliert)
 10%  →  1,5A → ~0,55Ω  (extrapoliert)

Mit R = 0,55Ω und Dissipation Constant = 45.4 mw/°c:

P = 1,5² × 0,55 = 1,24W
ΔT = 1,24 / 0,0454 = 27°C
T_körper ≈ 47°C

Alles im grünen Bereich, evtl trifft die Extrapolation aber gar nicht zu und wir landen doch bei 3 Watt. Wäre auch nicht schlimm, dann wären es 91°C.

Ich verzichte erstmal auf den NTC und messe mal nach. Versuch macht kluch

Falls du Ki Tools bei Wissenssachen benutzt:

Wenn du KI-Tools benutzt, ist es sehr interessant wie die Fragestellung war und welches Tool.

Dann kann man es leichter nachvollziehen oder den Prompt/die Frage für sich abändern.

Ist aber bei Diskussionen um Standpunkte viel wichtiger.

Gruß
LQ

Moin und Danke der Nachfrage. Ich habe Claude benutzt um den Arduino Code oben zu entwickeln. Meine Einwände waren hauptsächlich zur Lesbarkeit (bin in C++eher Anfänger Niveau). Habe ihn dann auch mal aufgespielt um zu sehen ob es compiliert. Tat es. Auch Fragen zum Einschaltstrom wurden von Claude beantwortet (Spartrafo Einschaltstrom = ~10x Nennstrom).

Zurück zum Thema: Eigentlich wollte ich eine Messreihe zeigen wie warm der Spartrafo an einem 2kW Wasserkocher wird. Der Trafo zieht 444W, den Einschaltstrom konnte ich noch nicht messen aber er wirft den 16A B-LS nicht im Ansatz. Daher bin ich guter Dinge dass der 10A LS(B) passt. Nun die weniger erfreulichen Nachrichten: Mit dem Kocher pendelt sich der Trafo bei 98°C nach ca. 110 Minuten ein.Finde ich recht viel, wobei ich den Kern gerade noch 2-3 Sekunden anfassen konnte, vlt ist das Thermometer auch Misst. Komisch gerochen hat nach 2h auch nix, das Foto zeigt die Startsituation. Erdung ist natürlich Murks und wird angepasst

1 „Gefällt mir“

Das würde ja mit der Annahme dann übereinstimmen können. (343W Dauerleistung sollte Mindestens "700W", besser "1000W" Trafo sein für den Dauerbetrieb, glaube ich)

Kann man am " Victron Multiplus II 3000" die AC Spannung einstellen?
Also auf 220V statt 230V oder so?

Nachtrag:
Dann könnte man da nochmal Testen wie warm das ganze wird bei den ? 343W.

Kann man. Aber mein Nachbar hat Verbraucher dran die das nicht möchten. Helfen würde es wenig. gute Idee. Hatte ich auch schon. Die Temperatur ist eigentlich noch OK aber ich denke dennoch über zusätzliche Schutzmaßnahmen nach (Thermoschalter). Habe dabei aber keine Erfahrung, da in meinen Anlagen die noch nie ausgelöst haben. Zu deinem Nachtrag: Ja absolut, Einbauen und testen und messen

Kannst du den Trafo noch zurückgeben/ gegen einen größeren Tauschen?

Da wärst du auf Dauer auf der sicheren Seite.

Ja darüber denke ich nach. Allerdings finde ich auch dass ich bereits genug Kupfer in den Sand gesetzt habe. Ein einfaches abkühlen lassen alle 60 Minuten würde das Problem auch lösen. Der Trafo macht wirklich wenig Abwärme - er wird sie nur nicht los

Noch etwas, was mir bei deinem Trafo auffällt:

Es ist der mit Eurostecker.
(Nur der mit Schukostecker bekommt die Erdung von der Hauptsteckdose mit.)

Alle Geräte wären nicht geerdet, die an den Trafo angeschlossen werden.

Im Fehlerfall könnte Blechgehäuse des Verbrauchers oder ?Duschwasser Stromführend sein.

Korrekt, deshalb habe ich es im Bad hinter meiner einzigen FI-Steckdose getestet. Das wird beim Einbau als Erstes nachgebessert.

1 „Gefällt mir“

Ich hab den dickeren 2000w mit Schukostecker.
Der wird kaum ?Handwarm soweit ich mich erinnere.
(ähnlich deinem Link nur die 2000W Version https://www.ebay.de/itm/236234095347?var=536792362448)

Nachtrag:

Stimmt gar nicht. Ich hab den 3000W...
Hatte den etwas zu groß gekauft..

https://www.ebay.de/itm/316878936200?_skw=220V+auf+110V+Spannungswandler+3000w

Laut dem Händler haben die Transformatoren diesese Gewicht :thinking:

Produktverpackungsspezifikationen (500 VA):
Verpackungsgröße: ca. 23 x 14 x 10 cm
Gewicht: ca. 1,7 kg

Produktverpackungsspezifikationen (1000 VA):
Verpackungsgröße: ca. 22 x 14 x 10 cm
Gewicht: ca. 2,6 kg

Produktverpackungsspezifikationen (2000 VA):
Verpackungsgröße: ca. 25 x 18 x 13 cm
Gewicht: ca. 4,25 kg

Produktverpackungsspezifikationen (3000 VA):
Verpackungsgröße: ca. 26 x 18 x 13 cm
Gewicht: ca. 5 kg

Ich bin gespannt wie es bei dir werden wird.
Gutes Basteln!

Du hast Recht, der geht zurück und wird durch einen 2000VA ersetzt. Klemme den Boiler am WE einfach erstmal ganz ohne Trafo an. Der kommt dann eben 1 Woche später. So einen Stress braucht niemand. Danke für die Hilfe!

EDIT: Ich teste es noch mit dem 1,5kW Boiler bevor ich ihn zurück schicke

1 „Gefällt mir“

Es freut mich, wenn ich helfen konnte.

Mein 30l Boiler wird jeden Tag genutzt und ich find ihn Klasse, da es kaum Leitungsverluste gibt (der gasboiler steht im Keller und macht immer erstmal die Wände wärmer...)

Ich freue mich wenn andere auch mit Solarstrom erwärmten Wasser duschen / baden/... können.

:waving_hand:
LQ

Wenn du magst kannst du oben noch die überschrift aktualisieren. Dann können das andere veilleicht einfacher finden

(Leistungsregelung für Heizstab mittels SplitBurstController am Multiplus 2)

Falls Du ein GX-Gerät hast, könntest Du die Beta 3.80 ausprobieren. Die kann den Überschuss mittels „opurtunity loads“ regeln. Allerdings löst es nicht das Problem des zu großen Heizstabs.

Ich habe einen 3-in-1 Heizstab mit 0,5 1,0 und 2,0kW und kann daher von 0,5 bis 3,5 kW in Stufen von 0,5kW per Relays/Schütz steuern.

Tatsächlich nutze ich meist die 0,5kW, die einfach den Tag über eingeschaltet bleiben für 120l im Einfamilienhaus mit Zirkulationsleitung.

Evtl findest Du ja einen 0,5kW-Heizstab.

1 „Gefällt mir“

Schau dir mal die gebrauchten TE200A Thyristorsteller von Eurotherm an. Die arbeiten so wie Du es beschrieben hast, im Netzaussetzbetrieb. Die bekommt man für weit unter 100 €. Verstehen tun die ein Analogsignal 5V oder 10 V oder 20mA. Ich habe bereits einen und will damit meinen 6kW Drehstromheizstab über ein modbus 5/10V Ausgabemodul steuern.
Die sind zwar schon alt aber die Technik ist abgehangen und wird wohl nochmal so lange halten. Und wenn nicht das kann man sogar noch reparieren.
Anleitungen bekommt man auch noch im Internet.
Bei dem Modbus Steller such mal nach N4DAC2.

1 „Gefällt mir“