Developer
Menü

Bahnsteig und Ansagen

Die Anzeigen von bahnhoftafel.de wissen über ein Gleis mehr, als in einer Abfahrtsliste steht. Diese Seite zeigt, wie du dasselbe in deinem Programm bekommst: wann der Zug wirklich einfährt, ob ein Kurzzug kommt und was am Bahnsteig angesagt wird. Die Ansagen gibt es nach einer Freischaltung.

Was es gibt

Bahnsteig jetztEin Gleis als Momentaufnahme. An S-Bahn-Gleisen in Berlin mit Abstand und Tempo des nächsten Zuges, Baureihe, Zuglänge und den Abschnitten, in denen ein Kurzzug hält. Überall sonst wie der DB-Anzeiger mit Laufband, Zugteilung und Wagenreihung.
Bahnsteig liveDasselbe als Strom, sobald sich etwas ändert.
Ansagen liveJede Ansage in dem Moment, in dem sie am Bahnsteig fällig ist, mit Wortlaut und Tonaufnahme. Braucht eine Freischaltung und einen eigenen Ansage-Schlüssel.
Ansage anhörenDie Tonaufnahme zu einer Ansage. Die Adresse kommt fertig mit der Ansage.
LosgehenGehzeit von einem Ort zum Bahnhof und für jede Abfahrt, wann du los musst.
QR-CodeLink zur Seite des Bahnhofs auf bahnhof.de, im Stil der Anzeigen.

Wann fährt der Zug ein?

Die S-Bahn Berlin meldet, wo ihre Züge gerade sind. Daraus steht bei jedem Zug in approach, wie weit er noch bis zum Halteplatz hat, wie schnell er ist und in welchem Zustand: approaching (unterwegs), entering (fährt ein, unter 2 km), standing (steht am Bahnsteig). Das ist genauer als die Minutenangabe, weil es nicht aus dem Fahrplan gerechnet ist.

curl
curl https://developer.bahnhoftafel.de/v1/stations/8011162/platforms/3 \
  -H "Authorization: Bearer $BT_SCHLUESSEL"

Kurzzüge und Abschnitte

In vehicle steht die Baureihe und ob ein Vollzug (full) oder ein Kurzzug (short) kommt. Bei Kurzzügen nennt stops_in_sections die Abschnitte, in denen er hält, so wie die Ansage am Bahnsteig: „in den Abschnitten E bis H“.

Freischaltung für Ansagen

Die Ansagen sind Aufnahmen einer echten Sprecherin. Deshalb gibt es sie nicht mit jedem Schlüssel, sondern nur nach einer Freischaltung:

  • Klick auf unserem Discord-Server in #freischalten auf Ansage-API anfragen. Es öffnet sich ein Formular mit drei Feldern: das geplante Volumen, dein Projekt und eine Projektbeschreibung mit mindestens 500 Zeichen.
  • Nach dem Absenden öffnet der Bot ein Ticket, das nur du und das Team sehen. Dort klären wir Rückfragen.
  • Ist die Anfrage genehmigt, klickst du im Ticket auf Freischaltung abholen. Der Bot gibt dir einen Link, den nur du siehst; damit bist du im Portal angemeldet und freigeschaltet.
  • Nach der Freischaltung steht im Portal unter Ansagen der Knopf Ansage-Schlüssel anlegen. Dieser Schlüssel ist extra: er gilt nur für Ansagen live und zählt nicht zu deinen drei Apps. Für alle anderen Endpunkte nimmst du weiter den Schlüssel einer App.
  • Wird die Freischaltung zurückgenommen, gilt der Ansage-Schlüssel sofort nicht mehr.
Info

Ansagesprecherin: Alisa Palmer. Die Aufnahmen sind nur für den privaten Gebrauch zulässig: nicht weiterverbreiten und nicht in Videos, Streams oder Produkten verwenden.

Ansagen live mitschneiden

Der Strom schickt announcement mit einer Ansage, sobald sie am Bahnsteig fällig ist. Jede Ansage kommt genau einmal, mit dem Wortlaut in text und der Aufnahme in audio_url. Die Aufnahme lässt sich direkt abspielen und braucht keinen Schlüssel; sie ist 30 Minuten gültig.

Node.js
// Node.js 22 oder neuer, mit dem Ansage-Schlüssel
const antwort = await fetch("https://developer.bahnhoftafel.de/v1/stations/8011162/platforms/3/announcements", {
  headers: { Authorization: `Bearer ${process.env.BT_ANSAGE_SCHLUESSEL}` },
});
const text = new TextDecoderStream();
let puffer = "";
for await (const stueck of antwort.body.pipeThrough(text)) {
  puffer += stueck;
  let ende;
  while ((ende = puffer.indexOf("\n\n")) >= 0) {
    const block = puffer.slice(0, ende);
    puffer = puffer.slice(ende + 2);
    const art = block.match(/^event: (.+)$/m)?.[1];
    const daten = block.match(/^data: (.+)$/m)?.[1];
    if (art === "announcement") {
      const ansage = JSON.parse(daten);
      console.log(ansage.text, ansage.audio_url);
    }
  }
}

Im Browser geht es mit EventSource nicht direkt, weil es keinen Header mitschicken kann. Lass den Strom über deinen eigenen Server laufen und gib nur die Ansagen weiter; dein API-Schlüssel gehört nie in eine Webseite.

Wann muss ich los?

Mit einem Startpunkt rechnet Losgehen die Gehzeit über Fußwege aus OpenStreetMap und schreibt an jede Abfahrt, wann du losgehen musst (leave_at, leave_in_minutes) und ob du sie noch schaffst (reachable). buffer gibt ein paar Minuten Luft für Treppe und Fahrkarte.

Zu jeder Abfahrt steht in announcement ein Ansagetext, wie man ihn vom Bahnsteig kennt. An S-Bahn- und U-Bahn-Gleisen: „Zug S3 nach Erkner fährt in 3 Minuten auf Gleis 8.“, bei einem Gleiswechsel „heute auf Gleis 7“. Sonst wie bei der DB: „Zug RE 1 nach Potsdam Hbf über Berlin-Spandau, Abfahrt um 17:22 auf Gleis 7.“ Bei Verspätung kommen die erwartete Zeit und der Grund dazu, bei Ausfall „fällt heute aus“, außerdem ein vorzeitiges Ende und entfallende Halte. Im Portal liest die Live-Tafel diesen Text auf Wunsch vor und erinnert dich, wenn es Zeit zum Losgehen ist.

curl
curl "https://developer.bahnhoftafel.de/v1/stations/8011162/walk?lat=52.5065&lon=13.4655&products=suburban" \
  -H "Authorization: Bearer $BT_SCHLUESSEL"