Node-RED

Node-RED Grafik Geçmişi: MQTT Grafik Verisini Yeniden Başlatmalarda Koruyun

Dashboard grafikleri Node-RED yeniden başladığında her şeyi unutur. Bu rehber, MQTT verisi için Node-RED grafik geçmişini korumanın iki güvenilir yolunu gösteriyor: dosya tabanlı context depolama ve küçük bir SQLite tablosu; ikisi de başlangıçta Dashboard 2.0'a yeniden oynatılır.

Yeniden başlatmanın ardından Node-RED grafik geçmişini göstermek için 24 saatlik MQTT sıcaklık verisini geri yükleyen Node-RED Dashboard 2.0 çizgi grafiği
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 grafik geçmişi, Node-RED her yeniden başladığında kaybolur, çünkü Dashboard grafikleri noktalarını bellekte tutar. Bu eğitim, MQTT verisi için bu geçmişi korumanın iki pratik yolunu gösteriyor: küçük veri kümeleri için dosya tabanlı bir context deposu, sorgu ve daha uzun saklama istediğinizde ise bir SQLite tablosu. Her iki durumda da depolanan veriyi başlangıçta bir Dashboard 2.0 grafiğine yeniden oynatacaksınız; böylece operatörler boş bir ızgara yerine son 24 saati görür.

Node-RED Grafikleri Geçmişlerini Neden Kaybeder?

Dashboard 2.0'daki bir ui-chart node'u aldığı noktaları sunucu tarafındaki bir veri deposunda saklar; yeni bir tarayıcı sekmesinin mevcut çizgiyi hâlâ göstermesinin nedeni budur. Bu depo, Node-RED sürecinin belleğinde yaşar. Node-RED'i yeniden başlatın, üzerinde çalıştığı Raspberry Pi'yi yeniden başlatın ya da bir paketi güncelleyip yeniden başlatın; grafik sıfırdan başlar.

MQTT bu boşluğu tek başına doldurmaz. Bir retained message, topic başına yalnızca son değeri tutar; yeniden bağlanan bir abone bir trend değil, tek bir nokta alır. Broker bir mesaj yönlendiricisidir, veritabanı değil. Bu sınırın tam olarak nerede olduğunu anlamak istiyorsanız MQTT broker'ın ne yaptığını okuyun. Geçmiş, sizin kontrol ettiğiniz bir yerde saklanmalıdır ve Node-RED bunun için kullanışlı bir yerdir.

Node-RED Grafik Geçmişi için Depolama Yöntemi Seçmek

Yöntem Uygun olduğu durum Saklama süresi Ek kurulum Ödünleşimler
Dosya tabanlı context (localfilesystem) Bir ila birkaç seri, dakikada bir nokta Saatlerden birkaç güne Yok Her yazmada tüm dizi yeniden yazılır; sorgulanamaz
SQLite (node-red-node-sqlite) Çok sayıda seri, zaman aralığına göre filtreleme Haftalardan aylara Tek bir palet node'u Tablo temizliğini siz yönetirsiniz
Zaman serisi veritabanı (InfluxDB) Çok sayıda cihaz, toplulaştırma, Grafana Aylardan yıllara Ayrı sunucu Daha fazla hareketli parça

Bu makalenin geri kalanı ilk ikisini uyguluyor. Üçüncüsü için, aynı MQTT girişini ve bu iş için yapılmış bir veritabanını kullanan Node-RED InfluxDB eğitimini izleyin.

Ücretsiz Bir Broker'dan Test Verisi

Bir okuma akışına ihtiyacınız var. Benzersiz bir topic ön ekiyle, herkese açık MQTT test broker'ı olan broker.connectmq.com adresine birkaç saniyede bir sıcaklık yayınlayın. a7f3k2 yerine kendi rastgele dizenizi kullanın; herkese açık broker'daki her şey herkes tarafından okunabilir.

# Her 5 saniyede rastgele bir sıcaklık yayınlar (durdurmak için Ctrl+C)
while true; do
  T=$(awk -v r=$RANDOM 'BEGIN { printf "%.2f", 20 + (r % 800) / 100 }')
  mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-hist-a7f3k2 \
    -t connectmq/demo/a7f3k2/room1/telemetry -m "{\"temperature\": $T}"
  sleep 5
done

Node-RED'de, benzersiz bir client ID'ye sahip bir broker yapılandırma node'u kullanarak connectmq/demo/a7f3k2/room1/telemetry üzerinde, çıktısı "a parsed JSON object" olan bir mqtt in node'u ekleyin.

Yöntem 1: Dosya Tabanlı Context Depolama

Kalıcı bir context deposunu etkinleştirin

Varsayılan olarak Node-RED context'i bellekte yaşar. Node-RED kullanıcı dizininizdeki settings.js dosyasını (genellikle ~/.node-red/settings.js) düzenleyin ve diske yazan ikinci bir depo tanımlayın:

// ~/.node-red/settings.js (module.exports = { ... } içinde)
contextStorage: {
    default: { module: "memory" },
    file: {
        module: "localfilesystem",
        config: { flushInterval: 30 }   // diske yazmalar arasındaki saniye
    }
},

Node-RED'i yeniden başlatın. Belleği varsayılan olarak tutup dosya deposunu açıkça adlandırmak, yalnızca seçtiğiniz verinin diske yazılması anlamına gelir; bu SD kartlarda önemlidir. Değerler her 30 saniyede bir diske yazılır; bu yüzden ani bir elektrik kesintisi bu pencereye kadar veri kaybettirebilir; düzgün bir kapatma ise her şeyi yazar. Node-RED context rehberi kapsamları ve depoları daha ayrıntılı açıklıyor.

Dakikada bir nokta kaydedin

Her ham okumayı saklamak, her yazmada yeniden yazılan büyük bir diziyi hızla oluşturur. Bunun yerine okumaların dakikalık ortalamasını alın. mqtt in node'unu bu function node'una, çıkışını da grafiğe bağlayın:

// Function node "record history" - 1 çıkış
const RETENTION_MS = 24 * 60 * 60 * 1000;   // 24 saat sakla
const value = Number(msg.payload.temperature);
if (Number.isNaN(value)) {
    return null;
}

const now = Date.now();
const minute = Math.floor(now / 60000);
let acc = context.get("acc") || { minute: minute, sum: 0, n: 0 };

if (acc.minute !== minute) {
    if (acc.n > 0) {
        let history = flow.get("tempHistory", "file") || [];
        history.push({
            x: acc.minute * 60000,
            y: Math.round((acc.sum / acc.n) * 100) / 100
        });
        const cutoff = now - RETENTION_MS;
        history = history.filter(p => p.x >= cutoff);
        flow.set("tempHistory", history, "file");
    }
    acc = { minute: minute, sum: 0, n: 0 };
}

acc.sum += value;
acc.n += 1;
context.set("acc", acc);

// Grafik için canlı nokta
return { topic: "Temperature", payload: { x: now, y: value } };

Dakikada bir noktayla, bir günlük geçmiş seri başına 1.440 küçük nesne eder; bu, bir context dosyasının rahatça kaldırabileceği bir miktardır.

Grafiği yapılandırın

ui-chart node'unda bir çizgi grafik seçin, Series değerini msg.topic olarak bırakın, X için x anahtarını, Y için y anahtarını ayarlayın ve grafiği saklama sürenize uyacak şekilde 24 saatlik noktayla sınırlayın.

Geçmişi başlangıçta yeniden oynatın

Inject once after 1 second olarak ayarlanmış, tekrarı olmayan bir inject node'u ekleyin ve onu bu function node'una, ardından aynı grafiğe bağlayın:

// Function node "replay history" - 1 çıkış
const history = flow.get("tempHistory", "file") || [];
node.status({ fill: "green", shape: "dot", text: history.length + " points" });

return [[
    { topic: "Temperature", payload: [] },        // önce grafiği temizle
    { topic: "Temperature", payload: history }    // sonra saklanan diziyi gönder
]];

Boş bir dizi göndermek grafiği temizler; bu, yeniden deploy sonrasında çizgilerin çoğalmasını önler. {x, y} nesnelerinden oluşan bir dizi göndermek hepsini bir kerede ekler. Node-RED'i yeniden başlatın; grafik son günün ortalamalarıyla geri gelir, ardından canlı noktalarla devam eder.

Yöntem 2: Daha Uzun Saklama için SQLite

Birkaç seriniz varsa, bir hafta ya da daha fazlasını istiyorsanız veya zamana göre filtrelemek istiyorsanız bir veritabanı daha temizdir. Palet yöneticisinden node-red-node-sqlite paketini kurun. Bazı platformlarda bu, yerel bir modül derler; bu yüzden ona bir dakika verin.

Tabloyu oluşturun

msg.topic değeri aşağıdaki ifade olan bir inject node'u (başlangıçta bir kez inject) ekleyin ve onu, veritabanı dosyası /home/pi/.node-red/history.db (yolu uyarlayın) ve SQL sorgu modu Via msg.topic olan bir sqlite node'una bağlayın.

CREATE TABLE IF NOT EXISTS readings (
  ts     INTEGER NOT NULL,
  series TEXT    NOT NULL,
  value  REAL    NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_readings ON readings (series, ts);

Node sürümünüz mesaj başına yalnızca bir ifade çalıştırıyorsa, iki ifadeyi iki ayrı inject olarak gönderin.

Her okumayı ekleyin

Bu SQL ile Prepared Statement modunda ikinci bir sqlite node'u kullanın:

INSERT INTO readings (ts, series, value) VALUES ($ts, $series, $value)

Onu parametreleri oluşturan bir function node'undan besleyin:

// Function node "to sqlite params"
const value = Number(msg.payload.temperature);
if (Number.isNaN(value)) return null;
msg.params = { $ts: Date.now(), $series: "Temperature", $value: value };
return msg;

Başlangıçta sorgulayın ve günlük temizleyin

Başlangıçta son 24 saati sorgulayın ve satırları grafiğe gönderin. Via msg.topic modundaki bir sqlite node'u satırları msg.payload içinde bir dizi olarak döndürür:

// Function node "history query" - başlangıçta bir kez çalışan inject ile tetiklenir
msg.topic = "SELECT ts AS x, value AS y FROM readings " +
            "WHERE series = 'Temperature' AND ts > " + (Date.now() - 86400000) +
            " ORDER BY ts";
return msg;

Sonucu msg.topic değerini Temperature yapan bir change node'undan geçirip grafiğe bağlayın. Dosyanın sonsuza kadar büyümemesi için, sınırı aynı şekilde hesaplanan DELETE FROM readings WHERE ts < <cutoff> sorgusunu çalıştıran günlük bir inject ekleyin.

Güvenmeden Önce Kontrol Listesi

  1. Bir saklama süresi seçin ve onu umutla değil, kodla ya da SQL ile uygulayın.
  2. Yalnızca ortalamaları gösteriyorsanız saklamadan önce örnek sayısını azaltın (downsampling).
  3. Grafiğin nokta sınırının saklama süresiyle eşleştiğinden emin olun; aksi halde eski noktalar erkenden kaybolur.
  4. Deploy sonrası çift çizgileri önlemek için yeniden oynatmadan önce grafiği temizleyin.
  5. Context dizinini ya da veritabanı dosyasını Node-RED projenizin geri kalanıyla birlikte yedekleyin.
  6. SD kartlarda disk kullanımını izleyin; yüksek frekanslı veri için SQLite ya da harici bir veritabanını tercih edin.

Üretimde Veri Nereden Gelmeli?

Geçmiş, onu besleyen akış kadar iyidir. Broker düşerse grafikte boşluklar oluşur ve paylaşılan herkese açık bir broker'da herkes demo topic'lerinizi okuyabilir ya da onlara yayın yapabilir. Gerçek kurulumlar için mqtt in node'unu kimlik bilgileri ve TLS ile özel bir broker'a yönlendirin. ConnectMQ ile portal her broker için bir kullanıcı adı, parola ve client ID üretir; akıştaki değişiklik yalnızca yapılandırma node'uyla sınırlıdır: sunucu, port 8883, TLS açık ve kimlik bilgileri.

Barındırılan bir MQTT broker, siz Node-RED'i yeniden başlatırken ya da yükseltirken cihazların yayın yapmaya devam etmesini de sağlar. Bunu kalıcı bir MQTT oturumu ve abonelikte QoS 1 ile birleştirin; kısa Node-RED yeniden başlatmaları, planınızın oturum sona erme süresine bağlı olarak broker'ın oturum için mesajları kuyruğa almasıyla telafi edilebilir. Panoların kendisi için Dashboard 2.0 eğitimi göstergeleri, kontrolleri ve yerleşimi; Node-RED MQTT eğitimi ise broker temellerini ele alıyor.

Node-RED Verinizi ConnectMQ ile Akışta Tutun

app.connectmq.com adresinden kaydolun ve kredi kartı gerektirmeyen ücretsiz Serverless planıyla başlayın. Bir broker oluşturun, kimlik bilgilerini Node-RED yapılandırma node'unuza yapıştırın; grafikleriniz özel, TLS ile şifrelenmiş bir akışla beslensin. ConnectMQ canlı topic gezgini, depolamada hata ayıklamaya başlamadan önce okumaların geldiğini doğrulamanıza yardımcı olur.

Sık Sorulan Sorular

Node-RED Dashboard 2.0 grafik verisini otomatik olarak kaydeder mi?

Yeni tarayıcı sekmelerinin mevcut noktaları görmesi için grafik verisini bellekte tutar, ancak diske hiçbir şey yazılmaz. Node-RED yeniden başladıktan sonra, saklanan veriyi yeniden oynatmadığınız sürece grafik boştur.

Retained MQTT mesajları grafik geçmişini saklayabilir mi?

Hayır. Bir retained message, bir topic için yalnızca en son değeri tutar. Güncel durumu anında göstermek için faydalıdır, ancak bir trend için context depolamaya ya da bir veritabanına ihtiyacınız vardır.

Node-RED context'inde ne kadar geçmiş tutabilirim?

Dosya tabanlı context, bir gün ya da birkaç gün boyunca dakikada bir noktaya indirgenmiş birkaç seri için iyi çalışır. Daha büyük hacimler için SQLite ya da InfluxDB gibi bir zaman serisi veritabanı kullanın.

Deploy sonrası çift çizgileri nasıl önlerim?

Saklanan noktaları yeniden oynatmadan önce grafiğe boş bir dizi gönderin. Bu, grafiği temizler ve geçmiş yalnızca bir kez çizilir.

İ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.