Umfassende Anleitung: Modellierung eines Telefonsystem-Steuerungssystems mit UML-Zustandsmaschinen

🎯 Übersicht

Diese Anleitung fĂŒhrt Sie durch die Gestaltung und Modellierung eines Telefonie-Anruf-Steuerungssystem unter Verwendung von UML-Zustandsmaschinen-Diagrammen. Sie konzentriert sich auf die Lebenszyklus ausgehender Anrufe, wobei gezeigt wird, wie eine Telefonleitung aufgrund von Benutzeraktionen und Netzwerkevents zwischen ZustĂ€nden wechselt.

Das Diagramm erfasst sowohl die glĂŒckliche Pfade (Erfolgreiche Anrufherstellung) als auch die unglĂŒckliche Pfade (Fehler, Timeouts, besetzte Leitungen), wobei der Fokus auf Robustheit, Ausnahmehandhabung und klaren ZustandsĂŒbergĂ€ngen liegt – zentrale Prinzipien in Echtzeitkommunikationssystemen.


đŸ§© Grundlegende Konzepte von UML-Zustandsmaschinen

Bevor Sie in das Diagramm einsteigen, verstehen Sie diese grundlegenden UML-Konzepte:

Begriff Beschreibung
Zustand Ein Zustand, in dem ein Objekt bestimmte Bedingungen erfĂŒllt oder Aktionen ausfĂŒhrt.
Übergang Ein Wechsel von einem Zustand zum anderen, ausgelöst durch ein Ereignis.
Ereignis Ein Ereignis, das einen Übergang verursacht (z. B. onHook, gĂŒltigeNummer).
SelbstĂŒbergang Ein Übergang, der in demselben Zustand beginnt und endet (z. B. Ziffer(n) wĂ€hrend in WĂ€hlen).
Pseudozustand Spezielle Steuerpunkte wie Anfang oder Ende die keine echten ZustÀnde sind.
Verbundzustand Ein Zustand, der Unterkonfigurationen enthĂ€lt (z. B. Fehler Zustand mit Besetztton, Schneller Besetztton, Aufgezeichnete Nachricht).
WĂ€chterbedingung Ein boolescher Ausdruck, der wahr sein muss, damit eine Übergang stattfindet.

✅ Pro-Tipp: Verwenden Sie Ereignis [WĂ€chter] / Aktion Syntax in UML, um Auslöser, Bedingungen und Nebenwirkungen zu dokumentieren.


🔄 Lebenszyklus ausgehender Anrufe: Schritt-fĂŒr-Schritt-AufschlĂŒsselung

1. Initiierungs- und WÀhlphase

đŸ”č AnfĂ€nglicher Pseudozustand → Bereitschaft

  • Das System startet im AnfĂ€nglicher Pseudozustand.

  • Noch keine AktivitĂ€t; das Telefon befindet sich am Hörer.

đŸ”č Bereitschaft → WĂ€hlton (am Hörer)

  • Ereignis: am Hörer (Benutzer hebt den Hörer ab)

  • Übergang: am Hörer → WĂ€hlton

  • Aktion: WĂ€hlton erzeugen; Vorbereitung auf Eingabe einer Ziffer.

📌 Dies ist die erste sichtbare ZustandsĂ€nderung im Anruflebenszyklus.

đŸ”č WĂ€hlton → WĂ€hlen (Ziffer(n))

  • Ereignis: Ziffer(n) (Benutzer gibt eine Ziffer ein)

  • Übergang: Ziffer(n) → WĂ€hlen

  • Zustand: Wechseln in WĂ€hlen Modus.

đŸ”č Selbstdurchlauf: WĂ€hlen → WĂ€hlen (Ziffer(n))

  • Ereignis: Ziffer(n) (Mehrere Ziffern eingegeben)

  • Bedingung: Keine (immer erlaubt)

  • Aktion: FĂŒge Ziffer zur eingegebenen Nummer hinzu.

  • Zweck: Erlaube kontinuierliche Eingabe von Ziffern ohne den Zustand zu verlassen WĂ€hlen Zustand.

💡 SelbstĂŒbergĂ€nge sind entscheidend fĂŒr die Behandlung von Eingabefolgen wie Telefonnummern.


2. Verbindungslogik und Ausnahmehandhabung

đŸ”č WĂ€hlen → Verbinden (gĂŒltigeNummer)

  • Ereignis: gĂŒltigeNummer (vollstĂ€ndige Nummer validiert)

  • Übergang: gĂŒltigeNummer → Verbinden

  • Aktion: Rufaufbau mit dem Netzwerk initiieren.

đŸ”č WĂ€hlen → Aufgezeichnete Nachricht (ungĂŒltigeNummer)

  • Ereignis: ungĂŒltigeNummer (z. B. falsche LĂ€nge, ungĂŒltiger PrĂ€fix)

  • Übergang: ungĂŒltigeNummer → Aufgezeichnete Nachricht

  • Aktion: Wiedergabe einer vorab aufgezeichneten Nachricht: „Die von Ihnen gewĂ€hlte Nummer ist nicht in Betrieb.“

đŸ”č Verbinden → Besetztton (NummerBesetzt)

  • Ereignis: NummerBesetzt

  • Übergang: NummerBesetzt → Besetztton

  • Aktion: Besetztton abspielen; Benutzer informieren, dass die Leitung belegt ist.

đŸ”č Verbindungsaufbau → Schneller Besetztton (LeitungBesetzt)

  • Ereignis: LeitungBesetzt

  • Übergang: LeitungBesetzt → Schneller Besetztton

  • Aktion: Schnellen Besetztton abspielen; NetzĂŒberlastung anzeigen.

⚠ Hinweis: Dies sind FehlerzustĂ€nde die den normalen Ablauf unterbrechen. Sie mĂŒssen ordnungsgemĂ€ĂŸ behandelt werden.


3. Timeout- und Warnmechanismus

đŸ”č WĂ€hlen → Warnung (Timeout)

  • Ereignis: Timeout nach 30 Sekunden InaktivitĂ€t

  • Übergang: Timeout → Warnung

  • Aktion: Warnsignal abspielen; Benutzer informieren, weiterzumachen oder aufzulegen.

đŸ”č Warnung → Timeout (Timeout)

  • Ereignis: Timeout nochmals nach 10 Sekunden

  • Übergang: timeout → Timeout

  • Aktion: Rufversuch abbrechen; zurĂŒck zu Wartezustand.

⏱ Die Timeout-Logik verhindert ein unendliches Warten und verbessert die Benutzererfahrung.


4. Aktueller Anruf und Trennung

đŸ”č Verbindung herstellen → Klingeln (weitergeleitet)

  • Ereignis: weitergeleitet (Das Netzwerk leitet den Anruf erfolgreich weiter)

  • Übergang: weitergeleitet → Klingeln

  • Aktion: Senden des Klingelsignals an die angerufene Partei.

đŸ”č Klingeln → Verbunden (angerufene Partei antwortet)

  • Ereignis: angerufene Partei antwortet

  • Übergang: angerufene Partei antwortet → Verbunden

  • Aktion: Audioverbindung herstellen; Anrufaufzeichnung starten (falls aktiviert).

đŸ”č Verbunden → Getrennt (aufgelegt ODER angerufene Partei legt auf)

  • Zwei Wege zur Trennung:

    1. Benutzer legt auf: aufgelegt → Getrennt

    2. Andere Partei legt auf: calledPhoneHangsUp → Getrennt

🔄 Beide ÜbergĂ€nge fĂŒhren zu Getrennt bevor erreicht wird Endzustand.

đŸ”č Getrennt → Endzustand

  • Ereignis: Kein (implizit oder ĂŒber Aktion zur Bereinigung)

  • Übergang: Getrennt → EndgĂŒltig

  • Aktion: RĂ€ume Ressourcen auf, protokolliere Anrufdauer, aktualisiere Statistiken.

✅ Der Endzustand markiert das Ende des Anruflebenszyklus.


🎹 Visuelle Gestaltungsprinzipien fĂŒr Klarheit

Um komplexe Zustandsmaschinen lesbar und wartbar zu machen:

Prinzip Implementierung
Zentrales Hauptpfad Halte den Hauptverlauf (Ruhig → WĂ€hlton → WĂ€hlen → Verbinden → Klingeln → Verbunden) als saubere vertikale oder horizontale Linie.
Zweige nach außen fĂŒr Ausnahmen Platziere FehlerzustĂ€nde (Besetztton, Schnellbesetztton, Aufgezeichnete Nachricht) als Seitenzweige.
Gruppiere verwandte ZustĂ€nde Verwende zusammengesetzte ZustĂ€nde fĂŒr FehlerzustĂ€nde (siehe unten).
Verwende PseudozustÀnde weise Anfang und Ende sollten deutlich gekennzeichnet werden.
Überkreuzende ÜbergĂ€nge vermeiden Stellen Sie sicher, dass Pfeile sich nicht ĂŒberlappen; verwenden Sie gegebenenfalls orthogonale Bereiche.

🔧 Erweiterte Modellierungstechniken

✅ Zusammengesetzter Zustand: Gruppierung „Fehler“

Statt die Auflistung von Besetztton, Schneller Besetztton, und Aufgezeichnete Nachricht als separate ZustÀnde aufzulisten, gruppieren Sie sie unter einem zusammengesetzten Zustand namens Fehler:

[Fehler] 
├── Besetztton
├── Schneller Besetztton
└── Aufgezeichnete Nachricht
  • Eintrittsaktion: Spielt einen Fehlerton oder eine Fehlermeldung ab.

  • Austrittsaktion: ZurĂŒckkehren zu WĂ€hltone oder Ruhestatus nach der Benutzerantwort.

✅ Vorteil:Verringert visuelle UnĂŒbersichtlichkeit und verbessert die Skalierbarkeit.


✅ WĂ€chterbedingungen (optionale Verbesserungen)

FĂŒgen Sie WĂ€chter hinzu, um ÜbergĂ€nge zu verfeinern:

digit(n) [number.length < 15] → WĂ€hlen
validNumber [number.isInternational] → Verbinden

đŸ› ïž WĂ€chter verhindern ungĂŒltige ÜbergĂ€nge und unterstĂŒtzen bedingte Logik.


📌 Wichtige Erkenntnisse: Best Practices fĂŒr komplexe Zustandsmaschinen

Übung Warum es wichtig ist
Unangenehme Pfade modellieren Echte Systeme versagen. Gestaltung fĂŒr ungĂŒltigeNummer, ZeitĂŒberschreitung, LeitungBeschĂ€ftigt sorgt fĂŒr ZuverlĂ€ssigkeit.
Aktionsexpressionen verwenden Enthalten Sie / logCallAttempt() oder / playTone() um Nebenwirkungen anzuzeigen.
Halten Sie Ereignisse ausfĂŒhrlich und handlungsorientiert Verwenden Sie aufgelegt, weitergeleitet, angerufenesTelefonAntwortetanstatte1, e2.
Benennen Sie ZustÀnde eindeutig Vermeiden SieZustand1, Zustand2. Verwenden SieWÀhlen, Klingeln, Verbunden.
Dokumentieren Sie Annahmen Zum Beispiel: „Timeout nach 30 Sekunden InaktivitĂ€t“ sollte in Kommentaren erwĂ€hnt werden.

đŸ’» Codegenerierung: PlantUML & Mermaid

Hier sindfertige Codeblöckeum dieses Diagramm in Ihrem bevorzugten Format zu generieren.


✅ PlantUML-Code

@startuml

[*] –> Leerlauf
Leerlauf –> WĂ€hlton : aufgelegt
WĂ€hlton –> WĂ€hlen : Ziffer(n)
WĂ€hlen –> WĂ€hlen : Ziffer(n) ‘ SelbstĂŒbergang
WĂ€hlen –> Verbinden : gĂŒltigeNummer
WĂ€hlen –> AufgezeichneteNachricht : ungĂŒltigeNummer
WĂ€hlen –> Warnung : ZeitĂŒberschreitung
Warnung –> ZeitĂŒberschreitung : ZeitĂŒberschreitung
Verbinden –> Klingeln : weitergeleitet
Verbinden –> Besetztton : NummerBesetzt
Verbinden –> SchnellerBesetztton : TrunkBesetzt
Klingeln –> Verbunden : angerufenesTelefonAntwortet
Verbunden –> Getrennt : aufgelegt
Verbunden –> Getrennt : angerufenesTelefonLegtAuf
Getrennt –> [*] : AufrĂ€umen

Zustand „Fehler“ als FehlerZustand {
Zustand „Besetztton“ als Besetztton
Zustand „SchnellerBesetztton“ als SchnellerBesetztton
Zustand „AufgezeichneteNachricht“ als AufgezeichneteNachricht
}

‘ Interne Aktionen
Ruhig : Eingang / Warten auf Abheben
WĂ€hltone : Eingang / WĂ€hltone abspielen
WĂ€hlen : Eingang / Ziffern sammeln
Verbinden : Eingang / Anruf weiterleiten
Klingeln : Eingang / Fernes Telefon klingeln lassen
Verbunden : Eingang / Anrufsession herstellen
Getrennt : Eingang / Session beenden

@enduml

đŸ“„Â Wie man verwendet: EinfĂŒgen in PlantUML Live oder Ihre IDE-Plugin.


✅ Mermaid Code

stateDiagram-v2
    [*] --> Idle
    Idle --> DialTone : onHook

    DialTone --> Dialing : digit(n)
    Dialing --> Dialing : digit(n)  ' SelbstĂŒbergang
    Dialing --> Connecting : gĂŒltigeNummer
    Dialing --> RecordedMessage : ungĂŒltigeNummer
    Dialing --> Warning : timeout

    Warning --> Timeout : timeout

    Connecting --> Ringing : weitergeleitet
    Connecting --> BusyTone : Nummer besetzt
    Connecting --> FastBusyTone : Trunk besetzt

    Ringing --> Connected : angerufeneNummer antwortet
    Connected --> Disconnected : onHook
    Connected --> Disconnected : angerufeneNummer legt auf

    Disconnected --> [*] : Bereinigung

    state Fehler {
        BusyTone
        FastBusyTone
        AufgezeichneteNachricht
    }

    Connecting --> BusyTone : Nummer besetzt
    Connecting --> FastBusyTone : Trunk besetzt
    Dialing --> AufgezeichneteNachricht : ungĂŒltigeNummer

    note right of BusyTone
        Standard-Besetztton abspielen
    end note

    note right of FastBusyTone
        Schneller Besetztton abspielen (NetzĂŒberlastung)
    end note

    note right of AufgezeichneteNachricht
        Aufgezeichnete Nachricht abspielen: "Nummer nicht im Service."
    end note

    note right of Timeout
        Anrufversuch nach 40 Sekunden abgebrochen
    end note

đŸ“„Â Wie man es verwendet: EinfĂŒgen in Mermaid Live Editor oder unterstĂŒtzte Markdown-Tools (VS Code, Obsidian usw.).


📚 Zusammenfassung & Schlussgedanken

Dieser Telefonie-Anrufsteuerungssystem Zustandsmaschine ist ein realitÀtsnahes Beispiel davon, wie UML komplexe, ereignisgesteuerte Systeme mit hoher ZuverlÀssigkeit modellieren kann.

✅ Was dieses Diagramm effektiv macht:

  • Klare glĂŒcklicher Pfad mit logischem Ablauf.

  • Umfassende Fehlerbehandlung.

  • Verwendung von SelbstĂŒbergĂ€nge, zusammengesetzte ZustĂ€nde, und Guard-Bedingungen.

  • Visuelle Klarheit durch Gruppierung und Anmerkungen.

đŸ› ïž Wann sollte dieses Muster verwendet werden:

  • Telefoniesysteme

  • IoT-GerĂ€testeuerung

  • Benutzersitzungsverwaltung

  • Workflowsysteme

  • Eingebettete Systeme mit endlichem Zustandslogik


📝 Möchten Sie dies erweitern?

BerĂŒcksichtigen Sie Folgendes:

  • Anrufaufzeichnung Zustand (mit startAufzeichnung, stopAufzeichnung Ereignisse)

  • Anrufumleitung Logik (bedingte Routing)

  • Anrufwarteschleife UnterstĂŒtzung (parallele ZustĂ€nde)

  • Anrufweiterleitung als Unterzustand von Verbunden

  • Zustandsverlauf (oberflĂ€chlicher/tiefer Verlauf) fĂŒr erneuten Eintritt nach Unterbrechung


📌 EndgĂŒltige Empfehlung

Modellieren Sie immer sowohl den Erfolg als auch den Fehlerpfad.
Ein Zustandsmaschine, die nur die „glĂŒcklichen Pfade“ behandelt, ist unvollstĂ€ndig und in der Produktion anfĂ€llig fĂŒr Fehler.

Verwenden Sie diese Anleitung als Vorlage zur Modellierung jedes Echtzeit-Systems, wo ZustandsĂŒbergĂ€nge, Ereignisse, und Fehlerresilienz ist wichtig.


✅ Bereit, zu generieren, zu visualisieren oder zu erweitern?
👉 Kopieren Sie den PlantUML oder Mermaid Code oben und integrieren Sie ihn in Ihre Dokumentation, Architekturdiagramme oder Systemdesigndokumente.

Lassen Sie mich wissen, wenn Sie eine PDF-Version, interaktives Diagramm, oder Integration in ein grĂ¶ĂŸeres Systemmodell (z. B. mit Komponentendiagrammen oder Ablaufdiagrammen)!


📘 „Die besten Systeme sind nicht nur korrekt – sie antizipieren Fehler.“
— Entwerfen mit UML-Zustandsmaschinen