Mir ist aufgefallen, dass es bisher kaum Nachfragen zur Überschuss-Steuerung des sun2000 Adapters gibt. Deshalb habe ich die AI mal gebeten das Funktionalität (Surplus Power Control) genauer zu beleuchen.
Wichtig! Das Beispiel script habe ich nicht selbts geschrieben und (noch) nicht getestet. Deshalb kann ich für die Funktion kann keine Garantie oder Support übernehmen bzw. anbieten. Es soll vielmehr das Funktionsprinzip einer Überschuss-Steuerung greifbarer machen.
Überschuss-Steuerung: usablePower und Batterie-Integration
Der Adapter berechnet kontinuierlich, wie viel Solarleistung aktuell nicht selbst verbraucht wird. Dieser Wert bildet die Grundlage für Automationen, die Großverbraucher (Waschmaschine, Spülmaschine, Wallbox, Heizstab) bedarfsgerecht zuschalten – mit dem Ziel, Eigenverbrauch zu maximieren und Netzbezug zu minimieren.
Zwei Kerndatenpunkte
Datenpunkt
Bedeutung
collected.surplus.power
Die aktuell ins Netz eingespeiste Wirkleistung (reine Einspeisung)
collected.surplus.usablePower
Die tatsächlich nutzbare Überschussleistung: Netzeinspeisung + optionaler Batterie-Beitrag
Für Automationen sollte grundsätzlich usablePower verwendet werden, da dieser Wert die Batterie als zusätzliche Quelle einbezieht und damit ein realistischeres Bild der verfügbaren Leistung liefert.
Batterie-Integration: Funktionsprinzip
Ohne Konfiguration entspricht usablePower dem reinen Netzüberschuss. Sobald die Batterie ausreichend geladen ist, kann sie zusätzliche Leistung beisteuern – zum Beispiel an sonnigen Nachmittagen, wenn der SOC hoch ist und abends sowieso PV-Nachladung erwartet wird. Die Steuerlogik stellt dabei sicher, dass die Batterie nicht so weit entladen wird, dass die Nacht-Reserve gefährdet ist.
Parameter unter control.usableSurplus
Parameter
Funktion
minSoc
SOC-Untergrenze in %. Unterhalb dieses Werts hat Batterieladung absolute Priorität – usablePower basiert dann ausschließlich auf dem Netzüberschuss. Oberhalb von minSoc wird auch die aktuelle Ladeleistung der Batterie als Überschuss gewertet.
bufferSoc
SOC-Schwelle, ab der die Batterie aktiv Leistung zum Überschuss beisteuern darf (zusätzlich zur Einspeisung).
bufferPower
Maximale Batterie-Entladeleistung in Watt, die zum usablePower-Wert addiert wird, sobald bufferSoc erreicht ist.
bufferHysteresis
Hysterese-Band um die bufferSoc-Schwelle, um Flattern (schnelles Ein-/Ausschalten) zu vermeiden. Größere Werte = stabileres Verhalten, kleinere Werte = präzisere Regelung.
residualPower
Offset zur Feinabstimmung des Arbeitspunkts zwischen minSoc und bufferSoc. Positive Werte verschieben den Arbeitspunkt Richtung Batterieladen bzw. Netzbezug, negative Werte Richtung Einspeisung.
allowNegativeValue
Standardmäßig wird usablePower bei Werten unter 0,1 kW auf 0 geklemmt. Mit true werden auch negative Werte durchgereicht – sinnvoll für Steuerlogiken, die z.B. aktiv drosseln müssen.
residualPower – Feinabstimmung des Arbeitspunkts
Dieser Parameter wirkt im SOC-Bereich zwischen minSoc und bufferSoc und verschiebt den Punkt, ab dem Leistung als „nutzbar" gilt. Ein Beispiel:
Die Anlage speist gerade 500 W ins Netz ein
residualPower = +200 → Der Adapter zieht 200 W ab → usablePower = 300 W
residualPower = -200 → Der Adapter addiert 200 W → usablePower = 700 W
Mit einem positiven Wert wird die Batterie bevorzugt weiter geladen bzw. ein kleiner Netz-Puffer gehalten, bevor Überschuss gemeldet wird. Ein negativer Wert meldet früher Überschuss, nimmt also in Kauf, dass minimal Strom aus dem Netz gezogen wird. Sinnvoll z.B. wenn ein Verbraucher eine Mindestleistung benötigt, die knapp über dem aktuellen Solarüberschuss liegt.
Empfohlene Konfigurationsstrategie
minSoc definiert die harte Untergrenze für die Nacht-Reserve und sollte konservativ gewählt werden.
bufferSoc und bufferPower aktivieren die Batterie als Surplus-Quelle und sind vor allem für den Nachmittag relevant, wenn hoher SOC und noch ausreichend PV-Ertrag zusammenkommen.
Automationen reagieren dann auf usablePower und können Verbraucher mit der verfügbaren Leistung abgleichen.
Praxisbeispiel: Warmwasser-Heizstab per Shelly steuern
Der folgende ioBroker-JavaScript liest usablePower, prüft die Wassertemperatur über den DS18B20-Sensor des Shelly und schaltet den Heizstab entsprechend.
Voraussetzungen
Shelly mit DS18B20-Temperatursensor am Warmwasserspeicher
ioBroker mit Shelly-Adapter und JavaScript-Adapter
sun2000-Adapter mit konfiguriertem usablePower-Datenpunkt
Skript
// ===== Konfiguration =====
const SURPLUS_STATE = 'sun2000.0.collected.surplus.usablePower'; // Verfügbare Überschussleistung in W
const SHELLY_TEMP_STATE = 'shelly.0.SHSW-1#<ID>#1.ext_temperature.TC'; // DS18B20 Temperatur in °C
const SHELLY_RELAY = 'shelly.0.SHSW-1#<ID>#1.relay.0'; // Shelly Relais
const MIN_SURPLUS_W = 1500; // Mindest-Überschuss in W, um Heizstab zu aktivieren
const TARGET_TEMP_C = 60; // Zieltemperatur Warmwasserspeicher in °C
const HYSTERESIS_C = 3; // Hysterese: Heizstab geht erst bei (TARGET - HYSTERESIS) wieder an
const CHECK_INTERVAL_MS = 60000; // Prüfintervall in ms (hier: 1 Minute)
// ===== Zustandsvariable =====
let heaterOn = false;
// ===== Steuerlogik =====
function controlHeater() {
const surplus = getState(SURPLUS_STATE).val; // Aktueller Überschuss in W
const temp = getState(SHELLY_TEMP_STATE).val; // Aktuelle Wassertemperatur in °C
system.log(`Überschuss: ${surplus} W | Wassertemperatur: ${temp} °C | Heizstab: ${heaterOn ? 'EIN' : 'AUS'}`);
if (heaterOn) {
// Heizstab läuft → ausschalten wenn Zieltemperatur erreicht oder Surplus weggefallen
if (temp >= TARGET_TEMP_C || surplus < MIN_SURPLUS_W) {
sytem.log(`Heizstab AUS → Temp: ${temp}°C / Überschuss: ${surplus}W`);
setState(SHELLY_RELAY, false);
heaterOn = false;
}
} else {
// Heizstab aus → einschalten wenn genug Surplus UND Temp noch unter Ziel (minus Hysterese)
if (surplus >= MIN_SURPLUS_W && temp < TARGET_TEMP_C - HYSTERESIS_C) {
sytem.log(`Heizstab EIN → Temp: ${temp}°C / Überschuss: ${surplus}W`);
setState(SHELLY_RELAY, true);
heaterOn = true;
}
}
}
// ===== Start =====
controlHeater(); // Einmal sofort ausführen
setInterval(controlHeater, CHECK_INTERVAL_MS); // Dann zyklisch alle 60s
Schaltlogik im Überblick
Bedingung
Aktion
Surplus ≥ 1500 W und Temp < 57 °C (60 − 3 Hysterese)
Heizstab EIN
Temp ≥ 60 °C oder Surplus < 1500 W
Heizstab AUS
Wichtige Hinweise zur Konfiguration
MIN_SURPLUS_W sollte der Leistungsaufnahme des Heizstabs entsprechen (typisch 1–3 kW). Etwas darunter ansetzen ist okay, da usablePower bereits einen Batterie-Puffer einrechnet.
Die Hysterese verhindert, dass der Heizstab bei schwankender PV-Leistung ständig ein- und ausschaltet.
Die Shelly-State-Pfade (<ID> ersetzen) findet man in der ioBroker-Objektliste unter dem Shelly-Adapter.
Alternativ zu setInterval kann das Skript auch auf Änderungen von usablePower per on() reagieren – dann ist die Reaktion schneller, aber häufiger.