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 = IMPUA;
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.PPV0.9+PPV0.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.PZmsg.FAKTOR;
msg.Pmin0=context.Pmin;
Pmin=context.Pmin;
msg.CPmin=context.Pmin;
msg.ZEILE=89;
if (Pmax_neu<PPV) Pmax_neu=Pmax_neu2;
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=-PA0.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;