Multiplus 2 (nur mit Speicher) an L2

Hi all,

ich habe eine SMA Solaranlage mit 2 (bald 3 Solarwechselrichtern non hybrid dreiphasig und einem AC gekoppelten Hochvoltspeicher SBS5.0 an L1 alles über Homemanager2 gesteuert.

Jetzt habe ich als Speichererweiterung eine Felicity15 kWh Speicher gekauft, eine Cerbo GX und einen Multiplus 2 (der noch nicht geliefert ist.).
Der Cerbo erkennt die Wechselrichter und den Hochvoltspeicher alle als Wechselrichter (den Speicher eben auch) über Modbus und den Homemanager als Energymeter (Danke Waldmensch), fast perfekt. Er erkennt auch über CAN den Speicher (der dort mit 33% steht und auf den Multiplus wartet).

Jetzt habe ich irgendwo gelesen der Multiplus muss immer an L1 damit de Cerbo nicht spinnt. Ist das Fakt?

Ich hoffe dass ich dann den SBS an L2 schieben kann, aber würde mir den Umschluss eigentlich gerne sparen (never change a working system). Außerdem zieht die WP am meisten Last auf L2 da hätte ich gerne den dicken Speicher dran.

Any thoughts?

Ach und dann melde ich mich die Tage nochmal wenn alles verdrahtet bezüglich der optimalen Steuerung der beiden Speicher, dass die nicht ineinander Storm hin und her schaukeln. Gibt es da irgendwelche Node Red Flows als Anregung (ich habe noch nie in Node Red gearbeitet…)

Thanx for any Hints
Hannes

hallo,
das system muss nur seine netzmessung auf L1 bekommen, welche phase das ist, spielt keine rolle. das kann man erreichen, indem man beim smartmeter fuer das victron-system die phasen rotiert oder wenn du dien netzmessung ueber ein script einbindest, dort mit den einstellungen die phasen rotiert!

eine andere alternative waere es, das system ueber den netzsollwert zu steuern und die messung des multis als netzmessung zu benutzen. natuerlich muessen zur steuerung auch die daten des smartmeters zur verfuegung stehen. ich ziehe fuer sowas node-red vor und das mit einer failsafe-programmieren, dass bei ausfall der externen datenquelle auch die einspeisung auf einen festen wert eingestellt wird.

tschuess

Hi Dieter,

sorry bin hier in der Victron Welt und leider auch bei Node Red ein echter Rookie…

Ich möchte eine Steuerung mit folgenden Größen

Main: Netzbezug/Einspeiung (über die Phasen summiert)

SBS: Einspeisung/Ladung des Sunny Boys, nicht/nur indirekt von mir kontrolliert, enscheidet der Homemanager, der wiederum Main misst und interpretiert, wenn ich also die andere Batterie zu stark lade wird hier ggf. indirekt entladen getriggert)

SBS% Ladestand des SBS - in VenusOS noch nicht verfügbar da SBS wie Solarwechselrichter betrachtet wird - sollte irgendwie per Modbus oder so reingebracht werden können… (zum Beispiel meine OpenWB- andere Baustelle - kann den auslesen).

Victron Einspeisung/Ladung des Felicity 15kWh Speichers via den Multiplus II, die zentrale zu steuernde Vairable

Victron% der Ladestand des Batterie(en) am MP2

Dann eine Logik, die guckt dass der Netzbezug nahe null bleibt aber dabei noch schaut, dass sie wenn der SBS den Job gerade erledigt indem er mit sagen wir 3kW läd, dann den Viktron mit 2 kW laden lässt so dass der Homemanager kurz darauf den SBS auf 1kW regelt.

Will beide Systeme halbwegs gleichverteilt befüllen.

Und ne Logik das nie der eine in den anderen läd…
Mein Gedanke wäre den Viktron immer mit leichter Verzögerung reagieren zu lassen und auf gemittelte Werte zu schauen, auch wenn ich dann hier und da ein paar Wattsekunden Effizienz liegen lasse. Hauptsache es schaukelt sich kein Mist auf. Wenn sehr viel Regelbedarf, z.B. wenn so ein blöder Backofen im 10 sek Takt zwischen 4kW und 0 hin und her springt. Und dann zwei Regelkreise darauf reagieren sollen…

Wenn ich Dich richtig verstanden habe, ist so was, wenn ich es in Node Red mache auch mit jeder Phasenbelegung möglich, ich muss nur lernen wie (nehme gerne jede Hilfe an…)

Andere Größen wie den Output der Solarmodule und die Wallbox brauche ich erst mal IMHO nicht, aber das wird natürlich alles potentiell noch komplexer wenn Wetterprognosen mit reinlaufen sollen um erst zu Laden, wenn keine Vergütung gezahlt wird (wird für mich bei Solarerweiterung irgendwann kommen) etc pp.
Aber dann bin ich ja schon etwas Node Red erfahren LOL
Gruß Hannes

hallo,
wenn der cerbo die daten des hochvolspeichers zur verfuegung hat, also feststellen kann, ob der geladen oder entladen wird und im besten fall auch, wie hoch der soc ist, kann das victron-system das ganze so steuern, dass sich die ladeleistung abhaengig vom soc verteilt. das geht aber auch nur dann, wenn das system passend dazu verkabelt ist.

eine direkte kommunikation zwischen den geraeten ist einem umweg ueber ein 3. system auf jeden fall vorzuziehen, da man dann die verbindung ueberwachen kann und im falle eines verbindungsausfalls entsprechende reagieren kann.

wenn das ganz vom victron-system gesteuert wird, reicht im prinzip auch ein smartmeter, das alle systeme benutzen.

allerdings duerfte so eine konfig fuer dich wohl doch zu kompliziert sein, dann das ganze muss man auch dem cerbo mit node-red realisieren und die dazu noetigen programm in javascript erstellen.

du kannst zwar die sollwerte ueber ein 3. system bereitstellen, die steuerung auf dem cerbo sollte aber bei ausfall des servers, der die sollwerte liefert, automatisch das system in einen stabilen und sicheren zustand bringen.

ich haeng dir mal das programm an, das ich aktuell auf einem system zur steuerung der ueberschusseinspeisung und der wallbox benutze.

tschuess

var DATE = new Date();
var STOP = DATE.getTime();
if (context.START==0) context.START=STOP;
var DT=(STOP-context.START)/1000;
var ESS_MODE,ESS_TEST,ZAPPI1;
if ((ESS_MODE=global.get(“ESS_MODE”))==null) ESS_MODE=2;
if ((ZAPPI1=global.get(“ZAPPI1”))==null) ZAPPI1=0;
var PL=context.PL;
var PD=context.PD;
if ((ESS_TEST=global.get(“ESS_TEST”))==null) ESS_TEST=true;
else ESS_TEST=ESS_TEST!=0;
var SOC,SOC_MIN,SOC_MAX,SOC_LIMIT,SHELLY,NETZ,MP2,MPPT_LIMIT;
if ((NETZ = global.get(“NETZ”))==null) {
node.warn(“Daten Netz fehlen”);
return;
}
if ((MP2 = global.get(“MP2”))==null) {
node.warn(“Daten MP fehlen”);
return;
}
if ((SOC = global.get(“SOC”))==null) SOC=50;
if ((MPPT_LIMIT = global.get(“MPPT_LIMIT”))==null) MPPT_LIMIT=50;
if ((SHELLY = global.get(“SHELLY”))==null) SHELLY=50;
if ((SOC_MIN = global.get(“SOC_MIN”)1)==null) SOC_MIN=50;
if ((SOC_MAX = global.get(“SOC_MAX”)1)==null) SOC_MAX=90;
if ((SOC_LIMIT = global.get(“SOC_LIMIT”)1)==null) SOC_LIMIT=50;
var UA,IMP,PA,SWITCH,AKKU,A;
var IA, NETZ_SOLL;
SWITCH=MP2.mp2_switch;
if ((AKKU = global.get(“AKKU”))==null) {
node.warn(“Daten AKKU fehlen”);
return;
}
if (AKKU.LYNX.OFF==true || AKKU.LYNX.I<-10000) {
A=AKKU.BMS;
A.GERAET=“BMS”;
}
else {
A=AKKU.LYNX;
A.GERAET=“LYNX”;
}
IA=A.I;
UA=A.U;
PA=A.P;
IMP = MP2.mp2_5000_I;
var PMP = IMP
UA;
msg.IMP=IMP;
msg.UA=UA;
if ((NETZ_SOLL=global.get(“NETZ_SOLL”)1)==null) NETZ_SOLL=-100;
msg.NETZ_SOLL=NETZ_SOLL;
var Pdc,Pmax,Pmax_neu,PPV,Pmin,ESS_CHARGE,SOC_0,MAX_K,P,Pac;
if ((Pmin=global.get(“NETZ_MIN”))==null) Pmin=150;
if ((MAX_K=global.get(“MAX_K”))==null) MAX_K=500;
Pmin=NETZ_SOLL;
Pmax=MP2.MP2_MAX_P;
Pdc=MP2.MP2_P_DC;
P=NETZ.L1+NETZ.L2+NETZ.L3;
Pac=P-PMP;
msg.PMP=PMP;
if ((PPV=global.get(“pv_power”))==null) PPV=0;
if ((SOC_0=global.get(“SOC_0”))==null) SOC_0=90;
if ((ESS_CHARGE=global.get(“ESS_CHARGE”))==null) ESS_CHARGE=0;
Pmax_neu=Pmax;
msg.PPV=PPV;
msg.Pac=Pac;
if (context.Pmin1==0) context.Pmin1=context.Pmin;
if (context.PPV==0) context.PPV=PPV;
else context.PPV=context.PPV
0.9+PPV
0.1;
msg.PPVC=context.PPV;
var SOCmin=SOC_MIN-5;
var P1=PPV-150;
msg.STATUS=“on”;
if (SWITCH==1 || SWITCH==4) {
msg.ESS_STATE=global.get(“ESS_OFF_STATE”)1;
msg.STATUS=“off”;
} else {
if (SOC>SOC_MIN) {
//node.warn("SOC: “+SOC+” SOCmin: “+SOCmin+” SOCmax: “+SOC_MAX+” P: “+P+” PA: “+PA+” Pmin: “+Pmin+” Pmax: “+Pmax+” Zappi1: "+ZAPPI1);
msg.ZAPPI=ZAPPI1;
Pmax_neu=6000;
if (SOC>=SOC_MAX || (ZAPPI1>1000 && SOC>30)) {
msg.FAKTOR=(1-(100-SOC)/(100-SOC_MAX));
msg.PZ=-(context.PPV-Pac);
if (msg.PZ>0) context.Pmin=NETZ_SOLL;
else context.Pmin=NETZ_SOLL+msg.PZ
msg.FAKTOR;
msg.Pmin0=context.Pmin;
Pmin=context.Pmin;
msg.CPmin=context.Pmin;
msg.ZEILE=89;
if (Pmax_neu<PPV) Pmax_neu=Pmax_neu
2;
if (Pmax_neu<PPV) Pmax_neu=Pmax_neu2;
if ( ZAPPI1>1000) {
if (SOC>80) {
if (ZAPPI1>9000 && (SOC<98 || PA<-500)) Pmin=-150;
else if (PA>-1000) Pmin=-600;
else Pmin=-150;
}
else if (PA<-500) Pmin=-100;
else if (PA>500) Pmin=-PA
0.8+200;
else Pmin=-150;
msg.ZEILE=101;
}
msg.PD=PD;
msg.REG=84
} else if (SOC>=SOC_0) {
if (P>100) context.Pmin-=10;
if (P<100) context.Pmin+=10;
// context.Pmin=NETZ_SOLL;
Pmin=context.Pmin;
msg.REG=80
}
} else {
if (ESS_CHARGE==0) {
Pmax_neu=50;
} else {
Pmax_neu=0;
}
}
}
if ((MPPT_LIMIT>0 && (UA>=54.5 || MPPT_LIMIT>2)) && context.Plimit<30000 && PA>=0) context.Plimit+=50;
else if (context.Plimit>50 && (UA<54.4 || PA<-100)) context.Plimit-=50;
if (Pmax_neu<0) Pmax_neu=0;
msg.Pmax_neu=Pmax_neu;
msg.P=P;
msg.Plimit=context.Plimit;
msg.A=A;
msg.IMP=IMP;
msg.Pmax=Pmax;
msg.Pdc=Pdc;
msg.ESS_TEST=ESS_TEST;
msg.Pmin=Pmin-context.Plimit;
if (msg.Pmin<-30000) msg.Pmin=NETZ_SOLL;
msg.Pmin1=Pmin;
msg.ESS = {
“SOCmin”: SOCmin*1,
“SOC”: SOC,
“SOC_MAX”: SOC_MAX,
“SOC_MIN”: SOC_MIN,
“STATE”: 10,
“SOC_0”: SOC_0,
“ESS_MODE”: ESS_MODE }
context.PD=PD;
global.set(“REGELUNG”,msg);
return msg;

Hi Dieter,

habe versucht alles von den definitonen oben (also var… bis zum ende zu kopieren und ineiner datei abzulegen und diese in Node Red zu importieren.
Da wir gemeckert wäre kein JSON-Array.

Was mache ich falsch?

Bin wie gesagt neu in Node Red uns Javascript, aber willig das zu lernen und mit Hilfe von (hoffentlich) Tips von Dir und Codebruchstücken mit Hilfe von Copilot erstellt hoffe ich das auch hinzubekommen!

Aber ich scheitere an meiner ersten Funktion, wo ist der Fehler? Will nur die drei Wechselrichter Outputs addieren, kommt aber nicht im Debug Node an. Siehe Screenshots.
Wäre toll wenn Du sofort meinen hoffentlich kleinen Fehler sehen könntest in den Screen Shots.

Danach würde ich erst mal weiter kämpfen Schritt für Schritt.

Wobei die nächste Frage die ich noch unbeantwortet habe schon klar ist: wie bekomme ich den SOC den SBS5.0 in Node Red, ist irgendein Modbus Register, das kann ich sicher rausfinden aber wie ich das importiere…. Mal sehen, ob ich das im Netz finde LOL

Also nochmal Danke, und ich hoffe Du findest Zeit auf meinen krüppeligen Code zu schauen.

LG
Hannes



hallo,
daten, die in einer datei gespeichert werden, haben keinen typ und json wird dann als text gespeichert.

es gibt aber ein node. das text wieder in json umwandelt und json in text!

tschuess

hallo,
so funktioniert das nicht. du musst die daten zuerst einmal zwischenspeichern und das geht nur im context! um welche daten es sich handelt, kannst du feststellen, indem du das topic abfragst.

die daten kommen naemlich immer in msg.payload! und das debug-node zeigt standardmaessig auch nur die payload an! was du hier ausrechnest ist also immer 0!

allerdings wuerde ich dir empfehlen, ein sum-node ueber palette verwalten zu installieren und das zu benutzen!

tschuess

Super, Danke, das mit der Summieren Funktion aus der Palette funktioniert super, hab auch noch ne Smooth Funktion gefunden und nen MODBUS Packet, aber da komme ich nicht weiter…

Mal sehen ob ich damit den SOC doch irgendwie ausgelesen bekomme.
Ich hab ihn in HomeAssistant aber das als Zwischenschicht macht alles nur anfällig, den muss ich doch direkt lesen können…

LG
Hannes

hallo,
hast du kein bms am gx? du kannst auch einen smartshunt anschliessen, wenn du das bms nicht anschliessen kannst oder willst.

und mit node-red kannst du den soc von fast ueberall abfragen.

tschuess