Ana içeriğe geç

Olay (Event) Nodları — Genel Bakış

Paket, trexMes panellerinden gelen olayları yakalamak için 8 ayrı event node tipi sağlar. Hepsi event-subscribers.js dosyasında tanımlanmış olup aynı altyapıyı paylaşır; yalnızca kategori amacıyla ayrılmıştır.

Olay Node Listesi

Node Tipik Kullanım
Business Events İş akışı olayları (plan yükleme, üretim tamamlanma, vardiya değişimi…)
System Events Sistem seviyesi olaylar (panel açılışı, kapanışı, periyodik timer)
Communication Events Barkod, IO kart, OPC, seri port, sinyal değişimleri
Display Events Arayüz bileşeni yapılandırma ve görünüm olayları
Form Events Form etkileşim olayları (button click, focus, validate)
Display Methods Ana form metod tetikleyicileri
Method Returns Method invocation cevapları

Tüm event node'ları temelde aynıdır

Pakete bakıldığında 8 farklı event tipi olmasına rağmen kod tarafında hepsi aynı EventSubscribers fonksiyon iskeletini kullanır. Aralarındaki tek fark palette üzerindeki kategori adıdır. Bu sayede akışınızda hangi olayın hangi gruba ait olduğunu görsel olarak ayırt edebilirsiniz.

Ortak Özellikler

I/O

Tüm event node'ları: 0 giriş, 1 çıkış

Renk

Business Events Açık yeşil — Servis kategorisi.

Property Tablosu (Ortak)

Alan Tip Varsayılan Açıklama
name string Node-RED canvas üzerinde gösterilecek ad
event string (boş) Panel'in çağıracağı HTTP path
ishandled boolean false Bu olay Node-RED tarafından mı handle edilecek?

suffix alanı yalnızca Business Events node'una aittir. Diğer event tiplerinde bulunmaz.

Çalışma Mantığı

sequenceDiagram
    participant Panel as trexMes Panel
    participant Conn as Node-RED Connector
    participant Ev as Business Events
    participant Flow as Akış
    participant Resp as Responser

    Panel->>Conn: Event tetiklendi
    Conn->>Ev: GET /OrderStartEvent + payload
    Ev->>Flow: msg.payload (event verisi)
    Flow->>Resp: ...işlenmiş payload
    Resp-->>Conn: HTTP 200
    Conn-->>Panel: İşlem tamamlandı

Olay Kayıt Listesi (Subscription)

Deploy anında her event node, trex Subscriber'ın çağrısı üzerinden otomatik tespit edilir. Panel tarafına gönderilecek listenin yapısı:

RED.nodes.eachNode(function (n) {
    if (eventTypes.has(n.type)) {
        let runtimeNode = RED.nodes.getNode(n.id);
        let eName = runtimeNode.event.replace(/\//g, "");
        matchingNodes.push(eName);
        if (runtimeNode.ishandled === true) {
            matchingHandlers.push(eName + "|handled");
        }
    }
});

Tipik Akış Yapısı

flowchart LR
    A[Business Events] --> B[Custom Form]
    B --> C[Form Bind Controls]
    C --> D[Control Properties]
    D --> E[Responser]

    style A fill:#ccffcc,color:#000
    style B fill:#ccffcc,color:#000
    style C fill:#ccffcc,color:#000
    style D fill:#ccffcc,color:#000
    style E fill:#ccffcc,color:#000

Giriş Mesajı (msg)

Olay tetiklendiğinde aşağıdaki yapıda mesaj üretilir:

{
  "_msgid": "abc123",
  "req": { /* Express HTTP request */ },
  "res": { /* HTTP response wrapper */ },
  "payload": { /* Panel'den gelen ham olay verisi */ }
}
Alan Açıklama
req Express Request nesnesi — IP, headers, query bilgileri
res Cevap wrapper — Responser bunu kullanır
payload Panel'in gönderdiği event verisi (yapısı event tipine göre değişir)

msg.payload Yapısı — Kategoriye Göre

Her event kategorisi farklı bir payload yapısı gönderir:

Kategori Payload yapısı
Business Events Yalnızca EventArgs alanları (düz nesne)
Communication Events EventArgs alanları + IsHandled + WorkStationStatusEntry
Display Events EventArgs alanları + IsHandled + WorkStationStatusEntry
System Events { Item1: WorkStationStatusEntryModel, Item2: ProductionPlanDetailModel, Item3: EmployeeInfo[], Item4: StoppageStateContext }

Editörde Payload Önizleme

Event combobox'ından bir olay seçildiğinde, editör içinde o olaya ait tam msg.payload yapısı görüntülenir:

  • Yapı collapse edilebilir JSON ağacı olarak gösterilir
  • Kök nesne açık, iç objeler ve diziler başlangıçta kapalı gelir; başlığa tıklanarak açılır
  • IsHandled alanı bulunan eventlarda editörde amber uyarı bandı görünür:

    IsHandled destekli — akışı kesme veya veri değiştirme yapılabilir

ishandled Kavramı

Olay tipi panel tarafında varsayılan bir işleyiciye sahip olabilir. Node-RED akışınız bu olayı yakaladığında panele:

  • ishandled = true → "Bu olayı ben işledim, sen de işleyiciyi tetikleme."
  • ishandled = false → "Sen kendi işleyicini de çalıştır."

Bu davranışı akış ortasında dinamik değiştirmek için Handle Setter kullanın.

IsHandled desteği event kategorisine göre değişir

IsHandled yalnızca Communication Events ve Display Events kategorilerinde geçerlidir. Business Events bazı eventlarda IsHandled içerebilir; System Events içermez.

Notlar

Event isminde slash

event alanına /OnPlanLoaded veya OnPlanLoaded yazabilirsiniz. Node otomatik olarak başına / ekler. Panel kayıt listesinde slash'lar kaldırılarak gönderilir.

Aynı event ismi tekrar etmemeli

Aynı event ismine sahip birden fazla node varsa HTTP path çakışması olur. Farklı kategorilerde olsalar bile aynı ismi kullanmayın. Birden fazla node aynı Business Event'ı dinlemesi gerekiyorsa suffix alanı kullanın.

Form Events'te formname

Form Events node'unda ishandled yerine formname alanı vardır. Hangi forma ait olduğunu belirtir.

Hızlı Karşılaştırma

Node Özel Alan Payload yapısı
Business Events suffix EventArgs alanları
System Events Item1 / Item2 / Item3 / Item4
Communication Events EventArgs + IsHandled + WorkStationStatusEntry
Display Events EventArgs + IsHandled + WorkStationStatusEntry
Form Events formname Form'a özgü
Display Methods Method'a özgü
Method Returns methodname Return değeri

WorkStationId ile İstasyon Bazlı Değişken Yönetimi

Her event tipinden gelen msg.payload içinde mutlaka bir WorkStationId alanı bulunur. Bu integer değer, panelin benzersiz kimliğidir ve birden fazla istasyonun aynı Node-RED akışını kullandığı ortamlarda istasyon bazlı ayrım yapmayı sağlar.

Neden WorkStationId ile key-value kullanılmalı?

Eğer bir flow veya global değişken tüm istasyonlara ait veri tutacaksa, doğrudan flow.set('myVariable', value) şeklinde yazıldığında bir istasyonun verisi diğerinin üzerine yazar. Bunun yerine WorkStationId değeri key olarak kullanılır:

// WorkStationId al
let workStationId = msg.payload.WorkStationId;

// Mevcut değişkeni oku (yoksa boş obje başlat)
let myVariable = flow.get('myVariable') || {};

// Bu istasyona ait değeri güncelle
myVariable[workStationId] = 'Deneme';

// Geri kaydet
flow.set('myVariable', myVariable);

Artık herhangi bir function node içinden istasyona özgü değere erişilebilir:

let workStationId = msg.payload.WorkStationId;
let myVariable = flow.get('myVariable') || {};
let value = myVariable[workStationId]; // Sadece bu istasyonun değeri

Genel değişken şablonu

// --- Yazma ---
let wsId = msg.payload.WorkStationId;
let store = flow.get('storeName') || {};
store[wsId] = { /* istasyona özgü veri */ };
flow.set('storeName', store);

// --- Okuma ---
let wsId = msg.payload.WorkStationId;
let store = flow.get('storeName') || {};
let entry = store[wsId]; // undefined ise bu istasyon için henüz veri yok

global değişkenler için de aynı pattern

Birden fazla flow arasında paylaşılacak veriler için flow.get/set yerine global.get/set kullanın; key yapısı aynıdır.

WorkStationId her zaman erişilebilir

WorkStationId Business Events'te doğrudan msg.payload.WorkStationId olarak gelir. Communication ve Display Events'te de aynı şekilde payload'un üst seviyesinde bulunur. System Events'te ise msg.payload.Item1.WorkStationId yolundan erişilir.

WorkStationId integer'dır

Key olarak integer kullanıldığında {} içinde sayısal key oluşur ({5: ...}). Bu tamamen geçerlidir; ancak JSON serileştirme gerektiren durumlarda string'e çevirmek (String(wsId)) tercih edilebilir.

Sonraki Adım

Her event tipinin kendi sayfasında özel kullanım örnekleri ve tam payload yapısı bulunur. Sol menüden istediğinizi seçin.