- mehrere Quellen je Land (country), Grenzen aus Natural Earth, OSM und Kachelausschnitt erweitert - Fahrpläne glätten: Unterordner im Zip, aufgefüllte Felder, fehlende parent_station, level_id - Gattung aus der Zugnummer (ÖBB 'RJ 658'), Fernverkehr auch über Routentyp 101/102/105 - Echtzeit: Verspätung vor Uhrzeit (Renfe), Fahrten ohne Datum, Key in der Adresse (Trafiklab) - httpx-Logs aus (würden Keys zeigen) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X48pE4bzjHej8w9HyZXCjb
TrainPulse
Live-Karte aller Züge in der Schweiz, Deutschland, Frankreich, Belgien, den Niederlanden, Österreich, Spanien, Polen, Dänemark, Norwegen und Schweden, dazu Trams und U-Bahnen (CH, DE, NL, AT/Wien, DK, NO, SE): Position entlang der echten Strecke, Linie, Ziel, Verspätung und Fahrtverlauf mit Gleis. Hintergrund umschaltbar zwischen Karte, dunkler Karte (OpenStreetMap) und Satellit (swisstopo SWISSIMAGE, ausserhalb der Schweiz Sentinel-2).
Wie es funktioniert
Fahrpläne (GTFS) ─────────────────────────┐
CH, DE, FR, NL, BE, AT (+Wien), ES (+ ├▶ updater-Container (stündlich)
Cercanías), PL, DK, NO, SE (Key) │ ├─ Filter: Bahn, Tram, U-Bahn (ohne Bus/Schiff)
OpenStreetMap (Geofabrik, 11 Länder) ─────┘ ├─ osmium: nur Schienennetz, je Land zugeschnitten
├─ pfaedle: Streckenverläufe
└─▶ data/feeds/<quelle>/<version>/
Echtzeit (GTFS-RT) ───────────────────────┐
CH (Key), DE, FR, NL, BE, ES, PL, NO └▶ web-Container (Port 8080)
├─ Position = Fahrplan + Verspätung, entlang Strecke
└─ /api/vehicles, /api/trip/…, /api/status, Weboberfläche
Es gibt keine offenen GPS-Positionen der Züge. Die Position wird aus Fahrplan und gemeldeter Verspätung berechnet und auf den Streckenverlauf gelegt.
Die Fahrpläne enthalten grenzüberschreitende Züge. Damit sie nicht doppelt erscheinen, zeigt jeder
Fahrplan seine Züge nur im eigenen Land; im übrigen Ausland (Österreich, Italien, …) zeigen sie alle
(trainpulse/borders.json: Schweiz aus OpenStreetMap, sonst Natural Earth).
Wechsel des Fahrplans: Neue Fahrpläne erscheinen Montag und Donnerstag zwischen 9 und 10 Uhr,
die Echtzeitdaten stellen erst um 15 Uhr um. Der Server lädt deshalb immer den Fahrplan, auf den
sich die Echtzeitdaten gerade beziehen (feed_version), und schaltet automatisch mit um.
Installation auf Proxmox (Docker)
TrainPulse läuft als zwei Docker-Container aus demselben Image:
web (Webserver, Port 8080) und updater (holt stündlich neue Fahrpläne und beim ersten Start
die Kartenkacheln). Alle Daten liegen im Ordner data/ neben der compose.yaml.
- Container anlegen (Proxmox-Oberfläche → Create CT): Debian 12 oder 13 Template, unprivileged, 2 Kerne, 8 GB RAM (Server ~4 GB, pfaedle beim Aufbereiten bis ~2,5 GB, beim Fahrplanwechsel kurz beide Versionen), 60 GB Disk (Kartenkacheln ~21 GB, Fahrpläne ~9 GB in je zwei Versionen, beim monatlichen OSM-Update kurzzeitig bis ~5 GB Download), Netz per DHCP. Unter Options → Features Nesting und keyctl aktivieren – ohne das läuft Docker im LXC nicht.
- Installieren (im Container als root):
Das Skript installiert Docker, falls es fehlt, baut das Image und startet beide Container. Der erste Start dauert ca. 1,5–2 Stunden: Kartenkacheln (~21 GB) und OpenStreetMap für alle elf Länder (~21 GB) herunterladen, dann alle Fahrpläne aufbereiten.
apt install -y git git clone https://git.scarriffle.com/Scarriffle/Trainpulse.git bash Trainpulse/deploy/install.sh - Echtzeit freischalten: Auf https://api-manager.opentransportdata.swiss registrieren,
eine Applikation anlegen, das Produkt GTFS-RT abonnieren und den API-Key in
Trainpulse/.envbeiTRAINPULSE_RT_KEY=eintragen. Danndocker compose up -d. - Schweden freischalten (optional): Auf https://developer.trafiklab.se ein Projekt anlegen,
GTFS Sweden 3 und GTFS Sweden 3 Realtime hinzufügen und den Key in
.envbeiTRAINPULSE_SE_KEY=eintragen. Ohne Key fehlt Schweden.
Danach ist die Karte unter http://<ip>:8080 erreichbar. Für den Zugriff von aussen einfach
hinter deinen bestehenden Reverse Proxy hängen.
Update: git pull && bash deploy/install.sh – baut das Image neu, Daten bleiben.
Nützliche Befehle (im Ordner Trainpulse)
| Was | Befehl |
|---|---|
| Status | curl localhost:8080/api/status |
| Logs Webserver | docker compose logs -f web |
| Logs Fahrplan-Update | docker compose logs -f updater |
| Fahrplan sofort neu aufbereiten | docker compose exec updater python -m trainpulse.prepare --source de --force (oder ch) |
| Selbsttest | docker compose exec web python tests/test_core.py |
| Stoppen / Starten | docker compose down / docker compose up -d |
Datenquellen und Lizenzen
Die Hinweise erscheinen unten rechts auf der Karte.
- Fahrplan & Echtzeit Schweiz: opentransportdata.swiss (Quellenangabe Pflicht)
- Fahrplan Deutschland: gtfs.de, Daten von DELFI e.V. (CC BY 4.0)
- Echtzeit Deutschland: gtfs.de (CC BY-SA 4.0, Beta, Abdeckung je nach Region)
- Frankreich: SNCF über transport.data.gouv.fr (ODbL), Fahrplan und Echtzeit
- Niederlande: OVapi / Stichting OpenGeo, Fahrplan und Echtzeit
- Belgien: NMBS/SNCB Open Data (HAFAS-Feeds), Fahrplan und Echtzeit
- Spanien: Renfe (Fern-/Regionalverkehr und Cercanías), Fahrplan und Echtzeit
- Polen: mkuran.pl (alle Bahnbetreiber, Daten von PKP PLK), Fahrplan und Echtzeit (CC BY 4.0)
- Norwegen: Entur (NLOD), Fahrplan; Echtzeit für Vy, Flytoget, Go-Ahead, Oslo, Bergen, Trondheim
- Dänemark: Rejseplanen (alle Verkehrsmittel), nur Fahrplan
- Österreich: ÖBB und Wiener Linien (CC BY 4.0), nur Fahrplan
- Schweden: Trafiklab GTFS Sweden 3 (Key nötig), Echtzeit nur Stockholm und Skåne
- Landesgrenzen: Natural Earth (gemeinfrei) und OpenStreetMap
- Karte: © OpenStreetMap-Mitwirkende (ODbL), Kacheln von Protomaps
- Streckenverläufe: berechnet mit pfaedle aus OpenStreetMap-Daten (ODbL)
- Satellit Schweiz: © swisstopo (frei, Quellenangabe)
- Satellit ausserhalb: Sentinel-2 cloudless 2024 von EOX – nur nicht-kommerziell frei
Bekannte Grenzen
- Busse, Schiffe und Seilbahnen werden nicht angezeigt. Trams und U-Bahnen erscheinen erst ab Stadtzoom (Stufe 11) und nur im Kartenausschnitt; die Suche findet sie nur dort.
- Trams/U-Bahnen gibt es für CH, DE, NL, Wien, DK, NO und SE. Belgien (Brüssel STIB/MIVB), Frankreich (RATP, TCL …), Spanien (Metro Madrid …), Polen und Österreich ausser Wien haben eigene Datensätze, die noch fehlen.
- Ohne offene Echtzeit (grau): Österreich, Dänemark, Schweden ausser Stockholm/Skåne. Der österreichische ÖBB-Fahrplan erscheint nur einmal pro Jahr; Baustellenfahrpläne fehlen.
- Der polnische Echtzeit-Feed bleibt laut Betreiber ein- bis zweimal täglich über eine Stunde stehen.
- Tschechien, Italien und Grossbritannien fehlen: keine offenen Fahrplandaten (CZ, IT) bzw. kein GTFS, nur ein eigenes Format mit Registrierung (GB). In Berlin liefert der freie deutsche Echtzeit-Feed keine Verspätungen für U-Bahn und Tram.
- Züge des Schweizer Fahrplans im übrigen Ausland (z. B. Tirano, Domodossola, Frankreich) werden nicht angezeigt, sobald sie die Schweiz verlassen.
- Der kostenlose deutsche Fahrplan enthält keine Zugnummern und kein Fahrtziel; angezeigt wird als Ziel der letzte Halt.
- Der deutsche Echtzeit-Feed ist ~6 MB gross (komprimiert). Bei einem Abruf pro Minute sind das rund 9 GB Datenverkehr pro Tag; die Niederlande (Züge + Trams/Metro, ~6 MB/min) ~8 GB, Polen (~5 MB alle 2 min) ~3,5 GB, die übrigen zusammen ~5 GB.
- Belgien: die Feed-Adressen unter sncb-opendata.hafas.de sind nicht offiziell dokumentiert und
laufen evtl. aus (die NMBS stellt auf data.belgianmobility.io um). Dann neue Adresse als
TRAINPULSE_BE_RT_URL(und ggf.TRAINPULSE_BE_RT_KEY) in.enveintragen. - Paris (RER/Transilien) ist nicht enthalten – das ist ein eigener Datensatz.
- Zusätzliche Fahrten, die nur in den Echtzeitdaten vorkommen (Extrazüge), fehlen.
- In der Nacht des Fahrplanwechsels (2. Sonntag im Dezember) fehlen bis zum nächsten stündlichen Lauf die Züge.