Überwachungsmodul "diagnostics"
Beschreibung
Aufgabe des Überwachungsmoduls "diagnostics" ist es, unterschiedliche Arten von Eingangsdaten bezüglich festgelegter Kriterien zu überwachen und die hieraus resultierenden Alarminformationen anschließend in die smartCORE Alarmdatenbank des Alarm-Managers zu schreiben.
Diese Datenbank kann zur weiteren Verarbeitung der Alarmmeldungen z.B. mit dem opticloud-Plugin an die optiCloud angebunden werden.
Zu den Arten überwachter Eingangsdaten zählen unter anderem
- Boolesche Werte, z.B. Status-Flags oder Ergbenisse berechneter Logik
- Double-Werte (Fließkomma), z.B. Messwerte oder berechnete Größen, die gegen einen festen Grenzwert verglichen werden. Eine einstellbare Hysterese ist für die Unterdrückung von Rauschen vorgesehen. Um Extremwerte nachzuverfolgen, können Aktualisierungen der Meldung aktiviert werden.
- Integer-Codes, z.B. Status- oder ENUM-Codes oder bestimmte bits oder bit-Abschnitte; dabei können einzelne Codes oder Code-Bereiche mittels eine White/Black-List gefiltert werden und jeweils dem Zustand HIGH oder LOW zugeordnet werden. Nicht passende Codes werden über einen eigenen Fehlerzustands-Alarm gemeldet bis ein gültiger Code eintrifft. Um Statuswechsel nachzuverfolgen, können Aktualisierungen der Meldung aktiviert werden.
- String-Werte (Text), z.B. Logbuch-Meldungen eines Gerätes; dabei können Textelemente über Regular Expressions (PCRE) extrahiert, als White/Black-List gefiltert und dem Zustand HIGH oder LOW zugeordnet werden. Nicht passende Texte werden über einen eigenen Fehlerzustands-Alarm gemeldet bis ein gültiger Code eintrifft.
- ErrorCode: Eine Folge von Error-Codes (
<string>) in Verbindung entweder mit einem Level-Kanal oder einem Transfer-Kanal. Das Diagnostics-Modul führt intern eine Tabelle mit Fehlercodes und der zugehörigen Meldungsinstanz. Meldungen können einzelnen Codes oder als Template einem Code-Bereich (Wildcard) oder allen eingehenden Codes zugewiesen werden.
Darüberhinaus werden im Rahmen der Zusammenstellung von Alarmmeldungen aktuelle Werte von smartCORE Kanälen erfasst (sogenannte Snapshots) sowie benutzerdefinierte Metadaten integriert. Das folgende Schema gibt einen Überblick über die implementierte Funktionalität der Alarm-Logik. Je Message-Eintrag stehen die hellgelb hinterlegten Blöcke zur Verfügung:
Die Verarbeitung der Daten eines überwachten Kanals erfolgt aus Sicht des Diagnose-Plugins, d.h. es findet eine implizite Umwandlung in den erwarteten Datentyp statt. Damit spielt der Datentyp des Kanals für die Auswertung keine Rolle, sofern dieser entsprechend konvertierbar ist.
Verwendete Schnittstellen & Protokolle
- smartCORE Alarmdatenbank
JSON-Konfiguration
In den folgenden Abschnitten werden Beispielkonfigurationen aufgelistet sowie hieran beteiligte Modulparameter diskutiert.
Beispielkonfiguration (Überwachung auf Boolesche Werte)
In diesem Beispiel wird ein Kanal als Boolean gelesen auf den Wert true überwacht.
Zur Konvertierung des Datentyps gilt:
<integer,<unsigned integer>oder<double>ist true, wenn das Sample ist,<string>ist true, wenn der String nicht leer ist
{
"module": "diagnostics",
"factory": "diagnostics",
"config": {
"pollingIntervalMs": 1000,
"messages": [
{
"messageLevel": "WARNING",
"context": "Monitoring someBooleanChannel",
"channel": "someBooleanChannel",
"activation": "high"
}
]
}
}
Beispielkonfiguration (Überwachung der Überschreitung eines numerischen Werts mit Stabilisierungsverzögerungen und Hysterese)
In diesem Beispiel wird ein Kanal als Double gelesen und auf die Überschreitung des Wertes von 42.0 hin überwacht.
Zur Konvertierung des Datentyps gilt:
<bool>werden in 0 und 1 übersetzt,<string>liefert als Wert die Länge des Strings
Im Beispiel ist es zur Auslösung notwendig, dass die Überschreitung mindestens 5 Sekunden lang andauert bzw. zur Deaktivierung, dass diese mindestens 10 Sekunden lang nicht vorliegt und hierfür der Wert des Kanals unterhalb des Schwellwerts minus seiner Hysterese liegt.
Es wird zudem eine Ereignis bezogene Meldung generiert, die den aktuellen Wert, das bisherige Extremum, d.h. in diesem Fall Maximum, sowie den Schwellwert beinhaltet.
Diese Meldung wird sowohl bei initialer Überschreitung als auch bei Deaktivierung aktualisiert. Außerdem wird diese Meldung bei Abweichungen des aktuellen Werts vom zuletzt gemeldeten Extremum, die größer als die Hysterese sind, ebenfalls aktualisiert.
{
"module": "diagnostics",
"factory": "diagnostics",
"config": {
"pollingIntervalMs": 1000,
"messages": [
{
"messageLevel": "WARNING",
"context": "Monitoring measured someValueChannel",
"messageEvent": "Some WARNING occurred (current value ${value} > ${boundary}) (maximum value ${minmax} on ${minmaxDate} at ${minmaxTime})",
"channel": "someValueChannel",
"threshold": 42.0,
"hysteresis": 7.0,
"activation": "high",
"stabilizationSecondsRaise": 5,
"stabilizationSecondsRelease": 10,
}
]
}
}
Beispielkonfiguration (Überwachung enumerierter Werte)
In diesem Beispiel wird ein Kanal als Integer-Wert gelesen und überwacht.
Zur Konvertierung des Datentyps gilt:
<bool>werden in 0 und 1 übersetzt,<float>oder<double>werden ohne Nachkommastellen verwendet,<string>liefert als Wert die Länge des Strings
In diesem Beispiel werden die Wertebereiche 17 und 77-99 als Auslösebedingung (HIGH), die Wertebereiche 31-39, 66 und 69-71 als Deaktivierungsbedingung (LOW) sowie sämtliche anderen Bereiche als ungültige Alarmbedingung interpretiert.
{
"module": "diagnostics",
"factory": "diagnostics",
"config": {
"pollingIntervalMs": 1000,
"messages": [
{
"messageLevel": "WARNING",
"context": "Monitoring someEnumeratedChannel",
"messageEvent": "Some WARNING occurred",
"messageFailure": "INVALID error occurred",
"channel": "someEnumeratedChannel",
"activation": "enum",
"valuesHigh": "17,77-99",
"valuesLow": "31-39,66,69-71"
}
]
}
}
Beispielkonfiguration (Überwachung eines Error Streams)
In diesem Beispiel werden FehlerCodes (ErrorCode) aus einem sogenannten Error Stream überwacht.
Dieser besteht aus den beiden sourceErrorCode und sourceErrorLevel Kanälen, die zeitlich synchron sein müssen. Der Fehlercode-Kanal wird als <string> gelesen, sodass fast beliebige Kanäle als Quelle verwendet weren können. Der Fehlerlevel-Kanal muss ganzzahlige <integer> Werte liefern. Die aus diesem Error Stream extrahierten Codes stehen allen ErrorCode-Messages in der Reihenfolge ihrer Definition zur Verarbeitung zur Verfügung. Ein bestimmter Code kann jeweils nur in einer ErrorCode-Message berücksichtigt werden.
Im Beispiel werden sowohl der benutzerspezifische Fehlercode "47:11", Fehlercodes, die mit "ERR:" beginnen, als auch sämtliche anderen unbekannten Fehlercodes überwacht. Wenn das Message-Objekt für verschiedene Codes verwendet werden soll, muss es als Template markiert werden.
{
"module": "diagnostics",
"factory": "diagnostics",
"config": {
"pollingIntervalMs": 1000,
"sourceErrorCode": "Some.Name.Space.ErrorCodeChannel",
"sourceErrorLevel": "Some.Name.Space.ErrorLevelChannel",
"messages": [
{
"errorCode": "47:11",
"messageLevel": "ALARM",
"context": "Monitoring Error-Stream for 47:11",
"messageEvent": "ALARM ${errorCode} occurred"
},
{
"isTemplate": true,
"errorCode": "ERR:*",
"messageLevel": "ERROR",
"context": "Monitoring for ERR-codes",
"messageEvent": "Error ${errorCode} occurred"
},
{
"isTemplate": true,
"messageLevel": "WARNING",
"context": "Collection unknown codes",
"messageEvent": "Unknown code ${errorCode} occurred"
}
]
}
}
Beispielkonfiguration (Verwendung von Metadaten)
In diesem Beispiel wird ein Kanal wie in Besipiel 1 auf den Wert true überwacht. Ziel dieses Beispiels ist es, die Ergänzung von Alarmmeldungen um benutzerspezifische Metadaten zu veranschaulichen.
Es werden hierfür im Rahmen der Zusammenstellung der Alarmmeldung Metadaten in Form eines JSON-Objekts hinzugefügt, wobei immer die globalen Metadaten um die im Rahmen der Message spezifizierten Metadaten ergänzt bzw. auf oberster Ebene des JSON-Objekts ersetzt werden.
{
"module": "diagnostics",
"factory": "diagnostics",
"config": {
"pollingIntervalMs": 1000,
"globalMetadata": {
"actionToBePerformed":"some generic action",
"consequences":[
"consequence1",
"consequence2"
]
},
"messages": [
{
"messageLevel": "WARNING",
"context": "Monitoring someBooleanChannel",
"channel": "someBooleanChannel",
"activation": "high",
"metadata": {
"actionToBePerformed":"some CRITICAL action",
"consequences":[
"some SEVERE consequence",
"consequence1",
"consequence2"
],
"additionalRemarks":[
"some REMARK"
]
}
}
]
}
}
Beispielkonfiguration (Verwendung von Snapshot-Kanälen)
In diesem Beispiel wird ein Kanal wie in Besipiel 1 auf den Wert true überwacht.
Ziel dieses Beispiels ist es, die Ergänzung von Alarmmeldungen um einen benutzerspezifischen Snapshot von Kanalwerten zu veranschaulichen.
Es wird hierfür zum Zeitpunkt des initialen Auftretens der Alarmbedingung eine Momentaufnahme der aufgeführten smartCORE Kanäle angefertigt, die aus der Vereinigung aller globalen und meldungsbezogenen Snapshot-Kanälen besteht.
{
"module": "diagnostics",
"factory": "diagnostics",
"config": {
"pollingIntervalMs": 1000,
"globalSnapshot": [
"someGps.Location",
"someOutsideTemperature"
]
"messages": [
{
"messageLevel": "WARNING",
"context": "Monitoring someBooleanChannel",
"channel": "someBooleanChannel",
"activation": "high",
"snapshot": [
"somePressure",
"someTemperature",
"someQuantity",
]
}
]
}
}
Beispielkonfiguration (Verwendung von Snapshot-Gruppen)
In diesem Beispiel wird ein Kanal wie in Besipiel 1 auf den Wert true überwacht.
Dieses Beispiel veranschaulicht zusätzlich die Verwendung sogenannter Snapshot-Gruppen.
{
"module": "diagnostics",
"factory": "diagnostics",
"config": {
"pollingIntervalMs": 1000,
"snapshotGroups": [
{
"name": "gpsInfoChannels",
"channels": [
"GPS.Location",
"GPS.Altitude",
"GPS.SatCount"
]
},
{
"name": "EngineOilPTQChannels",
"channels": [
"Engine.Oil.Pressure",
"Engine.Oil.Temperature",
"Engine.Oil.Quantity"
]
}
],
"globalSnapshot": [
"gpsInfoChannels",
"someOutsideTemperature"
]
"messages": [
{
"messageLevel": "WARNING",
"context": "Monitoring someBooleanChannel",
"channel": "someBooleanChannel",
"activation": "high",
"snapshot": [
"Engine.Revs",
"EngineOilPTQChannels"
]
}
]
}
}
Globale Modulparameter
Im folgenden Abschnitt werden sämtliche Parameter des Moduls diskutiert.
| Parametername | Erforderlich | Datentyp | sinnvoller Wertebereich | Default-Wert | Beschreibung |
|---|---|---|---|---|---|
| pollingIntervalMs | Nein | INT | 1 - | 1000 (1 s) | Verarbeitungsintervall [ms] |
| globalMetadata | Nein | JSON Object | EMPTY JSON Object | JSON Objekt mit beliebigen benutzerspezifizierten Metadaten | |
| globalSnapshot | Nein | JSON Array of STRING | EMPTY JSON Array | JSON Array, welches eine globale Liste mit Kanälen beinhaltet, deren Werte zum Zeitpunkt der Alarmierung punktuell erfasst werden sollen | |
| snapshotGroups | Nein | JSON Array of JSON Object | EMPTY JSON Array | siehe unten | |
| (veraltet) | Siehe Beschreibung der Messages | ||||
| messages | JA | JSON Array of JSON Object | KEIN Default-Wert | siehe unten | |
| für Error-Stream oder Error-Table | |||||
| sourceErrorCode | Nein/Ja2 3 | STRING | KEIN Default-Wert | smartCORE Kanal, gelesen als <string>, der einen zeitlich variablen Fehlercode beinhaltet | |
| sourceErrorLevel | Nein/Ja2 | STRING | KEIN Default-Wert | smartCORE Kanal, gelesen als <integer> der ein hierzu synchrones Fehlerlevel beinhaltet | |
| neutralErrorLevel | Nein2 (veraltet) | INTEGER | 0 | Neutraler Fehlerlevel, bei dem KEIN Alarm ausgelöst wird | |
| sourceBufferTransfer | Nein/Ja3 | STRING | KEIN Default-Wert | smartCORE Kanal, gelesen als <bool>, der das Framing für die Übertragung der Fehlertabelle steuert | |
| timeoutBufferTransfer | Nein/Ja3 | DOUBLE | 0 | Minimale Pause zwischen der Übertragung der Fehlertabellen in Sekunden |
Globale Snapshot Gruppen "snapshotGroups"
Mehrere im Rahmen eines Snapshots zu erfassende Kanäle können in Form einer Snapshot-Gruppe als JSON-Objekt konfiguriert werden, deren Name dann im weiteren Verlauf der Konfiguration in Gruppen und Signallisten wie ein Kanalname verwendet werden kann. Sinnvollerweise sollten diese Gruppen so benannt werden, dass keine Überschreibung mit existierenden Kanalnamen erfolgt, da ein Name in einer Signalliste bei der Interpretation zuerst als Gruppenname geprüft wird.
Sind Kanalnamen in verschiedenen Gruppen oder Signallisten enthalten und damit vervielfacht, werden sie beim Zusammenstellen des Snapshot nur einmal in diesen aufgenommen.
| Parametername | Erforderlich | Datentyp | sinnvoller Wertebereich | Default-Wert | Beschreibung |
|---|---|---|---|---|---|
| name | JA | STRING | Name bzw. Alias der Snapshot-Gruppe | ||
| channels | JA | JSON Array of STRING | Liste aller Kanalnamen oder bereits definierten Gruppen |
Konfiguration der Alarmmeldungen "messages"
Die Alarmmeldungen "messages" werden in Form von JSON Objekten und je nach Art der Überwachung unterschiedlich konfiguriert.
Über die Auswahl der Parameter wird bestimmt, welche Art der Überwachung ausgeführt wird. Die folgende Tabelle fasst dies zusammen. Sobald ein genannter Parameter verwendet wird, wird die entsprechende Funktion aktiviert:
| Überwachung als... | Parameter zur Aktivierung | Erforderlich | Weitere empfohlene Parameter | Bemerkung |
|---|---|---|---|---|
| ErrorCode | isTemplate errorCode | Nein Nein | Ignoriert channelName, da Datenquelle Error-Stream/-Table, activation := HIGH Keine Filterfunktion | |
| Double | threshold hysteresis | Ja (veraltet) Ja | channel activation stabilizationSecondsRaise stabilizationSecondsRelease | Hysteresis ist immer |
| Integer | startBit numberOfBits valuesWhite valuesBlack valuesHigh valuesLow | Nein Nein Nein Nein Empfohlen Empfohlen | channel activation stabilizationSecondsRaise stabilizationSecondsRelease | Mit numberOfBits == 1 wird das ausgewählte Bit wie im Mode Boolean behandelt. |
| String | regxWhite regxBlack regxHigh regxLow | Nein Nein Empfohlen Empfohlen | channel activation stabilizationSecondsRaise stabilizationSecondsRelease | Wenn regxWhite Subexpressions definiert, werden diese für alle nachfolgenden Tests extrahiert und mit ';' verbunden. |
| Boolean | channel activation stabilizationSecondsRaise stabilizationSecondsRelease |
Gemeinsame Konfigurationsparameter
Unabhängig vom Typ der Überwachung sind folgende Parameter für Messages definiert:
| Parametername | Erforderlich | Datentyp | sinnvoller Wertebereich | Default-Wert | Beschreibung |
|---|---|---|---|---|---|
| messageLevel | JA | STRING | info, action, service, warning, alarm, error, fatal | KEIN Default-Wert | Schweregrad der Alarmmeldung |
| context | JA | STRING | Kontext der Alarmmeldung Statischer Text zur Identifiaktion einer Meldung | ||
| channel | JA/Nein6 | STRING | Name des überwachten smartCORE Kanals | ||
| activation | JA | STRING | low, high, minimum, maximum, positiveEdge, negativeEdge, enumCode | high | Art der Alarmaktivierung. |
| messageEvent | Nein | STRING | Alarmmeldung, wenn Alarm ausgelöst wird. Es können Platzhalter für dynmische Meldungsinhalte verwendet werden. | ||
| needAcknowledge | Nein | BOOLEAN | false, true | false | ist eine Quittierung auf Cloud-Seite erforderlich |
| keepAcknowledgedStatus | Nein | BOOLEAN | false, true | false | soll quittierter Status beibehalten werden |
| metadata | Nein | JSON Object | EMPTY JSON Object | Benutzerdefinierte Metadaten, die die globalen Metadaten potentiell überschreiben können | |
| snapshot | Nein | JSON Array of STRING | EMPTY JSON Array | während des initialen Auftretens der Alarmbedingung zu erfassende Kanäle. Es wird der globale Snapshot "globalSnapshot" mit den hier spezifizierten und aufgelösten Snapshot-Gruppen (aus "snapshotGroups") sowie hier individuell spezifizierten Kanälen vereinigt. | |
| Sofern die Filterfunktion verfügbar ist: | |||||
| stabilizationSecondsRaise | Nein | INTEGER | 1 - | 0 | Stabilisierungsverzögerung, nach der der Alarm ausgelöst werden soll (es wird der initiale Zeitpunkt des ersten Auftretens der Alarmbedingung gemeldet) |
| stabilizationSecondsRelease | Nein | INTEGER | 1 - | 0 | Stabilisierungsverzögerung, nach der der Alarm deaktiviert werden soll (es wird der initiale Zeitpunkt des ersten Auftretens der Deaktivierungsbedingung gemeldet) |
| Sofern ein Fehlerereignis ausgelöst werden kann: | |||||
| messageFailure | Nein | STRING | Alarmmeldung, wenn Alarmierungsbedingung ungültig ist. Es können Platzhalter für dynmische Meldungsinhalte verwendet werden. |
Konfiguration der Aktivierung: activation
Folgende Werte sind für die Alarmaktivierung wählbar:
| Enum-Wert | Aliase | Bedeutung | Bemerkung |
|---|---|---|---|
| low | Auslösung solange Quelle LOW liefert | Mode Double überwacht auf Minimum | |
| high, (Default) | Auslösung solange Quelle HIGH liefert | Mode Double überwacht auf Maximum | |
| minimum | min | Auslösung solange Quelle LOW liefert mit Updates | Mode Double überwacht auf Minimum mit Aktualisierung |
| maximum | max | Auslösung solange Quelle HIGH liefert mit Updates | Mode Double überwacht auf Maximum mit Aktualisierung |
| negativeEdge | negEdge | Wechsel von HIGH->LOW löst aus | Meldung als zustandsloses Ereignis7 |
| positiveEdge | posEdge | Wechsel von LOW->HIGH löst aus | Meldung als zustandsloses Ereignis7 |
| enumCode | enum | Auslösung solange Quelle HIGH liefert mit Updates | Modes Integer/String aktualisieren jeweils für den neuen Fehlercode |
Platzhalter für Meldungstexte
In den Meldungstexten messageEvent, messageFailure können folgende Platzhalter verwendet werden, um dynamisch den Text mit jedem Event oder jeder Aktualisierung durch aktuelle Werte zu ergänzen. Im Falle von templated-Errorcode-Messages können bestimmte Platzhalter auch in context ersetzt werden, wenn der Fehlercode zum ersten Mal registreiert wird.
| Platzhalter | ersetzt durch | Beispiel |
|---|---|---|
${channel} | Kanalname der Message | someChannelName |
${unit} | Physikalische Einheit des Kanals | °C |
${value}8 | Der aktuelle Datenwert des Kanals | 3.14159 |
${date} | Das Datum des Ereignisses, YYYY-MM-DD | 2026-12-31 |
${time} | Die Uhrzeit des Ereignisses, hh:mm:ss | 18:05:27 |
${errorCode}9 | Der auslösende Fehlercode | ERR:243:881 |
${errorLevel}9 | Der auslösende Fehler-Level | 8 |
${boundary}10${raiseBoundary}10 | Eingestellter Grenzwert zur Aktivierung threshold | 10.0 |
${releaseBoundary}10 | Grenzwert zur Deaktivierung threshold hysteresis | 8.5 |
${minmax}10 | Letzter Extremwert seit Ereignis oder falls nicht ermittelt: | 17.9 (n.a.) |
${minmaxDate}10 | Datum des Extremwerts oder falls nicht zugewiesen: | 2026-12-31 (n.a.) |
${minmaxTime}10 | Uhrzeit des Extremwerts oder falls nicht zugewiesen: | 18:12:35 (n.a.) |
Alle anderen und eventuell nicht verfügabre Platzhalter ${...} werden durch "(n.d.)" ersetzt.