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? |
suffixalanı 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
IsHandledalanı 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.