correction
Der correction Service korrigiert Messdaten durch Resampling, Interpolation von Messfehlern oder Novalues, Offsetkorrektur und kann meherere Messdateien konkatenieren.
Laufzeitumgebung
Der correction Service muss Zugriff auf zwei Komponenten haben:
- RabbitMQ Message Broker zum Empfangen der Korrekturanfragen und Ablegen der Ergebnisse und Logs.
- MinIO Object Storage, der Messdaten zur Verfügung stellt, falls diese zu groß sind, um sie direkt in der Korrekturanfrage zu senden.
Der correction Service verwendet die folgenden RabbitMQ-Exchanges:
Measurement.Correctionfür Berechnungsanfragen und Antworten- Anfragen werden über den entsprechenden Routing Key empfangen und in der Queue
Measurement.Correction.RequestQueuegehalten - Antworten auf die Berechnungsanfragen werden in der Queue
Measurement.Correction.ResponseQueuegehalten
- Anfragen werden über den entsprechenden Routing Key empfangen und in der Queue
Measurement.Correction.Logszur Speicherung von Logs in der QueueMeasurement.Correction.Logs.QueueMeasurement.Correction.DeadLetterzur Speicherung von Nachrichten, die nicht verarbeitet werden können, in der QueueMeasurement.Correction.DeadLetter.QueueMeasurement.Correction.Canceledzur Speicherung von fehlerhaften Berechnungsanfragen in der QueueMeasurement.Correction.Canceled.Queue
Konfiguration
| Umgebungsvariable | Beschreibung | Typ | Werte |
|---|---|---|---|
| RABBITMQ_HOST* | Der Host, unter dem der RabbitMQ Message Broker erreichbar ist. | string | |
| RABBITMQ_PORT | Der Port, unter dem der RabbitMQ Message Broker erreichbar ist. | int | 64-65535 (default: 5672) |
| RABBITMQ_USER* | Der RabbitMQ-Benutzer, den der correction Service zur Athentifizierung verwendet. | string | |
| RABBITMQ_PASSWORD* | Das Passwort des konfigurierten RabbitMQ-Benutzers. | string | |
| RABBITMQ_VIRTUALHOST* | Der verwendete Virtualhost des RabbitMQ-Servers. | string | |
| RABBITMQ_EXCHANGE_NAME | Der RabbitMQ-Exchange, auf dem die Berechnungsanfragen und -ergebnisse abgelegt werden. | string | default: Measurement.Correction |
| MINIO_HOST* | Name bzw. Adresse des Hosts, unter dem der MinIO-Server erreichbar ist. | string | |
| MINIO_PORT* | TCP-Port, unter dem der MinIO-Server erreichbar ist. | int | 64-65535 |
| MINIO_BUCKET* | Name des MinIO-Buckets, der zum Laden der Messdaten verwendet werden soll. | string | |
| MINIO_USER* | Nutzername, den der Service zur Authentifizierung mit MinIO verwenden soll. | string | mind. 8 Zeichen |
| MINIO_PASSWORD* | Passwort des konfigurierten MinIO-Nutzers. | string | mind. 8 Zeichen |
| MINIO_TLS* | Gibt an, ob TLS bzw. HTTPS für eine verschlüsselte Kommunikation verwendet werden soll. | boolean | |
| MINIO_SSL_CERT_FILE | Pfad zu einer Datei, die die verwendete Kette an SSL-Zertifikaten enthält (mit der u.a. das Server-Zertifikat signiert wurde). Ist keine solche Datei angegeben, wird das Client-Zertifikat bei Anfragen nicht überprüft. | string | |
| RABBITMQ_DEAD_LETTER_EXCHANGE | Der RabbitMQ-Exchange, an den durch einen Timeout oder sonstige Fehler nicht bearbeitete Nachrichten weitergeleitet werden. | string | default: Measurement.Correction.DeadLetter |
API
Allgemeines Anfrage- und Antwortformat
Anfragen an den correction Service enthalten die folgenden Felder:
request_minio_bucket: Optionale Angabe des MinIO-Buckets, aus dem die Messdaten geladen werden sollen (muss nur angegeben werden, falls der Messdaten-Bucket nicht der konfigurierte ist).result_data_provider_type:minio, falls die Berechnungsergebnisse in MinIO gespeichert werden sollen, sonstexplicitoder den Parameter weglassen.result_minio_bucket: Der MinIO-Bucket, in dem Berechnungsergebnisse gespeichert werden sollen.Guid: Eine optionale GUID, die von der Anfrage in die Antwort übernommen wird.
Die einzelnen Endpunkte benötigen weitere korrekturspezifische Konfigurationsparameter.
Die Antwort des correction Service ist wie folgt aufgebaut:
channel_name: Name des korrigierten Kanalsdata_provider: Die korrigierten bzw. konkatenierten Messdaten als Data Provider mit einem zusätzlichenhistory-Eintrag für die durchgeführte Korrektur.service_version: Version des correction Containers, der die Anfrage bearbeitet hat.Guid: Optionale aus der Anfrage übernommene GUID.
{
"channel_name": "test_channel",
"data_provider": { ... },
"service_version": "1.2.3",
"Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
Resampling
- Routing Key:
Resampling - history-Typ:
resampling - Parameter:
channel_name*: Name des zu resampelnden Kanalsdata_provider*: Data Provider, der den zu resampelnden Messkanal bereitstellttarget_sample_rate*: Sample Rate, in die der Kanal transformiert werden sollmethod: Zu verwendende Resampling-Methode (Default=fourier)fourier: Überführt das Signal durch FFT und IFFT in die angegebene Sample Rate. Die FFT erhält so weit wie möglich den Frequenzgehalt des Signals, kann jedoch zu geringfügigen Phasenverschiebungen und Ringing-Effekten (insb. bei abrupten Peaks) führen.nearest_neighbour: Wählt als Wert im neuen Signal den zeitlich nächsten Wert im alten Signal aus. Einfaches und schnelles Vorgehen, dafür ungenau und produziert beim Upsampling ein stufenförmiges Signal.monalysis: Erzeugt einen Stützkanal in der Ziel-Abtastrate. Erhält beim Downsampling die Peaks des Originalsignals. Glättet beim Upsampling das Signal.
{
"channel_name": "test_channel",
"data_provider": { ... },
"request_minio_bucket": "request_bucket" | null,
"target_sample_rate": 1000,
"method": "fourier" | "monalysis" | "nearest_neighbour" | null
"result_data_provider_type": "explicit" | "minio" | null,
"result_minio_bucket": "result_bucket" | null,
"Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null,
}
{
"type": "resampling",
"old_sample_rate": 500,
"new_sample_rate": 1000,
"method": "monalysis"
}






Interpolation
- Routing Key:
Interpolation - history-Typ:
interpolation - Interpoliert festgelegte Bereiche eines Messsignals nach der ausgewählten Methode, z.B. zur Entfernung von zuvor detektierten Peaks, Endanschlägen oder Messfehlern aus dem Signal
- Parameter:
channel_name*: Name des zu interpolierenden Kanalsdata_provider*: Data Provider, der den zu interpolierenden Messkanal bereitstelltinterpolation_ranges*: Array der zu interpolierenden Bereichemethod*: Interpolationsmethode (eine ausconstant,cubic,linear,mean,tanh,quadratic)value: konstanter Interpolationswert, nur notwendig bei Interpolationsmethodeconstant
{
"channel_name": "test_channel",
"data_provider": { ... },
"interpolation_ranges": [
{
"start": 523,
"end": 578
},
...
],
"method": "constant" | "cubic" | "linear" | "mean" | "tanh" | "quadratic",
"value": 5 | null,
"request_minio_bucket": "request_bucket" | null,
"result_data_provider_type": "explicit" | "minio" | null,
"result_minio_bucket": "result_bucket" | null,
"Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
{
"type": "interpolation",
"method": "quadratic",
"start": 500,
"end": 520,
"value": null
}






Konkatenation
- Routing Key:
Concatenation - history-Typ:
concatenation - Konkateniert mehrere Messkanäle und interpoliert die Lücken zwischen den Signalen nach der ausgewählten Methode
- Parameter:
channel_name*: Name des zu konkatenierenden Kanalschannels*: Array von Data Providern, die die zu konkatenierenden Messkanäle bereitstellengap_size*: Größe der zu interpolierenden Lücke zwischen den einzelnen Messkanälen (in Datenpunkten)method*: Interpolationsmethode (eine ausconstant,cubic,linear,mean,tanh,quadratic)value: konstanter Interpolationswert, nur notwendig bei Interpolationsmethodeconstant
{
"channel_name": "test_channel",
"channels": [ { ... }, ... ],
"gap_size": 10,
"method": "constant" | "cubic" | "linear" | "mean" | "tanh" | "quadratic",
"value": 5 | null,
"request_minio_bucket": "request_bucket" | null,
"result_data_provider_type": "explicit" | "minio" | null,
"result_minio_bucket": "result_bucket" | null,
"Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
{
"type": "concatenation",
"method": "quadratic",
"joins": [
{
"start": 10,
"end": 15
},
{
"start": 100,
"end": 140
}
],
"value": null
}





Entfernen von NoValues
- Routing Key:
NoValueRemoval - history-Typ:
interpolation - Interpoliert alle Novalues eines Messsignals nach der ausgewählten Methode
- Parameter:
channel_name*: Name des zu korrigierenden Kanalsdata_provider*: Data Provider, der den zu interpolierenden Messkanal bereitstelltmethod*: Interpolationsmethode (eine ausconstant,cubic,linear,mean,tanh,quadratic)value: konstanter Interpolationswert, nur notwendig bei Interpolationsmethodeconstant
{
"channel_name": "test_channel",
"data_provider": { ... },
"method": "constant" | "cubic" | "linear" | "mean" | "tanh" | "quadratic",
"value": 5 | null,
"request_minio_bucket": "request_bucket" | null,
"result_data_provider_type": "explicit" | "minio" | null,
"result_minio_bucket": "result_bucket" | null,
"Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
{
"type": "interpolation",
"method": "quadratic",
"start": 500,
"end": 520,
"value": null
}
Mittelwert-Offsetkorrektur
- Routing Key:
OffsetCorrection.TargetMean - history-Typ:
offset_correction - Korrigiert den Offset eines Messsignals so, dass der Mittelwert des Signals einem Zielwert entspricht.
- Parameter:
channel_name*: Name des zu korrigierenden Kanalsdata_provider*: Data Provider, der den zu korrigierenden Messkanal bereitstellttarget_mean*: Ziel-Mittelwert des Kanalsthreshold: Grenzwert, den der Unterschied zwischen tatsächlichem Mittelwert und Zielmittelwert überschreiten muss, um die Korrektur durchzuführen (verhindert minimale Änderungen, Default: 0)
{
"channel_name": "test_channel",
"data_provider": { ... },
"target_mean": 0,
"threshold": 0.1 | null,
"request_minio_bucket": "request_bucket" | null,
"result_data_provider_type": "explicit" | "minio" | null,
"result_minio_bucket": "result_bucket" | null,
"Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
{
"type": "offset_correction",
"correction_value": 12
}

Median-Offsetkorrektur
- Routing Key:
OffsetCorrection.TargetMedian - history-Typ:
offset_correction - Korrigiert den Offset eines Messsignals so, dass der Median des Signals einem Zielwert entspricht.
- Parameter:
channel_name*: Name des zu korrigierenden Kanalsdata_provider*: Data Provider, der den zu korrigierenden Messkanal bereitstellttarget_median*: Ziel-Median des Kanalsthreshold: Grenzwert, den der Unterschied zwischen tatsächlichem Median und Zielmedian überschreiten muss, um die Korrektur durchzuführen (verhindert minimale Änderungen, Default: 0)
{
"channel_name": "test_channel",
"data_provider": { ... },
"target_median": 0,
"threshold": 0.1 | null,
"request_minio_bucket": "request_bucket" | null,
"result_data_provider_type": "explicit" | "minio" | null,
"result_minio_bucket": "result_bucket" | null,
"Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
{
"type": "offset_correction",
"correction_value": 12
}

Offsetkorrektur um einen festen Wert
- Routing Key:
OffsetCorrection.CorrectionValue - history-Typ:
offset_correction - Korrigiert den Offset eines Messsignals um einen festen Wert.
- Parameter:
channel_name*: Name des zu korrigierenden Kanalsdata_provider*: Data Provider, der den zu korrigierenden Messkanal bereitstelltcorrection_value*: Wert, um den der Kanal offsetkorrigiert werden soll.
{
"channel_name": "test_channel",
"data_provider": { ... },
"correction_value": -2.3,
"request_minio_bucket": "request_bucket" | null,
"result_data_provider_type": "explicit" | "minio" | null,
"result_minio_bucket": "result_bucket" | null,
"Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
{
"type": "offset_correction",
"correction_value": 12
}

Offsetkorrektur mit dem ersten Wert
- Routing Key:
OffsetCorrection.FirstValue - history-Typ:
offset_correction - Korrigiert den Offset eines Messsignals so, dass der erste Wert des korrigierten Kanals 0 ist.
- Parameter:
channel_name*: Name des zu korrigierenden Kanalsdata_provider*: Data Provider, der den zu korrigierenden Messkanal bereitstellt
{
"channel_name": "test_channel",
"data_provider": { ... },
"request_minio_bucket": "request_bucket" | null,
"result_data_provider_type": "explicit" | "minio" | null,
"result_minio_bucket": "result_bucket" | null,
"Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
{
"type": "offset_correction",
"correction_value": 12
}