Node-RED

Yeniden Kullanılabilir MQTT Mantığı İçin Node-RED Subflow'ları

Node-RED subflow'ları tekrarlanan node gruplarını tek bir yeniden kullanılabilir node'a dönüştürür. Bu yazı örnek özellikleri, durum bildirimi ve hata yönetimiyle bir MQTT alarm subflow'unun nasıl oluşturulacağını ve birçok topic'te nasıl yeniden kullanılacağını gösteriyor.

MQTT ayrıştırma ve alarm mantığını birden fazla topic'te kullanılan tek bir yeniden kullanılabilir node'da paketleyen Node-RED subflow'ları
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

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

  1. Yeni bir örneğin hemen çalışması için her özelliğe makul bir varsayılan verin.
  2. Sabit kodlanmış değerler yerine özellikleri tercih edin; kullanımlar arasında farklılık gösteren her şey bir özelliğe aittir.
  3. Subflow'ları odaklı tutun: her birine "parse", "alert" veya "rate limit" gibi tek bir iş.
  4. Örneklerin çalışma alanında gözlemlenebilmesi için bir status portu ekleyin.
  5. Broker config node'larını şablonun dışında tutun.
  6. Subflow'u açıklama alanında belgeleyin; bu açıklama her örnek için yardım kenar çubuğunda görünür.
  7. Ş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.

İlgili yazılar

ISA-95 Topic'leriyle Node-RED OPC UA İstemcisinden MQTT'ye

Bir PLC veya simülasyon sunucusundaki OPC UA değişkenlerine node-red-contrib-opcua ile abone olun, node ID'lerini ISA-95 tarzı MQTT topic'lerine eşleyin ve değerleri kalite bilgisi ve zaman damgalarıyla yayınlayın.

8 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.