Skip to content

Commit 1338ffb

Browse files
committed
changes: major changes to the way deltas are flattened
1 parent bab43a0 commit 1338ffb

13 files changed

+113
-52
lines changed

README.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,25 @@ See the examples folder for some sample usage.
2121

2222
## signalk-on-delta
2323

24-
Input that sends messages for every delta the server receives
24+
Input that sends messages for every delta the server receives. Optionally flatten the deltas (see signalk-flatten-delta below)
2525

2626
## signalk-subscribe
2727

28-
Input that sends messages for every delta from the given path
28+
Input that sends messages for every delta from the configured path. Optionally flatten the deltas (see signalk-flatten-delta below)
2929

3030
## signalk-flatten-delta
3131

3232
Function that flatten deltas from signalk-on-delta.
3333

34-
The output payload with be have path, value, source and context:
34+
The output payload will be the value and the topic will be the path, The payload will also include context, $source, and source.
3535

3636
```
3737
{
38-
"path":"navigation.speedOverGround",
39-
"value":2.45,
40-
"source":{"label":"actisense","type":"NMEA2000","pgn":129026,"src":"3",
41-
"context": "vessels.self"
38+
"topic": "navigation.speedOverGround",
39+
"payload": 2.45,
40+
"source": {"label":"actisense","type":"NMEA2000","pgn":129026,"src":"3"},
41+
"context": "vessels.self",
42+
"$source": "actisense.3"
4243
}
4344
```
4445

examples/adjust-depth.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"id":"8bdea88.abe9658","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"dfa58004.e5628","type":"signalk-on-delta","z":"8bdea88.abe9658","name":"","x":100,"y":60,"wires":[["14c76be4.78a604"]]},{"id":"14c76be4.78a604","type":"signalk-flatten-delta","z":"8bdea88.abe9658","name":"","x":240,"y":120,"wires":[["e311e40f.fad3b8"]]},{"id":"e311e40f.fad3b8","type":"switch","z":"8bdea88.abe9658","name":"if vessels.self","property":"payload.context","propertyType":"msg","rules":[{"t":"eq","v":"vessels.self","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":370,"y":180,"wires":[["fdeb876e.0b0c6"]]},{"id":"fdeb876e.0b0c6","type":"switch","z":"8bdea88.abe9658","name":"if depth.belowSurface","property":"payload.path","propertyType":"msg","rules":[{"t":"eq","v":"environment.depth.belowSurface","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":540,"y":240,"wires":[["ca4ac3ec.4bba3"]]},{"id":"ca4ac3ec.4bba3","type":"change","z":"8bdea88.abe9658","name":"Add 1.0","rules":[{"t":"set","p":"payload","pt":"msg","to":"{ \"path\": payload.path, \"value\": payload.value + 1.0}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":600,"y":320,"wires":[["e1a68487.819c28"]]},{"id":"e1a68487.819c28","type":"signalk-send-pathvalue","z":"8bdea88.abe9658","name":"","x":620,"y":420,"wires":[]}]
1+
[{"id":"8bdea88.abe9658","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"ca4ac3ec.4bba3","type":"change","z":"8bdea88.abe9658","name":"Add 1.0","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload + 1.0","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":420,"y":60,"wires":[["e1a68487.819c28"]]},{"id":"e1a68487.819c28","type":"signalk-send-pathvalue","z":"8bdea88.abe9658","name":"","x":630,"y":60,"wires":[]},{"id":"298fb1f.153a74e","type":"signalk-subscribe","z":"8bdea88.abe9658","name":"environment.depth.belowSurface","flatten":true,"context":"vessels.self","path":"environment.depth.belowSurface","period":1000,"x":170,"y":60,"wires":[["ca4ac3ec.4bba3"]]}]

examples/high-wind-speed-alarm.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"id":"38336563.2cc8e2","type":"tab","label":"Flow 2","disabled":false,"info":""},{"id":"131f22b7.c357fd","type":"signalk-on-delta","z":"38336563.2cc8e2","name":"","x":120,"y":140,"wires":[["15b745ec.13bfca"]]},{"id":"d212f3ad.6ac1b","type":"switch","z":"38336563.2cc8e2","name":"if wind speed","property":"payload.path","propertyType":"msg","rules":[{"t":"eq","v":"environment.wind.speedApparent","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":140,"wires":[["2d45410c.6ca7ae"]]},{"id":"2d45410c.6ca7ae","type":"switch","z":"38336563.2cc8e2","name":"","property":"payload.value","propertyType":"msg","rules":[{"t":"gt","v":"5.14","vt":"str"},{"t":"lte","v":"5.14","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":470,"y":320,"wires":[["a5b5aa6.69c9258"],["14796038.fb8e78"]]},{"id":"15b745ec.13bfca","type":"signalk-flatten-delta","z":"38336563.2cc8e2","name":"","x":340,"y":140,"wires":[["d212f3ad.6ac1b"]]},{"id":"a5b5aa6.69c9258","type":"signalk-send-notification","z":"38336563.2cc8e2","name":"send alarm","path":"highWindSpeed","state":"alarm","message":"The wind speed is over 10 knots","visual":true,"sound":true,"x":650,"y":280,"wires":[]},{"id":"14796038.fb8e78","type":"signalk-send-notification","z":"38336563.2cc8e2","name":"clear alarm","path":"highWindSpeed","state":"normal","message":"The wind speed is normal","visual":true,"sound":true,"x":650,"y":380,"wires":[]}]
1+
[{"id":"38336563.2cc8e2","type":"tab","label":"Flow 2","disabled":false,"info":""},{"id":"2d45410c.6ca7ae","type":"switch","z":"38336563.2cc8e2","name":"if over 5.14","property":"payload","propertyType":"msg","rules":[{"t":"gt","v":"5.14","vt":"str"},{"t":"lte","v":"5.14","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":430,"y":100,"wires":[["a5b5aa6.69c9258"],["14796038.fb8e78"]]},{"id":"a5b5aa6.69c9258","type":"signalk-send-notification","z":"38336563.2cc8e2","name":"send alarm","path":"highWindSpeed","state":"alarm","message":"The wind speed is over 10 knots","visual":true,"sound":true,"x":630,"y":60,"wires":[]},{"id":"14796038.fb8e78","type":"signalk-send-notification","z":"38336563.2cc8e2","name":"clear alarm","path":"highWindSpeed","state":"normal","message":"The wind speed is normal","visual":true,"sound":true,"x":630,"y":160,"wires":[]},{"id":"ef25bd1f.baa4b","type":"signalk-subscribe","z":"38336563.2cc8e2","name":"environment.wind.speedApparent","flatten":true,"context":"vessels.self","path":"environment.wind.speedApparent","period":"5000","x":180,"y":100,"wires":[["2d45410c.6ca7ae"]]}]

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"license": "Apache-2.0",
1111
"node-red": {
1212
"nodes": {
13+
"signalk-subscribe": "signalk-subscribe.js",
1314
"signalk-on-delta": "signalk-on-delta.js",
1415
"signalk-notification-": "signalk-notification.js",
1516
"signalk-flatten-delta": "signalk-flatten-delta.js",
@@ -18,8 +19,7 @@
1819
"signalk-send-put": "signalk-send-put.js",
1920
"signalk-send-notification": "signalk-send-notification.js",
2021
"signalk-send-nmea2000": "signalk-send-nmea2000.js",
21-
"signalk-send-nmea0183": "signalk-send-nmea0183.js",
22-
"signalk-subscribe": "signalk-subscribe.js"
22+
"signalk-send-nmea0183": "signalk-send-nmea0183.js"
2323
}
2424
}
2525
}

screens/adjust-depth.jpeg

-78.6 KB
Loading

screens/high-wind-speed-alarm.jpeg

-19.3 KB
Loading

signalk-flatten-delta.html

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,15 @@
2424
<script type="text/x-red" data-help-name="signalk-flatten-delta">
2525
<p>Function that flatten deltas from signalk-on-delta.</p>
2626

27-
<p>The output payload with be have path, value, source and context:</p>
27+
<p>The output payload will be the value and the topic will be the path, The payload will also include context, $source, and source. </p>
2828

2929
<pre><code class="javascript">
30-
{
31-
"path":"navigation.speedOverGround",
32-
"value":2.45,
33-
"source":{"label":"actisense","type":"NMEA2000","pgn":129026,"src":"3",
34-
"context": "vessels.self"
35-
}
30+
{
31+
"topic": "navigation.speedOverGround",
32+
"payload": 2.45,
33+
"source": {"label":"actisense","type":"NMEA2000","pgn":129026,"src":"3"},
34+
"context": "vessels.self",
35+
"$source": "actisense.3"
36+
}
3637
</code></pre>
3738
</script>

signalk-flatten-delta.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@ module.exports = function(RED) {
1010
delta.updates.forEach(update => {
1111
if ( update.values ) {
1212
update.values.forEach(pathValue => {
13-
pathValue.$source = update.$source
14-
pathValue.source = update.source
15-
pathValue.context = delta.context
16-
node.send({ payload: pathValue, topic: pathValue.path})
13+
node.send({
14+
$source: update.$source,
15+
source: update.source,
16+
context: delta.context,
17+
payload: pathValue.value,
18+
topic: pathValue.path
19+
})
1720
})
1821
}
1922
})

signalk-on-delta.html

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
category: 'input',
44
color: '#ffcc01',
55
defaults: {
6-
name: {value:""}
6+
name: {value:""},
7+
context: {value: "vessels.self"},
8+
flatten: {value: true},
79
},
810
inputs:0,
911
outputs:1,
@@ -15,10 +17,18 @@
1517
</script>
1618

1719
<script type="text/x-red" data-template-name="signalk-on-delta">
18-
<div class="form-row">
20+
<div class="form-row">
1921
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
2022
<input type="text" id="node-input-name" placeholder="Name">
21-
</div>
23+
</div>
24+
<div class="form-row">
25+
<label for="node-input-context"><i class="icon-tag"></i> Context</label>
26+
<input type="text" id="node-input-context" placeholder="Context">
27+
</div>
28+
<div class="form-row">
29+
<label for="node-input-flatten"><i class="icon-tag"></i> Flatten</label>
30+
<input type="checkbox" id="node-input-flatten" placeholder="Flatten">
31+
</div>
2232
</script>
2333

2434
<script type="text/x-red" data-help-name="signalk-on-delta">

signalk-on-delta.js

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,41 @@ module.exports = function(RED) {
99

1010
function on_delta(delta) {
1111
if ( delta.updates ) {
12-
var copy = JSON.parse(JSON.stringify(delta))
13-
copy.updates = []
14-
delta.updates.forEach(update => {
15-
if ( update.values &&
16-
(!update.$source || !update.$source.startsWith('signalk-node-red') )) {
17-
copy.updates.push(update)
12+
if ( delta.context === config.context ||
13+
(config.context === 'vessels.self' &&
14+
delta.context == app.selfContext) ) {
15+
if ( typeof config.flatten === 'undefined' || !config.flatten ) {
16+
var copy = JSON.parse(JSON.stringify(delta))
17+
copy.updates = []
18+
delta.updates.forEach(update => {
19+
if ( update.values &&
20+
(!update.$source || !update.$source.startsWith('signalk-node-red') )) {
21+
copy.updates.push(update)
22+
}
23+
})
24+
25+
if ( copy.updates.length > 0 ) {
26+
if ( copy.context == app.selfContext ) {
27+
copy.context = 'vessels.self'
28+
}
29+
node.send({ payload: copy })
30+
}
31+
} else {
32+
delta.updates.forEach(update => {
33+
if ( update.values &&
34+
(!update.$source || !update.$source.startsWith('signalk-node-red') )) {
35+
update.values.forEach(pathValue => {
36+
node.send({
37+
$source: update.$source,
38+
source: update.source,
39+
context: delta.context == app.selfContext ? 'vessels.self' : delta.context,
40+
payload: pathValue.value,
41+
topic: pathValue.path
42+
})
43+
})
44+
}
45+
})
1846
}
19-
})
20-
21-
if ( copy.updates.length > 0 ) {
22-
if ( copy.context == app.selfContext ) {
23-
copy.context = 'vessels.self'
24-
}
25-
node.send({ payload: copy })
2647
}
2748
}
2849
}

signalk-send-pathvalue.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ module.exports = function(RED) {
1212
updates: [
1313
{
1414
values: [
15-
msg.payload
15+
{
16+
value: msg.payload,
17+
path: msg.topic
18+
}
1619
]
1720
}
1821
]

signalk-subscribe.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
color: '#ffcc01',
55
defaults: {
66
name: {value:""},
7+
flatten: {value: true},
78
context: {value:"vessels.self"},
89
path: {value:""},
910
period: {value: 1000}
@@ -22,6 +23,10 @@
2223
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
2324
<input type="text" id="node-input-name" placeholder="Name">
2425
</div>
26+
<div class="form-row">
27+
<label for="node-input-flatten"><i class="icon-tag"></i> Flatten</label>
28+
<input type="checkbox" id="node-input-flatten" placeholder="Flatten">
29+
</div>
2530
<div class="form-row">
2631
<label for="node-input-context"><i class="icon-tag"></i> Context</label>
2732
<input type="text" id="node-input-context" placeholder="Context">

signalk-subscribe.js

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,37 @@ module.exports = function(RED) {
2525

2626
function on_delta(delta) {
2727
if ( delta.updates ) {
28-
var copy = JSON.parse(JSON.stringify(delta))
29-
copy.updates = []
30-
delta.updates.forEach(update => {
31-
if ( update.values &&
32-
(!update.$source || !update.$source.startsWith('signalk-node-red') )) {
33-
copy.updates.push(update)
28+
if ( typeof config.flatten === 'undefined' || !config.flatten ) {
29+
var copy = JSON.parse(JSON.stringify(delta))
30+
copy.updates = []
31+
delta.updates.forEach(update => {
32+
if ( update.values &&
33+
(!update.$source || !update.$source.startsWith('signalk-node-red') )) {
34+
copy.updates.push(update)
35+
}
36+
})
37+
38+
if ( copy.updates.length > 0 ) {
39+
if ( copy.context == app.selfContext ) {
40+
copy.context = 'vessels.self'
41+
}
42+
node.send({ payload: copy })
3443
}
35-
})
36-
37-
if ( copy.updates.length > 0 ) {
38-
if ( copy.context == app.selfContext ) {
39-
copy.context = 'vessels.self'
40-
}
41-
node.send({ payload: copy })
44+
} else {
45+
delta.updates.forEach(update => {
46+
if ( update.values &&
47+
(!update.$source || !update.$source.startsWith('signalk-node-red') )) {
48+
update.values.forEach(pathValue => {
49+
node.send({
50+
$source: update.$source,
51+
source: update.source,
52+
context: delta.context == app.selfContext ? 'vessels.self' : delta.context,
53+
payload: pathValue.value,
54+
topic: pathValue.path
55+
})
56+
})
57+
}
58+
})
4259
}
4360
}
4461
}

0 commit comments

Comments
 (0)