Bus Roringen Open Data

Zurück zur Statistik

Statistik & Open Data

Schnittstelle und Felder

Schnittstellen-Version 3 · Stand: 25. September 2026

Alle Zahlen der Statistik-Seite gibt es auch maschinenlesbar – als JSON und als CSV, ohne Anmeldung und ohne Schlüssel. Diese Seite beschreibt, was wo steht, in welchen Einheiten und unter welcher Lizenz.

1. Endpunkte

Alle Adressen beginnen mit https://bus.roringen.de/. Abrufe von anderen Websites sind erlaubt (CORS: Access-Control-Allow-Origin: *). Bitte nicht öfter als nötig abrufen – die Auswertung ändert sich höchstens alle 15 Minuten, die Abfahrten je Haltestelle einmal am Tag.

statistik.php
Die gesamte Auswertung als JSON (Felder) Neu berechnet: alle 15 min
statistik.php?halt=000009034027
Eine Haltestelle: Pünktlichkeit, „Wie früh da sein?“, Stunden, alle Plan-Abfahrten als JSON (Felder) Neu berechnet: täglich ab 4 Uhr
statistik.php?export=zuverlaessigkeit
Kommt der Bus? Je Tag und eigener Haltestelle: geplante Fahrten nach Status, größte Lücke, Glättestunden, Fahrgastmeldungen (CSV, Status) Neu berechnet: täglich ab 4 Uhr
statistik.php?export=ereignisse
Ereignisse: mindestens zwei ausgefallene Fahrten hintereinander an einer der drei Haltestellen (CSV) Neu berechnet: täglich ab 4 Uhr
statistik.php?export=ereignisse-feed
Die neuesten 50 Ereignisse als Atom-Feed (für Feedreader) Neu berechnet: täglich ab 4 Uhr
statistik.php?export=fahrtstatus&tag=2026-09-24
Jede geplante Fahrt eines Betriebstags mit Status, an den eigenen Haltestellen zusätzlich je Halt (CSV), die letzten 90 Tage Neu berechnet: täglich ab 4 Uhr
statistik.php?export=linien
Pünktlichkeit je Linie, 7 und 30 Tage (CSV) Neu berechnet: alle 15 min
statistik.php?export=halte
Verspätung je Haltestelle entlang jeder Linie und Richtung, 30 Tage (CSV) Neu berechnet: alle 15 min
statistik.php?export=abschnitte
Zuwachs der Verspätung zwischen zwei Haltestellen, 30 Tage (CSV) Neu berechnet: alle 15 min
statistik.php?export=stunden
Wochentag × Stunde je Linie, 30 Tage (CSV) Neu berechnet: alle 15 min
statistik.php?export=abfahrten
Jede Plan-Abfahrt an jeder Haltestelle, 30 abgeschlossene Tage (CSV) Neu berechnet: täglich
statistik.php?export=halt&halt=ID
Dasselbe für eine Haltestelle (CSV) Neu berechnet: täglich
statistik.php?export=tage
Je Betriebstag und Linie seit Beginn der Sammlung (CSV) Neu berechnet: täglich
statistik.php?export=kalender
Je Kalendertag: Tagesart, Pünktlichkeit, Ausfälle, Datenlage, Wetter (CSV) Neu berechnet: alle 15 min
statistik.php?export=monate
Je Monat und Linie (CSV) Neu berechnet: täglich
statistik.php?export=wetter
Wetter je Stunde für Roringen (CSV, Open-Meteo) Neu berechnet: täglich
statistik.php?export=fahrgaeste
„Wie voll?“-Angaben, zusammengefasst (CSV) Neu berechnet: alle 15 min
statistik.php?export=json
Die Auswertung als Datei zum Speichern Neu berechnet: alle 15 min
statistik.php?rohdaten=2026-09-24
Alle Einzelwerte eines Betriebstags (CSV, Spalten), die letzten 90 Tage Neu berechnet: laufend

Fehler kommen als JSON ({"error": "…"}) mit HTTP-Status: 400 ungültiger Parameter, 404 unbekannter Export, keine Rohdaten für den Tag oder (beim CSV export=halt) keine Abfahrten für die Haltestelle, 405 andere Methode als GET. ?halt= ohne Abfahrten antwortet dagegen normal, mit "window": null und leeren Listen.

2. Einheiten und Begriffe

Wie die Werte entstehen und wo ihre Grenzen liegen, steht auf der Statistik-Seite unter So entstehen die Zahlen.

3. Die Auswertung (JSON)

statistik.php liefert ein Objekt mit diesen Feldern. Werte, die es (noch) nicht gibt, sind null; Listen können leer sein.

api_version
Version der Schnittstelle (3; seit 25.09.2026 mit reliability und den Exporten zur Zuverlässigkeit – alle Felder der Version 2 bleiben unverändert). Neue Felder kommen ohne neue Version dazu; ändert sich die Bedeutung eines Felds, steigt die Version.
generated, today, since, source
Zeitpunkt der Berechnung, heutiges Datum, Beginn der Sammlung, Datenquelle
license
Lizenzen und Namensnennungen für Verspätungen, Fahrgastangaben und Wetter
definition
Grenzen „pünktlich“ in s, Klassenbreite, Linien, Mindestzahl für Vergleiche
windows["7"], windows["30"]
Zeitfenster (heute eingeschlossen) mit days, from, to, days_with_data, all (alle Linien) und lines[]. Je Eintrag: trips (Fahrten im Datenstrom), trips_rt (mit Echtzeit), canceled, added, no_schedule, skipped_stops, n (Abfahrten), mean, p50, p90 (s), on, early, late (%)
profiles[]
Verlauf je Linie und Richtung (30 Tage): id („91|0“), line, dir, from, to, trips, variant_trips (Fahrten der gezeigten Haltefolge) und stops[] mit key, id, name, n, mean, p50, p90, on und seg (Abschnitt vom vorigen Halt: n, mean Zuwachs s, grew % mit mehr als 60 s Zuwachs, plan Planzeit s)
segments[]
Die zehn Abschnitte mit dem größten mittleren Zuwachs (ab 5 Fahrten, 30 Tage): line, dir, profile (Kennung wie bei profiles), towards (Ziel der Richtung), from, to, from_key, to_key, n, mean, grew, plan wie bei seg
network
Netzkarte (30 Tage, Abschnitte ab 3 Fahrten, alle Linien zusammen): stops (ID ohne Nullen → [Name, Breite, Länge]) und segs[] als [von, nach, Fahrten, mittlerer Zuwachs s, Planzeit s, % mit mehr als 60 s Zuwachs, „Linien,kommagetrennt“]
heatmap
30 Tage, all und je Linie: „Wochentag:Stunde“ (1 = Montag, 7 = Sonntag; Plan-Uhrzeit am Halt, nach Mitternacht zählt der neue Kalendertag) → [Abfahrten, Mittel s, pünktlich %]
rush
Berufsverkehr (30 Tage, nach Wochentag, Feiertage zählen hier nicht gesondert): morgens (Mo–Fr 6–9 Uhr), nachmittags (Mo–Fr 15–18 Uhr), sonst_werktags, wochenende mit n, mean, on
trend
Je Tag (60 Tage): dates[], all[] und lines{} parallel dazu als [Abfahrten, pünktlich %, Mittel s] oder null
weeks
Je ISO-Woche: weeks[] („2026-W39“), days[] (Tage mit Daten), all[], lines{} wie bei trend
daytypes
Je Tagesart (schule, ferien, werktag, sa, so) über alle Tage seit Beginn: days, n, mean, on, early, lines{} als [Abfahrten, pünktlich %, Mittel s]. Die Seite vergleicht erst ab definition.min_type_departures Abfahrten.
school_holidays
next (from, to der laufenden oder nächsten Schulferien), known_until (so weit reicht die Liste), source
weather
Alle abgeschlossenen Tage mit Wetter: days, source, classes und temps mit hours (Stunden mit diesem Wetter), n, mean, on, lines{} wie bei daytypes. Jede Abfahrt zählt zum Wetter ihrer Plan-Stunde in Roringen. schnee: Wettercode 71–77, 85, 86; regen: mindestens 0,1 mm Niederschlag oder Code 51–67, 80–82, ab 95; sonst trocken. frost unter 0 °C, kalt 0 bis unter 10, mild 10 bis unter 20, warm ab 20 °C.
headway[]
Takt je Linie (30 Tage), aus aufeinanderfolgenden Bussen derselben Linie und Richtung am selben Halt, nur bei Planabständen von 2 bis 30 Minuten: line, pairs (Paare), headway_mean (Planabstand s), dev_mean (mittlere Abweichung des tatsächlichen vom geplanten Abstand, s), bunched (% der Paare mit weniger als dem halben Planabstand), gaps (% mit mehr als dem anderthalbfachen)
records
Rekorde, jeweils null ohne genug Daten (ab min_n Abfahrten, der laufende Tag zählt nicht): line_best_7, line_worst_7 (line, on, mean, n), day_best, day_worst (date, on, mean, n), streaks[] (längste Folge von Tagen je Linie mit mindestens streak_on % pünktlich: line, days, from, to, current), canceled_max (date, count)
calendar[]
Je Tag der letzten 120 Tage mit Daten: [Datum, Tagesart, Abfahrten, pünktlich %, Ausfälle, Datenstrom erreichbar %, Regenstunden, Höchsttemperatur °C, Name des Feiertags oder null]
quality
Datenlage: days[] als [Datum, % der Minuten, in denen der Server den Datenstrom abrufen konnte], share_30 (dasselbe über 30 Tage), today (minutes erreichbar von of bisher, share), trips, trips_rt und rt_share_30 (% der Fahrten mit Echtzeit, 30 Tage)
stops[]
Haltestellen mit Abfahrten: id, name, lines[] – für ?halt=
passengers
„Wie voll?“: total, first, last, stops[] bzw. lines[] mit n, median (Personen), by_daytype und by_hour („wd:7“ → [Angaben, Median])
reliability
Kommt der Bus? (Status): codes, stop_names (roringen, menzelberg, nikolausberg), since, windows["7"|"30"|"90"] (abgeschlossene Tage bis gestern) mit from, to, days, events, reports, stops{} (die drei Halte und alle) und lines[] (ganze Fahrten je Linie). Je Eintrag: planned, die Zähler je Status, fail (ausgefallen + ausgelassen + vorher geendet + nicht erschienen), known (mit Aussage), arrived_pct, fail_pct, bei Halten gap_max_s, gap_max_date, fail_days. Dazu season (Wintersaison 1.11.–31.3., wie ein Fenster, mit label, running), ice (Tage mit und ohne Glätte: ice, dry, comparable), daily[] (120 Tage: date, s{} je Halt als [angekommen, Ausfälle, ohne Aussage, größte Lücke s], ice_h, ev, rep), events[] (neueste 60: date, stop, stop_name, from, to, trips, kinds{}, lines[], reports) und definition
raw_days[], months[]
Tage mit Rohdaten (für ?rohdaten=) und Monate mit Monatswerten (JJJJ-MM), jeweils neueste zuerst

3a. Kommt der Bus? Status je Fahrt

Beim Tagesabschluss (ab 4 Uhr für den Vortag) bekommt jede Fahrt, die laut Fahrplan (GTFS von VBN/connect, mit Verkehrstagen) an dem Tag fährt, genau einen Status – für die ganze Fahrt und an jeder der drei eigenen Haltestellen Roringen (000009034027), Am Menzelberg (000009033832) und Auf der Lieth/Nikolausberg (000009033847):

ok · angekommen
Der Datenstrom führte die Fahrt mit echten Echtzeitwerten bis über den Halt hinaus (bis höchstens 5 Minuten vor der verspäteten Planzeit; am Endhalt genügt der Halt davor – der Datenstrom nimmt Fahrten oft kurz vor dem Ende heraus).
canc · ausgefallen
Fahrt im Datenstrom als ausgefallen gemeldet (schedule_relationship = CANCELED).
skip · halt_ausgelassen
Fahrt fand statt, der Halt ist als ausgelassen gemeldet (SKIPPED). Nur an den Halten.
early · vorher_geendet
Echtzeit brach vor dem Halt ab, danach kam nichts mehr (nur, wenn der Server in der Zeit lief). Auch eine ausgefallene Ortung sieht so aus. Nur an den Halten.
miss · nicht_erschienen
Im Fahrplan, nie im Datenstrom – nur, wenn der Server in jeder Stunde der Fahrt mindestens 50 Minuten abrufen konnte, der Datenstrom um die Abfahrt andere Fahrten führte und die Linie an dem Tag mit mindestens 30 % ihrer Fahrten darin vorkam.
norl · ohne_echtzeit
Im Datenstrom, aber nur mit Platzhaltern – fuhr vermutlich, ist aber nicht belegt.
nd · keine_daten
Sonst keine Aussage (Server oder Datenstrom nicht erreichbar, Linie nicht im Datenstrom – etwa die 170).

Die größte Lücke je Tag und Halt ist die längste Zeit zwischen zwei angekommenen Bussen, in der geplante Fahrten ausfielen (bzw. vom letzten angekommenen Bus bis zur letzten ausgefallenen Fahrt). Ein Ereignis sind mindestens zwei ausgefallene Fahrten hintereinander (canc, skip, early oder miss; norl und nd werden übersprungen). Fahrgastmeldungen: Zahl der „Bus fehlt?“-Meldungen des Tags; einem Ereignis zugeordnet, wenn sie bis 30 Minuten davor oder danach eingingen und die Linie passt. Glättestunden: Stunden mit Schneefall, gefrierendem Regen oder Sprühregen (Wettercode 56, 57, 66, 67), Niederschlag bei höchstens 0,5 °C oder mindestens 1 cm Schnee bei höchstens 1 °C.

zuverlaessigkeit (CSV)
datum, halt, halt_name, geplant, angekommen, ohne_echtzeit, ausgefallen, halt_ausgelassen, vorher_geendet, nicht_erschienen, keine_daten, angekommen_prozent (von den Fahrten mit Aussage), groesste_luecke_min, glaette_stunden, fahrgastmeldungen, ereignisse
ereignisse (CSV)
datum, halt, halt_name, von, bis (ISO 8601, Planzeiten der ersten und letzten ausgefallenen Fahrt), fahrten, ausgefallen, halt_ausgelassen, vorher_geendet, nicht_erschienen, linien (leerzeichengetrennt), fahrgastmeldungen
fahrtstatus (CSV)
datum, fahrt_id (GTFS trip_id), linie, abfahrt_plan, status_fahrt, halt (roringen/menzelberg/nikolausberg, leer bei Fahrten ohne diese Halte), halt_plan, status_halt – eine Zeile je Fahrt und eigenem Halt

4. Eine Haltestelle (JSON)

statistik.php?halt=ID (ID mit oder ohne führende Nullen) umfasst die letzten 30 abgeschlossenen Betriebstage; ein Betriebstag gilt ab 4 Uhr am Folgetag als abgeschlossen. Mittel, Median und 90-%-Wert sind hier aus den Einzelwerten gerechnet.

api_version, id, name, license, window
Haltestelle, Lizenz und Zeitraum (from, to, days mit Daten); ohne Daten ist window null
groups[]
Je Linie und Richtung: line, dir, to (häufigstes Ziel), n, mean, p50, p90, on, early, hours (Stunde → [Abfahrten, Mittel s, pünktlich %]) und catch: [x Minuten vor Plan da, % der Abfahrten, bei denen man den Bus erwischt hätte, mittlere Wartezeit s] für x = 0, 1, 2, 3, 5. „Erwischt“ heißt: der Bus fuhr höchstens x Minuten zu früh; die Wartezeit ist dann x Minuten plus seine Verspätung.
departures[]
Je Plan-Abfahrt: line, dir, dt (Tagesgruppe), min (Plan-Minute ab Mitternacht des Betriebstags, nach Mitternacht über 1440), time (Uhrzeit), to (Ziel der Fahrt), n (Tage mit Wert), mean, p50, p90, on, early; sortiert nach Tagesgruppe und Uhrzeit

5. CSV-Dateien

UTF-8 ohne Byte-Order-Mark, Komma als Trennzeichen, Punkt als Dezimalzeichen, erste Zeile mit Spaltennamen, Texte bei Bedarf in Anführungszeichen. Die Spalten:

linien
zeitraum_tage, von, bis, linie, fahrten_im_datenstrom, fahrten_mit_echtzeit, ausgefallen, zusaetzlich, ohne_fahrplanbezug, abfahrten, puenktlich_prozent, zu_frueh_prozent, zu_spaet_prozent, mittel_s, median_s, p90_s, ausgelassene_halte
halte
von, bis, linie, richtung_id, richtung_start, richtung_ziel, position, halt_id, halt_name, werte, mittel_s, median_s, p90_s, puenktlich_prozent
abschnitte
von, bis, linie, richtung_id, richtung_ziel, position, von_halt_id, von_halt, nach_halt_id, nach_halt, fahrten, plan_s, zuwachs_mittel_s, zuwachs_ueber_1min_prozent
stunden
von, bis, linie (oder „alle“), wochentag (1 = Montag), wochentag_name, stunde, abfahrten, mittel_s, puenktlich_prozent
abfahrten, halt
von, bis, halt_id, halt_name, tagesgruppe (Mo-Fr, Sa, So/Feiertag), plan_abfahrt, linie, richtung_id, ziel, werte (Tage), mittel_s, median_s, p90_s, puenktlich_prozent, zu_frueh_prozent
tage, monate
betriebstag (bzw. monat), tagesart (nur bei Tagen), linie, fahrten_im_datenstrom, fahrten_mit_echtzeit, ausgefallen, abfahrten, puenktlich_prozent, zu_frueh_prozent, zu_spaet_prozent, mittel_s, median_s, p90_s, ausgelassene_halte
kalender
datum, tagesart, feiertag, abfahrten, puenktlich_prozent, ausgefallen, datenstrom_erreichbar_prozent, regenstunden, hoechsttemperatur_c
wetter
datum, stunde, temperatur_c, niederschlag_mm, wmo_wettercode, klasse (trocken/regen/schnee), schneefall_cm, schneehoehe_m (beide ab 25.09.2026), glaette (1 = Glättegefahr), quelle
fahrgaeste
art (wartend_an_haltestelle / im_bus), halt_id, halt_name, linie, tagesart (wd/sa/so), stunde, angaben, median_personen

6. Rohdaten je Betriebstag

statistik.php?rohdaten=JJJJ-MM-TT enthält jede verfolgte Fahrt mit jedem Halt, den der Datenstrom für sie meldete – eine Zeile je Fahrt und Halt. Der laufende Tag enthält nur Fahrten, die schon zu Ende sind.

betriebstag, linie, richtung_id
wie oben
fahrt_id, route_id, fahrt_beginn
Fahrt- und Linien-Kennung aus dem Datenstrom, Planbeginn der Fahrt
fahrt_status
planmaessig, zusaetzlich, ungeplant, ausgefallen (GTFS-Realtime schedule_relationship)
echtzeit
1, wenn für die Fahrt echte Echtzeitwerte kamen (nicht nur Platzhalter)
halt_folge, halt_id, halt_id_fahrplan, halt_name
Position im Fahrtverlauf (stop_sequence), Halt-ID im Datenstrom und im Fahrplan, Name
plan_ankunft, plan_abfahrt
Planzeiten als HH:MM:SS ab Mitternacht des Betriebstags (nach Mitternacht über 24:00)
verspaetung_ankunft_s, verspaetung_abfahrt_s
zuletzt gemeldete Verspätung
zeit_ankunft, zeit_abfahrt
vom Datenstrom gemeldete Zeitpunkte (ISO 8601), falls er statt einer Verspätung eine Uhrzeit lieferte – meist leer
halt_status
planmaessig, ausgelassen, keine_daten
gewertet
1, wenn der Wert in die Statistik einging (Fahrt mit Echtzeit, Fahrplan bekannt, Wert nach dem Passieren noch gemeldet)
zuletzt_gemeldet
wann der Datenstrom den Wert zuletzt enthielt (ISO 8601)

7. Beispiele

Pünktlichkeit aller Linien der letzten 30 Tage auf der Kommandozeile:

curl -s https://bus.roringen.de/statistik.php | jq '.windows["30"].lines[] | {line, on, mean, n}'

Wie viele Busse kamen in den letzten 30 Tagen in Roringen an?

curl -s https://bus.roringen.de/statistik.php | jq '.reliability.windows["30"].stops.roringen | {arrived_pct, ok, fail, gap_max_s}'

Die Abfahrten in Roringen als Tabelle speichern:

curl -o roringen.csv "https://bus.roringen.de/statistik.php?export=halt&halt=000009034027"

In einer eigenen Webseite (JavaScript):

const res = await fetch('https://bus.roringen.de/statistik.php?halt=000009034027');
const halt = await res.json();
for (const g of halt.groups) {
    console.log(g.line, '→', g.to, g.on + ' % pünktlich');
}

In Python mit pandas:

import pandas as pd
tage = pd.read_csv('https://bus.roringen.de/statistik.php?export=tage')
print(tage.groupby('linie')['puenktlich_prozent'].mean())

8. Lizenz und Namensnennung

Bitte bei jeder Weitergabe nennen

Status je Fahrt, Ereignisse, Verspätungen, Pünktlichkeit, Ausfälle, Abfahrten und Rohdaten sind aus dem Echtzeit-Datenstrom und dem Fahrplan von VBN/connect abgeleitet, die unter CC BY-SA 4.0 stehen. Sie stehen deshalb ebenfalls unter CC BY-SA 4.0: Weitergabe und Bearbeitung sind erlaubt, mit Namensnennung und unter den gleichen Bedingungen.

Datenquelle: VBN/connect (CC BY-SA 4.0), Auswertung: bus.roringen.de

Fahrgastangaben („Wie voll?“) sind Beiträge der Besucherinnen und Besucher und stehen unter CC BY 4.0. Veröffentlicht werden nur Zusammenfassungen, keine einzelnen Angaben.

Fahrgastangaben: Besucherinnen und Besucher von bus.roringen.de (CC BY 4.0)

Wetter: stündliche Werte für Roringen von Open-Meteo, CC BY 4.0.

Wetterdaten: Open-Meteo.com (CC BY 4.0)

Die Daten sind nach bestem Wissen aufbereitet, aber ohne Gewähr – maßgeblich für Fahrgäste bleiben die Angaben der Verkehrsunternehmen. Die HTTP-Antworten der Downloads tragen zusätzlich einen Verweis auf die Lizenz (Link: <…>; rel="license").