node-red-contrib-boolean-logic-ultimate 1.2.3 → 1.2.4

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/CHANGELOG.md CHANGED
@@ -3,6 +3,12 @@
3
3
 
4
4
  # CHANGELOG
5
5
 
6
+
7
+ <p>
8
+ <b>Version 1.2.4</b> January 2026<br/>
9
+ - Added sample flows in the "example" folder. Just import it via the "import" menu of node-red</br>
10
+ </p>
11
+
6
12
  <p>
7
13
  <b>Version 1.2.3</b> November 2025<br/>
8
14
  - Impulse node allows now to send JSON as payload. Grazie Waldmensch1 !!</br>
package/README.md CHANGED
@@ -17,6 +17,18 @@ A set of Node-RED enhanced boolean logic and utility nodes, with persistent valu
17
17
 
18
18
  - See <a href="https://github.com/Supergiovane/node-red-contrib-boolean-logic-ultimate/blob/master/CHANGELOG.md">here the changelog</a>
19
19
 
20
+ <br/>
21
+ <br/>
22
+
23
+ # EXAMPLES
24
+
25
+ Importable Node-RED example flows are available in the [`examples/`](examples/) folder (one JSON per node). See [`examples/README.md`](examples/README.md) for a quick overview.
26
+
27
+ **How to import**
28
+
29
+ - Node-RED editor → Menu (☰) → **Import** → **Examples** and select an example from `node-red-contrib-boolean-logic-ultimate`
30
+
31
+
20
32
  <br/>
21
33
  <br/>
22
34
 
@@ -0,0 +1,119 @@
1
+ [
2
+ {
3
+ "id": "blk_tab_1",
4
+ "type": "tab",
5
+ "label": "BlinkerUltimate - start/stop/interval",
6
+ "disabled": false,
7
+ "info": "Esempio: avvia/ferma il blink e cambia l'intervallo tramite msg.interval."
8
+ },
9
+ {
10
+ "id": "blk_cmt_1",
11
+ "type": "comment",
12
+ "z": "blk_tab_1",
13
+ "name": "Start/Stop + cambio intervallo",
14
+ "info": "payload=true avvia; payload=false ferma. msg.interval (ms) cambia la frequenza.",
15
+ "x": 220,
16
+ "y": 60,
17
+ "wires": []
18
+ },
19
+ {
20
+ "id": "blk_inj_start",
21
+ "type": "inject",
22
+ "z": "blk_tab_1",
23
+ "name": "Start (true)",
24
+ "props": [{ "p": "payload" }],
25
+ "repeat": "",
26
+ "crontab": "",
27
+ "once": false,
28
+ "onceDelay": 0.1,
29
+ "topic": "",
30
+ "payload": "true",
31
+ "payloadType": "bool",
32
+ "x": 150,
33
+ "y": 140,
34
+ "wires": [["blk_node_1"]]
35
+ },
36
+ {
37
+ "id": "blk_inj_stop",
38
+ "type": "inject",
39
+ "z": "blk_tab_1",
40
+ "name": "Stop (false)",
41
+ "props": [{ "p": "payload" }],
42
+ "repeat": "",
43
+ "crontab": "",
44
+ "once": false,
45
+ "onceDelay": 0.1,
46
+ "topic": "",
47
+ "payload": "false",
48
+ "payloadType": "bool",
49
+ "x": 150,
50
+ "y": 180,
51
+ "wires": [["blk_node_1"]]
52
+ },
53
+ {
54
+ "id": "blk_inj_interval",
55
+ "type": "inject",
56
+ "z": "blk_tab_1",
57
+ "name": "Interval 200ms + start",
58
+ "props": [
59
+ { "p": "payload", "v": "true", "vt": "bool" },
60
+ { "p": "interval", "v": "200", "vt": "num" }
61
+ ],
62
+ "repeat": "",
63
+ "crontab": "",
64
+ "once": false,
65
+ "onceDelay": 0.1,
66
+ "x": 190,
67
+ "y": 220,
68
+ "wires": [["blk_node_1"]]
69
+ },
70
+ {
71
+ "id": "blk_node_1",
72
+ "type": "BlinkerUltimate",
73
+ "z": "blk_tab_1",
74
+ "name": "Blinker",
75
+ "stopbehaviorPIN1": "0",
76
+ "stopbehaviorPIN2": "1",
77
+ "blinkfrequency": "500",
78
+ "initializewith": "0",
79
+ "payloadPropName": "payload",
80
+ "x": 390,
81
+ "y": 180,
82
+ "wires": [["blk_dbg_1"], ["blk_dbg_2"]]
83
+ },
84
+ {
85
+ "id": "blk_dbg_1",
86
+ "type": "debug",
87
+ "z": "blk_tab_1",
88
+ "name": "PIN1",
89
+ "active": true,
90
+ "tosidebar": true,
91
+ "console": false,
92
+ "tostatus": false,
93
+ "complete": "payload",
94
+ "targetType": "msg",
95
+ "statusVal": "",
96
+ "statusType": "auto",
97
+ "x": 570,
98
+ "y": 160,
99
+ "wires": []
100
+ },
101
+ {
102
+ "id": "blk_dbg_2",
103
+ "type": "debug",
104
+ "z": "blk_tab_1",
105
+ "name": "PIN2 (inverted)",
106
+ "active": true,
107
+ "tosidebar": true,
108
+ "console": false,
109
+ "tostatus": false,
110
+ "complete": "payload",
111
+ "targetType": "msg",
112
+ "statusVal": "",
113
+ "statusType": "auto",
114
+ "x": 610,
115
+ "y": 200,
116
+ "wires": []
117
+ }
118
+ ]
119
+
@@ -0,0 +1,171 @@
1
+ [
2
+ {
3
+ "id": "bgu_tab_1",
4
+ "type": "tab",
5
+ "label": "BooleanLogicUltimate - AND/OR/XOR",
6
+ "disabled": false,
7
+ "info": "Esempio base: 2 ingressi identificati da msg.topic (a/b). Il nodo calcola AND/OR/XOR e li espone su 3 uscite."
8
+ },
9
+ {
10
+ "id": "bgu_cmt_1",
11
+ "type": "comment",
12
+ "z": "bgu_tab_1",
13
+ "name": "Invia A e B (topic diversi) per calcolare AND/OR/XOR",
14
+ "info": "Clicca gli inject (A/B true/false). Il nodo valuta quando ha ricevuto almeno un valore per ciascun topic, fino al conteggio inputCount.",
15
+ "x": 250,
16
+ "y": 60,
17
+ "wires": []
18
+ },
19
+ {
20
+ "id": "bgu_inj_a_true",
21
+ "type": "inject",
22
+ "z": "bgu_tab_1",
23
+ "name": "A = true",
24
+ "props": [
25
+ { "p": "payload" },
26
+ { "p": "topic", "vt": "str" }
27
+ ],
28
+ "repeat": "",
29
+ "crontab": "",
30
+ "once": false,
31
+ "onceDelay": 0.1,
32
+ "topic": "a",
33
+ "payload": "true",
34
+ "payloadType": "bool",
35
+ "x": 120,
36
+ "y": 120,
37
+ "wires": [["bgu_gate_1"]]
38
+ },
39
+ {
40
+ "id": "bgu_inj_a_false",
41
+ "type": "inject",
42
+ "z": "bgu_tab_1",
43
+ "name": "A = false",
44
+ "props": [
45
+ { "p": "payload" },
46
+ { "p": "topic", "vt": "str" }
47
+ ],
48
+ "repeat": "",
49
+ "crontab": "",
50
+ "once": false,
51
+ "onceDelay": 0.1,
52
+ "topic": "a",
53
+ "payload": "false",
54
+ "payloadType": "bool",
55
+ "x": 120,
56
+ "y": 160,
57
+ "wires": [["bgu_gate_1"]]
58
+ },
59
+ {
60
+ "id": "bgu_inj_b_true",
61
+ "type": "inject",
62
+ "z": "bgu_tab_1",
63
+ "name": "B = true",
64
+ "props": [
65
+ { "p": "payload" },
66
+ { "p": "topic", "vt": "str" }
67
+ ],
68
+ "repeat": "",
69
+ "crontab": "",
70
+ "once": false,
71
+ "onceDelay": 0.1,
72
+ "topic": "b",
73
+ "payload": "true",
74
+ "payloadType": "bool",
75
+ "x": 120,
76
+ "y": 220,
77
+ "wires": [["bgu_gate_1"]]
78
+ },
79
+ {
80
+ "id": "bgu_inj_b_false",
81
+ "type": "inject",
82
+ "z": "bgu_tab_1",
83
+ "name": "B = false",
84
+ "props": [
85
+ { "p": "payload" },
86
+ { "p": "topic", "vt": "str" }
87
+ ],
88
+ "repeat": "",
89
+ "crontab": "",
90
+ "once": false,
91
+ "onceDelay": 0.1,
92
+ "topic": "b",
93
+ "payload": "false",
94
+ "payloadType": "bool",
95
+ "x": 120,
96
+ "y": 260,
97
+ "wires": [["bgu_gate_1"]]
98
+ },
99
+ {
100
+ "id": "bgu_gate_1",
101
+ "type": "BooleanLogicUltimate",
102
+ "z": "bgu_tab_1",
103
+ "name": "",
104
+ "payloadPropName": "payload",
105
+ "filtertrue": "both",
106
+ "persist": false,
107
+ "sInitializeWith": "WaitForPayload",
108
+ "triggertopic": "trigger",
109
+ "outputtriggeredby": "all",
110
+ "inputCount": 2,
111
+ "topic": "result",
112
+ "restrictinputevaluation": false,
113
+ "delayEvaluation": 0,
114
+ "translatorConfig": "",
115
+ "x": 380,
116
+ "y": 200,
117
+ "wires": [["bgu_dbg_and"], ["bgu_dbg_or"], ["bgu_dbg_xor"]]
118
+ },
119
+ {
120
+ "id": "bgu_dbg_and",
121
+ "type": "debug",
122
+ "z": "bgu_tab_1",
123
+ "name": "AND",
124
+ "active": true,
125
+ "tosidebar": true,
126
+ "console": false,
127
+ "tostatus": false,
128
+ "complete": "payload",
129
+ "targetType": "msg",
130
+ "statusVal": "",
131
+ "statusType": "auto",
132
+ "x": 590,
133
+ "y": 160,
134
+ "wires": []
135
+ },
136
+ {
137
+ "id": "bgu_dbg_or",
138
+ "type": "debug",
139
+ "z": "bgu_tab_1",
140
+ "name": "OR",
141
+ "active": true,
142
+ "tosidebar": true,
143
+ "console": false,
144
+ "tostatus": false,
145
+ "complete": "payload",
146
+ "targetType": "msg",
147
+ "statusVal": "",
148
+ "statusType": "auto",
149
+ "x": 590,
150
+ "y": 200,
151
+ "wires": []
152
+ },
153
+ {
154
+ "id": "bgu_dbg_xor",
155
+ "type": "debug",
156
+ "z": "bgu_tab_1",
157
+ "name": "XOR",
158
+ "active": true,
159
+ "tosidebar": true,
160
+ "console": false,
161
+ "tostatus": false,
162
+ "complete": "payload",
163
+ "targetType": "msg",
164
+ "statusVal": "",
165
+ "statusType": "auto",
166
+ "x": 590,
167
+ "y": 240,
168
+ "wires": []
169
+ }
170
+ ]
171
+
@@ -0,0 +1,104 @@
1
+ [
2
+ {
3
+ "id": "cmp_tab_1",
4
+ "type": "tab",
5
+ "label": "Comparator - compare two topics",
6
+ "disabled": false,
7
+ "info": "Esempio: confronta due valori numerici identificati da msg.topic e produce true/false."
8
+ },
9
+ {
10
+ "id": "cmp_cmt_1",
11
+ "type": "comment",
12
+ "z": "cmp_tab_1",
13
+ "name": "Confronto: t1 > t2",
14
+ "info": "Invia valori su topic t1 e t2. Il Comparator emette true/false quando ha entrambi i valori.",
15
+ "x": 210,
16
+ "y": 60,
17
+ "wires": []
18
+ },
19
+ {
20
+ "id": "cmp_inj_t1",
21
+ "type": "inject",
22
+ "z": "cmp_tab_1",
23
+ "name": "t1 = 25",
24
+ "props": [
25
+ { "p": "payload" },
26
+ { "p": "topic", "vt": "str" }
27
+ ],
28
+ "repeat": "",
29
+ "crontab": "",
30
+ "once": false,
31
+ "onceDelay": 0.1,
32
+ "topic": "t1",
33
+ "payload": "25",
34
+ "payloadType": "num",
35
+ "x": 120,
36
+ "y": 140,
37
+ "wires": [["cmp_node_1"]]
38
+ },
39
+ {
40
+ "id": "cmp_inj_t2",
41
+ "type": "inject",
42
+ "z": "cmp_tab_1",
43
+ "name": "t2 = 20",
44
+ "props": [
45
+ { "p": "payload" },
46
+ { "p": "topic", "vt": "str" }
47
+ ],
48
+ "repeat": "",
49
+ "crontab": "",
50
+ "once": false,
51
+ "onceDelay": 0.1,
52
+ "topic": "t2",
53
+ "payload": "20",
54
+ "payloadType": "num",
55
+ "x": 120,
56
+ "y": 180,
57
+ "wires": [["cmp_node_1"]]
58
+ },
59
+ {
60
+ "id": "cmp_inj_reset",
61
+ "type": "inject",
62
+ "z": "cmp_tab_1",
63
+ "name": "reset",
64
+ "props": [{ "p": "reset", "v": "true", "vt": "bool" }],
65
+ "repeat": "",
66
+ "crontab": "",
67
+ "once": false,
68
+ "onceDelay": 0.1,
69
+ "x": 120,
70
+ "y": 220,
71
+ "wires": [["cmp_node_1"]]
72
+ },
73
+ {
74
+ "id": "cmp_node_1",
75
+ "type": "Comparator",
76
+ "z": "cmp_tab_1",
77
+ "name": "t1 > t2",
78
+ "property": "payload",
79
+ "math": ">",
80
+ "topic1": "t1",
81
+ "topic2": "t2",
82
+ "x": 330,
83
+ "y": 180,
84
+ "wires": [["cmp_dbg_1"]]
85
+ },
86
+ {
87
+ "id": "cmp_dbg_1",
88
+ "type": "debug",
89
+ "z": "cmp_tab_1",
90
+ "name": "Result (boolean)",
91
+ "active": true,
92
+ "tosidebar": true,
93
+ "console": false,
94
+ "tostatus": false,
95
+ "complete": "payload",
96
+ "targetType": "msg",
97
+ "statusVal": "",
98
+ "statusType": "auto",
99
+ "x": 550,
100
+ "y": 180,
101
+ "wires": []
102
+ }
103
+ ]
104
+
@@ -0,0 +1,105 @@
1
+ [
2
+ {
3
+ "id": "fil_tab_1",
4
+ "type": "tab",
5
+ "label": "FilterUltimate - true/false routing",
6
+ "disabled": false,
7
+ "info": "Esempio: instradamento su 2 uscite in base al valore booleano (con supporto translator-config)."
8
+ },
9
+ {
10
+ "id": "fil_cmt_1",
11
+ "type": "comment",
12
+ "z": "fil_tab_1",
13
+ "name": "Output 1 = True, Output 2 = False",
14
+ "info": "Invia \"on\"/\"off\": il translator-config converte a booleano prima del filtro.",
15
+ "x": 230,
16
+ "y": 60,
17
+ "wires": []
18
+ },
19
+ {
20
+ "id": "fil_inj_on",
21
+ "type": "inject",
22
+ "z": "fil_tab_1",
23
+ "name": "payload = \"on\"",
24
+ "props": [
25
+ { "p": "payload", "v": "on", "vt": "str" },
26
+ { "p": "topic", "v": "state", "vt": "str" }
27
+ ],
28
+ "repeat": "",
29
+ "crontab": "",
30
+ "once": false,
31
+ "onceDelay": 0.1,
32
+ "x": 140,
33
+ "y": 140,
34
+ "wires": [["fil_node_1"]]
35
+ },
36
+ {
37
+ "id": "fil_inj_off",
38
+ "type": "inject",
39
+ "z": "fil_tab_1",
40
+ "name": "payload = \"off\"",
41
+ "props": [
42
+ { "p": "payload", "v": "off", "vt": "str" },
43
+ { "p": "topic", "v": "state", "vt": "str" }
44
+ ],
45
+ "repeat": "",
46
+ "crontab": "",
47
+ "once": false,
48
+ "onceDelay": 0.1,
49
+ "x": 140,
50
+ "y": 180,
51
+ "wires": [["fil_node_1"]]
52
+ },
53
+ {
54
+ "id": "fil_node_1",
55
+ "type": "FilterUltimate",
56
+ "z": "fil_tab_1",
57
+ "name": "Filter (HA)",
58
+ "payloadPropName": "payload",
59
+ "translatorConfig": "fil_trans_1",
60
+ "x": 350,
61
+ "y": 160,
62
+ "wires": [["fil_dbg_true"], ["fil_dbg_false"]]
63
+ },
64
+ {
65
+ "id": "fil_dbg_true",
66
+ "type": "debug",
67
+ "z": "fil_tab_1",
68
+ "name": "Output True",
69
+ "active": true,
70
+ "tosidebar": true,
71
+ "console": false,
72
+ "tostatus": false,
73
+ "complete": "payload",
74
+ "targetType": "msg",
75
+ "statusVal": "",
76
+ "statusType": "auto",
77
+ "x": 580,
78
+ "y": 140,
79
+ "wires": []
80
+ },
81
+ {
82
+ "id": "fil_dbg_false",
83
+ "type": "debug",
84
+ "z": "fil_tab_1",
85
+ "name": "Output False",
86
+ "active": true,
87
+ "tosidebar": true,
88
+ "console": false,
89
+ "tostatus": false,
90
+ "complete": "payload",
91
+ "targetType": "msg",
92
+ "statusVal": "",
93
+ "statusType": "auto",
94
+ "x": 580,
95
+ "y": 180,
96
+ "wires": []
97
+ },
98
+ {
99
+ "id": "fil_trans_1",
100
+ "type": "translator-config",
101
+ "name": "Home Assistant",
102
+ "commandText": "on:true\noff:false\nactive:true\ninactive:false\nopen:true\nclosed:false\nclose:false\n1:true\n0:false\ntrue:true\nfalse:false\nhome:true\nnot_home:false"
103
+ }
104
+ ]
105
+
@@ -0,0 +1,82 @@
1
+ [
2
+ {
3
+ "id": "imp_tab_1",
4
+ "type": "tab",
5
+ "label": "ImpulseUltimate - timed sequence",
6
+ "disabled": false,
7
+ "info": "Esempio: avvia una sequenza di comandi (send/wait/send) quando riceve payload=true."
8
+ },
9
+ {
10
+ "id": "imp_cmt_1",
11
+ "type": "comment",
12
+ "z": "imp_tab_1",
13
+ "name": "Start/Stop sequenza",
14
+ "info": "payload=true avvia la sequenza; payload=false ferma la sequenza in corso.",
15
+ "x": 210,
16
+ "y": 60,
17
+ "wires": []
18
+ },
19
+ {
20
+ "id": "imp_inj_start",
21
+ "type": "inject",
22
+ "z": "imp_tab_1",
23
+ "name": "Start",
24
+ "props": [{ "p": "payload" }],
25
+ "repeat": "",
26
+ "crontab": "",
27
+ "once": false,
28
+ "onceDelay": 0.1,
29
+ "topic": "",
30
+ "payload": "true",
31
+ "payloadType": "bool",
32
+ "x": 140,
33
+ "y": 140,
34
+ "wires": [["imp_node_1"]]
35
+ },
36
+ {
37
+ "id": "imp_inj_stop",
38
+ "type": "inject",
39
+ "z": "imp_tab_1",
40
+ "name": "Stop",
41
+ "props": [{ "p": "payload" }],
42
+ "repeat": "",
43
+ "crontab": "",
44
+ "once": false,
45
+ "onceDelay": 0.1,
46
+ "topic": "",
47
+ "payload": "false",
48
+ "payloadType": "bool",
49
+ "x": 140,
50
+ "y": 180,
51
+ "wires": [["imp_node_1"]]
52
+ },
53
+ {
54
+ "id": "imp_node_1",
55
+ "type": "ImpulseUltimate",
56
+ "z": "imp_tab_1",
57
+ "name": "Impulse demo",
58
+ "commandText": "// Demo\\nsend:true\\nwait:500\\nsend:false",
59
+ "payloadPropName": "payload",
60
+ "x": 350,
61
+ "y": 160,
62
+ "wires": [["imp_dbg_1"]]
63
+ },
64
+ {
65
+ "id": "imp_dbg_1",
66
+ "type": "debug",
67
+ "z": "imp_tab_1",
68
+ "name": "Output",
69
+ "active": true,
70
+ "tosidebar": true,
71
+ "console": false,
72
+ "tostatus": false,
73
+ "complete": "true",
74
+ "targetType": "full",
75
+ "statusVal": "",
76
+ "statusType": "auto",
77
+ "x": 540,
78
+ "y": 160,
79
+ "wires": []
80
+ }
81
+ ]
82
+