node-red-contrib-velbus-2026 0.8.1

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.
Files changed (56) hide show
  1. package/CHANGELOG_FORUM.md +784 -0
  2. package/LICENSE +21 -0
  3. package/README.md +140 -0
  4. package/examples/velbus-basic-relay-dimmer.json +328 -0
  5. package/index.js +3 -0
  6. package/lib/blind-types-20.js +26 -0
  7. package/lib/blind-types-s.js +46 -0
  8. package/lib/blind-types.js +38 -0
  9. package/lib/dimmer-types-20.js +120 -0
  10. package/lib/dimmer-types.js +34 -0
  11. package/lib/glass-panel-types.js +296 -0
  12. package/lib/pir-types-20.js +51 -0
  13. package/lib/pir-types.js +61 -0
  14. package/lib/relay-types-20.js +43 -0
  15. package/lib/relay-types.js +39 -0
  16. package/lib/sensor-types-20.js +29 -0
  17. package/lib/sensor-types.js +49 -0
  18. package/lib/velbus-utils.js +80 -0
  19. package/nodes/velbus-blind/velbus-blind.html +165 -0
  20. package/nodes/velbus-blind/velbus-blind.js +251 -0
  21. package/nodes/velbus-blind-20/velbus-blind-20.html +179 -0
  22. package/nodes/velbus-blind-20/velbus-blind-20.js +300 -0
  23. package/nodes/velbus-blind-s/velbus-blind-s.html +181 -0
  24. package/nodes/velbus-blind-s/velbus-blind-s.js +282 -0
  25. package/nodes/velbus-bridge/velbus-bridge.html +72 -0
  26. package/nodes/velbus-bridge/velbus-bridge.js +304 -0
  27. package/nodes/velbus-button/velbus-button.html +172 -0
  28. package/nodes/velbus-button/velbus-button.js +117 -0
  29. package/nodes/velbus-clock/velbus-clock.html +198 -0
  30. package/nodes/velbus-clock/velbus-clock.js +273 -0
  31. package/nodes/velbus-dimmer/velbus-dimmer.html +174 -0
  32. package/nodes/velbus-dimmer/velbus-dimmer.js +457 -0
  33. package/nodes/velbus-dimmer-20/velbus-dimmer-20.html +271 -0
  34. package/nodes/velbus-dimmer-20/velbus-dimmer-20.js +602 -0
  35. package/nodes/velbus-glass-panel/velbus-glass-panel.html +337 -0
  36. package/nodes/velbus-glass-panel/velbus-glass-panel.js +492 -0
  37. package/nodes/velbus-meteo/velbus-meteo.html +120 -0
  38. package/nodes/velbus-meteo/velbus-meteo.js +279 -0
  39. package/nodes/velbus-pir/velbus-pir.html +187 -0
  40. package/nodes/velbus-pir/velbus-pir.js +269 -0
  41. package/nodes/velbus-pir-20/velbus-pir-20.html +186 -0
  42. package/nodes/velbus-pir-20/velbus-pir-20.js +352 -0
  43. package/nodes/velbus-relay/velbus-relay.html +215 -0
  44. package/nodes/velbus-relay/velbus-relay.js +404 -0
  45. package/nodes/velbus-relay-20/velbus-relay-20.html +123 -0
  46. package/nodes/velbus-relay-20/velbus-relay-20.js +434 -0
  47. package/nodes/velbus-scan/velbus-scan.html +87 -0
  48. package/nodes/velbus-scan/velbus-scan.js +313 -0
  49. package/nodes/velbus-sensor/velbus-sensor.html +154 -0
  50. package/nodes/velbus-sensor/velbus-sensor.js +259 -0
  51. package/nodes/velbus-sensor-20/velbus-sensor-20.html +158 -0
  52. package/nodes/velbus-sensor-20/velbus-sensor-20.js +314 -0
  53. package/nodes/velbus-thermostat/velbus-thermostat.html +191 -0
  54. package/nodes/velbus-thermostat/velbus-thermostat.js +322 -0
  55. package/package.json +55 -0
  56. package/velbus-2026-repo.bundle +0 -0
@@ -0,0 +1,784 @@
1
+ # node-red-contrib-velbus-2026 — Development Changelog
2
+
3
+ **Author:** Stuart Hanlon, MDAR Limited (UK Velbus distributor)
4
+ **GitHub:** https://github.com/MDAR/node-red-contrib-velbus-2026
5
+ **npm:** node-red-contrib-velbus-2026
6
+ **Status:** Active development — real hardware tested on live client installations
7
+
8
+ This palette is a ground-up rewrite for modern Node-RED (v3+/v5) with full
9
+ V2.0 (-20 series) module support. It replaces the abandoned `node-red-contrib-velbus`
10
+ palette (gertst, last updated 2020).
11
+
12
+ Testers welcome — particularly anyone with hardware not listed as confirmed below.
13
+ All feedback via GitHub issues, with examples and debug captures where possible.
14
+
15
+ ---
16
+
17
+ ## v0.8.1 — 07/07/2026
18
+
19
+ ### velbus-clock — set_alarm command (global + local, one command)
20
+ - **Prompted by Stuart's question:** is velbus-clock the right place for
21
+ per-module ("local") alarm time updates, given the packet is identical to
22
+ the global broadcast version, differing only in destination address?
23
+ - **Confirmed:** `0xC3` (Set Clock Alarm) is a shared V2-only system command,
24
+ byte-identical across relay-20, dimmer-20, and glass-panel-20 protocol
25
+ PDFs, and confirmed absent entirely from the original-series PDFs — same
26
+ V2-only "system clock" block as 0xD8/0xB7/0xAF. It is not tied to any one
27
+ module type's semantics.
28
+ - **Decision:** kept in velbus-clock rather than duplicated across every V2
29
+ node type. `msg.payload.address` omitted → global (broadcast to 0x00,
30
+ every module gets the same alarm); provided → local (that module only).
31
+ Documented explicitly in the node's doc comment and help as a deliberate
32
+ exception to the palette's usual one-node-per-module-address pattern —
33
+ flagged as a judgement call, not a settled architecture decision, in case
34
+ a dedicated per-module config field (with scan-dropdown support, matching
35
+ every other node) turns out to be wanted later instead.
36
+ - Verified with the mock-RED harness: checksum hand-checked, global vs local
37
+ addressing confirmed identical body/different destination, hex-string vs
38
+ decimal address input both resolve correctly, invalid alarm number and
39
+ invalid address (e.g. 0xFF, out of the 1-254 module range) both rejected
40
+ with a clear warning rather than silently sending garbage. **Not yet sent
41
+ to a real bus.**
42
+
43
+ ---
44
+
45
+ ## v0.8.0 — 06/07/2026
46
+
47
+ ### velbus-clock — new node (18th node)
48
+ - **Requested by Stuart:** broadcast system time/date to bus address `0x00`.
49
+ No existing node covered this.
50
+ - Sends `0xD8` (Set real time clock: day-of-week, hour, minute), `0xB7`
51
+ (Set date: day, month, year — optional, on by default), and `0xAF` (Set
52
+ daylight savings — optional, on by default) to the broadcast address
53
+ `0x00`, at low priority. Confirmed against
54
+ `protocol_vmb4ryld_20_vmb4ryno_20_vmb1rys_20.pdf` (ed.3) — this is a
55
+ bus-wide broadcast command set shared across the whole module family,
56
+ not per-module, so there's only one place to get it right.
57
+ - Manual trigger via input (bare inject broadcasts using config defaults +
58
+ current system time), or `autoBroadcast` config option for a periodic
59
+ send on a configurable interval (first send 5s after deploy).
60
+ - `msg.payload.date` can override the time/date sent (useful for testing);
61
+ `msg.payload.dst` can override the auto-detected DST flag.
62
+ - DST auto-detected from the Node-RED host's own configured timezone
63
+ (Jan-1/Jul-1 offset comparison) — correct for UK/EU/US-style single-
64
+ transition DST, only as accurate as the host's own clock/TZ setting.
65
+ - Added `velbus-bridge.isConnected()` — a small public accessor so nodes
66
+ can check connection state without reaching into the underscore-prefixed
67
+ `_connected` internal field. Used by velbus-clock to avoid sending into
68
+ a dead socket and to report a clear "not connected" status instead of a
69
+ generic dropped-packet warning.
70
+ - Verified with a mock-RED test harness (not real hardware): checksum,
71
+ DLC, and byte layout hand-verified for a known date/time; day-of-week
72
+ conversion (JS Sunday-first → Velbus Monday-first) checked against
73
+ today's actual weekday; all four input commands and the not-connected/
74
+ invalid-date edge cases exercised. **Not yet sent to a real bus** —
75
+ worth confirming a module's clock actually updates before relying on it.
76
+
77
+ ---
78
+
79
+ ## v0.7.10 — 06/07/2026
80
+
81
+ ### velbus-relay + velbus-relay-20 — per-pulse "channel switched" broadcast fixed
82
+ - **Reported by Stuart:** after the v0.7.9 interval_timer fix, VelbusLink showed
83
+ a status change on every pulse start/stop while blinking, but Node-RED only
84
+ showed the start and end of the timer.
85
+ - **Root cause:** the `0x00` "channel switched" broadcast handler in both nodes
86
+ required `pri === 0xFB` (low priority) before processing the packet. Checked
87
+ against `protocol_vmb4ryld_10.pdf` / `protocol_vmb4ryld_20_vmb4ryno_20_
88
+ vmb1rys_20.pdf` and the official `packetprotocol` README's priority table:
89
+ this broadcast is sent at **high priority (`0xF8`)**, the opposite of what
90
+ the filter required. Every occurrence was silently dropped — the filter had
91
+ never once matched, on either node, since it was added.
92
+ - **Fix:** removed the priority gate entirely (nothing else in either file
93
+ filters by priority, and `cmd === 0x00` has only one defined meaning for a
94
+ relay module, so no filter is needed). The `relay_switched` event
95
+ (`state: 'on'` / `state: 'off'`) now fires on every pulse edge during
96
+ `interval_timer` blinking, and on every local push-button-driven switch —
97
+ both previously invisible to Node-RED.
98
+ - **Note:** the separate `relay_status` (`0xFB`) message legitimately does
99
+ NOT toggle per pulse — the protocol's status byte only distinguishes
100
+ off/on/"interval timer on" as three fixed states, with no per-pulse
101
+ encoding. Seeing `relay_status` fire only at start/end while
102
+ `relay_switched` fires on every pulse is correct behaviour, not a
103
+ remaining bug.
104
+
105
+ ---
106
+
107
+ ## v0.7.9 — 02/07/2026
108
+
109
+ ### velbus-relay — interval_timer bug fixed (real cause: wrong protocol read, not just byte overflow)
110
+ - **Root cause:** `interval_timer` built an 11-byte body
111
+ (`[0x0D, chBit, duration×3, pulse×3, pause×3]`) against a protocol that
112
+ only ever carries ONE 24-bit time parameter for this command. Confirmed
113
+ against the official protocol PDFs for every module this node covers
114
+ (VMB4RYLD, VMB4RYLD-10, VMB4RYNO, VMB4RYNO-10, VMB1RYNO, VMB1RYNOS,
115
+ VMB1RYS): `0x0D` = COMMAND_START_BLINK_RELAY_TIMER, DLC=5,
116
+ body = `[0x0D, relay bit, time-hi, time-mid, time-lo]`.
117
+ The "pulse"/"pause" fields the previous implementation expected only
118
+ exist in a completely different table — the push-button local Action
119
+ code list (H'16'-H'18', written to module memory to program what a
120
+ physical button does) — not in this live bus command at all. An 11-byte
121
+ body exceeds the maximum for any Velbus frame, so the malformed packet
122
+ never reached the bus — consistent with the reported symptom (every
123
+ other command visible in VelbusLink, this one absent entirely).
124
+ - **Fix:** `interval_timer` now sends only `duration` (seconds, `-1`/`0xFFFFFF`
125
+ = permanent blinking). The module blinks at its own fixed rate — there is
126
+ no bus command to set a custom on/off rate.
127
+ - **velbus-relay-20 — command removed, not fixed.** The same fictitious
128
+ three-parameter command existed here too, but checking the V2 protocol PDF
129
+ (VMB4RYLD-20/VMB4RYNO-20/VMB1RYS-20, ed.3) found there is no equivalent
130
+ live bus command at all for V2 relays. An "interval timer running" status
131
+ bit exists in the 0xFB status packet, but it can only be triggered by
132
+ writing a Program Step (0xC0/0xC2, Action code 22) to module memory,
133
+ linked to a button or scenario — commissioning-agent territory, not a
134
+ live command. `interval_timer` on velbus-relay-20 now warns clearly
135
+ instead of silently sending nothing useful.
136
+
137
+ ---
138
+
139
+ ## v0.7.8 — 02/07/2026
140
+
141
+ ### velbus-dimmer-20 — VMB4LEDPWM-20 grouping mode verification (read-only)
142
+ - Implements the settings-API read path resolved in commissioning roadmap
143
+ Appendix A.0.2: per-channel "Device Type" (settings index 25), read via
144
+ 0xE7 request / 0xE8 reply. Never writes — writing the grouping mode
145
+ remains a deliberate commissioning-time decision outside this palette.
146
+ - New input command `get_device_type` — reads back the actual Device Type
147
+ setting for a channel and reports the detected grouping mode
148
+ (`single`/`rgb`/`rgbw`) on output 1.
149
+ - New 0xE8 reply handler decodes the full Device Type value table
150
+ (`lib/dimmer-types-20.js`: `DEVICE_TYPE_NAMES`).
151
+ - Automatic mismatch warning on output 2 if channel 1's detected grouping
152
+ mode disagrees with the node's configured `ledMode` — catches the case
153
+ where the config was set before the physical wiring was confirmed, or
154
+ where wiring changed after commissioning.
155
+ - HTML help updated to remove now-stale "read the PDF for the memory
156
+ address" guidance (Priority 1 in the master handover is closed).
157
+
158
+ ---
159
+
160
+ ## v0.6.0 — 28/06/2026
161
+
162
+ ### Package rename and npm publication prep
163
+ - Package renamed from `node-red-contrib-velbus2` to `node-red-contrib-velbus-2026`
164
+ - Version bumped to 0.6.0 for first public release
165
+ - `package.json` updated with full npm publication metadata:
166
+ - `keywords`: node-red, velbus, building-automation, home-automation, smart-home, relay, dimmer
167
+ - `repository`, `bugs`, `homepage` all pointing to GitHub
168
+ - `author`: Stuart Hanlon, MDAR Limited
169
+ - `license`: MIT
170
+ - `README.md` added — module list, quick start, confirmed hardware, contributing guide
171
+ - `LICENSE` added — MIT
172
+ - Disclaimer added to all 17 node HTML help sections:
173
+ *"Generated with Claude.ai — in need of extensive field testing before commercial
174
+ deployment. Presented as-is, use beyond testing at your own risk. File issues on GitHub."*
175
+
176
+ ### Handover document
177
+ - Complete ground-up rewrite of `velbus2_master_handover.md`
178
+ - Now 970 lines, supersedes all previous baseline files
179
+ - Added Appendix A: Virtual Module Kit (parked — new module set: VMB1RYS/VMB7IN,
180
+ VMB1RYNO, VMB4DC, VMB4AN)
181
+ - Added Appendix B: npm publication steps, GitHub repo creation walkthrough,
182
+ disclaimer text for help files
183
+
184
+ ---
185
+
186
+ ## v0.5.8 — 27/06/2026
187
+
188
+ ### velbus-blind-20 (new node)
189
+ - V2 blind/shutter motor controller — VMB2BLE-20 (0x61)
190
+ - Full V2 redesign: CAN FD support, 8-byte 0xFF with properties byte,
191
+ firmware check on startup, channel name auto-retrieval
192
+ - **0xEC status packet completely restructured vs BLS/BLE series** — both
193
+ channels packed into a single packet using nibble encoding rather than
194
+ separate per-channel packets. Status, position, lock state, and auto mode
195
+ are all dual-nibble fields.
196
+ - Channel identifier in commands: plain integer 1, 2, or 0xFF for all — not
197
+ a bit value as in BLS/BLE series
198
+ - Position 0-100%, full lock/force/inhibit set, auto modes, sunrise/sunset
199
+ - Additional commands vs BLS/BLE: `enable_program` (0xB2), `disable_program` (0xB1)
200
+ - Note: 0xFFFFFF (permanent) NOT allowed for up/down timeout on this module —
201
+ maximum is 0xFFFFFE. Permanent allowed for lock/force/inhibit duration.
202
+ - Input commands: `stop`, `up`, `down`, `position`, `lock`, `unlock`,
203
+ `forced_up`, `cancel_forced_up`, `forced_down`, `cancel_forced_down`,
204
+ `inhibit`, `cancel_inhibit`, `inhibit_preset_up`, `inhibit_preset_down`,
205
+ `auto_mode`, `enable_program`, `disable_program`, `get_status`, `get_name`
206
+
207
+ ### velbus-scan corrections (from official Velbus module ID list)
208
+ The following type byte assignments were wrong and have been corrected:
209
+
210
+ | Type | Was | Now |
211
+ |---|---|---|
212
+ | 0x0C | VMBRSUSB | VMB1TS (temperature sensor) |
213
+ | 0x18 | VMBUSBIP | VMB2PBN (2-button panel with night mode) |
214
+ | 0x1C | VMB4PB | REMOVED — 0x1C not in official list |
215
+ | 0x20 | VMB6PB-20 | VMBGP4 (4-button glass panel) — added to glass-panel-types.js |
216
+ | 0x40 | (missing) | VMBUSBIP (moved from 0x18) |
217
+ | 0x44 | (missing) | VMB4PB (added) |
218
+ | 0x4C | (missing) | VMB6PB-20 (added) |
219
+
220
+ velbus-button node suggestion updated: now covers 0x18 (VMB2PBN, 2ch),
221
+ 0x44 (VMB4PB, 4ch), 0x4C (VMB6PB-20, 6ch). Previous incorrect 0x1C and
222
+ 0x20 entries removed.
223
+
224
+ VMBGP4 (0x20) added as 26th type in `lib/glass-panel-types.js`.
225
+
226
+ ### lib/blind-types-20.js (new)
227
+ - Type registry for V2 blind series: VMB2BLE-20
228
+
229
+ ---
230
+
231
+ ## v0.5.7 — 27/06/2026
232
+
233
+ ### velbus-blind (new node)
234
+ - Original series blind/shutter motor controllers — VMB1BL (0x03), VMB2BL (0x09)
235
+ - Early modules: 5-byte 0xFF response (no serial number), dip-switch timeout
236
+ setting, no position feedback, no lock/force/inhibit
237
+ - VMB1BL: 1 channel, fixed channel byte 0x03, local push button events mixed
238
+ into 0x00 bitmask alongside relay events
239
+ - VMB2BL: 2 channels, packed bitmask channel encoding (ch1=0x03, ch2=0x0C),
240
+ local push button events included in 0x00
241
+ - Stop/up/down commands only. Timeout 0=dip switch, 0xFFFFFF=permanent
242
+ - Input commands: `stop`, `up` (with timeout), `down` (with timeout),
243
+ `get_status`, `get_name`
244
+ - Address dropdown filters to VMB1BL/VMB2BL types from scan results
245
+
246
+ ### velbus-blind-s (new node)
247
+ - Full-featured BLS/BLE series — VMB1BLS (0x2E), VMB2BLE (0x1D),
248
+ VMB2BLE-10 (0x4A)
249
+ - 7-byte 0xFF with serial number and memory map version
250
+ - Position feedback (0-100%): 0=fully up, 100=fully down
251
+ - Lock/unlock (0x1A/0x1B — unique command bytes to blind family)
252
+ - Forced up (0x12) / forced down (0x14) — note: same bytes as relay forced-off/on
253
+ but inverted direction semantics in blind context
254
+ - Full inhibit set: `inhibit`, `inhibit_preset_up`, `inhibit_preset_down`,
255
+ `cancel_inhibit`
256
+ - Auto modes (1-3), sunrise/sunset, real-time clock
257
+ - VMB2BLE-10 confirmed protocol-identical to VMB2BLE — only structural difference
258
+ is 8-byte 0xFF (with terminator byte vs 7-byte). Handled by same node.
259
+ - No local push button events in 0x00 (relay events only, unlike VMB1BL/VMB2BL)
260
+ - Two outputs: relay events on output 1, full 0xEC status on output 2
261
+ - Input commands: `stop`, `up`, `down`, `position`, `lock`, `unlock`,
262
+ `forced_up`, `cancel_forced_up`, `forced_down`, `cancel_forced_down`,
263
+ `inhibit`, `cancel_inhibit`, `inhibit_preset_up`, `inhibit_preset_down`,
264
+ `auto_mode`, `get_status`, `get_name`
265
+
266
+ ### lib/blind-types.js (new)
267
+ - Type registry for original series blind modules: VMB1BL, VMB2BL
268
+ - channelMasks: packed bitmask per channel for 0xEC and commands
269
+
270
+ ### lib/blind-types-s.js (new)
271
+ - Type registry for BLS/BLE series: VMB1BLS, VMB2BLE, VMB2BLE-10
272
+ - channelBits: clean bit encoding (ch1=0x01, ch2=0x02)
273
+
274
+ ---
275
+
276
+ ## v0.5.6 — 27/06/2026
277
+
278
+ ### velbus-meteo (new node)
279
+ - Weather station node for VMBMETEO (0x31)
280
+ - Output 1: alarm events (0x00) and module status (0xED)
281
+ - Output 2: temperature (0xE6), rain/light/wind (0xA9), sensor text (0xAC)
282
+ - 8 configurable alarm outputs via bitmask — alarm conditions (wind speed,
283
+ rainfall, light levels) configured in VelbusLink, fired as 0x00 events
284
+ - `0xA9` carries rain (×0.1 mm/h), light (lux), wind (×0.1 km/h) as three
285
+ 16-bit values in one packet — emitted with engineering units applied
286
+ - `0xAC` sensor text: same command byte as OLED memo on glass panels but
287
+ completely different meaning — formatted sensor value string from module
288
+ - `0xF0/F1/F2` alarm channel names use **bitmask** in DB2 (not channel number)
289
+ - Auto-send interval: values 5-9 = percentage-change thresholds, not fixed seconds
290
+ - Input commands: `get_status`, `get_temp`, `get_meteo` (sensor: rain/light/wind/all),
291
+ `get_alarm_name` (channel 1-8), `test_on`, `test_off`
292
+
293
+ ### velbus-sensor (new node)
294
+ - Original series configurable input node — VMB7IN (0x22), VMB4AN (0x32)
295
+ - Output 1: channel events (0x00) and module status (0xED)
296
+ - Output 2: pulse counter data (VMB7IN only — 0xBE)
297
+ - VMB7IN: 8 digital input channels + pulse counter on channels 1-4
298
+ - All 8 channels produce 0x00 press/release/long-press events regardless of
299
+ input type (contact closure, alarm threshold — configured in VelbusLink)
300
+ - Counter: 32-bit pulse count + period in ms between last two pulses
301
+ - Engineering units must be calculated in flow using pulsesPerUnit and periodMs
302
+ - Power (W) = 3,600,000,000 / (periodMs × pulsesPerUnit)
303
+ - VMB4AN: 16 logical channels across 3 groups (architecture defined; groups 2
304
+ and 3 deferred to follow-up session pending hardware availability)
305
+ - Channel names use **bitmask** in DB2 of 0xF0/F1/F2
306
+ - Lock/unlock use **bitmask** in DB2
307
+ - Input commands: `get_status`, `get_counter` (channels bitmask + interval),
308
+ `reset_counter` (channel 1-4), `load_counter` (channel + value), `get_name`
309
+ - Note: VMB7IN 0xED PDF states DLC=5 but lists 7 fields — implementation
310
+ treats as 7 bytes. Verify against real hardware.
311
+
312
+ ### velbus-sensor-20 (new node)
313
+ - V2 series configurable input node — VMB8IN-20 (0x4E)
314
+ - Output 1: channel events (0x00) and module status (0xED)
315
+ - Output 2: energy counter data (0xA4)
316
+ - Up to 32 digital input channels: 8 on primary address, 24 via 3 subaddresses
317
+ (channels 9-16, 17-24, 25-32). Bridge routes subaddress packets to primary
318
+ node listener transparently.
319
+ - 0x00 channel event payload includes `sourceAddress` field to distinguish
320
+ primary from subaddress events
321
+ - 0xED from primary (8 bytes): full status including normal/inverted, auto-send
322
+ - 0xED from subaddress (5 bytes): alarm status, enabled, locked, prog-disabled
323
+ - `0xA4` energy counter: 20-bit power in Watts + 32-bit energy in Wh/litres/ml
324
+ (counter type set in VelbusLink — same packet format for all)
325
+ - Firmware check on startup (3-stage: type → map version → pass)
326
+ - Module name auto-retrieved from VelbusLink on startup
327
+ - Lock/unlock use **channel number** (1-32, 0xFF for all) — V2 style
328
+ - Channel names use **channel number** in DB2
329
+ - Input commands: `get_status`, `get_counter` (channels bitmask + interval),
330
+ `load_counter` (channel + value), `lock`, `unlock`, `get_name`
331
+
332
+ ### velbus-scan corrections
333
+ - VMB7IN (0x22) added to ALL_TYPES, NODE_SUGGESTION (velbus-sensor), MODULE_CHANNELS (8ch)
334
+ - VMB8IN-20 (0x4E) added — type byte was previously unknown
335
+ - VMBMETEO (0x31) now has node suggestion: velbus-meteo
336
+ - VMB4AN (0x32) node suggestion updated: velbus-sensor
337
+ - VMB2BLE (0x1D), VMB2BLE-10 (0x4A), VMB2BLE-20 (0x61) relabelled from
338
+ incorrect 'BLE (Bluetooth)' to 'blind (motor controller)' — these are
339
+ single/dual channel reversible AC motor controllers for roller shutters
340
+ and blinds. VMB = Velbus Motor Blind. No Bluetooth involved.
341
+
342
+ ### lib/sensor-types.js (new)
343
+ - Type registry for original series sensor modules: VMB7IN, VMB4AN
344
+ - Flags: hasCounter, hasAnalogue, lockStyle, nameStyle, counterCh
345
+
346
+ ### lib/sensor-types-20.js (new)
347
+ - Type registry for V2 sensor modules: VMB8IN-20
348
+ - Flags: hasCounter, lockStyle, nameStyle, alarmCh (subaddress alarm channels)
349
+
350
+ ---
351
+
352
+ ## v0.5.5 — 27/06/2026
353
+
354
+ ### velbus-pir (new node)
355
+ - Original and -10 series PIR modules — VMBPIRM (0x2A), VMBPIRC (0x2B),
356
+ VMBPIRO (0x2C), VMBPIRO-10 (0x23)
357
+ - Output 1: channel events, module status, light value
358
+ - Output 2: temperature and settings — VMBPIRO and VMBPIRO-10 only
359
+ - Channel bitmask model: bits 0-5 = dark/light/motion1/ldMotion1/motion2/ldMotion2.
360
+ VMBPIRM and VMBPIRC add bit6=absence. VMBPIRO and VMBPIRO-10 add
361
+ bit6=lowTempAlarm / bit7=highTempAlarm instead.
362
+ - Lock/unlock/enable/disable program commands use **channel bitmask** in DB2
363
+ - `0xE8` temperature settings: compact 7-byte format (calibration offset, gain,
364
+ low alarm, high alarm, zone, auto-send interval)
365
+ - Input commands: `get_status`, `get_light` (with optional auto-send interval),
366
+ `get_temp`, `get_temp_settings`, `test_on`, `test_off`
367
+ - Address dropdown filters to PIR original/-10 types from scan results
368
+ - Note: VMBPIRM has a light sensor (required for dark/light output logic) but
369
+ its PDF does not list raw lux value as bus-accessible. Node handles 0xA9
370
+ if received; `get_light` command sent regardless.
371
+
372
+ ### velbus-pir-20 (new node)
373
+ - V2 series PIR modules — VMBPIR-20 (0x4D), VMBPIRO-20 (0x59)
374
+ - Output 1: channel events, module status, light value
375
+ - Output 2: temperature and settings — VMBPIRO-20 only
376
+ - VMBPIR-20: 7 channels (dark/light/motion1/ldMotion1/motion2/ldMotion2/absence)
377
+ - VMBPIRO-20: 6 lockable channels + bits 6-7 = lowTempAlarm/highTempAlarm
378
+ (temperature alarm bits appear in 0x00 and 0xED but are not lockable)
379
+ - Lock/unlock commands use **channel number** (1-N, 0xFF for all) — not bitmask
380
+ - Firmware check on startup (3-stage: type → map version → pass)
381
+ - Module name auto-retrieved from VelbusLink on startup
382
+ - CAN FD flag decoded from 0xFF properties byte
383
+ - `0xE8` on VMBPIRO-20: multi-part glass-panel-style format inherited from
384
+ thermostat firmware; only calibration and alarm fields in part 1 are meaningful
385
+ - Input commands: `get_status`, `get_light`, `get_temp`, `get_temp_settings`,
386
+ `lock` (channel + duration), `unlock` (channel), `test_on`, `test_off`
387
+
388
+ ### velbus-scan
389
+ - VMBPIRM (0x2A), VMBPIRC (0x2B), VMBPIRO (0x2C), VMBPIRO-10 (0x23) added
390
+ to ALL_TYPES, NODE_SUGGESTION, and MODULE_CHANNELS
391
+ - `velbus-pir` suggested for all four original/-10 types
392
+
393
+ ### lib/pir-types.js (new)
394
+ - Type registry for original/-10 PIR series: hasTempSensor, lockStyle,
395
+ channel name arrays, minMapVer, series
396
+
397
+ ### lib/pir-types-20.js (new)
398
+ - Type registry for V2 PIR series: hasTempSensor, lockStyle, channel maps,
399
+ bitmask arrays (for 0x00/0xED parsing), minMapVer, series
400
+
401
+ ---
402
+
403
+ ## v0.5.4 — 27/06/2026
404
+
405
+ ### Protocol parser corrections (velbus-glass-panel, velbus-thermostat)
406
+
407
+ A systematic body-indexing error was present in all glass-panel and thermostat
408
+ packet handlers. `parsePkt()` returns `body[]` where `body[0]` is DATABYTE1 —
409
+ the command byte — and data starts at `body[1]`. All handlers have been
410
+ corrected.
411
+
412
+ - **0xEA thermostat status** — format was incorrectly implemented as 16-bit
413
+ integers divided by 100. Correct format per protocol PDFs: signed single bytes
414
+ at 0.5° resolution for temperature values, with operating mode, output status,
415
+ and sleep timer as separate fields. Mode (comfort/day/night/safe), heater/cooler
416
+ direction, and active outputs (heating, cooling, boost) now correctly decoded.
417
+ - **0xE6 current temperature** — format corrected to 16-bit signed value divided
418
+ by 16 (0.0625° resolution), not divided by 100.
419
+ - **0xE8 temperature settings** — format corrected to signed single bytes at 0.5°
420
+ resolution. Payload now includes `current`, `comfort`, `day`, `night`, `safe`
421
+ heating presets.
422
+ - **0xED module status** — full structured parse implemented. DATABYTE4 correctly
423
+ decoded: open collector on/off, OC locked, OC program disabled, temperature
424
+ sensor program disabled, edge colour inhibited. Locked and programme-disabled
425
+ channel bitmasks now correctly extracted from DATABYTE5 and DATABYTE6.
426
+ - **0xF0/F1/F2 name parts** — command and channel-number bytes now stripped before
427
+ storing; `0xFF` padding filtered in name assembly alongside null bytes.
428
+ - **0xA9, 0xAC, 0xBE** — body indices corrected.
429
+
430
+ ### Open collector output
431
+
432
+ - `output_timer` command fixed — duration is 24-bit (3 bytes), not 16-bit.
433
+ Supports up to ~194 days; `0xFFFFFF` = permanently on.
434
+ - `0xED` handler now emits OC state in the status payload for modules with a
435
+ confirmed open collector output:
436
+ ```json
437
+ { "type": "status", ..., "output": { "on": true, "locked": false, "programDisabled": false } }
438
+ ```
439
+ - `hasOc` flag added to all 25 types in `lib/glass-panel-types.js`. OC confirmed
440
+ from PDF for the full VMBEL family (original and -20) and VMBGPO/-20. OC
441
+ absent from VMBGP1-2/2-2/4-2 per protocol PDF. Remaining GP types pending
442
+ hardware verification (UK, post July 2026).
443
+
444
+ ### velbus-glass-panel
445
+ - Button output payload now includes `on` boolean — `true` when any channel is
446
+ pressed or long-pressed.
447
+
448
+ ### velbus-thermostat
449
+ - Spurious `on` field removed from 0xEA, 0xE6, 0xE8 and 0xED payloads.
450
+ `thermostatOn` in the thermostat payload is the correct state field.
451
+ - Temperature and settings payloads do not carry an `on` field.
452
+
453
+ ---
454
+
455
+ ## v0.5.3 — 27/06/2026
456
+
457
+ ### Payload and type table cleanup
458
+
459
+ - Button output `on` boolean added to `velbus-glass-panel` 0x00 handler (was
460
+ present in `velbus-button` but missing from glass panel).
461
+ - Config dialog address dropdowns fixed across all three affected nodes
462
+ (`velbus-glass-panel`, `velbus-thermostat`, `velbus-button`) — endpoint returns
463
+ `{ modules: [...], count: N }` and dialogs were operating on the wrapper object
464
+ instead of `modules`.
465
+ - `lib/glass-panel-types.js`: VMBGP1 (0x1E, 1ch) and VMBGP2 (0x1F, 2ch) added
466
+ — 23 → 25 types.
467
+ - `velbus-scan` NODE_SUGGESTION and MODULE_CHANNELS updated for 0x1E and 0x1F.
468
+
469
+ ---
470
+
471
+ ## v0.5.2 — 27/06/2026
472
+
473
+ ### velbus-button (new node)
474
+ - Pure button/input node — press, release, long-press events on 0x00
475
+ - Supports VMB8PB, VMB8PBU, VMB6PBN, VMB4PB (original series) and VMB6PB-20 (V2)
476
+ - Also suitable for glass panel sub-addresses when button events need separate wiring
477
+ - Address dropdown filters to button module types; channel count auto-populated from scan
478
+ - Output: `{ type: "button", on: true, pressed: [1,3], released: [], longPressed: [] }`
479
+ - `on` is `true` when any channel is pressed or long-pressed
480
+
481
+ ### velbus-glass-panel improvements
482
+ - `heat_mode` and `cool_mode` commands added (0xE0 / 0xDF)
483
+ - Name auto-retrieval on startup — module name from VelbusLink populates status bar automatically
484
+
485
+ ### velbus-thermostat improvements
486
+ - Name auto-retrieval on startup — same as glass-panel
487
+
488
+ ### velbus-scan
489
+ - Button module types added to NODE_SUGGESTION
490
+
491
+ ---
492
+
493
+ ## v0.5.1 — 27/06/2026
494
+
495
+ ### velbus-thermostat (new node)
496
+ - Dedicated thermostat node — clean separation from glass panel button events
497
+ - Targets primary module address — all commands go to base address, not thermostat sub-address
498
+ - Commands: `comfort`, `day`, `night`, `safe` (mode switch with optional `sleepTime`), `set_temp`, `get_thermostat`
499
+ - `set_temp`: `pointer` (0=comfort/1=day/2=night/3=safe) + `temp` (float °C)
500
+ - Output 1: `{ type, currentTemp, targetTemp, mode, heaterMode, heating, cooling, boostMode, thermostatOn }`
501
+ - Output 2: `{ type, current, min, max }`
502
+ - Can coexist on same address as `velbus-glass-panel` — bridge fans out to all registered listeners
503
+
504
+ ### Palette groups
505
+ - `Velbus (inputs)` — teal #3A8C8C: velbus-scan, velbus-glass-panel, velbus-thermostat
506
+ - `Velbus (outputs)` — blue #4A90D9: velbus-relay, velbus-relay-20, velbus-dimmer, velbus-dimmer-20
507
+
508
+ ---
509
+
510
+ ## v0.5.0 — 27/06/2026
511
+
512
+ ### velbus-glass-panel (new node)
513
+ - Single node covers entire VMBEL / VMBGP glass panel family — 23 module types, original and V2
514
+ - Output 1 — Buttons: press, release, long-press per channel
515
+ - Output 2 — Status/thermostat: module status (0xED), thermostat (0xEA), temperature (0xE6)
516
+ - Output 3 — Name parts: VelbusLink module name on request
517
+ - OLED extras (memo text, counter, display page) emitted on OLED-capable types only
518
+ - PIR channel semantic labels (button1-4, virtual, dark, light, motion) on PIR variants
519
+ - Thermostat rx/tx included — velbus-thermostat node also available for dedicated thermostat wiring
520
+ - LED control: `led_set`, `led_clear`, `led_slow`, `led_fast`, `led_vfast`
521
+ - Open collector: `output_on`, `output_off`, `output_timer`
522
+ - Config dialog: dropdown filters to glass panel types, channel count auto-populated
523
+ - `lib/glass-panel-types.js` — standalone type registry (hasOled, hasPir, hasOc, pirChannels, channels, minMapVer)
524
+
525
+ ### velbus-scan corrections
526
+ - `0x55` corrected from `VMB8IN-20` to `VMBGP2-20` (collision resolved from protocol PDFs)
527
+ - `0x3A/3B/3C` corrected to `VMBGP1/2/4-2` original series (not -20)
528
+ - `0x21` corrected to `VMBGPO`
529
+ - All 23 glass panel types added to NODE_SUGGESTION and MODULE_CHANNELS
530
+
531
+ ---
532
+
533
+ ## v0.4.3 — 27/06/2026
534
+
535
+ ### Address dropdowns in all config dialogs
536
+ - `velbus-relay`, `velbus-relay-20`, `velbus-dimmer`, `velbus-dimmer-20` config
537
+ dialogs now show a dropdown of discovered modules from the most recent scan
538
+ - Dropdown filters by node type — relay dialog shows only relay modules, dimmer
539
+ dialog shows only dimmer modules, etc.
540
+ - Each option shows: address, module type, build number, map version
541
+ - Falls back to plain text input if no scan has been run yet
542
+ - Manual entry always available at the bottom of the dropdown
543
+ - Run a `velbus-scan` node once — all subsequent config dialogs benefit automatically
544
+
545
+ ### velbus-bridge
546
+ - `storeScanResults()` / `getScanResults()` API added
547
+ - `RED.httpAdmin` endpoint registered: `GET /velbus/scan-results?bridge={nodeId}`
548
+ — serves scan results as JSON to config dialog dropdowns
549
+
550
+ ### velbus-scan
551
+ - Calls `bridge.storeScanResults()` on scan completion
552
+
553
+ ---
554
+
555
+ ## v0.4.2 — 27/06/2026
556
+
557
+ ### velbus-scan bugfix
558
+ - Duplicate `0x2D` key in `ALL_TYPES` registry — `VMBIN` was silently overwritten
559
+ by `VMBPIRO`. Fixed as `VMBIN/VMBPIRO` pending PDF confirmation of whether they
560
+ share a type byte or are distinct.
561
+
562
+ ---
563
+
564
+ ## v0.4.1 — 27/06/2026
565
+
566
+ ### velbus-relay payload correction
567
+ - `mode` field removed from `relay_status` payload — was an unnecessary duplicate of `state`
568
+ - `on` boolean added to `relay_status` payload (was missing from original series node)
569
+ - `on: true` when state is `on`, `timer_running` or `forced_on`
570
+ - `on: false` for all other states
571
+
572
+ ---
573
+
574
+ ## v0.4.0 — 27/06/2026
575
+
576
+ ### New nodes
577
+ - **velbus-dimmer-20** — V2.0 series dimmer and output modules
578
+ - Supports VMB2DC-20 (2ch, 0-10V), VMB8DC-20 (8ch, 0-10V), VMB4LEDPWM-20 (4ch, PWM LED)
579
+ - 0xEE bitmask status parser (on/inhibited/forcedOn/forcedOff/programDisabled/error per channel)
580
+ - 0xA5 dim level packets — raw 0-254 value plus calculated percentage
581
+ - Spontaneous 0x00 dim level broadcasts handled
582
+ - `dimCurve` field in every payload (`linear` or `exponential`)
583
+ - `outputType` field (`0-10V` or `PWM`)
584
+ - `on` boolean: `true` when level > 0 and not forced off or inhibited
585
+ - Commands: `set` (by raw `level` 0-254 or `percent` 0-100), `on`, `off`,
586
+ `restore`, `timer`, `scene` (0-15), `forced_on`, `forced_off`,
587
+ `cancel_forced_on`, `cancel_forced_off`, `inhibit`, `cancel_inhibit`, `status`
588
+ - `fadeMode` on set commands: 0=direct, 1=rate, 2=time
589
+ - **Live tested on VMB8DC-20 at Toulouse client site ✓**
590
+
591
+ - **velbus-dimmer** — Original series dimmer modules (pre V2.0)
592
+ - Supports VMBDMI (1ch), VMBDMI-R (1ch), VMB4DC (4ch)
593
+ - 0xB8 status parser — 0-100% native scale (original series)
594
+ - Thermal status decoded for VMBDMI/VMBDMI-R: tempBand, loadType, error
595
+ - VMB4DC uses bitmask channel model; VMBDMI/R use fixed single channel
596
+ - `dimspeed` parameter (seconds) on set/on/off/restore commands
597
+ - Commands: `set`, `on`, `off`, `restore`, `stop`, `timer`, `forced_on`,
598
+ `forced_off`, `cancel_forced_on`, `cancel_forced_off`, `inhibit`,
599
+ `cancel_inhibit`, `status`
600
+
601
+ ### Notes
602
+ - VMB2DC-20 and VMB8DC-20 output a 0-10V control voltage — they do not carry
603
+ mains load. They drive third-party dimmer packs, actuators, or any 0-10V
604
+ compatible device. VMB4LEDPWM-20 outputs PWM for direct LED control.
605
+ - DALI references in VMB2DC-20/VMB8DC-20/VMB4LEDPWM-20 PDFs are documentation
606
+ bleed-over from the shared VMBDALI codebase and are not implemented.
607
+
608
+ ---
609
+
610
+ ## v0.3.10 — 26/06/2026
611
+
612
+ ### velbus-scan improvements
613
+ - Scan order reversed (0xFE→0x01) — higher addresses confirmed present first
614
+ - Recursive `setTimeout` replaces flat loop — more reliable on constrained hardware
615
+ - Collect window extended to 8000ms
616
+ - Output 2 fires `module_found` immediately on each discovery
617
+ - `0x4D` correctly identified as `VMBPIR-20` (confirmed on Toulouse hardware)
618
+ - `NODE_SUGGESTION` extended to cover PIR and glass panel module types
619
+
620
+ ### velbus-bridge improvements
621
+ - Scan lock mechanism: `lockScan()` / `unlockScan()`
622
+ - Interpreter node startup RTRs queued during active scan, flushed 1/second after
623
+
624
+ ### velbus-relay / velbus-relay-20
625
+ - Startup RTR passed with `startup=true` flag — correctly queued during scan
626
+
627
+ ---
628
+
629
+ ## v0.3.0 — 25/06/2026
630
+
631
+ ### New nodes
632
+ - **velbus-relay-20** — V2.0 series relay modules
633
+ - Supports VMB4RYLD-20, VMB4RYNO-20, VMB1RYS-20
634
+ - Correct V2.0 0xFB bitmask parser — one packet = full module state
635
+ - All bitmask fields in payload: on/inhibited/forcedOn/forcedOff/programDisabled/timerRunning
636
+ - Channel number commands (1-8 or 0xFF for all) — not bitmask
637
+ - `alarmProgram` decoded in every status payload
638
+ - `canFD` flag from 0xFF properties byte
639
+
640
+ - **velbus-scan** — Bus scanner
641
+ - RTR to every address (0x01–0xFE), collects 0xFF responses
642
+ - Output 1: `scan_complete` with full module array
643
+ - Output 2: `module_found` per discovered module
644
+ - Each result: address, typeId, module name, serial, build, memoryMapVersion,
645
+ canFD, suggestedNode, subaddresses
646
+ - Configurable RTR delay (default 75ms) and collect window
647
+
648
+ ### velbus-bridge improvements
649
+ - Passive 0xB0 subaddress handler
650
+ - Subaddress packets transparently routed to primary node
651
+ - Commands always sent to primary address only
652
+
653
+ ### velbus-relay improvements
654
+ - VMB4RYLD-20 and VMB4RYNO-20 removed from original series registry
655
+ - 3-stage firmware check on 0xFF
656
+ - Module name auto-retrieval via 0xEF/0xF0/0xF1/0xF2
657
+ - Status bar: VelbusLink name + address
658
+ - Hard block on firmware incompatibility or unknown type
659
+
660
+ ---
661
+
662
+ ## v0.2.0 — 25/06/2026
663
+
664
+ ### New nodes
665
+ - **velbus-bridge** (config node)
666
+ - Persistent TCP connection with auto-reconnect (5s)
667
+ - TLS and auth key support (python-velbustcp)
668
+ - Address-based packet dispatch
669
+ - `'all'` listener for scanner
670
+
671
+ - **velbus-relay** — Original series relay modules
672
+ - Supports VMB1RY, VMB4RY, VMB4RYLD, VMB4RYNO, VMB1RYNO, VMB1RYNOS,
673
+ VMB1RYS, VMB4RYLD-10, VMB4RYNO-10
674
+ - 0xFB per-channel status parser
675
+ - Commands: `on`, `off`, `toggle`, `timer`, `forced_on`, `forced_off`,
676
+ `cancel_forced_on`, `cancel_forced_off`, `inhibit`, `cancel_inhibit`, `status`
677
+
678
+ ---
679
+
680
+ ## Confirmed hardware (live testing)
681
+
682
+ All testing on real installations via TCP gateway (velbus-tcp snap, port 6000).
683
+
684
+ | Module | Type | Site | Status |
685
+ |---|---|---|---|
686
+ | VMB1RYS | 0x41 | Toulouse FR | ✓ map v0, build 3654 |
687
+ | VMBEL1 | 0x34 | Toulouse FR | ✓ map v2, build 3433 |
688
+ | VMBEL4 | 0x36 | Toulouse FR | ✓ map v2, build 3433 (×5 units) |
689
+ | VMBELO | 0x37 | Toulouse FR | ✓ map v4, build 3821, CAN FD |
690
+ | VMBELPIR | 0x38 | Toulouse FR | ✓ map v2, build 3433 |
691
+ | VMBPIR-20 | 0x4D | Toulouse FR | ✓ map v1, build 3640, CAN FD (×2 units) |
692
+ | VMB8DC-20 | 0x4B | Toulouse FR | ✓ live tested, multiple channels confirmed |
693
+ | VMB4RYNO-20 | 0x27 | Toulouse FR | ✓ present on site (address TBC) |
694
+
695
+ Not yet tested (hardware available, nodes not yet built):
696
+ VMBELO thermostat, VMB4AN, VMBGP series, VMBIN, VMB2BLE
697
+
698
+ ---
699
+
700
+ ## Payload standards
701
+
702
+ All nodes follow consistent payload conventions:
703
+
704
+ **Relay:**
705
+ ```json
706
+ { "state": "on", "on": true, "timerRemaining": 0, "ledState": "off" }
707
+ ```
708
+
709
+ **Dimmer:**
710
+ ```json
711
+ { "state": "on", "on": true, "level": 187, "percent": 73.6 }
712
+ ```
713
+
714
+ **Button / glass panel buttons:**
715
+ ```json
716
+ { "type": "button", "on": true, "pressed": [1, 3], "released": [], "longPressed": [] }
717
+ ```
718
+
719
+ **Thermostat status:**
720
+ ```json
721
+ { "type": "thermostat", "currentTemp": 21.5, "targetTemp": 22.0, "mode": "comfort",
722
+ "heaterMode": true, "heating": false, "cooling": false, "boostMode": false, "thermostatOn": true }
723
+ ```
724
+
725
+ **Temperature:**
726
+ ```json
727
+ { "type": "temperature", "current": 21.5, "min": 15.0, "max": 30.0 }
728
+ ```
729
+
730
+ **Glass panel module status:**
731
+ ```json
732
+ { "type": "status", "locked": [], "thermostatProgram": "manual",
733
+ "alarms": { "alarm1Active": false, "alarm2Active": false, "selected": 0 },
734
+ "output": { "on": false, "locked": false, "programDisabled": false } }
735
+ ```
736
+ `output` field only present on modules with a confirmed open collector output.
737
+
738
+ `on` is always a boolean where present. `state` is always a human-readable string.
739
+ Numbers are always numbers — never strings of numbers.
740
+ Temperature and settings payloads do not carry an `on` field.
741
+
742
+ ---
743
+
744
+ ## Roadmap
745
+
746
+ **Planned (PDFs needed):**
747
+ - `velbus-energy` — VMBPSUMNGR-20 (0x04). PDF needed.
748
+
749
+ **Pending hardware verification (UK, post July 2026):**
750
+ - Open collector presence on VMBGP1/2/4 original and VMBGP-20 series
751
+ - VMBPIRM raw light value bus accessibility (0xA9 / 0xAA)
752
+ - VMB7IN 0xED actual byte count (PDF lists 7 fields but states DLC=5)
753
+
754
+ **The Cunning Plan — VelbusLink as ground truth:**
755
+ Build a Node-RED flow that responds to a VelbusLink bus scan with all
756
+ unknown module type bytes simultaneously, using address = type byte.
757
+ VelbusLink displays correct names and writes them to the VLP project file.
758
+ Run on return to UK (Northampton, post July 2026).
759
+
760
+ Unknown type bytes to sweep (sample): 0x03 VMB1BL (old), 0x05 VMB6IN,
761
+ 0x07 VMB1DM, 0x09 VMB2BL (old), 0x0A VMB8IR, 0x0B VMB4PD, 0x0C VMB1TS,
762
+ 0x0E VMB1TC, 0x0F VMB1LED, 0x14 VMBDME, 0x25 VMBGPTC, 0x28 VMBGPOD,
763
+ 0x53 (VMBBEL1PIR-20?), 0x5C (VMBBEL2PIR-20 / VMBEL4PIR-20 conflict),
764
+ and others.
765
+
766
+ **Not planned:**
767
+ - velbus-dali — out of scope
768
+
769
+ ---
770
+
771
+ ## Installation (pre-npm-publish)
772
+
773
+ ```bash
774
+ cd /mnt/dietpi_userdata/node-red # or ~/.node-red
775
+ npm install /path/to/node-red-contrib-velbus-2026
776
+ dietpi-services restart node-red # or: node-red-restart
777
+ ```
778
+
779
+ Tested on Node-RED v5.0, Node.js 18+, DietPi (Odroid C4).
780
+ Gateway: velbus-tcp snap (port 6000) or python-velbustcp (port 27015).
781
+
782
+ **Workflow:** Drop `velbus-scan` node → run once → all config dialogs show
783
+ address dropdowns populated with discovered modules.
784
+