From 8cd71a0300e78ddbd92888515569c44ff2ef0b85 Mon Sep 17 00:00:00 2001 From: bartbutenaers Date: Wed, 31 May 2017 00:03:40 +0200 Subject: [PATCH 1/4] add period option --- throttle.html | 37 ++++++++++++++++++++++++-- throttle.js | 72 +++++++++++++++++++++++++++++++++++---------------- 2 files changed, 85 insertions(+), 24 deletions(-) diff --git a/throttle.html b/throttle.html index 39ea868..c007f65 100644 --- a/throttle.html +++ b/throttle.html @@ -7,6 +7,7 @@ + +
+ + + +
\ No newline at end of file diff --git a/throttle.js b/throttle.js index 6755323..91b2859 100644 --- a/throttle.js +++ b/throttle.js @@ -10,28 +10,50 @@ module.exports = function(RED) { this.throttleType = config.throttleType || "time"; this.timeLimitType = config.timeLimitType || "seconds"; this.timeLimit = Number(config.timeLimit || 0); + this.periodLimitType = config.periodLimitType || "seconds"; + this.periodLimit = Number(config.periodLimit || 0); this.countLimit = Number(config.countLimit || 0); this.blockSize = Number(config.blockSize || 0); this.locked = config.locked || false; - - // helpers - this.time = this.locked ? Math.floor(Date.now()) : 0; - this.count = this.locked ? 1 : 0; - this.block = this.locked ? this.blockSize + 1 : 0; - this.reset = !!this.locked; - - // calculate time limit in milliseconds - if( this.timeLimitType === "hours" ) { - this.timeLimit *= 60 * 60 * 1000; - } - else if( this.timeLimitType === "minutes" ) { - this.timeLimit *= 60 * 1000; + this.resend = config.resend || false; + + function initialize(locked, node) { + node.time = locked ? Math.floor(Date.now()) : 0; + node.period = locked ? 0 : Math.floor(Date.now()); + node.count = locked ? 1 : 0; + node.block = locked ? node.blockSize + 1 : 0; + node.reset = !!locked; } - else if( this.timeLimitType === "seconds" ) { - this.timeLimit *= 1000; + + // Initialize the current status, based on the 'locked' property + initialize(this.locked, this); + + // calculate limit in milliseconds + function getMilliSeconds(limitType, limit) { + if( limitType === "hours" ) { + return limit * 60 * 60 * 1000; + } + else if( limitType === "minutes" ) { + return limit * 60 * 1000; + } + else if( limitType === "seconds" ) { + return limit * 1000; + } } + + this.timeLimit = getMilliSeconds(this.timeLimitType, this.timeLimit); + this.periodLimit = getMilliSeconds(this.periodLimitType, this.periodLimit); this.on("input", function(msg) { + if( msg.reset) { + initialize(false, node); + + if( node.resend !== true) { + // When a 'reset' message shouldn't be resended (on the output port), just skip it ... + return; + } + } + // throttle by time if( node.throttleType === "time" ) { if( isNaN(node.timeLimit) || !isFinite(node.timeLimit) ) { @@ -45,6 +67,19 @@ module.exports = function(RED) { node.send(msg); } } + + // throttle by period + else if( node.throttleType === "period" ) { + if( isNaN(node.periodLimit) || !isFinite(node.periodLimit) ) { + return this.error("period limit is not numeric", msg); + } + + var now = Math.floor(Date.now()); + + if( node.period + node.periodLimit > now ) { + node.send(msg); + } + } // throttle by count else if( node.throttleType === "count" ) { @@ -74,9 +109,6 @@ module.exports = function(RED) { if( node.block <= node.blockSize ) { node.send(msg); } - else if( msg.reset ) { - node.block = 0; - } } // throttle by reset @@ -85,11 +117,7 @@ module.exports = function(RED) { node.reset = true; node.send(msg); } - else if( msg.reset ) { - node.reset = false; - } } - // unknown throttle type else { this.error("unknown throttle type '" + node.throttleType + "'", msg); From 8476a2ec20af2adebe5017f07cc86ebeb0f19cdf Mon Sep 17 00:00:00 2001 From: bartbutenaers Date: Wed, 31 May 2017 23:20:49 +0200 Subject: [PATCH 2/4] add period option --- readme.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 87674a8..14e73e2 100644 --- a/readme.md +++ b/readme.md @@ -13,11 +13,13 @@ A Node-RED node to throttle down * [Install](#install) * [Usage](#usage) * [By Time](#by-time) + * [By Period](#by-period) * [By Count](#by-count) * [By Block Size](#by-block-size) * [By Reset](#by-reset) * [Example Flows](#example-flows) * [Example by Time](#example-by-time) + * [Example by Period](#example-by-period) * [Example by Count](#example-by-count) * [Example by Block Size](#example-by-block-size) * [Example by Reset](#example-by-reset) @@ -49,6 +51,12 @@ Limits the passed through messages by a given amount of time. **For example:** setting the node to `10 seconds` means, that only one message in ten seconds will be forwarded. +### By Period + +Limits the passed through messages by a given period of time. +**For example:** setting the node to `10 seconds` means, that all messages in the first ten seconds will be forwarded. + + ### By Count Limits the passed through messages by a given count. @@ -81,6 +89,15 @@ Simple examples showing how to use the throttle and it's output. ``` +### Example by Period + +![example5.png](./doc/example5.png) + +```JSON +[{"id":"86bd5da0.39e8f","type":"function","z":"6253524.ae0e9ac","name":"info msg","func":"msg.payload = \"injected\";\nreturn msg;","outputs":1,"noerr":0,"x":628.6666259765625,"y":231.99999237060547,"wires":[["da3ceb1e.ec5c88"]]},{"id":"da3ceb1e.ec5c88","type":"debug","z":"6253524.ae0e9ac","name":"output","active":true,"console":"false","complete":"payload","x":778.6666259765625,"y":251.99999237060547,"wires":[]},{"id":"ebe0512b.4e983","type":"throttle","z":"6253524.ae0e9ac","name":"","throttleType":"period","timeLimit":"3","timeLimitType":"seconds","periodLimit":"10","periodLimitType":"seconds","countLimit":"3","blockSize":0,"locked":false,"resend":false,"x":628.6666259765625,"y":271.99999237060547,"wires":[["da3ceb1e.ec5c88"]]},{"id":"e9805de7.44838","type":"inject","z":"6253524.ae0e9ac","name":"inject","topic":"","payload":"!!! PASSED THROUGH !!!","payloadType":"str","repeat":"","crontab":"","once":false,"x":478.6666259765625,"y":251.99999237060547,"wires":[["ebe0512b.4e983","86bd5da0.39e8f"]]}] +``` + + ### Example by Count ![example2.png](./doc/example2.png) @@ -121,4 +138,4 @@ _You like to support me?_ _You appreciate my work?_ _You use it in commercial projects?_ -Feel free to make a little [donation](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FFL6VQJCUZMXC)! :wink: \ No newline at end of file +Feel free to make a little [donation](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FFL6VQJCUZMXC)! :wink: From fb1e27a4dcfd5434d196689fcb9e44e7599a41c0 Mon Sep 17 00:00:00 2001 From: bartbutenaers Date: Wed, 31 May 2017 23:25:35 +0200 Subject: [PATCH 3/4] Update readme.md --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 14e73e2..62ccf0b 100644 --- a/readme.md +++ b/readme.md @@ -94,7 +94,7 @@ Simple examples showing how to use the throttle and it's output. ![example5.png](./doc/example5.png) ```JSON -[{"id":"86bd5da0.39e8f","type":"function","z":"6253524.ae0e9ac","name":"info msg","func":"msg.payload = \"injected\";\nreturn msg;","outputs":1,"noerr":0,"x":628.6666259765625,"y":231.99999237060547,"wires":[["da3ceb1e.ec5c88"]]},{"id":"da3ceb1e.ec5c88","type":"debug","z":"6253524.ae0e9ac","name":"output","active":true,"console":"false","complete":"payload","x":778.6666259765625,"y":251.99999237060547,"wires":[]},{"id":"ebe0512b.4e983","type":"throttle","z":"6253524.ae0e9ac","name":"","throttleType":"period","timeLimit":"3","timeLimitType":"seconds","periodLimit":"10","periodLimitType":"seconds","countLimit":"3","blockSize":0,"locked":false,"resend":false,"x":628.6666259765625,"y":271.99999237060547,"wires":[["da3ceb1e.ec5c88"]]},{"id":"e9805de7.44838","type":"inject","z":"6253524.ae0e9ac","name":"inject","topic":"","payload":"!!! PASSED THROUGH !!!","payloadType":"str","repeat":"","crontab":"","once":false,"x":478.6666259765625,"y":251.99999237060547,"wires":[["ebe0512b.4e983","86bd5da0.39e8f"]]}] +[{"id":"8383dfd6.38029","type":"function","z":"6253524.ae0e9ac","name":"info msg","func":"msg.payload = \"injected\";\nreturn msg;","outputs":1,"noerr":0,"x":508.0994567871094,"y":194.09091186523438,"wires":[["dde88359.a1484"]]},{"id":"aa17d47e.ca3ae8","type":"throttle","z":"6253524.ae0e9ac","name":"","throttleType":"period","timeLimit":"10","timeLimitType":"seconds","periodLimit":"10","periodLimitType":"seconds","countLimit":"3","blockSize":"3","locked":false,"resend":false,"x":508.0994567871094,"y":234.09091186523438,"wires":[["dde88359.a1484"]]},{"id":"87dc94db.139918","type":"inject","z":"6253524.ae0e9ac","name":"inject","topic":"","payload":"!!! PASSED THROUGH !!!","payloadType":"str","repeat":"","crontab":"","once":false,"x":198.09945678710938,"y":214.09091186523438,"wires":[["aa17d47e.ca3ae8","8383dfd6.38029"]]},{"id":"8fbc58ea.3a7da8","type":"inject","z":"6253524.ae0e9ac","name":"reset","topic":"","payload":"reset","payloadType":"str","repeat":"","crontab":"","once":false,"x":198.09945678710938,"y":274.0909118652344,"wires":[["a3b2c4d0.c76688"]]},{"id":"a3b2c4d0.c76688","type":"function","z":"6253524.ae0e9ac","name":"reset msg","func":"msg.reset = true;\nreturn msg;","outputs":1,"noerr":0,"x":328.0994567871094,"y":274.0909118652344,"wires":[["aa17d47e.ca3ae8","dde88359.a1484"]]},{"id":"dde88359.a1484","type":"debug","z":"6253524.ae0e9ac","name":"output","active":true,"console":"false","complete":"payload","x":678.0994567871094,"y":274.0909118652344,"wires":[]}] ``` From 9f63347caa28478b55a2858fe04957a8fde02f1a Mon Sep 17 00:00:00 2001 From: bartbutenaers Date: Wed, 31 May 2017 23:30:43 +0200 Subject: [PATCH 4/4] Initial commit --- doc/example5.png | Bin 0 -> 26697 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/example5.png diff --git a/doc/example5.png b/doc/example5.png new file mode 100644 index 0000000000000000000000000000000000000000..f6b0b620d355fa3b00fa8db0ad4147435092d62c GIT binary patch literal 26697 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 N3bLwibKe+x{SUazqT~Po literal 0 HcmV?d00001