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.
- package/CHANGELOG_FORUM.md +784 -0
- package/LICENSE +21 -0
- package/README.md +140 -0
- package/examples/velbus-basic-relay-dimmer.json +328 -0
- package/index.js +3 -0
- package/lib/blind-types-20.js +26 -0
- package/lib/blind-types-s.js +46 -0
- package/lib/blind-types.js +38 -0
- package/lib/dimmer-types-20.js +120 -0
- package/lib/dimmer-types.js +34 -0
- package/lib/glass-panel-types.js +296 -0
- package/lib/pir-types-20.js +51 -0
- package/lib/pir-types.js +61 -0
- package/lib/relay-types-20.js +43 -0
- package/lib/relay-types.js +39 -0
- package/lib/sensor-types-20.js +29 -0
- package/lib/sensor-types.js +49 -0
- package/lib/velbus-utils.js +80 -0
- package/nodes/velbus-blind/velbus-blind.html +165 -0
- package/nodes/velbus-blind/velbus-blind.js +251 -0
- package/nodes/velbus-blind-20/velbus-blind-20.html +179 -0
- package/nodes/velbus-blind-20/velbus-blind-20.js +300 -0
- package/nodes/velbus-blind-s/velbus-blind-s.html +181 -0
- package/nodes/velbus-blind-s/velbus-blind-s.js +282 -0
- package/nodes/velbus-bridge/velbus-bridge.html +72 -0
- package/nodes/velbus-bridge/velbus-bridge.js +304 -0
- package/nodes/velbus-button/velbus-button.html +172 -0
- package/nodes/velbus-button/velbus-button.js +117 -0
- package/nodes/velbus-clock/velbus-clock.html +198 -0
- package/nodes/velbus-clock/velbus-clock.js +273 -0
- package/nodes/velbus-dimmer/velbus-dimmer.html +174 -0
- package/nodes/velbus-dimmer/velbus-dimmer.js +457 -0
- package/nodes/velbus-dimmer-20/velbus-dimmer-20.html +271 -0
- package/nodes/velbus-dimmer-20/velbus-dimmer-20.js +602 -0
- package/nodes/velbus-glass-panel/velbus-glass-panel.html +337 -0
- package/nodes/velbus-glass-panel/velbus-glass-panel.js +492 -0
- package/nodes/velbus-meteo/velbus-meteo.html +120 -0
- package/nodes/velbus-meteo/velbus-meteo.js +279 -0
- package/nodes/velbus-pir/velbus-pir.html +187 -0
- package/nodes/velbus-pir/velbus-pir.js +269 -0
- package/nodes/velbus-pir-20/velbus-pir-20.html +186 -0
- package/nodes/velbus-pir-20/velbus-pir-20.js +352 -0
- package/nodes/velbus-relay/velbus-relay.html +215 -0
- package/nodes/velbus-relay/velbus-relay.js +404 -0
- package/nodes/velbus-relay-20/velbus-relay-20.html +123 -0
- package/nodes/velbus-relay-20/velbus-relay-20.js +434 -0
- package/nodes/velbus-scan/velbus-scan.html +87 -0
- package/nodes/velbus-scan/velbus-scan.js +313 -0
- package/nodes/velbus-sensor/velbus-sensor.html +154 -0
- package/nodes/velbus-sensor/velbus-sensor.js +259 -0
- package/nodes/velbus-sensor-20/velbus-sensor-20.html +158 -0
- package/nodes/velbus-sensor-20/velbus-sensor-20.js +314 -0
- package/nodes/velbus-thermostat/velbus-thermostat.html +191 -0
- package/nodes/velbus-thermostat/velbus-thermostat.js +322 -0
- package/package.json +55 -0
- 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
|
+
|