# Ereignisse

> Die Aufzeichnung der Station über das Geschehene: dauerhafte Verläufe von Alarmen, Ereigniseinträgen und Verriegelungen neben der laufenden Diagnosekonsole, mit Suche, Filtern und Export nach CSV/JSON.

Ereignisse ist die Seite, die die Frage "Was ist geschehen?" beantwortet. Sie steht in der unteren
Gruppe der Navigationsleiste (Validierung, Ereignisse, Agentenzugriff, Einstellungen, Konto) und
trägt vier
Registerkarten: **Alarme**, **Ereigniseinträge** und **Verriegelungen** sind dauerhafte Verläufe aus
dem Ereignisjournal der Station, und **Konsole** ist der laufende Diagnosestrom, in den jedes
Teilsystem schreibt. Der Seitenkopf lautet "Dauerhafte Historien für Alarme, Ereigniseinträge und
Verriegelungen sowie die Live-Konsole für die Diagnose."

Die Seite zu sehen setzt die Berechtigung **Ereignisse anzeigen** voraus (Bereich System): sowohl
der Eintrag in der Navigationsleiste als auch die Adresse `/events` prüfen sie. Jede werkseitige
Rolle hält sie standardmäßig, "Nicht angemeldet" eingeschlossen, und Admin immer; eine leer
angelegte Rolle beginnt ohne sie, und ein Administrator kann sie jeder Rolle außer Admin entziehen.
Das Exportieren aus einer Registerkarte setzt zusätzlich **Historien exportieren/importieren**
voraus.

## Die Registerkarten und ihre Adressen {#the-tabs-and-their-addresses}

| Registerkarte | Was sie auflistet | Adresse | Seite |
| --- | --- | --- | --- |
| Alarme | Die jetzt wartenden Alarme, über dem dauerhaften Verlauf aller Alarmzustandswechsel | `/events?view=alarms` | [Alarme](events-alarms) |
| Ereigniseinträge | Jede Ereignisflanke, die während eines Laufs oder von der laufunabhängigen Überwachung Always beobachtet wurde | `/events?view=occurrences` | [Ereigniseinträge](events-occurrences) |
| Verriegelungen | Jeder Wechsel des Stopp-Verriegelungsspeichers einer Einheit | `/events?view=interlocks` | [Verriegelungen](events-interlocks) |
| Konsole | Die letzten 500 Diagnoseeinträge des laufenden Programms | `/events?view=console` | [Konsole](events-console) |

Die Seite öffnet auf Alarme. Ein Klick auf eine Registerkarte schreibt die Adresse um (ersetzend, so
dass die Registerkartenleiste den Zurück-Verlauf des Browsers nie füllt), und ein Link, der `view=`
trägt, landet auf dieser Registerkarte; ein Wert, den die Seite nicht kennt, lässt sie auf Alarme
öffnen. So erreicht die Alarmanzeige der Statusleiste (die Glocke mit "N aktiv (M unquittiert)", nur
gezeichnet, solange ein Alarm aktiv ist oder auf eine Quittierung wartet) die Alarmliste: Sie
navigiert nach `/events?view=alarms`, also auf den Bildschirm, auf dem das Gezählte sowohl gelesen
als auch beantwortet wird, und nie auf die Seite Logic, auf der Alarme konfiguriert werden.

Konsole bleibt hinter den anderen Registerkarten eingehängt, so dass ihr Mitlauf und ihre
Bildlaufposition einen Wechsel überstehen; jeder der drei Verläufe behält seine eigene Suche, seinen
Filter, seine Zeilen und seine Auswahl, während Sie zwischen ihnen wechseln.

## Wer sehen und exportieren darf {#who-can-see-and-export}

| Berechtigung | Was sie auf dieser Seite öffnet | Ohne sie |
| --- | --- | --- |
| Ereignisse anzeigen | Den Eintrag in der Navigationsleiste, die Adresse und jede Registerkarte | Der Eintrag wird nicht gezeichnet und die Adresse wird abgewiesen |
| Historien exportieren/importieren | **Exportieren** auf jeder Registerkarte (CSV, JSON) und **Supportpaket erstellen** auf der Konsole | Die Schaltfläche Export wird nicht gezeichnet; ein Druck, der dennoch die Verarbeitung erreicht, antwortet im Aktionsprotokoll "Der Export von Ereignissen setzt die Berechtigung Historien exportieren/importieren voraus." |
| Logic bedienen | **Quittieren** und **Alle quittieren** auf der Registerkarte Alarme | Die Befehle werden nicht gezeichnet; die Zeilen bleiben lesbar |
| Einstellungen ändern | **Aufzeichnung starten** und **Aufzeichnung beenden** auf der Konsole | Die Schaltfläche wird nicht gezeichnet; der Aufzeichnungszustand wird Screenreadern weiterhin angesagt |

Die Berechtigungen werden je Verbindung entschieden, also sieht ein Browserkreis, der als anderer
Benutzer angemeldet ist, seinen eigenen Satz Schaltflächen, und eine Anmeldung, eine Abmeldung oder
eine Rollenänderung zeichnet sie sofort neu. Der Katalog steht unter
[Berechtigungen](users-permissions).

## Wie sich die drei Verläufe verhalten {#how-the-three-timelines-behave}

Die Registerkarten Alarme, Ereigniseinträge und Verriegelungen teilen ein Verhalten, so dass ein
Wechsel der Registerkarte nie die Regeln ändert:

| Verhalten | Einzelheit |
| --- | --- |
| Fenster | Jede Registerkarte listet 500 Ereignisse je Seite, die auf ihre Suche, ihren Filter und den gewählten Zeitraum passen, das neueste zuerst (bei gleichem Zeitstempel entscheidet die Reihenfolge des Einfügens). Unter der Liste gehen **Neuere** und **Ältere** seitenweise durch das übrige Journal, und die Leiste wird nur gezeichnet, solange es eine weitere Seite gibt. Die neueste Seite folgt dem Journal laufend; eine Seite dahinter steht still, damit ein jetzt eintreffendes Ereignis nicht wegschiebt, was Sie gerade lesen. |
| Zeitraum | Zwei Datumsfelder, **Von** und **Bis**, jedes ein Ende des gelesenen Zeitraums. Ein leeres Feld ist gar keine Grenze, bei zwei leeren Feldern liest die Registerkarte also das ganze Journal, und der als Ende gewählte Tag zählt vollständig mit, bis zu seinem letzten Augenblick. Das Kreuz daneben hebt beide auf und stellt die Registerkarte auf die erste Seite zurück. |
| Suche | Ein Textfeld, dessen Platzhalter die Spalten nennt, auf die es passt (Name, Meldung, Quelle, Modell, Einheit, Ablauf, Verfasser, je nach Registerkarte). Verglichen wird auf "enthält", ohne Beachtung der Groß- und Kleinschreibung, 250 ms nachdem Sie zu tippen aufhören; führende und abschließende Leerzeichen werden übergangen. |
| Stufenfilter | Eine Liste je Registerkarte: **Priorität** bei Alarmen, **Schweregrad** bei Ereigniseinträgen, **Übergang** bei Verriegelungen. Eine Änderung liest das Journal sofort neu. |
| Aktualisieren | Die Schaltfläche mit dem Kreispfeil liest das Journal auf Wunsch neu; ihr Tooltip nennt die Registerkarte ("Alarmereignisse aktualisieren", "Ereigniseinträge aktualisieren", "Verriegelungsereignisse aktualisieren"). Sie ist ausgegraut, solange ein Lesevorgang läuft. |
| Laufende Aktualisierung | Jedes ins Journal geschriebene Ereignis fragt die offene Registerkarte von selbst neu ab, zusammengefasst, so dass ein Schwall einen Lesevorgang kostet (etwa 200 ms nach dem letzten Schreibvorgang). Eine Registerkarte, auf die Sie nicht schauen, wird bei der Rückkehr neu gelesen. |
| Auswahl | Ein Klick auf eine Zeile öffnet den Detailbereich rechts. Die Auswahl bleibt über Aktualisierungen hinweg an ihrer Ereigniskennung erhalten und entfällt, wenn die Zeile nicht auf der gelesenen Seite steht; das Kreuz im Kopf des Bereichs schließt ihn. |
| Ereignis kopieren | Die Schaltfläche am Fuß des Detailbereichs kopiert das Ereignis als eine Textzeile: vollständiger Zeitstempel, Art, Stufe, Name, die Zusammenfassung des Übergangs, die Meldung und, bei Ereigniseinträgen und Verriegelungen, die Kennungen. Das Aktionsprotokoll antwortet "Ereignis in die Zwischenablage kopiert." oder "Die Zwischenablage hat das Kopieren abgelehnt.", wenn der Browser es zurückgehalten hat. |
| Exportieren | **Exportieren** öffnet ein Menü mit **Als CSV exportieren…** und **Als JSON exportieren…** für jedes Ereignis, auf das Suche, Filter und Zeitraum passen, Seite um Seite und nicht nur die gezeichneten Zeilen. Die Schaltfläche ist ausgegraut, solange die Seite leer ist. |
| Ungefilterte Aufzeichnung | Das Journal wird nicht danach gefiltert, wer angemeldet ist oder was diese Rolle anderswo sehen darf: Es ist die technische Aufzeichnung der Station, und eine still fehlende Zeile würde die Historie lügen lassen. |

### Die Liste und der Detailbereich {#the-list-and-the-detail-panel}

Jede Zeile trägt Datum und Uhrzeit des Ereignisses im Format, das unter
[Lokalisierung](settings-localization) eingestellt ist, einen Punkt im Ton seiner Stufe, den Namen
des Ereignisses, eine einzeilige Zusammenfassung des Übergangs und am rechten Rand das Wort der
Stufe selbst (die Priorität, den Schweregrad oder den Übergang). Die Töne folgen auf jeder Fläche
einer Skala: der kritische Ton für einen kritischen Alarm, einen kritischen Ereigniseintrag oder
eine ausgelöste Verriegelung; der Warnton für Hoch, Warnung und "Quelle sicher"; der Hinweiston für
Mittel; neutral für den Rest.

Der Detailbereich öffnet mit dem Abzeichen der Stufe und dem Namen, dann dem vollständigen
Zeitstempel mit Millisekunden, der Zusammenfassung des Übergangs, der Meldung (oder "Kein Text
aufgezeichnet.", wenn die Definition keine hatte), einer Karte **EREIGNIS** mit **Stufe** und
**Ereignis-ID** sowie einer oder mehreren Momentaufnahmekarten, deren Felder die Seite jeder
Registerkarte auflistet.

### Die Statuszeile {#the-status-line}

Unter jedem Verlauf: "N angezeigt · Seite 1", wobei N die Zeilen der geöffneten Seite zählt,
gefolgt von " · gefiltert", solange eine Suche, ein Stufenfilter oder ein Zeitraum wirkt;
"N angezeigt · wird aktualisiert…" während eines erneuten Lesens; rechts "1 ausgewählt",
solange eine Zeile ausgewählt ist, und "Aktualisiert hh:mm:ss", die Zeit des letzten erfolgreichen
Lesens.

### Zustände beim Laden, im Leerfall und bei Fehlern {#loading-empty-and-failed-states}

| Zustand | Was die Registerkarte zeigt |
| --- | --- |
| Erstes Lesen | "Alarmereignisse werden geladen…" mit "Die neuesten passenden Alarmereignisse werden aus dem dauerhaften Journal gelesen." (das Hauptwort folgt der Registerkarte). |
| Nichts aufgezeichnet | "Noch keine Alarmereignisse" mit einer Zeile, die sagt, was dort erscheinen wird; die Seite jeder Registerkarte zitiert ihre eigene. |
| Nichts passt | "Keine Alarmereignisse passen zu diesen Filtern" mit "Ändern Sie die Priorität oder die Suchbegriffe, um diese Historie zu erweitern." (Priorität, Schweregrad oder Übergang, je nach Registerkarte). |
| Das Journal ist nicht lesbar | "Alarme konnten nicht geladen werden" mit "Das dauerhafte Journal ist vorübergehend nicht verfügbar. Die Protokolle der Konsole sind davon nicht betroffen." und einer Schaltfläche **Erneut versuchen**; die Statuszeile lautet "Alarme nicht verfügbar". |
| Eine spätere Aktualisierung schlägt fehl | Die letzten guten Zeilen bleiben auf dem Bildschirm, und das Aktionsprotokoll meldet "Das Aktualisieren von Alarmen ist fehlgeschlagen." |

## Einen Verlauf exportieren {#exporting-a-timeline}

Beide Formate sind Browser-Downloads, sie funktionieren also im Fenster der Station selbst wie in
einem entfernten Browser; das Aktionsprotokoll antwortet "N Ereignis(se) exportiert nach" gefolgt
vom Dateinamen oder "Der Export ist fehlgeschlagen.". Der Dateiname trägt die Registerkarte und einen
sortierbaren Stempel: `alarm-history-20260902-143000.csv`, `occurrence-history-<stamp>.json`,
`interlock-history-<stamp>.csv`.

Jeder Zeitpunkt wird im eingestellten Anzeigeformat geschrieben, und die Datei erklärt den Zeitbezug
einmal: Die CSV nennt ihn in der Kopfzeile ihrer ersten Spalte, "Timestamp (UTC-03:00)" (oder
"Timestamp (UTC)"), und die JSON ist ein Umschlag mit einem Feld `TimeZone` auf oberster Ebene neben
einem Feld `Events`. Über das hinaus, was die Zeile zeigt, tragen die Spalten die vollständige
eingefrorene Momentaufnahme mitsamt den Kennungen (die Ereigniskennung, die Kennungen von Alarm,
Ereigniseintrag oder Beobachtung, die Kennungen von Modell und Einheit), so dass ein exportierter
Verlauf mit Laufdateien und Berichten in Beziehung gesetzt werden kann. Einer CSV-Zelle, die mit
`=`, `+`, `-` oder `@` beginnt, wird ein Apostroph vorangestellt, damit eine Tabellenkalkulation sie
als Text und nicht als Formel öffnet. Die Seite jeder Registerkarte listet ihre Spalten auf.

## Was das Journal aufbewahrt {#what-the-journal-keeps}

Die drei Verläufe leben in `events.db`, einer eigenen Datenbank im Datenordner der Station neben
`config.db` und `history-index.db`, mit einer nur anfügenden Tabelle je Verlauf. Geschrieben wird
eine Momentaufnahme, die im Augenblick des Ereignisses entsteht (Namen, Priorität, Meldung, Modell,
Einheit, Quelle, der beobachtete Wert), so dass ein späteres Umbenennen, Ändern oder Löschen der
Definition nie umschreibt, was die Station Ihnen damals gesagt hat. Nichts auf dieser Seite, und
auch sonst nirgends in der Anwendung, löscht eine Zeile: Die Aufbewahrung hält die neuesten
**100.000 Zeilen je Verlauf** und schneidet die ältesten bei jedem Anfügen in der Reihenfolge des
Einfügens ab, so dass eine korrigierte Uhr kein frisches Ereignis verdrängen kann.

Das Journal übersteht einen Neustart und eine Wiederherstellung der Konfiguration: Eine
[Sicherung](settings-backups) kopiert nur die Konfigurationsdatenbank und den Ordner der Betriebsmittel,
also nimmt eine Wiederherstellung das Journal weder mit noch setzt sie es zurück. Es ist eine
Aufzeichnung von Übergängen, nicht von Zuständen: Nach einem Neustart leitet das Alarmregister jeden
Alarm aus dem ersten Zyklus neu ab, ausstehende Quittierungen gehen verloren, und der Verlauf zeigt
schlicht, was davor und danach geschah.

Ereignisse erreichen das Journal über eine geordnete Warteschlange, die die Runtime nie blockiert:
Der Erzeuger nimmt die Momentaufnahme sofort, ein einzelner Schreiber schreibt in der Reihenfolge
des Eintreffens, und ein Schreibvorgang, der weiter fehlschlägt, wird bis zu zehnmal wiederholt,
bevor das Ereignis mit einer Fehlerzeile in der Konsole verworfen wird. Ein Ereigniseintrag, der
**während eines Laufs** beobachtet wird, wird zuerst in die Datei dieses Laufs geschrieben (die
Quelle, die Historien und Berichte lesen) und dann mit derselben Ereigniskennung und dem Laufkontext
ins Journal kopiert; eine Beobachtung **außerhalb eines Laufs** durch einen Ereigniseintrag vom Typ
Always geht nur ins Journal. Verriegelungs- und Alarmwechsel haben keine Aufzeichnung außer dem
Journal. Ein Agent mit geöffnetem Bereich Logs liest dasselbe Journal über `event_history_read`, nur
lesend (siehe [Freigegebene Bereiche](agent-areas)).

## Die Konsole neben der Aufzeichnung {#the-console-beside-the-record}

Die Konsole ist etwas anderes als die drei Verläufe: eine rollende Sicht auf 500 Einträge des
Diagnosestroms des Programms, im Arbeitsspeicher, bei einem Neustart verloren und durch **Ansicht
leeren** geleert. Beide überschneiden sich dort, wo die Runtime erzählt, was sie tut. Eine
Ereignisflanke hinterlässt eine Konsolenzeile im Bereich Process (eine Aktivierung auf der Stufe
ihres Schweregrads: Kritisch als Fehler, Warnung als Warnung, Info als Information), und ein
Verriegelungswechsel ebenso (eine Auslösung als Warnung, eine sichere Quelle und ein Zurücksetzen
als Information). Alarmwechsel erscheinen **nicht** in der Konsole: Die Spur des Auswerters ist
Diagnosedetail, das nur eine [ausführliche Aufzeichnung](events-console#detailed-capture) festhält.
Die Verläufe sind die typisierte Aufzeichnung; die Konsole erklärt die Runtime darum herum.

## Was Ereignisse nicht tut {#what-events-does-not-do}

- Es konfiguriert nichts. Alarme werden unter [Logic > Alarms](logic-alarms) festgelegt,
  Ereigniseinträge unter [Process > Setup > Ereigniseinträge](process-occurrences) und die
  Stopp-Verriegelung unter [Process > Definition > Automatik](process-automation).
- Es setzt keine Verriegelung zurück: Das tut die Komponente Verriegelung auf einem Dashboard oder
  die eigene Ansicht der Einheit.
- Es hat keinen Filter für Einheit oder Lauf: Suchen Sie nach dem Namen oder öffnen Sie
  den Lauf in den [Historien](histories) für dessen eigene Aufzeichnung der Ereigniseinträge.
- Es löscht nichts und ändert nichts; allein die Aufbewahrung entfernt Zeilen.
- Solange die Runtime gestoppt ist, wird diese Seite gar nicht gezeichnet: Jeder Bildschirm außer
  [Konto](account) wird durch den Hinweis auf die Pause ersetzt, die Verläufe eingeschlossen. Das
  Journal selbst bleibt unberührt und liest sich genau so wie zuvor, sobald die Runtime wieder
  gestartet ist.
