QuasselBot Großes Logo

Fahrdienst-Assistenz via Telegram

Sicher verschlüsselte Minutenverwaltung, Fahrdienst-Dokumentation und Schicht-Parsing direkt auf deinem Smartphone.

TRAM

TRAM – Ausfallzeiten & Netzwerk-Verwaltung

Stand: 28.05.2026 ---

Übersicht

Das TRAM-Modul berechnet Fahrzeit-Ausfallzeiten zwischen zwei Haltestellen: Grundlagen:
  • Graph-Modell mit Routenvarianten und Schrittfolgen
  • Segment-Zeiten pro Stammvariante und Zeitprofil
  • Versionierbare Netze (ermöglicht längere Bauphasen)
  • Automatische Profil-Vorauswahl nach Wochentag & Uhrzeit
  • Weichenverwaltung für komplexe Streckennetze
  • ---

    Nutzer-Befehle

    Ausfallzeiten berechnen

    Befehl: /tram oder /ausfall Direktsyntax:
    /ausfall <linie> <profil> <start> -> <ende>
    Dialog-Ablauf: 1. Produkt: Ausfall oder /ausfall direkt 2. Linie wählen 3. Zeitprofil wählen (mit automatischer Vorauswahl nach Wochentag/Uhrzeit) 4. Start- und Endhaltestelle festlegen 5. Ergebnis: je Stammrichtung Richtung <Ziel>: <Minuten> Fallback: Fehlt für ein Segment das gewählte Profil, wird auf DEFAULT zurückgegriffen. Ausgabe zeigt dann mit Default-Fallback. ---

    Fahrzeitprofile

    Standard-Setup

    Tabellen:
  • tram_travel_profiles – Zeitprofile pro Netz und Linie
  • tram_route_segment_times – Segment-Zeiten je Stammvariante und Profil
  • Wichtig:
  • Profil DEFAULT ist immer vorhanden
  • Wird beim Stamm-Import aus CSV-Dateien geschrieben
  • Profilcodes: A, B, C, ... (nicht auf A–H begrenzt)
  • Wochentag-Profile für /ausfall

    Für automatische Profil-Vorauswahl je Wochentag: Wochentag | Beispiel-Fenster | Profil -----------|------------------|-------- mo–fr | 06:00–09:00 | A mo–fr | 09:00–13:00 | B sa | 08:00–20:00 | G so | 08:00–20:00 | G Funktionsweise:
  • Bot liest bei /ausfall-Aufruf aktuellen Wochentag & Uhrzeit
  • Passende Profile werden mit 🔴 hervorgehoben
  • Profil-Mapping: Bot mappt A auf Linie BS-A oder BS-ZA automatisch
  • Admin-Befehle (Bot-Admin, Privat-Chat):
    /ausfall list [modi|mi|do|fr|saso]
    /ausfall add <Wochentag> <hh:mm> - <hh:mm> <Profil>
    /ausfall edit <Wochentag> <alt_hh:mm> - <hh:mm> [neu_hh:mm - hh:mm] <Profil>
    /ausfall bulkimport
    Beispiele:
    /ausfall list mo
    /ausfall add mo 06:00 - 09:00 A
    /ausfall edit fr 22:00 - 23:59 G
    /ausfall bulkimport
    Hinweise:
  • add bricht bei Duplikaten ab (gleiches Fenster am Tag)
  • edit mit nur Profil ändert nur das Profil, nicht das Fenster
  • bulkimport lädt Standardfahrplan (alle 7 Tage); Upsert bei Duplikaten
  • Eindeutiger Schlüssel: (network_set_id, weekday, time_from, time_until)
  • ---

    Weichenverwaltung

    Nur Bot-Admin im Privat-Chat Befehl: /weiche oder /weichen

    Befehle

    Befehl | Beschreibung --------|------------ /weiche list | Alle Weichen anzeigen (Ebene 1: Start-Halts, Ebene 2: Ziele) /weiche add ... | Neue Weiche hinzufügen (Dialog oder Stapel) /weiche edit <ID> ... | Weiche bearbeiten /weiche del <ID> | Weiche löschen

    Weichen-Format

    Standard-Weiche:
    <Start-Haltestelle>  <W11|W12|W13|...>  <Folge-Haltestelle>
    Folge-Weiche (mit Gleis-Zusatz):
    <Start-Haltestelle>  <W13> -> <W13a.4>  <Folge-Haltestelle>
    Gleisschreibweisen (gleichbedeutend):
  • Punkt: W11a.1 bis W13a.10
  • Kompakt: W11a1 bis W13a10
  • Anzeige: 🔼1️⃣ (W11a) oder ◀️4️⃣ (W13a)
  • Stapel-Input

    /weiche add
    <Start-Halt1>  <W11>  <Folge-Halt1>
    <Start-Halt2>  <W12>  <Folge-Halt2>
    confirm
    Verhalten unbekannter Haltestellen:
  • Inline-Bestätigung: Trotzdem eintragen? (Ja/Nein)
  • Mit confirm werden unbekannte Halte trotzdem gespeichert
  • Ohne confirm werden sie als Fehler übersprungen
  • ---

    Netz-Administration

    Nur Bot-Admin im Privat-Chat Befehl: /tramadmin

    Netzwerk-Management

    Befehl | Beschreibung --------|------------ /tramadmin set add <code> <titel> | Neues Netz anlegen /tramadmin set list | Alle Netze auflisten /tramadmin set activate <set_id> | Netz aktivieren /tramadmin coverage [set_id] | DEFAULT-Abdeckung berichten Aliase:
  • /tramdefaultreport [set_id]
  • /tramcoverage [set_id]
  • Varianten & Routen

    Befehl | Beschreibung --------|------------ /tramadmin variant add <set> <line> <dir> <route_no> <start> <end> <name> | Variante anlegen /tramadmin variant steps <variant_id> <code1>><code2>><...> | Schrittfolge setzen ---

    Stammdaten-Import

    Empfohlener Workflow: CSV-Import

    Dateiablage: linien/ Dateinamensschema:
    <Linie>_Ri1|Ri2_<Variante>_ab_<DD.MM.YYYY>_<Start> - <Ende>.CSV
    Beispiel:
    12_Ri1_Standard_ab_14.12.2025_Pasedagplatz Gl.2 - Am Kupfergraben Gl.3.CSV
    CSV-Schema:
    ;C#;Name;;Entf.;BS-A;BS-B;BS-C;...;BS-I;;
    ;1;Pasedagplatz, Gl.2;;0;0;0;0;...;0;;
    Spalten:
  • C# = Fahrt-Nummer
  • Name = Haltestellenname
  • Entf. = km ab Start
  • BS-* = Kumulierte Fahrtzeit ab Start
  • Konventionen:
  • Ri1 → Richtung hin, Ri2 → Richtung rueck
  • (Betriebspunkt) wird beim Import automatisch aus Namen entfernt
  • Default-Profil wird zusätzlich als DEFAULT gespeichert
  • Fallback: Wenn BS-A fehlt, nimmt Importer erstes aktives Profil (z.B. BS-ZA)
  • CSV Batch-Import

    Produktiv-Import

    ./venv/bin/python tram_csv_import.py \ --set-code netz_2026 \ --set-title "Regelnetz 2026" \ --start-route 200 \ --rebuild-set

    Dry-Run

    ./venv/bin/python tram_csv_import.py \ --set-code netz_2026 \ --set-title "Regelnetz 2026" \ --start-route 200 \ --dry-run
    --rebuild-set leert vor Neuimport:
  • tram_route_segment_times
  • tram_route_steps
  • tram_route_variants
  • Vorgehen: 1. CSV-Dateien in linien/ ablegen 2. Dry-Run testen 3. Produktiv-Import oder Rebuild 4. Optional Ausfall-Zeitfenster pflegen: /ausfall add/edit 5. Falls Lücken: ./venv/bin/python tram_fill_remaining_default_segments.py

    Legacy TXT-Import (nicht empfohlen)

    Nur für historische Dateien relevant:
  • tram_import_all.py – Batch von TXT-Dateien
  • tram_bulk_import.py – Einzelne TXT-Datei
  • tram_backfill_default_profile.py – DEFAULT-Profile nachholen
  • Dateiformat linien/:
    <Linie>.txt oder <Linie>_<Gruppe>.txt
    Inhalt (beide Richtungen in einer Datei, getrennt durch Leerzeile):
    Haltestelle;1
    Zwischenhalt;2
    Endhaltestelle
    
    Endhaltestelle
    Rückfahrt-Halt;2
    Start-Rückfahrt

    Verzweigte Linien (z.B. M1, M4)

    Mit @meta-Blöcken pro Stammvariante:
    @meta direction=cityvariant=M1 Schillerstr. -> Am Kupfergrabenstamm=1
    <Haltefolge>
    
    @meta direction=outvariant=M1 Am Kupfergraben -> Rosenthal Nordstamm=1
    <Haltefolge>
    Importbefehl:
    ./venv/bin/python tram_import_all.py \
      --set-code netz_2026 \
      --set-title "Regelnetz 2026" \
      --start-route 100 \
      --dir-hin city \
      --dir-rueck out \
      [--only M5,M10] \
      [--activate-set] \
      [--dry-run]

    SQL Import (optional)

    Beispiel-Seed-Datei: TRAM_M5_SEED.sql
    mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" < TRAM_M5_SEED.sql
    ---

    Datenbank-Tabellen

    Tabelle | Zweck ---------|-------- tram_network_sets | Netz-Versionen (Code, Titel) tram_route_variants | Stammvarianten (Linie, Richtung) tram_route_steps | Schrittfolgen (Knoten von→zu) tram_travel_profiles | Zeitprofile (A, B, C, ...) tram_route_segment_times | Segment-Zeiten pro Variante & Profil tram_outage_profile_slots | Wochentag-Zeitfenster für /ausfall ---

    DEFAULT-Report

    Bot-Admin im Privat-Chat:
    /tramdefaultreport [set_id]
    /tramcoverage [set_id]
    /tramadmin coverage [set_id]
    Ausgabe:
    Linie M5 (hin): vollständig
    Linie M5 (rueck): teilweise
    ...
    Gesamt-Quote: 87%
    ---

    Betrieb & Troubleshooting

    Nach Deploy

    Service neu starten

    sudo systemctl restart quasselbot

    Live-Logs

    journalctl -u quasselbot -f

    Tests

    Alle Tests

    ./run_tests.sh

    TRAM-spezifisch

    ./run_tests.sh test_tram*.py
    ---

    Praxis-Beispiele

    A) Neue Netz-Struktur anlegen

    /tramadmin set add m5_2026 M5 Bauphase 2026
    /tramadmin variant add 1 M5 city 101 ZING_G3 HBF_G1 Stamm
    /tramadmin variant steps <variant_id> ZING_G3>PREROWER>...>HBF_G1
    /tramadmin set activate 1

    B) CSV importieren und testen

    Dateien ablegen

    cp ~/downloads/m5_*.CSV linien/

    Dry-Run

    ./venv/bin/python tram_csv_import.py --set-code netz_2026 --dry-run

    Echter Import

    ./venv/bin/python tram_csv_import.py --set-code netz_2026 --rebuild-set

    C) Ausfallzeiten berechnen

    /ausfall
    → Wähle: M5
    → Profil: A (automatisch hervorgehoben, 06:00–09:00)
    → Start: Zingster Str.
    → Ende: Am Kupfergraben
    → Ergebnis: Ri. HBF: 12 Minuten

    D) Weiche hinzufügen

    /weiche add
    Hackesche Markte  W13 -> W13a.4  S Hackescher Markt
    confirm
    ---

    Verwandte Dokumentation

  • Admin-Betrieb: [OPERATIONS.md](OPERATIONS.md)
  • Tram-Handler: [handlers_tram.py](handlers_tram.py)
  • API: [gw_api.py](gw_api.py)
  • 🔒 Speicher-Verschlüsselung: AES-256 + bcrypt aktiv
    Modul-Umfang: ~39.668 Zeilen Python-Core