VE.direct Aggregator

Aus "purer Not" heraus :wink: habe ich dieses Projektchen gestartet:

VE.Direct Aggregator

Firmware für Arduino Mega 2560, o.ä.


Der VE.Direct Aggregator ist eine Firmware für den Arduino Mega 2560, die mehrere Victron MPPT-Solarladeregler über ihre serielle VE.Direct-Schnittstelle einliest und die Datenströme zu einem einzigen seriellen Ausgang zusammenführt. Statt mehrerer separater serieller Verbindungen zum Auswertesystem genügt eine einzige.


Funktionen

Mehrkanal-Eingang

Drei Hardware-UARTs des Mega (Serial1, Serial2, Serial3) werden gleichzeitig abgefragt. Jeder Kanal puffert seinen Datenstrom unabhängig — ein langsamer oder zeitweise fehlender Regler blockiert die anderen nicht.

Automatische Port-Typerkennung

Beim Start liest die Firmware die ersten eintreffenden Zeichen auf jedem Port und entscheidet einmalig, ob ein direkter MPPT-Regler oder ein vorgelagerter Aggregator angeschlossen ist. Eine manuelle Konfiguration ist nicht erforderlich.

Port empfängt "---\t..."  →  UPSTREAM  (vorgelagerter Aggregator)
Port empfängt "PID\t..."  →  DIRECT    (direkter MPPT-Regler)

Nach der Erkennung bleibt der Typ für die gesamte Laufzeit fest. Topologieänderungen erfordern einen Neustart.

Serieller Ausgang

Alle gepufferten Blöcke werden sequenziell über Serial0 TX (Pin 1) ausgegeben. Da immer nur ein Block auf einmal gesendet wird, gibt es keine Kollisionen.

Kaskadierfähigkeit

Durch die automatische Typerkennung können mehrere Aggregatoren in Stern- oder Kaskadenform verbunden werden, ohne dass der Code angepasst werden muss.


Unterstützte Topologien

Direkt — bis zu 3 Regler an 1 Mega

MPPT 1 ─TX──► [Mega] RX1
MPPT 2 ─TX──► [Mega] RX2  ──► TX0 ──► Ausgang
MPPT 3 ─TX──► [Mega] RX3

Stern — bis zu 9 Regler, 3 Megas an 1 zentralen Mega

MPPT 1─3 ──► [Mega 1] ──TTL──┐
MPPT 4─6 ──► [Mega 2] ──TTL──┼──► [Mega 4] ──► Ausgang
MPPT 7─9 ──► [Mega 3] ──TTL──┘

Mega 1–3 sitzen nah bei ihren Reglern. Mega 4 führt die drei kurzen TTL-Verbindungen zu einem einzigen seriellen Ausgang zusammen.

Kaskade — bis zu 9 Regler, 3 Stufen hintereinander

MPPT 1─3 ──► [Mega 1] ──► [Mega 2] ──► [Mega 3] ──► Ausgang
                3 Blöcke    6 Blöcke     9 Blöcke

Ausgangsformat

Vor jedem Paket wird ein Marker gesendet, der die Anzahl der enthaltenen VE.Direct-Blöcke angibt:

---\tN\r\n          ← Marker: N Blöcke folgen
PID\t0xA053\r\n     ┐
VPV\t18240\r\n      │ Block 1 (Regler 1)
PPV\t120\r\n        │
...\r\n             │
Checksum\tX\r\n     │
\r\n                ┘
PID\t0xA060\r\n     ┐
...                 │ Block 2 (Regler 2)
\r\n                ┘

Jeder VE.Direct-Block endet mit \r\n\r\n — zwei aufeinanderfolgende \n signalisieren das Blockende.

Der Marker ---\tN ist kein VE.Direct-Feld. Standard-VE.Direct-Parser ignorieren ihn im else: pass-Zweig ohne Fehler.


Timing-Budget bei 19200 Baud

VE.Direct sendet einmal pro Sekunde. Ein typischer Block (~200 Bytes) belegt ~83 ms Übertragungszeit.

Regler Übertragungszeit Auslastung Puffer
1 ~83 ms 8 % 917 ms
3 ~249 ms 25 % 751 ms
6 ~498 ms 50 % 502 ms
9 ~747 ms 75 % 253 ms
12 ~996 ms ~100 % :warning:

Bei 12 Reglern und 19200 Baud wird das 1-Sekunden-Fenster vollständig ausgeschöpft. Die praktische Grenze liegt bei 9 Reglern, was einem komfortablen Puffer von 25 % entspricht.


Pinbelegung Arduino Mega 2560

Pin Signal Beschreibung
RX1 (19) Regler / Upstream 1 TX Serial1 — Hardware UART
RX2 (17) Regler / Upstream 2 TX Serial2 — Hardware UART
RX3 (15) Regler / Upstream 3 TX Serial3 — Hardware UART
TX0 (1) Ausgang Serial0 — aggregierter Stream
GND Masse alle Eingänge gemeinsame Masse
5V Versorgung von VE.Direct Pin 4

VE.Direct verwendet 5V TTL — direkt kompatibel mit dem Arduino Mega. Kein Pegelwandler erforderlich. Die 5V-Versorgung (max. 100 mA) von einem der Regler reicht für den Mega.

VE.Direct Steckerbelegung (JST-PH 2 mm, 4-polig)

Pin Signal Verwendung
1 GND an Mega GND
2 TX (Ausgang) an Mega RX1/2/3
3 RX (Eingang) nicht belegt
4 +5V Versorgung Mega

Puffergröße

Eingangstyp Puffergröße Kapazität
DIRECT 512 Bytes 1 VE.Direct-Block
UPSTREAM 2048 Bytes bis ~9 Blöcke (Kaskade)

Technische Daten

Parameter Wert
Zielplattform Arduino Mega 2560 (ATmega2560, 16 MHz)
Baudrate Eingänge 19200 Baud, 8N1
Baudrate Ausgang 19200 Baud, 8N1
Max. Eingänge 3 × Hardware-UART
Max. Regler (Direkt) 3
Max. Regler (Stern) 9
Max. Regler (Kaskade) 9
Typerkennung automatisch, einmalig beim Start
Stromversorgung 5V von VE.Direct Pin 4
CPU-Auslastung < 1 % bei 3 Reglern
Latenz < 1 Block-Periode (~83 ms)

Benötigte Hardware

Bauteil Hinweis
Arduino Mega 2560 Clone z.B. Elegoo, ~10–20 €
JST-PH 2 mm Kabel 4-polig, für VE.Direct-Anschlüsse

Einschränkungen

  • Topologieänderungen erfordern Neustart aller betroffenen Megas
  • Bei Kaskade muss der letzte Mega Serial0 ausschließlich als Ausgang nutzen — kein Debug über USB während des Betriebs
  • Baudrate auf allen Stufen identisch (19200 Baud)
  • VE.Direct-Protokoll Text-Modus only — HEX-Modus wird nicht unterstützt

und womit auslesen?

Soweit also die Theorie, wenn ichs getestet haben, lasse ichs euch wissen.

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!

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“