@Fox223
Grundsätzlich, das ist aber meine persönliche und eventuell technisch nicht ganz durchdachte Antwort, würde ich erstmal den TCP MODBUS zum Laufen bekommen, dann per Script Befehle in die richtigen Register schreiben. Wenn Du dann Deine WB unter Kontrolle hast, Laden und Ladestrom z.B., dann kannst Du Dich immer noch mit EVCC beschäftigen.
Ich habe auf EVCC verzichtet und steuere PV-Überschuss laden mit einem simplen Script.
Das muss aber jeder für sich entscheiden, EVCC ist ein mächtiges und soweit ich höre auch gutes tool. Das kann aber nur funktionieren, wenn du den TCP-Modbus wirklich fehlerfrei am Laufen hast. Macht dann auch das Fehlersuchen/Debuggen einfacher, wenn alles was passiert aus Deinem Script kommt.
Hier mal mein EV-Steuerscript (ist simpel, ich bin kein Java Profi und man kann das sicher besser machen, aber es funktioniert und ich habe es selber gebastelt):
var Strombegrenzung_Wallbox_EV_laden, Aktuelle_Ladeleistung, Lade_Restart_Delay;
// Strombegrenzung MINIMUM 60 Ampere (Hersteller)
Strombegrenzung_Wallbox_EV_laden = 60;
Aktuelle_Ladeleistung = 60;
// Pause nach Ladeende bis Neustart in Millisekunden
Lade_Restart_Delay = 1 * 60000;
schedule("* * * * * *", async () => {
// 1 Sekunden Timer
// Wallbox Ladestrom EV
setState('0_userdata.0.Datenpunkte.EV_Wallbox.EV-Ladestrom' /* EV-Ladestrom */, (String(Math.round(parseFloat(getState('modbus.1.holdingRegisters.16_Wirkleistung_L1').val) + parseFloat(getState('modbus.1.holdingRegisters.20_Wirkleistung_L2').val) + parseFloat(getState('modbus.1.holdingRegisters.24_Wirkleistung_L3').val)))));
// Wallbox Ladekabel in Auto eingesteckt
if (getState('modbus.1.holdingRegisters.2_Kabel_Status').val == 0) {
setState('0_userdata.0.Datenpunkte.EV_Wallbox.Lade-Kabel_Status' /* Lade-Kabel Status */, (String(0)));
} else {
setState('0_userdata.0.Datenpunkte.EV_Wallbox.Lade-Kabel_Status' /* Lade-Kabel Status */, (String(1)));
}
// Wallbox max. Ladestrom berechnen
// Ladestrombegrenzung neu berechnen
//
// ((Einspeisung / 1,5) + Ladestrom Aktuell
// - (Netzbezug +675))
// / 68,75
// Ladegrenzen 3 phasig:
// -> 11KW / 68,75 = 160
// -> 4,1 KW / 68,75 = 60
Strombegrenzung_Wallbox_EV_laden = Math.round(((parseFloat(getState('0_userdata.0.Datenpunkte.Strom.Einspeisung').val) / 1.5 + parseFloat(getState('0_userdata.0.Datenpunkte.EV_Wallbox.EV-Ladestrom').val)) - (parseFloat(getState('0_userdata.0.Datenpunkte.Strom.Netzbezug').val) + 675)) / 68.75);
if (Strombegrenzung_Wallbox_EV_laden < 60) {
// min. 60 Ampere Herstellervorgabe
Strombegrenzung_Wallbox_EV_laden = 60;
}
if (Strombegrenzung_Wallbox_EV_laden > 160) {
// max. 160 Ampere Herstellervorgabe
Strombegrenzung_Wallbox_EV_laden = 160;
}
// Wallbox Strombegrenzung steuern
if ((Strombegrenzung_Wallbox_EV_laden - Aktuelle_Ladeleistung >= 10) || (Strombegrenzung_Wallbox_EV_laden < Aktuelle_Ladeleistung) || ((Strombegrenzung_Wallbox_EV_laden - Aktuelle_Ladeleistung >= 1) && (Strombegrenzung_Wallbox_EV_laden == 160))) {
// Nur in das Register schreiben wenn notwendig
//
// Strombegrenzung STEIGT >= 10
// ODER
// Strombegenzung FÄLLT
// ODER
// Strombegenzung STEIGT und erreicht 160 (LIMIT)
// -> Nachregeln in der Wallbox
setState('modbus.1.holdingRegisters.91_Strombegrenzung_RW' /* Strombegrenzung */, Strombegrenzung_Wallbox_EV_laden);
// Neuen Wert speichern für die Nachregelung
Aktuelle_Ladeleistung = Strombegrenzung_Wallbox_EV_laden;
}
// Es muessen min. 4.2 KW PV-Ueberschuss vorhanden sein im Delta 5 min wie auch aktuell mindestens 4.5 kw
if ((getState('0_userdata.0.Datenpunkte.Strom.Delta-Einspeisung-5-min').val > 4200) && (getState('0_userdata.0.Datenpunkte.Strom.Einspeisung').val > 4500) && (getState('0_userdata.0.Datenpunkte.EV.EV_Ladepause_nach_abschalten').ts < (new Date().getTime()) - Lade_Restart_Delay)) {
if ((getState('modbus.1.holdingRegisters.2_Kabel_Status').val == 1) && (getState('0_userdata.0.Datenpunkte.Strom.Delta-Netzbezug-5-min').val <= 100)) {
// Laden freigegeben
setState('modbus.1.holdingRegisters.93_Lademodus_RW' /* Lademodus */, 0);
setState('modbus.1.holdingRegisters.95_Ladebefehl_RW' /* Ladebefehl */, 1);
setState('0_userdata.0.Datenpunkte.EV.EV_Ladepause_nach_abschalten' /* EV_Ladepause_nach_abschalten */, formatDate(getDateObject((new Date().getTime())), 'JJJJ.MM.TT SS:mm:ss.sss'), true);
console.info(('Freies laden / Laden aktiviert / Strombegrenzung gesetzt auf: ' + String(Strombegrenzung_Wallbox_EV_laden)));
}
} else {
// Bei 400W Netzbezug Delta 5 Minunten aussteigen (kleiner Puffer für kurze Verschattung)
if ((getState('0_userdata.0.Datenpunkte.Strom.Delta-Netzbezug-5-min').val > 400) && (getState('modbus.1.holdingRegisters.95_Ladebefehl_RW').val == 1)) {
// min. 60 Ampere Herstellervorgabe
Strombegrenzung_Wallbox_EV_laden = 60;
setState('modbus.1.holdingRegisters.91_Strombegrenzung_RW' /* Strombegrenzung */, Strombegrenzung_Wallbox_EV_laden);
Aktuelle_Ladeleistung = 60;
// Laden nur mit RFID Card manuell schalten (override)
setState('modbus.1.holdingRegisters.95_Ladebefehl_RW' /* Ladebefehl */, 2);
setState('modbus.1.holdingRegisters.93_Lademodus_RW' /* Lademodus */, 1);
console.info(('RFID Card laden / Laden deaktiviert / min. Ladestrom gesetzt: ' + String(Strombegrenzung_Wallbox_EV_laden)));
}
}
// Laden aktiviert aber Kabel wurde gezogen
if ((getState('modbus.1.holdingRegisters.2_Kabel_Status').val == 0) && (getState('modbus.1.holdingRegisters.95_Ladebefehl_RW').val == 1) && (getState('modbus.1.holdingRegisters.93_Lademodus_RW').val == 0)) {
// Laden nur mit RFID Card
setState('modbus.1.holdingRegisters.95_Ladebefehl_RW' /* Ladebefehl */, 2);
setState('modbus.1.holdingRegisters.93_Lademodus_RW' /* Lademodus */, 1);
Strombegrenzung_Wallbox_EV_laden = 60;
// Laden nur mit RFID Card manuell schalten (override)
setState('modbus.1.holdingRegisters.91_Strombegrenzung_RW' /* Strombegrenzung */, Strombegrenzung_Wallbox_EV_laden);
Aktuelle_Ladeleistung = 60;
console.info('Kabel gezogen -> RFID Card laden / Laden deaktiviert');
}
});
Die hier in modbus.1.holdingRegisters. angegebenen Register sind spezifisch für meine em2go WB und NICHT generisch zu verwenden!
Für die Profis unter Euch, ein sehr altes script, wo ich noch dachte, es ist eine gute Lösung, alle eigenen Datenpunkte als String anzulegen. Man lernt halt nie aus 🙂