Node-red nodes to convert values to and from buffer/array. Supports Big/Little Endian, BCD, byte swapping and much more
npm install node-red-contrib-buffer-parsernode-red-contrib-buffer-parser
==============================
msg property (e.g from msg.payload.myInteger)
flow property (e.g from flow.myInteger)
global property (e.g from global.myInteger)
msg property (defaults to msg.payload)
msg property. e.g. you can send results out in msg.my.nested.property. This has the advantage of leaving the original payload in tact.
msg.payload)
1FE2D7FFBE
topic and payload
=> in the name to create object.properties e.g. motor1=>power will end up in msg.payload.motor1.power.'
.value and other contextual properties included (like the item specification). Use a fat arrow => in the name to create object.properties e.g. motor1=>power will end up in msg.payload.motor1.power.'
.value property and other contextual properties included (like the item specification)
0x7FFF could be used to remove the MSB or 0b1000000000000001 to keep only MSB and LSB)
0.01 would turn 9710 into 97.1
10 would turn 4.2 into 42
>> 4 would bit shift the value 0x0070 to 0x0007
+ 42 would add an offset of 42 to the final value (New in V3.1)
<< e.g. <<2 would left shift the parsed value 2 places
>> e.g. >>2 would right shift the parsed value 2 places
>>> e.g. >>>2 would zero-fill right shift the parsed value 2 places (returns a 32bit unsigned value)
+ e.g. +10 would add 10 to the parsed value
- e.g. -10 would deduct 10 from the parsed value
/ e.g. /10 would divide the parsed value by 10
e.g. *10 would multiply the parsed value by 10
e.g. 2 would raise the parsed value to the power of 2
^ e.g. ^0xf0 would XOR the parsed value with 0xf0
== e.g. ==10 would result in true if the parsed value was equal to 10
!= e.g. !=10 would result in false if the parsed value was equal to 10
!! e.g. !! would result in true if the parsed value was 1 (same as !!1 == true)
> e.g. >10 would result in true if the parsed value was greater than 10
< e.g. <10 would result in true if the parsed value was less than 10
0.01 would turn 9710 into 97.1 or a scale of 10 would turn 50 into 500)
[{"id":"1194a28a.49d0ad","type":"buffer-parser","z":"c70ba4a4.e7fb58","name":"","data":"payload","dataType":"msg","specification":"{\"options\":{\"byteSwap\":[\"swap16\"],\"resultType\":\"value\",\"singleResult\":false,\"msgProperty\":\"payload\"},\"items\":[{\"name\":\"plc1/production/alphabet\",\"type\":\"string\",\"offset\":0,\"length\":26},{\"name\":\"plc1/production/status/count\",\"type\":\"int\",\"offset\":25},{\"name\":\"plc1/production/status/sequence\",\"type\":\"bcd\",\"offset\":4},{\"name\":\"plc1/machine/status/runner/temperature\",\"type\":\"int16le\",\"offset\":26},{\"name\":\"plc1/machine/status/runner/speed\",\"type\":\"int16be\",\"offset\":26},{\"name\":\"plc1/machine/status/running\",\"type\":\"bool\",\"offset\":0,\"offsetbit\":0},{\"name\":\"plc1/machine/status/warning\",\"type\":\"bool\",\"offset\":0,\"offsetbit\":1},{\"name\":\"plc1/machine/status/fault\",\"type\":\"bool\",\"offset\":0,\"offsetbit\":2}]}","specificationType":"json","x":1110,"y":480,"wires":[["858b1ecf.77b58"]]},{"id":"858b1ecf.77b58","type":"debug","z":"c70ba4a4.e7fb58","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":1350,"y":480,"wires":[]},{"id":"c22cd2e8.52649","type":"inject","z":"c70ba4a4.e7fb58","name":"Fake PLC data 16bit Array","topic":"","payload":"[25185,25699,26213,26727,27241,27755,28013,28783,29297,29811,30325,30839,31353,256,512,768,1024,1280,1536,1792,2048,2304,2560,2816,3072,3597]","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":890,"y":480,"wires":[["1194a28a.49d0ad"]]},{"id":"970db39d.106a6","type":"comment","z":"c70ba4a4.e7fb58","name":"take a array of 16bit values, byte reverse, split out several values and transmit individual messages with topic + payload","info":"","x":1160,"y":440,"wires":[]}]
`
$3
Screen shot - the flow
!example2a
Screen shot - the output
!example2b
Flow...
`
[{"id":"1523dd03.6332f3","type":"buffer-parser","z":"c70ba4a4.e7fb58","name":"","data":"payload","dataType":"msg","specification":"{\"options\":{\"byteSwap\":[\"swap16\"],\"resultType\":\"object\",\"singleResult\":true,\"msgProperty\":\"data\"},\"items\":[{\"name\":\"alphabet\",\"type\":\"string\",\"offset\":0,\"length\":26},{\"name\":\"single byte pos 4\",\"type\":\"int\",\"offset\":4},{\"name\":\"bcd equiv\",\"type\":\"bcd\",\"offset\":4,\"length\":5},{\"name\":\"Array[6] of int16le\",\"type\":\"int16le\",\"offset\":26,\"length\":6},{\"name\":\"Array[6] of int16be\",\"type\":\"int16be\",\"offset\":26,\"length\":6},{\"name\":\"32 bools\",\"type\":\"bool\",\"offset\":0,\"length\":32},{\"name\":\"Array[4] of 16bits\",\"type\":\"16bit\",\"offset\":0,\"length\":4}]}","specificationType":"json","x":1110,"y":560,"wires":[["a3051c67.b82ad"]]},{"id":"a3051c67.b82ad","type":"debug","z":"c70ba4a4.e7fb58","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"data","targetType":"msg","x":1340,"y":560,"wires":[]},{"id":"9b72f1f5.1aacc","type":"inject","z":"c70ba4a4.e7fb58","name":"Fake PLC data 16bit Array","topic":"","payload":"[25185,25699,26213,26727,27241,27755,28013,28783,29297,29811,30325,30839,31353,256,512,768,1024,1280,1536,1792,2048,2304,2560,2816,3072,3597]","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":890,"y":560,"wires":[["1523dd03.6332f3"]]},{"id":"a9a2dd4c.118f9","type":"comment","z":"c70ba4a4.e7fb58","name":"take a array of 16bit values, byte reverse, split out several values and transmit one message with named objects in msg.data","info":"","x":1180,"y":520,"wires":[]}]
`
Install
$3
The simplest method is to install via the pallet manager in node red. Simply search for node-red-contrib-buffer-parser then click install
$3
Run the following command in the root directory of your Node-RED install (usually ~/.node-red or %userprofile%\.node-red`)