Skip to main content

Rules & Alerts

Bu sayfa, Cınga backend içinde kural motoru, alarm üretimi, durum takibi ve reaksiyon aksiyonları için kullanılan veri modelini detaylı biçimde açıklar.

Amaç, alarm davranışını uygulama kodu içinde dağınık if-else bloklarından çıkarıp veri modeliyle yönetilebilir hale getirmektir.

Bu Katmanın Amacı

Rules & Alerts katmanı şu soruları çözer:

  • Hangi koşullar alarm üretir?
  • Bir alarm tek bir koşula mı bakar, bir grup koşula mı?
  • Süreli alarm nasıl takip edilir?
  • Bir kural hangi cihazda aktif?
  • Alarm tetiklenince ne yapılır?
  • Reset olduğunda ne yapılır?
  • Hangi olay tarihsel olarak kaydedilir?

Genel Kural Akışı

1. rule_groups

rule_groups, bir alarm veya karar senaryosunun üst kapsayıcı tablosudur.

Neden vardır?

Gerçek sahada alarm çoğu zaman tek bir koşul değildir. Birden fazla koşul birlikte değerlendirilir. Bazı senaryolarda tüm kurallar sağlanmalı, bazılarında herhangi biri yeterlidir. Bu nedenle tekil rule tanımından önce bir kapsayıcı grup gerekir.

Kolonlar

KolonTipNullAnlamı
idinthayırKural grubu anahtarı
project_idintevetHangi proje ailesine ait olduğu
namevarchar(100)hayırGrup adı
descriptionvarchar(255)evetAçıklama
match_typeenumhayırall veya any
multi_triggerbooleanhayırAynı alarm tekrar tekrar tetiklenebilir mi
notify_on_resetbooleanhayırReset olduğunda bildirim üretilecek mi
priorityinthayırDeğerlendirme/işleme önceliği
valid_fromtimestampevetGeçerlilik başlangıcı
valid_totimestampevetGeçerlilik bitişi
publish_bitintevetCihaz publish maskesi ile bağ kurulacaksa ilgili bit
is_activebooleanhayırGrup aktif mi
create_timetimestamphayırOluşturma
update_timetimestamphayırGüncelleme

Örnek kayıt

{
"id": 1,
"project_id": 1,
"name": "Yüksek Akım Alarmı",
"description": "Akım belirli eşik üzerine çıktığında alarm üretir",
"match_type": "all",
"multi_trigger": false,
"notify_on_reset": true,
"priority": 1,
"publish_bit": 1,
"is_active": true
}

Tasarım notu

rule_groups, tek tek kural satırlarının toplandığı bir konteyner değil; alarmın iş mantığı sınırıdır. Bildirim, reset davranışı ve öncelik burada yaşar.

2. rules

rules, bir rule group içindeki tekil koşulları tanımlar.

Neden vardır?

Aynı alarm grubu içinde farklı tip kurallar birlikte bulunabilir. Örneğin:

  • 3 faz akımın da eşik üstünde olması
  • belirli bir register bitin aktif olması
  • belirli süredir stream gelmemesi

Bu çeşitlilik tek bir tablo içinde rule_type ile ayrılır.

Kolonlar

KolonTipNullAnlamı
idinthayırRule anahtarı
group_idinthayırBağlı olduğu rule group
rule_typeenumhayırKural tipi
variable_idvarchar(30)evetDeğişken temelli kurallarda hedef değişken
operatorvarchar(10)evet>, <, =, >= vb.
valuedecimal(18,6)evetEşik değeri
duration_secintevetSüreli kurallarda gereken süre
old_register_valuevarchar(32)evetRegister transition için eski değer
new_register_valuevarchar(32)evetRegister transition için yeni değer
register_bitintevetRegister bit kuralı için bit no
create_timetimestamphayırOluşturma
update_timetimestamphayırGüncelleme

Desteklenen rule tipleri

TipKullanım
thresholdTek anlık eşik kontrolü
durationBelirli süre eşik üstünde/altında kalma
register_transitionRegister eski-yeni geçişi
register_bitBelirli register bit kontrolü
stream_gapBelirli süre stream gelmemesi

Örnek kayıtlar

Süreli yüksek akım kuralı:

{
"id": 1,
"group_id": 1,
"rule_type": "duration",
"variable_id": "IFUND_R",
"operator": ">",
"value": 45.0,
"duration_sec": 300
}

Stream gap kuralı:

{
"id": 5,
"group_id": 3,
"rule_type": "stream_gap",
"duration_sec": 7200
}

Tasarım notu

Bu tablo kuralın tanımını taşır; hangi cihazda aktif olduğunu taşımaz. Bu ayrım özellikle aynı kural setinin birçok cihaza bağlanabilmesi için önemlidir.

3. device_rule_assignments

Bu tablo bir rule group’un hangi cihazlarda aktif olduğunu tutar.

Neden vardır?

Aynı rule group farklı cihazlara atanabilir. Rule tanımı ile rule assignment aynı tabloda olursa tekrar ve karmaşa oluşur.

Kolonlar

KolonTipNullAnlamı
idinthayırAtama anahtarı
device_idvarchar(21)hayırKuralın aktif olduğu cihaz
rule_group_idinthayırAtanan rule group
is_activebooleanhayırAtama aktif mi
assigned_byintevetAtamayı yapan kullanıcı
create_timetimestamphayırOluşturma
update_timetimestamphayırGüncelleme

Örnek kayıt

{
"id": 1,
"device_id": "46000000C47CA670",
"rule_group_id": 1,
"is_active": true,
"assigned_by": 1
}

4. device_rule_state

Bu tablo cihaz bazında kuralın o anki state’ini taşır.

Neden vardır?

Rule geçmişini her pakette baştan hesaplamak pahalıdır. Özellikle duration kuralı, reset mantığı ve multi-trigger davranışı için son bilinen state tutulmalıdır.

Neyi taşır?

  • şu an tetikli mi
  • kaç kez tetiklendi
  • son tetik zamanı
  • son reset zamanı
  • son event referansı

Kolonlar

KolonTipNullAnlamı
idinthayırState kaydı
device_idvarchar(21)hayırCihaz
rule_group_idinthayırİlgili rule group
is_triggeredbooleanhayırAlarm şu an aktif mi
trigger_countinthayırKaç kez tetiklendi
last_trigger_timetimestampevetSon tetik zamanı
last_reset_timetimestampevetSon reset zamanı
last_event_idbigintevetSon event referansı
update_timetimestamphayırGüncelleme

Örnek kayıt

{
"id": 1,
"device_id": "46000000C47CA670",
"rule_group_id": 1,
"is_triggered": true,
"trigger_count": 2,
"last_trigger_time": "2026-04-03T10:30:00Z",
"last_reset_time": "2026-04-03T08:15:00Z",
"last_event_id": 1,
"update_time": "2026-04-03T10:30:05Z"
}

Tasarım notu

Bu tablo event geçmişi değildir; yalnız current state’tir. Tarihsel iz için rule_events kullanılır.

5. rule_events

Bu tablo alarm olaylarının tarihsel kaydını tutar.

Neden vardır?

device_rule_state yalnız son durumu gösterir. Ne zaman trigger oldu, ne zaman reset oldu, ne zaman notified oldu gibi zaman çizgisi rule_events içinde yaşar.

Kolonlar

KolonTipNullAnlamı
idbiginthayırEvent anahtarı
device_idvarchar(21)hayırİlgili cihaz
rule_group_idinthayırİlgili kural grubu
event_typeenumhayırtriggered / reset / notified / command_sent
measurement_stream_idintevetOlayı tetikleyen stream
message_idbigintevetÜretilen inbox mesajı varsa
detailsjsonevetAçıklayıcı payload
create_timetimestamphayırOlay zamanı

Örnek kayıt

{
"id": 1,
"device_id": "46000000C47CA670",
"rule_group_id": 1,
"event_type": "triggered",
"measurement_stream_id": 5001,
"message_id": 2002,
"details": {
"reason": "IFUND_R, IFUND_S, IFUND_T 45A üstünde 300 sn kaldı",
"max_current_a": 46.8
},
"create_time": "2026-04-03T10:30:00Z"
}

6. rule_actions

Bu tablo alarm veya reset durumunda yapılacak aksiyonların sözlüğüdür.

Neden vardır?

Kuralın koşulu ile reaksiyonu aynı şey değildir. Aynı alarm farklı projelerde farklı bildirim veya komut davranışı üretebilir.

Kolonlar

KolonTipNullAnlamı
idinthayırAksiyon anahtarı
namevarchar(100)hayırAksiyon adı
descriptionvarchar(255)evetAçıklama
send_inbox_messagebooleanhayırInbox mesajı üretilecek mi
push_template_idbigintevetPush şablonu
notify_ownerbooleanhayırOwner’a bildir
notify_subusersbooleanhayırAlt kullanıcılara bildir
notify_technicianbooleanhayırTeknik ekibe bildir
notify_adminbooleanhayırAdmin’e bildir
device_command_idintevetCihaza komut tetiklenecekse
create_timetimestamphayırOluşturma
update_timetimestamphayırGüncelleme

Örnek kayıt

{
"id": 1,
"name": "Yüksek Akım Bildirimi",
"description": "Yüksek akım durumunda inbox ve push bildirimi oluşturur",
"send_inbox_message": true,
"push_template_id": 2,
"notify_owner": true,
"notify_subusers": true,
"notify_technician": true,
"notify_admin": false,
"device_command_id": null
}

7. rule_group_actions

Bu tablo bir rule group’u trigger ve reset aksiyonlarına bağlar.

Neden vardır?

Aynı kural için tetikleme ile reset davranışları farklı olabilir. Bu ikisini tek satırda ama ayrı kolonlarla tutmak group düzeyinde net bir bağ kurar.

Kolonlar

KolonTipNullAnlamı
idinthayırKayıt anahtarı
rule_group_idinthayırRule group
trigger_action_idintevetAlarm tetiklenince çalışacak aksiyon
reset_action_idintevetAlarm reset olunca çalışacak aksiyon
create_timetimestamphayırOluşturma
update_timetimestamphayırGüncelleme

Rule Engine’in Veri Kaynağı

Bu modelde kural motoru accepted stream sonrası measurement verilerinden beslenir. Ancak her kural değerlendirmesi için doğrudan veritabanına yük bindirmek yerine cache-first yaklaşım tercih edilir.

DB’nin rolü:

  • kalıcı accepted veri
  • kural tanımı
  • event geçmişi
  • son durumun kalıcı temsili

Redis/cache’in rolü:

  • sıcak evaluation context
  • duration takibi
  • sayaçlar ve kısa süreli rule çalışma durumu

Sonuç

Rules & Alerts veri modeli, alarm davranışını şu parçalara ayırır:

  • tanımrule_groups, rules
  • atamadevice_rule_assignments
  • current statedevice_rule_state
  • historyrule_events
  • reactionrule_actions, rule_group_actions

Bu ayrım sayesinde sistem hem esnek alarm tanımlayabilir hem de neyin ne zaman tetiklendiğini tarihsel olarak izleyebilir.