diff --git a/function/smooth/17-smooth.html b/function/smooth/17-smooth.html index 81643a1b6..1083ec1aa 100644 --- a/function/smooth/17-smooth.html +++ b/function/smooth/17-smooth.html @@ -10,6 +10,7 @@ + diff --git a/function/smooth/17-smooth.js b/function/smooth/17-smooth.js index c34c04aa2..9545051be 100644 --- a/function/smooth/17-smooth.js +++ b/function/smooth/17-smooth.js @@ -54,6 +54,17 @@ module.exports = function(RED) { v[top].tot = v[top].tot + n - v[top].pop; value = v[top].tot / v[top].a.length; } + if (node.action === "median") { + var sortedForMedian = v[top].a.slice().sort((a, b) => a - b); + var medianIndex = Math.floor(v[top].iter / 2); + if (v[top].iter % 2 === 0) { + value = (sortedForMedian[medianIndex - 1] + sortedForMedian[medianIndex]) / 2; + } + else { + value = sortedForMedian[medianIndex] + } + } + if (node.action === "sd") { v[top].tot = v[top].tot + n - v[top].pop; v[top].tot2 = v[top].tot2 + (n*n) - (v[top].pop * v[top].pop); diff --git a/test/function/smooth/17-smooth_spec.js b/test/function/smooth/17-smooth_spec.js index ac7c7fc71..3e92ecc66 100644 --- a/test/function/smooth/17-smooth_spec.js +++ b/test/function/smooth/17-smooth_spec.js @@ -48,6 +48,31 @@ describe('smooth node', function() { }); }); + + + it('should average over a number of inputs using median', function(done) { + var flow = [{"id":"n1", "type":"smooth", action:"median", count:"5", round:"true", wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + var c = 0; + n2.on("input", function(msg) { + c += 1; + if (c === 4) { msg.should.have.a.property("payload", 55); } + if (c === 5) { msg.should.have.a.property("payload", 100); } + if (c === 6) { msg.should.have.a.property("payload", 550); done(); } + }); + n1.emit("input", {payload:1}); + n1.emit("input", {payload:10}); + n1.emit("input", {payload:100}); + n1.emit("input", {payload:1000}); + n1.emit("input", {payload:10000}); + n1.emit("input", {payload:100000}); + }); + }); + + it('should average over a number of inputs - another property - foo', function(done) { var flow = [{"id":"n1", "type":"smooth", action:"mean", count:"5", round:"true", property:"foo", wires:[["n2"]] }, {id:"n2", type:"helper"} ];