Viktron Anlage mit SMA Komponenten

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;