VE.direct Aggregator

Aus "purer Not" heraus :wink: habe ich dieses Projektchen gestartet, direkt zur vollständigen deutschen Beschreibung

VE.Direct Aggregator — Kurzübersicht von claude.ai

Firmware · Arduino Mega 2560 / Teensy 4.1 · v2.0 · 2026


Überblick

Liest mehrere Victron VE.Direct-Geräte gleichzeitig und führt die Datenströme zu einem seriellen Ausgang zusammen. Unterstützt alle VE.Direct-Textgeräte: MPPT, BMV, SmartShunt, Phoenix-Wechselrichter, Blue Smart Charger, Orion.

Ausgang: normaler VE.Direct-Textstrom. Geräte werden per SER# identifiziert. Nicht direkt kompatibel mit Cerbo GX / Venus GX -- aber mit vedirect_deaggregator.py nutzbar.


Topologien

Direkt (Mega):    3 Geräte  → 1 Mega   → Ausgang
Direkt (Teensy):  7 Geräte  → 1 Teensy → Ausgang
Stern:            9 Geräte  → 3 Mega   → 1 Mega  → Ausgang
Kaskade:         12 Geräte  → 4 Mega             → Ausgang (115200 Baud)
Gemischt:        13 Geräte  → 1 Teensy + 2 Mega  → 1 Mega  → Ausgang (115200 Baud)
Teensy-Stern:    21 Geräte  → 3 Teensy → 1 Teensy → Ausgang (115200 Baud)

Leistungssteuerung (readtext_sendhex)

SET <ser> <watt>\n      einzelnen MPPT-Regler begrenzen
SET ALL <watt>\n        alle MPPT-Regler gleichzeitig
HEX <ser> <string>\n   beliebigen HEX-Befehl senden

Antworten: OK <ser> <watt>W <ampere>A\n / ERR <ser> timeout\n / HEX_REPLY <ser> :<antwort>\n

Register 0x2015 (Charge Current Limit, 0.1A, volatil). Vbat wird aus dem Text-Stream gelernt, Fallback: VBAT_FALLBACK (24V). Routing per SER# — unterscheidet Geräte mit gleicher PID korrekt. Nur betroffener Port pausiert; andere Ports werden während wait_hex_reply kontinuierlich geleert (kein Buffer-Overflow). hex_busy wird in allen Pfaden zurückgesetzt.


Hardware

Mega 2560 Teensy 4.1
Logikpegel 5V 3.3V
Pegelwandler keiner BSS138 pro RX (+ TX bei sendhex)
Max. Eingänge 3 7
Versorgung extern 5V, min. 150 mA extern 5V, min. 150 mA
USB + extern gleichzeitig möglich gleichzeitig möglich

Python-Tools

Datei Zweck
ve_aggregator.py Client-Modul — Blöcke lesen, SET/HEX senden
mppt_read_example.py Daten anzeigen mit Intervall pro Gerät
block_monitor.py Block-Timing, Gap-Messung pro Gerät
sendhex_test.py SET/HEX Befehle testen
powerset_example.py Leistungsregelung mit Spannungsrampe
vedirect_simulator.py Upstream-Aggregator simulieren
from ve_aggregator import VEDirect

with VEDirect('/dev/ttyACM3') as vd:
    data = vd.get_all()        # {'SER#': {Felder...}}
    c    = vd.combined()       # Vbat gemittelt, PPV/I summiert
    alive = vd.is_alive()      # True wenn MCU innerhalb 15s gemeldet

    vd.set_watts('ALL', 1500)  # Leistung begrenzen (sendhex)
    for r in vd.get_replies():
        print(r)

De-Aggregation und Venus OS / Cerbo GX

Der aggregierte Stream kann mit vedirect_deaggregator.py wieder in einzelne
virtuelle serielle Ports aufgeteilt werden. Jeder MPPT erscheint als eigener
/dev/pts/N Port, den Venus OS und Cerbo GX als eigenständiges VE.Direct-Gerät
einbinden können.

Siehe deaggregator_spec_de.md für die Einrichtung.


Die Integration in GitHub - E-t0m/zeroinput: Set power input to zero with gti inverter and charge controller. · GitHub ist obligatorisch. :wink:

1 „Gefällt mir“

Interessantes Projekt dazu hätte ich noch ein paar Fragen / Anmerkungen:

Galvanische Trennung findet die statt?
Wie geht man damit um das manche Geräte auf dem VE-Bus 5V und andere 3.3V haben?
Und 100mA scheint deutlich mehr zu sein als Victron als zulässig angibt.

Generell versuche ich zu verstehen für welchen Anwendungszwecke das Projekt gedacht ist.

Für ESS-System wo die Leistung der Laderegler gesteuert werden muss, braucht es den HEX-Modus.

Zum Auslesen der Daten gibt auch die 4xVE-Direct zu USB Hubs und/oder esp32 bzw. BLE Beacons.

MEGA TTL -> RS485 -> galvanische Trennung -> USB -> RPi, durch den RS485 Konverter, ansonsten wird angenommen, dass alle Regler auf dem gleichen Potential arbeiten. Wichtiger Punkt, Danke für den Hinweis.

Man geht strickt davon aus, das alle MPPT Regler auf 5V arbeiten, an andere VE.direct Geräte wurde nicht gedacht. :wink:

Victron gibt 100 mA an, man könnte natürlich einen DC/DC nehmen, oder eben zwei Regler parallel anzapfen.

Die Leistungssteuerung ist tatsächlich schon in Arbeit, aber noch nicht im Code.
(mehr brauche ich einfach nicht)

Wofür? Um auf einer einzelnen seriellen Leitung (über RS485) mehrere Regler zu lesen. (bisher)

Hast du noch andere Ideen, was fehlt?

PS: Die Victron-Welt kann mit dem aggregierten Stream natürlich nichts anfangen!

1 „Gefällt mir“

das hier 10mA stehen hast du gesehen?

Wenn es nur darum geht ein paar Monitoring Daten ins Smart Home etc. zu bringen ist BLE Beacons auslesen deutlich bequemer.

Du verwendest das aber vermutlich um deine soyosource nulleinspeisung zu regeln und ggfs wenn die Batterie langsam voll wird anhand den MPPT Leistungsdaten mehr als null einzuspeisen?

Steuerung über den Hex Modus um z.B. Temperatur gesteuert den ladestrom zu begrenze wäre vermutlich sehr praktisch.

Ich mache so etwas über ESP32 und ESP-Home um den Speicher, der draußen steht, im Hochsommer ehh immer voll wird, prognosegesteuert langsamer laden zu lassen bzw. bei zu hohen Temperaturen (HEX Modus gibt die interne Temperatur vom MPPT Laderegler aus) auch zu drosseln.

Ich habe da aber auch noch nen ADUM1201 dazwischen.

Nein, ich hatte falsche 100 mA im Kopf! Gut zu wissen, ich werde alle MEGA(s) immer an einen stepdown hängen.

Ich verwende keine Funkstrecken in meinen Regelungen: kein BLE

Der Grund, wozu ich einen Rückkanal haben wollen würde, ist ziemlich krude:
ich will an der Anlage nichts grundlegend verändern, aber trotzdem mehr PV-Leistung.
Um die volle Batterie zu "schonen" reicht mir die Regelkurve der Regler.
Aber der Strom in die Batterie (und die Kabel dahin) machen mir Sorgen: Schönwetterprobleme

Übrigens werden es mehr Regler, weil ich mehr Tracker verwenden will.
(Parallele Strings mit unterschiedlicher Ausrichtung trennen.)
Da das VE.direct Protokoll reichlich Luft in der Leitung hat, kam mir der Gedanke zu aggregieren, da ich die Daten ohnehin selbst parse.

1 „Gefällt mir“

In der aktuellen Version gibt es jetzt auch einen Rückkanal zu den Reglern.
Ausserdem noch eine Version für den teensy 4.1, der bietet 7+1 serielle Ports.

Freue mich auf euer feedback!

Danke schon mal fürs teilen, das klingt richtig interessant.

Ich habe meine neue Hardware (mppt) noch nicht, wird auch noch dauern. Aber ich könnte mir vorstellen, deine projekt zu nutzen und einen dbus Treiber zu schreiben, dann könnte man den auch in venusos nutzen

Freut mich, wenn es auch jemand anderes gebrauchen kann!

Aktueller Stand:
die readtext variante ist durchgetestet und absolut stabil. (mangels teensy nur mit mega getestet)
sendtext ist noch nicht ganz durchgetestet

Für dich interessant: ein de-aggregator für venus os ist auch schon fast fertig: auf basis virtueller ports.
Denkst du, dbus wäre besser?

Wenn du das auf virtuelle ports aufteilst, ist das wahrscheinlich der bessere Weg, denn dann ist man unabhängiger von Änderungen im Venus os, fall sich da mal was ändert, denn der virtuelle ports wird sich ja annähernd so verhalten, wie ein physikalischer port.

Daher finde ich den Weg wesentlich besser:)

Ich hatte erst gedacht, man könnte mqtt als bridge nehmen, denn da gibt es schon was fertiges, fand den Umweg aber unnötig, weil es dann ja auch 2 mal im mqtt erscheint. Daher hatte ich an eine direkte multiplexer bridge auf dbus gedacht, aber wie geschrieben, deine Idee ist viel besser

So, mein mega ist jetzt auch da, die mppt’s sind unterwegs..

Dummerweise habe ich einen dc dc wandler auf 5v gekauft, braucht aber lt. Doku 7v. Aber ich fange erst mal mit usb spannung vom raspi an. Für die ersten Schritte sollte das reichen.

Nochmal zur verkabelung, du schreibst oben was von rs485, da reichen dann doch rx auf tx und tx auf rx, oder nicht?

DeIn de-aggregator, baust du den in python oder ist das in der firmware und der mega verhält sich dann wie ein usb hub?

Gruß

Dirk

Hi Dirk, ich habe auch einen 5V DC-DC wandler dran, funktioniert einwandfrei.

Der de-aggregator ist in python geschrieben.
Eigentlich ist das auch alles schon fertig und getestet! War knifflig, aber jetzt läuft alles.

Sobald ich dazu komme, lese ichs nochmal durch und lade es hoch!
Morgen vielleicht schon! :slight_smile:

Super, aber mach kein Stress….

Hast du den wandler auf Vin oder 5v angeschlossen? Habe beides schon gelesen…

Hast du jetzt nur rx auf tx oder auch gnd und 5v bei den ve kabeln angeschlossen?

Edit: ich habe mir jetzt noch mal ein anderen dc wandler und ADUM1201 bestellt, idt sicherer

Der DC-DC Wandler ist an der DC-Hohlbuchse vom elegoo board angelötet.

An den seriellen ports 1,2,3 habe ich rx, tx und gnd, daran sollen die mppts.
Für ser0 (der "Datenausgang") ist auch 5v mit belegt, damit der rs-485-Wandler versorgt wird.

Es sind jetzt zumindest alle scripte und die firmwares auf github, die Texte kommen...
Viel Spaß beim basteln!

Ah ok, ich habe einen mega 2560 pro, der kann, so wie ich das verstanden habe direkt an den raspi per usb angeschlossen, per serial kommunizieren, ich dachte, das brauche ich dann nicht noch rs485. Will ja auch keine grossen strecken überbrücken.

vedirect_deaggregator.py ist aber noch nicht auf github?

Ja, der USB und ser0 teilen sich einen Kanal, aber immer nur eins von beiden nutzen. Wird beim mega automatisch erkannt, beim teensy gibts ein Flag. Bei USB-Betrieb brauchts keine weitere Stromversorgung!

Der Deaggregator ist jetzt auch verfügbar. Ich freue mich auf Feedback! :wink:

PS: Wenn du ohnehin USB benutzen willst und kurze Kabel hast, solltest du lieber jeden seriellen Port auf einen echten (multi) ser->usb Konverter legen. Da brauchst du die komplette Aggregation nicht! Kann man natürlich auch ohne Aggregation mit dem mega machen. (z. B. https://de.aliexpress.com/item/1005010477791223.html, Pegelwandler nicht vergessen.)

Ok, du meinst den verlinkten 4fach usb2ttl wandler, dann die ADUM1201 jeweils davor und ich habe direkt die 3 usb eingänge am raspi, die das venus os erkennt?

Das wäre ja einfach…..

Wenn die mppt an der gleichen Batterie (Potential) hängen, brauchst du die Adum nicht. Ich würde schwer davon ausgehen, dass der ser->usb Konverter eine galvanische Trennung gegen USB mitbringt. Der verlinkte scheint sogar 5V zu vertragen, damit spart man auch noch den Levelshifter. Klartext: Kabel (mit JST PH2.0 Stecker) dranlöten, fertig.