node-red-contrib-modbus-modpackqt 3.3.11 → 3.3.13
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
|
@@ -4,6 +4,28 @@ All notable changes to **node-red-contrib-modbus-modpackqt** are documented
|
|
|
4
4
|
here. This project follows [Semantic Versioning](https://semver.org/) — pin a
|
|
5
5
|
major version (`^2.0.0`) in production.
|
|
6
6
|
|
|
7
|
+
## [3.3.13] — 2026-05-10
|
|
8
|
+
|
|
9
|
+
### Removed
|
|
10
|
+
|
|
11
|
+
- **Embedded slave server section gone from the master config dialog.**
|
|
12
|
+
Redundant — the standalone `modpackqt-slave-server` canvas node already
|
|
13
|
+
owns its own port, register store, and My Slaves picker. Existing
|
|
14
|
+
legacy slave settings on a config node are preserved on disk so older
|
|
15
|
+
flows won't lose data, just hidden from the editor.
|
|
16
|
+
|
|
17
|
+
## [3.3.12] — 2026-05-10
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- **Two separate config node types now.** Master-read and master-write
|
|
22
|
+
use the original `modpackqt-config` (full editable Target Device,
|
|
23
|
+
Transport, embedded slave server) — restored after v3.3.11.
|
|
24
|
+
Master-probe uses a new minimal `modpackqt-probe-config` —
|
|
25
|
+
Name + Account Key + My Connections only, no manual fields. Existing
|
|
26
|
+
flows that wired master-probe to a `modpackqt-config` need to pick
|
|
27
|
+
a probe-config instead (the dropdown will only show valid types).
|
|
28
|
+
|
|
7
29
|
## [3.3.11] — 2026-05-10
|
|
8
30
|
|
|
9
31
|
### Changed
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
const http = require('http');
|
|
19
19
|
const { URL } = require('url');
|
|
20
20
|
|
|
21
|
-
const PALETTE_VERSION = '3.3.
|
|
21
|
+
const PALETTE_VERSION = '3.3.13';
|
|
22
22
|
const DEFAULT_PORT = parseInt(process.env.MODPACKQT_PROBE_PORT, 10) || 8502;
|
|
23
23
|
const BIND_HOST = process.env.MODPACKQT_PROBE_HOST || '127.0.0.1';
|
|
24
24
|
const PORT_RETRY = 5;
|
|
@@ -28,6 +28,14 @@
|
|
|
28
28
|
return this.name && this.name !== 'ModPackQT Device' ? `${this.name} (${t})` : `${t}${s}`;
|
|
29
29
|
},
|
|
30
30
|
oneditprepare: function () {
|
|
31
|
+
const toggleRtu = () => {
|
|
32
|
+
const isRtu = $('#node-config-input-masterMode').val() === 'rtu';
|
|
33
|
+
$('.modpackqt-rtu-only').toggle(isRtu);
|
|
34
|
+
$('.modpackqt-tcp-only').toggle(!isRtu);
|
|
35
|
+
};
|
|
36
|
+
$('#node-config-input-masterMode').on('change', toggleRtu);
|
|
37
|
+
toggleRtu();
|
|
38
|
+
|
|
31
39
|
// ── My Connections picker
|
|
32
40
|
const nodeId = this.id;
|
|
33
41
|
const $sel = $('#node-config-input-modpackqt-conn-picker');
|
|
@@ -65,7 +73,9 @@
|
|
|
65
73
|
if (c.host) $('#node-config-input-targetHost').val(c.host);
|
|
66
74
|
if (c.port) $('#node-config-input-targetPort').val(c.port);
|
|
67
75
|
if (c.unitId) $('#node-config-input-unitId').val(c.unitId);
|
|
68
|
-
|
|
76
|
+
if (c.connectionType === 'rtu') {
|
|
77
|
+
$('#node-config-input-masterMode').val('rtu').trigger('change');
|
|
78
|
+
}
|
|
69
79
|
});
|
|
70
80
|
loadConnections();
|
|
71
81
|
}
|
|
@@ -96,27 +106,76 @@
|
|
|
96
106
|
Picks a saved connection from modpackqt.com — auto-fills Host, Port, and Unit ID below.
|
|
97
107
|
</div>
|
|
98
108
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
<
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
<
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
<
|
|
109
|
+
<h4 style="margin-top:18px">Target Device</h4>
|
|
110
|
+
<div class="form-row modpackqt-tcp-only">
|
|
111
|
+
<label for="node-config-input-targetHost"><i class="fa fa-plug"></i> IP Address</label>
|
|
112
|
+
<input type="text" id="node-config-input-targetHost" placeholder="e.g. 192.168.1.10 — IP/hostname of the Modbus device">
|
|
113
|
+
</div>
|
|
114
|
+
<div class="form-tips modpackqt-tcp-only" style="font-size:11px;color:#6b7280;margin:-8px 0 12px 105px">
|
|
115
|
+
The IP address (or hostname) of the target Modbus device on your network.
|
|
116
|
+
</div>
|
|
117
|
+
<div class="form-row modpackqt-tcp-only">
|
|
118
|
+
<label for="node-config-input-targetPort"><i class="fa fa-hashtag"></i> Port</label>
|
|
119
|
+
<input type="number" id="node-config-input-targetPort" min="1" max="65535" placeholder="502 (Modbus TCP default)">
|
|
120
|
+
</div>
|
|
121
|
+
<div class="form-row">
|
|
122
|
+
<label for="node-config-input-unitId"><i class="fa fa-id-card"></i> Unit ID</label>
|
|
123
|
+
<input type="number" id="node-config-input-unitId" min="1" max="247" placeholder="1 (slave address on the bus)">
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<h4 style="margin-top:18px">Transport</h4>
|
|
127
|
+
<div class="form-row">
|
|
128
|
+
<label for="node-config-input-masterMode"><i class="fa fa-cogs"></i> Mode</label>
|
|
129
|
+
<select id="node-config-input-masterMode">
|
|
130
|
+
<option value="tcp">Modbus TCP</option>
|
|
131
|
+
<option value="rtu">Modbus RTU (Serial)</option>
|
|
132
|
+
</select>
|
|
133
|
+
</div>
|
|
134
|
+
<div class="form-row modpackqt-rtu-only">
|
|
135
|
+
<label for="node-config-input-serialPort"><i class="fa fa-plug"></i> Serial Port</label>
|
|
136
|
+
<input type="text" id="node-config-input-serialPort" placeholder="/dev/ttyUSB0 or COM3">
|
|
137
|
+
</div>
|
|
138
|
+
<div class="form-row modpackqt-rtu-only">
|
|
139
|
+
<label for="node-config-input-baudRate"><i class="fa fa-tachometer"></i> Baud</label>
|
|
140
|
+
<input type="number" id="node-config-input-baudRate" placeholder="9600">
|
|
141
|
+
</div>
|
|
142
|
+
<div class="form-row modpackqt-rtu-only">
|
|
143
|
+
<label for="node-config-input-parity"><i class="fa fa-list"></i> Parity</label>
|
|
144
|
+
<select id="node-config-input-parity">
|
|
145
|
+
<option value="none">None</option>
|
|
146
|
+
<option value="even">Even</option>
|
|
147
|
+
<option value="odd">Odd</option>
|
|
148
|
+
</select>
|
|
149
|
+
</div>
|
|
150
|
+
<div class="form-row modpackqt-rtu-only">
|
|
151
|
+
<label for="node-config-input-dataBits"><i class="fa fa-hashtag"></i> Data Bits</label>
|
|
152
|
+
<select id="node-config-input-dataBits">
|
|
153
|
+
<option value="8">8</option><option value="7">7</option>
|
|
154
|
+
</select>
|
|
155
|
+
</div>
|
|
156
|
+
<div class="form-row modpackqt-rtu-only">
|
|
157
|
+
<label for="node-config-input-stopBits"><i class="fa fa-hashtag"></i> Stop Bits</label>
|
|
158
|
+
<select id="node-config-input-stopBits">
|
|
159
|
+
<option value="1">1</option><option value="2">2</option>
|
|
160
|
+
</select>
|
|
161
|
+
</div>
|
|
162
|
+
<div class="form-row">
|
|
163
|
+
<label for="node-config-input-timeoutMs"><i class="fa fa-clock-o"></i> Timeout (ms)</label>
|
|
164
|
+
<input type="number" id="node-config-input-timeoutMs" placeholder="3000">
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
<!-- Embedded slave server lives on the standalone modpackqt-slave-server
|
|
168
|
+
canvas node now. These hidden inputs preserve any legacy values on
|
|
169
|
+
existing flows so re-saving doesn't wipe them. -->
|
|
112
170
|
<input type="hidden" id="node-config-input-slaveEnabled">
|
|
113
171
|
<input type="hidden" id="node-config-input-slaveHost">
|
|
114
172
|
<input type="hidden" id="node-config-input-slavePort">
|
|
115
173
|
|
|
116
174
|
<div class="form-tips" style="margin-top:14px">
|
|
117
|
-
<b>One
|
|
118
|
-
|
|
119
|
-
|
|
175
|
+
<b>One runtime = one device.</b> For multiple devices, create one runtime
|
|
176
|
+
config per device — the read/write nodes then just pick which device to
|
|
177
|
+
talk to. To run an embedded slave server, drop a
|
|
178
|
+
<code>modpackqt-slave-server</code> node onto the canvas.
|
|
120
179
|
</div>
|
|
121
180
|
<div class="form-row" style="margin-top:18px;padding-top:14px;border-top:1px solid #e5e7eb;text-align:center;">
|
|
122
181
|
<a href="https://modpackqt.com" target="_blank" rel="noopener noreferrer"
|
|
@@ -143,12 +202,16 @@
|
|
|
143
202
|
only need to know the function code, address, and quantity.
|
|
144
203
|
</p>
|
|
145
204
|
|
|
146
|
-
<h3>
|
|
205
|
+
<h3>Master mode</h3>
|
|
206
|
+
<ul>
|
|
207
|
+
<li><b>Modbus TCP</b> — connects to the configured Host/Port.</li>
|
|
208
|
+
<li><b>Modbus RTU</b> — opens the configured serial port. Host/Port are ignored; only Unit ID matters.</li>
|
|
209
|
+
</ul>
|
|
210
|
+
|
|
211
|
+
<h3>Want to run a slave?</h3>
|
|
147
212
|
<p>
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
To run an embedded Modbus TCP slave server, drop a
|
|
152
|
-
<code>modpackqt-slave-server</code> node onto the canvas instead.
|
|
213
|
+
Drop a <code>modpackqt-slave-server</code> node onto the canvas. It owns its
|
|
214
|
+
own port, its own register store, and its own My Slaves picker for loading
|
|
215
|
+
saved slave profiles from modpackqt.com.
|
|
153
216
|
</p>
|
|
154
217
|
</script>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
color: '#7c3aed',
|
|
5
5
|
defaults: {
|
|
6
6
|
name: { value: '' },
|
|
7
|
-
server: { value: '', type: 'modpackqt-config', required: true },
|
|
7
|
+
server: { value: '', type: 'modpackqt-probe-config', required: true },
|
|
8
8
|
// Legacy per-node fields — kept hidden so old flows keep working.
|
|
9
9
|
targetHost: { value: '' },
|
|
10
10
|
targetPort: { value: 0, validate: function (v) { return v === '' || v === 0 || RED.validators.number()(v); } },
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
<script type="text/javascript">
|
|
2
|
+
RED.nodes.registerType('modpackqt-probe-config', {
|
|
3
|
+
category: 'config',
|
|
4
|
+
credentials: {
|
|
5
|
+
apiKey: { type: 'password' }
|
|
6
|
+
},
|
|
7
|
+
defaults: {
|
|
8
|
+
name: { value: 'ModPackQT Device' },
|
|
9
|
+
targetHost: { value: 'localhost' },
|
|
10
|
+
targetPort: { value: 502, validate: RED.validators.number() },
|
|
11
|
+
unitId: { value: 1, validate: RED.validators.number() },
|
|
12
|
+
masterMode: { value: 'tcp', required: true },
|
|
13
|
+
serialPort: { value: '' },
|
|
14
|
+
baudRate: { value: 9600 },
|
|
15
|
+
parity: { value: 'none' },
|
|
16
|
+
dataBits: { value: 8 },
|
|
17
|
+
stopBits: { value: 1 },
|
|
18
|
+
timeoutMs: { value: 3000, validate: RED.validators.number() },
|
|
19
|
+
slaveEnabled: { value: false },
|
|
20
|
+
slaveHost: { value: '0.0.0.0' },
|
|
21
|
+
slavePort: { value: 1502, validate: RED.validators.number() }
|
|
22
|
+
},
|
|
23
|
+
label: function () {
|
|
24
|
+
const t = this.masterMode === 'rtu'
|
|
25
|
+
? `RTU ${this.serialPort || '?'} #${this.unitId || 1}`
|
|
26
|
+
: `${this.targetHost || 'localhost'}:${this.targetPort || 502} #${this.unitId || 1}`;
|
|
27
|
+
const s = this.slaveEnabled ? ` + slave :${this.slavePort}` : '';
|
|
28
|
+
return this.name && this.name !== 'ModPackQT Device' ? `${this.name} (${t})` : `${t}${s}`;
|
|
29
|
+
},
|
|
30
|
+
oneditprepare: function () {
|
|
31
|
+
// ── My Connections picker
|
|
32
|
+
const nodeId = this.id;
|
|
33
|
+
const $sel = $('#node-config-input-modpackqt-conn-picker');
|
|
34
|
+
const loadConnections = function () {
|
|
35
|
+
$sel.empty().append('<option value="">— Loading… —</option>');
|
|
36
|
+
if (!nodeId) {
|
|
37
|
+
$sel.empty().append('<option value="">— Save this config first, then reopen —</option>');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
$.getJSON('modpackqt/connections?probe=' + encodeURIComponent(nodeId))
|
|
41
|
+
.done(function (rows) {
|
|
42
|
+
$sel.empty().append('<option value="">— Manual entry —</option>');
|
|
43
|
+
(rows || []).forEach(function (c) {
|
|
44
|
+
const label = (c.name || '(unnamed)') + (c.connectionType === 'rtu'
|
|
45
|
+
? ' — RTU'
|
|
46
|
+
: ' — ' + (c.host || '?') + ':' + (c.port || 502) + ' #' + (c.unitId || 1));
|
|
47
|
+
$('<option>').val(c.id).text(label).data('conn', c).appendTo($sel);
|
|
48
|
+
});
|
|
49
|
+
})
|
|
50
|
+
.fail(function (xhr) {
|
|
51
|
+
const msg = (xhr.responseJSON && xhr.responseJSON.error) || ('HTTP ' + xhr.status);
|
|
52
|
+
$sel.empty().append($('<option>').val('').text('— ' + msg + ' —'));
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
$('#modpackqt-conn-picker-refresh').on('click', function (e) {
|
|
56
|
+
e.preventDefault();
|
|
57
|
+
loadConnections();
|
|
58
|
+
});
|
|
59
|
+
$sel.on('change', function () {
|
|
60
|
+
const c = $(this).find('option:selected').data('conn');
|
|
61
|
+
if (!c) return;
|
|
62
|
+
if (!$('#node-config-input-name').val() || $('#node-config-input-name').val() === 'ModPackQT Device') {
|
|
63
|
+
$('#node-config-input-name').val(c.name || '');
|
|
64
|
+
}
|
|
65
|
+
if (c.host) $('#node-config-input-targetHost').val(c.host);
|
|
66
|
+
if (c.port) $('#node-config-input-targetPort').val(c.port);
|
|
67
|
+
if (c.unitId) $('#node-config-input-unitId').val(c.unitId);
|
|
68
|
+
$('#node-config-input-masterMode').val(c.connectionType === 'rtu' ? 'rtu' : 'tcp');
|
|
69
|
+
});
|
|
70
|
+
loadConnections();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
</script>
|
|
74
|
+
|
|
75
|
+
<script type="text/html" data-template-name="modpackqt-probe-config">
|
|
76
|
+
<div class="form-row">
|
|
77
|
+
<label for="node-config-input-name"><i class="fa fa-tag"></i> Name</label>
|
|
78
|
+
<input type="text" id="node-config-input-name" placeholder="e.g. Inverter A">
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
<div class="form-row">
|
|
82
|
+
<label for="node-config-input-apiKey"><i class="fa fa-key"></i> Account Key</label>
|
|
83
|
+
<input type="password" id="node-config-input-apiKey" placeholder="Paste your ModPackQT tunnel key">
|
|
84
|
+
</div>
|
|
85
|
+
<div class="form-tips" style="font-size:11px;color:#6b7280;margin:-8px 0 4px 105px">
|
|
86
|
+
Generate at <a href="https://modpackqt.com/settings" target="_blank" rel="noopener">modpackqt.com → Settings → Cloud Gateways</a>.
|
|
87
|
+
Loads your saved connections in the picker below.
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
<div class="form-row">
|
|
91
|
+
<label for="node-config-input-modpackqt-conn-picker"><i class="fa fa-cloud-download"></i> My Connections</label>
|
|
92
|
+
<select id="node-config-input-modpackqt-conn-picker" style="width:65%"></select>
|
|
93
|
+
<button type="button" id="modpackqt-conn-picker-refresh" class="red-ui-button" title="Reload" style="margin-left:4px"><i class="fa fa-refresh"></i></button>
|
|
94
|
+
</div>
|
|
95
|
+
<div class="form-tips" style="font-size:11px;color:#6b7280;margin:-8px 0 12px 105px">
|
|
96
|
+
Picks a saved connection from modpackqt.com — auto-fills Host, Port, and Unit ID below.
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<!-- All connection details (host/port/unit/mode/timeout/embedded-slave) are
|
|
100
|
+
set by the My Connections picker above. They live as hidden inputs so
|
|
101
|
+
the runtime still has them, but they are no longer hand-edited here. -->
|
|
102
|
+
<input type="hidden" id="node-config-input-targetHost">
|
|
103
|
+
<input type="hidden" id="node-config-input-targetPort">
|
|
104
|
+
<input type="hidden" id="node-config-input-unitId">
|
|
105
|
+
<input type="hidden" id="node-config-input-masterMode">
|
|
106
|
+
<input type="hidden" id="node-config-input-serialPort">
|
|
107
|
+
<input type="hidden" id="node-config-input-baudRate">
|
|
108
|
+
<input type="hidden" id="node-config-input-parity">
|
|
109
|
+
<input type="hidden" id="node-config-input-dataBits">
|
|
110
|
+
<input type="hidden" id="node-config-input-stopBits">
|
|
111
|
+
<input type="hidden" id="node-config-input-timeoutMs">
|
|
112
|
+
<input type="hidden" id="node-config-input-slaveEnabled">
|
|
113
|
+
<input type="hidden" id="node-config-input-slaveHost">
|
|
114
|
+
<input type="hidden" id="node-config-input-slavePort">
|
|
115
|
+
|
|
116
|
+
<div class="form-tips" style="margin-top:14px">
|
|
117
|
+
<b>One device per config.</b> Use the picker above to choose which saved
|
|
118
|
+
Modbus device this config talks to. For more devices, create another
|
|
119
|
+
config and pick a different one.
|
|
120
|
+
</div>
|
|
121
|
+
<div class="form-row" style="margin-top:18px;padding-top:14px;border-top:1px solid #e5e7eb;text-align:center;">
|
|
122
|
+
<a href="https://modpackqt.com" target="_blank" rel="noopener noreferrer"
|
|
123
|
+
style="display:inline-block;padding:8px 20px;background:#2563eb;color:#fff;
|
|
124
|
+
text-decoration:none;border-radius:6px;font-weight:600;font-size:13px;
|
|
125
|
+
box-shadow:0 1px 2px rgba(0,0,0,0.08);">
|
|
126
|
+
Premium Advanced Modbus Tester <i class="fa fa-external-link" style="margin-left:6px;"></i>
|
|
127
|
+
</a>
|
|
128
|
+
<div style="margin-top:6px;font-size:11px;color:#6b7280;">by ModPackQT — full-featured web tester, simulator & AI helper</div>
|
|
129
|
+
</div>
|
|
130
|
+
</script>
|
|
131
|
+
|
|
132
|
+
<script type="text/html" data-help-name="modpackqt-probe-config">
|
|
133
|
+
<p>
|
|
134
|
+
Defines <b>one Modbus device</b> plus the embedded runtime that talks to it. Master and
|
|
135
|
+
probe nodes simply pick which runtime config to use — no need to retype host/port/unit
|
|
136
|
+
on every node.
|
|
137
|
+
</p>
|
|
138
|
+
|
|
139
|
+
<h3>One runtime = one device</h3>
|
|
140
|
+
<p>
|
|
141
|
+
For each remote Modbus device you want to read/write, create a separate runtime config.
|
|
142
|
+
Each carries its own Host / Port / Unit ID. Read and write nodes inherit those — they
|
|
143
|
+
only need to know the function code, address, and quantity.
|
|
144
|
+
</p>
|
|
145
|
+
|
|
146
|
+
<h3>Where do the connection details come from?</h3>
|
|
147
|
+
<p>
|
|
148
|
+
Paste your <b>Account Key</b>, then pick a saved device from <b>My
|
|
149
|
+
Connections</b>. The host, port, unit ID, and transport mode are all
|
|
150
|
+
pulled from your modpackqt.com profile — no hand-editing needed here.
|
|
151
|
+
To run an embedded Modbus TCP slave server, drop a
|
|
152
|
+
<code>modpackqt-slave-server</code> node onto the canvas instead.
|
|
153
|
+
</p>
|
|
154
|
+
</script>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModPackQT Probe Config — lightweight config node used by master-probe only.
|
|
3
|
+
*
|
|
4
|
+
* No embedded Modbus runtime, no slave server, no master client pool.
|
|
5
|
+
* Just stores: account key (credential) + a chosen device's host / port /
|
|
6
|
+
* unit ID, all populated by the My Connections picker. Master-probe reads
|
|
7
|
+
* those to build its deep-link URL into the modpackqt.com web console.
|
|
8
|
+
*/
|
|
9
|
+
module.exports = function (RED) {
|
|
10
|
+
function ModPackQTProbeConfigNode(config) {
|
|
11
|
+
RED.nodes.createNode(this, config);
|
|
12
|
+
this.targetHost = config.targetHost || '';
|
|
13
|
+
this.targetPort = parseInt(config.targetPort, 10) || 502;
|
|
14
|
+
this.unitId = parseInt(config.unitId, 10) || 1;
|
|
15
|
+
}
|
|
16
|
+
RED.nodes.registerType('modpackqt-probe-config', ModPackQTProbeConfigNode, {
|
|
17
|
+
credentials: { apiKey: { type: 'password' } }
|
|
18
|
+
});
|
|
19
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-red-contrib-modbus-modpackqt",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.13",
|
|
4
4
|
"description": "Modbus commissioning, testing & analysis tools for Node-RED. Embedded Modbus TCP/RTU master + slave server, FC1/FC2/FC3/FC4 reads, FC5/FC6/FC15/FC16 writes, built-in slave register store, and a passive traffic monitor for debugging. 100% free, MIT, no usage limits. By ModPackQT — open the matching web console at modpackqt.com for register decoding, simulation and AI assistance.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"node-red",
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"version": ">=2.0.0",
|
|
46
46
|
"nodes": {
|
|
47
47
|
"modpackqt-config": "nodes/modpackqt-config.js",
|
|
48
|
+
"modpackqt-probe-config": "nodes/modpackqt-probe-config.js",
|
|
48
49
|
"modpackqt-master-read": "nodes/modpackqt-master-read.js",
|
|
49
50
|
"modpackqt-master-write": "nodes/modpackqt-master-write.js",
|
|
50
51
|
"modpackqt-slave-read": "nodes/modpackqt-slave-read.js",
|