hallo,
zuerst einmal speichere ich mir alle noetigen werte mit global.set(“name”,wert).
bei den meisten werten genuegt es, wenn du den wert benennst und ihn an eine funktion mit diesem programm schickst:
global.set(msg.topic,msg.payload);
dann benutze ich eine funktion, die sich die wert mit global.get(“name”) holt und auswertet. weil die andere variante war mir viel zu aufwendig. die funktion wird dann von einem timer getriggert.
wenn du einen default-wert vorgeben willst, wenn der wert noch nicht existiert, geht das so:
var P24;
if ((P24 = global.get(“24V_AKKU”)) == null) P24 = { “P” : 0 };
natuerlich kannst du das auch anders schreiben:
var P24 = global.get(“24V_AKKU”);
if (P24 == null) P24 = { “P” : 0 };
dadurch kann ich dann im programm alle werte, die ich als kriterien brauche, einfach auswerten.
am ende kann dann sowas dabei rauskommen, um z.B. die maximale ladespannung zu setzen:
var M=msg.payload[0].M;
var M1=msg.payload[0].M1;
var SM=msg.payload[0].socmax;
var SOC=global.get(“SOC”);
var USOLL=global.get(“USOLL”);
var UMAX=global.get(“MAX”);
if (USOLL==null) USOLL=51;
if (UMAX==null) UMAX=52.5;
var PYLON_SOC = global.get(“PYLON_SOC”);
if (M1>120 && M1>M/5 && SM==100 ) {
if (PYLON_SOC==null || PYLON_SOC>90) msg.payload=USOLL1;
else msg.payload=USOLL1+1;
}
else msg.payload=UMAX*1;
global.set(“DVCC_U”,msg.payload);
return msg;
dein problem ist nicht, ob die pv bevorzugt wird, sondern herauszufinden, ob du genug pv-leistung hast, damit der heizstab nur von der pv versorgt wird! da es leider nicht moeglich ist, festzustellen, wieviel pv-ueberschuss vorhanden ist, wenn die pv abgeregelt hat, kann man eben nur feststellen, dass ein pv-ueberschuss vorhanden ist und den eventuell abschaetzen, wobei ich das bisher noch nicht ausprobiert habe. bei den vielen daten, die ich inzwischen habe, sollte ich aber eine recht genaue schaetzung zustande bringen.
allerdings ist das nicht zwingend noetig. um meinen e-heizkessel zu steuern frage ich einfach den soc, die pv-leistung, die akkuleistung, die mittlere pv-spannung und zum schluss auch noch den mppt-status ab. wenn der mppt naemlich nicht den status mppt hat, kann er nicht mehr die ganze pv-leistung verarbeiten, entweder weil er mehr bekommt, als er uebertragen kann oder weil er die leistung nicht abgeben kann, also den maximalen ladestrom oder die maximale ladespannung erreicht hat.
ansonsten darf dann auch leistung aus dem akku gezogen werden, bis ein bestimmter soc unterschritten ist. allerdings muss ich hier noch unterschiedliche socs zum ein- und ausschalten festlegen. aktuell benutze ich naemlich nur einen soc. oder ich muss frueher abschalten. es gibt eben noch ein paar dinge zu optimieren.
dass die heizung dann auch leistung aus dem akku ziehen darf, ist eben der tatsache geschuldet, dass nur alle 30 sekunden ein- oder aus-geschaltet werden darf und dass ich nicht will, dass jedesmal, wenn ein woelkchen vorbeizieht, das teil ein- und ausgeschaltet wird. immerhin sind das 3 x je 3 kW, die dann geschaltet werden. nur bei ueberlast erfolgt eine sofortige abschaltung ohne zeitverzoegerung weil ansonsten der wechselrichter abschalten wuerde.
wie du siehst, muss man abhaengig vom system, der akkukapazitaet, der maximalen pv-leistung und er schaltfrequenz einiges beruecksichtigen, damit sowas optimal funktioniert und man moeglichst keine energie verliert, aber auch nicht zuviel aus dem akku zieht.
falls es dich interessiert, ich haenge das hauptprogramm mal hinten an.
tschuess
var DATE = new Date();
var STOP = DATE.getTime();
var T = (STOP-context.START)/1000;
var TEIN = (STOP - context.START_EIN)/1000;
var TAUS = (STOP - context.START_AUS)/1000;
var CHECK = (STOP - context.CHECK) / 1000;
var RUECKLAUF = global.get(“RUEKLAUF”);
var VORLAUF = global.get(“VORLAUF”);
var DT = VORLAUF-RUECKLAUF;
var HEIZ_TEMP = global.get(“HEIZ_TEMP”)*1;
var PV_LIMIT = global.get(“PV_LIMIT”)*1;
var HEIZ_VERZ_TEMP = global.get(“HEIZ_VERZ_TEMP”) * 1;
if (VORLAUF == null || RUECKLAUF == null || HEIZ_TEMP==null) return;
var W48=global.get(“W48”);
var W24 = global.get(“W24_INV”);
var ST = false;
var L1 = W48[“MP2 1”].p_out;
var L2 = W48[“MP2 2”].p_out;
var L3 = W48[“MP2 3”].p_out;
var AN=global.get(“HEIZ_AN”)==1;
//if (AN == null) AN = global.get(“HEIZ_AN”)==1;
if (AN == null) AN=false;
var A48 = global.get(“48V_AKKU”);
var PV48 = global.get(“48V_PV”);
var UPV=PV48.PV;
var U=A48.U;
var SOC_48 = global.get(“SOC_48”);
var PA = A48.P;
var PV = PV48.P;
var SOC;
if (SOC_48>0) SOC=SOC_48;
else SOC=A48.SOC;
var HPA = global.get(“HEIZ_PA”);
var HT = global.get(“HEIZ_DT”);
var HU = global.get(“HEIZ_U”);
var HUPV = global.get(“HEIZ_UPV”);
var HREF = global.get(“HEIZ_REF”);
var HPV = global.get(“HEIZ_PV”);
var HSOC = global.get(“HEIZ_SOC”);
var HV = global.get(“HEIZ_VERZ”);
var HAUS = global.get(“HEIZ_AUS”);
var RELAIS = context.RELAIS;
var PHASE = 0;
var P=100000;
var EIN = (RELAIS.L1?1:0) + (RELAIS.L2?1:0) + (RELAIS.L3?1:0);
if (SOC<HSOC || W24.Pmax>4500 || W48.PMAX>4500 || !AN) {
msg.ZEILE=39;
RELAIS.L1 = false;
RELAIS.L2 = false;
RELAIS.L3 = false;
} else {
msg.ZEILE = 44;
msg.PA=PA;
msg.HAUS=HAUS;
msg.HUPV = HUPV;
msg.UPV = UPV;
msg.HPA=HPA;
msg.HEIZ_TEMP = HEIZ_TEMP;
if (((PA > HPA && PV > HPV) || (UPV > HUPV && PA > -1000) || PV_LIMIT > 20) && VORLAUF <= HEIZ_TEMP + 1 && RUECKLAUF + EIN * 5 < HEIZ_TEMP) {
msg.ZEILE = 46;
if (TEIN>HT) {
if (!RELAIS.L1) {
P=L1;
PHASE=1;
}
if (!RELAIS.L2 && L2<P) {
P=L2;
PHASE=2;
}
if (!RELAIS.L3 && L3<P) {
P = L3;
PHASE = 3;
}
if (PHASE > 0 && VORLAUF < HEIZ_TEMP-1 && P<1000) {
switch (PHASE) {
case 1: RELAIS.L1 = true;
ST=true;
// RELAIS.EIN=true;
break;
case 2: RELAIS.L2 = true;
ST = true;
// RELAIS.EIN = true;
break;
case 3: RELAIS.L3 = true;
ST = true;
// RELAIS.EIN = true;
break;
}
}
context.START=STOP;
context.START_EIN = STOP;
}
} else if (((PA < HAUS || (U < HU && PA < 500)) && TAUS > HV && PV < HPV) || (VORLAUF > HEIZ_TEMP + 5 && TAUS > HEIZ_VERZ_TEMP)) {
msg.ZEILE = 80;
PHASE=0;
P=0;
if (RELAIS.L1) {
P = L1;
PHASE = 1;
}
if (RELAIS.L2 && L2 > P) {
P = L2;
PHASE = 2;
}
if (RELAIS.L3 && L3 > P) {
P = L3;
PHASE = 3;
}
if (PHASE > 0) {
switch (PHASE) {
case 1: RELAIS.L1 = false;
ST = true;
break;
case 2: RELAIS.L2 = false;
ST = true;
break;
case 3: RELAIS.L3 = false;
ST = true;
break;
}
}
context.START = STOP;
context.START_AUS = STOP;
context.START_EIN = STOP;
} else if (PA < 0) context.START_EIN = STOP;
}
if (global.get(“HEIZUNG”)) context.CHECK=STOP;
else if (CHECK>60) {
msg.ZEILE = 115;
if (RELAIS.L1 || RELAIS.L2 || RELAIS.L3) ST = true;
RELAIS.L1 = false;
RELAIS.L2 = false;
RELAIS.L3 = false;
context.CHECK = STOP;
}
RELAIS.EIN=RELAIS.L1 || RELAIS.L2 || RELAIS.L3;
var NETZ = { “L1”:L1, “L2”:L2, “L3”:L3};
msg.RELAIS=RELAIS;
msg.T=T;
msg.CHECK=CHECK;
msg.NETZ=NETZ;
msg.PHASE=PHASE;
msg.HREF=HREF;
msg.TEIN=TEIN;
msg.TAUS=TAUS;
msg.STOP=STOP;
msg.START_EIN=context.START_EIN;
msg.START_AUS = context.START_AUS;
msg.ST=ST;
msg.AN=AN;
msg.VORLAUF=VORLAUF;
msg.DEBUG=false;
if (msg.DEBUG && ST) {
node.warn("SOC: “+SOC+” PA: “+PA+” PV: “+PV+” HPV: "+HPV);
node.warn(msg);
}
msg.DEBUG=false;
context.RELAIS=RELAIS;
return msg;