# 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)──▶ trainpulse-update (stündlich) ├─ Filter: nur Bahn (route_type 100–199) OpenStreetMap (Geofabrik) ─────────────────▶├─ pfaedle: echte Streckenverläufe └─▶ /var/lib/trainpulse/feeds// opentransportdata.swiss ──GTFS-RT (35 s)──▶ trainpulse (Webserver, 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 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. 2. **Projekt in den Container kopieren**, z. B. `scp trainpulse.zip root@:` und dort `apt install -y unzip && unzip trainpulse.zip`. 3. **Installieren:** `bash trainpulse/deploy/install.sh` Baut pfaedle, lädt die Kartenkacheln für die Schweiz, richtet die Dienste ein und startet die erste Fahrplan-Aufbereitung im Hintergrund (`journalctl -fu trainpulse-update`). 4. **Echtzeit freischalten:** Auf registrieren, eine Applikation anlegen, das Produkt *GTFS-RT* abonnieren und den API-Key in `/etc/trainpulse.env` bei `TRAINPULSE_RT_KEY=` eintragen. Dann `systemctl restart trainpulse`. Danach ist die Karte unter `http://:8080` erreichbar. Für den Zugriff von aussen einfach hinter deinen bestehenden Reverse Proxy hängen. Ein Update des Programms: neue Version in den Container kopieren, `install.sh` nochmals ausführen. ## Nützliche Befehle | Was | Befehl | |---|---| | Status | `curl localhost:8080/api/status` | | Logs Webserver | `journalctl -fu trainpulse` | | Logs Fahrplan-Update | `journalctl -fu trainpulse-update` | | Fahrplan sofort neu aufbereiten | `sudo -u trainpulse env $(cat /etc/trainpulse.env) /opt/trainpulse/.venv/bin/python -m trainpulse.prepare --force` | | Selbsttest | `/opt/trainpulse/.venv/bin/python tests/test_core.py` (im Projektordner) | ## Datenquellen und Lizenzen Die Hinweise erscheinen unten rechts auf der Karte. - Fahrplan & Echtzeit: [opentransportdata.swiss](https://opentransportdata.swiss) (Quellenangabe Pflicht) - Karte: © OpenStreetMap-Mitwirkende (ODbL), Kacheln von [Protomaps](https://protomaps.com) - Streckenverläufe: berechnet mit [pfaedle](https://github.com/ad-freiburg/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.