Zum Inhalt springen
ausgeliefertIn Weiterentwicklung · das Meldemodul ist nach einem Feldtest mit Behörden live

Full-Stack-Krisenkommunikation für Behörden

Bei einem Unternehmen für Krisenkommunikation: Meldemodul mit Angular und Java, Android-App für Fahrzeugbesatzungen über Funk, mehrsprachige Notfall-Web-App für die Bevölkerung im WLAN und ein öffentliches Anzeigesystem.

Kommunen schickten Lageberichte auf Papier und als Word-Dateien an die Leitstelle ihres Kreises, sodass sie ohne gemeinsame Struktur, Status und Historie ankamen.

Rolle:
Senior Fullstack Developer über Web, Backend, Android und Anzeigesoftware hinweg
Stack:
Angular · Java · Play Framework · MySQL · TypeScript · PrimeNG · WebSockets · Android · Python · SQLite
Zeitraum:
Seit 2025
veröffentlicht:
Software für Krisenkommunikation: Architektur Obere Reihe, das Meldemodul: Kommunen füllen das Meldeformular aus und die Leitstelle arbeitet im Dashboard, beides in einem Client mit Angular und PrimeNG mit WebSocket-Updates, auf einem Backend mit Java und Play für Meldungen und Sperren, gespeichert in MySQL. Untere Reihe, das Anzeigesystem: Das Bedienpersonal nutzt eine Oberfläche für Vorschau und Veröffentlichung in Angular auf einer Middleware mit Java und Play samt Übertragungsschicht, und ein Python-Renderer zeichnet die Mitteilung für ein E-Paper-Panel. Dritte Reihe, die Feld-Tablets: Fahrzeugbesatzungen nutzen eine Android-App mit Offline-Karte und Warteschlange, die über eine private Funkstrecke ein Gateway in Java erreicht, gespeichert in MySQL. Vierte Reihe, die App für die Bevölkerung: eine Web-App im lokalen WLAN mit geführten Meldungen und einem Postausgang im Browser, die ein Backend mit Java und Play aufruft, gespeichert in MySQL. Kommunen Meldeformular Leitstelle Dashboard · Prüfung Angular PrimeNG · TypeScript WebSockets Java · Play Meldungen Sperren · Versionen MySQL Bedienpersonal öffentliche Mitteilungen Angular Vorschau · Freigabe Java · Play Übertragungsschicht Python E-Paper-Panel Fahrzeugbesatzungen Feld-Tablet Android Offline-Karte Warteschlange Funk Java Funk-Gateway MySQL Bevölkerung Handy im lokalen WLAN Web-App Notfallmeldung Postausgang Java · Play Meldungen MySQL
Vier Produkte: Meldemodul und Anzeigesystem nutzen einen Angular-Client auf einem Backend mit Java und Play, mit einem Python-Renderer vor dem Panel; die Feld-Tablets erreichen über eine private Funkstrecke ein Gateway in Java; die Bevölkerung erreicht ihre Web-App über lokales WLAN. · seitlich scrollen, um alles zu sehen

Problem und Rahmenbedingungen

Ich arbeite bei einem Unternehmen für Krisenkommunikation, dessen Software Behörden nutzen. Eine Lücke fiel besonders auf: Im Ereignisfall schickten Kommunen ihre Lageberichte noch auf Papier und als Word-Dateien an die Leitstelle ihres Kreises. Die Meldungen brauchten eine gemeinsame Struktur, einen sichtbaren Status und eine Historie.

Frühere Versionen des Produkts sind bereits ausgeliefert, und die Entwicklung geht mit neuen Versionen weiter. Das Meldemodul hat einen Feldtest mit den Kommunen eines Kreises durchlaufen und ist jetzt live; seine Ergebnisse unten stammen aus diesem Feldtest, nicht aus dem laufenden Betrieb.

Meine Rolle umfasst den gesamten Stack und mehr als ein Produkt: Web, Backend, Android-Tablets, eine Web-App für die Bevölkerung und öffentliche Anzeigen. Ich verantworte technische Entscheidungen, und andere Entwickler arbeiten nach meinen Plänen und Reviews.

Architektur

Das Meldemodul ist ein Client mit Angular und PrimeNG auf einem Backend mit Java und dem Play Framework und MySQL. Auf der einen Seite steht ein mehrseitiges Meldeformular mit Validierung, Plausibilitätswarnungen, automatischem Speichern von Entwürfen und regelbasierten Prioritätsvorschlägen. Auf der anderen Seite steht das Dashboard der Leitstelle mit kombinierbaren Filtern, Bearbeitung der Meldungen, Änderungshistorie und CSV-Export sowie einem schreibgeschützten Prüfmodus. Konten, rollenbasierte Navigation und Rechte decken jede Behörde ab.

Das Anzeigesystem für öffentliche Informationen hat eine Bedienoberfläche in Angular, eine Middleware mit Java und Play und eine Rendering-Schicht in Python, die die Mitteilung samt Karten für ein E-Paper-Panel zeichnet. Der Rollout wird über Konfiguration gesteuert: Ein neuer Standort braucht eine Standortdatei und einen einmaligen Kartenabruf, aber keine Änderung am Quellcode.

Die Entscheidungen dahinter stehen im Entscheidungsprotokoll unten, jede mit der Alternative, gegen die sie sich durchgesetzt hat.

Die Feld-Tablets

Die Tablet-App ist für Fahrzeugbesatzungen gedacht, die während eines Stromausfalls arbeiten, wenn öffentliche Netze ausfallen können. Das Tablet verbindet sich mit dem WLAN-Access-Point eines Koffers, der mit dem Fahrzeug unterwegs ist, und eine private Funkstrecke trägt den Verkehr zur Leitstelle. Eine Besatzung meldet sich bereit, erhält einen Auftrag mit seinen Stopps, wählt den nächsten Stopp, sieht die Route auf einer Offline-Karte und meldet Position, Status und Ergebnisse zurück. Textnachrichten und Notfallmeldungen laufen über dieselbe Verbindung.

Die App arbeitet auch ohne Verbindung weiter. Karte und Routing laufen auf dem Gerät, und außer Positionsmeldungen warten ausgehende Nachrichten in SQLite und werden erneut gesendet, bis sie bestätigt sind.

Die App ist älter als meine Zeit an ihr. Mein Teil war, sie von Android 6 auf 13 zu bringen, mit einer vollständigen UI-Überarbeitung, bei der ich alle Entscheidungen getroffen habe, eine Redesign-Linie mit Seitennavigation, Turn-by-Turn-Führung, aktualisierter Karte und zitierten Antworten im Chat zu bauen, und Backup und Wiederherstellung, sodass ein Techniker ein Gerät aus einer einzigen Datei vollständig neu einrichten kann. Teils hole ich mir direkt Feedback von Kunden.

Eine Web-App für die Bevölkerung

Wenn Strom und Mobilfunk ausfallen, können sich Menschen vor Ort mit einem lokalen WLAN einer Station verbinden und im Browser eine Web-App öffnen. Ich habe sie gebaut und alle Entscheidungen zu ihr getroffen.

Sie können eine geführte Notfallmeldung abgeben: die Adresse, einige kurze Fragen aus einem Entscheidungsbaum, eine Prüfung, dann das Absenden, und die Meldung erreicht die Einsatzkräfte. Sie können beschreiben, wie die Lage bei ihnen ist, und danach Anlaufstellen auf einer Karte sehen, oder selbst Hilfe anbieten. Die App ist mehrsprachig.

Es ist eine Web-App, deren Seiten ein Backend mit Java und Play aufrufen. Ist das Backend nicht erreichbar, behält der Browser die Meldung und versucht es erneut.

Arbeit an zwei Clients

Den Angular-Client gibt es in zwei Formen: den aktuellen Client und eine auf eine neuere Angular-Version migrierte Fassung mit vollständigem Redesign. Ich halte beide im Gleichschritt, sodass sich dasselbe Feature in beiden gleich verhält. Auch die Tablet-App hat ihre Redesign-Linie neben dem aktuellen Design auf Android 13.

Ergebnisse

Behörden können jetzt strukturierte Meldungen einreichen, die die Leitstelle live sieht, bearbeitet und über ihre Historie zurückverfolgen kann, statt mit Papier und Word-Dateien zu arbeiten. Das Modul hat vor dem Livegang seinen Feldtest durchlaufen, mit Konten, Rechten und einem realistischen Übungsszenario für jede teilnehmende Kommune.

Das Anzeigesystem wurde auf echter Hardware getestet. Dank der Übertragungsschicht berührte der Austausch der gesamten Hardware die Anwendung nicht. Die Tablet-App wurde auf Hardware getestet, und ihr Backup und ihre Wiederherstellung sind auf Feldgeräten ausgeliefert, nach skriptgesteuerten End-to-End-Prüfungen samt Fehlerinjektion.

Die Web-App für die Bevölkerung ist gebaut, und es ist belegt, dass ihre Meldungen die Einsatzkräfte erreichen. Zahlen aus echter Nutzung habe ich nicht, also behaupte ich keine.

Lehren

Drei Lehren sind mir geblieben. Erstens: Nebenläufigkeit auf der echten Datenbank testen; die Szenarien auf MySQL haben mir mehr gezeigt als das Nachdenken über die Sperren. Zweitens: Eine Abstraktion bewährt sich, wenn sich das dahinter wirklich ändert; der Hardwaretausch war der Test für die Übertragungsschicht, und sie hat gehalten. Drittens: In der öffentlichen Kommunikation gehört die Wortwahl zum System: Der Status muss durch Text und Symbol getragen werden, nicht allein durch Farbe, und eine technische Zustellbestätigung darf nie als Beleg ausgegeben werden, dass jemand die Anzeige geprüft hat.

Zentrale Entscheidungen

  1. 01 Mehrstufiger Schutz vor verlorenen Änderungen

    Optimistic Locking, transaktionale Zeilensperren und Konfliktauflösung auf Feldebene zusammen.

    Mehrere Personen können gleichzeitig an derselben Meldung arbeiten, und das Speichern der einen darf die Änderungen der anderen nicht stillschweigend löschen.

    Die parallelen Szenarien habe ich direkt auf MySQL nachgestellt, statt nur auf dem Papier darüber nachzudenken, und diese Läufe prägten das endgültige Sperrkonzept.

    verworfen: Das letzte Speichern gewinnen lassen

  2. 02 Live-Updates über WebSockets

    Änderungen per WebSocket ans Dashboard schicken, mit Polling nur noch als Fallback.

    Eine Leitstelle soll eine neue oder geänderte Meldung sehen, sobald es sie gibt, ohne auf die nächste Aktualisierung zu warten.

    verworfen: Polling als einziger Aktualisierungsweg

  3. 03 Entwürfe und Meldungsnummern beim Server

    Entwürfe mit Limits auf dem Server halten und Meldungsnummern dort vergeben.

    Viele Behörden melden gleichzeitig, also braucht die Nummerierung eine einzige Quelle, und ein Entwurf soll nicht von einem einzelnen Browser abhängen.

    verworfen: Entwürfe im Browser halten und Meldungen im Client nummerieren

  4. 04 Versionierte Meldungen

    Eine erneut eingereichte Meldung als neue Version behandeln, die ihren Bearbeitungsstand und ihre vollständige Historie behält.

    Eine Leitstelle muss sehen, was sich geändert hat, und darf die bereits geleistete Arbeit an einer Meldung nicht verlieren.

    verworfen: Die Meldung beim erneuten Einreichen überschreiben

  5. 05 Ein Renderer für Vorschau und Anzeige

    Die Vorschau für das Bedienpersonal und das Bild für das physische Panel über denselben Codepfad erzeugen.

    Die Ausgabe ist eine öffentliche Mitteilung, also muss das Panel genau das zeigen, was freigegeben wurde.

    verworfen: Eine eigene, im Browser gerenderte Vorschau

  6. 06 Eine Übertragungsschicht hinter einer Schnittstelle

    Den Weg des Bildes zum Panel hinter einer Transport-Abstraktion isolieren.

    Die Hardware konnte sich noch ändern, und die Anwendung sollte sich dann nicht mitändern müssen.

    Sie änderte sich tatsächlich: Die gesamte Hardware wurde ausgetauscht, ohne Änderung an Controller, Anfragebehandlung, Fehlerabbildung oder Client-Code.

    verworfen: Den Übertragungsweg fest in die Anwendung einbauen

  7. 07 Backups, die das Löschen der App-Daten überstehen

    Tablet-Backups außerhalb des privaten App-Speichers schreiben.

    Der private Speicher verschwindet mit den App-Daten, und ein Backup muss das überdauern.

    Aus einer einzigen geprüften Datei lässt sich ein Gerät wiederherstellen, mit Auswahl pro Element.

    verworfen: Backups im privaten Speicher der App halten

  8. 08 Eine Wiederherstellung darf keinen alten Verkehr erneut senden

    Noch wartende Nachrichten in einer wiederhergestellten Datenbank so markieren, dass sie nicht erneut gesendet werden.

    Eine Wiederherstellung soll ein Gerät in einen bekannten Zustand bringen und keinen Verkehr von früher wiederholen.

    verworfen: Die Warteschlange ausgehender Nachrichten unverändert wiederherstellen

  9. 09 Der Besatzung sagen, was eine fehlende Berechtigung kostet

    Ein Banner im Dashboard des Tablets, das jede fehlende Standortberechtigung und ihre Folge nennt und beim Antippen die Einstellungen öffnet.

    Ein Dialog ist schnell weggeklickt, und die Besatzung soll sehen, dass die Leitstelle ihre Position nicht mehr erhält.

    verworfen: Sich allein auf die Berechtigungsdialoge von Android verlassen

  10. 10 Eine geführte Notfallmeldung

    Kurze Fragen aus einem Entscheidungsbaum, am Ende eine Zusammenfassung zum Korrigieren.

    In einem Notfall soll niemand erst sortieren müssen, was zählt: Die Fragen übernehmen das.

    verworfen: Ein einziges Freitextformular

  11. 11 Die Oberfläche übersetzen, den Datensatz auf Deutsch halten

    Die Fragen in der Sprache der Person anzeigen und die Antworten auf Deutsch speichern.

    Nicht alle Menschen vor Ort lesen Deutsch, und gespeicherte Meldungen sollen in einer Sprache bleiben.

    verworfen: Antworten in der Sprache speichern, in der sie gegeben wurden

  12. 12 Die Meldung auf dem Handy behalten, wenn der Server nicht erreichbar ist

    Ein Postausgang in der IndexedDB des Browsers, der beim nächsten Seitenaufruf oder bei neuer Verbindung erneut sendet.

    Im Stromausfall sind Verbindungen unzuverlässig, und niemand soll eine Notfallmeldung zweimal eingeben müssen.

    verworfen: Eine Fehlermeldung zeigen und um einen neuen Versuch bitten

Kennzahlen

Kennzahlen (eigene Angaben)
KennzahlWertStatus
Felder im Meldeformular74eigene Angabe
Unit-Tests für die Meldelogik128eigene Angabe
Automatisierte Tests des Anzeigesystems70eigene Angabe
Knoten im Entscheidungsbaum der Notfallmeldung77eigene Angabe

Eigene Angaben: Das gebaute Formular, mit Validierung und Plausibilitätswarnungen · Tests für die Kernlogik des Moduls · Tests über Oberfläche, Middleware und Rendering hinweg · Der Entscheidungsbaum wie gebaut; ein Weg umfasst 3 bis 6 Antworten