DIY Victron BMV (Nur teilweise funktional)

Die Idee

Ein Victron BMV kostet ~130-160€ direkt von Victron. Der Shunt (Messwiderstand) selbst, ohne die ganze Elektronik lässt sich aber auch für 30-40€ besorgen. In meinem übereifrigen und selbstüberzeugten Kopf, hatte ich gedacht, ich könnte mit etwas Zeit, einem Mikrocontroller und ein paar Kabeln den BMV nachbauen.

Die Komponenten

Nach etwas Bastelei habe ich einen Prototypen gebastelt, bestehend aus:

Verkabelung

Ein Schaltdiagramm

Formulierung eines Ziels

Die Ansprüche an meinen DIY-Shunt waren:

  • genaue Messung des Stroms und der Spannung
  • Anzeige von Ladezustand, Strom, Leistung und Spannung auf dem Display
  • Möglichkeit der Konfiguration mittels Rotary-Encoder (weil ich die einfach nice finde)
  • Dimensionierung ähnlich wie beim BMV
  • Anbindung des Shunts an ein Venus-System und Darstellung der Akku-Daten in diesem

Dafür habe ich noch "Unterziele", die sich aus den vorherigen ergeben:

  • Speicherung von historischen Maxima und Minima
  • Speicherung der Einstellungen über Stromversorgungsverluste hinweg

Großer Unterschied zu dem "original" BMV ist, dass ich den Bildschirm und die Steuerung nicht per Kabel von dem Shunt entkoppelt habe - und das auch nicht vorgesehen habe. Das größte Problem dabei bildet der Bildschirm, der per I2C angeschlossen ist, was an sich nur für Kommunikation auf Platinen und recht kurzen Distanzen konzipiert ist. Ich habe noch nicht getestet, wie weit die Reichweite mit dem Bildschirm konkret sein könnte, laut meiner Recherche sind aber auch eher "nur" Längen von bis 5m möglich. Grundsätzlich ist ein differentielles I2C über ein Cat 5 Kabel auch möglich, die Chips dafür jedoch mit ~10€ im Verhältnis zum Rest recht teuer.

Der Code und die Anbindung an Venus-OS

Beim Schreiben des Codes durfte ich mich wieder sehr viel Reverse-Engineering bemühen: Die Spezifikationen der Victron-Protokolle lassen sich auf der Victron-Website anfordern. Relevant für das Projekt sind das VE.Direct Protocol, und das VE.Direct HEX Protocol BMV. Es haben sich nämlich Menschen gedacht, gleich Daten zweier Protokolle zur Auswertung in Venus-OS zu verwenden.

Die zwei Protokolle

ID    0x203 
V     11996 
I     -439 
P     -5 
CE    -248917 
SOC   774 
TTG   14400 
Alarm OFF 
Relay OFF 
AR    0 
BMV   700 
FW    0308 
Checksum A

Das VE.Direct-Protokoll ist recht simpel aufgebaut und sendet einfach immer einen Identifier, einen TAB und dann den Wert dahinter. Zeilen wie P    -5  lassen sich recht einfach Entziffern und die Bedeutung sogar erraten: P steht vermutlich für Power.
Die Checksum ist auch recht simpel, das byte der Checksum bildet mit dem Rest des Datenblock in Summe modulo 255 einfach Null. (Und ist auch wunderbar dokumentiert.)

:80C0100414141410404040404040404040404040404040404F8

Das HEX-Protokoll ist weitaus unintuitiver, da habe ich mich doch sehr über die Dokumentation von Victron gefreut. Grundsätzlich ist das Protokoll mehr ein Frage-Antwort-Spiel zwischen den Geräten, ein Kommando beginnt immer mit einem : und einer Kommando-Kathegorie (8 zum setzen eines Registers, 7 zum Lesen) - gefolgt von dem Register und optional dem Wert. Die Checksum ist ähnlich zu der beim Text-Protokoll, muss jedoch am Ende 0x55 und nicht 0x00 ergeben.

Der fertige Code lässt sich in diesem git-Repo finden.

Was noch kommt: Eine eigene Platine

Das alles ist auf der Steckplatine doch noch recht groß und klobig und hat nicht so wirklich den Formfaktor, den ich mir vorgestellt habe. Wie bei anderen Projekten auch schon, plane ich eine eigene Platine zu designen, fertigen zu lassen und dann selbst zu bestücken. Im Gegensatz zu vorherigen Projekten, plane ich aber auch direkt SMD-Komponenten zu verwenden und zu schauen, wie gut ich die per Hand aufgelötet bekomme.