Beispielsammlung
Wenn Sie fertige Flows importieren und sofort testen möchten, sehen Sie sich zuerst die Beispiel-Flows zum Importieren an — Node-RED wird mit einer leeren Leinwand ausgeliefert, daher werden Beispiele aus der Dokumentation importiert.
Die folgenden Beispiele sind Muster, die in der Praxis vor Ort häufig erstellt werden. Alle funktionieren einfach durch Drag-and-Drop, Verbindung und Deployment von Nodes, genau wie bei Hello World. Die Codeblöcke enthalten JavaScript, das direkt in die function Node kopiert werden kann.
1. Schwellenwert-Alarm (Threshold Alert)
Ziel: Benachrichtigung über Slack, wenn der Temperatur-Tag 80 °C oder mehr beträgt.
inject (5s) ─▶ 태그값 읽기 (TAG_TEMPERATURE) ─▶ function (임계값 체크) ─▶ switch ─▶ slack out
function:
const v = parseFloat(msg.payload.value);
msg.over = (v >= 80);
msg.temp = v;
return msg;
switch: Bedingung msg.over ist true → Übergegangen.
In der Nachricht von slack out (oder E-Mail/Telegram) steht 🔥 온도 경보 ${msg.temp}℃.
Um Flattern (80 ↔ 80,1) in der Nähe des Schwellenwerts zu verhindern, empfiehlt es sich, den Alarm nur zum Zeitpunkt des Anstiegs zu senden und erst nach einer Klärung bei erneutem Anstieg wieder zu senden. Verwenden Sie flow.set('lastAlert', true), um den Zustand zu speichern und nur den Umschaltzeitpunkt zu triggern.
2. Summation mehrerer Tags und Schreiben in einen neuen Tag (Berechnungswert)
Ziel: TAG_LINE1_QTY + TAG_LINE2_QTY + TAG_LINE3_QTY → Aktualisierung von TAG_PLANT_TOTAL_QTY jede Sekunde.
inject (1s) ─▶ 태그값 읽기 ×3 (병렬) ─▶ join ─▶ function (sum) ─▶ 태그값 쓰기
join: Modus manual, Combine array, Key msg.topic, Count 3.
Fügen Sie an den Ausgang jedes Tag-Wert-Lesevorgangs eine change Node an, um msg.topic unterschiedlich als line1/line2/line3 zuzuweisen.
function:
const sum = msg.payload.reduce(
(a, p) => a + (parseFloat(p.value) || 0), 0);
return { tag_id: 'TAG_PLANT_TOTAL_QTY', payload: String(sum) };
PlantPulse verfügt über eine integrierte Funktion für Berechnungs-Tags. Einfache arithmetische Operationen sollten dort verarbeitet werden, da dies schneller und stabiler ist. Node-RED ist leistungsfähiger, wenn externe APIs, MQTT, Zeitbedingungen oder bedingte Verzweigungen kombiniert werden.
3. CSV-Logging (Minutentakt)
Ziel: Alle 1 Minute die Werte von 5 Haupt-Tags als eine CSV-Zeile auf der lokalen Festplatte speichern.
inject (1m) ─▶ 태그값 읽기 ×5 ─▶ join ─▶ function (CSV 한 줄) ─▶ file (append)
function:
const ts = new Date().toISOString();
const cols = msg.payload.map(p => (p.value || '').replace(/,/g, ''));
msg.payload = [ts, ...cols].join(',') + '\n';
msg.filename = '/data1/pp-data/node-red/log/tags-' + ts.slice(0, 10) + '.csv';
return msg;
file Node: Aktion append to file, Add newline off.
Das Node-RED userDir befindet sich unter /data1/pp-data/node-red. Wenn CSV-Dateien ebenfalls dort abgelegt werden, sind sie in der Backup-Richtlinie des Gateways enthalten.
4. Echtzeit-Veröffentlichung an externes SCADA via MQTT
(Weitere Details siehe MQTT). Schnelles Einzeilen-Muster:
inject (1s) ─▶ 태그값 읽기 ─▶ change (topic=plant/${tag_id}/value) ─▶ mqtt out
5. Werte einer externen REST-API als Tag importieren (Reverse Integration)
Ziel: Außentemperatur einer externen Wetter-API alle 5 Minuten → Aufzeichnung im virtuellen Tag TAG_OUTDOOR_TEMP.
inject (5m) ─▶ http request (GET https://api.example.com/weather?...) ─▶ function ─▶ 태그값 쓰기
function:
return { tag_id: 'TAG_OUTDOOR_TEMP', payload: String(msg.payload.main.temp) };
Dieser Wert wird in allen PlantPulse-Bildschirmen, Diagrammen und externen SCADA-Systemen wie ein normaler Tag verwendet.
6. Täglicher Berichtsversand per E-Mail bei Arbeitsbeginn
Ziel: Jeden Morgen um 7 Uhr Durchschnitt, Maximum und Minimum der letzten 24 Stunden per E-Mail senden.
inject (cron: 0 7 * * *) ─▶ http request (GET /ui/opcua/history?...) ─▶ function (집계) ─▶ email
function:
const points = msg.payload.points || [];
const vs = points.map(p => parseFloat(p.value)).filter(v => !isNaN(v));
const avg = vs.reduce((a,b)=>a+b,0) / vs.length;
msg.topic = '[일일 리포트] 어제의 ' + msg.payload.tag_id;
msg.payload = '평균: ' + avg.toFixed(2)
+ '\n최대: ' + Math.max(...vs)
+ '\n최소: ' + Math.min(...vs);
return msg;
7. Gleichzeitige Verzweigung zu Slack + DB bei Alarm
inject (1s) ─▶ 태그값 읽기 ─▶ switch (정상/비정상) ─▶┬─▶ slack out
└─▶ http request (POST /alerts)
Die beiden Nodes am Ende der Anomalie-Verzweigung (Slack Out, HTTP Request) erhalten gleichzeitig die gleiche Nachricht.
8. Einheiten- und Skalierungsumrechnung (4-20mA → bar)
inject (1s) ─▶ 태그값 읽기 (TAG_RAW_MA) ─▶ function (스케일) ─▶ 태그값 쓰기 (TAG_PRESSURE_BAR)
function:
const raw = parseFloat(msg.payload.value);
const ma = (raw / 32767) * 20;
const bar = Math.max(0, ((ma - 4) / (20 - 4)) * 100);
return { tag_id: 'TAG_PRESSURE_BAR', payload: bar.toFixed(2) };
9. Gateway-Selbstüberwachung → Telegram
Polling der EDGE-System-Tags, die im OPC UA Server (/ui/opcua) sichtbar sind.
inject (30s) ─▶ 태그값 읽기 (TAG_EDGE_..._OPC_CONNECTED_COUNT) ─▶ function ─▶ telegram
Wenn der Wert auf 0 fällt, sind alle PLC-Verbindungen unterbrochen → Sofortige Benachrichtigung.
10. Echtzeit ohne Polling mittels OPC-UA Subscribe (Edge → Edge)
inject (once) ─▶ OpcUa-Item ×N ─▶ join ─▶ OpcUa-Subscribe ─▶ function (정규화) ─▶ 태그값 쓰기
Empfang von Änderungsereignissen aus einem OPC-UA Server eines anderen Unternehmens und Spiegelung (Mirroring) in die Tags unseres Gateways — eine Echtzeit-Gateway-Brücke.
Weitere Details zur OPC-UA Node-Konfiguration finden Sie auf der Seite OPC-UA Node.
11. Übertragung in die Cloud via Sparkplug B
inject (5s) ─▶ 태그값 읽기 ×N ─▶ function (metrics 배열 만들기) ─▶ sparkplug device out
PlantPulse führt selbst eine Sparkplug-Übertragung durch (고급 / 통합 파트너용 → Sparkplug B). Verwenden Sie den direkten Versand aus Node-RED nur, wenn eine Anpassung des Sparkplug-Verhaltens erforderlich ist. Weitere Details siehe Sparkplug B Node.
12. Erstellung von Diagrammbildern für Alarmnachrichten
Durch die Kombination von node-red-contrib-image-output + chart.js in Node-RED oder einer externen QuickChart-API können Graphen über den «Trend der letzten Stunde» zusammen mit dem Alarm an Slack gesendet werden — dies ermöglicht dem Betreiber eine sofortige Beurteilung.
Nächste Schritte
- Fehlerbehebung bei Flows — Häufige Fallstricke