Viktron Anlage mit SMA Komponenten

Hi all,

ich habe eine SMA Anlage erweitert mit nem Multiplus 2 am CerboGX.
Als Speicher eine Felicity 15kWh Komplettsystem, per CAN am Cerbo.
Der sieht auch die SMA Geräte (STP9000TL20, STP8000 TL20, STP500TL20 und den SBS5.0 wo ne BYD mit 7.7kWh dran ist) alle als Wechselrichter, und den Homemanager2 als Energy Meter - Dank Skript von Waldläufer!!! (GitHub - Waldmensch1/venus.dbus-sma-smartmeter: A service for Venus OS, reading smart meter data from a SMA system (SMA-EM Speedwire Broadcast) and making the values available on dbus.)

Was ich jetzt in Node Red noch bräuchte ist der SOC des SBS. Den kann z.B. meine OpenWB per Modbus auslesen.

Viktron erkennt ja Out of the Box keine Fremdbatterien und betrachtet meinen Hochvolt-Batterie-Wechselrichter wie nen Solarwechselrichter was zu Hin-und Herladen führen kann. Darum muss ich wohl ne eigenen Routine in Node Red schreiben. (Wer da schon was hat, gerne teilen :slight_smile: .)

Weiss jemand (und ist so nett es mr zu verraten) wie ich den SOC des SBS auslesen kann, ist irgendein MODBUS Register…?

Ich will imer 2/3 in den Victron Speicher packen und 1/3 in des SBS basierten, es sei denn der ist voll, daher wäre der SOC echt hilfreich…

Thanx for any hints

Hannes

So, habs geschafft, Dank Hilfe von MS Copilot (systematische Suche, erst in Python dann in Node Red, Analyse der SMA Tech Doc PDFs zu Variablentyp etc.
Hätte ich alleine nicht geschafft, bemerkenswert was heute möglich ist!
Hier ist die Lösung:
Man muss das ReadHoldingRegister 30485 und das Folgeregister per Std. Modbus Read (in der Palette zu installieren) auslesen und dann per Funktion kombinieren weil wohl ungewöhnlicher Variablentyp (für nenn Integer 0 bis 100 LOL)




Das ganze hab ich dann mit nem Topic versehen in einen Join Node geschickt um diese und andere Variablen für Berechnungen in JS zur Verfügung zu haben.

Anbei noch meine Steuerungslogic des Multiplus/Felicity Bateriespeichers über eine Funktion die versucht diesen und den SMA Speicher immer auf gleichem SOC zu halten. Eben die Funktion die POWSoll für den Victron Ast berechnet. SMA also der HM2 sieht dann was zur Nulleinspeisung noch fehlt und reagiert “selbstständig” mit seiner Logic zur Steuerung des SBS5.

let PowAbs = Number(msg.payload.PowAbs);
let PowSbs = Number(msg.payload.PowSbs);
let SocVic = Number(msg.payload.SocVic);
let RSocVic = Number(msg.payload.RSocVic);
let PowSolar = Number(msg.payload.PowSolar);
let SocSbs = Number(msg.payload.SocSbs);

let CapaVic = 12.75;
let CapaSbs = 7.25;

let PowSoll = 0;
let ForSBS = 0;

if (PowAbs > 0) {
// Laden: freie Kapazität
let freeVic = CapaVic * (100 - RSocVic);
let freeSbs = CapaSbs * (100 - SocSbs);
let totalFree = freeVic + freeSbs;

if (totalFree > 0) {
    PowSoll = PowAbs * (freeVic / totalFree);
    ForSBS = PowAbs * (freeSbs / totalFree);
}

} else {
// Entladen: genutzte Kapazität
let usedVic = CapaVic * RSocVic;
let usedSbs = CapaSbs * SocSbs;
let totalUsed = usedVic + usedSbs;

if (totalUsed > 0) {
    PowSoll = PowAbs * (usedVic / totalUsed);
    ForSBS = PowAbs * (usedSbs / totalUsed);
}

}

// Begrenzung auf -5000 bis 3500
PowSoll = Math.max(Math.min(PowSoll, 3500), -5000);

// Zusätzliche Begrenzung bei niedrigem RSocVic (Entladung)
if (PowSoll < 0) {
if (RSocVic < 10) {
PowSoll = 0;
} else if (RSocVic < 15) {
let factor = (RSocVic - 10) / 5; // 0 bei 10, 1 bei 15
let minLimit = -5000 * factor;
PowSoll = Math.max(PowSoll, minLimit);
}
}

// Zusätzliche Begrenzung bei hohem RSocVic (Ladung)
if (PowSoll > 0) {
if (RSocVic > 95) {
PowSoll = 0;
} else if (RSocVic > 90) {
let factor = (95 - RSocVic) / 5; // 1 bei 90, 0 bei 95
let maxLimit = 3500 * factor;
PowSoll = Math.min(PowSoll, maxLimit);
}
}

// Auf glatte Zehner runden
PowSoll = Math.round(PowSoll / 10) * 10;

// Ausgabe
msg.payload = PowSoll;
return msg;