NEWS
String Werte von Payload Gesamtwert extrahieren
-
Hallo,
ich habe einen Payload Wert als String der eine gewisse Gesamtlänge hat (wie in dem Beispiel 21 Zeichen).
Problem daran ist, dass diverse Werte in einem String enthalten sind. Diese möchte ich aber einzeln filtern. Die einzelnen Werte haben aber eine bestimmte Länge: Von 0 bis Zeichen 8 = Wert1, Zeichen 9 bis 16 = Wert 2, 17 bis 23 = Wert 3 usw.
Wie extrahiere ich hier die Werte heraus um sie danach als einzelnen Payload Wert zu haben?
Muss ich dies über eine Function machen (und wenn ja, wie?) oder gibt es hier auch eine andere Möglichkeit?Anbei der Flow:
[ { "id": "a55fe9ca249ccdfc", "type": "tab", "label": "Flow 2", "disabled": false, "info": "", "env": [] }, { "id": "6bc19d64a873f88d", "type": "inject", "z": "a55fe9ca249ccdfc", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "Teststring", "payload": "AAA 50 909 ", "payloadType": "str", "x": 380, "y": 260, "wires": [ [ "aba432bff1dc6402" ] ] }, { "id": "aba432bff1dc6402", "type": "debug", "z": "a55fe9ca249ccdfc", "name": "debug 21", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 580, "y": 260, "wires": [] } ]
So wäre zumindest mein Ansatz in einer Function Node. Aber wie gesagt, evtl. gibt es ja noch eine bessere/schönere Lösung.
let test = msg.payload; test = test.substring(0, 3); msg.payload = test; return msg;
Vielen Dank
-
@_r_a_l_f_
Ganz ohne Skripting ginge es so, vorausgesetzt, die Längen sind konstant:[ { "id": "dbc903ba0c1b42de", "type": "inject", "z": "256f595eacfe9f56", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": " 345 568 654", "payloadType": "str", "x": 330, "y": 220, "wires": [ [ "e58495251b0981a1" ] ] }, { "id": "24902cc7240130e1", "type": "change", "z": "256f595eacfe9f56", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "$trim(payload)", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 670, "y": 220, "wires": [ [ "46871b01accaa1e7" ] ] }, { "id": "e58495251b0981a1", "type": "split", "z": "256f595eacfe9f56", "name": "", "splt": "8", "spltType": "len", "arraySplt": 1, "arraySpltType": "len", "stream": false, "addname": "", "x": 490, "y": 220, "wires": [ [ "24902cc7240130e1" ] ] }, { "id": "46871b01accaa1e7", "type": "debug", "z": "256f595eacfe9f56", "name": "debug 9", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 860, "y": 220, "wires": [] } ]
-
@marc-berg Ok, Danke für den Ansatz aber leider sind die Werte unterschiedlich lang
-
@_r_a_l_f_ dann so, falls Leerzeichen dazwischen sein sollten
[ { "id": "dbc903ba0c1b42de", "type": "inject", "z": "256f595eacfe9f56", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": " 345 568 654", "payloadType": "str", "x": 550, "y": 280, "wires": [ [ "e58495251b0981a1" ] ] }, { "id": "e58495251b0981a1", "type": "split", "z": "256f595eacfe9f56", "name": "", "splt": " ", "spltType": "str", "arraySplt": 1, "arraySpltType": "len", "stream": false, "addname": "", "x": 710, "y": 280, "wires": [ [ "7411fd2b0d345418" ] ] }, { "id": "46871b01accaa1e7", "type": "debug", "z": "256f595eacfe9f56", "name": "debug 9", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1020, "y": 280, "wires": [] }, { "id": "7411fd2b0d345418", "type": "switch", "z": "256f595eacfe9f56", "name": "", "property": "payload", "propertyType": "msg", "rules": [ { "t": "neq", "v": "", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 1, "x": 850, "y": 280, "wires": [ [ "46871b01accaa1e7" ] ] } ]
-
Hier meine Lösung:
Die Längen des Strings oder die Anzahl Leerzeichen ist egal.
-
@marc-berg Danke dir für den Lösungsansatz
-
@mickym Danke dir schon mal. Gibt es hier auch die Möglichkeit den einzelnen Werten einen separaten Topic zu vergeben?
-
@_r_a_l_f_ sagte in String Werte von Payload Gesamtwert extrahieren:
@mickym Danke dir schon mal. Gibt es hier auch die Möglichkeit den einzelnen Werten einen separaten Topic zu vergeben?
Klar:
-
@mickym Cool, das schaut doch prima aus. Danke euch @Marc-Berg beiden
-
@mickym Falls keine Leerzeichen drin sind urn die Werte zu trennen, und die Positionen so fix sind, dann kannst natürlich auch die payload entsprechend splitten:
{"Wert1" : $trim($substring(payload, 0, 8)), "Wert2" : $trim($substring(payload, 8, 8)), "Wert3" : $trim($substring(payload, 16, 8))}