Files
HHA/app/ANALYSE.md
2026-03-24 15:03:35 +01:00

10 KiB

HHA Lua Workflow Analyse

Überblick

Die analysierten Lua-Skripte implementieren einen umfangreichen Logistik-Workflow für die Hamburger Hochbahn (HHA). Die App verwaltet den Transport und die Zustandsänderungen verschiedener Objekte zwischen verschiedenen Stationen.

Architektur der Lua-App

Dateistruktur

  • hha_mainscript.lua - Initialisierung und Barcode-Handling
  • hha_main.lua - Hauptlogik mit UI und State-Machine
  • hha_db_migration_V0_initial.lua - Datenbank-Schema

UI-Framework

Die App verwendet ein proprietäres UI-Framework (ASUI) mit folgenden Komponenten:

  • ASUIStackLayout - Layout-Container
  • ASUILabel - Textanzeige
  • ASUIButton - Schaltflächen
  • ASUIScrollView - Scrollbare Bereiche
  • ASUIPerfListViewM - Performante Listen
  • ASUIBoxView / ASUIRelativeLayout - Container

Objekt-Typen

1. Geldkassetten (GK)

  • Typ-ID: 3
  • Codes: MEKxxx, BEKxxx
  • Subtypen: meka, mekb, mekc, mekd, beka, bekb, bekc, bekd
  • Workflow: Lager → Fahrzeug → Station → Fahrscheinautomat → Geldinstitut

2. HP Patronen (HP)

  • Typ-ID: 4
  • Codes: HOPxxx, H1Pxxx, H2Pxxx, H3Pxxx
  • Subtypen: hp1a, hp1b, hp1c, hp2a, hp2b, hp2c, hp3a, hp3b, hp3c
  • Workflow: Lager → Fahrzeug → Fahrscheinautomat

3. Fahrkartenrollen (FR)

  • Typ-ID: 7
  • Codes: FRxxx
  • Subtypen: fra
  • Workflow: Lager → Fahrzeug → Fahrscheinautomat

4. Safebags (SB)

  • Typ-ID: 5
  • Workflow: Versorgungsstelle → Geldinstitut

5. Abfallbehälter (ABS)

  • Typ-ID: 9
  • Workflow: Versorgungsstelle → Dienststelle

6. Container (CNTR)

  • Typ-ID: ?
  • Subtypen: cntra (Geldinstitut), cntrb (Dienststelle)
  • Workflow: Sammlung mehrerer Objekte

Zustände (States)

Hauptzustände

unknown → to_delivery → delivery → station → in_fa
                                            ↓
                    ┌───────────────────────┼───────────────────────┐
                    ↓                       ↓                       ↓
                 ret_gi                 ret_fail                 ret_ds
                    ↓                       ↓                       ↓
               ret_gi_fzg              ret_fail_fzg              ret_ds_fzg
                    ↓                       ↓                       ↓
                fin_gi                ret_fail_stk              ret_ds_stk
                                            ↓                       ↓
                                      fin_ds_fail                fin_ds

Zustandsbeschreibungen

State Beschreibung Farbe
unknown Unbekannt/Neu Weiß
to_delivery Zum Fahrzeug Grau
delivery Im Fahrzeug Grau
station An Station Gelb
in_fa Im Fahrscheinautomat Grün
in_vs In Versorgungsstelle Gelb
ret_fail Fehlerhaft zur Dienststelle Rot
ret_fail_fzg Fehlerhaft im Fahrzeug Rot
ret_fail_stk Fehlerhaft in Dienststelle Rot
ret_gi Zum Geldinstitut Hellblau
ret_gi_fzg Zum Geldinstitut (Fzg) Hellblau
ret_gi_stk Zum Geldinstitut (Stk) Hellblau
fin_gi Abgeschlossen im Geldinstitut Blau
ret_ds Zur Dienststelle Hellblau
ret_ds_fzg Zur Dienststelle (Fzg) Hellblau
ret_ds_stk Zur Dienststelle (Stk) Hellblau
ret_ds_err Fehlerhaft zur Dienststelle Hellblau
fin_ds Abgeschlossen in Dienststelle Blau
fin_ds_fail Fehlerhaft abgeschlossen Blau
fin_ds_err Fehlerhaft abgeschlossen Blau
hdl Handel Grau
ret_ds_empty Leer zur Dienststelle Hellblau

Tour-Stationen

Stationstypen

Type Beschreibung Icon
stock_start Lager - Beladung Lager
stock Lager Lager
stock_end Lager - Rückgabe Lager
start Dienststelle - Start Dienststelle
end Dienststelle - Ende Dienststelle
st Haltestelle Haltestelle
hls Hochbahnstation HLS
fsa Fahrscheinautomat FSA
vs Versorgungsstelle VS
gi Geldinstitut Bank
veh_start Fahrzeug - Beladung Fahrzeug
veh Fahrzeug Fahrzeug
veh_bulk Fahrzeug - Massenladung Fahrzeug
veh_vs Fahrzeug - Versorgung Fahrzeug
veh_end Fahrzeug - Entladung Fahrzeug

Seiten (Pages)

Jede Tour hat mehrere Seiten, die bestimmte Aktionen definieren:

  • Page-ID: Eindeutige Identifikation
  • Code: Barcode zum Aktivieren der Seite
  • Label: Anzeigename
  • Pickup: Objekte, die aufgenommen werden sollen
  • Swap: Objekte, die ausgetauscht werden sollen

State Machines

1. Stock Start State Machine

unknown → to_delivery (Auf Fahrzeug laden)
fin_gi_tmp → ret_gi (Rückgabe an Geldinstitut)

2. Vehicle Start State Machine

to_delivery → delivery (Bestätigung Ladung)
ret_gi → ret_gi_fzg (Übernahme vom Geldinstitut)

3. Vehicle State Machine

delivery → station (An Haltestelle ausgeben)
ret_fail → ret_fail_fzg (Fehlerhafte übernehmen)
ret_gi → ret_gi_fzg (Geldinstitut-Objekte übernehmen)
ret_ds → ret_ds_fzg (Dienststellen-Objekte übernehmen)
station → delivery (Rücknahme)
in_fa → hdl (Handel)

4. FSA (Fahrscheinautomat) State Machine

Geldkassette (GK)

station → in_fa (Einbau)
in_fa → ret_fail (Fehlerhaft ausbauen)
unknown → ret_gi (Neue unbekannte Kassette)

HP Patrone

station → in_fa (Einbau)
in_fa → station (Ausbau)
unknown → ret_ds (Neue unbekannte Patrone)

Fahrkartenrolle

station → in_fa (Einbau)
in_fa → station (Ausbau)

5. Versorgungsstelle (VS) State Machine

Container Type A (cntra):
  - SB (Safebag) in_vs → ret_gi
  
Container Type B (cntrb):
  - ABS (Abfall) in_vs → ret_ds

Container Barcode:
  - cntra → Container A aktivieren
  - cntrb → Container B aktivieren

6. Geldinstitut (GI) State Machine

ret_gi_fzg → fin_gi (Übergabe an Bank)
unknown → ret_ds_empty (Leere Kassette)

7. Vehicle End State Machine

ret_fail_fzg → ret_fail_stk
ret_ds_fzg → ret_ds_stk
delivery → ret_ds_stk
ret_ds_empty → ret_ds_stk
ret_gi_fzg → ret_gi_stk

8. Stock End State Machine

ret_fail_stk → fin_ds_fail
ret_ds_stk → fin_ds
ret_ds_err → fin_ds_err
ret_gi_stk → fin_gi_tmp

API-Endpunkte

Initialisierung

GET /hha?init={"update":<version>, "imei":<imei>}

Status-Update

GET /hha?set_obj_state={"obj":[...], "imei":<imei>}

Tour abschließen

GET /hha?fin_tour={"id":<tour_id>, "time":<timestamp>, "imei":<imei>}

Neues Objekt

GET /hha?new_obj={"type":<type>, "man":true, "code":<code>, ...}

Quittung

GET /hha?new_receipt={"data":<barcode>, "time":<timestamp>, ...}

Neuer Safebag

GET /hha?new_safebag={"code":<code>, "time":<timestamp>, ...}

Datenbank-Schema

Tabellen

tour

  • id, job_id, tour_id, version, state, type, sort
  • loc_id, loc_code, loc_code2, rem, menu, modified, del_code

object

  • id, object_id, type, version, loc_id, code, rem, state, subtype
  • origin, manual, last_modified

location

  • id, location_id, version, name, street, num, zip, city, lat, long, rem

page

  • id, tour_id, page_number, page_id, type, code, label

page_swap_count / page_pickup_count

  • id, tour_id, page_id, object_type, object_count

sendqueue

  • id, url (Base64-kodiert)

receipt

  • id, code

container_objects

  • id, container_id, type, object_id

Besonderheiten

Counter-Labels

Die App zeigt Zähler für verschiedene Objekttypen an:

  • MEK: Münzgeldkassette
  • BEK: Bargeldentnahmekassette
  • H1, H2, H3: HP Patronen
  • P: Fahrkartenrolle
  • SB: Safebag
  • ABS: Abfallbehälter

Beladezähler

  • SST: Sonder-Sonder-Tour
  • CR: Collection-Route
  • HADAG: Fährverbindung

Quittungen

Für Geldkassetten müssen Quittungen gescannt werden:

  • 2D-Barcode enthält: FA-#, GK-#, Betrag, Datum, Zeit
  • Keine Quittung = Warnhinweis

Manueller Modus

  • Neue Objekte können manuell angelegt werden
  • Server-Validierung des Barcodes
  • Automatische Typ-Erkennung über Präfix

Container-Logik

  • Container werden über Barcode aktiviert
  • Mehrere Objekte können einem Container zugeordnet werden
  • Container-Abschluss überträgt Status auf alle enthaltenen Objekte

Offline-Verhalten

  1. Daten werden lokal gespeichert (SQLite)
  2. API-Aufrufe werden in Queue eingereiht
  3. Automatische Synchronisation bei Verbindung
  4. Konfliktauflösung über Versionsnummern

Synchronisation

Trigger

  • App-Start
  • Manueller Refresh
  • Intervall (60 Sekunden)
  • Tour-Abschluss

Daten

  • Metadaten (Objekttypen)
  • Standorte
  • Objekte
  • Jobs & Touren
  • Page-Counts

Sicherheit

  • Geräte-Authentifizierung über IMEI
  • Keine Passwörter im Code
  • HTTPS für API-Kommunikation
  • Lokale Daten verschlüsselt (SQLite)

Flutter-Implementierung

Architektur-Mapping

Lua Flutter
ASUIStackLayout Column/Row
ASUILabel Text
ASUIButton ElevatedButton
ASUIScrollView SingleChildScrollView
database:Query Repository Pattern
BarcodeScanned MobileScanner
State Machine BLoC Pattern

UI-Vergleich

Lua-UI Flutter-UI
Hintergrund #220220220 Colors.grey.shade200
HHA Rot Color(0xFFE3001B)
Grüner Header #188230165 Color(0xFFBCA6A5)
Status-Farben ObjectStateInfo.getColorForState

State-Management

Die komplexen Lua-State-Machines wurden in BLoC-Pattern überführt:

  • ScanBloc verwaltet Barcode-Scanning
  • TourBloc verwaltet Touren und Synchronisation
  • Zustandsübergänge sind explizit und testbar

Vorteile der Flutter-Implementierung

  1. Type Safety: Dart's Typisierung verhindert Laufzeitfehler
  2. Hot Reload: Schnellere Entwicklung
  3. Moderne UI: Material Design 3, Animationen
  4. Wartbarkeit: Klare Architektur, Trennung von Concerns
  5. Testbarkeit: Unit-Tests für Business-Logik
  6. Offline-First: SQFlite mit Repository-Pattern
  7. State Management: BLoC für vorhersagbare Zustände

Fazit

Die Lua-App implementiert einen ausgereiften, komplexen Workflow für die Logistik der Hamburger Hochbahn. Die Flutter-Neuimplementierung behält die komplette fachliche Logik bei, verbessert jedoch:

  • Architektur und Wartbarkeit
  • UI/UX mit modernem Design
  • Offline-Fähigkeiten
  • Testbarkeit und Qualität
  • Zukunftssicherheit und Erweiterbarkeit