@mschaeffler/node-red-logic 1.5.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/math_falling.html CHANGED
@@ -7,6 +7,7 @@
7
7
  property:{value:"payload",required:true},
8
8
  propertyType:{value:"msg"},
9
9
  threshold:{value:"",required:true,validate:RED.validators.number()},
10
+ consecutive:{value:"1",required:true},
10
11
  showState:{value:false}
11
12
  },
12
13
  inputs:1,
@@ -45,6 +46,10 @@
45
46
  <label for="node-input-threshold"><i class="fa fa-chevron-down"></i> Threshold</label>
46
47
  <input type="text" id="node-input-threshold">
47
48
  </div>
49
+ <div class="form-row">
50
+ <label for="node-input-consecutive"><i class="fa fa-line-chart"></i> Consecutive</label>
51
+ <input type="text" id="node-input-consecutive">
52
+ </div>
48
53
  <div class="form-row">
49
54
  <label for="node-input-showStatus"><i class="fa fa-star-o"></i> Status</label>
50
55
  <input type="checkbox" id="node-input-showState" style="display:inline-block; width:20px; vertical-align:baseline;">
@@ -79,6 +84,8 @@
79
84
  <dd> defines the message property to be used as payload.</dd>
80
85
  <dt>Threshold <span class="property-type">number</span></dt>
81
86
  <dd> threshold value for the edge detection.</dd>
87
+ <dt>Consecutive <span class="property-type">number</span></dt>
88
+ <dd> number of consecutive frames to generate an output.</dd>
82
89
  <dt>Status <span class="property-type">boolean</span></dt>
83
90
  <dd> shows the actual value as a node status.</dd>
84
91
  </dl>
package/math_falling.js CHANGED
@@ -8,6 +8,7 @@ module.exports = function(RED) {
8
8
  this.property = config.property ?? "payload";
9
9
  this.propertyType = config.propertyType ?? "msg";
10
10
  this.threshold = config.threshold;
11
+ this.consecutive = Number( config.consecutive ?? 1 );
11
12
  this.showState = Boolean( config.showState );
12
13
  if( this.propertyType === "jsonata" )
13
14
  {
@@ -19,6 +20,7 @@ module.exports = function(RED) {
19
20
  return;
20
21
  }
21
22
  }
23
+ node.cntFall = 0;
22
24
  node.status( "" );
23
25
 
24
26
  node.on('input', function(msg,send,done) {
@@ -66,11 +68,24 @@ module.exports = function(RED) {
66
68
  const last = data[msg.topic] ?? Number.MIN_SAFE_INTEGER;
67
69
  if( msg.payload < node.threshold && node.threshold <= last )
68
70
  {
69
- status.fill = "green";
70
- msg.edge = "falling";
71
- send( msg );
71
+ if( ++node.cntFall >= node.consecutive )
72
+ {
73
+ status.fill = "green";
74
+ msg.edge = "falling";
75
+ send( msg );
76
+ data[msg.topic] = msg.payload;
77
+ node.cntFall = 0;
78
+ }
79
+ else
80
+ {
81
+ status.fill = "yellow";
82
+ }
83
+ }
84
+ else
85
+ {
86
+ node.cntFall = 0;
87
+ data[msg.topic] = msg.payload;
72
88
  }
73
- data[msg.topic] = msg.payload;
74
89
  context.set( "data", data );
75
90
  }
76
91
  else
@@ -11,7 +11,6 @@
11
11
  const raise = $("#node-input-threshold_raise").length ? $("#node-input-threshold_raise").val() : this.threshold_raise;
12
12
  return v!=='' && !isNaN(v) && Number(v)<raise;}
13
13
  },
14
- initial:{value:"none"},
15
14
  consecutive:{value:"1",required:true},
16
15
  showState:{value:false}
17
16
  },
@@ -55,15 +54,6 @@
55
54
  <label for="node-input-threshold_fall"><i class="fa fa-chevron-down"></i> dn threshold</label>
56
55
  <input type="text" id="node-input-threshold_fall">
57
56
  </div>
58
- <div class="form-row">
59
- <label for="node-input-initial"><i class="fa fa-play"></i> 1st message</label>
60
- <select id="node-input-initial">
61
- <option value="none">None</option>
62
- <option value="rising">Rising</option>
63
- <option value="falling">Falling</option>
64
- <option value="any">Any</option>
65
- </select>
66
- </div>
67
57
  <div class="form-row">
68
58
  <label for="node-input-consecutive"><i class="fa fa-line-chart"></i> Consecutive</label>
69
59
  <input type="text" id="node-input-consecutive">
@@ -104,8 +94,6 @@
104
94
  <dd> threshold value for the rising edge detection.</dd>
105
95
  <dt>d(ow)n Threshold <span class="property-type">number</span></dt>
106
96
  <dd> threshold value for the falling edge detection.</dd>
107
- <dt>1st message <span class="property-type">string</span></dt>
108
- <dd> initial behaviour (None, Rising, Falling, Any).</dd>
109
97
  <dt>Consecutive <span class="property-type">number</span></dt>
110
98
  <dd> number of consecutive frames to generate an output.</dd>
111
99
  <dt>Status <span class="property-type">boolean</span></dt>
@@ -9,7 +9,6 @@ module.exports = function(RED) {
9
9
  this.propertyType = config.propertyType ?? "msg";
10
10
  this.threshold_rise = config.threshold_raise;
11
11
  this.threshold_fall = config.threshold_fall;
12
- this.initial = config.initial ?? "none";
13
12
  this.consecutive = Number( config.consecutive ?? 1 );
14
13
  this.showState = Boolean( config.showState );
15
14
  if( this.propertyType === "jsonata" )
@@ -73,60 +72,43 @@ module.exports = function(RED) {
73
72
  function sendMsg(edge)
74
73
  {
75
74
  status.fill = "green";
76
- data[msg.topic].edge = edge;
77
- data[msg.topic].value = msg.payload;
75
+ data[msg.topic] = edge;
76
+ context.set( "data", data );
78
77
  msg.edge = edge;
79
78
  send( msg );
80
79
  }
81
80
 
82
- if( last )
81
+ if( msg.payload > node.threshold_rise && last != 'rising' )
83
82
  {
84
- if( msg.payload > node.threshold_rise && node.threshold_rise >= last.value && last.edge != 'rising' )
83
+ if( ++node.cntRise >= node.consecutive )
85
84
  {
86
- if( ++node.cntRise >= node.consecutive )
87
- {
88
- sendMsg( 'rising' );
89
- node.cntRise = 0;
90
- }
91
- else
92
- {
93
- status.fill = "yellow";
94
- }
95
- node.cntFall = 0;
96
- }
97
- else if( msg.payload < node.threshold_fall && node.threshold_fall <= last.value && last.edge != 'falling' )
98
- {
99
- if( ++node.cntFall >= node.consecutive )
100
- {
101
- sendMsg( 'falling' );
102
- node.cntFall = 0;
103
- }
104
- else
105
- {
106
- status.fill = "yellow";
107
- }
85
+ sendMsg( 'rising' );
108
86
  node.cntRise = 0;
109
87
  }
110
88
  else
111
89
  {
112
- node.cntRise = 0;
113
- node.cntFall = 0;
114
- data[msg.topic].value = msg.payload;
90
+ status.fill = "yellow";
115
91
  }
92
+ node.cntFall = 0;
116
93
  }
117
- else
94
+ else if( msg.payload < node.threshold_fall && last != 'falling' )
118
95
  {
119
- data[msg.topic] = { value: msg.payload };
120
- if( ['any','rising'].includes(node.initial) && msg.payload > node.threshold_rise )
96
+ if( ++node.cntFall >= node.consecutive )
121
97
  {
122
- sendMsg( 'rising' );
98
+ sendMsg( 'falling' );
99
+ node.cntFall = 0;
123
100
  }
124
- else if( ['any','falling'].includes(node.initial) && msg.payload < node.threshold_fall )
101
+ else
125
102
  {
126
- sendMsg( 'falling' );
103
+ status.fill = "yellow";
127
104
  }
105
+ node.cntRise = 0;
106
+ }
107
+ else
108
+ {
109
+ node.cntRise = 0;
110
+ node.cntFall = 0;
128
111
  }
129
- context.set( "data", data );
130
112
  }
131
113
  else
132
114
  {
package/math_reduce.html CHANGED
@@ -17,6 +17,7 @@
17
17
  return v!=='' && !isNaN(v) && Number(v)>0;}
18
18
  },
19
19
  algo:{value:"", required:true},
20
+ showState:{value:false},
20
21
  filter:{value:false}
21
22
  },
22
23
  inputs:1,
@@ -86,6 +87,10 @@
86
87
  <option value="max">Maximum</option>
87
88
  </select>
88
89
  </div>
90
+ <div class="form-row">
91
+ <label for="node-input-showStatus"><i class="fa fa-star-o"></i> Status</label>
92
+ <input type="checkbox" id="node-input-showState" style="display:inline-block; width:20px; vertical-align:baseline;">
93
+ </div>
89
94
  <div class="form-row">
90
95
  <label for="node-input-filter"><i class="fa fa-filter"></i> Filter</label>
91
96
  <input type="checkbox" id="node-input-filter" style="display:inline-block; width:20px; vertical-align:baseline;">
@@ -136,6 +141,8 @@
136
141
  <dd> min. amount of topics to generate an output.</dd>
137
142
  <dt>Algorithm <span class="property-type">string</span></dt>
138
143
  <dd> algorithm to combine the values.</dd>
144
+ <dt>Status <span class="property-type">boolean</span></dt>
145
+ <dd> shows the actual value as a node status.</dd>
139
146
  <dt>Filter <span class="property-type">boolean</span></dt>
140
147
  <dd> block sending of unchanged <code>property</code>.</dd>
141
148
  </dl>
package/math_reduce.js CHANGED
@@ -11,8 +11,10 @@ module.exports = function(RED) {
11
11
  this.maxMean = Number( config.maxMean ?? 1 );
12
12
  this.minData = Number( config.minData ?? 1 );
13
13
  this.algo = config.algo;
14
+ this.showState= Boolean( config.showState );
14
15
  this.filter = Boolean( config.filter );
15
16
  this.last = null;
17
+ node.status( "" );
16
18
 
17
19
  node.on('input', function(msg,send,done) {
18
20
  if( msg.invalid )
@@ -107,7 +109,10 @@ module.exports = function(RED) {
107
109
  status.fill = "red";
108
110
  status.text = "payload is NaN";
109
111
  }
110
- node.status( status );
112
+ if( node.showState )
113
+ {
114
+ node.status( status );
115
+ }
111
116
  done();
112
117
  }
113
118
  });
package/math_rising.html CHANGED
@@ -7,6 +7,7 @@
7
7
  property:{value:"payload",required:true},
8
8
  propertyType:{value:"msg"},
9
9
  threshold:{value:"",required:true,validate:RED.validators.number()},
10
+ consecutive:{value:"1",required:true},
10
11
  showState:{value:false}
11
12
  },
12
13
  inputs:1,
@@ -45,6 +46,10 @@
45
46
  <label for="node-input-threshold"><i class="fa fa-chevron-up"></i> Threshold</label>
46
47
  <input type="text" id="node-input-threshold">
47
48
  </div>
49
+ <div class="form-row">
50
+ <label for="node-input-consecutive"><i class="fa fa-line-chart"></i> Consecutive</label>
51
+ <input type="text" id="node-input-consecutive">
52
+ </div>
48
53
  <div class="form-row">
49
54
  <label for="node-input-showStatus"><i class="fa fa-star-o"></i> Status</label>
50
55
  <input type="checkbox" id="node-input-showState" style="display:inline-block; width:20px; vertical-align:baseline;">
@@ -79,6 +84,8 @@
79
84
  <dd> defines the message property to be used as payload.</dd>
80
85
  <dt>Threshold <span class="property-type">number</span></dt>
81
86
  <dd> threshold value for the edge detection.</dd>
87
+ <dt>Consecutive <span class="property-type">number</span></dt>
88
+ <dd> number of consecutive frames to generate an output.</dd>
82
89
  <dt>Status <span class="property-type">boolean</span></dt>
83
90
  <dd> shows the actual value as a node status.</dd>
84
91
  </dl>
package/math_rising.js CHANGED
@@ -8,6 +8,7 @@ module.exports = function(RED) {
8
8
  this.property = config.property ?? "payload";
9
9
  this.propertyType = config.propertyType ?? "msg";
10
10
  this.threshold = config.threshold;
11
+ this.consecutive = Number( config.consecutive ?? 1 );
11
12
  this.showState = Boolean( config.showState );
12
13
  if( this.propertyType === "jsonata" )
13
14
  {
@@ -19,6 +20,7 @@ module.exports = function(RED) {
19
20
  return;
20
21
  }
21
22
  }
23
+ node.cntRise = 0;
22
24
  node.status( "" );
23
25
 
24
26
  node.on('input', function(msg,send,done) {
@@ -67,11 +69,24 @@ module.exports = function(RED) {
67
69
  const last = data[msg.topic] ?? Number.MAX_SAFE_INTEGER;
68
70
  if( msg.payload > node.threshold && node.threshold >= last )
69
71
  {
70
- status.fill = "green";
71
- msg.edge = "rising";
72
- send( msg );
72
+ if( ++node.cntRise >= node.consecutive )
73
+ {
74
+ status.fill = "green";
75
+ msg.edge = "rising";
76
+ send( msg );
77
+ data[msg.topic] = msg.payload;
78
+ node.cntRise = 0;
79
+ }
80
+ else
81
+ {
82
+ status.fill = "yellow";
83
+ }
84
+ }
85
+ else
86
+ {
87
+ node.cntRise = 0;
88
+ data[msg.topic] = msg.payload;
73
89
  }
74
- data[msg.topic] = msg.payload;
75
90
  context.set( "data", data );
76
91
  }
77
92
  else
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mschaeffler/node-red-logic",
3
- "version": "1.5.0",
3
+ "version": "2.1.0",
4
4
  "description": "nodes for simple operations.",
5
5
  "license": "LGPL-2.1",
6
6
  "homepage": "https://github.com/m-schaeffler/node-red-my-nodes/tree/main/node-red-logic",