Files
FireAdministration/docs/ANLEITUNG.md
T
Florian WildeandClaude Opus 5 4e2daaafd4 Atemschutzueberwachung nach FwDV 7 ergaenzen
Phase 5: das sicherheitsrelevanteste Modul des Projekts. Ueber jeder Ansicht
steht dauerhaft, dass die analoge Atemschutzueberwachung fuehrend bleibt —
abschaltbar nur zusammen mit der Fundstelle einer Freigabe des Kommandanten.

Es gibt keinen Timer. In der Datenbank stehen Zeitstempel; wie lange ein
Trupp unter Atemschutz ist, rechnet jede Ansicht bei jedem Bild neu aus.
Damit ist die Anforderung "uebersteht Neuladen und Verbindungsabbruch" keine
Funktion, die gelingen muss, sondern eine Eigenschaft, die sich nicht
verlieren laesst. Server und Browser rechnen mit denselben Funktionen.

Der Rueckzugsdruck folgt dem doppelten Anmarschverbrauch: was der Weg hinein
gekostet hat, kostet der Weg zurueck noch einmal. Bis der Trupp das
Einsatzziel meldet, greift die Zwei-Drittel-Regel — sie liegt hoeher und ist
damit die vorsichtigere Annahme.

Das Protokoll ist doppelt gesichert: entzogene Rechte und ein Trigger auf
druckmessung und atemschutz_ereignis. Ein Fehler wird durch einen neuen
Eintrag richtiggestellt, nicht durch Aendern.

Verteilt wird ueber Server-Sent Events statt Socket.IO — es geht nur in eine
Richtung, und so bleibt das Deployment bei "next start".

Behoben: ein abgerissener Ereignisstrom meldete sich nicht. Die Anzeige haette
weiter "Verbunden" behauptet, waehrend der Draht tot war. Jetzt gilt Stille
von acht Sekunden als Abriss. Dazu zwei Altlasten: der Navigationseintrag
"Protokoll" fuehrte ins Leere, und die Startseite stand noch auf Phase 1.

68 neue Tests (51 Unit, 17 gegen eine echte Datenbank, 8 E2E je Browser).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-03 23:19:05 +02:00

1301 lines
51 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Anleitung
Bedienung von FLORIAN, Stand Phase 5 (Version 0.6.0). Die Bilder zeigen die
Beispielwehr aus dem Seed und werden mit `npm run screenshots` neu erzeugt.
> Die Kartenmodule kommen in Phase 6 dazu. Siehe [ROADMAP.md](ROADMAP.md).
---
## 1. Anmelden
Aufgerufen wird FLORIAN im Browser unter der Adresse, die der Administrator
eingerichtet hat — in der Entwicklung `http://localhost:3100`.
![Anmeldeseite](screenshots/01-anmeldung-light.png)
Die Anmeldeseite zeigt genau die Wege, die in dieser Installation eingerichtet
sind:
| Weg | Wann |
|---|---|
| **Anmeldung über authentik** | Der Regelweg, sobald authentik eingerichtet ist. Ein Klick, keine Passworteingabe in FLORIAN. |
| **E-Mail und Passwort** | Beim Erststart, und wenn authentik gerade nicht erreichbar ist. |
| **Terminal im Gerätehaus** | Am Wandtablet, mit PIN oder Ausweiskarte. Eigene Oberfläche, kommt in Phase 4. |
Beim allerersten Start gibt es genau ein Konto: das aus `SEED_ADMIN_EMAIL` und
`SEED_ADMIN_PASSWORT` in der `.env`. Vorgabe:
```
admin@beispielwehr.de
Feuerwehr2026
```
**Dieses Passwort gehört nach dem ersten Login geändert.**
### Wenn die Anmeldung nicht klappt
Nach mehreren Fehlversuchen wird das Konto vorübergehend gesperrt — voreingestellt
nach fünf Versuchen für fünf Minuten (`KIOSK_MAX_FEHLVERSUCHE`,
`KIOSK_SPERRDAUER`). Die Meldung nennt nicht, ob die E-Mail-Adresse oder das
Passwort falsch war; das ist Absicht und verhindert, dass sich vorhandene
Konten erraten lassen.
---
## 2. Die Übersicht
Nach der Anmeldung steht die Übersicht der eigenen Wehr.
![Übersicht](screenshots/02-uebersicht-light.png)
Von oben nach unten:
**Kopfzeile.** Name der Wehr und darunter, wer angemeldet ist und mit welchen
Rollen. Wer mehrere Rollen trägt — der Gerätewart ist oft auch Ausbilder —
sieht alle.
**Sicherheitshinweis.** Der gelbe Kasten bleibt stehen, solange die Wehr die
Anwendung nicht ausdrücklich freigegeben hat. Er ist keine Formalität:
Atemschutzüberwachung und Alarmmonitor sind sicherheitsrelevant, und bis zur
Freigabe bleibt die analoge Überwachung führend.
**Kennzahlen.** Vier Kacheln mit aktiven Mitgliedern, Fahrzeugen, Geräten und
fälligen Prüfungen. Sie zählen nur die eigene Wehr — was eine andere Wehr auf
derselben Installation hat, ist nicht sichtbar und nicht abfragbar.
**Stand des Aufbaus.** Welche Phasen fertig sind und was als Nächstes kommt.
### Die Seitenleiste
Links stehen alle Module. Was noch nicht existiert, ist ausgegraut und trägt
rechts sein Phasenkürzel — `P4` heißt „kommt in Phase 4".
Was jemand überhaupt sieht, hängt an seinen Rechten. Ein einfaches Mitglied
sieht die Mitgliederliste, aber nicht das Protokoll. Wichtig zum Verständnis:
das Ausblenden ist nur Bequemlichkeit. Der eigentliche Schutz sitzt auf dem
Server — wer eine Adresse direkt aufruft, für die ihm das Recht fehlt, bekommt
trotzdem nichts.
---
## 3. Helle und dunkle Darstellung
Oben rechts wird zwischen hell und dunkel umgeschaltet. Voreingestellt ist die
Einstellung des Betriebssystems.
![Übersicht in dunkler Darstellung](screenshots/02-uebersicht-dark.png)
Die dunkle Darstellung ist bewusst kein invertiertes Schwarz, sondern ein
warmes Grau. Wer abends vom Fahrzeug hereinkommt und ans Terminal tritt, soll
nicht geblendet werden.
---
## 4. Geräte
![Geräteliste](screenshots/03-geraeteliste-light.png)
Die Geräteliste ist die Ansicht, die am häufigsten offen ist. Von links nach
rechts steht dort, was man beim Suchen braucht: Inventarnummer, was es ist, von
wem, wo es liegt, in welchem Zustand und wann es wieder geprüft werden muss.
### Suchen und filtern
**Das Suchfeld** durchsucht Inventarnummer, Bezeichnung, Hersteller, Modell und
Seriennummer gleichzeitig. Es genügt ein Teil — „press" findet alle
Pressluftatmer. Gesucht wird erst, wenn man kurz aufhört zu tippen; das
verhindert eine Abfrage bei jedem Anschlag.
**Alle Zustände** schränkt auf einen Status ein. Praktisch, wenn man wissen
will, was gerade fällig oder gesperrt ist.
**Spalten** blendet Spalten ein und aus. Zwölf stehen zur Auswahl, sechs sind
voreingestellt. Die Auswahl bleibt im Browser gespeichert — der Gerätewart
schaut auf Prüftermine, der Kassier auf Anschaffungspreise, und beide finden
ihre Einstellung beim nächsten Mal wieder.
**Sortiert** wird durch einen Klick auf die Spaltenüberschrift, ein zweiter
Klick dreht die Richtung um.
### Farben und Fristen
| Farbe | Bedeutung |
|---|---|
| grün | einsatzbereit |
| gelb | Prüfung fällig, oder eine Frist läuft in den nächsten 30 Tagen ab |
| rot | gesperrt, ausgesondert oder überfällig |
| grau | in Reparatur |
Hinter jedem Datum steht, wie viele Tage noch bleiben — „in 12 Tagen" sagt mehr
als ein Datum, das man erst im Kopf ausrechnen muss. Was vorbei ist, steht als
„seit 62 Tagen" da.
Die Farbe allein trägt nie die Information: daneben steht immer Klartext.
### Mehrere Geräte auf einmal
Über die Kästchen links lassen sich Geräte auswählen. Sobald mindestens eines
ausgewählt ist, erscheint eine Leiste mit zwei Möglichkeiten:
- **Etiketten drucken** erzeugt den Etikettenbogen als PDF.
- **Status setzen auf …** ändert den Zustand aller ausgewählten Geräte. Der
häufigste Handgriff überhaupt: Nach einer Sammelprüfung stehen zwanzig Geräte
auf einmal wieder auf einsatzbereit.
Jede Änderung wird einzeln protokolliert — am jeweiligen Gerät, nicht als
Sammelvorgang, den später niemand mehr zuordnen kann.
---
## 5. Ein einzelnes Gerät
![Gerätedetail](screenshots/04-geraet-light.png)
### Woher das Prüfintervall kommt
Steht am Gerät kein eigenes Intervall, gilt die Vorgabe des Gerätetyps. Das
Bild zeigt es: „alle 12 Monate (aus dem Gerätetyp)". So muss man bei vierzig
Pressluftatmern nicht vierzigmal dasselbe eintragen. Schreibt der Hersteller
für eine bestimmte Charge etwas anderes vor, wird der Wert am Gerät gesetzt und
gewinnt dann.
Dasselbe gilt für die Lebensdauer. Ob sie ab Herstellung oder ab
Indienststellung zählt, hängt von der Vorschrift ab: Seile und Druckbehälter
altern ab Herstellung, Schutzkleidung meist ab Indienststellung.
### QR-Code
Rechts steht der QR-Code des Geräts. **Etikett drucken** erzeugt daraus einen
Aufkleber für den Geräteraum.
Der Code zeigt auf `.../g/<Inventarnummer>`. Wer ihn scannt und angemeldet ist,
landet direkt auf dieser Seite. Wer nicht angemeldet ist, landet zuerst auf der
Anmeldung und danach hier — **der Aufkleber ist keine Berechtigung.** Wer ihn
fotografiert, bekommt dadurch keinen Zugang.
Bewusst steht die Inventarnummer im Code und nicht die interne Kennung: Eine
UUID wäre 36 Zeichen lang, das Muster entsprechend fein, und auf einem
38 × 21 mm großen Aufkleber im staubigen Geräteraum wird das unzuverlässig.
### Verlauf
Unten steht, was mit dem Gerät passiert ist — direkt aus dem Audit-Log. Es gibt
bewusst keine zweite Historie: zwei Quellen könnten auseinanderlaufen.
---
## 5a. Ein Gerät anlegen oder ändern
![Formular für ein neues Gerät](screenshots/10-geraet-neu-light.png)
Über **Neues Gerät** in der Geräteliste, oder über **Bearbeiten** auf der
Detailseite eines vorhandenen Geräts. Für größere Bestände ist der Import der
schnellere Weg; dieses Formular ist für den Neuzugang zwischendurch.
Pflicht sind nur zwei Angaben: **Inventarnummer** und **Bezeichnung**. Alles
andere kann später nachgetragen werden.
### Der Gerätetyp nimmt Arbeit ab
Wird oben ein Gerätetyp gewählt, gelten dessen Prüfintervall, Prüfvorschrift
und Lebensdauer — man muss sie nicht eintragen. Die Felder darunter bleiben
trotzdem änderbar: Was dort steht, überschreibt die Vorgabe für dieses eine
Gerät. Das braucht man, wenn der Hersteller für eine bestimmte Charge etwas
anderes vorschreibt.
Ist die Bezeichnung noch leer, wird sie aus dem Typ übernommen.
### „Daraus ergibt sich"
Der graue Kasten zeigt, was aus den Angaben folgt: wann die nächste Prüfung
fällig wird und wann die Nutzungsdauer endet. Er rechnet beim Tippen mit,
sodass man vor dem Speichern sieht, was herauskommt. Gerechnet wird mit
denselben Regeln wie auf dem Server — beim Speichern rechnet dieser erneut und
behält das letzte Wort.
Steht dort „keine", fehlt entweder das Prüfintervall oder die Indienststellung.
Das ist kein Fehler: Für Geräte ohne Prüfpflicht ist es der Normalfall.
### Wo liegt es?
Entweder an einem Standort **oder** auf einem Fahrzeug. Der Umschalter lässt
nur eines von beidem zu — deshalb kann hier gar nicht erst der Fehler
entstehen, den die Datenbank sonst abweisen würde.
Bei „Auf einem Fahrzeug" lässt sich zusätzlich der Geräteraum angeben. Er darf
leer bleiben: Manches liegt lose in der Kabine. Wird das Fahrzeug gewechselt,
wird die Raumangabe zurückgesetzt — der Raum gehört zum Fahrzeug.
Gibt es in der Wehr nur einen Standort, ist er beim Anlegen schon ausgewählt.
> Jede Änderung landet im Verlauf des Geräts. Wer wissen will, wann ein
> Prüftermin verschoben wurde und von wem, findet es dort.
---
## 6. Etiketten drucken
Der Bogen ist auf das gängige Format mit **65 Etiketten je DIN-A4-Seite**
(38,1 × 21,2 mm, 5 Spalten × 13 Zeilen) ausgelegt — den gibt es in jedem
Schreibwarenladen und er passt in jeden Laserdrucker.
Auf jedem Etikett stehen drei Dinge: der QR-Code, die Inventarnummer zum
Ablesen ohne Handy, und die Bezeichnung. Bei verlasteten Geräten kommt der
Funkrufname des Fahrzeugs dazu.
Der Druck kann an einer beliebigen Position des Bogens beginnen. Wer drei
Etiketten braucht, muss so keinen ganzen Bogen opfern.
> Erzeugt wird das PDF von Gotenberg, einem eigenen Container im Stack. Kommt
> die Meldung „Der Etikettenbogen ließ sich nicht erzeugen", läuft er nicht:
> `docker compose ps` zeigt es.
---
## 7. Gerät scannen
Über **Scannen** in der Geräteliste öffnet sich der QR-Scanner. Der Browser
fragt beim ersten Mal nach der Kamerafreigabe. Das Bild verlässt das Gerät
nicht — ausgewertet wird direkt im Browser.
Zwei Dinge sind bewusst so gebaut:
- **Es geht immer auch ohne Kamera.** Darunter steht ein Eingabefeld für die
Inventarnummer. Wenn die Freigabe verweigert wurde oder das Etikett zerkratzt
ist, tippt man sie ein.
- **Fremde Codes brechen nichts ab.** Der Barcode des Herstellers klebt oft
direkt daneben. Wird er erkannt, kommt ein Hinweis statt einer Fehlermeldung.
---
## 8. Fahrzeuge
![Fahrzeugdetail](screenshots/06-fahrzeug-light.png)
Die Übersicht zeigt die Fahrzeuge als Kacheln — eine Wehr hat drei bis zehn,
nicht dreihundert. Auf jeder Kachel stehen der nächste TÜV-Termin und die Zahl
der verlasteten Geräte.
Auf der Detailseite steht die **Beladung nach Geräteräumen**, in der Reihenfolge
der Beladeordnung: G1 bis G6, Heck, Dach, Mannschaftsraum. Genau so sucht der
Gerätewart — nicht „wo ist die Motorsäge", sondern „was ist in G3".
Beim Anlegen eines neuen Fahrzeugs werden diese Räume auf Wunsch gleich
mitangelegt. Ein Mannschaftstransportwagen bekommt weniger Fächer als ein
Löschfahrzeug.
Ein Gerät liegt **entweder** an einem Standort **oder** auf einem Fahrzeug.
Beides gleichzeitig lässt die Datenbank nicht zu — das ist keine Formalität,
sondern verhindert, dass ein Gerät zweimal gezählt wird.
Was verlastet ist, aber keinem Raum zugeordnet wurde, erscheint unter „Ohne
Raumangabe" statt stillschweigend zu verschwinden.
---
## 9. Mitglieder und Qualifikationen
![Qualifikationen](screenshots/08-qualifikationen-light.png)
Die Mitgliederliste ist nach Abteilung gruppiert — Aktive, Jugendfeuerwehr,
Passive. Eine durchlaufende alphabetische Liste vermischt Gruppen, die in der
Wehr nichts miteinander zu tun haben.
Auf der Seite **Qualifikationen** steht oben, was abgelaufen ist oder demnächst
abläuft. Das ist der Grund, warum jemand diese Seite öffnet.
**Gewarnt wird mit der Vorwarnzeit des jeweiligen Typs**, nicht mit einer
pauschalen Frist. Eine G26.3-Untersuchung braucht 120 Tage Vorlauf, weil erst
ein Termin beim Betriebsarzt gefunden werden muss; eine jährliche Unterweisung
kommt mit deutlich weniger aus. Einsatzrelevante Qualifikationen sind
gekennzeichnet.
Das Ablaufdatum wird beim Speichern aus der Gültigkeitsdauer des Typs
gerechnet — lässt sich aber überschreiben. Auf einer Urkunde steht manchmal
etwas anderes, als die Regel hergäbe.
---
## 10. Daten importieren
![Import-Assistent](screenshots/09-import-light.png)
Der Import geht in drei Schritten, und der mittlere ist der eigentliche Punkt.
### Schritt 1: Datei wählen
CSV oder Excel (`.xlsx`). Die erste Zeile muss die Spaltenüberschriften
enthalten. Höchstens 10 MB und 5.000 Zeilen.
Erkannt werden die Formate, die in der Praxis herauskommen:
| Fall | Wird verstanden |
|---|---|
| Trennzeichen | Semikolon, Komma, Tabulator, senkrechter Strich |
| Zeichensatz | UTF-8 (auch mit BOM) und Windows-1252 |
| Datum | 02.09.2026, 2.9.26, 2026-09-02, und die Seriennummer aus Excel |
| Zahlen | 1.234,56 und 1,234.56, mit und ohne Eurozeichen |
| Ja/Nein | ja, j, x, 1, wahr — und die Gegenstücke |
### Schritt 2: Zuordnung prüfen
FLORIAN rät die Zuordnung anhand der Überschriften. „Inv.-Nr." landet bei
Inventarnummer, „Fabrikat" bei Hersteller. Jede Zuordnung lässt sich ändern,
und die Vorschau passt sich sofort an.
**Die Vorschau ist der Grund, warum es diesen Zwischenschritt gibt.** Sie zeigt
Zeile für Zeile, was übernommen würde, und markiert rot, was nicht stimmt:
fehlende Pflichtfelder, unlesbare Daten, Inventarnummern, die in der Datei
doppelt vorkommen. Eine falsch zugeordnete Spalte verteilt sonst Seriennummern
auf Inventarnummern, und das merkt man erst Wochen später am Regal.
### Schritt 3: Übernehmen
Übernommen wird nur, was fehlerfrei ist. Zeilen mit Fehlern bleiben in der
Datei und lassen sich nach der Korrektur erneut einlesen.
**Vorhandene Datensätze aktualisieren** entscheidet, was mit Datensätzen
passiert, die es schon gibt: überspringen (Vorgabe) oder überschreiben.
Erkannt werden sie über die Inventarnummer, bei Mitgliedern über die
Mitgliedsnummer oder die E-Mail-Adresse.
Zum Schluss steht da, wie viele Datensätze angelegt, aktualisiert und
übersprungen wurden. Der ganze Vorgang steht auch im Protokoll.
---
---
## 11. Prüfungen und Fristen
![Fristen-Dashboard](screenshots/11-fristen-light.png)
Die Seite, die der Gerätewart morgens aufmacht. Sie beantwortet eine Frage:
**was ist zu tun.**
Ganz oben stehen vier Zahlen, nach Dringlichkeit geordnet:
| Topf | Bedeutung |
|---|---|
| **überfällig** | hätte längst geprüft sein müssen |
| **diese Woche** | in den nächsten sieben Tagen |
| **diesen Monat** | in den nächsten 30 Tagen |
| **nächste 90 Tage** | mittelfristig zu planen |
Jede Zahl ist gleichzeitig ein Filter: ein Klick, und die Liste darunter zeigt
nur noch diesen Zeitraum. Nochmal klicken hebt den Filter wieder auf.
„Überfällig" wird jeden Tag neu gerechnet und nicht gespeichert. Ein Termin,
der heute Nacht fällig geworden ist, steht morgen früh im richtigen Topf, ohne
dass jemand etwas anstoßen muss.
### Verteilung
Darunter steht, **wo** die offenen Termine hängen — wahlweise nach Fahrzeug,
Standort, Gerätetyp oder Zuständigem. Wer einen Prüftag ansetzt, arbeitet ein
Fahrzeug ab und keine alphabetische Liste; deshalb ist Fahrzeug die Vorgabe.
### Termine zuweisen
In der Terminliste lassen sich mehrere Zeilen ankreuzen und in einem Zug jemandem
zuweisen. Der Zuständige bekommt die Erinnerungen; ist niemand zuständig, gehen
sie an die Gerätewarte der Wehr.
### Erinnerungen
Nachts um 3:45 Uhr verschickt FLORIAN eine **Sammelnachricht je Empfänger** —
nicht eine Mail je Gerät. Erinnert wird bei 30 Tagen (oder der Vorwarnzeit der
Vorlage), bei 7 Tagen, am Fälligkeitstag und einmal, wenn ein Termin überfällig
geworden ist. Jede Stufe genau einmal.
Solange `MAIL_ENABLED=false` steht, landen die Nachrichten im Protokoll statt
im Postfach.
---
## 12. Wartungsvorlagen
![Wartungsvorlagen](screenshots/12-vorlagen-light.png)
Eine Wartungsvorlage sagt, **was** an einem Gerätetyp **in welchem Takt**
geprüft wird. Sie ist die Regel; der Termin ist ihre Anwendung auf ein einzelnes
Gerät.
**Ohne Vorlage gibt es keine Termine.** Das ist die erste Seite, die eine Wehr
in diesem Modul ausfüllt.
| Angabe | Wofür |
|---|---|
| **Gerätetyp** | für welche Bauart die Vorlage gilt. Ohne Gerätetyp plant der nächtliche Lauf nichts. |
| **Intervall in Monaten** | zählt ab der letzten durchgeführten Prüfung |
| **Vorwarnzeit in Tagen** | wann die erste Erinnerung rausgeht |
| **Prüfvorschrift** | steht später im Protokoll und in der Fußzeile des PDF |
| **Übliche Dauer** | Erfahrungswert für die Planung eines Prüftags |
### Die Checkliste
![Checkliste einer Vorlage](screenshots/17-checkliste-light.png)
Jeder Punkt hat eine von vier Antwortarten:
| Art | Wann |
|---|---|
| **Ja / Nein** | Sichtprüfungen: „ohne Risse", „Kennzeichnung lesbar" |
| **Messwert** | alles Gemessene, mit zulässigem Bereich und Einheit |
| **Text** | Befunde, die sich nicht ankreuzen lassen |
| **Foto** | wenn der Zustand belegt werden soll |
Bei einem Messwert entscheidet der zulässige Bereich, ob der Punkt in Ordnung
ist. Gerechnet wird das auf dem Server, nicht im Browser.
**Pflichtpunkt heißt: davon hängt die Einsatzbereitschaft ab.** Ein
Pflichtpunkt, der durchfällt, bedeutet „nicht bestanden" und sperrt das Gerät.
Ein Kann-Punkt, der durchfällt, bedeutet „bestanden mit Mängeln". Wer einen
Punkt als Pflicht anlegt, trifft also eine fachliche Entscheidung.
Die Reihenfolge zählt: der Prüfwizard arbeitet die Punkte genau so ab, wie sie
hier stehen. Umsortiert wird mit den Pfeiltasten — das geht auch mit Handschuhen
und mit der Tastatur.
---
## 13. Eine Prüfung durchführen
Gestartet wird sie entweder im Fristen-Dashboard über **Prüfen** oder auf der
Gerätedetailseite über **Prüfung durchführen**. Wer das Gerät am Regal
gescannt hat, ist schon auf der richtigen Seite.
Der Wizard zeigt **einen Prüfpunkt je Bildschirm**. Oben läuft die Zeit mit;
sie landet im Protokoll und gehört zum Nachweis, wie gründlich geprüft wurde.
Zu jedem Punkt lassen sich zusätzlich ein Foto und eine Bemerkung erfassen.
Auf dem Tablet öffnet der Fotoknopf unmittelbar die Kamera.
**Jede Antwort geht sofort zum Server.** Wenn im Gerätehaus das WLAN wegbricht,
ist höchstens die letzte Antwort verloren. Beim erneuten Öffnen wird der
angefangene Durchgang fortgesetzt — es entsteht keine zweite halbe Prüfung.
### Der Abschluss
Am Ende steht:
1. **Ergebnis** — vorgeschlagen wird, was sich aus den Antworten ergibt.
Übersteuern darf der Prüfer; er trägt die Verantwortung, nicht die Software.
2. **Mängel** — aus den beanstandeten Punkten vorgeschlagen, frei ergänzbar.
Ein kritischer Mangel sperrt das Gerät.
3. **Unterschrift** — auf dem Zeichenfeld, mit Finger, Stift oder Maus. Ohne
Unterschrift lässt sich nicht abschließen: ein Protokoll ohne Unterschrift
ist kein Nachweis.
Wurde die Prüfung **extern** durch eine Fachfirma gemacht, lassen sich hier
Firma, Kosten und das Fremdprotokoll als PDF anhängen.
Mit dem Abschluss passiert alles auf einmal: die Prüfung wird festgeschrieben,
der Termin gilt als erledigt, der nächste wird geplant, der Gerätestatus zieht
nach, und das PDF entsteht im Hintergrund.
---
## 14. Prüfprotokolle
![Prüfprotokoll](screenshots/18-pruefprotokoll-light.png)
Jedes abgeschlossene Protokoll bekommt eine laufende Nummer im Format
`JJJJ-NNNN` — das ist die Nummer, die man bei einer Rückfrage der Unfallkasse
nennt.
Über **Protokoll als PDF** kommt die Fassung zum Ausdrucken oder Weiterreichen:
Kopf mit Wehr, Gerät und Prüfer-Kennung, die Checkliste mit Soll, Ist und
Befund, die Fotos, die Unterschriften und eine Fußzeile mit Prüfvorschrift und
Prüfdatum. Alles ist im PDF eingebettet — es lädt nichts nach und sieht in zehn
Jahren noch genauso aus.
### Ein Protokoll lässt sich nicht ändern
Das ist keine Bequemlichkeitsfrage, sondern der Kern der Sache: ein Nachweis,
den man nachträglich ändern kann, ist keiner. FLORIAN verhindert das in der
Datenbank, nicht bloß in der Oberfläche.
Wenn etwas falsch ist, legt **Korrektur anlegen** eine neue Prüfung an — mit den
bisherigen Antworten vorbelegt und einem Verweis auf das alte Protokoll. Sobald
sie abgeschlossen ist, gilt das alte als „ersetzt". **Beide bleiben lesbar**,
und im Korrekturprotokoll steht, warum korrigiert wurde.
---
## 15. Mängel
![Mängel](screenshots/13-maengel-light.png)
Der Weg ist immer derselbe:
```
gemeldet → zugewiesen → in Arbeit → behoben
```
**Melden darf jedes Mitglied.** Der Riss im Schlauch fällt dem auf, der ihn in
der Hand hat, nicht dem Gerätewart am Schreibtisch. Zum Melden gehören das
Gerät, eine Beschreibung, eine Dringlichkeit und auf Wunsch ein Foto.
Ein Mangel der Stufe **kritisch** sperrt das Gerät sofort. Beim Beheben wird
die Sperre wieder aufgehoben — aber nur, wenn kein anderer offener Mangel
dasselbe Gerät sperrt. Ein behobener Kratzer gibt kein Gerät frei, das wegen
eines Risses gesperrt ist.
Eine Fehlmeldung wird **verworfen**, nicht gelöscht: dass gemeldet wurde und
was, bleibt nachvollziehbar.
---
## 16. Rückrufe
![Rückrufe](screenshots/14-rueckrufe-light.png)
Kommt ein Sicherheitshinweis des Herstellers, wird er hier erfasst — mit der
betroffenen Bauart, wahlweise eingegrenzt über Modell, Seriennummernbereich und
Herstellungszeitraum.
FLORIAN sucht dann im Bestand nach passenden Geräten und zeigt sie als
**Vorschlag**. Zugeordnet wird nur, was der Gerätewart bestätigt — eine
Chargenangabe des Herstellers passt selten eins zu eins auf die eigenen
Seriennummern.
Zugeordnete Geräte lassen sich in einem Zug sperren. Je Gerät wird
fortgeschrieben, wie es steht: offen, nicht betroffen, Maßnahme läuft, erledigt.
Mit „erledigt" fällt die Sperre wieder — sofern kein Mangel dasselbe Gerät
sperrt. Abschließen lässt sich der Rückruf erst, wenn zu jedem betroffenen Gerät
ein Ergebnis steht.
---
## 17. Lebensdauer
![Lebensdauer](screenshots/15-lebensdauer-light.png)
Helme, Seile, Schutzkleidung und Pressluftatmer sind ab einem Stichtag nicht
mehr zugelassen — unabhängig davon, wie gut sie aussehen. Diese Seite zeigt,
was abgelaufen ist und was in den nächsten Monaten abläuft.
Ein Gerät mit abgelaufener Nutzungsdauer wird nachts automatisch **gesperrt**.
**Ausgesondert** wird es von einem Menschen: das entscheidet, wer weiß, ob
Ersatz da ist. Der Knopf dazu steht in der Zeile.
Voraussetzung ist, dass am Gerätetyp eine Lebensdauer hinterlegt ist
(Kapitel 5).
---
## 18. Einen Einsatz erfassen
![Einsatzliste](screenshots/19-einsaetze-light.png)
Im Alarmfall zählt eines: dass der Einsatz überhaupt angelegt wird. Die
**Schnellerfassung** fragt deshalb nur drei Dinge:
1. **Stichwort** — das, was die Leitstelle durchgegeben hat: „B 3 Wohnhausbrand"
2. **Ort** — Straße, Hausnummer, gegebenenfalls das Objekt
3. **Fahrzeuge** — welche ausgerückt sind
Die Alarmzeit ist der Moment des Anlegens. Alles andere — Mannschaft, Zeiten,
Bericht — wird später nachgetragen. Der Einsatz bekommt sofort eine
fortlaufende Nummer im Format `JJJJ-NNNN`.
**Koordinaten** lassen sich über „Koordinaten suchen" ermitteln, wenn die Wehr
einen eigenen Nominatim betreibt (Kapitel 34). Ohne den bleibt das Feld leer —
das ist in Ordnung, die Karte kommt in Phase 6.
---
## 19. Der Einsatz von innen
![Einsatzdetail](screenshots/22-einsatz-light.png)
### Zeitstempel
Sechs Stempel beschreiben einen Einsatz vollständig:
| Stempel | wann |
|---|---|
| alarmiert | die Leitstelle hat alarmiert |
| ausgerückt | das erste Fahrzeug verlässt das Gerätehaus |
| eingetroffen | das erste Fahrzeug ist an der Einsatzstelle |
| Einsatzende | die Arbeit an der Einsatzstelle ist beendet |
| eingerückt | zurück im Gerätehaus |
| einsatzbereit | Fahrzeuge und Geräte sind wieder hergerichtet |
Jeder Stempel ist ein Knopf und setzt die aktuelle Uhrzeit. Ein Klick auf
„zurücknehmen" macht ihn wieder leer, falls er zu früh gedrückt wurde.
Daraus errechnet FLORIAN vier Zahlen:
- **Ausrückzeit** — Alarm bis Ausrücken. Sagt etwas über die Wehr aus.
- **Anfahrt** — Ausrücken bis Eintreffen. Sagt etwas über die Lage aus.
- **Hilfsfrist** — Alarm bis Eintreffen. Die Zahl, nach der die Gemeinde fragt.
- **Einsatzdauer** — Alarm bis Einrücken.
Stimmt die Reihenfolge nicht, erscheint ein Hinweis. **Gespeichert wird
trotzdem**: Zeiten werden oft Tage später aus dem Gedächtnis nachgetragen, und
ein Einsatz mit unsicheren Zeiten ist besser als einer, den niemand erfasst.
### Mannschaft
„Mannschaft erfassen" zeigt einen Vorschlag, sortiert danach, wer im letzten
Jahr am häufigsten dabei war. Daneben steht, ob die einsatzrelevanten
Qualifikationen noch gelten — eine abgelaufene G26.3 fällt so auf, **bevor**
jemand unter Atemschutz geht.
Ein Klick übernimmt die Person, danach lassen sich Funktion und Atemschutz in
der Tabelle einstellen.
Rechts steht laufend die **Stärke nach FwDV 3**:
```
1/3/5/9 entspricht einer Gruppe
│ │ │ └── gesamt
│ │ └──── Mannschaft
│ └────── Unterführer (Truppführer)
└──────── Führer (Gruppen-, Zug-, Staffelführer, Einsatzleiter)
```
> **Regional unterschiedlich.** Hier zählt der Maschinist zur Mannschaft. Manche
> Wehren rechnen ihn zu den Unterführern, andere schreiben dreistellig ohne
> Unterführer. Die Zuordnung steht an einer Stelle im Code und lässt sich
> anpassen.
### Verlauf
Lagemeldungen halten fest, was währenddessen passiert ist — mit Foto und
wahlweise als **wichtig** gekennzeichnet (Menschenrettung, Nachforderung,
Lageänderung). Meldungen bleiben auch nach der Freigabe möglich.
---
## 20. Bericht und Freigabe
Der Bericht ist der Text des Einsatzleiters: Lage bei Eintreffen, was getan
wurde, wie es endete. Er lässt sich jederzeit speichern und weiter ergänzen.
**Freigeben** schließt den Einsatz ab. Danach:
- ist der Bericht **unveränderbar** — er geht an die Gemeinde und im
Schadensfall an die Versicherung,
- entsteht im Hintergrund das PDF (Knopf „Bericht als PDF"),
- bleiben nur die Lagemeldungen weiter möglich.
Vor der Freigabe prüft FLORIAN zwei Dinge: dass eine Alarmzeit gesetzt ist und
dass mindestens eine Einsatzkraft erfasst wurde. Ein Bericht ohne Mannschaft
ist kein Nachweis.
---
## 21. Einsatzportal für Fremdwehren
![Einsatzportal](screenshots/24-portal-light.png)
Bei einer größeren Sache sind Nachbarwehren, THW oder Rettungsdienst mit vor
Ort. Die brauchen kein Konto in FLORIAN — sie bekommen einen **Link**.
So geht es:
1. Auf der Einsatzseite unter „Portal für Fremdwehren" eintragen, für wen der
Link ist („FF Nachbarhausen").
2. **Erzeugen** klicken. Der Link erscheint **einmal** — danach steht in der
Datenbank nur noch sein Hash.
3. Link kopieren und weitergeben, oder als QR-Code zeigen.
Was die Fremdwehr sieht: Stichwort, Ort, die Zeitstempel und den Verlauf. Was
sie **nicht** sieht: Namen von Einsatzkräften, den Bericht, irgendetwas
außerhalb dieses Einsatzes.
Was sie tun kann: eine Lagemeldung mit Foto absetzen.
Der Link gilt 24 Stunden, lässt sich jederzeit **widerrufen**, und jeder Aufruf
wird mitgezählt — ein Link, der nach dem Einsatz noch benutzt wird, fällt auf.
---
## 22. Statistik
![Einsatzstatistik](screenshots/20-statistik-light.png)
Zwei Fragen, eine Seite.
**Was die Gemeinde fragt:** wie viele Einsätze welcher Art, und wie schnell wart
ihr da? Dafür stehen oben die Zahlen nach der Landesstatistik und die
**Hilfsfrist als 80-Prozent-Wert**.
> Warum nicht der Durchschnitt? Weil ein einzelner Einsatz auf der Autobahn ihn
> nach oben zieht, während neunzig Prozent der Fälle im Ort liegen. In Bayern
> gilt als Ziel: in 80 Prozent der Fälle binnen zehn Minuten. Genau diese Zahl
> steht hier.
**Was die Wehr fragt:** wer trägt die Last? Dafür steht unten die Beteiligung je
Person — Einsätze, davon unter Atemschutz, und Übungen.
**Jahresexport als PDF** erzeugt das Blatt für die Gemeinde: Überblick,
Kategorien und alle Einsätze des Jahres in einer Tabelle. Es wird nicht
gespeichert, sondern jedes Mal neu gerechnet — es ist eine Auswertung, keine
Urkunde.
---
## 23. Übungen
![Übungen](screenshots/21-uebungen-light.png)
Eine Übung besteht aus Thema, Art, Datum und den **Lernzielen** — was danach
sitzen soll.
![Übung mit Anwesenheit](screenshots/23-uebung-light.png)
Die Anwesenheit wird als Liste abgehakt: alle aktiven Mitglieder auf einmal,
nicht einzeln gesucht. Bei einer Übung ist die halbe Wehr da.
Die Teilnahme fließt in die Beteiligungsstatistik ein — das ist die Zahl, nach
der in der Jahreshauptversammlung gefragt wird und die bei Beförderungen zählt.
---
## 24. Das Terminal im Gerätehaus
![Kachelschirm des Terminals](screenshots/25-kiosk-kacheln-light.png)
Das Terminal ist eine **eigene Oberfläche** unter `/kiosk`, gedacht für ein
Wandtablet neben der Fahrzeughalle. Große Kacheln statt Seitenleiste, alles
Bedienbare mindestens 64 Pixel hoch, jede Kachel mit Symbol **und** Text — das
ist kein Geschmack, sondern die Voraussetzung dafür, dass es mit
Feuerwehrhandschuhen bedienbar bleibt.
### Einmal je Tablet einrichten
Bevor sich jemand anmelden kann, muss das Tablet wissen, zu welcher Wehr es
gehört. Das macht der Administrator einmal unter `/kiosk/einrichten`: Kurzname
der Wehr und das Gerätegeheimnis aus der `.env` (`KIOSK_DEVICE_SECRET`).
Damit am Tablet nichts abgetippt werden muss, nimmt die Seite beides auch aus
der Adresse an:
```
http://florian.example/kiosk/einrichten?wehr=ff-musterhausen&schluessel=…
```
Diesen Link schickt sich der Administrator einmal selbst — etwa als QR-Code vom
eigenen Rechner — und ruft ihn am Tablet auf.
> **Das Gerätegeheimnis ist die erste Schranke.** Ohne eingerichtetes Tablet
> nimmt der Server keine PIN und keine Karte an. Ein fremdes Handy, das
> `/kiosk` aufruft, kommt nicht weiter, auch nicht mit richtiger PIN.
### Anmelden
![Anmeldung am Terminal](screenshots/30-kiosk-anmeldung-light.png)
Drei Wege, in dieser Reihenfolge:
1. **Ausweis auflegen** — der Regelfall. Der Leser am Tablet gibt die
Kartenkennung wie eine Tastatur aus; es muss vorher nichts angetippt werden.
2. **QR-Code vom Handy** — für den, der den Ausweis vergessen hat (Kapitel 29).
3. **Mitgliedsnummer und PIN** — wenn beides fehlt.
Nach `KIOSK_IDLE_TIMEOUT` Sekunden ohne Bedienung (Vorgabe: 120) meldet sich das
Terminal von selbst ab, mit sichtbarer Warnung vorher. Ein Terminal, an dem die
letzte Anmeldung stehen bleibt, schreibt irgendwann alles dem Falschen zu.
### Was auf dem Kachelschirm steht
Die Kacheln richten sich nach zwei Dingen: den Rechten der angemeldeten Person
und ihrem aktuellen Zustand.
| Kachel | Wann sie sich ändert |
|---|---|
| Kommen / **Gehen** | Wer eingecheckt ist, sieht „Gehen" samt Zeit, seit wann |
| Fahrt beginnen / **Fahrt beenden** | Wer mit einem Fahrzeug unterwegs ist, sieht dessen Funkrufname |
| Wäsche abgeben | Zeigt an, wie viele Stücke noch nicht zurück sind |
| Inventur | Nur für den Gerätewart |
| Prüfung durchführen | Ohne Netz gesperrt, mit dem Hinweis „braucht Netz" |
---
## 25. Mangel melden am Terminal
![Mangel melden](screenshots/26-kiosk-mangel-light.png)
Der Vorgang, an dem sich das Terminal misst — Anspruch war **unter dreißig
Sekunden**. Deshalb drei Schritte und kein Formular:
1. **QR-Code am Gerät scannen.** Oder die Inventarnummer eintippen, wenn das
Etikett unleserlich ist. Steht die Nummer im Bestand, erscheint sofort
Bezeichnung und Zustand.
2. **Foto und ein Satz dazu.** Das Foto ist kein Pflichtfeld, macht aber die
halbe Arbeit: „Riss im Schlauch, etwa 20 cm von der Kupplung" plus Bild sagt
dem Gerätewart mehr als jedes Formular.
3. **Dringlichkeit antippen.** Damit ist die Meldung abgeschickt.
| Dringlichkeit | Was passiert |
|---|---|
| Kleinigkeit | kann warten |
| Normal | beim nächsten Dienst |
| Dringend | vor dem nächsten Einsatz |
| **Kritisch** | Das Gerät wird **sofort gesperrt** |
Eine unbekannte Inventarnummer hält die Meldung nicht auf. Sie geht trotzdem
raus und landet notfalls in der Konfliktliste (Kapitel 27) — lieber ein Zettel
zu viel als ein Riss im Schlauch, den niemand gemeldet hat.
---
## 26. Ohne Netz weiterarbeiten
In einer Fahrzeughalle ist das Netz regelmäßig weg: Stahlbeton, Tore aus
Metall, ein Repeater, der irgendwann ausfällt. Das Terminal ist dafür gebaut,
nicht dagegen abgesichert.
Über jeder Terminalseite läuft eine Leiste, die den Zustand in Klartext sagt:
| Leiste | Bedeutung |
|---|---|
| **Verbunden · alles übertragen** | Alles, was erfasst wurde, ist beim Server |
| **Verbunden · 2 Änderungen warten** | Wird gerade übertragen |
| **Kein Netz · 1 Änderung wartet** | Erfasst und gespeichert, wartet auf Netz |
Und so funktioniert es: **jede** erfasste Aktion geht zuerst in eine
Warteschlange im Tablet — auch dann, wenn Netz da ist. Erst von dort geht sie
zum Server. Deshalb ist der Ablauf ohne Netz derselbe wie mit Netz, nur dauert
er länger.
Was das im Betrieb bedeutet:
- **Die Bestätigung kommt sofort.** Wer eine Meldung abschickt, kann das Tablet
weglegen. Es ist gespeichert, auch wenn es noch nicht übertragen ist.
- **Ein Neustart des Tablets schadet nicht.** Die Warteschlange liegt im
Speicher des Browsers, nicht im Arbeitsspeicher.
- **Fotos warten mit.** Das Bild liegt neben der Meldung und wird beim
Übertragen zuerst hochgeladen.
- **Nichts wird doppelt gebucht.** Jeder Vorgang bekommt beim Erfassen eine
eigene Kennung. Bricht die Übertragung mitten drin ab und wird wiederholt,
erkennt der Server dieselbe Kennung wieder und bucht nicht erneut.
- **Die Prüfung braucht Netz.** Ein Prüfprotokoll mit Checkliste, Messwerten,
Fotos und Unterschrift lässt sich nicht sinnvoll zwischenspeichern — ein halb
erfasstes Protokoll wäre schlechter als keins. Die Kachel sagt das, statt ins
Leere zu führen.
Bleibt ein Vorgang mehr als fünf Versuche liegen, lässt er sich über „anzeigen"
einsehen und im Notfall verwerfen. Vorher nicht — und das ist Absicht.
---
## 27. Konflikte nachbearbeiten
![Terminalübersicht](screenshots/28-terminal-uebersicht-light.png)
Ein Tablet, das drei Tage offline war, schickt irgendwann Vorgänge, deren Ziel
es nicht mehr gibt: das Gerät wurde ausgesondert, die Prüfung inzwischen
abgeschlossen und damit festgeschrieben.
FLORIAN erzwingt in diesem Fall nichts und verwirft nichts. Der Vorgang landet
als **Konflikt** in der Übersicht unter `/terminal` — mit Zeitpunkt, Art,
Grund und der Person, die ihn erfasst hat. Der Gerätewart entscheidet und
vermerkt, wie es gelöst wurde.
Auf derselben Seite steht das Übrige, was am Terminal zusammenkommt: wer im
Haus ist, welche Wäsche in der Reinigung ist und das Fahrtenbuch.
---
## 28. Hallenmonitor
![Hallenmonitor](screenshots/27-kiosk-monitor-light.png)
`/kiosk/monitor` ist für einen Fernseher in der Fahrzeughalle gedacht: Vollbild,
große Schrift, **keine Bedienung**. Zu sehen sind Uhrzeit und Datum, ein
laufender Einsatz, wer gerade im Haus ist, die Fahrzeuge samt laufenden Fahrten,
fällige Prüfungen und die nächsten Termine.
Optional dazu **Wetterwarnungen des DWD**:
```bash
# .env
WETTER_ENABLED=true
DWD_WARNCELL=809162000
```
> Das ist die einzige Verbindung, die FLORIAN von sich aus nach außen aufbaut,
> und sie ist deshalb standardmäßig aus. Nach draußen geht nur die
> Warnzellen-Nummer, keine Daten der Wehr. Fällt der Abruf aus, bleibt die
> Kachel leer — eine Wetterwarnung ist eine Zugabe, alarmiert wird über die
> Leitstelle.
Die Nummer der eigenen Gemeinde steht in der
[Warnzellenliste des DWD](https://www.dwd.de/DE/leistungen/opendata/help/warnungen/cap_warncellids_csv.csv).
---
## 29. Anmeldemarke fürs Handy
![Anmeldemarke](screenshots/29-anmeldemarke-light.png)
Wer den Ausweis vergessen hat, öffnet in FLORIAN auf dem Handy die Seite
**Anmeldemarke** und hält den QR-Code vor die Kamera des Terminals.
Der Code gilt **60 Sekunden** und wird von der Seite selbst erneuert. Er ist
signiert und nirgends gespeichert: ein abfotografierter Code aus der Umkleide
nützt eine Minute später nichts mehr.
---
## 30. Atemschutz — was das Modul ist und was nicht
![Atemschutzübersicht](screenshots/31-atemschutz-light.png)
> **Über jeder Ansicht dieses Moduls steht:**
> *Ergänzendes System — die analoge Atemschutzüberwachung bleibt führend.*
Das ist kein Kleingedrucktes. Die Überwachung, die im Ernstfall zählt, hängt am
Fahrzeug und wird mit Stift geführt. FLORIAN schreibt mit, rechnet mit und
druckt am Ende ein Protokoll — aber wenn dieses Tablet ausfällt, läuft der
Einsatz unverändert weiter.
Der Hinweis lässt sich abschalten, aber nur zusammen mit einem Beleg:
```bash
# .env
ATEMSCHUTZ_HINWEIS=false
ATEMSCHUTZ_FREIGABE=Kommandantenbeschluss vom 12.03.2026
```
Fehlt die Fundstelle, bleibt der Hinweis stehen — egal was in
`ATEMSCHUTZ_HINWEIS` steht. Eine Freigabe ohne Beschluss ist keine. Ist er
abgeschaltet, verschwindet er nicht spurlos: dann steht dort, worauf sich die
Freigabe stützt, und dasselbe steht später im Protokoll.
Die Startseite zeigt die Zahl, nach der im Einsatz als Erstes gefragt wird:
**wie viele Atemschutzgeräteträger heute einsetzbar sind** — und wie viele
davon knapp davor stehen, es nicht mehr zu sein.
---
## 31. Eine Überwachung führen
![Überwachungsschirm](screenshots/33-atemschutz-ueberwachung-light.png)
### Eröffnen
Auf `/atemschutz` genügt eine Bezeichnung — „Zimmerbrand Hauptstraße 12". Die
Zuordnung zu einem Einsatz lässt sich nachtragen; im Ernstfall wird zuerst
überwacht und später sortiert.
### Trupp anlegen
Zwei oder drei Personen, für jede der Eingangsdruck vom Manometer, eine davon
Truppführer. Neben jedem Namen steht, ob die Person nach FwDV 7 einsetzbar ist
und was gegebenenfalls fehlt.
> **Verweigert wird nichts.** Im Einsatz entscheidet der Einheitsführer. Ein
> Programm, das ihm im entscheidenden Moment eine Person sperrt, wird umgangen —
> und dann steht am Ende gar nichts im Protokoll. Der Hinweis nützt, die Sperre
> schadet.
### Was auf der Karte steht
| Anzeige | Bedeutung |
|---|---|
| **unter Atemschutz** | Zeit seit dem Einstieg — läuft, solange der Trupp drin ist |
| **niedrigster Druck** | Der ungünstigste Wert im Trupp. Der Trupp geht gemeinsam zurück |
| **Rückzug bei** | Der errechnete Rückzugsdruck |
Die Farbe der Karte ist die Ampel, und daneben steht immer der Text dazu:
„im Rahmen", „Rückzugsdruck bald erreicht", „Rückzugsdruck erreicht — Trupp
zurückziehen". Gelb kommt schon zehn Prozent vor der Grenze — der Trupp soll
losgehen, bevor der Wert erreicht ist.
### Der Rückzugsdruck
Gerechnet wird nach dem **doppelten Anmarschverbrauch**:
```
Rückzug = 2 × (Eingangsdruck − Druck am Einsatzziel) + Warndruck + Zuschlag
```
Dafür meldet der Trupp einmal, wenn er das Einsatzziel erreicht hat — dafür ist
der Knopf **„Einsatzziel erreicht"** da. Bis dahin steht ein vorläufiger Wert
nach der Zwei-Drittel-Regel; er liegt höher und ist damit die vorsichtigere
Annahme. Die Karte sagt das auch dazu.
Beispiel: 300 bar rein, 260 bar am Ziel — 40 bar für den Hinweg, also 80 für
hin und zurück, plus 55 bar Warndruck und 10 bar Zuschlag: **Rückzug bei
145 bar.**
### Druckabfrage
Alle Werte des Trupps in einer Zeile, ein Knopf. Bleibt eine Meldung aus, steht
nach `ATEMSCHUTZ_ABFRAGE_INTERVALL` Sekunden (Vorgabe zehn Minuten) ein
deutlicher Hinweis auf der Karte — gerechnet ab der letzten Meldung, nicht ab
dem Einstieg.
### Mayday
Ein Knopf je Trupp. Er ändert nichts an der Lage: er hält fest, wann es losging,
macht es auf jedem Bildschirm sichtbar und lässt einen Ton hören. Aufgehoben
wird er **ausdrücklich**, nicht durch Wegklicken — und beides steht im
Protokoll.
### Beenden
Geht erst, wenn alle Trupps als draußen gemeldet sind. Das ist keine Schikane:
eine beendete Überwachung mit einem Trupp, der noch drin steht, wäre die
gefährlichste Zeile im ganzen Protokoll.
---
## 32. Was passiert, wenn die Technik streikt
Die wichtigste Eigenschaft dieser Ansicht ist, dass man ihr nichts anhaben
kann. Der Grund dafür ist einfach: **es gibt keinen Timer.** In der Datenbank
steht, wann der Trupp eingestiegen ist; wie lange er drin ist, rechnet der
Bildschirm jede Sekunde neu aus.
| Was passiert | Was Sie sehen |
|---|---|
| Seite neu laden | Dieselbe Zeit läuft weiter |
| Zweites Tablet daneben | Dieselbe Zeit, ohne Abgleich |
| WLAN bricht ab | Die Uhr läuft weiter; oben steht **Verbindung unterbrochen** |
| Server neu gestartet | Nach der ersten Antwort ist alles wieder da |
Oben rechts steht dauerhaft, ob die Verbindung steht. Das ist Absicht: wer
nicht sieht, dass der Draht weg ist, hält einen alten Stand für den aktuellen.
Meldet sich der Server acht Sekunden lang nicht, springt die Anzeige auf
„unterbrochen" — auch dann, wenn der Browser selbst keinen Fehler meldet.
Ist die Verbindung weg, bleibt die Ansicht bedienbar; sie fragt weiter im Takt
nach und holt auf, sobald es wieder geht.
---
## 33. Nachweise und Tauglichkeit
![Nachweise](screenshots/32-atemschutz-nachweise-light.png)
Drei Nachweise müssen **gleichzeitig** gelten, sonst ist jemand nicht
einsetzbar:
| Nachweis | Frist | Wo erfasst |
|---|---|---|
| **G26.3** | drei Jahre, ab 50 Jahren eines | `/atemschutz/nachweise` |
| **Belastungsübung** | jährlich | dort, für die ganze Gruppe auf einmal |
| **Einsatzübung unter Atemschutz** | jährlich | dort — ein echter Einsatz zählt ebenso |
Dazu die Qualifikation als Atemschutzgeräteträger aus Kapitel 9.
Das Ablaufdatum der G26 wird nach dem Alter vorgeschlagen; was auf der
Bescheinigung steht, gilt und lässt sich überschreiben. Eine Untersuchung mit
dem Ergebnis „Nachuntersuchung" oder „nicht tauglich" zählt nicht als Nachweis.
In der Übersicht steht neben jedem Namen **im Klartext**, was fehlt — „G26.3 ist
abgelaufen", „Belastungsübung in diesem Jahr fehlt". Eine rote Ampel ohne
Begründung hilft am Fahrzeug niemandem.
Drei Monate vor Ablauf der G26 wechselt die Ampel auf Gelb: die Person ist
weiter einsetzbar, aber es wird Zeit für einen Termin.
---
## 34. Adressen zu Koordinaten (Nominatim)
FLORIAN löst Einsatzadressen nur auf, wenn die Wehr einen **eigenen** Nominatim
betreibt:
```bash
# .env
GEOCODING_ENABLED=true
NOMINATIM_URL=http://nominatim:8080
GEOCODING_LAENDER=de,at,ch
```
> **Kein öffentlicher Dienst.** Einsatzadressen sagen, wo es gebrannt hat und
> wer betroffen war. Solche Anfragen gehören nicht an einen fremden Server —
> und die Nutzungsbedingungen des öffentlichen Nominatim erlauben es ohnehin
> nicht.
Ohne Konfiguration bleibt die Suche leer. Koordinaten lassen sich dann von Hand
eintragen oder weglassen.
## 35. Rollen und was sie dürfen
Neun Rollen, jede mit einem festen Satz Rechte. Die Zuordnung steht zentral in
`src/lib/authz.ts` und wird beim Seed in die Datenbank gespiegelt — eine Wehr
kann sie also nachträglich zuschneiden, ohne dass jemand Code ändert.
| Rolle | Darf im Kern |
|---|---|
| **Administrator** | alles, auch über Wehren hinweg |
| **Kommandant** | alles innerhalb der eigenen Wehr, einschließlich Rollen vergeben und Protokoll einsehen |
| **Gerätewart** | Fahrzeuge und Geräte anlegen, ändern, aussondern; Prüfungen planen und durchführen |
| **Atemschutzgerätewart** | zusätzlich Atemschutzgeräte, Träger und die Überwachung nach FwDV 7 |
| **Kassier** | Buchungen und Kassenabschluss (Modul noch nicht geplant, siehe Roadmap) |
| **Schriftführer** | Mitglieder pflegen, Einsätze und Berichte erfassen |
| **Ausbilder** | Übungen planen, Teilnahme und Qualifikationen erfassen |
| **Mitglied** | eigene Daten, Listen lesen |
| **Terminal** | nur anmelden und erfassen — nie verwalten |
Zwei Dinge sind bewusst so gebaut:
**Der Gerätewart kommt nicht an die Kasse, der Kassier nicht an die Geräte.**
Trennung nach Verantwortung, nicht nach Bequemlichkeit.
**Das Terminal darf fast nichts.** Wer am Wandtablet arbeitet, meldet sich
zusätzlich mit PIN oder Karte an und handelt dann unter seiner eigenen Person.
Das Terminal selbst ist nur die Tür.
---
## 36. Anmeldung über authentik einrichten
authentik läuft **getrennt** von FLORIAN und ist nicht Teil dieses Stacks.
### In authentik
1. Neuen Provider anlegen, Typ **OAuth2/OpenID Provider**
2. Client-Typ: **Confidential**
3. Redirect-URI genau so eintragen:
```
https://<ihre-florian-adresse>/api/auth/callback/authentik
```
4. Scopes: `openid`, `profile`, `email`
5. Für die Rollenvorbelegung zusätzlich ein Scope-Mapping, das die Gruppen des
Benutzers als Claim `groups` ausliefert
6. Eine Application anlegen und mit dem Provider verbinden. Der Slug der
Application ist der letzte Teil der Issuer-URL.
### In der `.env`
```bash
AUTH_OIDC_ENABLED=true
AUTH_OIDC_ISSUER=https://auth.beispiel.de/application/o/florian/
AUTH_OIDC_CLIENT_ID=<aus authentik>
AUTH_OIDC_CLIENT_SECRET=<aus authentik>
AUTH_OIDC_GROUP_CLAIM=groups
AUTH_OIDC_GROUP_MAPPING=feuerwehr-kommandant:KOMMANDANT,feuerwehr-geraetewart:GERAETEWART
AUTH_OIDC_AUTO_PROVISION=true
AUTH_OIDC_STANDARD_ORGANISATION=ff-musterhausen
```
Danach die Anwendung neu starten. Auf der Anmeldeseite erscheint der Knopf für
authentik.
### Wie die Rollenvorbelegung wirkt
Die Zuordnung greift **nur beim allerersten Login** einer Person. Danach ist
die in FLORIAN gepflegte Rolle führend, und authentik überschreibt sie nicht
mehr. Wer also einem Mitglied in FLORIAN die Rolle „Gerätewart" gibt, behält
sie — auch wenn die authentik-Gruppe etwas anderes sagt.
Steht `AUTH_OIDC_AUTO_PROVISION=false`, muss die Person vorher in FLORIAN
angelegt sein. Verknüpft wird über die E-Mail-Adresse.
### Wenn authentik ausfällt
Solange `AUTH_LOCAL_ENABLED=true` steht, bleibt der Passwort-Login als
Rückfallweg erreichbar. Für den Wirkbetrieb ist es sinnvoll, mindestens ein
Konto mit Passwort zu behalten — sonst sperrt ein Ausfall von authentik die
ganze Wehr aus.
---
## 37. PIN und Ausweiskarte verwalten
Wie sich am Terminal angemeldet wird, steht in Kapitel 24. Hier geht es darum,
was dahinter liegt.
Am Terminal wird zweifach geprüft:
1. **Das Gerät** weist sich mit `KIOSK_DEVICE_SECRET` aus. Ohne diesen Wert
nimmt der Server keine PIN und keine Karte an.
2. **Die Person** meldet sich mit einer sechsstelligen PIN (zusammen mit ihrer
Mitgliedsnummer) oder mit einer RFID-Karte an.
Beides wird nur als Hash gespeichert — weder die PIN noch die Kartenkennung
liegen im Klartext in der Datenbank.
PINs, die sich zu leicht raten lassen, weist FLORIAN ab: lauter gleiche
Ziffern und fortlaufende Folgen wie `123456`.
Aus dem Seed lässt sich das ausprobieren: Mitgliedsnummer `0001` (Andreas
Huber), PIN `471203`.
---
## 38. Was protokolliert wird
Jede schreibende Änderung erzeugt einen Eintrag mit Zeitpunkt, Person,
betroffenem Datensatz und den geänderten Feldern im Vorher-Nachher-Vergleich.
Auch jede Anmeldung — erfolgreich wie gescheitert.
Zwei Eigenschaften sind wichtig:
**Der Log lässt sich nicht ändern.** Nicht über die Oberfläche, nicht über die
Datenbank, auch nicht vom Administrator. Die Datenbank selbst verhindert es.
**Er lässt sich nur im Aufbewahrungslauf kürzen.** Nach der eingestellten
Frist (`AUDIT_AUFBEWAHRUNG_TAGE`, Vorgabe 10 Jahre) sichert der
Hintergrundprozess die alten Einträge und entfernt sie danach. Das ist der
einzige Weg, auf dem etwas aus dem Log verschwindet.
**Passwörter, PINs und Kartenkennungen stehen nie im Log** — sie werden vor
dem Schreiben herausgenommen.
Einsehbar ist der Log mit dem Recht `system.auditlog`, das Kommandant und
Administrator haben. Am Gerät und am Fahrzeug ist der Verlauf bereits auf der
jeweiligen Detailseite sichtbar.
---
## 39. Wenn etwas nicht geht
| Beobachtung | Wahrscheinliche Ursache | Was hilft |
|---|---|---|
| Die Anwendung startet nicht und meldet fehlende Variablen | `.env` unvollständig | Die Meldung nennt jede fehlende Variable. Erklärungen dazu stehen in `.env.example`. |
| Anmeldung schlägt immer fehl, obwohl das Passwort stimmt | Konto nach Fehlversuchen gesperrt | Fünf Minuten warten, oder `gesperrtBis` in der Datenbank zurücksetzen |
| Listen sind leer, obwohl Daten da sind | Kein Mandantenkontext gesetzt | Das ist der Schutzmechanismus. Der Zugriff muss über `fuerOrganisation()` laufen. |
| Dateien lassen sich nicht hochladen | MinIO nicht erreichbar oder Bucket fehlt | `http://localhost:9011` öffnen; `docker compose logs minio-init` |
| Der Knopf für authentik fehlt | Issuer, Client-ID oder Secret nicht gesetzt | Alle drei sind nötig, sonst wird der Weg ausgeblendet |
| Etikettenbogen lässt sich nicht erzeugen | Gotenberg läuft nicht | `docker compose ps`, dann `docker compose up -d gotenberg` |
| Kamera bleibt schwarz | Freigabe abgelehnt, oder die Seite läuft nicht über HTTPS | Der Browser fragt nur bei HTTPS oder localhost. Sonst die Inventarnummer eintippen |
| Import meldet fehlende Pflichtfelder | Keine Spalte ist Inventarnummer oder Bezeichnung zugeordnet | In Schritt 2 die Zuordnung von Hand setzen |
| Umlaute im Import verstümmelt | Die Datei ist weder UTF-8 noch Windows-1252 | In Excel als „CSV UTF-8" speichern |
| Gerät lässt sich nicht speichern | Standort **und** Fahrzeug gesetzt, oder keines von beidem | Genau eines von beiden angeben |
| `docker compose up` startet Traefik mit | Override-Datei wurde nicht mitgeladen | In Produktion `-f docker-compose.yml` angeben |
| Terminal zeigt „Terminal nicht eingerichtet" | Das Tablet kennt keine Wehr, oder der Browserspeicher wurde geleert | `/kiosk/einrichten` erneut aufrufen |
| Terminal weist jede PIN ab | Gerätegeheimnis stimmt nicht mit `KIOSK_DEVICE_SECRET` überein | Einrichtung mit dem aktuellen Wert wiederholen |
| Die Leiste zeigt dauerhaft wartende Änderungen | Server erreichbar, aber der Vorgang wird abgelehnt | Über „anzeigen" den Grund lesen; landet er als Konflikt, steht er unter `/terminal` |
| „Der Code wurde nicht erkannt" beim QR-Login | Marke älter als 60 Sekunden | Auf dem Handy die Seite Anmeldemarke offen halten, sie erneuert den Code selbst |
| Der Monitor zeigt keine Wetterwarnung | `WETTER_ENABLED` aus oder `DWD_WARNCELL` leer | Beides setzen; ohne Warnzelle wird nichts abgerufen |
| Der Sicherheitshinweis im Atemschutz bleibt trotz `ATEMSCHUTZ_HINWEIS=false` | `ATEMSCHUTZ_FREIGABE` ist leer | Fundstelle der Freigabe eintragen — ohne sie bleibt der Hinweis absichtlich stehen |
| Die Überwachung lässt sich nicht beenden | Ein Trupp ist noch nicht als draußen gemeldet | Trupp abmelden, dann beenden. Die Meldung nennt die Anzahl |
| Oben steht „Verbindung unterbrochen", obwohl das Netz da ist | Der Ereignisstrom wurde von einem Proxy gepuffert oder gekappt | Die Ansicht arbeitet weiter; bei einem Reverse Proxy `X-Accel-Buffering: no` durchreichen |
| Das Atemschutzprotokoll fehlt | Die Überwachung ist noch nicht beendet | Ein Protokoll entsteht erst mit dem Ende — vorher wäre es unvollständig und sähe vollständig aus |
Zustand aller Randsysteme auf einen Blick:
```
http://localhost:3100/api/health
```
Antwortet mit `200` und `"status": "ok"`, wenn Datenbank, Objektspeicher und
Warteschlange erreichbar sind — sonst mit `503` und der Angabe, welcher Dienst
fehlt.
---
## Bilder erneuern
```bash
docker compose up -d
npm run dev
npm run screenshots
```
Die Bilder entstehen in `docs/screenshots/`, jeweils in heller und dunkler
Darstellung, und werden mit eingecheckt — die Anleitung soll auch dann lesbar
sein, wenn gerade kein Stack läuft.