# Kural ifadeleri

> Kural koşulunda her olay türü için kullanılabilen alanlar, işleçler ve fonksiyonlar. Örneklerin tamamı kural motorunda test edilmiştir.

Kaynak: https://proxus.io/tr/docs/automate/rule-expressions

Alarm kuralının koşulu tek bir ifadeden oluşur. Edge Gateway bu ifadeyi, kuralın izlediği türdeki her olayda
(kuraldaki **Olay** alanı) kontrol eder ve ifade doğru olduğunda kural tetiklenir. İfadeyi kuralın koşul
düzenleyicisinde bir cümle gibi kurabilir ya da **İfade** altında metin olarak yazabilirsiniz. İki yol da aynı ifadeyi
üretir; cümlenin söyleyebildiği bir ifade yazdığınızda düzenleyici cümleye geri dönebilir.
Bkz. [Alarm kuralı oluşturun](https://proxus.io/tr/docs/automate/rules).

Aşağıdaki tablolarda, Edge Gateway'in her olayda kurala aktardığı alanlar yer alır. Alan adlarında büyük ve küçük harf
ayrımı vardır. Metin değerleri tek tırnak içinde yazılır.

## İşleçler ve fonksiyonlar

- Karşılaştırma: `=`, `==`, `<>`, `!=`, `<`, `<=`, `>`, `>=`.
- Birleştirme: `AND` (ya da `&&`), `OR` (ya da `||`), `NOT` ve parantez `( )`.
- Aritmetik: `+`, `-`, `*`, `/`.
- Aşağıdaki örneklerde geçen fonksiyonlar: `Contains(Field, 'text')`, `Abs(x)`, `ToDouble(text)`.
- Liste içinde arama: `[List][condition]` ifadesi, listedeki öğelerden en az biri koşulu sağladığında doğru olur.

## Veri alındığında

Her mesaj, bir cihazın belirli bir anda gönderdiği değerleri içerir.

| Alan | Açıklama |
| --- | --- |
| `Topic` | Cihaz kimliği (ID). |
| `[Payload]` | Mesajdaki veri noktası değerlerinin listesi. Her öğede şu alanlar bulunur: `Key` (veri noktası adı), `NumericValue` (sayı olarak değer), `Value` (metin olarak değer), `PreviousValue` (metin olarak önceki değer), `Unit`, `Type`, `Quality` (`Good`, `Bad`, `Uncertain`), `Time` ve `PreviousValueTime`. |
| `[MetaData]` | Cihazın konumu. Öğelerde `Key` ve `Value` alanları bulunur. Anahtarlar şunlardır: `DeviceId`, `DeviceName`, `Enterprise`, `Site`, `Area`, `ProcessCell`, `EquipmentModule`. |
| `[Attributes]` | Cihaza tanımlı öznitelikler. Öğelerde `Key` ve `Value` alanları bulunur. |

Veri noktası her zaman `[Payload][...]` içinde kontrol edilir. Veri noktasının adı ve koşulu aynı köşeli parantezin
içine yazılır. Sayıları `Value` ile değil, `NumericValue` ile karşılaştırın, çünkü `Value` metindir. Mesajda yalnızca
cihazın o anda okuduğu veri noktaları bulunur. Bu yüzden iki veri noktasına bakan bir koşul, ancak ikisi de aynı
mesajdaysa sağlanabilir.

```text
[Payload][Key = 'Temperature' AND NumericValue > 28]
```

Belirli bir aralığın dışına çıkan veri noktası:

```text
[Payload][Key = 'Voltage' AND (NumericValue < 215 OR NumericValue > 245)]
```

Adıyla seçilen tek bir cihaz:

```text
[MetaData][Key = 'DeviceName' AND Value = 'MFB_LYS_TUNNEL_OVEN'] AND [Payload][Key = 'Zone1Temp' AND NumericValue > 200]
```

Adında belirli bir sözcük geçen tüm cihazlar:

```text
[MetaData][Key = 'DeviceName' AND Contains(Value, 'PowerGenerator')] AND [Payload][Key = 'Temperature' AND NumericValue > 85]
```

Önceki okumaya göre 5'ten fazla sıçrama:

```text
[Payload][Key = 'Pressure' AND Abs(NumericValue - ToDouble(PreviousValue)) > 5]
```

Önceki okumaya göre %10'dan fazla artış:

```text
[Payload][Key = 'FillRate' AND ToDouble(PreviousValue) <> 0 AND (NumericValue - ToDouble(PreviousValue)) / ToDouble(PreviousValue) > 0.10]
```

Biri `NOT` ile tersine çevrilmiş birden çok koşul:

```text
[Topic] = 'Device123' AND [Payload][Key = 'Pressure' AND NumericValue > 100] AND NOT [Payload][Key = 'Temperature' AND NumericValue < 25]
```

İki cihaz özniteliği:

```text
[Attributes][Key = 'Location' AND Value = 'FactoryA'] AND [Attributes][Key = 'Priority' AND Value = 'High']
```

## Durum değiştiğinde

| Alan | Açıklama |
| --- | --- |
| `DeviceId`, `DeviceName` | Cihaz. |
| `CurrentConnectionStatus` | `Unknown`, `Connected` ya da `Disconnected` (veya `0`, `1`, `2`). |
| `PreviousConnectionStatus` | Değişiklikten önceki durum. |
| `ConnectionDuration` | Önceki durumun saniye cinsinden süresi. |

```text
CurrentConnectionStatus = 'Disconnected'
```

Bağlantısı bir dakikadan kısa süre kopup geri gelen cihaz:

```text
CurrentConnectionStatus = 'Connected' AND PreviousConnectionStatus = 'Disconnected' AND ConnectionDuration < 60
```

## Günlük alındığında

| Alan | Açıklama |
| --- | --- |
| `Time`, `Level`, `Source`, `Category`, `Message` | Kaydın zamanı, önem düzeyi (örneğin `Warning`, `Error`, `Critical`), kaydı yazan Edge Gateway, Edge Gateway'in ilgili bölümü ve kayıt metni. |
| `ReasonCode` | Olay türünü belirten sabit kod. Yalnızca ürünün kod atadığı olaylarda bulunur. `Message` metniyle eşleştirmek yerine bu alanı kullanın. |
| `EventId`, `CorrelationId`, `Operation`, `EntityType`, `EntityId`, `Fingerprint`, `OccurrenceCount`, `Diagnostic` | Varsa ek ayrıntılar. |

```text
Level = 'Critical' OR Level = 'Error'
```

```text
Level == 'Error' && Contains(Category, 'FieldbusActor')
```

Kural motorunun ve bildirim hizmetinin kendi yazdığı günlük kayıtları alarm kurallarına aktarılmaz.

## Metrikler alındığında

Bu olay bir cihazın okuma istatistiklerini taşır ve her okuma döngüsünden sonra gönderilir.

| Alan | Açıklama |
| --- | --- |
| `Device` | Cihaz. |
| `TotalRequests`, `SuccessfulRequests`, `FailedRequests`, `ResponseCount` | O ana kadar yapılan okuma istekleri. |
| `ReadErrorCount`, `ConnectionErrorCount`, `ReadErrorPercentage` | O ana kadarki hatalar ve başarısız okumaların yüzdesi. |
| `AverageResponseTime` | Cihazın ortalama yanıt süresi. |
| `LastCommunicationTime`, `LastDataReceivedTime` | Cihazın en son yanıt verdiği ve en son veri gönderdiği zaman. |
| `TotalDataReceived`, `ProcessedDataCount`, `SleepModeTransitionCount` | Sayaçlar. |
| `DataAccuracy`, `DataCompleteness`, `DataFreshness`, `DataIntegrity`, `DataConsistency` | Veri kalitesi puanları. |

```text
ReadErrorPercentage > 10
```

```text
FailedRequests > 100 && ReadErrorPercentage > 20
```

```text
DataAccuracy < 80
```

## Sık yapılan hatalar

| Yazılan | Sorun | Doğrusu |
| --- | --- | --- |
| `[Temperature] > 80` | Veri noktaları mesajın alanları değildir. | `[Payload][Key = 'Temperature' AND NumericValue > 80]` |
| `[Payload][Key = 'Temperature' AND Value > 80]` | `Value` metindir. | `NumericValue > 80` |
| `[Payload][Key = 'A'] AND [Payload][NumericValue > 5]` | İki parça, iki farklı veri noktasıyla eşleşebilir. | Adı ve koşulu aynı köşeli paranteze yazın: `[Payload][Key = 'A' AND NumericValue > 5]` |

Edge Gateway'in çözümleyemediği bir ifade hiçbir zaman eşleşmez. Bu durumda kuralın **Günlükler** kayıtlarında
ölçütlerin derlenemediğini bildiren bir kayıt görünür.

## Sonraki adımlar

- [Alarm kuralı oluşturun](https://proxus.io/tr/docs/automate/rules): ifadeyi bir alarm kuralında kullanın.
- [Kural eylemi ekleyin](https://proxus.io/tr/docs/automate/rule-actions): kural tetiklendiğinde bildirim gönderin ya da veriyi iletin.
- [Otomasyon sorunlarını giderme](https://proxus.io/tr/docs/troubleshoot/automation): eşleşmeyen ya da tetiklenmeyen kurallar için çözümler.
