NEWS
Batteriesteuerung im GEN24
-
Durch eure Beiträge angeregt habe ich nach mehreren Fehlversuchen mich nochmals an dieses Vorhaben gewagt. Ich versuche einmal alles zusammenzutragen, was ich zum Realisieren meiner Batterieverwaltung benötige ..
benötigte Modbus-Register zur Batteriesteuerung
Register zum Steuern der (Ent)Ladevorgänge
- InWRte (inbound watts rate) : positiv -> maximale Ladeleistung; negativ -> Mindestladeleistung
- OutWRte (outbound watts rate) : positiv -> maximale Entladeleistung; negativ -> Mindestentladeleistung
- InOutWRte_SF : Skalierungsfaktor für InWRte und OutWRte
- StorCtl_Mod : 1 -> aktiviert Ladebegrenzung (InWRte); 2 -> aktiviert Entladebegrenzung ( OutWRte); 3 -> beide Begrenzungen werden aktiviert
Die Prozentwerte in InWRte und OutWRte beziehen sich auf diese Register
- WChaGra : maximale Ladeleistung der Batterie
- WDisChaGra : maximale Entladeleistung der Batterie
Informationen zur in der Batterie gespeicherten Energie
- ChaStat : Ladung der Batterie in Prozent
- ChaStat_SF : Skalierungsfaktor zu ChaStat
- WChaMax : maximale Ladeleistung in KW; die Prozentwerte in InWRte und OutWRte beziehen sich indirekt über WChaGra und WDisChaGra auf dieses Register (Dies muss noch getestet werden!)
Optionen
- ChaGriSet : 1 -> (Zwangs)Ladung aus dem Netz; 0 -> Ladung aus dem Netz nicht möglich; dieser Wert ist UND-verknüpft mit der Einstellung in der Weboberfläche, die das Laden aus dem Netz erlaubt.
- InOutRte_RvrtTms : [Zeitangabe in Sekungen] -> nach Ablauf dieser Zeit nimmt der GEN24 wieder die Standardwerte an.
Steuerung von GEN24/BYD mittels JavaScript
ACHTUNG
Beim Schreiben in Registern, die mit einem Skalierungsfaktor verknüpft sind, muss stets der unskalierte Werte eingetragen werden. Es erfolgt also kein Zurückrechnen über den Skalierungsfaktor; dies muss man selbst erledigen.
Statisch kann der Ladezustand SoC der Batterie über Modbus nur nach unten (minSOC) begrenzen. Will man auch den maximalen Wert begrenzen, bleibt nur der Weg über die Weboberfläche. Alternativ kann man natürlich per JavaScript den Datenpunkt ChaStat überwachen und InWRte auf 0 setzen, wenn der gewünschte maximale Ladezustand erreicht wurde.
In einer zweiten Überarbeitung ist vorgesehen, das Register InOutRte_RvrtTms zu verwenden. Es dient als Timeout; nach Ablauf dieser Zeit werden die Standardwerte wieder aktiviert. Dies ist von Vorteil, wenn beispielsweise einmal der ioBroker abstürzen sollte; in diesem Falle wären die Werte eingefroren, ohne dass man sie zurücksetzen könnte.
Zwangsladung aus dem Netz
const id_InWRte = 'modbus.2.holdingRegisters.1.40356_InWRte' const id_OutWRte = 'modbus.2.holdingRegisters.1.40355_OutWRte' const id_SF_InOutWRte = 'modbus.2.holdingRegisters.1.40368_InOutWRte_SF' const id_Mode = 'modbus.2.holdingRegisters.1.40348_StorCtl_Mod' function setGridLoad(InWRte,OutWRte) { /* InWRte, OutWRte in Prozent Aktiviert die Ladung der Batterie aus dem Netz. Bedingungen: InWRte > |OutWRte| und OutWRte < 0 */ if (0 <= InWRte && InWRte <= 100 && -100 <= OutWRte && OutWRte <= 0 && Math.abs(OutWRte) <= InWRte) { let val_InWRte = Math.round(InWRte / 10 ** getState(id_SF_InOutWRte).val) let val_OutWRte = Math.round(OutWRte / 10 ** getState(id_SF_InOutWRte).val) setState(id_InWRte,val_InWRte,false) setState(id_OutWRte,val_OutWRte,false) setState(id_Mode,3,false) } else { log('FEHLER: ungültige Werte','error') } }Entladung begrenzen
const id_OutWRte = 'modbus.2.holdingRegisters.1.40355_OutWRte' const id_SF_InOutWRte = 'modbus.2.holdingRegisters.1.40368_InOutWRte_SF' const id_Mode = 'modbus.2.holdingRegisters.1.40348_StorCtl_Mod' function setMaxDisCharge(p) { //p in Prozent if (0 <= p && p <= 100) { let val_OutWRte = Math.round(p / 10 ** getState(id_SF_InOutWRte).val) setState(id_OutWRte,val_OutWRte,false) setState(id_Mode,2,false) } else { log('FEHLER: ungültiger Werte','error') } }minimale Entladungsgrenze SOC setzen
function setMinSOC(p) { /* minimaler Ladezustand in % der Batteriekapazität */ if (0 <= p && p <= 100) { let val_MinSOC = Math.round(p / 10 ** getState(id_SF_MinSOC).val) setState(id_OutWRte,val_MinSOC,false) } else { log('FEHLER: ungültiger Wert','error') } }[wird fortgesetzt]