# Asset-Filter

### Übersicht

Für Eliona-Apps mit Continuous Asset Creation (CAC) ist es nützlich, die Möglichkeit zu haben, auszuwählen, welche Assets in Eliona erstellt werden. So kann verhindert werden, dass das Infravolt-Budget überschritten wird.

Die meisten Apps mit CAC bieten daher einen Asset-Filter als Konfigurationsoption an. Falls die App diese Option unterstützt, befolgen Sie dieses Dokument zur Konfiguration.

Beachten Sie, dass der Asset-Filter standardmäßig leer ist und alle verfügbaren Assets importiert. Die Definition eines Asset-Filters ist daher vollständig optional.

### Struktur

Der `assetFilter` ist ein zweidimensionales Array, wobei:

* Das **äußere Array** Regeln kombiniert durch logisches **ODER** (Disjunktion).
* Jedes **innere Array** Regeln kombiniert durch logisches **UND** (Konjunktion).
* Jede Regel ein Objekt mit den folgenden Eigenschaften ist:
  * `parameter`: Das zu überprüfende Asset-Attribut.
  * `regex`: Ein regulärer Ausdruck zur Übereinstimmungsprüfung des Attributs.

### Logische Auswertung

Die Filterlogik folgt diesen Regeln:

* Ein Asset **passt**, wenn mindestens ein inneres Array (AND-Regelgruppe) als `true` ausgewertet wird.
* Ein inneres Array wird als **`true`** ausgewertet, wenn alle seine Regeln übereinstimmen.
* Eine Regel **passt**, wenn das Attribut des Assets, das in `parameter` definiert ist, mit dem regulären Ausdruck in `regex` übereinstimmt.
* Wenn `assetFilter` leer oder `null` ist, bestehen alle Assets den Filter.

### Verfügbare Parameter

Während es allgemeine Parameter wie "name" gibt, verfügt jede App über eine eigene Menge an Parametern. Weitere Informationen zu den möglichen Filterparametern finden Sie in der Dokumentation der jeweiligen App.

### Reguläre Ausdrücke

Das `regex`-Feld ermöglicht eine erweiterte Filterung mit regulären Ausdrücken. Hier sind einige häufig verwendete Muster:

* `.*` – Passt auf alles
* `^Main.*` – Passt auf Zeichenfolgen, die mit "Main" beginnen
* `192\\.168\\..*` – Passt auf IP-Adressen im Bereich 192.168.*.*
* `(A|B|C)` – Passt auf „A“, „B“ oder „C“

### Beispiel-Szenarien

#### 0. Alles importieren

```json
[]
```

#### 1. Geräte mit Namen "Main" und Typ "Router" filtern

```json
[
  [{ "parameter": "deviceName", "regex": "Main.*" },
   { "parameter": "deviceType", "regex": "Router" }]
]
```

#### 2. Geräte mit bestimmten MAC-Adressen filtern

```json
[
  [{ "parameter": "macAddress", "regex": "(70:82:0e:12:28:cc|70:56:06:12:.*)" }]
]
```

#### 3. Jedes Asset mit einer IP-Adresse im Bereich 192.168.x.x filtern

```json
[
  [{ "parameter": "ipAddress", "regex": "192\\.168\\..*" }]
]
```

#### 4. Komplexe Filterung mit mehreren Bedingungen

```json
[
  [
    { "parameter": "deviceName", "regex": "Main.*" },
    { "parameter": "deviceType", "regex": "Router" }
  ],
  [
    { "parameter": "macAddress", "regex": "(70:82:0e:12:28:cc|70:56:06:12:.*)" }
  ],
  [
    { "parameter": "ipAddress", "regex": "192\\.168\\..*" }
  ]
]
```

**Funktionsweise:**

* Wenn ein Asset **mindestens eine der drei Gruppen erfüllt**, besteht es den Filter.
* Die erste Gruppe erfordert, dass **beide Bedingungen** (`deviceName` und `deviceType`) erfüllt sind.
* Die zweite und dritte Gruppe enthalten **jeweils nur eine Bedingung**, sodass ein Asset den Filter besteht, wenn es eine übereinstimmende `macAddress` oder `ipAddress` hat.

**Beispielhafte Asset-Auswertung:**

| deviceName | deviceType | macAddress        | ipAddress    | Passt?                    |
| ---------- | ---------- | ----------------- | ------------ | ------------------------- |
| MainRouter | Router     | 00:11:22:33:44:55 | 10.0.0.1     | ✅ (Erste Gruppe)          |
| Printer    | Printer    | 70:82:0e:12:28:cc | 10.0.0.1     | ✅ (Zweite Gruppe)         |
| Server     | Server     | 00:11:22:33:44:55 | 192.168.5.10 | ✅ (Dritte Gruppe)         |
| MainSwitch | Switch     | 00:11:22:33:44:55 | 10.0.0.1     | ❌ (Keine Übereinstimmung) |

### Fehlerbehandlung

Falls ein regulärer Ausdruck ungültig ist, wird ein Fehler zurückgegeben, der das Problem beschreibt. Stellen Sie sicher, dass:

* Der reguläre Ausdruck einer korrekten Syntax folgt.
* Escape-Sequenzen (z. B. `\.` für einen Punkt) richtig verwendet werden.

### Fazit

Der `assetFilter` ermöglicht eine flexible Filterung von Assets mit logischen Bedingungen und regulären Ausdrücken. Durch die Kombination mehrerer Bedingungen mit UND- und ODER-Regeln können Benutzer eine leistungsstarke Filterlogik erstellen, die genau auf ihre Bedürfnisse zugeschnitten ist.
