node-red-contrib-velbus-2026 0.9.1 → 0.9.3
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 +69 -0
- package/HANDOVER.md +36 -5
- package/lib/glass-panel-types.js +24 -0
- package/nodes/velbus-glass-panel/velbus-glass-panel.html +1 -0
- package/nodes/velbus-scan/velbus-scan.js +3 -0
- package/package.json +1 -1
- package/velbus-2026-repo.bundle +0 -0
- package/velbus-2026-repo.bundle.1 +0 -0
package/CHANGELOG_FORUM.md
CHANGED
|
@@ -14,6 +14,75 @@ All feedback via GitHub issues, with examples and debug captures where possible.
|
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
17
|
+
## v0.9.3 — 09/07/2026
|
|
18
|
+
|
|
19
|
+
### velbus-scan — VMBGPOD still showed "unknown_0x28" after the v0.9.2 fix
|
|
20
|
+
|
|
21
|
+
- **Reported by Stuart:** re-ran a scan against v0.9.2 pulled fresh from npm,
|
|
22
|
+
`VMBGPOD` still showed as `unknown_0x28`.
|
|
23
|
+
- **Root cause:** `velbus-scan.js` has its **own, third, independent copy**
|
|
24
|
+
of the type table — `ALL_TYPES`, `NODE_SUGGESTION`, and `MODULE_CHANNELS`
|
|
25
|
+
— entirely separate from `lib/glass-panel-types.js` (used by
|
|
26
|
+
`velbus-glass-panel` at runtime) and the duplicate list inside
|
|
27
|
+
`velbus-glass-panel.html` (used for the editor dropdown), both already
|
|
28
|
+
fixed in v0.9.2. The v0.9.2 fix genuinely worked for the glass-panel node
|
|
29
|
+
itself; the bus scanner simply had no idea `VMBGPOD` existed, since it
|
|
30
|
+
never reads either of the other two files at all.
|
|
31
|
+
- **This is now the third type table found in this codebase.** Searched
|
|
32
|
+
exhaustively this time (`grep -rln "VMBGPO'"` across the whole `nodes/`
|
|
33
|
+
and `lib/` tree) rather than assume these three are the only ones — they
|
|
34
|
+
are, confirmed by the search coming back with exactly these three files
|
|
35
|
+
and no others.
|
|
36
|
+
- Added `0x28: 'VMBGPOD'` to all three tables in `velbus-scan.js`.
|
|
37
|
+
- **Verified end-to-end this time, not just by inspecting the table.** Built
|
|
38
|
+
a full mock-harness test that triggers a real scan, feeds a simulated
|
|
39
|
+
`0xFF` response for `VMBGPOD` (using the exact build/serial from Stuart's
|
|
40
|
+
own scan output), and confirms the emitted `module_found` payload reports
|
|
41
|
+
`"module":"VMBGPOD"`, the correct suggested node, and the correct channel
|
|
42
|
+
count — not just that the table lookup would theoretically work.
|
|
43
|
+
- **Worth remembering for any future module type addition:** check all
|
|
44
|
+
three of `lib/<family>-types[-20].js`, the corresponding node's own
|
|
45
|
+
`.html` (editor dropdown), and `velbus-scan.js` (bus-wide discovery).
|
|
46
|
+
Missing any one of the three produces a real, user-visible symptom in a
|
|
47
|
+
different part of the palette than wherever the fix was actually made —
|
|
48
|
+
exactly what happened here.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## v0.9.2 — 09/07/2026
|
|
53
|
+
|
|
54
|
+
### velbus-glass-panel — VMBGPOD (0x28) registry gap fixed
|
|
55
|
+
|
|
56
|
+
- **Found by Stuart:** scanning his own home installation showed `unknown_0x28`
|
|
57
|
+
for three real modules — the palette had never included this type at all.
|
|
58
|
+
- **Real-world significance:** per the VLP training dataset analysed earlier
|
|
59
|
+
in this project, VMBGPOD is one of the **most common** glass panel types
|
|
60
|
+
in the field (978 occurrences, second only to VMB4RYLD and VMBDMI-R) — a
|
|
61
|
+
genuine, consequential gap, not an edge case. Only its V2 sibling
|
|
62
|
+
(`VMBGPOD-2`, 0x3D) had ever been added.
|
|
63
|
+
- Added to both `lib/glass-panel-types.js` (server-side) and the duplicate
|
|
64
|
+
type list in `velbus-glass-panel.html` (editor-side dropdown/display) —
|
|
65
|
+
confirmed both needed updating, not just one.
|
|
66
|
+
- **Confirmed from protocol_vmbgpod.pdf:** OLED display present; no
|
|
67
|
+
open-collector commands anywhere in the document (distinct from `VMBGPO`,
|
|
68
|
+
0x21, a different product despite the similar name — that one does have
|
|
69
|
+
OC support).
|
|
70
|
+
- **One real mistake caught and corrected before shipping:** first pass
|
|
71
|
+
copied the channel count (32) from `VMBGPO` on the assumption it was the
|
|
72
|
+
closest sibling. Cross-checking the editor's own duplicate type list
|
|
73
|
+
before finalising showed `VMBGPOD-2` — the *actual* V2 sibling of this
|
|
74
|
+
same product line — lists 4 channels, not 32. Corrected to 4. Worth
|
|
75
|
+
remembering: when modelling a new registry entry on an existing one,
|
|
76
|
+
check for a same-name generational sibling before assuming the
|
|
77
|
+
closest-looking name is the right reference.
|
|
78
|
+
- Also identified in the same scan, **not yet added:** `VMBKP` (0x42,
|
|
79
|
+
"Keypad interface module") — a substantial 28-page protocol with its own
|
|
80
|
+
per-channel LED control layer, genuinely new territory rather than a
|
|
81
|
+
quick registry addition. Flagged for separate scoping, same approach as
|
|
82
|
+
velbus-energy before it was built.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
17
86
|
## v0.9.1 — 08/07/2026
|
|
18
87
|
|
|
19
88
|
### Address validation bug — 12 of 19 node types, any address ≥100 decimal
|
package/HANDOVER.md
CHANGED
|
@@ -6,7 +6,7 @@ you're a new contributor, a new maintainer, or an AI assistant starting a fresh
|
|
|
6
6
|
with no memory of previous work — this document should be sufficient on its own, together
|
|
7
7
|
with the source code in this repository, to continue development competently.
|
|
8
8
|
|
|
9
|
-
Current state at time of writing: **v0.9.
|
|
9
|
+
Current state at time of writing: **v0.9.3, 19 nodes, published on npm.**
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
@@ -106,7 +106,7 @@ lib/ Shared code — protocol utilities and per-module-fam
|
|
|
106
106
|
dimmer-types.js Original-series dimmer module type registry
|
|
107
107
|
dimmer-types-20.js V2 dimmer module type registry (incl. LED grouping mode / Device
|
|
108
108
|
Type table for VMB4LEDPWM-20)
|
|
109
|
-
glass-panel-types.js All
|
|
109
|
+
glass-panel-types.js All 27 glass panel module types in one registry (hasOled/hasPir/
|
|
110
110
|
hasOc/minMapVer flags per type)
|
|
111
111
|
pir-types.js / pir-types-20.js PIR sensor module type registries
|
|
112
112
|
sensor-types.js / sensor-types-20.js Sensor/meteo module type registries
|
|
@@ -144,6 +144,24 @@ boilerplate (bridge lookup, packet registration, status bar handling, firmware c
|
|
|
144
144
|
V2 nodes) is consistent across every node and easy to get subtly wrong if rebuilt from
|
|
145
145
|
scratch.
|
|
146
146
|
|
|
147
|
+
**Adding or fixing a module type touches three separate files, not one — confirmed
|
|
148
|
+
the hard way (v0.9.2 → v0.9.3).** A module type used to exist in exactly one place per
|
|
149
|
+
node family; it doesn't. Check all three every time:
|
|
150
|
+
1. `lib/<family>-types[-20].js` — used by the actual node at runtime (`velbus-glass-panel`,
|
|
151
|
+
`velbus-sensor`, etc.)
|
|
152
|
+
2. The corresponding node's own `.html` file — a **separate, duplicate** copy used only
|
|
153
|
+
to populate the editor's address dropdown and type hint. Not read by the running node
|
|
154
|
+
at all.
|
|
155
|
+
3. `nodes/velbus-scan/velbus-scan.js` — has its **own, third, entirely independent** copy
|
|
156
|
+
(`ALL_TYPES`, `NODE_SUGGESTION`, `MODULE_CHANNELS`), used only for bus-discovery
|
|
157
|
+
reporting. Doesn't read either of the other two files.
|
|
158
|
+
|
|
159
|
+
Missing any one of the three produces a real, user-visible symptom in a *different* part
|
|
160
|
+
of the palette than wherever the fix actually needs to happen — a scan reporting
|
|
161
|
+
`unknown_0x28` while the glass-panel node itself handles that type perfectly correctly,
|
|
162
|
+
for instance. When in doubt, `grep -rln "<ModuleName>'" nodes/ lib/` to find every file
|
|
163
|
+
that mentions a given type by name, rather than assume you've found all the copies.
|
|
164
|
+
|
|
147
165
|
---
|
|
148
166
|
|
|
149
167
|
## 4. Architecture overview
|
|
@@ -266,7 +284,7 @@ or a string before assuming the parsing logic itself is wrong.
|
|
|
266
284
|
| `velbus-relay-20` | Velbus (outputs) | V2 relays: VMB1RYS-20, VMB4RYLD-20, VMB4RYNO-20 |
|
|
267
285
|
| `velbus-dimmer` | Velbus (outputs) | Original-series dimmers: VMBDMI, VMBDMI-R, VMB4DC |
|
|
268
286
|
| `velbus-dimmer-20` | Velbus (outputs) | V2 dimmers: VMB2DC-20, VMB8DC-20, VMB4LEDPWM-20 (incl. RGB/RGBW grouping mode) |
|
|
269
|
-
| `velbus-glass-panel` | Velbus (inputs) | All
|
|
287
|
+
| `velbus-glass-panel` | Velbus (inputs) | All 27 glass panel types (original + V2), buttons/OLED/PIR/open-collector as applicable per type |
|
|
270
288
|
| `velbus-thermostat` | Velbus (inputs) | Thermostat function on any glass panel module that has one — same address as the corresponding glass-panel node, coexists without conflict |
|
|
271
289
|
| `velbus-button` | Velbus (inputs) | Dedicated push-button modules: VMB8PB, VMB8PBU, VMB6PBN, VMB2PBN, VMB4PB, VMB6PB-20 |
|
|
272
290
|
| `velbus-pir` | Velbus (inputs) | Original-series PIR: VMBPIRO-10, VMBPIRM, VMBPIRC, VMBPIRO |
|
|
@@ -323,13 +341,14 @@ blue (`#4A90D9`).
|
|
|
323
341
|
| 0x44 | VMB4PB | velbus-button |
|
|
324
342
|
| 0x4C | VMB6PB-20 | velbus-button |
|
|
325
343
|
|
|
326
|
-
### Glass panels (all → velbus-glass-panel,
|
|
344
|
+
### Glass panels (all → velbus-glass-panel, 27 types)
|
|
327
345
|
| Type byte | Module | OLED | PIR | Open collector | Min. map version |
|
|
328
346
|
|---|---|---|---|---|---|
|
|
329
347
|
| 0x1E | VMBGP1 | no | no | unconfirmed¹ | — |
|
|
330
348
|
| 0x1F | VMBGP2 | no | no | unconfirmed¹ | — |
|
|
331
349
|
| 0x20 | VMBGP4 | no | no | unconfirmed¹ | — |
|
|
332
350
|
| 0x21 | VMBGPO | yes | no | yes | 2 |
|
|
351
|
+
| 0x28 | VMBGPOD | yes | no | no | — |
|
|
333
352
|
| 0x2D | VMBGP4PIR | no | yes | unconfirmed¹ | — |
|
|
334
353
|
| 0x34 | VMBEL1 | no | no | yes | 2 |
|
|
335
354
|
| 0x35 | VMBEL2 | no | no | yes | 2 |
|
|
@@ -602,7 +621,7 @@ about why in the commit message.
|
|
|
602
621
|
|
|
603
622
|
- **Generational split.** Nodes generally split at the V2.0 boundary — one node for
|
|
604
623
|
original-series, a separate node for V2. **Exceptions:** `velbus-glass-panel` (one
|
|
605
|
-
node covers all
|
|
624
|
+
node covers all 27 types, both generations, via the type registry's per-type flags
|
|
606
625
|
rather than a code-level split), `velbus-thermostat` (covers the thermostat function
|
|
607
626
|
on any glass panel type), `velbus-meteo` (only one generation exists), and the blind
|
|
608
627
|
family (`velbus-blind` / `velbus-blind-s` / `velbus-blind-20`, split by actual protocol
|
|
@@ -770,6 +789,14 @@ orientation at the time of writing:
|
|
|
770
789
|
|
|
771
790
|
## 13. Known open issues
|
|
772
791
|
|
|
792
|
+
- **`VMBKP` (0x42, "Keypad interface module") has no node at all.** Found scanning a
|
|
793
|
+
real installation (Stuart's home) alongside the `VMBGPOD` gap below — a genuinely new
|
|
794
|
+
module type, not yet scoped. Its protocol PDF (`protocol_vmbkp.pdf`, 28 pages) is
|
|
795
|
+
substantial: channel status, module status, and a full per-channel LED control layer
|
|
796
|
+
(clear/set/slow-blink/fast-blink/very-fast-blink), similar in spirit to `velbus-button`
|
|
797
|
+
but with LED feedback control `velbus-button` doesn't have. This needs the same
|
|
798
|
+
"how much work would this involve" scoping pass `velbus-energy` got before it was
|
|
799
|
+
built, not a quick bolt-on to an existing node.
|
|
773
800
|
- **Open-collector support** on several glass panel types (marked "unconfirmed" in the
|
|
774
801
|
registry in section 6) has not been verified against real hardware — the protocol PDFs
|
|
775
802
|
are ambiguous or silent on some of these. Sending `0x01`/`0x02`/`0x03` open-collector
|
|
@@ -885,6 +912,10 @@ git push --tags
|
|
|
885
912
|
exceptions — see section 4.3 if this isn't already second nature.
|
|
886
913
|
- **Numbers are always numbers in payloads, never strings.**
|
|
887
914
|
- **`results.modules`, not `results`,** when reading the scan endpoint.
|
|
915
|
+
- **A module type lives in three separate files, not one** (per-node `lib/` registry,
|
|
916
|
+
that node's own `.html` dropdown copy, and `velbus-scan.js`'s independent copy) —
|
|
917
|
+
see section 3 for the full explanation. Missing one produces a symptom in a
|
|
918
|
+
different part of the palette than wherever the type was actually added.
|
|
888
919
|
- **Thermostat commands go to the primary address only,** never a subaddress.
|
|
889
920
|
- **Respect the 20ms minimum between `0xFC` writes** on original-series modules — this
|
|
890
921
|
is real EEPROM wear, not an arbitrary rate limit.
|
package/lib/glass-panel-types.js
CHANGED
|
@@ -61,6 +61,30 @@ const GLASS_PANEL_TYPES = {
|
|
|
61
61
|
minMapVer: 2,
|
|
62
62
|
series: 'original',
|
|
63
63
|
},
|
|
64
|
+
0x28: {
|
|
65
|
+
name: 'VMBGPOD',
|
|
66
|
+
// Added 09/07/2026 — found as "unknown_0x28" scanning a real installation.
|
|
67
|
+
// One of the most common glass panel types in the field (978 occurrences
|
|
68
|
+
// across the VLP training dataset analysed earlier in this project,
|
|
69
|
+
// second only to VMB4RYLD and VMBDMI-R) — a genuine gap, not an edge case.
|
|
70
|
+
// Source: protocol_vmbgpod.pdf (ed.6, 04/12/2024), "Touch panel with Oled
|
|
71
|
+
// display". Distinct from VMBGPO (0x21) despite similar naming/features —
|
|
72
|
+
// VMBGPOD's protocol PDF has no open-collector command at all (checked:
|
|
73
|
+
// no "collector" or "channel 18"-style pattern anywhere in the document),
|
|
74
|
+
// whereas VMBGPO's family confirms OC support. These are NOT the same
|
|
75
|
+
// hardware feature set despite the name similarity.
|
|
76
|
+
// channels: 4, matched against VMBGPOD-2 (0x3D) — the correct sibling,
|
|
77
|
+
// being the V2 version of this SAME product line. (First attempt at this
|
|
78
|
+
// entry wrongly copied VMBGPO's 32 — a different product that just
|
|
79
|
+
// happens to have a similar name. Caught by cross-checking the editor's
|
|
80
|
+
// own duplicate type list before finalising, not from the PDF directly.)
|
|
81
|
+
channels: 4,
|
|
82
|
+
hasOled: true,
|
|
83
|
+
hasPir: false,
|
|
84
|
+
hasOc: false, // confirmed: no OC commands anywhere in this PDF
|
|
85
|
+
minMapVer: null, // not found stated in this PDF
|
|
86
|
+
series: 'original',
|
|
87
|
+
},
|
|
64
88
|
0x2D: {
|
|
65
89
|
name: 'VMBGP4PIR',
|
|
66
90
|
channels: 8,
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
0x1E: { name: 'VMBGP1', channels: 1, oled: false, pir: false, series: 'original' },
|
|
7
7
|
0x1F: { name: 'VMBGP2', channels: 2, oled: false, pir: false, series: 'original' },
|
|
8
8
|
0x21: { name: 'VMBGPO', channels: 32, oled: true, pir: false, series: 'original' },
|
|
9
|
+
0x28: { name: 'VMBGPOD', channels: 4, oled: true, pir: false, series: 'original' },
|
|
9
10
|
0x2D: { name: 'VMBGP4PIR', channels: 8, oled: false, pir: true, series: 'original' },
|
|
10
11
|
0x34: { name: 'VMBEL1', channels: 1, oled: false, pir: false, series: 'original' },
|
|
11
12
|
0x35: { name: 'VMBEL2', channels: 2, oled: false, pir: false, series: 'original' },
|
|
@@ -21,6 +21,7 @@ const ALL_TYPES = {
|
|
|
21
21
|
// Glass panels - original
|
|
22
22
|
0x1E: 'VMBGP1', 0x1F: 'VMBGP2', 0x20: 'VMBGP4',
|
|
23
23
|
0x21: 'VMBGPO', 0x2D: 'VMBGP4PIR',
|
|
24
|
+
0x28: 'VMBGPOD',
|
|
24
25
|
0x34: 'VMBEL1', 0x35: 'VMBEL2', 0x36: 'VMBEL4',
|
|
25
26
|
0x37: 'VMBELO', 0x38: 'VMBELPIR', 0x39: 'VMBSIG',
|
|
26
27
|
0x47: 'VMBEL2PIR',
|
|
@@ -78,6 +79,7 @@ const NODE_SUGGESTION = {
|
|
|
78
79
|
// Glass panels - all via single node
|
|
79
80
|
0x1E: 'velbus-glass-panel', 0x1F: 'velbus-glass-panel', 0x20: 'velbus-glass-panel',
|
|
80
81
|
0x21: 'velbus-glass-panel', 0x2D: 'velbus-glass-panel',
|
|
82
|
+
0x28: 'velbus-glass-panel',
|
|
81
83
|
0x34: 'velbus-glass-panel', 0x35: 'velbus-glass-panel', 0x36: 'velbus-glass-panel',
|
|
82
84
|
0x37: 'velbus-glass-panel', 0x38: 'velbus-glass-panel', 0x47: 'velbus-glass-panel',
|
|
83
85
|
0x3A: 'velbus-glass-panel', 0x3B: 'velbus-glass-panel', 0x3C: 'velbus-glass-panel',
|
|
@@ -114,6 +116,7 @@ const MODULE_CHANNELS = {
|
|
|
114
116
|
// Glass panels - original
|
|
115
117
|
0x1E: 1, 0x1F: 2, 0x20: 4,
|
|
116
118
|
0x21: 32, 0x2D: 8,
|
|
119
|
+
0x28: 4,
|
|
117
120
|
0x34: 1, 0x35: 2, 0x36: 4,
|
|
118
121
|
0x37: 4, 0x38: 8, 0x47: 6,
|
|
119
122
|
0x3A: 1, 0x3B: 2, 0x3C: 4,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-red-contrib-velbus-2026",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.3",
|
|
4
4
|
"description": "Node-RED palette for Velbus building automation \u2014 relay, dimmer, glass panel, PIR, blind, sensor, meteo, clock nodes. Original and V2 (-20) series.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"node-red",
|
package/velbus-2026-repo.bundle
CHANGED
|
Binary file
|
|
Binary file
|