Node-RED subflow'ları bir grup node'u tek bir yeniden kullanılabilir node olarak paketlemenizi sağlar; böylece bir kez yazdığınız mantığı herhangi bir sekmeye bırakıp her kullanımda ayrı ayrı yapılandırabilirsiniz. Bu yazıda kendi ayarları olan bir MQTT alarm subflow'u oluşturacak, durum bildirimi ve hata yönetimi ekleyecek ve tek bir function bile kopyalamadan onu birkaç ConnectMQ topic'inde yeniden kullanacaksınız.
Subflow'ların Çözdüğü Sorun
MQTT flow'ları kendini tekrar etme eğilimindedir. Her sensör topic'i aynı adımları gerektirir: payload'ı ayrıştır, makul olduğunu kontrol et, bir değeri eşikle karşılaştır, bir alarm publish et, belki operatör bunalmasın diye alarmı hız sınırla. İlk seferde bu node'ları elle oluşturursunuz. Beşinci seferde kopyalayıp yapıştırırsınız. Yirminci seferde bir hata düzeltmesi yirmi function node'unu düzenlemek demektir ve bunlardan biri her zaman gözden kaçar.
Subflow bunu çözer. Mantığı bir kez şablon olarak tanımlarsınız ve onu kullandığınız her yer o şablonun bir örneğidir. Şablonu değiştirin; bir sonraki deploy'da her örnek güncellenir. Her örnek, subflow özellikleri aracılığıyla farklı bir eşik veya alarm topic'i gibi kendi ayarlarına yine de sahip olabilir.
| Yaklaşım | Yeniden kullanım | Kullanım başına ayarlar | Bakım |
|---|---|---|---|
| Node'ları kopyalayıp yapıştırmak | Elle | Her kopyayı düzenle | Her kopya düzeltilmeli |
| Link node'larıyla tek bir paylaşımlı zincire bağlamak | Paylaşımlı, tek örnek | msg içinde taşınmalı |
Tek yer, ama paylaşılan durum çakışabilir |
| Subflow | Her kullanım bir örnek | Örnek başına özellikler | Tek şablon, yalıtılmış örnek durumu |
Tek bir paylaşımlı işleme zinciri istediğinizde link node'ları iyi bir seçenektir. Her kullanımın kendi yapılandırmasına ve kendi durumuna ihtiyaç duyduğu durumlarda Node-RED subflow'ları daha iyidir.
Node-RED Subflow'ları Nasıl Çalışır?
Bir subflow'un bir şablonu ve örnekleri vardır:
- Şablon. Editörde kendi sekmesi olarak açılır; node'ları, isteğe bağlı bir giriş portunu (0 veya 1), istenen sayıda çıkış portunu ve isteğe bağlı bir durum portunu içerir.
- Örnekler. Palette'te "subflows" altında görünür ve diğer node'lar gibi davranır. Her örneğin kendi flow context'i ve subflow özellikleri için kendi değerleri vardır.
- Özellikler. Şablonun düzenleme penceresinde, her biri bir ad, tür ve varsayılan değerle tanımlanır. Subflow içinde node'lar bunları ortam değişkeni olarak okur: bir function içinde
env.get("THRESHOLD")veya bir node'un metin alanının tüm değeri olarak yazılan${THRESHOLD}.
Menü üzerinden (Subflows → Create Subflow) sıfırdan bir subflow oluşturabilir ya da daha sık olarak mevcut node'ları seçip Subflows → Selection to Subflow seçeneğini kullanabilirsiniz. Node-RED, seçim sınırını hangi kabloların geçtiğine göre giriş ve çıkışları sizin için bağlar.
Bir MQTT Alarm Subflow'u Oluşturun
Hedef: ayrıştırılmış bir MQTT telemetri mesajını alan, bir alanı eşikle karşılaştıran, normal veriyi 1. çıkıştan geçiren ve aynı cihazın her saniye alarm vermemesi için bekleme süresiyle 2. çıkıştan bir alarm mesajı yayan tek bir node.
Adım 1: Şablonu ve özellikleri oluşturun
Yeni bir subflow oluşturun, adını "Threshold alert" koyun, inputs değerini 1, outputs değerini 2 yapın. Subflow'un özelliklerini açın ve şunları ekleyin:
| Özellik | Tür | Varsayılan | Anlamı |
|---|---|---|---|
FIELD |
string | temp |
Kontrol edilecek payload alanı |
THRESHOLD |
number | 30 |
Bu değerin üzerinde alarm |
COOLDOWN_S |
number | 60 |
Topic başına alarmlar arasındaki minimum saniye |
SEVERITY |
string | high |
Alarma eklenen etiket |
Her özelliğe bir arayüz bileşeni (metin, sayı, onay kutusu, seçim listesi) de verebilirsiniz; bu, şablonu hiç açmayan ekip arkadaşlarınız için örnekleri daha kullanıcı dostu yapar.
Adım 2: Mantığı ekleyin
Şablon içinde giriş → function → iki çıkış şeklinde bağlayın. Function:
// "Threshold alert" subflow'u içindeki function, 2 çıkış
const field = env.get("FIELD");
const threshold = Number(env.get("THRESHOLD"));
const cooldownMs = Number(env.get("COOLDOWN_S")) * 1000;
const value = msg.payload && msg.payload[field];
if (typeof value !== "number") {
node.error(`Field "${field}" missing or not numeric on ${msg.topic}`, msg);
return [null, null];
}
let alertMsg = null;
if (value > threshold) {
const lastAlerts = flow.get("lastAlerts") || {};
const now = Date.now();
if (!lastAlerts[msg.topic] || now - lastAlerts[msg.topic] > cooldownMs) {
lastAlerts[msg.topic] = now;
flow.set("lastAlerts", lastAlerts);
alertMsg = {
topic: msg.topic.replace(/\/telemetry$/, "/alert"),
payload: {
field: field,
value: value,
threshold: threshold,
severity: env.get("SEVERITY"),
ts: new Date(now).toISOString()
}
};
}
}
node.status({ fill: alertMsg ? "red" : "green", shape: "dot", text: `${field}=${value}` });
return [msg, alertMsg];
Buradaki flow ifadesinin örneğin kendi context'i olduğuna dikkat edin. Subflow'un iki örneği bekleme süresi tablolarını paylaşmaz; bu da tam olarak istediğiniz şeydir.
Adım 3: Örnek üzerinde durum bildirin
Subflow'un status portunu etkinleştirin ve (function ile sınırlandırılmış) bir Status node'unu buna bağlayın. Ana sekmenizdeki örnek node aynı yeşil veya kırmızı noktayı ve son değeri gösterir; böylece birçok örneği bir bakışta izleyebilirsiniz.
Adım 4: Birkaç topic'te kullanın
Ana sekmenizde her kaynak için bir mqtt in node'u veya wildcard içeren tek bir node ekleyin ve bunları farklı ayarlara sahip ayrı örneklere bağlayın. Hızlı bir test için e2a7 yerine kendi rastgele dizenizi yazarak herkese açık MQTT test broker'ına publish edin:
mosquitto_pub -h broker.connectmq.com -p 1883 -i demo-sub-e2a7 \
-t "connectmq/demo/e2a7/furnace1/telemetry" -m '{"temp": 912}'
mosquitto_pub -h broker.connectmq.com -p 1883 -i demo-sub-e2a7 \
-t "connectmq/demo/e2a7/tank1/telemetry" -m '{"level": 97}'
Birinci örnek fırınlar için FIELD=temp ve THRESHOLD=850, ikinci örnek tanklar için FIELD=level ve THRESHOLD=95 kontrol eder. Alarmların function'ın ayarladığı topic'e publish edilmesi için her örneğin ikinci çıkışını topic alanı boş, paylaşılan tek bir mqtt out node'una bağlayın.
Kendi MQTT Aboneliğini İçeren Bir Subflow
Bir subflow'un girişe ihtiyacı yoktur. Sıfır girişli bir subflow, topic'i bir subflow özelliği olan ${TOPIC} şeklinde ayarlanmış kendi mqtt in node'unu barındırabilir. Böylece her örnek tek bir broker config node'unu paylaşarak farklı bir topic'e subscribe olur ve tüm örnekler broker'a aynı tek bağlantıyı kullanır.
Bu, birçok özdeş makine paneli içeren panolar için düzenli bir çözümdür: her makine için TOPIC ve bir görünen ad içeren bir subflow örneği. Ödünleşimi, aboneliğin deploy anında sabitlenmesidir. Topic'leri anında değiştirmeniz gerekiyorsa subflow'ları bunun yerine Node-RED dinamik MQTT abonelik ile birleştirin.
Broker config node'unu subflow'un dışında, ana flow'da veya global kapsamda tutun. Şablonun içine bir broker config koymak, her biri kendi client ID'sine ihtiyaç duyan, örnek başına bir broker bağlantısı oluşturur.
Subflow'lar İçinde Hata Yönetimi
Yukarıdaki node.error(..., msg) çağrısı dahil bir örnek içinde oluşan hatalar, subflow şablonundaki bir Catch node tarafından yakalanabilir. İçerideki hiçbir Catch node onları yakalamazsa, örneği içeren sekmedeki Catch node'larına iletilirler. Yaygın bir desen, bilinen ve kurtarılabilir hataları subflow içinde ele almak, beklenmeyenlerin ise sekme başına tek bir "errors" işleyicisine kadar yükselmesine izin vermektir.
Node-RED Subflow Kontrol Listesi
- Yeni bir örneğin hemen çalışması için her özelliğe makul bir varsayılan verin.
- Sabit kodlanmış değerler yerine özellikleri tercih edin; kullanımlar arasında farklılık gösteren her şey bir özelliğe aittir.
- Subflow'ları odaklı tutun: her birine "parse", "alert" veya "rate limit" gibi tek bir iş.
- Örneklerin çalışma alanında gözlemlenebilmesi için bir status portu ekleyin.
- Broker config node'larını şablonun dışında tutun.
- Subflow'u açıklama alanında belgeleyin; bu açıklama her örnek için yardım kenar çubuğunda görünür.
- Şablon değişikliklerinin kod gibi gözden geçirilmesi için şablonlarınızı Node-RED projeleri kullanarak git ile sürümleyin.
Kod tarafı için Node-RED function node rehberimiz çok çıkışlı dönüşleri ve asenkron gönderimleri daha derinlemesine ele alır; Node-RED context yazısı ise örnek flow context'inin $parent aracılığıyla üst öğesiyle ilişkisini açıklar. nodered.org'daki resmi subflow belgeleri tüm şablon seçeneklerini listeler.
Yeniden Kullanılabilir Node-RED Mantığını ConnectMQ'da Çalıştırın
Subflow'lar üç sensörden üç yüz sensöre ölçeklenmeyi kolaylaştırır ve broker'ınız da onlarla birlikte ölçeklenmelidir. ConnectMQ; TLS, MQTT 5 ve eşik alarm kuralları belirleyip subflow'larınızın publish ettiği alarm topic'lerini izleyebileceğiniz bir portal sunan yönetilen bir MQTT broker'dır. Ücretsiz katmanın ötesine geçtiğinizde ücretli Serverless planlar 1.000 bağlantıya kadar destek verir ve Dedicated kümeler trafiğinizi tamamen yalıtır. İlk broker'ınızı app.connectmq.com adresinde kredi kartı gerektirmeyen ücretsiz Serverless planla oluşturun. Hâlâ altyapı seçiyorsanız bulut MQTT broker modeli rehberimizi okuyun; uçtan uca bir giriş için Node-RED MQTT eğitimine bakın.
Sık Sorulan Sorular
Node-RED'de subflow ile grup arasındaki fark nedir?
Grup, tek bir sekmedeki node'ların etrafındaki görsel bir kutudur. Subflow ise palette'te bir node olarak görünen ve farklı ayarlarla birçok kez örneklenebilen yeniden kullanılabilir bir şablondur.
Bir Node-RED subflow'una ayarları nasıl aktarırım?
Subflow şablonunda özellikler tanımlayın, ardından her örnekte değerleri belirleyin. Subflow içinde bunları env.get("NAME") ile veya bir node özelliğine ${NAME} yazarak okuyun.
Her subflow örneğinin kendi context'i var mı?
Evet. Bir subflow içindeki flow context o örneğe aittir; bu yüzden örnekler birbirine karışmaz. İçeren flow'un context'ine erişmek için $parent. önekini kullanın.
Subflow örnekleri içindeki MQTT node'ları ek broker bağlantıları açar mı?
Hepsi subflow dışında tanımlanmış aynı broker config node'unu kullanıyorsa hayır. Node-RED her broker config node'u için tek bir bağlantıyı paylaşır.



