Die VDV-Schrift 454 (vollständig: "Ist-Datenversorgung – Fahrgastinformation und Anschlusssicherung") ist ein vom Verband Deutscher Verkehrsunternehmen (VDV) definierter Standard für den Austausch von Echtzeit-Betriebsdaten im öffentlichen Personennahverkehr (ÖPNV).
Im Kern definiert VDV 454 ein XML-basiertes Nachrichtenformat, mit dem Leitsysteme Ist-Daten zu Fahrten, Haltestellen, Prognosen, Fahrzeugformationen und Belegungsgraden an nachgelagerte Systeme übermitteln.
VDV 454 arbeitet nach dem Prinzip DatenAbrufen / DatenAbrufenAntwort:
Ein Clientsystem stellt periodisch Anfragen (DatenAbrufen) an das Leitsystem,
das daraufhin mit einer DatenAbrufenAntwort antwortet. Jede Antwort enthält
die aktuellen Ist-Daten zu allen überwachten Fahrten.
Für jede Fahrt werden im Laufe des Betriebstages mehrere Telegramme empfangen.
Jedes Telegramm trägt einen Zeitstempel (Bestaetigung.Zst) und enthält den
jeweils aktuellen Stand aller Haltestellen dieser Fahrt. Spätere Telegramme
verfeinern oder korrigieren frühere Prognosen.
Komplettfahrt = true signalisiert,
dass dieses Telegramm den vollständigen Datensatz einer neuen Fahrt-Instanz enthält.
Wird ein zweites Komplettfahrt-Telegramm für denselben FahrtBezeichner
empfangen, beginnt eine neue logische Fahrt (z. B. nächster Umlauf).
Die folgende Baumdarstellung zeigt die vollständige Hierarchie einer DatenAbrufenAntwort,
wie sie von unserer Anwendung verarbeitet wird:
Die von unserer Anwendung verarbeiteten VDV-454-Daten lassen sich in vier Bereiche gliedern:
Kerninformation jeder IstFahrt:
| Element | Bedeutung |
|---|---|
FahrtBezeichner | Eindeutiger Bezeichner der Fahrt |
Betriebstag | Datum im Format YYYY-MM-DD |
LinienID / LinienText | Liniennummer und -name |
RichtungsID | Fahrtrichtung (Hin/Rück) |
UmlaufID | Umlauf-Kennung des Fahrzeugs |
Betreiber | Betreiberkennung |
Komplettfahrt | true = vollständiger Datensatz |
Zusatzfahrt | Außerplanmäßige Fahrt |
FaelltAus | Fahrt wurde gestrichen |
Je IstHalt einer Fahrt:
| Element | Bedeutung |
|---|---|
HaltID | Eindeutige Haltestellen-ID |
Abfahrtszeit | Soll-/Ist-Abfahrtszeit |
IstAbfahrtPrognose | Prognostizierte Abfahrtszeit |
IstAbfahrtPrognoseStatus | Real = tatsächlich gemessen, sonst Prognose |
Besetztgrad | Auslastung auf Haltestellenebene |
Einsteigeverbot | Kein Einstieg an dieser Hst |
Aussteigeverbot | Kein Ausstieg an dieser Hst |
Durchfahrt | Fahrt hält nicht |
Der optionale Block IstFormation beschreibt den Zugverband:
| Teilbereich | Inhalt |
|---|---|
FoFahrzeuge | Liste der Fahrzeuge mit ID, Typ und Ausstattung (Sitzplätze, Stehplätze) |
FoFahrzeugGruppen | Gruppierung in Zugteile mit Start-/Zielhaltestelle und Fahrzeugpositionen |
FoFahrzeugGruppenFahrtAbschnitte | Streckenabschnitte (Start-/Endhaltestelle), in denen die Formation gilt |
FoHalte | Welche Fahrzeuge an welcher Haltestelle bei Ab-/Ankunft stehen, inkl. Barrierefreiheit |
FoFahrzeugBelegungFahrtAbschnitte | Prozentuale Belegung je Fahrzeug und Streckenabschnitt |
Zeitliche Dimension durch wiederholte Telegramme:
| Aspekt | Beschreibung |
|---|---|
| Telegramm-Zeitstempel | Bestaetigung.Zst – Wann wurde dieses Telegramm erzeugt? |
| Prognose-Status | IstAbfahrtPrognoseStatus = "Real" bei gemessenen Werten |
PrognoseMoeglich | Gibt an, ob das Leitsystem eine Prognose berechnen kann |
| Belegungsprognose | Prozentuale Fahrzeugbelegung (FoBelegungProzentual) über mehrere Telegramme hinweg |
Obwohl VDV 454 einen einheitlichen XML-Standard definiert, liefern verschiedene Leitsysteme die Daten in unterschiedlichen Transportformaten:
| Format | Endung | Beschreibung | Besonderheiten |
|---|---|---|---|
| XML | .xml |
Natives XML-Format. Jede Datei enthält eine oder mehrere DatenAbrufenAntwort-Blöcke als vollständiges XML-Dokument. |
Wird mit XDocument.Load() geladen. Encoding: UTF-8. |
| LOG | .log |
Textbasierte Logdateien, in denen XML-Telegramme eingebettet sind. Typisch für Mitschnitte aus Leitsystemen. |
Zwei Varianten:
|
| XMLLOGS | .xmllogs |
Hybridformat: Logdatei mit XML-Fragmenten. Wird wie LOG-Dateien verarbeitet. | Gleiche Parsing-Logik wie .log |
| ZIP | .zip |
Archiv mit beliebigen der obigen Formate. Wird vor der Verarbeitung automatisch entpackt. | Entpackung in temporären Ordner |
| Quellsystem | Erkennung | Encoding | Besonderheit |
|---|---|---|---|
| Lumino | Logzeile enthält den String "lumino" (case-insensitive) | Latin1 (ISO 8859-1) | Umlaute in Haltestellennamen werden als Latin1 kodiert; ohne Erkennung würden Sonderzeichen fehlerhaft dargestellt |
| INIT | Implizit durch XML-Namespace http://www.init-ka.de/accessibility in den Barrierefreiheits-Daten |
UTF-8 | Liefert Barrierefreiheits-Erweiterung (Zugaenglichkeit) als herstellerspezifisches XML-Namespace-Element |
| Andere / Standard | Kein spezieller Marker erkannt | UTF-8 (Fallback) | Standard-VDV-454-Verarbeitung ohne Sonderbehandlung |
Da unterschiedliche Quellsysteme XML-Elemente in variierender Gross-/Kleinschreibung liefern,
normalisiert die Anwendung alle Element-Namen auf Kleinbuchstaben
(TransformToLowerCaseElements), bevor sie per XPath gesucht werden.
Die anschliessende XmlSerializer-Deserialisierung arbeitet jedoch case-sensitiv auf den
Original-Daten.
Die Verarbeitung durchläuft folgende Stufen:
FileSystemWatcherFür jede Fahrt sendet das Leitsystem über den Betriebstag hinweg wiederholt Telegramme mit aktualisierten Belegungsdaten. Je näher die tatsächliche Abfahrt an einer Haltestelle rückt, desto genauer wird die Prognose. Die Anwendung analysiert, wie sich die Belegungsprognose im zeitlichen Verlauf verändert.
Um die zeitliche Distanz zwischen Telegramm-Erstellung und tatsächlicher Abfahrt zu kategorisieren, werden Zeitscheiben definiert:
| Zeitscheibe | Bedingung | Bedeutung |
|---|---|---|
| 30 | Differenz ≥ 30 Minuten | Frühe Prognose – größte Unsicherheit |
| 15 | Differenz ≥ 15 Minuten | Vorab-Prognose |
| 10 | Differenz ≥ 10 Minuten | Mittelfristige Prognose |
| 5 | Differenz ≥ 5 Minuten | Kurzfristige Prognose |
| 1 | Differenz ≥ 1 Minute | Nahezu Echtzeit |
| 0 | Differenz ≥ 0 Minuten | Echtzeit / Ist-Wert |
Differenz (Min.) = Abfahrtszeit an Haltestelle - Telegramm-Zeitstempel (Bestaetigung.Zst)
Beispiel:
Abfahrt an Hst "Marktplatz": 08:45:00
Telegramm-Zeitstempel: 08:14:30
Differenz: 30.5 Minuten
=> Zeitscheibe: 30
BesetztgradFromPreviousZeitscheibe kennzeichnet
solche übertragenenen Werte.
Der Import erzeugt pro Fahrt-Instanz zwei JSON-Dateien:
| Datei | Namensschema | Inhalt | Verwendung |
|---|---|---|---|
| Kopf | {FahrtBezeichner}_{FahrtNr}_kopf.json |
Fahrt-Metadaten + Fahrzeugliste aus Formation (keine Telegramm-Details) | Schnelle Übersicht, Fahrten-Tabelle in der UI |
| Alles | {FahrtBezeichner}_{FahrtNr}_alles.json |
Vollständige Fahrt mit allen empfangenen Telegrammen (FahrtRows) | Detailansicht, Formation, Prognose-Auswertung |
| Meta | _vdv454_import_YYYYMMDD.json |
Import-Metadaten (Betriebstag, Zeitpunkt, Anzahl Fahrten, Fehler) | Import-Protokoll, Betriebstag-Suche |
Datenordner/
└── 2024/
└── 03/
└── 15/ (Betriebstag)
├── L10001_1_kopf.json
├── L10001_1_alles.json
├── L10002_1_kopf.json
├── L10002_1_alles.json
├── L10001_2_kopf.json (2. Umlauf gleiche Linie)
├── L10001_2_alles.json
└── _vdv454_import_20240315.json
Der BetriebstagPrognoseProcessor liest die *_alles.json-Dateien
eines Betriebstages und erzeugt pro Fahrt eine CSV-Datei mit der aggregierten Belegungsprognose:
| CSV-Spalte | Quelle | Beschreibung |
|---|---|---|
LinienId | IstFahrt | Liniennummer |
RichtungsId | IstFahrt | Fahrtrichtung |
Fahrtbezeichner | FahrtRef | Eindeutige Fahrt-Kennung |
FahrtStart | FahrtStartEnde | Startzeit (YYYY-MM-DD HH:MM:SS) |
FahrtEnde | FahrtStartEnde | Endzeit |
UmlaufId | IstFahrt | Umlauf-Kennung |
HaltId | IstHalt | Haltestellen-ID |
Zeitscheibe | berechnet | 0, 1, 5, 10, 15 oder 30 |
AbfahrtszeitReal | IstHalt (Status=Real) | Tatsächliche Abfahrtszeit |
FahrzeugId | IstFormation | Fahrzeug-Kennung |
FzgUicOrdnungsnummer | IstFormation | UIC-Wagennummer |
Besetztgrad | FoBelegungProzentual | Belegung in Prozent |
BesetztgradFromPreviousZeitscheibe | berechnet | "Ja" wenn aus größerer Zeitscheibe übernommen |
AbfahrtszeitReal →
FahrzeugId → HaltId → Zeitscheibe (absteigend) sortiert.
Trennzeichen ist Semikolon (;).
Die Anwendung bietet drei Ansichten für die importierten Daten:
Fahrten-Ansicht
Formation (Belegungsgrad)
Formation (Barrierefreiheit)
Fahrt-Detail (Mehrfach-Telegramme)
| Ansicht | VDV-454-Datenbasis | Darstellung |
|---|---|---|
| Fahrten | IstFahrt → IstHalt (Abfahrtszeiten, Prognose, Status) | Zeilen = Telegramme, Spalten = Haltestellen. Farben zeigen Prognose-Status und Besetztgrad. |
| Formation | IstFormation (FoHalte, Belegung, Barrierefreiheit) | Zeilen = Fahrzeugpositionen, Spalten = Haltestellen. Umschaltbar zwischen Barrierefreiheit und Belegungsgrad. |
| Fahrt-Detail | Mehrere IstFahrt mit gleichem FahrtBezeichner aber verschiedener FahrtNr | Mehrere Telegramm-Blöcke nebeneinander. Einzeln ein-/ausblendbar über Checkboxen. |
| VDV-454-Begriff | Bedeutung im Kontext dieser Anwendung |
|---|---|
DatenAbrufenAntwort |
Wurzelelement jeder VDV-454-Nachricht. Enthält eine Bestaetigung und die eigentlichen Nutzdaten (AUSNachricht). Jede empfangene Antwort wird als ein "Telegramm" bezeichnet. |
AUSNachricht |
Container für ausgehende Nachrichten innerhalb einer DatenAbrufenAntwort. Enthält eine oder mehrere IstFahrt-Einträge. |
Bestaetigung |
Kopfbereich mit Zeitstempel (Zst), Ergebniscode und Fehlernummer. Der Zeitstempel dient als Telegramm-Zeitpunkt. |
IstFahrt |
Ein Ist-Datensatz zu einer einzelnen Fahrt. Enthält die Fahrt-Referenz, alle Haltestellen und optional die Formation. |
FahrtRef / FahrtID |
Eindeutige Referenz einer Fahrt, bestehend aus FahrtBezeichner (z. B. "L10001") und Betriebstag. |
Betriebstag |
Verkehrlicher Tag (YYYY-MM-DD). Kann vom Kalendertag abweichen (Nachtverkehr zählt oft noch zum Vortag). |
IstHalt |
Ist-Daten einer Haltestelle: Zeiten, Prognosen, Steig, Ein-/Aussteigeverbote, Durchfahrt, Besetztgrad. |
Komplettfahrt |
Boolean-Flag. true = das Telegramm enthält den vollständigen Haltestellenverlauf. Bei erneutem true für gleichen FahrtBezeichner beginnt eine neue Fahrt-Instanz (neuer Umlauf). |
PrognoseMoeglich |
Boolean. Gibt an, ob das Leitsystem für diese Fahrt eine Echtzeitprognose berechnen kann. Wird in der UI als 3-State-Checkbox dargestellt. |
IstAbfahrtPrognose |
Prognostizierte Abfahrtszeit. Wird anstelle der Soll-Abfahrt angezeigt, solange PrognoseMoeglich = true. |
IstAbfahrtPrognoseStatus |
"Real" = tatsächlich gemessener Wert (Fahrzeug hat die Haltestelle bereits passiert). Andere Werte (z. B. "Prognose") = berechnete Schätzung. |
Besetztgrad |
Auslastungsgrad einer Fahrt oder Haltestelle als Freitext-String auf Fahrtebene bzw. als prozentuale Zahl (FoBelegungProzentual) auf Fahrzeugebene in der Formation. |
IstFormation |
Optionaler Block mit der vollständigen Fahrzeugformation: Fahrzeuge, Gruppen, Abschnitte, Haltestellen-Zuordnung, Barrierefreiheit und Belegung. |
FoFahrzeug |
Ein Fahrzeug in der Formation, identifiziert durch FoFahrzeugID. Enthält Typ und Ausstattung (Sitz-/Stehplätze). |
FoFahrzeugGruppe |
Ein Zugteil (Traktion) mit eigener Start-/Zielhaltestelle. Enthält die Positionierung der zugehörigen Fahrzeuge. |
FoFahrzeugGruppenFahrtAbschnitt |
Streckenabschnitt, in dem eine bestimmte Fahrzeugkonfiguration gilt. Definiert durch Start- und Endhaltestelle. |
FoHalt |
Formationsinformationen an einer Haltestelle: Welche Fahrzeuge stehen bei Abfahrt/Ankunft, mit Barrierefreiheits-Status. |
Zugaenglichkeit / Barrierefreiheit |
INIT-spezifische Erweiterung (Namespace init-ka.de/accessibility). Boolean: true = Fahrzeug ist barrierefrei zugänglich. |
FoBelegungProzentual |
Prozentuale Belegung eines Fahrzeugs in einem Streckenabschnitt. Basis für die Belegungsprognose-Auswertung. |
FoAnkunftGleichAbfahrt |
Boolean. true = An dieser Haltestelle entspricht die Ankunftsformation der Abfahrtsformation (kein Rangieren). |
Einsteigeverbot |
Boolean. true = An dieser Haltestelle dürfen keine Fahrgäste einsteigen. |
Aussteigeverbot |
Boolean. true = An dieser Haltestelle dürfen keine Fahrgäste aussteigen. |
Durchfahrt |
Boolean. true = Das Fahrzeug hält nicht an dieser Haltestelle (fährt durch). |
UmlaufID |
Kennung des Fahrzeugumlaufs. Ein Umlauf umfasst alle Fahrten, die ein Fahrzeug an einem Betriebstag absolviert. |
Zusatzfahrt |
Boolean. true = Diese Fahrt ist nicht im Fahrplan vorgesehen (Verstärkerfahrt, Sonderfahrt). |
FaelltAus |
Boolean. true = Die ursprünglich geplante Fahrt wurde gestrichen. |
Zeitscheibe |
Anwendungsspezifischer Begriff (kein VDV-Standard): Zeitliche Kategorie der Prognosedistanz (0, 1, 5, 10, 15, 30 Minuten). |
Telegramm |
Umgangssprachlich für eine einzelne DatenAbrufenAntwort. Mehrere Telegramme pro Fahrt und Betriebstag sind der Normalfall. |
VDV 454 Kontext-Dokument — generiert aus der Codebase-Analyse