Eine Abfahrtstafel für Home Assistant, gebaut nach dem Vorbild der Punktmatrix-Anzeigen über den Berliner Bahnsteigen. Real-Time-Daten vom VBB.
In dieser HACS-Integration:
- eine Integration, die
v6.vbb.transport.restabfragt, daraus Sensoren erstellt und Daten für die Karte und Automatisierungen bereitstellt, - eine Lovelace-Karte, welche diese Sensoren als LED-Tafel zeichnet und sich selbst als Ressource anmeldet.
- Echte Punktmatrix statt nachgemachter Optik: quadratische LEDs, leuchtende und dunkle Punkte über die ganze Fläche im Raster gehalten, dazu Rahmen, Glasschimmer und ein Bahnhofsuhr-Modul
- Alle Richtungen auf einer Tafel, die nächste Abfahrt zuerst, auseinandergehalten durch die Gleisspalte
- Verspätungen und Ausfälle in Echtzeit, Störungsmeldungen laufen unten über die Meldezeile, so wie es die echten Anzeigen auch machen
- Vier Zeitformate zur Auswahl:
2',in 2 Min,12:14,12:11 +3 - Die Punktgröße lässt sich unabhängig von der Kartengröße einstellen
- Deutsch und Englisch, standardmäßig passend zu deiner Home-Assistant-Sprache
- Lange Zielnamen laufen durch, genau wie im Original
- Fußweg-Filter: Abfahrten, die du ohnehin nicht mehr schaffst, verschwinden
- Grafischer Editor von Home Assistant, YAML ist nicht nötig
- Eine API-Anfrage pro Station und Minute, egal wie viele Dashboards gerade offen sind
- Die kurzen Aussetzer des VBB-Backends werden ausgesessen, statt die Entitäten auf "nicht verfügbar" fallen zu lassen
Home Assistant 2024.11 oder neuer. Mehr braucht es nicht, kein API-Schlüssel, kein Konto, keine Cloud.
- In HACS oben rechts das Menü mit den drei Punkten öffnen und Benutzerdefinierte Repositories wählen.
https://github.com/mwckr/homassistant-vbb-displaymit dem Typ Integration hinzufügen.- In HACS nach VBB Display suchen und installieren.
- Home Assistant neu starten.
- Unter Einstellungen → Geräte & Dienste → Integration hinzufügen nach VBB Display suchen.
Die Karte liefert die Integration gleich mit und meldet auch die passende Dashboard-Ressource selbst an. Unter Dashboards → Ressourcen ist also nichts zu tun. Wer seine Lovelace-Ressourcen in YAML pflegt, bekommt die einzutragende URL stattdessen ins Log geschrieben, denn dort darf die Integration nicht hineinschreiben.
custom_components/vbb_display/in das Verzeichnisconfig/custom_components/deiner Home-Assistant-Installation kopieren. Die mitgeliefertewww/vbb-display-card.jsbleibt dabei einfach drin.- Home Assistant neu starten.
- Die Integration über Einstellungen → Geräte & Dienste hinzufügen.
Beim Hinzufügen fragt die Integration nach einem Stationsnamen, sucht ihn im VBB-Netz und lässt dich aus den Treffern auswählen. Das kannst du für so viele Stationen wiederholen, wie du magst. Jede wird zu einem eigenen Gerät.
Alles davon lässt sich jederzeit über Konfigurieren am Eintrag der Integration ändern.
| Option | Standard | Hinweise |
|---|---|---|
| Aktualisierungsintervall | 60 s |
Die öffentliche API erlaubt 100 Anfragen pro Minute für alle ihre Nutzer zusammen. Bitte lass den Wert bei 60 s, wenn du keinen guten Grund hast. |
| Abzurufende Abfahrten | 12 |
Obergrenze für die Entität, die Karte zeigt weniger davon. |
| Vorausschau | 60 Min |
Nur Abfahrten innerhalb dieses Zeitfensters werden berücksichtigt. |
| Fußweg zur Haltestelle | 0 Min |
Nicht mehr erreichbare Abfahrten fallen schon an der Quelle weg, damit auch Automatisierungen sie gar nicht erst sehen. |
| Sprache der API | de |
Sprache der Zielnamen und Störungstexte, die von der API zurückkommen. |
| Verkehrsmittel | alle | Zum Beispiel nur U-Bahn und Tram. |
Jede Station bringt zwei Sensoren mit.
sensor.<station>_next_departure ist ein Zeitstempel der nächsten Abfahrt und trägt die komplette Tafel in seinen Attributen:
| Attribut | Beschreibung |
|---|---|
station, station_id |
Name der Haltestelle und ihre VBB-ID |
departures |
Liste der Abfahrten mit line, product, direction, when, planned_when, delay (Sekunden), platform, cancelled, trip_id, warning, group |
groups |
Eine Zusammenfassung je Richtungstafel mit key, platform, direction, lines, next, count |
realtime_data_updated_at |
Wann die API ihre Echtzeitdaten zuletzt aufgefrischt hat |
sensor.<station>_next_departure_in sind die vollen Minuten bis zu dieser Abfahrt, praktisch für Automatisierungen mit Schwellenwert.
Eine Erinnerung, wann du losmusst:
automation:
- alias: Zeit, zur U7 aufzubrechen
triggers:
- trigger: numeric_state
entity_id: sensor.u_hermannplatz_next_departure_in
below: 6
actions:
- action: notify.mobile_app
data:
message: >
{{ state_attr('sensor.u_hermannplatz_next_departure', 'departures')[0].line }}
Richtung {{ state_attr('sensor.u_hermannplatz_next_departure', 'departures')[0].direction }}
fährt in {{ states('sensor.u_hermannplatz_next_departure_in') }} MinDie nächste Abfahrt in eine ganz bestimmte Richtung:
template:
- sensor:
- name: Nächste U7 Richtung Rudow
device_class: timestamp
state: >
{{ state_attr('sensor.u_hermannplatz_next_departure', 'departures')
| selectattr('direction', 'eq', 'Rudow')
| rejectattr('cancelled')
| map(attribute='when') | first }}
departuresundgroupssind vom Recorder ausgenommen, damit die Tafel nicht die Datenbank vollschreibt. Es sind einige Kilobyte, die jede Minute neu geschrieben werden. Für die Karte, für Templates und für Automatisierungen bleiben beide vollständig verfügbar, nur ihre Historie wird verworfen.
Wähle im Kartenauswahl-Dialog des Dashboards VBB Display und dann den next_departure-Sensor der Station. Alles Weitere findest du im grafischen Editor.
| Option | Typ | Standard | Beschreibung |
|---|---|---|---|
entity |
string | erforderlich | Der ..._next_departure-Sensor |
title |
string | Stationsname | Überschreibt die Überschrift |
departures |
number | 4 |
Zeilen auf der Tafel, 1 bis 8 |
groups |
list | alle | Auf bestimmte Richtungen einschränken. Leer bedeutet alle Richtungen |
time_format |
string | countdown |
countdown, countdown_long, clock, clock_delay |
language |
string | auto |
auto, de, en |
dot_pitch |
number | 1.5 |
LED-Abstand in px, 1 bis 3 in halben Schritten. Der Wert ist absolut, eine breitere Karte bekommt also mehr Punkte pro Zeichen statt größerer Punkte |
show_station |
boolean | true |
Stationsname über der Tafel |
show_header |
boolean | true |
Spaltenköpfe Linie / Ziel / Gleis / Abfahrt |
show_platform |
boolean | true |
Gleisspalte, bleibt ohnehin verborgen, wenn die Daten kein Gleis melden |
show_clock |
boolean | true |
Bahnhofsuhr, verschwindet bei schmalen Karten automatisch |
show_delay |
boolean | true |
Die +3-Markierung neben verspäteten Abfahrten |
scroll_long_names |
boolean | true |
Zu lange Ziele und Meldungen durchlaufen lassen |
tap_action |
action | more-info |
Ganz normale Home-Assistant-Aktion |
type: custom:vbb-display-card
entity: sensor.u_hermannplatz_next_departure
departures: 4
time_format: countdown
show_clock: truenpm install
npm run dev # baut die Karte und serviert die Vorschau auf http://localhost:8173
npm run watch # baut bei Änderungen neu, in einem zweiten TerminalDie Vorschauseite zeigt die Karte gegen ein nachgebautes Home Assistant in vier Breiten nebeneinander, damit man die Umbruchpunkte auf einen Blick sieht. Sie startet mit festen Testdaten, die Verspätungen, Ausfälle, Warnungen und übermäßig lange Zielnamen abdecken. Sobald du nach einer Station suchst, wechselt sie auf echte API-Daten.
npm run typecheck
npm run build # schreibt custom_components/vbb_display/www/vbb-display-card.js
npm run test:parity # prüft, ob die Gruppenschlüssel auf beiden Seiten übereinstimmenAuf der Python-Seite, gegen ein echtes Home-Assistant-Testgerüst:
python -m venv .venv && .venv/bin/pip install -r requirements_test.txt
.venv/bin/pytest
.venv/bin/mypy custom_components scripts
ruff check custom_components scripts tests && ruff format --check custom_components scripts testsDas gebaute Bundle liegt mit im Repository, weil HACS die Repository-Inhalte direkt installiert. Wenn es nicht mehr zum Stand von src/ passt, schlägt die CI fehl.
Die Abfahrten stammen von v6.vbb.transport.rest, einer kostenlosen Community-Instanz von vbb-rest von Jannis Redmann, die ohne Schlüssel auskommt und auf dem HAFAS-Endpunkt des VBB aufsetzt. Das Limit von 100 Anfragen pro Minute gilt für alle Nutzer gemeinsam. Diese Integration fragt einmal pro Station und Minute ab und bremst sich automatisch ein, falls sie einmal dazu aufgefordert wird. Bitte setz das Intervall nicht ohne Not herunter.
Dieses Projekt steht in keiner Verbindung zum VBB oder zur BVG.
MIT, siehe LICENSE.

