question

d-ferdi avatar image
d-ferdi asked

pylontech soc aus vorhandenen messwerten berechnen

hallo,

da ich den soc von meinem bmv an den pylontech-akkus nicht nutzen kann, ausser er wird taeglich auf 100% synchronisiert, bin ich zur zeit am ausprobieren, wie ich den aktuellen soc aus den messwerten des bmv ermitteln kann.

leider kommt es naemlich beim pylontech bms auch immer wieder mal vor, dass der soc gleich um 10% springt, meistens von 89/90% auf 100%, so dass ich dann in dem bereich keinen vernuenftigen soc mehr habe.

ich kann leider auch nicht den soc meines 2. akkus nehmen, da der eigenbedarf der pylontech-akkus deutlich hoeher ist.

da ich die daten alle in einer sql-datenbank habe, ist es natuerlich sehr einfach, hier entsprechende auswertungen zu machen.

aktuell benutze ich diese formel:

(700+sum(strom-1.35)/60)/7

700 ist die kapazitaet meines akkus in Ah und durch die Ah/100 wird dann nochmal dividiert, um auf den %-wert zu kommen.

da ich nur alle 60s einen datensatz in die datenbank schreibe, wird noch durch 60 dividiert, um auf die verbrauchten Ah zu kommen.

die formel nimmt also folgende werte zur berechnung:

(akku-kapazitaet in Ah + summe(akkustrom -1,35A)/anzahl der werte pro stunde)/akku-kapazitaet in Ah * 100 = soc in %

dabei werden nur die stromwerte seit dem letzten 100% soc addiert, um einen moeglichst genauen wert zu bekommen.

der akkustrom ist beim entladen negativ und beim laden positiv

die -1,35A sind die korrektur wegen des eigenbedarfs und den speicherverlusten des akkus.

ich habe 14 us 2000c, das sind dann also knapp 0,1A pro akku.

man kann das, in node-red, auch dynamisch berechnen, hat dann aber das problem, dass bei einem neustart von node-red die daten der bisherigen berechnung verloren gehen, wenn man sie nicht regelmaessig irgendwo abspeichern kann und den speicher des gx wuerde ich dazu nicht benutzen, ausser es handelt sich um einen tmp-speicher im ram.

ich werde die formel in den naechsten tagen, stichprobenartig pruefen und eventuell auch einmal ein programm ueber die gesammelten daten laufen lassen, um den berechneten soc ueber eine laengere zeit mit dem vom bms gemeldeten soc vergleichen.

vieleicht finde ich ja auch noch eine formal, um den soc, wenigstens naeherungsweise, aus der spannung und dem aktuellen strom berechnen zu koennen. die waere dann auch einfacher zu verwenden, da man nur die aktuellen messwerte braucht und nicht den akkustrom ueber eine laengere zeit. natuerlich waere hier der fehler beim soc deutlich hoeher!

die abweichung des soc mit meiner letzten formel wird leider mit der zeit immer groesser, sie eignet sich deshalb nur fuer einen zeitraum von 24-48 stunden nach dem letzten 100% soc.

tschuess

Pylontech
2 comments
2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

d-ferdi avatar image d-ferdi commented ·
hallo,

ich habe einmal die daten der letzten 7 tage aufbereitet und das passt schon sehr gut.

allerdings starke stromschwanken verursachen einen groesseren fehler als 1-2% weil dafuer dann einfach zu viele messwerte fehlen. aber solange der akkustrom recht konstant ist und innerhalb von 60s nicht stark schwankt, ist das ergebnis sehr gut.

tschuess

0 Likes 0 ·
d-ferdi avatar image d-ferdi commented ·

hallo,

ich habe das ganze noch etwas vereinfacht:

Ah = Akkukapazitaet in Ah

Ein = kWh geladen seit letztem 100% SOC

Eout = kWh entladen seit letztem 100% SOC

dT = zeitdifferenz in stunden vom letzten 100% soc bis jetzt

U = mittelere akkuspannung (bei mir ca. 50V)

K = korrektur (bei mir 1,35 A fuer 14 US 2000C)

SOC= (Ah + (Ein - Eout)/U*1000 - dT * K)/Ah*100

noch ein paar erklaerungen:

(Ein - Eout)/U*1000 sind die aktuell entnommenen Ah

dT * K sind die Ah, die der Akku selbst verbraucht hat und die das bmv leider direkt nicht mitzaehlen kann

die daten bekommt man alle von einem bmv 7xx und wohl auch vom smartshunt. das ganze ist etwas einfacher, als alle stromwerte zu addieren und der fehler aufgrund von starken und kurzen stromschwankungen sollte kleine sein.

falls sich jemand fuer meine passende sql-abfrage interessiert, die sieht nach der optimierung so aus:

select (700+(t2.in_kwh-t1.in_kwh-t2.out_kwh+t1.out_kwh)/50*1000-(unix_timestamp(t2.zeit)-unix_timestamp(t1.zeit))/3600*1.35)/7 as soc,t1.zeit as z1_zeit,t1.in_kwh as t1_in,t1.out_kwh as t1_out,t2.zeit as t2_zeit,t2.in_kwh as t2_in,t2.out_kwh as t2_out from (select in_kwh,out_kwh,zeit from vedirect_werte where zeit>date_add(now(),interval -30 day) and geraet=8 and soc=100 order by zeit desc,soc desc limit 1) as t1 join (select in_kwh,out_kwh,zeit from vedirect_werte where geraet=8 order by zeit desc limit 1) as t2;

tschuess

0 Likes 0 ·
0 Answers