Neues JK BMS 2023 Inverter version

... und wenn man das mal weiterdenkt. Es kann doch nicht angehen, dass ein BMS externe Steuerung benötigt um regelmäßige OVP´s zu vermeiden. Es sind doch nicht alle Batterien weltweit perfekt gebalanced.

Da bau ich als Programmierer doch einen Failsafe, meinetwegen in den Settings zuschaltbar, ala "bei welcher max Zellspannung setzte ich, egal wie, 100 soc", dazu. Das sind 10 Zeilen Code wenns hochkommt.

1 „Gefällt mir“

@holle75
Welche Spannung hast du denn bei RCV eingestellt ?

RCV 3,46 (jetzt, war 3,5 die mit der alten Firmware nie erreicht wurden)
Soc100V 3,45

Ich muss das aber nochmal durchdenken. Das war jetzt im Eifer des Firmwareupdate-Gefechtes um nicht das Haus Stromlos zu haben.

Ich vermute, ich muss allgemein weiter runter mit den oberen Spannungen um genug Spatz zur OVP zu haben.

ja ..vielleicht macht das bei großer Zelldrift Sinn

War das nicht der Grund warum so viele über das JK gejammert haben.
Akku wird nicht richtig Voll und für Ballancing zu wenig Zeit.
Jetzt wartet er die eingestellte Zeit und Wechselrichter lädt weiter und es ist auch nicht recht.
Einmal ordentlich bei 100% die Zellen ausgleichen und gut ist's.
Alle weiteren Ladungen sollten wie bei allen anderen klappen.

3 „Gefällt mir“

Etwas umfangreicher, läuft direkt auf dem GX.

import time
import dbus
from datetime import datetime

class filter:
    def __init__(self, Tau):
        self.value = None
        self.Tau = Tau        
    
    def calcFilter(self, inputValue):
        if isinstance(inputValue, (int, float)):
            if self.value == None:
                self.value = inputValue
        
            self.value = inputValue/self.Tau + self.value * (1-1/self.Tau)
        else:
            if not isinstance(self.value, (int, float)):
                self.value = -9999


MAX_CHARGE_CURRENT = 70

BMS_CAN = 'com.victronenergy.battery.socketcan_can0'
VICTRON_SETTINGS = 'com.victronenergy.settings'

# Ladekurve bei niedriger Temperatur
TEMP_OFS = -4
TEMP_GAIN = 0.25

LowTempCurrentOffset = 0

print("------------------------------------------------")
print("BatteryHandler Start um ", datetime.now().strftime("%d.%m.%Y %H:%M:%S")," UTC")


bus = dbus.SystemBus()

MaxChargeCurrentFilt = filter(5)

DBusFullAvailable = False

while not DBusFullAvailable:
    try:
        MinCellVoltObj = bus.get_object(BMS_CAN, '/System/MinCellVoltage')
        MaxCellVoltObj = bus.get_object(BMS_CAN, '/System/MaxCellVoltage')
        MaxTempObj = bus.get_object(BMS_CAN, '/System/MinCellTemperature')
        MinTempObj = bus.get_object(BMS_CAN, '/System/MaxCellTemperature')
        BatVoltObj = bus.get_object(BMS_CAN, '/Dc/0/Voltage')
        BatCurObj = bus.get_object(BMS_CAN, '/Dc/0/Current')
        SocObj = bus.get_object(BMS_CAN, '/Soc')
        MaxChargeCurObj = bus.get_object(VICTRON_SETTINGS, '/Settings/SystemSetup/MaxChargeCurrent')
        DBusFullAvailable = True
    except:
        time.sleep(5)
        print ("Warten auf DBus")        


while 1:
    MaxBatTemp = MaxTempObj.GetValue(dbus_interface='com.victronenergy.BusItem')
    MinBatTemp = MinTempObj.GetValue(dbus_interface='com.victronenergy.BusItem')
    MinCellVolt = MinCellVoltObj.GetValue(dbus_interface='com.victronenergy.BusItem')
    MaxCellVolt = MaxCellVoltObj.GetValue(dbus_interface='com.victronenergy.BusItem')
    BatVolt = BatVoltObj.GetValue(dbus_interface='com.victronenergy.BusItem')
    BatCur = BatCurObj.GetValue(dbus_interface='com.victronenergy.BusItem')
    maxChargeCurrentReadOut = MaxChargeCurObj.GetValue(dbus_interface='com.victronenergy.BusItem')

    # --- Begrenze Ladestrom bei hoher Zellspannung ---
    maxChargeCurrentRaw = (3.55 - MaxCellVolt) * 1000   
    MaxChargeCurrentFilt.calcFilter(maxChargeCurrentRaw)
    if MaxCellVolt > 3.55:
        maxChargeCurrent=maxChargeCurrentRaw
    else:
        maxChargeCurrent = MaxChargeCurrentFilt.value

    max(maxChargeCurrent, 0)
    
    # --- Begrenze Ladestrom bei niedriger Batterietemperatur ---    
    maxLowTempChargeCurrent = (MinBatTemp - TEMP_OFS) *(MinBatTemp - TEMP_OFS) * TEMP_GAIN  # -3°C : 0,25A
                                                                                            # -2°C : 1,00A
                                                                                            # -1°C : 2,25A
    if MinBatTemp <= -4:                                                                    #  0°C : 4,00A
        maxLowTempChargeCurrent = 0                                                         #  1°C : 6,25A
                                                                                            #  2°C : 9,00A
    # --- begrenze maximale Zellspannung bei unter 4°C
    if MinBatTemp < 4:
        if MaxCellVolt > 3.4:
            LowTempCurrentOffset -= 0.1
        else:
            LowTempCurrentOffset += 0.05
        LowTempCurrentOffset = max(LowTempCurrentOffset, -50)
        LowTempCurrentOffset = min(LowTempCurrentOffset, 0)

    else:
        LowTempCurrentOffset = 0

    maxLowTempChargeCurrent += LowTempCurrentOffset 
    max(maxLowTempChargeCurrent, 0)
    
    # --- Begrenze Ladestrom bei hoher Batterietemperatur ---
    maxHighTempChargeCurrent = (55 - MaxBatTemp ) * 7  # 45°C : 70A
                                                       # 50°C : 35A
                                                       # 55°C :  0A
    max(maxHighTempChargeCurrent, 0)
    
    # --- niedrigsten Ladestrom finden ---
    maxChargeCurrent = int(min(maxChargeCurrent, maxLowTempChargeCurrent, maxHighTempChargeCurrent, MAX_CHARGE_CURRENT))

    # Nicht jedes Zappeln schreiben   
    if abs(maxChargeCurrentReadOut - maxChargeCurrent) > 1:
        MaxChargeCurObj.SetValue(maxChargeCurrent, dbus_interface='com.victronenergy.BusItem')
        #print("UTC: ", datetime.now().strftime("%d.%m.%Y %H:%M:%S"), " auf DBus geschrieben: maxChargeCurrent =", maxChargeCurrent, "A")

    time.sleep(2)
1 „Gefällt mir“

Das BMS sollte entweder die maximale Ladespannung oder den maximalen Ladestrom runtersetzen, wenn sich eine Zelle der OVP nähert. Das geht mit so simplen Timer-Sachen halt nicht.

Wenn sich der Akku der Zielspannung nähert (55,2-55,4) dann sinkt doch der Strom von ganz alleine. Oder schafft ihr die volle Stromstärke bis 100%.SOC

Wenn sich aber nur eine Zelle der Zielspannung nähert, dann funktioniert das Prinzip halt nicht.

Hallo,

ich habe seit zwei Tagen auch ein JK Inverter BMS und ich habe zwar schon irre viel gelesen und Videos geguckt aber ich habe einige Dinge, die ich nicht klären kann oder aber auf dem Schlauch stehe. Ich hoffe jemand, der das BMS schon länger hat kann mir helfen.

1.) Ich habe das BMS direkt auf FW V15.38 gebracht
2.) Ich habe die Settings, wie hier in den Screenshots übernommen: My Settings – the Off-Grid-Garage

Ich habe nun folgende Dinge bemerkt, die für mich komisch wirken (vielleicht sind sie auch korrekt).

1.) Warum erst ab 3,45V balancen? Ist die Zeit dann nicht viel zu knapp? Weil ja auch ab 16*3,45V der Akku voll sein sollte?

2.) Nachdem das BMS 100% SOC anzeigt und ich wieder entlade zum Beispiel auf 92% bleibt CVL auf 53.6V stehen sollte die nicht wieder hoch gehen auf 55.2V?

3.) welche Möglichkeit habe ich mit meinem Raspberry alle Daten vom BMS via MQTT zu bekommen (ohne Bluetooth). Der Victron hängt via CAN am BMS - was aber natürlich nicht alles anzeigt.

Vielen Dank!

Grüße,
Stefan

@astirfreak @paulmelsec @solax

ich muss ein bißchen zurückrudern.. Der Logik nach sollte natürlich der Wechselrichter/Charger nach CCV den Strom runterregeln. Macht er jetzt im Moment auch, nachdem ich den ganzen Morgen Warnungen (in der APP zu sehen) hatte -> "Battery full" oder so ähnlich und es mir jedesmal den Inverter ausgestellt hat. Sehr nerviger Prozess. Nachdem ich dann mal Float Charge in den Settings aus und wieder eingestellt hatte, macht das BMS plötzlich was es soll (und auch der Inverter) -> RCV und auch RFV wird angefordert und eingehalten, der Strom sinkt entsprechend.... Gestern war das leider absolut nicht der Fall. Deswegen meine Verärgerung. Ich bin jetzt mal gespannt, ob das "nur" die Nachwehen vom Firmwareupdate waren, oder ob jetzt im nächsten Cycle wieder die Warnung kommt. Was für ein Generve ...

... und trotzdem sollte es einen Failsafe für stark unbalancierte Packs geben. Ich habe im Moment derbe 0.2V Drift dank der alten Firmware und den letzten lichtschwachen Monaten. Selbst mit funktionierender CCV bin ich mit der höchsten Zelle ganz kurz vor Cell-OVP.

  1. LiFePo4 Zellen haben in ihrer Spannungs-Ladekurve dort einen "Knick". Dh. ungefähr ab dieser Spannung ist das Delta-T der Änderung der Spannung so groß das das BMS erkennen kann das die Zellen langsam voll sind. Ab dieser Spannung beginnen die Zellen stärker zu driften, dh. die Zellen nehmen unterschiedlich viel Energie auf. Das ist der beste Zeitpunkt, besonders für einen aktiven Balancer, die Zellen zu balancieren.
  2. nein, deine Akkus haben ja nur die 53.6V Spannung und werden nun entladen und nicht geladen
  3. suche hier im Forum, ich habe alle meine Konfigurationen für die RS485 ModBus Anbindung der Akkus in HomeAssistant gepostet und beschrieben. Das kann man als Vorlage für die eigene Config benutzen.
    Home Assistant Einbindung vom Deye 12k und baugleiche (Sunsyk, solarman...)
    Einfache HomeAssistant Integration von SEPLOS (V2+V3), JK und JBD-BMS per BLE

Der kann auch garnicht anders. Stelle dir zwei, mit einem Rohr verbundene Eimer vor, die mit Wasser befüllt auf gleichem Füllstand sind. Füllstand = Spannung am Wechselrichter und Spannung am Akku, Rohrdurchflußmenge = Stromstärke.
Da beide Eimer gleich voll sind ist die Fließgeschwindigkeit im Rohr = NULL.
Nun, befülle den Eimer am WR, schnell mit 1 Liter zusätzlichem Wasser, Füllstand am WR-Eimer steigt und durch das Rohr entsteht ein Wasserfluß in Richtung Akku, begrenzt durch den Rohrdurchmesser = Widerstand der Akkukabel. Damit wird also der Akku geladen.
Entnehme dem WR-Eimer 2 Litter Wasser, Füllstand dort sinkt unter das Niveau am Akku,Strom fließt zum WR, Akku wird also entladen.

Mit anderen Worten: Wir haben hier den Constant Voltage Modus, der Strom muß nicht begrenzt werden. Erst wenn der Füllstand beider Eimer einen großen Unterschied aufweist muß der Lade/Entladestrom "begrenzt" werden. Das wird aber technisch einfach so gelöst das

  1. das BMS abschaltet wenn zu viel Strom fließt als eingestellt wurde
  2. der WR abschaltet wenn zu viel Strom fließt als eingestellt wurde
  3. der WR die Spannung an seinen Akkuklemmen gezielt bischen erhöht oder reduziert um eine spezifische Energiemenge zu laden oder zu entladen.

Ergo: wir laden niemals mit CCV sondern immer im CV und die Stromberegenzung wird durch den WR aufgrund der Spannugsverhältniss geregelt,

Nur, wenn man zwei Akkus parallel schaltet sollte das BMS wirklich eine "Strombegrenzung" haben. Auf Grund der flachen Ladekurve bei LiFePo4 Zellen ist das aber nicht ein großes Problem, denn nur für einen kurzen Moment, würden hohe Ströme fließen. Vorausgesetzt die Zellen sind nicht kaputt = innerer Kurzschluß oä.

@pv-soko Schön erklärt.

Was ist der Unterschied zwischen CCV (constant charge voltage) und CV (constant ...?)?

Nur gibt es eben auch leider Momente (besonders mit Studer Anlagen) wo der Wechselrichter/Solarcharger die Theorie einfach mal ignoriert. Ich hatte das mit einem Seplos BMS und mit den JK BMS nach Firmwareupdates oder dem Initialeinbau. Ich hoffe inständig, dass es diesmal auch das Update war und sich das jetzt wieder einpendelt.

Das hat allerdings nichts damit zu tun, dass du bei einem massiv unballancierten Pack auch mit funktionierender CCV in die OVP rasseln kannst. Wenn dir eine Zelle als Beispiel weit über dem Durchschnitt läuft, reißt die die Grenze auch wenn deine Gesamtspannung noch weit von der angeforderten Spannung entfernt ist. Außer du hast einen großen aktiven Balancer. Hier fände ich ein wenig Code in der Firmware hilfreich, die kurz vor OVP zB zu RFV umschaltet. Sollte keine unangenehmen langfristigen Auswirkungen haben.

Nein ich meine, wenn er entladen wurde auf 88% und dann wieder geladen wird zum Beispiel weil PV verfügbar oder ich im Victron das manuelle Laden aktiviere - dann bleibt die maximale Ladespannung CVL auf 53.6 stehen.

Keiner :wink: Aber CCV meint "Constant Current Constant Voltage". Also konstante Spannung und konstanter Strom. Wobei beides im Grunde zur gleichen Zeit nicht vorkommen kann, man hat also während des Betriebes einen konstanten Strom und die Spannung ändert sich oder eine konstante Spannung und der Strom ändert sich. Wichtiger dabei ist zu verstehen das der Strom und die Spannung nur bestimmte Maximalwerte einnehmen können. Man stellt also an der Spannungs-/Stromquelle einen maximalen Strom von zb. 10A und eine maximale Spannung von zb. 50V ein. Entweder es fließt ein Strom von 10A und die Spannung ist <= 50V oder die Spannung ist 50V und der Strom ist <= 10A.

Dein Problem mit der OVP liegt nicht am BMS, das liegt an deinen Zellen. Das BMS im Zusammenspiel mit dem WR reagieren nur falsch, sie sind aber nicht die Ursache des Problems.

Ich hatte vor zwei Akkus von GenixGreen zu kaufen, jeweils 10kWh für schlappe 3900€ zusammen. Nach ausgiebigen Tests stellte sich folgendes Verhalten heraus:

  1. die Zellen waren Schrott und drifteten beim Laden am Ende extrem auseinander
  2. die Zellen waren Schrott und drifteten beim Entladen am Ende extrem auseinander
  3. das BMS war Schrott da es nicht den Drift schnell genug ausbalancieren konnte da es ein passives BMS war mit 20mA Balancerstrom
  4. das BMS war Schrott da es immer in den OVP oder UVP kam und dann den Akku komplett abschaltete, ok das ist schon richtig so zu machen, aber....
  5. im Master-Slave-Betrieb der Akkus schalteten sie sich ab und nie wieder ein, erst wenn man manuell eingriff liefen sie wieder, bzw. so wie sie wollten. Also nicht reproduzierbar.
  6. der Deye WR kam damit überhaupt nicht zurecht und deaktivierte mein Hausnetz am LOAD Anschluß. Statt also eine USV für das Haus zu haben, hatte ich so mehr Stromausfälle als ich bisher jemals hatte (NULL Ausfälle all die Jahre, nun ständig wenn die Akkus "voll/leer" wurden)
  7. und natürlich auch hier das SOC Problem, schlechter als ein Schätzeisen
  8. Windoof BMS-Software, unter aller Sau
  9. Firmwareupdates des BMS nicht zu bekommen

Ergo weg mit dem Scheiß und DIY gebaut. Nun habe ich

  • 2x 16kWh für 3400€ gesamt
  • kann sie mit 12kW ent-/beladen
  • habe Zellendrift in der flachen Kurve von 1 bis 2mV
  • Zellendrift bei >= 3.45V max. 30mV
  • A-Grade Zellen
  • austauschbare Zellen und nicht irgendwelche Spezialteile
  • Balancieren ab 3.45V und das dauert so ca. 10 Minuten mit dem aktiven 2A Balancer des JK-BMS
  • Wiederverkaufswert der Akkus viel höher
  • saubere Einbindung als Master-Slave am Deye WR
  • im Falle einer Störung schaltet sich nur der betroffene Akku aus und nicht gleich das gesamte System, ergo stabile Stromversorgung des Hauses
  • Lade/Entlade Ströme/Spannungen, Float Modus usw. werden korrekt an den Deye übermittelt
  • saubere Einbindung per RS485 Kabel in mein EMS = Home Assistant
  • sichere Ferndiagnose und Wartung über Home Assistant hinter Nginx SSL proxy
  • Firmware Updates seitens JK
  • große Hilfe in der Community
  • und Wissen! denn ich musst mich intensiv mit der Materie auseinandersetzen statt "Hinstellen und Vergessen"

Das alles ist was ich erwarte von einem solchen System!
Es geht also, nur Mut.

Hm, kann ich bisher so nicht reproduzieren. Ich habe aber selber erst vor par Tagen auf V15.38 gehoben und warte nun auf Sonne.

Deaktiviere den Float Mode in der BT-App und schau was passiert. Ich halte den Float-Mode sowieso für überflüssig. Bei anderer Zellchemie, zb. NiMH usw. ist der ok.

Habe das gerade mal (zum hundertsten mal) nachgeschaut. Mein CCV (constant charge voltage) meinte CV (constant voltage) und es gibt noch CCC (constant charge current) was dann in kurz CC (constant current) wäre. Um alle Klarheiten beseitigt zu haben :wink: ... ich vergesse es alle Monate wieder.

Jain, auch gute Zellen können dramatisch auseinanderliegen wenn man sie unbewußt sträflich (Firmware 15.27 sei dank) behandelt. Ich hoffe sehr, nicht Schrott verkauft bekommen zu haben. Wird sich zeigen.

Dass Studer im (hoffentlich nur) ersten Zyklus nach zB Update die Infos vom BMS (das ist die Spannung die ich von dir will) nicht versteht ist eine andere Problematik.

Eben hats mir wieder den Inverter ausgeschaltet als das BMS von RCV auf RFV geschaltet hat. Habe noch nicht herausfinden können, was das BMS in dem Moment über CAN sendet (beim letzten Testdurchlauf war es laut App die Info/Warning "Battery full" meine ich mich zu erinnern. Diesmal habe ich es verpasst). Irgendwas was Studer nicht mag. Falls der Hinweis/Warning so immer vom BMS gesendet wird, habe ich ein größeres Problem.

Nur nach Deaktivierung von Float Mode in den Settings ging er überhaupt wieder an. Wiederum die Hoffnung -> nur im ersten Zyklus (wenn ich nichts mehr verstelle. Wobei ich auch nicht weiß, wie das BMS das nun interpretiert)

... was dann mein "workaround" falls der Hinweis/Warning bleibt sein wird. Wobei ich eine reduzierte Spannung nach einer gewissen Zeit nicht falsch finde.

Und was bringt die geringere Spannung? Lebenserwartung eines LiFePo4 Akkus um 5% erhöhen damit der nicht nur 20 bis 40 Jahre hält sondern vielleicht mal 21 bis 41 Jahre?
Heutige Zellen haben 4000 bis 8000 Vollzyklen. Ein Haushalt schafft mit Glück 200 Vollzyklen pro Jahr. Also 4000/200 = 20 Jahre und 8000/200=40 Jahre Haltbarkeit, bei dann noch 70-80% Kapazität.

Beim Deye musste ich die Float-Spannung sehr dicht unterhalb der Ladespannung legen, weil der Akku beim Umschalten in den Float Mode durch den Deye wieder entladen wurde bis die Float Spannung erreicht wurde. Dh. kurz vorher hat man den Akku geladen und dann entlädt man diesen sinnlos sofort wieder, also mal eben 1kWh verbrannt da der Wirkungsgrad beim Laden/Entladen nur 85%-90% ist. Also nur Verluste.
Aber dieses Verhalten habe ich mit V15.30 gehabt, wie es mit V15.38 aussieht kann ich noch nicht sagen, warte auf Sonne.
Rechnet man das hoch und verzichtet auf den Float Mode dann hat man am Ende mehr aus dem Akku rausgeholt als was er mit dem 1 Jahr Lebensverlängerung mir bringt. Davon abgesehen in 40 Jahren bin ich definitiv tot.