Benachrichtigungen
Alles löschen

Powerwall mit Felicity IVEM5048 + Felicity LPBA48100-OL - Auslesen des BMS und Steuerung des Inverters

8 Beiträge
4 Benutzer
2 Likes
1,250 Ansichten
(@andreasm)
Vorsichtiger Stromfühler
Beigetreten: Vor 6 Monaten
Beiträge: 22
Themenstarter  

Hallo,

ich habe nun ein paar Tage damit verbracht, eine Powerwall mit Felicity IVEM5048 + Felicity LPBA48100-OL zu bauen.

Da es hier einige Probleme gerade in Bezug auf die Doku gab, wollte ich dies für andere Interessierte einmal aufschreiben.

 

Das hier ist also keine Frage, sondern eine mögliche Lösung, um die Komponenten per RS-485 und RS-232 anzubinden. Ich kann natürlich auch keine Garantie oder Haftung für etwaige Schäde übernehmen - aber mein Ausprobieren haben die Systeme klaglos geschluckt. Bis auf die 12 V vom RS232? - aber dazu unten mehr.

 

Beschreibung:

Ich habe einen Sungrow Wechselrichter mit den PV Modulen dran. Dieser hat keinen Akku und ist 3 phasig angeschlossen.

Nun sollte es eine Nachrüstlösung für den Akku geben - ich nenne das ganze mal hier jetzt "Powerwall".

Dazu habe ich einen Felicity IVEM5048 + Felicity LPBA48100-OL gekauft. Der IVEM5048 ist ein 5 KW 1-phasiger Hybrid Wechselrichter mit Off-Grid Funktionalität. Der LPBA48100-OL ist ein 5 kWh Akku mit 51V Nennspannung. Die Inverter kann man parallel schalten zur Leistungserhöhung und/oder auch für mehrere Phasen. Genauso kann man bis zu 12 Akkus parallel schalten.

Beides kostet aktuell zusammen so ca. 1700 €. Ein zweiter Akku kommt bald noch, da ja jetzt alles funktioniert.

 

Bei mir läuft ein "SmartHome" - das meiste ist über MQTT (Raspberrys) gekoppelt. Das sind diverse Raspberrys, Arduinos, Kameras und Zigbee Geräte. Eine OpenWB Wallbox lädt das E-Auto.

Zentral als manuelles Steuerungsgerät und als Infozentrale ist OpenHAB installiert.

Daher sind diese Informationen bereits vorhanden:

- Einspeisung W / kWh

- Netzbezug W / kWh

- PV Leistung

- Wallbox Leistung

Ziel:

Nun ist das Auto aber nicht immer da und genau da scheint die Sonne. Dieser Ertrag soll nicht mehr eingespeist werden, sondern in einem Akku für den nächtlichen Verbrauch gespeichert werden. Grundlast ist ca. 700W - davon 450 W für Ethernet-Switche, Synology-NAS und ESXi (Virtualisierungslösung). Der Rest sind Kühlschänke, SmartHome-Komponenten, etc.

Anforderungen an die Powerwall:

- Auslesen des SOC (also des Ladezustands)

- Einstellen dreier Modi (Batteriebetrieb, Netzbetrieb mit Laden, Netzbetrieb ohne Laden)

- Einstellen des Ladestroms, um sich auf die aktuelle Einspeisung anzupassen.

- Auslesen einiger Informationen wie Zellspannungen, Gesamtspannung

 

Aufbau:

Akku und Inverter verbinden

Akku und Inverter sind schnell angeschraubt. Die Stromverbindung ran und schon geht da was.

Aber dann kommen diverse Probleme. Das erste ist gleich die BMS Anbindung zwischen Inverter und Akku. Es liegt ein Kabel dafür bei. Aber es steht nicht wirklich eindeutig im Handbuch, wo die Stecker rein müssen. Und selbst, wenn man alles durchprobiert, geht es nicht. Darüber hinaus muss man die RS 485 Adresse des Akkus per DIP Schalter einstellen. Hier nach der Anleitung zu gehen, endet ebenfalls im Nicht-Funktionieren.

Das mit dem Akku mitgelieferte Kabel kann man gleich weglegen (wegwerfen). Denn es funktioniert nicht. Hier sind die PINS 5/6 auf 1/2 verbunden und das ist für die Kombination von Felicity Akku und dem Inverter eines anderen Herstellers gedacht. Wir brauchen hier einfach 5/6 auf 5/6. Dafür reicht ein einfaches Ethernet-Patchkabel aus.

Dies kommt im Inverter in die BMS Buchse (RJ-45) und im Akku in einen beliebigen Port. Denn RS 485 liegt hier überall an. Ich hab das andere Ende in den PCS Port gesteckt. Dann sind Link 0/1 und RS 485 frei.

Da ich nicht weiß, wie die sonstigen Pins der RJ-45 Buchsen belegt sind (bis auf CAN), habe ich alle anderen Kabel durchtrennt. Es ist also nur 5/6 verbunden. Damit funktioniert es.

5 ist RS485B (blau/weiss) und 6 ist RS485A (grün).

Die DIP Schalter 1-4 (Adresse) sollten nach meinem Verständnis in der Doku bei einem Akku auf 0/0/0/0 und DIP 5 auf 1 (Abschlusswiderstand) stehen.

Damit es funktioniert, muss man aber die Adresse auf 1/0/0/0 stellen - der Widerstand ist bei der Kürze der Kabel m.E. egal - ich habe DIP 5 auf 0, da ich eh andere RS485 Geräte noch angeschlossen habe (nämlich zum Auslesen).

Nachdem also das richtige Kabel drinsteckt und man den Akku im Inverter auf "Lib" gestellt hat, erscheint nun auch das kleine "c" und man kann im BMS Menü die Akku Daten auslesen. Solange das nicht geht, sollte der Akku auch nicht auf "Lib" stehen.

Akku auslesen

Da ich überhaupt nicht wusste, welches Protokoll auf welchen PINs hier irgendetwas schickt, habe ich zuerst einen RS485/USB Wandler an den Akku RS485 Port gesteckt und mitgehört. Aber da kommt nichts. Egal, was man macht, man kann nicht mithören.

Offenbar sind die Ports untereinander abgeschirmt - denn wenn man den RS485 Wandler an das Ethernetkabel zwischen Akku und Inverter (also 5/6) steckt, läuft das Sniffen der Daten.

Im Netz (ich weiß nicht mehr woher) habe ich dieses Dokumente gefunden.

Beim Sniffen mit 9600 8N1 auf RS 485 konnte ich die Befehle in der BMS Doku wiedererkennen.

Nun habe ich das USB/RS485 Kabel wieder in den freien RS485 Port des Akkus gesteckt und ein paar Daten hingeschickt:

full_command = bytes.fromhex("01 03 13 2A 00 18 60 8C") # Cell voltage and temperature
full_command = bytes.fromhex("01 03 f8 0b 00 01 c4 a8") # BMS version
full_command = bytes.fromhex("01 03 13 02 00 0A 60 89") # Battery information

Das steht in dem PDF oben unter Punkt 3.1. / 3.2.

Darauf gibt es auch eine Antwort und die Daten sind stimmig.

Der Lesezugriff auf das BMS mittels RS485 funktioniert also.

Ich habe das Ganze auch in einer Python Library verpackt. Diese kann man von der Bash oder aus einem anderen Python Programm nutzen. Bei Bedarf bitte melden oder ich schreibe da später noch etwas zu. Da ist auch das CRC Erstellen der Pakete enthalten. Aber initial geht es mir erstmal um die Hardware.

Inverter auslesen und Settings verändern

Hier dachte ich natürlich auch, dass das über RS485 geht. Leider nicht...  Eine Doku habe ich von einem Felicity Supporter (Danke Daniel!). Hier steht was von RS485, 2400 Baud, MODBUS. Das ist aber leider nur halb richtig, denn so habe ich natürlich nach einer RS485 Verbindung gesucht und scheiterte daran, dass der Inverter der Master ist und auf keine Slave ID hört. Also habe ich mich an RS232 und den 2400 Baud versucht. Das geht! (übrigens kann man den chinesischen Text super in den Google Translater nach Englisch packen)

An dem RS232 Port hängt ja mittels mitgeliefertem Kabel dieser Wifi Dongle - der übrigens bei mir nicht geht. (das liegt aber offensichtlich an der Baudzahl von 9600 im Dongle...) Aber ich brauche den auch nicht mehr Smile

Das Seltsame ist hier, dass der Dongle über die RS232 mit Strom versorgt wird - ACHTUNG: Deswegen hat es mir auch meinem RS232/USB Adapter den Hitzetod beschert.

Denn bei dem mitgelieferten Kabel sind 4 Pins belegt: TX/RX/GND + 12 Volt auf Pin 9!!! Das ist normalerweise der Ring Indicator. Das war der Grund, warum der RS232 Adapter auch so warm wurde und nach 2 Tagen mit Kunststoffblase auf dem Gehäuse kaputt ging.

Die PINs auf der RJ45 Seite am Inverter sind mit PIN 1,2,3 und 8 belegt. 3 ist das grün/weiße Kabel und führt die 12 Volt. Dies muss durchtrennt werden. Also Kabel abisolieren, grün/weiß raussuchen und durchschneiden. Zur Probe kann man Pin 5 + 9 des RS232 Steckers durchmessen. Dort liegen bei intaktem Kabel 12 V an. Das ist falsch. Nach dem Durchtrennen sollte man nur noch die 5 V zwischen GND und TX messen können, also PIN 5 und 3.

Der neue RS232/USB läuft nun ohne Erwärmung...

RS232 wird mit 2400 8N1 initialisiert.

Nun zum Protokoll:

Das ist dem des BMS sehr ähnlich bzw. identisch. Ein Beispiel (ohne CRC, da dies meine Python Lib selber macht):

no_crc_command = bytes.fromhex("01 03 11 01 00 01") # Realtime data / Working mode

Wichtig ist hier die 03 (Lesen), 06 ist nämlich Schreiben, das Register 11 01 ist laut Doku der Working Mode und man muss nun nach dem Senden dieses Kommandos (die 01 hinten heißt, dass man INT16 erwartet) noch die Antwortdaten holen. Da steht dann tatsächlich der Modus drin.

Und genauso kann man mit 06 auch Daten senden - aber nur die Settings, also die Register, die in der Doku als R/W gekennzeichnet sind.

 

Technischer Aufbau:

Also technisch sind die beiden USB Adapter an einem Raspberry bei mir angeschlossen. Dort ist die erwähnte Library aktiv und diese frage ich von einem Python Service ab. Dieser schickt die Daten per MQTT an die OpenWB Wallbox und an OpenHAB.

Im OpenHAB habe ich dann auch eine kleine Oberfläche gemacht und kann jetzt dort alles Notwendige ansehen und die verschiedenen Modi umstellen. Sobald also zuviel Netzbezug ist, schalte ich auf "Battery" um, wenn der Akku leer ist auf "Bypass without Loading" und wenn die Sonne wieder scheint auf "Bypass with Loading". Mit dem Schiebeschalter passe ich den Ladestrom der aktuellen Einspeisung an.

 

So, das war es jetzt erstmal zum initialen Aufbau. Wer also auch so etwas vorhat: Es funktioniert.

Ich kann gerne bei Bedarf Details zu der Python Lib und den Commands noch erläutern. Dann einfach hier schreiben.

Meine nächste Aufgabe ist jetzt nur noch, "mich" zu automatisieren. Es muss also nur noch ein kleiner Service her, der per MQTT die Daten abfragt und je nach Wert (Einspeisung/Netzbezug/SOC/PW Leistung) die drei Modi (siehe oben) umstellt und den Ladestrom so justiert, dass möglichst der gesamte Überschuss in den Akku geht.

Viele Grüße und viel Erfolg mit eurem eigenen Projekt

Andreas

Dieses Thema wurde geändert Vor 6 Monaten 9 mal von AndreasM

   
Zitat
(@andreasm)
Vorsichtiger Stromfühler
Beigetreten: Vor 6 Monaten
Beiträge: 22
Themenstarter  

Den Felicity Inverter habe ich zurückgeschickt wegen der fehlenden Netzeinspeisung und habe mir einen Multiport II geholt. Der unterstützt die Insel + Einspeisung und damit funktioniert nun das Halten von 0W Einspeisung/Bezug automatisch. Steht hier in einem anderen Thread beschrieben:

https://www.akkudoktor.net/forum/stell-dein-batterie-powerwall-projekt-vor/felicity-5kwh-speicher-und-victron-cerbo-gx-connection/paged/6/


   
AntwortZitat
(@andreasm)
Vorsichtiger Stromfühler
Beigetreten: Vor 6 Monaten
Beiträge: 22
Themenstarter  

Es gab gerade die Frage per Nachricht, ob es Code gibt zum Auslesen. Daher habe ich ein paar Dinge aus meiner Lösung hier reingestellt.

Hier ist schon mal das Python Script zum Auslesen.

(Nach dem mein kompletter Post gerade gelöscht wurde, schreibe ich das jetzt einzeln.)

Diese r Beitrag wurde geändert Vor 5 Monaten 2 mal von AndreasM

   
SventeHof reacted
AntwortZitat
(@andreasm)
Vorsichtiger Stromfühler
Beigetreten: Vor 6 Monaten
Beiträge: 22
Themenstarter  

Mit dem Script kann man direkt die Daten abfragen:

python FelicityBMSManager.py GetBMSBatteryInformation -c 1

+----------------+----------------+---------+
| Name           | Description    | Value   |
+----------------+----------------+---------+
| BatteryVoltage | BatteryVoltage | 52.71 V |
| BatteryCurrent | BatteryCurrent | 0.0 A   |
| SOC            | Ladezustand    | 30 %    |
+----------------+----------------+---------+

-c steht für die Cell-Id - also die DIP Einstellung

Es gibt diese Commands:

GetBMSVersion
GetBMSCellInformation
GetBMSBatteryInformation

Als device ist per Default /dev/ttypUSB0 eingestellt. Man kann das mit "-d DEVICE" aber anpassen - es funktioniert auch IP:Port für einen Ethernet RS485 Adapter.

Wenn man das in einem eigenen Python Code verwenden möchte, sieht das so aus - (ich musste das stark kürzen, da andauernd hier im Forum eine Sperre kommt, wenn ich das posten möchte...)

 

from FelicityBMSManager import FelicityBMSManager
...
def getFormattedData(command, clientid):

    ws = FelicityBMSManager(command=command, clientid=clientid)
    data = ws.get_data()

...

 

So - damit kann man das BMS auszulesen - in der Python Datei ist also alles drin, um an die Daten zu kommen. Weitere Datenquellen / Register sind oben in den Dokumenten beschrieben.

 

Viel Erfolg!

 

Diese r Beitrag wurde geändert Vor 5 Monaten 5 mal von AndreasM

   
solarmax reacted
AntwortZitat
 uvge
(@uvge)
Newbie
Beigetreten: Vor 2 Monaten
Beiträge: 1
 

Hallo Andreas,

tolle Sache, hab mir auch zwei Speicher (je15kWh) von FS Solar zugelegt...dank deinem Py-Skript ist das Ansprechen beider BMS fast problemlos...super und weiter so

Wink

 


   
AntwortZitat
(@dentec)
Batterielecker
Beigetreten: Vor 4 Jahren
Beiträge: 234
 

Hallo @andreasm

vielen Dank für dein Python-Script. Ich habe es auch zum Laufen bekommen und kann jetzt endlich das BMS meines Felicity-Speichers auslesen.

Zur Weiterverarbeitung der Daten mit NodeRed/InfluxDB/Grafana tue ich mich aber noch schwer die ASCII-Tabelle zu parsen.

Wäre es möglich, die Ergebnisse als JSON auszugeben ? Bin leider in Python nicht fit genug, alle Anpassungsversuche scheiterten bisher.

 

Für einen Tipp wäre ich dankbar !

 

Viele Grüße

 

 

EDIT: Hat sich erledigt. Bekomme die Daten jetzt wie gewünscht aufbereitet und speichere sie in der InfluxDB usw. (ChatGPT sei dank !)

 

Diese r Beitrag wurde geändert Vor 2 Monaten 4 mal von dentec

11kWp PV, 15kWh DIY-Akku (7S) mit DIY-BMS V2.0 + EAuto m. PV-gesteuerter Wallbox


   
AntwortZitat
(@andreasm)
Vorsichtiger Stromfühler
Beigetreten: Vor 6 Monaten
Beiträge: 22
Themenstarter  

Hallo,

das freut mich, wenn es jetzt klappt. Ich war über das Wochenende unterwegs und konnte da nicht antworten. Generell ist das Python Script so aufgebaut, dass es zwar ASCII auf der Console ausgibt. Aber wenn es als Library genutzt wird, kommen JSON Daten direkt zur Weiterverarbeitung zurück.

Wenn noch Fragen sind, helfe ich gerne.

Viele Grüße

Andreas


   
AntwortZitat
ymca72
(@ymca72)
Vorsichtiger Stromfühler
Beigetreten: Vor 7 Monaten
Beiträge: 15
 

Hallo, 

ich hab auch ein Felicity LPBF48250 hier am laufen und überlege gerade noch einen zweiten dazu zu holen aber das eine Geschichte. Mich würde interesieren, mit welchen Adaptern du die Daten aus dem Speicher holst? Weil mein System läuft und das ganz gut aber die 4 LED`s sind ganz miese Schätzeisen und ich versuche derzeit, über die Batteriespannung Rückschlüsse zu ziehen, was für eine Ladung er hat. Aber auch das sind nur ganz grobe Schätzungen meinerseits. 

Kannst du mal ein Link zu den verwendenden Adaptern setzten? 

Dank dir 

LG


   
AntwortZitat
Teilen: