filter-service
Der filter-service wendet Butterworth- und FIR (Finite Impulse Response) Filter auf Messkanäle an. Die angewendeten Filter werden im history-Attribut des zurückgegebenen Messkanals dokumentiert.
Laufzeitumgebung
Der filter-service muss Zugriff auf zwei Komponenten haben:
- RabbitMQ Message Broker zum Empfangen der Filteranfragen und Ablegen der Berechnungsergebnisse und Logs.
- MinIO Object Storage, der Messdaten zur Verfügung stellt, falls diese zu groß sind, um sie direkt in der Filteranfrage zu senden.
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class Client
class RabbitMQ {
<<Message Broker>>
}
class filter-service {
<<Service>>
}
class MinIO {
<<Cloud Storage>>
}
Client --> RabbitMQ : publish requests
filter-service --> RabbitMQ : subscribe requests
filter-service ..> RabbitMQ : publish results
filter-service ..> MinIO : fetch data
filter-service --> MinIO : store filtered data
Der filter-service verwendet die folgenden RabbitMQ-Exchanges:
Measurement.Filterfür Berechnungsanfragen und Antworten- Anfragen werden über den entsprechenden Routing Key empfangen und in der Queue
Measurement.Filter.RequestQueuegehalten - Antworten auf die Berechnungsanfragen werden in der Queue
Measurement.Filter.ResponseQueuegehalten
- Anfragen werden über den entsprechenden Routing Key empfangen und in der Queue
Measurement.Filter.Logszur Speicherung von Logs in der QueueMeasurement.Filter.Logs.QueueMeasurement.Filter.DeadLetterzur Speicherung von Nachrichten, die nicht verarbeitet werden können, in der QueueMeasurement.Filter.DeadLetter.QueueMeasurement.Filter.Canceledzur Speicherung von fehlerhaften Berechnungsanfragen in der QueueMeasurement.Filter.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 filter-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.Filter |
| 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.Filter.DeadLetter |
API
Allgemeines Anfrage- und Antwortformat
Alle Anfragen an den filter-service enthalten die folgenden Felder:
filter_configJe nach Filterart unterschiedliche Parameter für den anzuwendenden Filter. Welche Filterart verwendet wird, entscheidet der Routing Key, an den die Anfrage gesendet wird. Alle Filter können als Nullphasenfilter und Filter mit Offsetkorrektur konfiguriert werden:zero_phase: Optionale Ausführung als Nullphasen-Filter zur Eliminierung von Phasenverschiebungen (default:false).offset_correction: Optionale Ausführung einer Offsetkorrektur (mögliche Werte:median,mean,first_value, default: keine Offsetkorrektur)
data_providerStellt den zu filternden Messkanal zur Verfügung (siehe \ref{Data Provider}).channel_nameName des zu filternden Kanals.request_minio_bucketOptionale Angabe des MinIO-Buckets, aus dem die Messdaten geladen werden sollen (Default: UmgebungsvariableMINIO_BUCKET).GuidEine optionale GUID, die von der Anfrage in die Antwort übernommen wird.result_data_provider_typeOptionale Angabe, ob das Filterergebnis direkt zurückgegeben oder in MinIO gespeichert werden soll:explicitoderminio(Default:explicit)result_minio_bucketOptionale Angabe des MinIO-Buckets, in dem Filterergebnisse mitresult_data_provider_type=miniogespeichert werden sollen (Default: UmgebungsvariableMINIO_BUCKET).
Anfrageformat
{
"data_provider": {...},
"channel_name": "TestChannel",
"filter_config": {...},
"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
}
Die Antwort des filter-service ist wie folgt aufgebaut:
data_providerStellt den zu gefilterten Messkanal zur Verfügung. Imhistory-Attribut ist der angewendete Filter dokumentiert.channel_nameName des gefilterten Kanals.service_versionVersion des filter-service Containers, der die Anfrage bearbeitet hat.GuidOptionale aus der Anfrage übernommene GUID.
Antwortformat
{
"data_provider": {...},
"channel_name": "TestChannel",
"service_version": "1.2.3",
"Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e"
}
Butterworth Tiefpassfilter
- Routing Key:
Butterworth.Lowpass - Parameter der Filterkonfiguration:
cutoff_frequency*: Frequenz zwischen 0 und halber Sample Rate des Messkanals, oberhalb derer das Signal gedämpft wird.order*: Ordnung des Filters größer 0.
{
"data_provider": {...},
"channel_name": "TestChannel",
"filter_config": {
"cutoff_frequency": 16,
"order": 5,
"zero_phase": true | false | null,
"offset_correction": "median" | "mean" | "first_value" | 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": "filter",
"filter_type": "butterworth",
"pass_type": "lowpass",
"cutoff_frequency": 16,
"order": 5,
"zero_phase": true | false,
"offset_correction": "median" | "mean" | "first_value" | null
}


Butterworth Bandpassfilter
- Routing Key:
Butterworth.Bandpass - Aufbau der Filterkonfiguration:
frequency_band*: Frequenzpaar zwischen 0 und halber Sample Rate des Messkanals, außerhalb derer das Signal gedämpft wird.order*: Ordnung des Filters größer 0.
{
"data_provider": {...},
"channel_name": "TestChannel",
"filter_config": {
"frequency_band": [20, 40],
"order": 4,
"zero_phase": true | false | null,
"offset_correction": "median" | "mean" | "first_value" | 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": "filter",
"filter_type": "butterworth",
"pass_type": "bandpass",
"frequency_band": [20, 40],
"order": 4,
"zero_phase": true | false,
"offset_correction": "median" | "mean" | "first_value" | null
}


Butterworth Hochpassfilter
- Routing Key:
Butterworth.Highpass - Aufbau der Filterkonfiguration:
cutoff_frequency*: Frequenz zwischen 0 und halber Sample Rate des Messkanals, unterhalb derer das Signal gedämpft wird.order*: Ordnung des Filters zwischen größer 0.
{
"data_provider": {...},
"channel_name": "TestChannel",
"filter_config": {
"cutoff_frequency": 16,
"order": 5,
"zero_phase": true | false | null,
"offset_correction": "median" | "mean" | "first_value" | 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": "filter",
"filter_type": "butterworth",
"pass_type": "highpass",
"cutoff_frequency": 16,
"order": 5,
"zero_phase": true | false,
"offset_correction": "median" | "mean" | "first_value" | null
}
FIR Tiefpassfilter
- Routing Key:
FIR.Lowpass - Aufbau der Filterkonfiguration:
cutoff_frequency*: Frequenz zwischen 0 und halber Sample Rate des Messkanals, oberhalb derer das Signal gedämpft wird.order*: Ordnung des Filters größer 0.window_type*: Zu verwendende Fensterform (rectangular,triangular,hamming,hanningoderblackman).
{
"data_provider": {...},
"channel_name": "TestChannel",
"filter_config": {
"cutoff_frequency": 16,
"order": 1000,
"window_type": "rectangular" | "triangular" | "blackman" | "hamming" | "hanning",
"zero_phase": true | false | null,
"offset_correction": "median" | "mean" | "first_value" | 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": "filter",
"filter_type": "fir",
"pass_type": "lowpass",
"cutoff_frequency": 16,
"order": 1000,
"window_type": "rectangular" | "triangular" | "blackman" | "hamming" | "hanning",
"zero_phase": true | false,
"offset_correction": "median" | "mean" | "first_value" | null
}

FIR Bandpassfilter
- Routing Key:
FIR.Bandpass - Aufbau der Filterkonfiguration:
frequency_band*: Frequenzpaar zwischen 0 und halber Sample Rate des Messkanals, außerhalb derer das Signal gedämpft wird.order*: Ordnung des Filters größer 0.window_type*: Zu verwendende Fensterform (rectangular,triangular,hamming,hanningoderblackman).
{
"data_provider": {...},
"channel_name": "TestChannel",
"filter_config": {
"frequency_band": [20, 40],
"order": 1000,
"window_type": "rectangular" | "triangular" | "blackman" | "hamming" | "hanning",
"zero_phase": true | false | null,
"offset_correction": "median" | "mean" | "first_value" | 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": "filter",
"filter_type": "fir",
"pass_type": "bandpass",
"frequency_band": [20, 40],
"order": 1000,
"window_type": "rectangular" | "triangular" | "blackman" | "hamming" | "hanning",
"zero_phase": true | false,
"offset_correction": "median" | "mean" | "first_value" | null
}

FIR Hochpassfilter
- Routing Key:
FIR.Highpass - Aufbau der Filterkonfiguration:
cutoff_frequency*: Frequenz zwischen 0 und halber Sample Rate des Messkanals, unterhalb derer das Signal gedämpft wird.order*: Ordnung des Filters größer 0. Die Ordnung muss für FIR-Hochpassfilter gerade sein.window_type*: Zu verwendende Fensterform (rectangular,triangular,hamming,hanningoderblackman).
{
"data_provider": {...},
"channel_name": "TestChannel",
"filter_config": {
"cutoff_frequency": 16,
"order": 1000,
"window_type": "rectangular" | "triangular" | "blackman" | "hamming" | "hanning",
"zero_phase": true | false | null,
"offset_correction": "median" | "mean" | "first_value" | 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": "filter",
"filter_type": "fir",
"pass_type": "highpass",
"cutoff_frequency": 16,
"order": 1000,
"window_type": "rectangular" | "triangular" | "blackman" | "hamming" | "hanning",
"zero_phase": true | false,
"offset_correction": "median" | "mean" | "first_value" | null
}
