Files
Trainpulse/README.md
T
Claude d339da5da2 Frankreich, Niederlande, Belgien als weitere Quellen (noch im Test)
- Quellen fr (SNCF), nl (OVapi), be (GTFS.be), Kacheln für alle 5 Länder
- Landesgrenzen für 5 Länder (borders.json), Gitter-Cache für die Prüfung
- Echtzeit-Abgleich auch über Haltestellen-ID (FR, NL), über den Bahnhof
  bei Gleiswechsel
- SNCF: Gattung aus der Trip-ID, Zugnummer aus dem Headsign; NL-Linien gekürzt
- calendar.txt optional (SNCF hat nur calendar_dates)
- OSM je Land zugeschnitten vor pfaedle; beim Zusammenführen je Objekt
  nur die neueste Version (time-filter)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X48pE4bzjHej8w9HyZXCjb
2026-10-22 07:06:47 +02:00

6.4 KiB
Raw Blame History

TrainPulse

Live-Karte aller Züge in der Schweiz, Deutschland, Frankreich, Belgien und den Niederlanden: 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 opentransportdata.swiss, DE gtfs.de, ├▶ updater-Container (stündlich)
  FR SNCF, NL OVapi, BE GTFS.be           │   ├─ Filter: nur Bahn (route_type 2, 100–199)
OpenStreetMap (Geofabrik, 5 Länder) ──────┘   ├─ osmium: nur Schienennetz, je Land zugeschnitten
                                              ├─ pfaedle: Streckenverläufe
                                              └─▶ data/feeds/<ch|de|fr|nl|be>/<version>/
Echtzeit (GTFS-RT) ───────────────────────┐
  CH (Key), DE, FR, NL                    └▶ 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.

  1. Container anlegen (Proxmox-Oberfläche → Create CT): Debian 12 oder 13 Template, unprivileged, 2 Kerne, 6 GB RAM (pfaedle braucht beim Aufbereiten bis ~3 GB, der Server ~1 GB), 50 GB Disk (Kartenkacheln ~9,4 GB, beim monatlichen OSM-Update kurzzeitig bis ~6 GB Download für Frankreich), Netz per DHCP. Unter Options → Features Nesting und keyctl aktivieren – ohne das läuft Docker im LXC nicht.
  2. Installieren (im Container als root):
    apt install -y git
    git clone https://git.scarriffle.com/Scarriffle/Trainpulse.git
    bash Trainpulse/deploy/install.sh
    
    Das Skript installiert Docker, falls es fehlt, baut das Image und startet beide Container. Der erste Start dauert ca. 1–1,5 Stunden: Kartenkacheln (~9,4 GB) und OpenStreetMap für alle fünf Länder (~13 GB) herunterladen, dann alle Fahrpläne aufbereiten.
  3. Echtzeit freischalten: Auf https://api-manager.opentransportdata.swiss registrieren, eine Applikation anlegen, das Produkt GTFS-RT abonnieren und den API-Key in Trainpulse/.env bei TRAINPULSE_RT_KEY= eintragen. Dann docker compose up -d.

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: GTFS.be (Community-Feed aus NMBS/SNCB-Daten), nur Fahrplan
  • 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

  • Nur Bahn. Busse, Trams und U-Bahnen sind im Fahrplan, werden aber noch herausgefiltert.
  • 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 anderen Länder zusammen ~4 GB.
  • Belgien hat keine offene Echtzeit (nur nach Registrierung bei data.belgianmobility.io). Wer einen GTFS-RT-Zugang hat, trägt URL und Key als TRAINPULSE_BE_RT_URL / TRAINPULSE_BE_RT_KEY in .env ein.
  • Paris (RER/Transilien) ist nicht enthalten – das ist ein eigener Datensatz.
  • Zwischen zwei Abfragen fahren die Züge auf gerader Linie; in engen Kurven schneiden sie für ein paar Sekunden minimal ab.
  • 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.