Claude b013753fc3 Pfeil aus Guidos SVG, weiche Drehung entlang der Strecke, Dunkelmodus, lesbare Ortsnamen im Satellit
- Server liefert pro Zug Positionen alle 2 s für die nächsten 10 s,
  der Browser fährt Kurven nach und dreht die Spitze weich (~0,3 s)
- Richtung unter ~2 m Bewegung ignoriert (kein Umklappen am Halt)
- Eigene Icon-Namen (tp-*), die Protomaps-Sprites hatten arrow/dot schon
- Modi Karte / Dunkel / Satellit; im Satellit weisse Schrift mit dunklem Rand

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X48pE4bzjHej8w9HyZXCjb
2026-10-21 20:31:46 +02:00
2026-10-21 19:24:44 +02:00
2026-10-21 19:24:44 +02:00
2026-10-21 19:24:44 +02:00
2026-10-21 19:24:44 +02:00
2026-10-21 19:24:44 +02:00
2026-10-21 19:24:44 +02:00
2026-10-21 19:24:44 +02:00

TrainPulse – Schweiz

Live-Karte aller Züge in der Schweiz: Position entlang der echten Strecke, Linie, Zugnummer, Ziel, Verspätung und Fahrtverlauf mit Gleis. Hintergrund umschaltbar zwischen Karte (OpenStreetMap) und Satellit (swisstopo SWISSIMAGE, ausserhalb der Schweiz Sentinel-2).

Wie es funktioniert

opentransportdata.swiss ──GTFS (Mo+Do)──▶ updater-Container (stündlich)
                                            ├─ Filter: nur Bahn (route_type 100–199)
OpenStreetMap (Geofabrik) ─────────────────▶├─ pfaedle: echte Streckenverläufe
                                            └─▶ data/feeds/<version>/
opentransportdata.swiss ──GTFS-RT (35 s)──▶ web-Container (Port 8080)
                                            ├─ Position = Fahrplan + Verspätung, entlang Strecke
                                            └─ /api/vehicles, /api/trip/…, /api/status, Weboberfläche

Es gibt in der Schweiz keine offenen GPS-Positionen der Züge. Die Position wird aus Fahrplan und gemeldeter Verspätung berechnet und auf den Streckenverlauf gelegt.

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, 4 GB RAM (pfaedle braucht beim Aufbereiten bis ~2 GB, der Server ~0,5 GB), 20 GB Disk, 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.
  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 --force
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: opentransportdata.swiss (Quellenangabe Pflicht)
  • 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 Schiffe sind im Fahrplan, werden aber noch herausgefiltert.
  • Der Schweizer Fahrplan enthält auch einige ausländische Züge (z. B. TGV, TER); deren Strecke ausserhalb der Schweiz ist nur Luftlinie, weil der OSM-Ausschnitt nur die Schweiz abdeckt.
  • 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.
S
Description
No description provided
Readme
798 KiB
Languages
Python 69.6%
JavaScript 22%
CSS 3.8%
HTML 2%
Shell 1.6%
Other 1%