Eigene Nodes entwickeln
Eigene Nodes (Custom Nodes) erweitern Node-RED um projektspezifische Funktionalität. Dieser Abschnitt erklärt die Node-Architektur, zeigt die Entwicklung Schritt für Schritt und beschreibt, wie Sie das ProcessCube® AppTemplate als Ausgangspunkt nutzen.
Node-Architektur
Jeder Node-RED Node besteht aus drei Bestandteilen:
| Datei | Zweck | Beschreibung |
|---|---|---|
*.js | Runtime | Enthält die Logik, die auf dem Server ausgeführt wird |
*.html | Editor | Definiert die Konfigurationsoberfläche im Node-RED Editor |
package.json | Registrierung | Ordnet die Node-Dateien einem npm-Paket zu |
Schritt-für-Schritt: Eigene Node erstellen
1. Projektstruktur anlegen
my-custom-node/
├── nodes/
│ └── convert-temperature/
│ ├── convert-temperature.js
│ └── convert-temperature.html
├── package.json
└── README.md2. package.json konfigurieren
Der node-red-Abschnitt teilt Node-RED mit, welche Nodes das Paket bereitstellt:
{
"name": "node-red-contrib-convert-temperature",
"version": "1.0.0",
"description": "Konvertiert Temperaturen zwischen Celsius, Fahrenheit und Kelvin",
"keywords": ["node-red"],
"node-red": {
"nodes": {
"convert-temperature": "nodes/convert-temperature/convert-temperature.js"
}
}
}3. Runtime-Datei erstellen (JS)
module.exports = function(RED) {
function ConvertTemperatureNode(config) {
RED.nodes.createNode(this, config);
const node = this;
const targetUnit = config.targetUnit || 'celsius';
node.on('input', function(msg, send, done) {
try {
const value = parseFloat(msg.payload);
if (isNaN(value)) {
done(new Error("Payload ist keine gültige Zahl"));
return;
}
switch (targetUnit) {
case 'celsius': msg.payload = (value - 32) * 5/9; break;
case 'fahrenheit': msg.payload = (value * 9/5) + 32; break;
case 'kelvin': msg.payload = value + 273.15; break;
}
node.status({ fill: "green", shape: "dot",
text: `${value} → ${msg.payload.toFixed(2)} ${targetUnit}` });
send(msg);
done();
} catch (err) {
done(err);
}
});
node.on('close', function(done) {
// Ressourcen freigeben (z.B. Datenbankverbindungen)
done();
});
}
RED.nodes.registerType("convert-temperature", ConvertTemperatureNode);
}4. Editor-Datei erstellen (HTML)
Die HTML-Datei besteht aus drei <script>-Blöcken — Registrierung, Edit-Dialog und Hilfetext:
<!-- 1. Node-Registrierung im Editor -->
<script type="text/javascript">
RED.nodes.registerType('convert-temperature', {
category: 'function',
color: '#f7a823',
defaults: {
name: { value: "" },
targetUnit: { value: "celsius", required: true }
},
inputs: 1,
outputs: 1,
icon: "font-awesome/fa-thermometer-half",
label: function() { return this.name || "convert temperature"; }
});
</script>
<!-- 2. Edit-Dialog -->
<script type="text/html" data-template-name="convert-temperature">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-row">
<label for="node-input-targetUnit">Ziel-Einheit</label>
<select id="node-input-targetUnit">
<option value="celsius">Celsius</option>
<option value="fahrenheit">Fahrenheit</option>
<option value="kelvin">Kelvin</option>
</select>
</div>
</script>
<!-- 3. Hilfetext -->
<script type="text/html" data-help-name="convert-temperature">
<p>Konvertiert Temperaturwerte zwischen verschiedenen Einheiten.</p>
</script>Die RED.nodes.registerType API
| Option | Typ | Beschreibung |
|---|---|---|
category | String | Kategorie in der Node-Palette |
color | String | Hintergrundfarbe (Hex-Code) |
defaults | Object | Konfigurationseigenschaften mit Standardwerten |
credentials | Object | Verschlüsselt gespeicherte Felder (Passwörter, API-Keys) |
inputs | Number | Anzahl der Eingänge (0 oder 1) |
outputs | Number | Anzahl der Ausgänge (0+) |
icon | String | Icon (Font Awesome oder eigene Datei) |
label | Function | Dynamische Beschriftung |
Das ProcessCube® AppTemplate nutzen
Das AppTemplate ist der empfohlene Weg, eigene Nodes zu entwickeln. Es bietet eine Docker-Compose-Umgebung mit Engine, Authority und LowCode.
git clone https://github.com/5minds/ProcessCube.AppTemplate.git
cd ProcessCube.AppTemplate
docker compose upEigene Node hinzufügen
- Neuen Ordner unter
apps/lowcode/src/nodes/anlegen - JS- und HTML-Datei erstellen
- Node in
apps/lowcode/src/package.jsonregistrieren - Container neu starten:
docker compose restart lowcode
Das AppTemplate mountet den Source-Code per Volume — Änderungen an HTML-Dateien werden nach einem Browser-Refresh wirksam. Für JS-Änderungen muss der Container neu gestartet werden.
Nodes lokal testen
Volume-Mount in Docker
Ohne AppTemplate können Sie Ihre Node per Volume direkt in einen LowCode-Container mounten:
services:
lowcode:
image: marketplace.processcube.io/processcube-io/processcube_lowcode:latest
ports:
- "1880:1880"
volumes:
- ./my-custom-node:/data/node_modules/my-custom-nodenpm link
Für lokale Entwicklung ohne Docker:
cd my-custom-node && npm link
cd ~/.node-red && npm link my-custom-node
node-redAuf npm veröffentlichen
npm login
npm publishCheckliste: Paketname mit node-red-contrib- Präfix, keywords enthält "node-red", Hilfetext vollständig, keine Secrets im Paket.
Weiterführende Informationen
- AppTemplate-Dokumentation — Vollständige Anleitung
- Best Practices — Bewährte Methoden
- Node-RED Node-Erstellung — Offizielle Dokumentation