Pick-by-scan: Open Source Kommissionierung mit Node-RED

Kommissionierablauf in Node-RED
26. April 2024

Pick-by-Scan ist in der Praxis die am weitesten verbreitete Form der beleglosen Kommissionierung. Seit den Anfängen mit Barcodes und der Einführung des EAN in Europa im Jahr 1976 ist der Einsatz von Strichcodes im Alltag üblich geworden. Mit der zunehmenden Verbreitung von Smartphones und entsprechenden Apps hat das Scannen von Barcodes einen zusätzlichen Aufschwung erfahren. Fast jedes Produkt ist heute über einen scanbaren Code identifizierbar und damit ideal für die Kommissionierung geeignet – vorausgesetzt, dass das entsprechende Pick-by-Scan Gerät vorhanden ist.

In diesem Blog-Artikel geht es um die beleglose Kommissionierung von Stücklisten durch die Verwendung von netzwerkfähigen Barcode-Scannern und Node-RED. Wie ein handelsüblicher Scanner netzwerkfähig gemacht werden kann, wurde bereits im vorherigen Beitrag beschrieben.

Die Systemgrenzen sind dabei wie folgt definiert: Wir gehen davon aus, dass unser Node-RED bereits eine bestehende Schnittstelle zu unserem ERP-System verfügt. Dementsprechend liegen Auftragsnummern vor, unter der Stücklisten zu finden ist. Artikelscans erhält Node-RED durch die im vorherigen Artikel beschriebene Netzwerkschnittstelle.

Empfangen von Scan-Codes durch Barcode-Scanner
Empfangen von Scans über das Netzwerk

Um eine Visualisierung für die Kommissionierung zu erzeugen, erstellen wir mithilfe von Node-RED einen Webserver, der den Kommissionerauftrag in Form von HTML zurück liefert. Für die Bereitstellung eines dynamischen Kommissionerauftrags ist folgendes erforderlich:

Der Aufruf einer URL mithilfe des Endgeräts: In der HTML-Seite (Websocket Client) wird Javascript benutzt um einen Websocket zu öffnen und eingehende Nachrichten zu verarbeiten. Um Daten an diesen Websocket senden zu können, wird in Node-RED ein websocket out. Hierüber wird immer der aktuellste Zustand des Kommissionerauftrages an den Client gesendet.

Die HTML-Seite kann aus einer Kombination aus http-in-Nodes (hier laufen die GET-Request-Anfragen ein), eines template-Nodes (hier wird das initiale HTML definiert, welches unter anderem das Javascript zur dynamischen Aktualisierung enthält) sowie einem http-response-Node erstellt werden.

Bereitstellung einer Internetseite für die Visualisierung eines Kommissioner-Auftrags in der Logistik

Bereits jetzt kann die URL von Node-RED unter Angabe des im http-in-Node definierten Pfads aufgerufen werden:

In diesem Zustand wartet das System auf das Scannen einer aktuellen Auftragsnummer. Alternativ könnte hier beispielsweise eine Liste bereitgestellt werden, bei denen eine Auftragsnummer aus einer Liste gewählt oder immer der nächste, freie Auftrag automatisch gestartet werden. Dank der Flexibilität von Node-RED kann das Verhalten an die vorhandenen Kommissionerprozesse angepasst werden. Die Kommunikation zwischen dem Client (HTML-Seite) und Node-RED wird dementsprechend über ein Websocket gelöst. Der Client verbindet sich also mit Node-RED und wartet auf die entsprechenden Informationen. Sobald der Client aktiv ist, wird dies durch ein connected-Hinweis in der Oberfläche ersichtlich:

Der Inject-Node ist zunächst Platzhalter für die Business-Logik, die implementiert werden muss. Dieser Node wird im nächsten Schritt durch die Ausgabe eines QR-Code-Scanners ausgetauscht. Ein Klick auf Inject führt zu diesem Zeitpunkt nur, dass ein Template mit einer generischen Platzhalter-Tabelle an den Client gesendet wird:

Zu Testzwecken wird im Kontext des Flows eine globale Variable eingeführt, die Auftragsdaten beinhaltet. Eine Schnittstellenanbindung an ein ERP-System werden wir in einem zukünftigen Beitrag genauer behandeln.

Setzen einer globalen Variable für Kommissioneraufträge
Setzen einer globalen Variable mit Auftragsdaten
Orderobjekt im Kontext des Flows
Auftragsobjekt im Kontext des Flows

Im vorherigen Blogbeitrag wurde gezeigt, wie ein USB-Handscanner an Node-RED über das Netzwerk angebunden werden kann. Diese Anbindung wird nun in den vorhandenen Flow eingefügt. Wird nun eine Auftragsnummer gescannt, aktualisiert sich der Client dahingehend, dass die Stückliste des gescannten Auftrags angezeigt wird. Über das Template wird die Tabelle generiert und an den Websocket gesendet. Diese Liste zeigt dem Logistikmitarbeiter, welche Teile in welcher Anzahl kommissioniert werden müssen. Die Spalte ganz rechts bzw. die Farbe der Zeile zeigt an, ob das Bauteil bereits kommissioniert worden ist. Sobald eine weitere Bauteilnummer gescannt wird, wird die entsprechende Zeile grün eingefärbt.

Teilekommissionierung durch Scans in Node-RED

Nach und nach können nun die weiteren Bauteile kommissioniert werden. Der Bauteilstatus wird im Auftragsobjekt entsprechend gesetzt und die Stückliste am Client aktualisiert. Sobald alle Bauteile kommissioniert sind, würde eine Rückmeldung an das ERP-System erfolgen, das Auftragsobjekt aus Node-RED wird entfernt und ein neuer Auftrag kann gestartet werden.

Der vollständige Ablauf für Node-RED, inklusive Templates, ist im Code-Editor zu finden.

[{"id":"c5036d3a16ef5d3a","type":"tab","label":"Flow 2","disabled":false,"info":"","env":[]},{"id":"fc9dbfe6b434ef7a","type":"tcp in","z":"c5036d3a16ef5d3a","name":"Scanner Logistik 01","server":"client","host":"127.0.0.1","port":"5000","datamode":"stream","datatype":"buffer","newline":"","topic":"","trim":false,"base64":false,"tls":"","x":230,"y":240,"wires":[["0aff856e738603d4"]]},{"id":"0aff856e738603d4","type":"function","z":"c5036d3a16ef5d3a","name":"Buffer Data","func":"var buffer = context.get('buffer') || '';\n\nvar inMessage = msg.payload.toString(); \n\nbuffer += inMessage;\n\nif (!buffer.startsWith(String.fromCharCode(0x02))){\n    buffer = ''; \n    context.set('buffer', buffer);\n    return null\n}\nelse if (buffer.startsWith(String.fromCharCode(0x02)) && buffer.endsWith(String.fromCharCode(0x03))) {\n    msg.payload = buffer;\n    buffer = ''; \n    context.set('buffer', buffer);\n    return msg; \n} else {\n    context.set('buffer', buffer);\n    return null;\n}\n\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":450,"y":240,"wires":[["391da12ccd5f6b6b"]]},{"id":"68456a2968571188","type":"http in","z":"c5036d3a16ef5d3a","name":"","url":"/kommi-log-01","method":"get","upload":false,"swaggerDoc":"","x":230,"y":140,"wires":[["aaefaee403272bed"]]},{"id":"e7c7bd91595c97b4","type":"http response","z":"c5036d3a16ef5d3a","name":"","statusCode":"","headers":{},"x":650,"y":140,"wires":[]},{"id":"aaefaee403272bed","type":"template","z":"c5036d3a16ef5d3a","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<style>\n/* Reset für Standard-Stile */\nbody, h1, p {\n    margin: 0;\n    padding: 0;\n}\n\n/* Gesamtes Seitenlayout */\nbody {\n    font-family: Arial, sans-serif;\n    line-height: 1.6;\n    background-color: #f4f4f4;\n    color: #333;\n    padding: 20px;\n}\n\n.container {\n    max-width: 800px;\n    margin: 0 auto;\n    background-color: #fff;\n    padding: 20px;\n    border-radius: 8px;\n    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);\n}\n\n/* Überschriften */\nh1, h2, h3 {\n    color: #333;\n    margin-bottom: 20px;\n    text-align: center;\n}\n\n/* Links */\na {\n    color: #007bff;\n    text-decoration: none;\n}\n\na:hover {\n    text-decoration: underline;\n}\n\n/* Buttons */\n.button {\n    display: inline-block;\n    padding: 10px 20px;\n    background-color: #007bff;\n    color: #fff;\n    border: none;\n    border-radius: 4px;\n    cursor: pointer;\n}\n\n.button:hover {\n    background-color: #0056b3;\n}\n\n/* Formularelemente */\ninput[type=\"text\"],\ninput[type=\"email\"],\ntextarea {\n    width: 100%;\n    padding: 10px;\n    margin-bottom: 10px;\n    border: 1px solid #ccc;\n    border-radius: 4px;\n    box-sizing: border-box;\n}\n\ninput[type=\"submit\"] {\n    background-color: #007bff;\n    color: #fff;\n    border: none;\n    padding: 10px 20px;\n    border-radius: 4px;\n    cursor: pointer;\n}\n\ninput[type=\"submit\"]:hover {\n    background-color: #0056b3;\n}\n\n/* Responsive Design */\n@media (max-width: 600px) {\n    .container {\n        padding: 10px;\n    }\n}\n/* Tabellen */\n.table-container {\n    overflow-x: auto; /* Horizontales Scrollen für breite Tabellen */\n    margin-bottom: 20px; /* Abstand unter der Tabelle */\n}\n\ntable {\n    width: 100%; /* Volle Breite der Tabelle */\n    border-collapse: collapse; /* Kein Abstand zwischen den Zellen */\n    margin-bottom: 20px; /* Abstand unter der Tabelle */\n}\n\nth, td {\n    padding: 12px; /* Innenabstand der Zellen */\n    text-align: left; /* Linksbündige Ausrichtung des Textes */\n    border-bottom: 1px solid #ddd; /* Unterstrich zwischen den Zellen */\n}\n\nth {\n    background-color: #f2f2f2; /* Hintergrundfarbe der Überschriften */\n    color: #333; /* Textfarbe der Überschriften */\n}\n\n/* Zebra-Streifen für Zeilen */\ntr:nth-child(even) {\n    background-color: #f9f9f9; /* Hintergrundfarbe für gerade Zeilen */\n}\n\ntr:hover {\n    background-color: #f1f1f1; /* Hintergrundfarbe bei Hover über Zeilen */\n}\n</style>\n<div id=\"content\">\n    <h1>Bitte Auftragsnummer scannen</h1>\n    <!-- Das hier wird dynamisch ersetzt -->\n</div>\n<script>\nconst socket = new WebSocket('ws://127.0.0.1:1880/websocket');\n\nsocket.onopen = function(event) {\n    console.log('WebSocket connection opened');\n};\n\nsocket.onmessage = function(event) {\n    console.log('Received message:', event.data.message);\n    document.getElementById('content').innerHTML = event.data;\n};\n\nsocket.onclose = function(event) {\n    console.log('WebSocket connection closed');\n};\n</script>","output":"str","x":440,"y":140,"wires":[["e7c7bd91595c97b4"]]},{"id":"84f8c4f50898db8e","type":"websocket out","z":"c5036d3a16ef5d3a","name":"","server":"3c699c09f5a20823","client":"","x":1060,"y":240,"wires":[]},{"id":"7ffddf0feebf24cb","type":"template","z":"c5036d3a16ef5d3a","name":"","field":"payload","fieldType":"msg","format":"html","syntax":"mustache","template":"<table>\n    <thead>\n        <tr>\n            <th>Bauteilnummer</th>\n            <th>Bauteilname</th>\n            <th>Kommissionierbereich</th>\n            <th>Lieferant</th>\n            <th>Anzahl</th>\n            <th>Einheit</th>\n            <th>Standort</th>\n            <th>Identnummer</th>\n            <th>Seriennummer</th>\n            <th>Status</th>\n        </tr>\n    </thead>\n    <tbody>\n        {{#payload.bauteile}}\n        <tr style=\"background-color: {{#status}} lightgreen {{/status}}\">\n            <td>{{ bauteilnummer }}</td>\n            <td>{{ bauteilname }}</td>\n            <td>{{ kommissionierbereich }}</td>\n            <td>{{ lieferant }}</td>\n            <td>{{ anzahl }}</td>\n            <td>{{ einheit }}</td>\n            <td>{{ standort }}</td>\n            <td>{{ identnummer }}</td>\n            <td>{{ seriennummer }}</td>\n            <td>{{ status }}</td> <!-- Anzeige des Status als Text -->\n        </tr>\n        {{/payload.bauteile}}\n    </tbody>\n</table>","output":"str","x":880,"y":240,"wires":[["84f8c4f50898db8e"]]},{"id":"391da12ccd5f6b6b","type":"function","z":"c5036d3a16ef5d3a","name":"Auftragsmanagement","func":"var orderobj = flow.get('order');\nvar scan = msg.payload;\n\nfunction findeAuftragMitAuftragsnummer(auftraege, auftragsnummer) {\n  for (const auftrag of auftraege) {\n    if (auftrag.auftragsnummer === auftragsnummer) {\n      return auftrag;\n    }\n  }\n  return null;\n}\n\nif (context.get(\"orderStatus\") == null || context.get(\"orderStatus\") == false)\n{\n    // Auftragsnummer wurde gescannt\n    context.set(\"activeOrder\", msg.payload)\n    context.set(\"orderStatus\", true)\n    var bom = findeAuftragMitAuftragsnummer(orderobj['auftraege'], msg.payload)\n    msg.payload = bom\n    node.log(bom)\n}\nelse{\nfor (var i = 0; i < orderobj.auftraege.length; i++) {\n    if (orderobj.auftraege[i].auftragsnummer === context.get(\"activeOrder\")) {\n        // Durchsuche die Bauteile dieses Auftrags\n        msg.payload = orderobj.auftraege[i]\n        for (var j = 0; j < orderobj.auftraege[i].bauteile.length; j++) {\n            // Finde das Bauteil mit der übergebenen Nummer und setze den Status auf true\n            if (orderobj.auftraege[i].bauteile[j].bauteilnummer === scan) {\n                orderobj.auftraege[i].bauteile[j].status = true;\n                break; // Beende die Schleife, sobald das Bauteil gefunden wurde\n            }\n        }\n        break; // Beende die äußere Schleife, da der Auftrag gefunden wurde\n    }\n\n}\n    }\n\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":240,"wires":[["7ffddf0feebf24cb","0a03a1b73d9c26d8"]]},{"id":"2e1350d65c2ced12","type":"inject","z":"c5036d3a16ef5d3a","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"A123","payloadType":"str","x":450,"y":300,"wires":[["391da12ccd5f6b6b"]]},{"id":"26a875da1e54c622","type":"inject","z":"c5036d3a16ef5d3a","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":80,"wires":[["5fc0dd5e08c90c68"]]},{"id":"5fc0dd5e08c90c68","type":"function","z":"c5036d3a16ef5d3a","name":"set order","func":"var orderjson = {\n  \"auftraege\": [\n    {\n      \"auftragsnummer\": \"A123\",\n      \"bauteile\": [\n        {\n          \"bauteilnummer\": \"B001\",\n          \"bauteilname\": \"Schraube\",\n          \"kommissionierbereich\": \"Montage\",\n          \"lieferant\": \"Lieferant X\",\n          \"anzahl\": 50,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 1\",\n          \"identnummer\": \"ID001\",\n          \"seriennummer\": \"SN001\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B002\",\n          \"bauteilname\": \"Gehäuse\",\n          \"kommissionierbereich\": \"Produktion\",\n          \"lieferant\": \"Lieferant Y\",\n          \"anzahl\": 20,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 2\",\n          \"identnummer\": \"ID002\",\n          \"seriennummer\": \"SN002\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B003\",\n          \"bauteilname\": \"Platine\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Z\",\n          \"anzahl\": 10,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 3\",\n          \"identnummer\": \"ID003\",\n          \"seriennummer\": \"SN003\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B004\",\n          \"bauteilname\": \"Motor\",\n          \"kommissionierbereich\": \"Werkstatt\",\n          \"lieferant\": \"Lieferant W\",\n          \"anzahl\": 30,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 4\",\n          \"identnummer\": \"ID004\",\n          \"seriennummer\": \"SN004\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B005\",\n          \"bauteilname\": \"Dichtung\",\n          \"kommissionierbereich\": \"Montage\",\n          \"lieferant\": \"Lieferant X\",\n          \"anzahl\": 15,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 1\",\n          \"identnummer\": \"ID005\",\n          \"seriennummer\": \"SN005\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B006\",\n          \"bauteilname\": \"Schalter\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Z\",\n          \"anzahl\": 25,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 3\",\n          \"identnummer\": \"ID006\",\n          \"seriennummer\": \"SN006\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B007\",\n          \"bauteilname\": \"Kabel\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Z\",\n          \"anzahl\": 40,\n          \"einheit\": \"Meter\",\n          \"standort\": \"Lager 3\",\n          \"identnummer\": \"ID007\",\n          \"seriennummer\": \"SN007\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B008\",\n          \"bauteilname\": \"Lampe\",\n          \"kommissionierbereich\": \"Montage\",\n          \"lieferant\": \"Lieferant X\",\n          \"anzahl\": 12,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 1\",\n          \"identnummer\": \"ID008\",\n          \"seriennummer\": \"SN008\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B009\",\n          \"bauteilname\": \"Sensor\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Y\",\n          \"anzahl\": 5,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 2\",\n          \"identnummer\": \"ID009\",\n          \"seriennummer\": \"SN009\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B010\",\n          \"bauteilname\": \"Schraubendreher\",\n          \"kommissionierbereich\": \"Werkstatt\",\n          \"lieferant\": \"Lieferant W\",\n          \"anzahl\": 8,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 4\",\n          \"identnummer\": \"ID010\",\n          \"seriennummer\": \"SN010\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B011\",\n          \"bauteilname\": \"Draht\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Z\",\n          \"anzahl\": 30,\n          \"einheit\": \"Meter\",\n          \"standort\": \"Lager 3\",\n          \"identnummer\": \"ID011\",\n          \"seriennummer\": \"SN011\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B012\",\n          \"bauteilname\": \"Stecker\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Y\",\n          \"anzahl\": 18,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 2\",\n          \"identnummer\": \"ID012\",\n          \"seriennummer\": \"SN012\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B013\",\n          \"bauteilname\": \"Gehäuseabdeckung\",\n          \"kommissionierbereich\": \"Produktion\",\n          \"lieferant\": \"Lieferant X\",\n          \"anzahl\": 5,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 1\",\n          \"identnummer\": \"ID013\",\n          \"seriennummer\": \"SN013\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B014\",\n          \"bauteilname\": \"Leiterplatte\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Z\",\n          \"anzahl\": 12,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 3\",\n          \"identnummer\": \"ID014\",\n          \"seriennummer\": \"SN014\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B015\",\n          \"bauteilname\": \"Schalterplatte\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Y\",\n          \"anzahl\": 7,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 2\",\n          \"identnummer\": \"ID015\",\n          \"seriennummer\": \"SN015\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B016\",\n          \"bauteilname\": \"Dichtungsring\",\n          \"kommissionierbereich\": \"Montage\",\n          \"lieferant\": \"Lieferant X\",\n          \"anzahl\": 20,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 1\",\n          \"identnummer\": \"ID016\",\n          \"seriennummer\": \"SN016\",\n          \"status\": true\n        }\n      ]\n    },\n\t{\n      \"auftragsnummer\": \"A124\",\n      \"bauteile\": [\n        {\n          \"bauteilnummer\": \"B001\",\n          \"bauteilname\": \"Schraube\",\n          \"kommissionierbereich\": \"Montage\",\n          \"lieferant\": \"Lieferant X\",\n          \"anzahl\": 50,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 1\",\n          \"identnummer\": \"ID001\",\n          \"seriennummer\": \"SN001\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B002\",\n          \"bauteilname\": \"Gehäuse\",\n          \"kommissionierbereich\": \"Produktion\",\n          \"lieferant\": \"Lieferant Y\",\n          \"anzahl\": 20,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 2\",\n          \"identnummer\": \"ID002\",\n          \"seriennummer\": \"SN002\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B003\",\n          \"bauteilname\": \"Platine\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Z\",\n          \"anzahl\": 10,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 3\",\n          \"identnummer\": \"ID003\",\n          \"seriennummer\": \"SN003\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B004\",\n          \"bauteilname\": \"Motor\",\n          \"kommissionierbereich\": \"Werkstatt\",\n          \"lieferant\": \"Lieferant W\",\n          \"anzahl\": 30,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 4\",\n          \"identnummer\": \"ID004\",\n          \"seriennummer\": \"SN004\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B005\",\n          \"bauteilname\": \"Dichtung\",\n          \"kommissionierbereich\": \"Montage\",\n          \"lieferant\": \"Lieferant X\",\n          \"anzahl\": 15,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 1\",\n          \"identnummer\": \"ID005\",\n          \"seriennummer\": \"SN005\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B006\",\n          \"bauteilname\": \"Schalter\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Z\",\n          \"anzahl\": 25,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 3\",\n          \"identnummer\": \"ID006\",\n          \"seriennummer\": \"SN006\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B007\",\n          \"bauteilname\": \"Kabel\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Z\",\n          \"anzahl\": 40,\n          \"einheit\": \"Meter\",\n          \"standort\": \"Lager 3\",\n          \"identnummer\": \"ID007\",\n          \"seriennummer\": \"SN007\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B008\",\n          \"bauteilname\": \"Lampe\",\n          \"kommissionierbereich\": \"Montage\",\n          \"lieferant\": \"Lieferant X\",\n          \"anzahl\": 12,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 1\",\n          \"identnummer\": \"ID008\",\n          \"seriennummer\": \"SN008\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B009\",\n          \"bauteilname\": \"Sensor\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Y\",\n          \"anzahl\": 5,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 2\",\n          \"identnummer\": \"ID009\",\n          \"seriennummer\": \"SN009\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B010\",\n          \"bauteilname\": \"Schraubendreher\",\n          \"kommissionierbereich\": \"Werkstatt\",\n          \"lieferant\": \"Lieferant W\",\n          \"anzahl\": 8,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 4\",\n          \"identnummer\": \"ID010\",\n          \"seriennummer\": \"SN010\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B011\",\n          \"bauteilname\": \"Draht\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Z\",\n          \"anzahl\": 30,\n          \"einheit\": \"Meter\",\n          \"standort\": \"Lager 3\",\n          \"identnummer\": \"ID011\",\n          \"seriennummer\": \"SN011\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B012\",\n          \"bauteilname\": \"Stecker\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Y\",\n          \"anzahl\": 18,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 2\",\n          \"identnummer\": \"ID012\",\n          \"seriennummer\": \"SN012\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B013\",\n          \"bauteilname\": \"Gehäuseabdeckung\",\n          \"kommissionierbereich\": \"Produktion\",\n          \"lieferant\": \"Lieferant X\",\n          \"anzahl\": 5,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 1\",\n          \"identnummer\": \"ID013\",\n          \"seriennummer\": \"SN013\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B014\",\n          \"bauteilname\": \"Leiterplatte\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Z\",\n          \"anzahl\": 12,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 3\",\n          \"identnummer\": \"ID014\",\n          \"seriennummer\": \"SN014\",\n          \"status\": true\n        },\n        {\n          \"bauteilnummer\": \"B015\",\n          \"bauteilname\": \"Schalterplatte\",\n          \"kommissionierbereich\": \"Elektronik\",\n          \"lieferant\": \"Lieferant Y\",\n          \"anzahl\": 7,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 2\",\n          \"identnummer\": \"ID015\",\n          \"seriennummer\": \"SN015\",\n          \"status\": false\n        },\n        {\n          \"bauteilnummer\": \"B016\",\n          \"bauteilname\": \"Dichtungsring\",\n          \"kommissionierbereich\": \"Montage\",\n          \"lieferant\": \"Lieferant X\",\n          \"anzahl\": 20,\n          \"einheit\": \"Stück\",\n          \"standort\": \"Lager 1\",\n          \"identnummer\": \"ID016\",\n          \"seriennummer\": \"SN016\",\n          \"status\": true\n        }\n      ]\n    }\n  ]\n  \n}\n\nflow.set('order', orderjson)\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":440,"y":80,"wires":[[]]},{"id":"0a03a1b73d9c26d8","type":"debug","z":"c5036d3a16ef5d3a","name":"debug 2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":880,"y":300,"wires":[]},{"id":"edf6a11ec356c382","type":"inject","z":"c5036d3a16ef5d3a","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"B002","payloadType":"str","x":450,"y":340,"wires":[["391da12ccd5f6b6b"]]},{"id":"c34df96f18585a84","type":"inject","z":"c5036d3a16ef5d3a","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"B003","payloadType":"str","x":450,"y":380,"wires":[["391da12ccd5f6b6b"]]},{"id":"c6975bc7df920f9e","type":"inject","z":"c5036d3a16ef5d3a","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"B004","payloadType":"str","x":450,"y":420,"wires":[["391da12ccd5f6b6b"]]},{"id":"3c699c09f5a20823","type":"websocket-listener","path":"/websocket","wholemsg":"false"}]