Übungsaufgaben zum UML-Zustandsdiagramm

https://bildung.social/@oerinformatik/

https://oer-informatik.de/uml-zustandsdiagramm-uebungsaufgaben

UML, Zustandsdiagramm, Transition, Guard, Zeitereignis, Historie, Innere Transition, Zustandsautomat, Übungsaufgaben, Prüfungsvorbereitung

tl/dr; (Bearbeitungszeit insgesamt 84 min, mehrere Aufgaben): Drei Übungsaufgaben zum UML-Zustandsdiagramm: zum Einstieg ein Diagramm mit absoluten Zeitereignissen und Uhrzeit-abhängiger Verzweigung ergänzen und auf eine Modellierungslücke prüfen; danach ein Diagramm mit Zählern, Zeitereignissen und Endzuständen aus einer Beschreibung erstellen, einen Ablauf Ereignis für Ereignis nachvollziehen, Testfälle ableiten, Fehler in einem Entwurf korrigieren, ein angefangenes Diagramm mit zusammengesetztem Zustand und Historie ergänzen, Selbsttransition und innere Transition unterscheiden und eine Zustandssteuerung in Java vervollständigen. Alle Lösungen sind ausgeblendet und mit Punkteverteilung versehen [AI-Assisted]. (Zuletzt geändert am 29.10.2026)

Diese Übungsaufgaben gehören zum Artikel UML-Zustandsdiagramm. Eine weitere Übung mit Beispiellösung findest Du unter Übungsaufgabe Session; wie man Benutzeroberflächen mit Zustandsdiagrammen entwirft, zeigt der Artikel UI-States entwerfen.

Hinweise zur Bearbeitung: Als FIA oder FIDP musst Du zur Teil-2-Prüfung Aufgaben auf Kernkompetenz-Ebene lösen können, das ist Aufgabe 2.1. Von FIA wird zusätzlich erwartet, dass ihnen Aufgaben auf Profilkompetenz-Ebene (Aufgabe 3.1 und Aufgabe 3.2) keine Probleme bereiten. Zeichne Deine Diagramme auf Papier oder mit einem Werkzeug Deiner Wahl, bevor Du die Beispiellösung aufklappst. Bezeichnungen dürfen von der Beispiellösung abweichen, solange Zustände als Situation (Adjektiv oder Partizip) benannt und Trigger, Guard und Effekt sauber getrennt sind; andere fachlich richtige Anordnungen sind ebenfalls richtig. Du kannst die folgende Notationsübersicht nutzen:

Notationsübersicht UML-Zustandsdiagramm: Startzustand mit Effekt, Zustand mit entry, do, exit und innerer Transition, Transition mit Trigger, Guard und Effekt, Selbsttransition, Choice, zusammengesetzter Zustand mit flacher Historie, Zeitereignis after, Änderungsereignis when und Endzustand (mit KI erstellt)

Du möchtest eigene Aufgaben zum Üben von einem KI-Sprachmodell generieren lassen?

Kopiere den Text in ein KI-Sprachmodell Deiner Wahl und passe Kompetenzstufe, Anzahl, Bearbeitungszeit und Szenario bei Bedarf an. Wie die Aufgaben aufgebaut sind, beschreibt der Artikel Wie sind die Aufgaben aufgebaut?. Prüfe die Ergebnisse mit dem Lehrartikel: KI-Sprachmodelle machen Fehler.

Erstelle neue Übungsaufgaben zum Thema „UML-Zustandsdiagramm“.

Bauplan: Halte Dich an Aufbau, Kompetenzstufen, Operatoren,
Anforderungsbereiche, Punkte und Zeitschätzung, die im Artikel
https://oer-informatik.de/aufgaben-aufbau beschrieben sind.

Fachliche Grundlage:
- https://oer-informatik.de/uml-zustandsdiagramm
- https://oer-informatik.de/geschaeftsprozess-ui-states-entwerfen
- https://oer-informatik.de/uml-zustandsdiagramm-plantuml
- Stilbeispiel: https://oer-informatik.de/uml-zustandsdiagramm-uebungsaufgaben

Die Aufgaben sollen Inhalte zu diesen Schlagwörtern abdecken:
- UML
- Zustandsdiagramm
- Transition
- Guard
- Zeitereignis
- Historie
- Innere Transition
- Zustandsautomat

Kompetenzstufe: Profilkompetenz (alternativ: Basiskompetenz, Kernkompetenz, Expertise)
Anzahl: 1 Aufgabe mit Teilaufgaben
Bearbeitungszeit in Minuten ca.: <5 bis 30 min>
Szenario: eines der Szenarien aus dem Bauplan

Vorgehen:
1. Lies zuerst die verlinkten Artikel. Kannst Du keine Webseiten
   abrufen, sag mir das, statt zu raten.
2. Steht bei einer Angabe noch ein Platzhalter in <…>, frag mich
   zuerst danach. Richte Punkte und Zahl der Teilaufgaben nach der
   Bearbeitungszeit (ca. 0,9 min je Punkt).
3. Gib je Aufgabe Titel mit Kompetenzstufe, Ausgangssituation und
   Teilaufgaben mit Operator und Punktzahl aus, dazu die geschätzte
   Bearbeitungszeit.
4. Gib die Beispiellösungen mit Punkteverteilung erst aus, wenn ich
   danach frage.

Aufgabe 2.1: Betriebsarten eines Flurmonitors (Kernkompetenz)

(ca. 17 min Bearbeitungszeit)

Im Ratz und Rübe Berufskolleg (RRB) in Bielefeld zeigen Monitore in Foyer und Fluren anonym die offenen Angebote und Gesuche der Mitfahr-App „RatzFahrt“. Jeder Monitor wird von einem kleinen Abspielgerät (Player) gesteuert. Svenja Krämer von der Schul-IT OWL beschreibt das gewünschte Verhalten eines Players:

  • Nach dem Einschalten ist der Player im Zustand „Anzeige aktiv“: Beim Betreten schaltet er den Monitor ein und lädt die offenen Angebote. Bei jedem Minutentakt (minutentakt) lädt er die Angebote neu, ohne den Zustand zu verlassen.

  • Um 18:00 Uhr wechselt der Player in den „Ruhebetrieb“: Beim Betreten schaltet er den Monitor aus. Um 6:30 Uhr wechselt er zurück in „Anzeige aktiv“.

  • Verliert der Player während der Anzeige die Verbindung zum Server (verbindungVerloren), ist er „gestört“: Beim Betreten zeigt er den Hinweis „Angebote zurzeit nicht verfügbar“. Steht die Verbindung wieder (verbindungDa), zeigt er wieder die Angebote an.

  • Die Schul-IT kann den Player aus jedem dieser drei Zustände per Fernzugriff in die „Wartung“ versetzen (wartungStarten). Wird die Wartung beendet (wartungBeenden), wechselt der Player abhängig von der Uhrzeit in „Anzeige aktiv“ (zwischen 6:30 und 18:00 Uhr) oder in den „Ruhebetrieb“.

  • Ausgeschaltet (ausschalten) wird der Player nur im Ruhebetrieb.

Die Zustände hat Svenja bereits angelegt:

Vorgabe: die Zustände Anzeige aktiv (mit entry-Aktivität), Ruhebetrieb (mit entry-Aktivität), gestört und Wartung, noch ohne Transitionen (mit KI erstellt)

a) Ergänze das Zustandsdiagramm nach UML 2.5.1 um Start- und Endzustand, alle Transitionen mit Triggern und guards, die fehlende entry-Aktivität und die innere Transition. (12 Punkte)

Beispiellösung: Zustandsdiagramm des Flurmonitor-Players mit absoluten Zeitereignissen at(18:00) und at(06:30), innerer Transition minutentakt, Störungszustand, Wartung aus drei Zuständen und Choice nach wartungBeenden (mit KI erstellt)

Punkteverteilung:

  • Startzustand mit Transition zu „Anzeige aktiv“ und Endzustand nach ausschalten aus dem Ruhebetrieb: 1 Punkt,

  • at(18:00) und at(06:30) als absolute Zeitereignisse zwischen „Anzeige aktiv“ und „Ruhebetrieb“: 2 Punkte,

  • innere Transition minutentakt / angeboteLaden() in „Anzeige aktiv“: 2 Punkte,

  • verbindungVerloren und verbindungDa zwischen „Anzeige aktiv“ und „gestört“, entry / stoerhinweisAnzeigen() in „gestört“: 2 Punkte,

  • drei Transitionen wartungStarten nach „Wartung“: 2 Punkte (alternativ: „Anzeige aktiv“, „Ruhebetrieb“ und „gestört“ in einem zusammengesetzten Zustand mit einer gemeinsamen Transition wartungStarten),

  • wartungBeenden zu einer choice mit den guards [uhrzeit >= 06:30 und uhrzeit < 18:00] und [else]: 3 Punkte. Zwei Transitionen mit demselben Trigger und sich ausschließenden guards direkt aus „Wartung“ sind ebenfalls richtig.

Typische Fehler: Zeitpunkte mit after(…) statt at(…) modellieren (after misst die Dauer seit Betreten des Zustands); das Neuladen als Selbsttransition zeichnen (dann würde bei jedem Takt die entry-Aktivität erneut den Monitor einschalten); die Uhrzeit als Trigger statt als guard an die choice schreiben; den [else]-Zweig vergessen.

b) Der Player ist um 17:50 Uhr im Zustand „Anzeige aktiv“. Um 17:55 Uhr bricht die Verbindung ab, um 18:05 Uhr steht sie wieder. Gib an, in welchem Zustand der Player um 18:10 Uhr ist, erläutere das Problem und schlage eine Änderung des Modells vor. (4 Punkte)

Ablauf: 17:55 Uhr verbindungVerloren → „gestört“. Um 18:00 Uhr tritt at(18:00) ein, aber in „gestört“ gibt es dafür keine Transition – das Ereignis verfällt. 18:05 Uhr verbindungDa → „Anzeige aktiv“. Um 18:10 Uhr ist der Player also „Anzeige aktiv“ (1 Punkt).

Problem: Der Monitor bleibt die ganze Nacht eingeschaltet, weil das nächste at(18:00) erst am folgenden Abend eintritt (1 Punkt).

Änderung (2 Punkte), z. B.: Nach verbindungDa entscheidet wie nach der Wartung eine choice anhand der Uhrzeit, ob der Player in „Anzeige aktiv“ oder in den „Ruhebetrieb“ wechselt:

Korrektur: Aus dem Zustand gestört führt verbindungDa zu einer Choice, die je nach Uhrzeit nach Anzeige aktiv oder Ruhebetrieb verzweigt (mit KI erstellt)

Alternativ: zusätzliche Transition at(18:00) von „gestört“ in den „Ruhebetrieb“ (der Player zeigt dann aber bis 6:30 Uhr nicht an, ob die Verbindung wieder steht). Ein Änderungsereignis when(uhrzeit >= 18:00) in „Anzeige aktiv“ statt at(18:00) hilft dagegen nicht: Es tritt nur ein, wenn die Bedingung von falsch zu wahr wechselt (UML 2.5.1, Abschnitt 13.3.3) – das geschieht um 18:00 Uhr, während der Player „gestört“ ist, und beim Betreten von „Anzeige aktiv“ um 18:05 Uhr ist die Bedingung schon wahr.

c) Begründe, warum das Neuladen der Angebote als innere Transition und nicht als Selbsttransition modelliert wird. (2 Punkte)

Bei einer inneren Transition bleibt der Player im Zustand, exit- und entry-Aktivitäten werden nicht ausgeführt; es wird nur angeboteLaden() aufgerufen (1 Punkt). Bei einer Selbsttransition würde der Zustand verlassen und neu betreten, sodass jede Minute erneut monitorEin() ausgeführt würde – unnötig und im Diagramm missverständlich (1 Punkt).

Aufgabe 3.1: Aktivitäten und Konten in einer Freizeit-App (Profilkompetenz)

(ca. 31 min Bearbeitungszeit)

Du bist Auszubildende*r bei der Let’s Meet GmbH in Bielefeld. Das Team baut das Backend der Freizeit-App „Let’s Meet“ neu auf. Yusuf Demir, Leiter der Entwicklung, möchte, dass vor der Programmierung das Verhalten der wichtigsten Objekte als UML-Zustandsdiagramm feststeht („Erst das Modell, dann der Code“). Für Aktivitäten gibt es dazu eine neue Angabe: Neben der Höchstzahl max an Teilnehmenden legt die Person, die eine Aktivität anlegt, eine Mindestzahl min fest. Es gilt immer 2 <= min < max.

Clara Neumann (Product Owner) hat die Regeln für eine Aktivität so beschrieben:

  • Wird eine Aktivität angelegt, ist sie zunächst „offen“. Die Person, die sie anlegt, zählt als erste Teilnehmerin bzw. erster Teilnehmer (teilnehmende := 1).

  • Jede Anmeldung erhöht die Zahl der Teilnehmenden um 1, jede Abmeldung verringert sie um 1.

  • Sobald durch eine Anmeldung die Mindestzahl erreicht ist, ist die Aktivität „bestätigt“. Immer wenn die Aktivität bestätigt wird, erhalten alle Angemeldeten eine Bestätigung.

  • Sinkt die Zahl durch eine Abmeldung wieder unter die Mindestzahl, ist die Aktivität wieder „offen“.

  • Ist durch eine Anmeldung die Höchstzahl erreicht, ist die Aktivität „ausgebucht“. Weitere Anmeldungen kommen dann auf die Warteliste; die Aktivität bleibt ausgebucht.

  • Meldet sich bei einer ausgebuchten Aktivität jemand ab und steht jemand auf der Warteliste, rückt die erste Person der Warteliste nach; die Aktivität bleibt ausgebucht. Ist die Warteliste leer, ist die Aktivität wieder „bestätigt“.

  • Die Person, die die Aktivität angelegt hat, kann sie jederzeit vor Beginn absagen. Ist die Mindestzahl 24 Stunden vor Beginn nicht erreicht, wird die Aktivität automatisch abgesagt. Bei jeder Absage erhalten alle Angemeldeten eine Nachricht.

  • Ist das Ende einer bestätigten oder ausgebuchten Aktivität erreicht, hat sie „stattgefunden“; die Bewertungsfunktion wird freigeschaltet.

  • Nach dem Löschkonzept der Datenschutzbeauftragten Dr. Marta Kowalczyk werden stattgefundene Aktivitäten 14 Tage nach dem Ende anonym archiviert, abgesagte Aktivitäten 14 Tage nach der Absage gelöscht. Danach existiert das Objekt nicht mehr.

Nicht berücksichtigt werden sollen: ein Anmeldeschluss, Abmeldungen nach Beginn, die Abmeldung der Person, die die Aktivität angelegt hat (sie kann nur absagen), und das Mindestalter.

a) Erstelle für eine Aktivität ein UML-Zustandsdiagramm, das die beschriebenen Regeln vollständig abbildet. Verwende die Variablen teilnehmende, min, max und warteliste (Anzahl der Personen auf der Warteliste) sowie die Notation aus der Übersicht. (18 Punkte)

Beispiellösung: Zustandsdiagramm einer Aktivität mit den Zuständen offen, bestätigt, ausgebucht, abgesagt und stattgefunden; Zähler-Transitionen mit Guards, innere Transitionen für Warteliste und Nachrücken, Zeitereignisse at und after und zwei Transitionen zum Endzustand (mit KI erstellt)

Punkteverteilung (18 Punkte):

  • 5 Zustände, je 1 P (5 P): offen, bestätigt, ausgebucht, abgesagt, stattgefunden.

  • 3 entry-Aktivitäten, je 1 P (3 P): Bestätigung an alle senden (bestätigt), Absage an alle senden (abgesagt), Bewertung freischalten (stattgefunden).

  • Startzustand mit Effekt / teilnehmende := 1 und zwei Transitionen zum Endzustand mit after(14 Tage) und Effekt (2 P).

  • 16 Transitionen bzw. innere Transitionen mit vollständiger Beschriftung, je 0,5 P (8 P):

    • offen: Anmelden unter bzw. ab der Mindestzahl (2), Abmelden (1), Absagen (1), at(beginn - 24 h) (1),

    • bestätigt: Anmelden unter bzw. bei der Höchstzahl (2), Abmelden ab bzw. unter der Mindestzahl (2), Absagen (1), at(ende) (1),

    • ausgebucht: Anmelden auf die Warteliste (1), Abmelden mit bzw. ohne Warteliste (2), Absagen (1), at(ende) (1).

Hinweise zur Bewertung:

  • Der guard wird vor dem Effekt geprüft. Deshalb steht dort teilnehmende + 1 bzw. teilnehmende - 1. Gleichwertig ist z. B. anmelden [teilnehmende = min - 1] statt [teilnehmende + 1 >= min]. Wer die Zähleränderung zuerst als Effekt notiert und dann über eine choice entscheidet, erhält ebenfalls die volle Punktzahl, sofern ein [else]-Zweig vorhanden ist.

  • Die Zählertransitionen, die im Zustand bleiben, dürfen auch als Selbsttransitionen gezeichnet werden. Dann würde in „bestätigt“ aber bei jeder An- und Abmeldung erneut die entry-Aktivität ausgeführt und allen eine Bestätigung geschickt – das widerspricht der Beschreibung. In diesem Fall 0,5 P Abzug.

  • Die drei Transitionen absagen dürfen durch einen zusammengesetzten Zustand (z. B. „anstehend“ mit offen, bestätigt und ausgebucht) und eine einzige Transition ersetzt werden.

  • Bei at(beginn - 24 h) ist auch when(jetzt = beginn - 24 h) richtig. Ein guard [teilnehmende < min] ist nicht nötig, weil die Transition nur aus „offen“ führt.

  • Typische Fehler: Tätigkeiten als Zustände („Aktivität absagen“), guard an der Starttransition, Lücken bei den Grenzwerten (z. B. [teilnehmende < min] und [teilnehmende > min] – was passiert genau bei min?), Transition aus dem Endzustand, fehlende Transition von „ausgebucht“ nach „stattgefunden“.

b) Lea Schmitt legt einen Brettspielabend mit min = 3 und max = 5 an. Danach treten die folgenden Ereignisse in dieser Reihenfolge ein. Ermittle für jedes Ereignis den Zustand der Aktivität, die Zahl der Teilnehmenden und die Länge der Warteliste nach dem Ereignis, und gib an, ob Bestätigungen verschickt werden. (4 Punkte)

Ereignisfolge für den Brettspielabend
Nr. Ereignis
1 Malik Haddad meldet sich an.
2 Kim Bauer meldet sich an.
3 Daniel Owusu meldet sich an.
4 Petra Novak meldet sich an.
5 Rainer Krause meldet sich an.
6 Kim Bauer meldet sich ab.
7 Malik Haddad meldet sich ab.
8 Tobias Lange meldet sich an.

Nach dem Anlegen: offen, teilnehmende = 1, Warteliste 0.

Lösung: Zustände und Zähler nach jedem Ereignis
Nr. Ereignis Zustand danach Teilnehmende Warteliste Bestätigungen
1 Malik meldet sich an offen 2 0 nein
2 Kim meldet sich an bestätigt 3 0 ja, an alle 3
3 Daniel meldet sich an bestätigt 4 0 nein
4 Petra meldet sich an ausgebucht 5 0 nein
5 Rainer meldet sich an ausgebucht 5 1 nein
6 Kim meldet sich ab ausgebucht 5 0 nein (Rainer rückt nach)
7 Malik meldet sich ab bestätigt 4 0 ja, erneut an alle 4
8 Tobias meldet sich an ausgebucht 5 0 nein

Je Zeile 0,5 P. Bei Ereignis 7 wird „bestätigt“ über eine externe Transition neu betreten; deshalb läuft die entry-Aktivität erneut und alle erhalten noch einmal eine Bestätigung. Ob das gewünscht ist, sollte mit Clara Neumann geklärt werden – das Modell macht diese Folge der Beschreibung sichtbar.

c) Jonas Weber, Dein Mit-Azubi, soll die Implementierung testen. Erstelle vier Testfälle, die vier verschiedene Transitionen aus dem Zustand „bestätigt“ prüfen. Gib je Testfall den Ausgangszustand mit den nötigen Werten (min = 3, max = 5), das Ereignis und den erwarteten Folgezustand mit dem erwarteten Wert von teilnehmende an. (4 Punkte)

Je richtigem Testfall 1 P, zum Beispiel:

Lösung: Testfälle für die Transitionen aus „bestätigt“
Nr. Ausgangszustand Ereignis erwarteter Zustand erwartet teilnehmende
1 bestätigt, teilnehmende = 3 anmelden bestätigt 4
2 bestätigt, teilnehmende = 4 anmelden ausgebucht 5
3 bestätigt, teilnehmende = 4 abmelden bestätigt 3
4 bestätigt, teilnehmende = 3 abmelden offen 2

Ebenfalls richtig: absagen → abgesagt (Absage an alle) oder Erreichen des Endes (at(ende)) → stattgefunden (Bewertung freigeschaltet). Die Testfälle 2 und 4 prüfen genau die Grenzwerte, an denen der Zustand wechselt – solche Grenzwerttests decken die häufigsten Fehler auf (z. B. < statt <=).

d) Jonas hat außerdem einen ersten Entwurf für die Zustände eines Benutzerkontos gezeichnet. Dafür gelten folgende Regeln:

  • Nach der Registrierung ist ein Konto „unverifiziert“.

  • Bei der Verifizierung berechnet die App das Alter aus den Ausweisdaten. Ist die Person mindestens 16 Jahre alt, ist das Konto „aktiv“. Andernfalls wird das Konto gelöscht und existiert nicht mehr.

  • Das Moderationsteam kann ein aktives Konto sperren und ein gesperrtes Konto wieder entsperren. Beim Sperren erhält die Person einen Hinweis mit der Begründung.

  • Aktive und gesperrte Konten können gelöscht werden. Ein gelöschtes Konto wird deaktiviert. Innerhalb von 30 Tagen kann es wiederhergestellt werden und ist dann wieder aktiv; nach 30 Tagen wird es anonymisiert und existiert nicht mehr.

Fehlerhafter Entwurf: Zustandsdiagramm eines Benutzerkontos mit den Zuständen unverifiziert, aktiv, Konto sperren und gelöscht, einer Choice und zwei Startzuständen (mit KI erstellt)

Der Entwurf enthält vier Fehler. Beschreibe die vier Fehler und gib jeweils an, wie sie korrigiert werden. (8 Punkte)

Je Fehler 1 P für die Beschreibung und 1 P für die Korrektur:

  1. „Konto sperren“ ist eine Tätigkeit, kein Zustand. Außerdem fehlt der Hinweis an die Person. Korrektur: Zustand „gesperrt“ mit entry / sperrhinweisSenden() (alternativ als Effekt an der Transition sperren / sperrhinweisSenden()).

  2. Die choice hat keinen [else]-Zweig. Ist die Person jünger als 16, gibt es keinen Ausgang; das System bliebe im Pseudozustand hängen. Korrektur: zweiter Zweig [else] / kontoLoeschen() zum Endzustand.

  3. Zweiter Startzustand mit Trigger: Auf einer Ebene darf es nur einen Startzustand geben, und an der Starttransition steht kein Trigger. Das Wiederherstellen ist ein Übergang aus „gelöscht“. Korrektur: zweiten Startzustand entfernen, Transition wiederherstellen von „gelöscht“ nach „aktiv“.

  4. Trigger und Effekt sind vertauscht: anonymisieren() / after(30 Tage) würde bedeuten, dass ein Ereignis „anonymisieren“ den Übergang auslöst und als Wirkung 30 Tage gewartet wird. Korrektur: after(30 Tage) / anonymisieren().

Korrigierter Entwurf: Zustandsdiagramm eines Benutzerkontos mit einem Startzustand, Choice mit else-Zweig, Zustand gesperrt mit entry-Aktivität und Wiederherstellen aus gelöscht (mit KI erstellt)

Für Expert*innen: Strenggenommen würde ein gesperrtes Konto nach Löschen und Wiederherstellen wieder „aktiv“ – die Sperre ließe sich so umgehen. Abhilfe: „aktiv“ und „gesperrt“ in einem zusammengesetzten Zustand zusammenfassen, die Transition loeschen an dessen Rand hängen und beim Wiederherstellen in die Historie (H) zurückkehren. Das wird hier nicht bewertet.

Aufgabe 3.2: E-Ink-Türschilder für ein Barcamp (Profilkompetenz)

(ca. 36 min Bearbeitungszeit)

Du bist Auszubildende*r im Schüler*innen-Team, das für das Barcamp „Lernen.Digital.Leben 2027“ am Ratz und Rübe Berufskolleg die Technik vorbereitet. Vor jedem der acht Session-Räume hängt ein E-Ink-Türschild (ESP32 mit 7,5-Zoll-E-Paper und Akku), das per WLAN im VLAN 120 Nachrichten des MQTT-Brokers empfängt. Emre Aksoy, der das Technikteam leitet, hat die Firmware begonnen und das Verhalten so beschrieben:

  • Nach dem Einschalten ist das Türschild „verbindend“: Beim Betreten baut es die WLAN-Verbindung auf; solange es in diesem Zustand ist, sucht es den MQTT-Broker.

  • Ist die Verbindung hergestellt (verbunden), ist das Türschild „im Betrieb“ und zeigt zunächst die Sessionanzeige (aktuelle und nächste Session des Raums).

  • Ein kurzer Tastendruck (tasteKurz) in der Sessionanzeige zeigt den Tagesplan mit allen fünf Slots. Ein weiterer kurzer Tastendruck oder 30 Sekunden ohne Tastendruck führen zurück zur Sessionanzeige.

  • Sendet das Orga-Team einen Hinweis (hinweis(text)), zeigt das Türschild – egal ob gerade Sessionanzeige oder Tagesplan zu sehen ist – den Hinweis an. Mit einem kurzen Tastendruck wird der Hinweis quittiert; dabei sendet das Türschild eine Quittung an den Broker und zeigt wieder die Sessionanzeige.

  • Meldet der Sessionplaner in der Sessionanzeige eine Planänderung (planGeaendert), wird nur die Anzeige aktualisiert, ohne die Sessionanzeige zu verlassen.

  • Im Betrieb meldet das Türschild bei jedem Takt des internen Zeitgebers (takt, einmal pro Minute) seinen Akkustand an den Broker – unabhängig davon, was gerade angezeigt wird.

  • Bricht die Verbindung im Betrieb ab (verbindungVerloren), ist das Türschild „offline“: Beim Betreten zeigt es ein Offline-Symbol; solange es offline ist, versucht es, die Verbindung wiederherzustellen. Ist es wieder verbunden, zeigt es die Anzeige, die zuletzt aktiv war.

  • Sinkt der Akkustand im Betrieb unter 10 %, wechselt das Türschild ins „Energiesparen“: Beim Betreten zeigt es den Hinweis „Bitte laden“ und schaltet das WLAN ab. Wird das Ladekabel eingesteckt, verbindet es sich neu.

  • Ein langer Tastendruck (tasteLang) im Betrieb meldet das Türschild beim Broker ab und schaltet es aus.

Ein niedriger Akkustand in den Zuständen „verbindend“ und „offline“ soll nicht berücksichtigt werden.

Emre hat bereits begonnen:

Vorgabe: angefangenes Zustandsdiagramm des Türschilds mit Startzustand, dem Zustand verbindend mit entry- und do-Aktivität und dem zusammengesetzten Zustand im Betrieb mit dem Unterzustand Sessionanzeige (mit KI erstellt)

a) Ergänze das vorgegebene Zustandsdiagramm entsprechend der Beschreibung. (20 Punkte)

Beispiellösung: Zustandsdiagramm des Türschilds mit dem zusammengesetzten Zustand im Betrieb (Sessionanzeige, Tagesplan, Hinweis, flache Historie, innere Transition takt), den Zuständen offline und Energiesparen und dem Endzustand (mit KI erstellt)

Punkteverteilung (20 Punkte):

  • 4 neue Zustände, je 1 P (4 P): Tagesplan, Hinweis, offline, Energiesparen.

  • 5 innere Aktivitäten, je 0,5 P (2,5 P): Tagesplan entry, Hinweis entry, offline entry und do, Energiesparen entry.

  • Sessionanzeige ↔︎ Tagesplan: tasteKurz hin und zurück sowie after(30 s) (3 P).

  • Hinweis: zwei Transitionen hinweis(text) aus Sessionanzeige und Tagesplan (1 P), Quittieren mit tasteKurz / quittungSenden() (1 P).

  • innere Transition planGeaendert / anzeigeAktualisieren() in der Sessionanzeige (1 P).

  • innere Transition takt / akkustandSenden() am zusammengesetzten Zustand „im Betrieb“ (1 P).

  • verbindungVerloren vom Rand des zusammengesetzten Zustands nach „offline“ (1,5 P).

  • Rückkehr verbunden in die flache Historie (H) mit Standard-Unterzustand Sessionanzeige (2 P).

  • when(akkustand < 10) nach „Energiesparen“ und ladekabelEingesteckt nach „verbindend“ (2 P).

  • tasteLang / beimBrokerAbmelden() zum Endzustand (1 P).

Hinweise zur Bewertung:

  • Transitionen, die für alle Unterzustände gelten (verbindungVerloren, when(akkustand < 10), tasteLang, takt), gehören an den Rand des zusammengesetzten Zustands. Wer sie einzeln an alle drei Unterzustände zeichnet, erhält die Punkte ebenfalls, wenn keine fehlt.

  • Ohne Historie würde das Türschild nach einem Verbindungsabbruch immer in der Sessionanzeige beginnen. Das widerspricht „zeigt die Anzeige, die zuletzt aktiv war“. Tiefe Historie (H*) ist hier ebenfalls richtig, weil es nur eine Ebene gibt.

  • Statt when(akkustand < 10) ist auch ein Trigger mit guard richtig, z. B. takt [akkustand < 10] als externe Transition – dann wird nur einmal pro Minute geprüft.

  • Wer die entry-Aktivität von Energiesparen in zwei Zeilen aufteilt, erhält die Punkte ebenfalls.

b) Auch im Tagesplan soll eine Planänderung die Anzeige aktualisieren. Svenja Krämer schlägt dafür eine Selbsttransition planGeaendert am Zustand „Tagesplan“ vor, Emre eine innere Transition planGeaendert / tagesplanAnzeigen(). Erläutere, wie sich beide Varianten im Ablauf unterscheiden, und begründe, welche Variante Du wählst. (4 Punkte)

Unterschied (2 P): Bei der Selbsttransition wird der Zustand verlassen und neu betreten. Die entry-Aktivität tagesplanAnzeigen() läuft erneut, und das Zeitereignis after(30 s) beginnt neu zu zählen, weil es ab dem Betreten des Zustands misst. Bei der inneren Transition bleibt der Zustand aktiv: Es läuft nur die angegebene Aktion, entry wird nicht ausgeführt, und die 30 Sekunden laufen weiter.

Begründung (2 P), beide Entscheidungen sind mit passender Begründung richtig, zum Beispiel:

  • Innere Transition: Die Person soll nach 30 Sekunden wie gewohnt zur Sessionanzeige zurückkommen; eine Planänderung, die sie gar nicht ausgelöst hat, soll die Anzeigezeit nicht verlängern. Bei mehreren Änderungen kurz hintereinander bliebe der Tagesplan sonst beliebig lange stehen.

  • Selbsttransition: Nach einer Änderung soll die Person den neuen Plan vollständig 30 Sekunden lang lesen können; außerdem wird die Anzeige ohnehin über entry neu aufgebaut, eine zweite Aktion ist nicht nötig.

c) Das Türschild vor Raum A.105 zeigt seit 10 Sekunden den Tagesplan. Dann tritt Folgendes ein:

  1. Die WLAN-Verbindung bricht ab.

  2. 20 Sekunden später ist die Verbindung wiederhergestellt.

  3. 30 Sekunden lang drückt niemand die Taste.

  4. Der Takt des Zeitgebers tritt ein.

  5. Das Orga-Team sendet den Hinweis „Keynote beginnt 10 Minuten später“.

  6. Der Sessionplaner meldet eine Planänderung.

  7. Eine Teilnehmerin drückt kurz die Taste.

Ermittle mithilfe Deines Diagramms aus a) für jeden Schritt den Zustand (bei „im Betrieb“ mit Unterzustand) nach dem Schritt und alle Aktivitäten und Aktionen, die dabei in der richtigen Reihenfolge ausgeführt werden. (5 Punkte)

Lösung: Ablauf des Türschilds Schritt für Schritt
Schritt Zustand danach ausgeführte Aktivitäten und Aktionen
1 offline offlineSymbolAnzeigen() (entry), dann startet verbindungWiederherstellen() (do)
2 im Betrieb / Tagesplan do wird beendet; über die Historie zurück in den Tagesplan: tagesplanAnzeigen() (entry), after(30 s) beginnt neu
3 im Betrieb / Sessionanzeige aktuelleSessionAnzeigen() (entry)
4 im Betrieb / Sessionanzeige akkustandSenden() (innere Transition, kein Zustandswechsel, kein entry)
5 im Betrieb / Hinweis hinweisAnzeigen(text) (entry)
6 im Betrieb / Hinweis keine – im Zustand Hinweis ist planGeaendert nicht modelliert, das Ereignis verfällt
7 im Betrieb / Sessionanzeige quittungSenden() (Effekt), dann aktuelleSessionAnzeigen() (entry)

Punkte: Zustände der Schritte 1–7 je 0,5 P (3,5 P); Historie in Schritt 2 (Tagesplan statt Sessionanzeige) und Reihenfolge Effekt vor entry in Schritt 7 (1,5 P).

Hinweis: In Schritt 6 ginge die Planänderung „verloren“. Spätestens beim nächsten Betreten der Sessionanzeige wird über entry der aktuelle Stand angezeigt – das ist hier ausreichend, sollte aber bewusst entschieden werden.

d) Für die Firmware schreibt Emre die Steuerung der drei Anzeigen in Java. Ereignisse, die außerhalb von „im Betrieb“ wirken, behandelt eine andere Klasse. Die entry-Aktivitäten hat er in der Methode wechsleZu() zusammengefasst; der Fall SESSIONANZEIGE ist fertig.

public class TuerschildAnzeige {

    enum Zustand { SESSIONANZEIGE, TAGESPLAN, HINWEIS }
    enum Ereignis { TASTE_KURZ, TIMEOUT_30S, HINWEIS, PLAN_GEAENDERT }

    private Zustand zustand = Zustand.SESSIONANZEIGE;
    private String hinweistext = "";

    public void verarbeite(Ereignis e, String text) {
        switch (zustand) {
            case SESSIONANZEIGE:
                if (e == Ereignis.TASTE_KURZ) {
                    wechsleZu(Zustand.TAGESPLAN);
                } else if (e == Ereignis.HINWEIS) {
                    hinweistext = text;
                    wechsleZu(Zustand.HINWEIS);
                } else if (e == Ereignis.PLAN_GEAENDERT) {
                    anzeigeAktualisieren();
                }
                break;
            case TAGESPLAN:
                // zu ergänzen
            case HINWEIS:
                // zu ergänzen
        }
    }

    private void wechsleZu(Zustand neu) {
        zustand = neu;
        switch (neu) {                                   // entry-Aktivitäten
            case SESSIONANZEIGE: aktuelleSessionAnzeigen(); break;
            case TAGESPLAN:      tagesplanAnzeigen(); starteTimer(30); break;
            case HINWEIS:        hinweisAnzeigen(hinweistext); break;
        }
    }
    // aktuelleSessionAnzeigen(), tagesplanAnzeigen(), hinweisAnzeigen(String),
    // anzeigeAktualisieren(), quittungSenden(), starteTimer(int), stoppeTimer() ...
}

Vervollständige die Methode verarbeite() für die Fälle TAGESPLAN und HINWEIS entsprechend Deinem Zustandsdiagramm. (6 Punkte)

            case TAGESPLAN:
                if (e == Ereignis.TASTE_KURZ || e == Ereignis.TIMEOUT_30S) {
                    stoppeTimer();
                    wechsleZu(Zustand.SESSIONANZEIGE);
                } else if (e == Ereignis.HINWEIS) {
                    stoppeTimer();
                    hinweistext = text;
                    wechsleZu(Zustand.HINWEIS);
                }
                break;
            case HINWEIS:
                if (e == Ereignis.TASTE_KURZ) {
                    quittungSenden();                    // Effekt der Transition
                    wechsleZu(Zustand.SESSIONANZEIGE);
                }
                break;

Punkteverteilung (6 Punkte):

  • TAGESPLAN: Rückkehr zur Sessionanzeige bei TASTE_KURZ oder TIMEOUT_30S (2 P), Hinweis mit Übernahme des Textes und Wechsel nach HINWEIS (1 P), break (0,5 P).

  • HINWEIS: bei TASTE_KURZ zuerst quittungSenden(), dann wechsleZu(Zustand.SESSIONANZEIGE) (2 P), break (0,5 P).

Hinweise zur Bewertung:

  • stoppeTimer() ist nicht verlangt, verhindert aber, dass ein alter Timer später ein TIMEOUT_30S auslöst, obwohl das Türschild den Tagesplan schon verlassen hat. Wer stattdessen begründet, dass TIMEOUT_30S außerhalb von TAGESPLAN ohnehin ignoriert wird, liegt ebenfalls richtig – allerdings nur, solange das Türschild nicht innerhalb der 30 Sekunden erneut in den Tagesplan wechselt.

  • Ohne break würde der Fall TAGESPLAN in HINWEIS „durchfallen“ (fall-through), und ein kurzer Tastendruck im Tagesplan würde zusätzlich eine Quittung senden.

  • Alle nicht genannten Ereignisse (z. B. PLAN_GEAENDERT im Hinweis) werden bewusst ignoriert – genau wie im Diagramm.

e) Petra Schulze-Albers, die Schulleiterin, fragt, warum das Team für das Türschild kein Aktivitätsdiagramm gezeichnet hat, das kenne sie aus dem Unterricht ihrer Kolleg*innen. Begründe, warum für das Verhalten des Türschilds ein Zustandsdiagramm besser geeignet ist. (3 Punkte)

Beispielbegründung (3 P, je fachlich richtigem Argument 1–1,5 P):

  • Das Türschild arbeitet ereignisgesteuert: Tastendrücke, Hinweise, Planänderungen, Verbindungsabbrüche und der Takt können jederzeit eintreffen. Es gibt keinen festen Ablauf von Arbeitsschritten mit Anfang und Ende, den ein Aktivitätsdiagramm darstellt.

  • Die Reaktion hängt vom aktuellen Zustand ab: Derselbe kurze Tastendruck öffnet den Tagesplan, schließt ihn wieder oder quittiert einen Hinweis. Genau das zeigt das Zustandsdiagramm übersichtlich, ein Aktivitätsdiagramm bräuchte dafür viele verschachtelte Verzweigungen.

  • Das Zustandsdiagramm ist eine direkte Vorlage für die Implementierung (Zustandsvariable oder Zustandsmuster) und für Testfälle (je Transition ein Test).

Ergänzend (ohne Bewertung): Die Planänderung meldet der Sessionplaner an alle angemeldeten Anzeigen – das entspricht dem Beobachter-Muster; das Zustandsdiagramm beschreibt dann, wie jede einzelne Anzeige darauf reagiert.

f) Svenja beschriftet in ihrem Entwurf die Transition aus „offline“ zurück in den Betrieb nur mit [verbunden] statt mit dem Ereignis verbunden. Erläutere, wann dieser guard nach UML geprüft wird, und gib eine präzisere Beschriftung an. (2 Punkte)

Eine Transition ohne Trigger ist eine Abschlusstransition: Der guard [verbunden] wird nur einmal geprüft, wenn „offline“ sein inneres Verhalten beendet hat (Ende der do-Aktivität). Ist die Verbindung in diesem Moment noch nicht da, wechselt das Türschild nicht mehr in den Betrieb – auch wenn die Verbindung später steht. (1 Punkt)

Präziser ist das Signal-Ereignis verbunden (wie in der Beschreibung) oder das Änderungsereignis when(verbunden). (1 Punkt)


Hinweis zur Nachnutzung als Open Educational Resource (OER)

Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Übungsaufgaben zum UML-Zustandsdiagramm” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/uml-zustandsdiagramm-uebungsaufgaben veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/uml/uml-diagramme. Erstellt mit KI-Assistenz; von mir umfassend redaktionell überarbeitet, geprüft und freigegeben. Stand: 29.10.2026.

[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: