Das Einsatztagebuch
Das Einsatztagebuch
Web-basiertes Einsatztagebuch (ETB) mit automatischem Mail-Parser, Lagekarte, Telegram-Alarmierung und Rollen-Konzept — entwickelt für eine Feuerwehr in NRW, von Grund auf darauf ausgelegt, von anderen Feuerwehren übernommen und über einen Setup-Wizard auf die eigene Wache konfiguriert zu werden.
Status: aktiv im Einsatz bei einer Feuerwehr. Andere Feuerwehren sind willkommen — die ortspezifischen Stellen werden Schritt für Schritt in den Setup-Wizard und in Konfigurations-Settings verschoben.
Was es kann
- Mail-Parser — eingehende Alarm-Mails der Leitstelle werden automatisch geparst (Stichwort, Adresse, Sachverhalt, Einsatzmittel, Melder) und erzeugen einen Einsatz in der Datenbank.
- Stichwort-Katalog — administrierbarer Katalog der Einsatzstichworte (Kategorie, volles Stichwort, Anzeige-Variante, Aliase) inkl. CSV-Import und automatisch abgeleiteter Anzeige-Variante über Ausblend-Präfixe. Im Einsatz-Formular wählst du das Stichwort verkettet (Kategorie → Stichwort); Freitext bleibt für noch nicht katalogisierte Stichworte möglich. Der Mail-Parser gleicht eingehende Alarm-Mails gegen den Katalog ab (Treffer auf volles Stichwort oder Alias → Anzeige-Variante).
- Lagekarte — Leaflet/OpenStreetMap, zeigt offene und abgeschlossene Einsätze, Hydranten und Einsatzmittel-Marker. Das Einsatzmittel-Panel öffnet am Smartphone und im Tablet-Hochformat als Vollbild-Overlay.
- Karten-Links je Einsatz — direkte Sprünge zur Einsatzstelle in externen Karten-Diensten: TIM-Online (NRW-Kataster), Digitaler Zwilling NRW (dz.nrw.de, landesweites 3D-Geosystem — je Instanz ab-/zuschaltbar), OpenStreetMap und der eigene Hydrantenplan — in der Einsatz-Detailseite und in der Telegram-Alarm-Nachricht. Die für den Digitalen Zwilling nötigen UTM-Koordinaten (EPSG:25832) berechnet das ETB automatisch aus den GPS-Daten.
- Hydrantenplan — eigene OSM-basierte Karte mit Hydranten-Inventar, inklusive Foto-Upload und Wartungs-Historie.
- Telegram-Alarmierung — pushen einer Alarm-Nachricht in einen oder mehrere Telegram-Chats; Sonder-Nachricht für IuK-Alarmstichworte. Sechs frei editierbare Nachrichten-Templates (Alarm, Alarmierungsliste, Fehler, Heartbeat, ETB-Reset, Selbsttest) mit Platzhaltern und Live-Vorschau.
- Multi-Alarm-Regeln & manuelle Auslösung — ein Stichwort kann
automatisch mehrere Folge-Einsätze (oder -Abschnitte) anlegen
(z. B. UW-ERSTALARM → Grundschutz + Bereitstellung). Bleibt die
Leitstellen-Mail aus, löst der Knopf „
⚡ Alarm auslösen" dieselbe Regel von Hand aus — Basis-Einsatz + Folge-Einsätze an wählbarer Adresse inklusive echter Telegram-Alarmierung, mit Cooldown gegen Doppelauslösung (Recht „Alarm manuell auslösen", Default Lage/EL/Admin). Auch bei manuell angelegten oder geänderten Einsätzen bietet ein Bestätigungs-Banner das Auslösen passender Regeln an (Telegram optional, je Regel und Einsatz nur einmal). - Rollen-Konzept —
admin,lage,einsatzleiter,dispo,sp_dispo,gastmit abgestuften Rechten auf Einsätze, Abschnitte, Schwerpunkte und Stammdaten. Berechtigungen pro Rolle administrierbar (/admin/rollen.php) über eine Häkchen-Matrix aus 41 atomaren Permissions — mit Admin-Failsafe und Locked-Permissions gegen Selbst-Aussperren. Rollen-, Aktiv- und Einsatz-Rollen-Änderungen wirken ohne Neuanmeldung (Status-Prüfung pro Request; deaktivierte Konten werden sofort ausgeloggt). Passwort-Selbsthilfe per E-Mail-Link (zeitlich begrenzt, einmalig, nur für Konten mit hinterlegter E-Mail) über ausgehenden SMTP-Versand; keine Selbstregistrierung. - Einsatz-Rollen (temporäre Rollen) — einem Benutzer befristet (max. 48 h) die höhere Rolle Einsatzleiter oder Lage leihen, z. B. für eine mehrtägige Lage. Wirkt sofort ohne Neuanmeldung, das höhere Recht gewinnt („Highlander"), und läuft automatisch aus. Administrator und Schwerpunkt-Dispo sind ausgeschlossen, eine geliehene Rolle kann nicht weiterverliehen werden. Dazu der Alarm-Knopf (je Alarm-Regel konfigurierbar): Löst die Regel aus, kann ein Disponent die Rolle Lage oder Einsatzleiter einmalig selbst übernehmen — für Alarmlagen ohne anwesende Führung; nur die so übernommene Lage darf ausnahmsweise Einsatz-Rollen weitervergeben, höhere Rollen können das Angebot stattdessen entschärfen.
- Abschnitts-Funktion — größere Einsätze in operative Abschnitte unterteilen (Wasserversorgung, Brandbekämpfung, …) mit eigenem Status, Abschnittsleiter, Funk-Rufgruppe und Einsatzmittel-Zuweisung.
- Schwerpunkte (Großlagen-Gruppierung) — bei Unwetter, Flächenbrand oder Großübung mehrere Einsätze unter einem dedizierten Disponenten bündeln; eigener Einsatzmittel-Pool, eigene Lagekarte mit Dichte- Visualisierung, automatische Einsatz-Zuweisung nach Ort, eigenes „Schwerpunkttagebuch" mit gefiltertem Sub-View aller Module.
- Audit-Log — jede Mutation (Einsatz, Abschnitt, EM-Zuweisung, Kommentar) wird revisionsfest geloggt.
- PDF-Export — kompletter Einsatz-Bericht inkl. Kommentaren, Anhängen, Abschnitten, einer Einsatzmittel-Übersicht mit Stärke & Kontakt und optional Audit-Historie.
- Setup-Wizard — geführte Erst-Konfiguration (Org-Name, Logo, Karten- Center, Telegram, Mailbox, …).
- Mehrmandanten-fähig — Tabellen-Präfix pro Instanz, mehrere ETBs können in derselben DB nebeneinander laufen.
- Dark-Mode & UI-Komfort — app-weiter dunkler Modus (folgt initial
dem Betriebssystem), einklappbare Sidebar und ein separater
Hell/Dunkel-Schalter für die Vollkarten (Lagekarte, Hydrantenplan); die
Mini-Karten in Einsatz- und Abschnitts-Detail folgen automatisch dem
App-Theme. Die Einsatz-Übersicht lässt sich zwischen Komfort
(luftige Karten-Zeilen) und Kompakt (dicht, für viele Einsätze)
umschalten; jeder Einsatz trägt eine farbige Status-Kachel (laufende
Nummer + Kurz-Status) in Liste, Detail-Kopf, je Abschnitt und als
Lagekarte-Marker, Abschnitte lassen sich direkt in der Liste aufklappen.
Status und Wichtigkeit werden über Farbe + Label unterschieden (keine
Icons/Marker-Formen); die Farben der fünf Einsatz-Status sind
admin-konfigurierbar (
/admin/einsatz-status-farben.php) und wirken überall — Pillen, Zeilenbalken, Kacheln, Lagekarte-Marker und Filter. Durchgängige Inline-SVG-Icons (Tabler-Stil) statt Emoji. Zentrale Design-Tokens (tokens.css) für ein konsistentes, an einer Stelle anpassbares Erscheinungsbild. Die laufende Programmversion steht dezent unten in der Seitenleiste und auf der Login-Seite — bei jedem Deploy automatisch aus dem Git-Stand erzeugt. - Mobil nutzbar & installierbar (PWA) — auf schmalen Bildschirmen ausklappbares Off-Canvas-Menü, einspaltige Formulare und größere Touch-Ziele; per „Zum Startbildschirm hinzufügen" als App-ähnliche Verknüpfung installierbar (HTTPS). Bewusst ohne Offline-Datenspeicher (Network-first) — ein Einsatztagebuch zeigt stets den aktuellen Stand.
- Branding — Login-Logo, separates Menü-Logo für die Seitenleiste und Favicon hochladen sowie die Leitstellen-Adresse hinterlegen. Farben und Schrift kommen bewusst aus dem ausgelieferten Design (zentrale Design-Tokens) mit sauberer Hell-/Dunkel-Variante.
- Integriertes Handbuch & Kontext-Hilfe — seiten-genaue
Bedienungsanleitung (ein Thema je Bildschirm) in der App („Hilfe"), als
„?"-Schublade direkt im Kontext jeder Seite, ohne Login unter
/handbuch.phplesbar und ins GitLab-Wiki gespiegelt — Inhalt einmal als Markdown gepflegt.
Anforderungen
- PHP 8.1+ (auf 8.4 getestet) mit Extensions:
pdo_mysql,imap,mbstring,fileinfo,curl,dom,gd - MySQL 5.7+ / MariaDB 10.3+
- Webserver mit Document-Root auf
public/und Rewrite-Modul (Apachemod_rewriteoder Nginx) - Cron alle 1–5 Minuten für die Mailbox-Abfrage
Installation
- Code in den Webserver kopieren und Document-Root auf
public/setzen. - Konfiguration anlegen:
cp config/.env.example config/.env # DB-Zugang + IMAP-Postfach (Alarm-Mails) eintragen; optional SMTP_* # fuer „Passwort vergessen" (ausgehende Mail) - Im Browser öffnen — der Setup-Wizard erscheint automatisch und führt durch die restlichen Schritte (Org-Name, Logo, Standort, Erste User, Telegram-Bot, Cron-Token).
- Cron einrichten — der Wizard zeigt am Ende den passenden
Crontab-Eintrag mit Token; alternativ unter
Admin → Einstellungeneinsehbar:*/2 * * * * curl -fsS "https://etb.example.de/cron.php?token=…" >/dev/null
Update einer bestehenden Installation
git pull
# Schema-Aenderungen wendet die SchemaProvider-Migration beim naechsten
# Login automatisch an.Erscheint nach dem Update der Schema-Banner, einmalig
/admin/schema-check.php → „Reparieren" ausführen — legt neue Tabellen
und Spalten an (z. B. für den Passwort-Reset). Wer „Passwort vergessen"
nutzen will, ergänzt zusätzlich die SMTP_*-Werte in config/.env.
Backups (DB-Dump + storage/uploads/ + public/branding/) vor jedem
Update werden empfohlen.
Dokumentation
Eine ausführliche Bedienungsanleitung liegt unter docs/handbuch/
— seiten-genau geschnitten (ein Thema je Bildschirm, mit Frontmatter für
Reihenfolge und Gruppierung) — und ist über vier Wege zugänglich, immer
derselbe Inhalt:
- Kontext-Hilfe: das „?" rechts in der Aktionsleiste der meisten Seiten öffnet das passende Thema in einer seitlichen Hilfe-Schublade (bleibt über Reload/Seitenwechsel offen; auf schmalen Bildschirmen/PWA ausgeblendet).
- In der App: Sidebar-Eintrag „Hilfe" — das ganze Handbuch mit aufklappbaren Gruppen, ergänzt um dein konfiguriertes Branding.
- Öffentlich ohne Login:
/handbuch.php— dasselbe Handbuch ohne Anmeldung lesbar (eigenes, bewusst helles Layout); auf der Login-Seite neben „Passwort vergessen?" verlinkt. - Im GitLab-Wiki: Home — zum Nachlesen außerhalb der Anwendung (z. B. auf dem Tablet während eines Einsatzes).
Master-Quelle sind immer die Markdown-Dateien im Repo. Das Wiki wird via
scripts/wiki-sync.ps1 aktuell gehalten.
Releases
- v4.0.0 — Großes Funktions- und Fundament-Release: neuer
Einsatz-Status-Lebenszyklus mit Abschnitts-Sperre und geführtem
Abschluss-Workflow; Einsatz-Rollen (temporär geliehene Führungsrollen,
„Highlander"), manuelles Auslösen von Alarmregeln und der Alarm-Knopf
(einmaliges Rollen-Angebot zur Selbstübernahme); Stichwort-Katalog
(Pflege, Auswahl im Einsatz-Formular, Mail-Parser-Abgleich, Auslösen auch bei
manuellen Einsätzen); Entmandantisierung (neutrale Standard-Texte);
Design-Konsolidierung (Status-Kachel, Komfort/Kompakt-Umschalter,
durchgängige SVG-Icons, vereinfachtes Branding); Orts- & Abschluss-Block
(verbindliche Katalog-Orte, Adress-Suffix je Ort, Geocode-Cache-Zugriff,
Schwerpunkt-Abschluss Erledigt/Abgeschlossen); Stärke-Block (Drei-Felder-
Eingabe ZVF/GF/Ma, zuletzt zugewiesene Stärke, Gruppe „entlassen"),
überörtliche Einsatzmittel im SP-Wizard (tastaturbedienbar) und die
mitscrollende EM-Übersicht; das Karten-Paket „Digitaler Zwilling NRW"
(automatische UTM-Koordinaten EPSG:25832) plus Tablet-Hochformat der
Lagekarte; Einsätze endgültig löschen (Hard-Delete mit Begründung; Recht
einsatz.delete, Kommentar-Moderation wandert nachcomment.delete); dazu ein Barrierefreiheits- und Politur-Block (Einsatzmittel-Status zusätzlich als Text statt nur Farbe, markenrote statt blaue Bestätigungs-Dialoge, Tastatur-Fokusfallen, Dark-Kontraste) und die Lagekarten-Scope-Härtung für Disponenten. Update-Hinweis: einmaliger Schema-Check nötig; die Entmandantisierung meldet beim Update außerdem alle aktiven Sitzungen einmalig ab - v3.0.1 — Bugfixing & Feinschliff: neues Recht „Als Disponent arbeiten" (Default Dispo fest, Lage/Einsatzleiter zuschaltbar, Admin via Failsafe; SP-Dispo bleibt ausgeschlossen); Einsatzmittel-Seitenleiste zeigt durchgängig die laufende Nummer (#007) und frisch alarmierte Mittel korrekt als „im Einsatz"; zugeordnete Einsatzmittel jetzt auch mobil sichtbar; Live-Update der EM-Seitenleiste bei Statuswechsel; app-weit neutrale Link-/ Button-/Kachel-Farben (kein Blau nach Klick); Dark-Mode-Korrekturen (Setup-Wizard, Geocode-Admin/-Cache, EM-Gruppen, Lagekarte); Lagekarte- und Geocode-Nummern im #007-Format; diverse Disponenten-Feinheiten
- v3.0.0 — Schwerpunkte, Sicherheit & UX-Overhaul: Schwerpunkt- Einsatzstärke getrennt nach „im Einsatz" und „Reserve", Einsatzmittel- Stärke im Schema A/B/C/S (Gesamt automatisch); Theme-Engine inkl. Dark-Mode-Feinschliff, gruppiertes Hauptmenü, Menü-Logo, Setup-Wizard mit vertikaler Schritt-Navigation, mobil/PWA inkl. Touch-Drag für die Einsatzmittel-Zuweisung, Versionsanzeige in Sidebar + Login; Lagekarte ohne „Taktisch"-Modus; Kommentar-Bild-Galerie, PDF-Export mit Stärke & Kontakt, sauberer Bild-Pagination und immer hellem Druck; Passwort-vergessen per E-Mail-Link (SMTP) + Session-Invalidierung, CSRF-Schutz für Setup-Wizard und Admin-Formulare; großes Refactoring (Services/JS/CSS) mit Tests, PHPStan & CI; 11 Triage-Issues behoben
- v2.4.0 — Schwerpunkt-Dispo-Kopplung, Folge-Abschnitte & Übersichtlichkeit: Einsatz-/Abschnitts-Dispo folgt im Schwerpunkt automatisch dem SP-Dispo (gesperrt, Herauslösen-Modal), Alarm-Regeln mit Folge-Abschnitten + Auto-Reset-Stopp pro Regel, administrierbare Standard-Werte (+ Abschnitts-Status „geplant"), Personalstärke-Anzeige & Gesamtstärke, Einsatzmittel nach Gruppen, Lagekarte-Filter-Toggle (Beamer), Geocode-Cache-Verwaltungsseite
- v2.3.0 — Dark-Mode, UI-Politur & CSS-Zentralisierung: app-weiter
dunkler Modus, einklappbare Sidebar, Karten-Hell/Dunkel-Toggle,
einklappbare Filterleiste, zentrale Design-Tokens (
tokens.css+components.css), einheitliche Admin-Breadcrumbs + Kachel-Reorg - v2.2.0 — Bug-Fixing & Alarm-Regeln: Multi-Alarm-Regelwerk (UW-ERSTALARM → Grundschutz + Bereitstellung), Wichtigkeit „Bereitstellung", Unwettermail-Multi-Einsatz-Parsing, generischer Spalten-Migrations-Mechanismus + Feature-Tabellen-Banner, korrigierte Cron-/Heartbeat-Statistik, SP-Dispo-Dropdown-Trennung
- v2.1.0 — Handbuch: In-App-Hilfe (
/hilfe.php) + GitHub-Wiki-Sync über 20 Markdown-Topics indocs/handbuch/ - v2.0.0 — Administrierbare Rollen-/Permission-Matrix, Modal-Dialog- Library, Schwerpunkt-Historie, Schema-Auto-Migration, Lagekarte- Verbesserungen (Tooltip-z-Index, warme Heatmap, Cluster-Toggle)
- v1.5.0 — Schwerpunkte (Großlagen-Gruppierung)
- v1.0.0 — Erste stabile Version
Vollständige Änderungshistorie mit allen Bugfixes und Upgrade-Hinweisen im CHANGELOG.
Lizenz
GPL-3.0 — frei nutzen, weitergeben und anpassen, solange Änderungen ebenfalls unter GPL-3.0 verfügbar gemacht werden.
Entwicklung
Repository: privat. Kontakt für Fragen / Mitarbeit über die im Repo hinterlegten Issues bzw. direkt an den Maintainer.