node-red-contrib-ccu 4.4.1 → 4.4.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/AGENTS.md +2 -95
- package/CHANGELOG.md +44 -0
- package/nodes/ccu-connection.js +53 -1
- package/package.json +4 -4
- package/HANDOFF.md +0 -201
package/AGENTS.md
CHANGED
|
@@ -1,96 +1,3 @@
|
|
|
1
|
-
# Agent
|
|
1
|
+
# Agent instructions
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## Project overview
|
|
6
|
-
|
|
7
|
-
`node-red-contrib-ccu` provides Node-RED nodes to connect to a Homematic CCU
|
|
8
|
-
(BidCos/HmIP/CUxD home automation hardware from eQ-3). It talks to the CCU
|
|
9
|
-
via BINRPC/XMLRPC (`nodes/ccu-connection.js` holds the bulk of the connection
|
|
10
|
-
and RPC logic) and via ReGaHSS remote scripts.
|
|
11
|
-
|
|
12
|
-
Layout:
|
|
13
|
-
|
|
14
|
-
- `nodes/` — one `.js` (server-side logic) + `.html` (editor UI/registration)
|
|
15
|
-
pair per node type. `nodes/lib/` has shared helpers, `nodes/icons/` and
|
|
16
|
-
`nodes/locales/` are editor assets/i18n.
|
|
17
|
-
- `test/` — mocha specs (`*_spec.js`), plus `test/simulator-data` and
|
|
18
|
-
`test/simulator-behaviors` used with `hm-simulator` to fake a CCU for tests.
|
|
19
|
-
- `tools/` — one-off scripts, not part of the published package.
|
|
20
|
-
- `paramsets.json` — large generated/vendored data file describing CCU device
|
|
21
|
-
paramsets (datapoints). Treat as data, not something to hand-edit.
|
|
22
|
-
- `docs/` — images referenced from README.md.
|
|
23
|
-
|
|
24
|
-
## Roadmap
|
|
25
|
-
|
|
26
|
-
Planned work lives in ROADMAP.md (stable IDs: `D-n` decisions, `B-n`
|
|
27
|
-
backlog, `OQ-n` open questions — never reuse an ID). When an item is
|
|
28
|
-
completed, move its content to `roadmap-archive/<ID>.md` (one file per
|
|
29
|
-
item), list it in `roadmap-archive/README.md`, and mark its line in the
|
|
30
|
-
ROADMAP.md contents with ✅ linking to the archive file. Read ROADMAP.md
|
|
31
|
-
before starting work that might overlap with a decision recorded there.
|
|
32
|
-
|
|
33
|
-
## Reference documentation
|
|
34
|
-
|
|
35
|
-
For anything involving HomematicIP (HmIP) devices, channels, or datapoints
|
|
36
|
-
(paramset names, value ranges, units, ENUM meanings, which channel a
|
|
37
|
-
datapoint belongs to, etc.), consult the official eQ-3 documentation:
|
|
38
|
-
|
|
39
|
-
https://www.eq-3.de/Downloads/eq3/download%20bereich/hm_web_ui_doku/HmIP_Device_Documentation.pdf
|
|
40
|
-
|
|
41
|
-
This PDF is the authoritative source for HmIP device/channel/datapoint
|
|
42
|
-
definitions — prefer it over guessing when adding or fixing paramset
|
|
43
|
-
handling, value casting, or device-specific logic.
|
|
44
|
-
|
|
45
|
-
For CUxD-specific devices/channels/datapoints, consult the docs in the
|
|
46
|
-
cuxd project itself:
|
|
47
|
-
|
|
48
|
-
https://github.com/jens-maus/cuxd/tree/master/docs
|
|
49
|
-
|
|
50
|
-
## Related fork worth checking
|
|
51
|
-
|
|
52
|
-
https://github.com/ptweety/node-red-contrib-ccu is an active fork of this
|
|
53
|
-
repo (currently at v3.6.2 vs. our v3.4.2). Not all of its direction is
|
|
54
|
-
necessarily wanted here, but it has diverged with changes that may be worth
|
|
55
|
-
cherry-picking individually — evaluate case by case rather than bulk-merging.
|
|
56
|
-
Known differences as of 2026-07:
|
|
57
|
-
|
|
58
|
-
- Added CCU-Jack as a supported interface.
|
|
59
|
-
- Dropped dependencies: `mqtt-wildcard`, `nextport`, `hm-discover`, and a
|
|
60
|
-
`promise.prototype.finally` polyfill.
|
|
61
|
-
- Split build into separate JS/HTML build steps; moved node help texts into
|
|
62
|
-
a restructured `locales/` layout.
|
|
63
|
-
- Tooling churn: `nyc` → `c8` for coverage, bumped `xo`/`eslint`/`mocha`/
|
|
64
|
-
`husky`/`node-red` devDependency versions, added `auto-changelog`.
|
|
65
|
-
- Added `MIGRATION.md`/contribution guidelines docs.
|
|
66
|
-
|
|
67
|
-
When a task here touches an area also changed upstream in that fork (e.g.
|
|
68
|
-
interface handling, build/lint tooling, locale structure), check what they
|
|
69
|
-
did before implementing from scratch — but confirm it still fits this
|
|
70
|
-
repo's compatibility floors (Node >= 20, Node-RED >= 4.0) before porting.
|
|
71
|
-
|
|
72
|
-
## Conventions
|
|
73
|
-
|
|
74
|
-
- Code style: ESLint 9 (flat config, `eslint.config.js`) + Prettier
|
|
75
|
-
(`.prettierrc`, 4-space, 120 cols). `npm run lint` checks both,
|
|
76
|
-
`npm run format` auto-fixes. Let a failing lint stop you.
|
|
77
|
-
- Tests: `npm run test:unit` runs mocha over `test/**/*_spec.js` against
|
|
78
|
-
`hm-simulator`; `npm test` = lint + tests; `npm run test:cov` adds c8
|
|
79
|
-
coverage.
|
|
80
|
-
- Each node's `.js` and `.html` files must stay in sync — the `.html`
|
|
81
|
-
defines the editor palette entry, config form, and help text; the `.js`
|
|
82
|
-
registers the runtime node type with the same name.
|
|
83
|
-
- `nodes/ccu-switch.js`/`.html` and `tools/paramsets-join.js` are excluded
|
|
84
|
-
from linting (see `eslint.config.js` ignores and `.prettierignore`) —
|
|
85
|
-
legacy exclusions to burn down.
|
|
86
|
-
|
|
87
|
-
## Working here
|
|
88
|
-
|
|
89
|
-
- Do not hand-edit `paramsets.json`; if it needs updating, look at how
|
|
90
|
-
`tools/paramsets-join.js` produces it.
|
|
91
|
-
- This addon is also shipped inside RedMatic (a Node-RED distribution for
|
|
92
|
-
CCU3/RaspberryMatic) — avoid breaking changes to node config schemas
|
|
93
|
-
without considering migration for existing flows.
|
|
94
|
-
- Supported floors as of 4.0: Node.js >= 20, Node-RED >= 4.0; the primary
|
|
95
|
-
target is Node-RED 5 on Node 24 (see ROADMAP.md D-1). Stay CommonJS
|
|
96
|
-
(D-2).
|
|
3
|
+
Agent working documents for this repository (roadmap, handoff, bugs) are kept outside it, in the maintainer's private agents repository, checked out next to this one as `../openccu-lite-agents/node-red-contrib-ccu/`. Read them first. Nothing in this repository links to them.
|
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,50 @@ Notable changes to node-red-contrib-ccu. Format follows
|
|
|
5
5
|
user-visible symptom and the cause, not the commit list (the release notes
|
|
6
6
|
append commits automatically).
|
|
7
7
|
|
|
8
|
+
## 4.4.3 (2026-09-09)
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **Node-RED at 100 % CPU and unresponsive on openccu-lite** (B-27, found on
|
|
13
|
+
the maintainer's Pi 4 with RedMatic 9.4.2). openccu-lite has no ReGaHSS, so
|
|
14
|
+
nothing listens on port 31999 — but the connection node still created the
|
|
15
|
+
ReGaHSS binrpc client in metadata mode, and binrpc up to 4.2.0 armed a new
|
|
16
|
+
reconnect timer for both the `error` and the `close` event of every refused
|
|
17
|
+
connect, so the number of attempts doubled every 2.5 s without bound: about
|
|
18
|
+
7,000 refused connects per second, 30,000 pending timers and 68 million
|
|
19
|
+
connects in under three hours. The same explosion hit a CCU whenever its
|
|
20
|
+
ReGaHSS was down for a while (restart, backup restore); it just ended when
|
|
21
|
+
the port came back. Two changes: the ReGaHSS client is not created at all
|
|
22
|
+
while the box is an openccu-lite (and is closed when a box becomes one, or
|
|
23
|
+
created when it stops being one), and this release requires
|
|
24
|
+
[binrpc 4.3.0](https://github.com/hobbyquaker/binrpc/blob/master/CHANGELOG.md),
|
|
25
|
+
which keeps a single reconnect timer per client with exponential backoff
|
|
26
|
+
(2.5 s doubling to 30 s) and has `close()`. The connection node now closes
|
|
27
|
+
its rpc clients when it is removed or redeployed, and when it replaces a
|
|
28
|
+
client after a failed call — a replaced binrpc client used to keep
|
|
29
|
+
reconnecting in the background for the life of the process.
|
|
30
|
+
|
|
31
|
+
## 4.4.2 (2026-09-09)
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
|
|
35
|
+
- **`getRegaVariables Error: socket hang up` every few minutes on a CCU**
|
|
36
|
+
(B-18, [RedMatic #601](https://github.com/rdmtc/RedMatic/issues/601)
|
|
37
|
+
follow-up). Since 4.3.0 a local install talks to ReGaHSS itself on port 8183. ReGaHSS answers HTTP/1.1 without `Connection: close` — and then
|
|
38
|
+
closes the connection 0.4–7 ms after every response (measured on a
|
|
39
|
+
CCU3 3.89.8, median 0.55 ms). `homematic-rega` 2.0 (since 4.0.0) sent
|
|
40
|
+
its requests through Node's `http.globalAgent`, which pools connections
|
|
41
|
+
(`keepAlive: true` since Node 19), so the next request on such a socket —
|
|
42
|
+
`regaPoll` right after a `setVariable`, or `getRegaPrograms` right after
|
|
43
|
+
`getRegaVariables` — could land in that window and die with
|
|
44
|
+
`ECONNRESET` / `socket hang up`; the sysvar nodes then showed
|
|
45
|
+
"disconnected" until the next poll. lighttpd on 8181 (the remote path,
|
|
46
|
+
and the local path before 4.3.0) keeps connections alive properly, which
|
|
47
|
+
is why nobody saw it before. In the lab (CCU3 3.89.8, Node 24.18.1, ReGaHSS kept busy by a script loop) a poll every 10 s preceded by a write, timed as the addon does it, lost 20 of 810 requests in 45 minutes with the pooled socket (27 per hour; the reporter's log shows about 6), 7 of 807 with a few milliseconds of client-side jitter, and 0 of 807 without keep-alive. Fixed in
|
|
48
|
+
`homematic-rega` 2.0.1, which uses an agent without keep-alive (the 1.x
|
|
49
|
+
behaviour) and takes an `agent` option; this release requires it. No
|
|
50
|
+
change to the addon's own code paths.
|
|
51
|
+
|
|
8
52
|
## 4.4.1 (2026-09-07)
|
|
9
53
|
|
|
10
54
|
### Fixed
|
package/nodes/ccu-connection.js
CHANGED
|
@@ -1151,6 +1151,13 @@ module.exports = function (RED) {
|
|
|
1151
1151
|
this.metaMode = true;
|
|
1152
1152
|
this.lastMetaProbe = now();
|
|
1153
1153
|
clearTimeout(this.regaPollTimeout);
|
|
1154
|
+
if (this.clients.ReGaHSS) {
|
|
1155
|
+
// the box became an openccu-lite while Node-RED was running
|
|
1156
|
+
// (recheckMeta): no ReGaHSS to talk to any more (B-27)
|
|
1157
|
+
this.logger.info('rpc client ReGaHSS closed: openccu-lite has no ReGaHSS');
|
|
1158
|
+
this.closeClient('ReGaHSS');
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1154
1161
|
this.logger.info(
|
|
1155
1162
|
'openccu-lite detected (' +
|
|
1156
1163
|
(info.implementation || 'meta api') +
|
|
@@ -1205,6 +1212,10 @@ module.exports = function (RED) {
|
|
|
1205
1212
|
return this.startMeta(again);
|
|
1206
1213
|
}
|
|
1207
1214
|
|
|
1215
|
+
if (this.ifaceTypes.ReGaHSS.enabled && !this.clients.ReGaHSS) {
|
|
1216
|
+
this.createClient('ReGaHSS').then(() => this.setIfaceStatus('ReGaHSS', true));
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1208
1219
|
return this.getRegaData().then(() => this.regaPoll());
|
|
1209
1220
|
});
|
|
1210
1221
|
},
|
|
@@ -1868,6 +1879,16 @@ module.exports = function (RED) {
|
|
|
1868
1879
|
Object.keys(this.ifaceTypes).forEach((iface) => {
|
|
1869
1880
|
const enabled = config[this.ifaceTypes[iface].conf + 'Enabled'];
|
|
1870
1881
|
this.ifaceTypes[iface].enabled = enabled;
|
|
1882
|
+
if (enabled && iface === 'ReGaHSS' && this.metaMode) {
|
|
1883
|
+
// B-27: openccu-lite has no ReGaHSS, nothing listens on 31999.
|
|
1884
|
+
// A client would only reconnect forever (with binrpc < 4.3.0
|
|
1885
|
+
// exponentially, at 100 % CPU). The metadata api reports the
|
|
1886
|
+
// interface status instead; the client is created if the box
|
|
1887
|
+
// stops being an openccu-lite (onGone).
|
|
1888
|
+
this.logger.info('rpc client ReGaHSS not created: openccu-lite has no ReGaHSS');
|
|
1889
|
+
return;
|
|
1890
|
+
}
|
|
1891
|
+
|
|
1871
1892
|
if (enabled) {
|
|
1872
1893
|
this.createClient(iface)
|
|
1873
1894
|
.then(() => {
|
|
@@ -1896,6 +1917,28 @@ module.exports = function (RED) {
|
|
|
1896
1917
|
* @param iface
|
|
1897
1918
|
* @returns {Promise<any>}
|
|
1898
1919
|
*/
|
|
1920
|
+
/**
|
|
1921
|
+
* Drop an rpc client and stop its reconnect timer (binrpc >= 4.3.0 has
|
|
1922
|
+
* close(); the xmlrpc client holds no timer). Without this a replaced
|
|
1923
|
+
* client kept reconnecting in the background for the life of the process.
|
|
1924
|
+
* @param iface
|
|
1925
|
+
*/
|
|
1926
|
+
closeClient(iface) {
|
|
1927
|
+
const client = this.clients[iface];
|
|
1928
|
+
if (!client) {
|
|
1929
|
+
return;
|
|
1930
|
+
}
|
|
1931
|
+
|
|
1932
|
+
delete this.clients[iface];
|
|
1933
|
+
if (typeof client.close === 'function') {
|
|
1934
|
+
try {
|
|
1935
|
+
client.close();
|
|
1936
|
+
} catch (error) {
|
|
1937
|
+
this.logger.debug('close rpc client ' + iface + ': ' + error.message);
|
|
1938
|
+
}
|
|
1939
|
+
}
|
|
1940
|
+
}
|
|
1941
|
+
|
|
1899
1942
|
createClient(iface) {
|
|
1900
1943
|
return new Promise((resolve) => {
|
|
1901
1944
|
const {rpc, port, path, protocol, auth, user, pass, tls, inSecure} = this.ifaceTypes[iface];
|
|
@@ -2166,6 +2209,15 @@ module.exports = function (RED) {
|
|
|
2166
2209
|
});
|
|
2167
2210
|
});
|
|
2168
2211
|
|
|
2212
|
+
// last: the clients themselves, so their reconnect timers die with the
|
|
2213
|
+
// node (a redeploy used to leave every binrpc client reconnecting)
|
|
2214
|
+
calls.push(() => {
|
|
2215
|
+
Object.keys(this.clients).forEach((iface) => {
|
|
2216
|
+
this.closeClient(iface);
|
|
2217
|
+
});
|
|
2218
|
+
return Promise.resolve();
|
|
2219
|
+
});
|
|
2220
|
+
|
|
2169
2221
|
this.logger.debug('shutdown tasks: ' + calls.length);
|
|
2170
2222
|
return calls.reduce((p, task) => p.then(task), Promise.resolve());
|
|
2171
2223
|
}
|
|
@@ -3159,7 +3211,7 @@ module.exports = function (RED) {
|
|
|
3159
3211
|
this.clients[iface].methodCall(method, parameters, (err, res) => {
|
|
3160
3212
|
if (err) {
|
|
3161
3213
|
this.logger.error(' <', iface, method, err);
|
|
3162
|
-
|
|
3214
|
+
this.closeClient(iface);
|
|
3163
3215
|
this.createClient(iface);
|
|
3164
3216
|
reject(err);
|
|
3165
3217
|
} else if (res && res.faultCode) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-red-contrib-ccu",
|
|
3
|
-
"version": "4.4.
|
|
3
|
+
"version": "4.4.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "none",
|
|
6
6
|
"keywords": [
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
],
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"binrpc": "^4.
|
|
54
|
-
"homematic-rega": "^2.0.
|
|
53
|
+
"binrpc": "^4.3.0",
|
|
54
|
+
"homematic-rega": "^2.0.1",
|
|
55
55
|
"homematic-xmlrpc": "^2.0.0",
|
|
56
56
|
"mqtt-wildcard": "^3.0.9"
|
|
57
57
|
},
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"overrides": {
|
|
76
76
|
"hm-simulator": {
|
|
77
77
|
"homematic-xmlrpc": "^2.0.0",
|
|
78
|
-
"binrpc": "^4.
|
|
78
|
+
"binrpc": "^4.3.0"
|
|
79
79
|
}
|
|
80
80
|
},
|
|
81
81
|
"engines": {
|
package/HANDOFF.md
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
# Session handoff — 2026-09-04
|
|
2
|
-
|
|
3
|
-
Context for continuing on another machine. Delete this file once its
|
|
4
|
-
content is consumed (state that outlives the day belongs in ROADMAP.md).
|
|
5
|
-
Lab addresses and credentials are intentionally **not** in this file
|
|
6
|
-
(nor in the wiki or issues).
|
|
7
|
-
|
|
8
|
-
## State
|
|
9
|
-
|
|
10
|
-
- **4.0.0 released 2026-09-02, 4.1.0 released 2026-09-04** (npm latest
|
|
11
|
-
= 4.1.0, OIDC provenance, GitHub releases). 4.1.0 = binrpc 4.2.0, B-14
|
|
12
|
-
(LEVEL_2 → COMBINED_PARAMETER, unverified on hardware by decision),
|
|
13
|
-
paramsets fetch/join tooling and the regenerated `paramsets.json`
|
|
14
|
-
(+605 keys from the production CCU and two lab CCUs). Phase 3:
|
|
15
|
-
cast/topic/message/castSysvar extracted, 43 unit tests
|
|
16
|
-
(`npm run test:pure`, 71 on the B-16 branch).
|
|
17
|
-
- **4.2.0 released 2026-09-04** (tag v4.2.0, npm latest = 4.2.0): the
|
|
18
|
-
ccu-homeassistant node (B-16, archived). Branch `b-16-homeassistant`
|
|
19
|
-
merged with `--no-ff` and deleted. The lab CCUs run the equivalent
|
|
20
|
-
`4.2.0-dev.1` build with the "B-16 Home Assistant" flow tabs; reporters
|
|
21
|
-
of #136/#154/#175 were asked (2026-09-04) to confirm the LEVEL_2 fix
|
|
22
|
-
on their hardware.
|
|
23
|
-
- **4.3.0 released 2026-09-04** (tag v4.3.0, npm latest = 4.3.0):
|
|
24
|
-
B-2 (dynamic configuration via `msg.config`), B-3 (ccu-mqtt fixes plus
|
|
25
|
-
the `get` and `rpc` commands and the VALUE_LIST enum names), B-4
|
|
26
|
-
(local-CCU detection via a /proc/net/tcp listener probe) and B-5
|
|
27
|
-
(ping toggle, value+age status lines, uncertain filter, trailing sysvar
|
|
28
|
-
re-poll, RSSI guard). All four archived. Branch `b-2-b-5` merged with
|
|
29
|
-
`--no-ff`; 145 pure tests, 23 integration specs green on all four CI
|
|
30
|
-
legs.
|
|
31
|
-
- **4.4.0 released 2026-09-06** (tag v4.4.0, npm latest = 4.4.0):
|
|
32
|
-
B-17, the openccu-lite port. `nodes/lib/metaprovider.js` takes names,
|
|
33
|
-
rooms and functions from the box's metadata API (`/api/meta/v1`
|
|
34
|
-
snapshot + SSE) when `GET /api/meta/v1/version` answers; a CCU
|
|
35
|
-
answers 404 and the ReGa path is byte-for-byte what it was. Two
|
|
36
|
-
optional connection fields (openccu-lite token, port); on the box the
|
|
37
|
-
token comes from `/usr/local/etc/occulite/local-token`. sysvar,
|
|
38
|
-
program, script and poll stay in the palette and error per message.
|
|
39
|
-
16 unit tests plus a verification against a real `occulited` built
|
|
40
|
-
from ../openccu-lite (see roadmap-archive/B-17.md). Branch
|
|
41
|
-
`b-17-openccu-lite` merged with `--no-ff` and deleted. **Open: no test
|
|
42
|
-
on real openccu-lite hardware, and the connection dialog with the two
|
|
43
|
-
new fields has not been opened in a browser.** RedMatic's own port
|
|
44
|
-
needs `node-red-contrib-ccu@^4.4.0`.
|
|
45
|
-
- Issue tracker: 36 → **19 open**. The 17 issues 4.3.0 fixes were
|
|
46
|
-
commented and closed after the release (#172 #71 #103 #80 #56 #148
|
|
47
|
-
#133 #115 #22 #167 #44 #54 #52 #96 #166 #183 #51, plus comments on the
|
|
48
|
-
already-closed #185 and #158). B-6/B-7/B-14/B-16 archived; roadmap is
|
|
49
|
-
current.
|
|
50
|
-
- **Not done for 4.3.0: the editor smoke test in a browser.** The inline
|
|
51
|
-
editor scripts are syntax-checked by a new unit test and the runtime
|
|
52
|
-
was verified on a lab CCU, but the dialogs themselves have not been
|
|
53
|
-
clicked through — and 4.3.0 adds fields to ccu-connection (RPC ping,
|
|
54
|
-
names/rooms refresh), ccu-sysvar (Value from), ccu-mqtt (get + the two
|
|
55
|
-
RPC topics) and ccu-value/ccu-rpc-event (discard uncertain values).
|
|
56
|
-
- Lab CCU `ccu-charly` runs 4.3.0-dev.1 (identical to the release) with a
|
|
57
|
-
flow tab **"B-2..B-5 test"**: three inject nodes driving one
|
|
58
|
-
ccu-set-value through different `msg.config` filters, an rpc-event
|
|
59
|
-
debug, and an mqtt rig on the `hm2test/` prefix (mqtt in → ccu-mqtt →
|
|
60
|
-
mqtt out) used to verify the new `get` and `rpc` commands. The relays
|
|
61
|
-
were left switched off.
|
|
62
|
-
|
|
63
|
-
## Decisions (2026-09-04)
|
|
64
|
-
|
|
65
|
-
- **The production CCU3 stays on firmware 3.87.6.** No update for the
|
|
66
|
-
sake of the paramsets regeneration. The regen runs against it as-is;
|
|
67
|
-
what matters is the set of _paired_ device types, and 3.87.6 already
|
|
68
|
-
reports the current descriptions for those (verified for the heating
|
|
69
|
-
group / eTRV in docs/paramsets.md §4).
|
|
70
|
-
- **Two lab systems exist** (set up for the RedMatic 9.0.0 work, see
|
|
71
|
-
`../RedMatic/HANDOFF.md`): x86_64 OpenCCU 3.89.8 and an armv7l CCU3
|
|
72
|
-
on original firmware 3.89.8, both running a RedMatic dev install with
|
|
73
|
-
node-red-contrib-ccu 4.0.0. Use them for anything risky or
|
|
74
|
-
destructive (firmware-3.89 behavior, install/update paths, B-14
|
|
75
|
-
style hardware pokes if a suitable device gets paired there). They
|
|
76
|
-
have few/no devices paired, so they **cannot replace the production
|
|
77
|
-
dump** — at most they add the group-type (VirtualDevices) keys on
|
|
78
|
-
3.89.8 and serve as a diff reference.
|
|
79
|
-
|
|
80
|
-
## Plan (blocks 4.1.0)
|
|
81
|
-
|
|
82
|
-
1. ~~Full paramsets regeneration~~ **done 2026-09-04** (4.1.0-dev.7):
|
|
83
|
-
lab CCUs (3.89.8) joined first (+58 keys), then the production CCU
|
|
84
|
-
(3.87.6, fetched read-only from WSL with `--delay 600`, ~25 min for
|
|
85
|
-
962 keys: +547 new, 32 refreshed — BidCos-RF, BidCos-Wired, HmIP and
|
|
86
|
-
the HmIP-HEATING 2.0.0 group). Rules for the production box, given by
|
|
87
|
-
the user: read-only, slow request rate (it overloads easily), and its
|
|
88
|
-
RPC callbacks only reach the Node-RED test box (firewall) — a live
|
|
89
|
-
node-red-contrib-ccu connection against it must run there, never from
|
|
90
|
-
WSL or a lab CCU. Procedure: docs/paramsets.md §3.
|
|
91
|
-
2. ~~B-14 hardware check~~ **skipped by user decision 2026-09-04** — no
|
|
92
|
-
test on the production blind for now; the CHANGELOG says so and the
|
|
93
|
-
reporters of #136/#154/#175 are asked for confirmation. The recipe
|
|
94
|
-
(ccu-value node writing LEVEL_2 to the HmIP-FBL's `:4` channel on
|
|
95
|
-
the Node-RED test box, log shows the COMBINED_PARAMETER remap) stays
|
|
96
|
-
valid if it is ever wanted.
|
|
97
|
-
3. ~~Release 4.1.0~~ **done 2026-09-04** (tag v4.1.0, release.yml green,
|
|
98
|
-
npm latest 4.1.0). Follow-up worth doing: comment on #136/#154/#175
|
|
99
|
-
that 4.1.0 contains the LEVEL_2 fix and ask for confirmation on real
|
|
100
|
-
hardware (needs the user's go — outward-facing).
|
|
101
|
-
4. **Release 4.2.0 = B-16** — editor smoke test done by the user
|
|
102
|
-
2026-09-04 (ok), released the same day: branch merged into master
|
|
103
|
-
with `--no-ff` (never rebase with `-X theirs` — it silently keeps the
|
|
104
|
-
branch side of conflicting doc hunks, which bit twice today), CHANGELOG
|
|
105
|
-
dated, version 4.2.0, tag v4.2.0. B-16 archived. B-2 is 4.3.0.
|
|
106
|
-
|
|
107
|
-
## B-16 branch `b-16-homeassistant` (2026-09-04, target 4.2.0)
|
|
108
|
-
|
|
109
|
-
- Implemented and committed on the branch (not pushed): ccu-homeassistant
|
|
110
|
-
node + `lib/haroles.js` + `lib/hadiscovery.js` (ported from hm2mqtt.js;
|
|
111
|
-
channel TYPE is the primary role key because only ~45 % of the shipped
|
|
112
|
-
VALUES descriptions carry CONTROL hints), 24 unit tests, ccu-mqtt HA
|
|
113
|
-
command words + empty-name
|
|
114
|
-
topic fix, ccu-connection `deregister` fix and `type=devices` admin
|
|
115
|
-
endpoint, README section, `examples/home-assistant.json`, CHANGELOG
|
|
116
|
-
"Unreleased (4.2.0)". Details in ROADMAP B-16.
|
|
117
|
-
- Local `npm test`: lint + 71 pure tests green. The mocha integration
|
|
118
|
-
suite cannot run on this WSL machine (hm-simulator's port 8181 →
|
|
119
|
-
EADDRINUSE, identical on master) — push the branch and let CI run it.
|
|
120
|
-
- **Lab test done 2026-09-04** on the CCU3 lab box (branch build
|
|
121
|
-
installed into RedMatic, `node-red-contrib-aedes` as broker inside
|
|
122
|
-
Node-RED, flow tab "B-16 Home Assistant" left deployed there) against
|
|
123
|
-
Home Assistant 2026.9.0 in docker on WSL: 3 wired devices discovered
|
|
124
|
-
(232 entities, 47 enabled), switch round trip on/off, DRI16 event
|
|
125
|
-
entities, removal on untick — all good after fixing three payload
|
|
126
|
-
defects HA had rejected (see ROADMAP B-16). Scripts for the whole setup
|
|
127
|
-
(install, deploy, HA onboarding, status via comms websocket) are in
|
|
128
|
-
this session's scratchpad; the lab hand-over note lists the HA
|
|
129
|
-
container and login.
|
|
130
|
-
- Second round on the OpenCCU lab box (branch build installed there too,
|
|
131
|
-
flow tab "B-16 Home Assistant" with topic prefix `hm2/` and plain
|
|
132
|
-
payloads, publishing to the CCU3 box's broker): HmIP-PDT light round
|
|
133
|
-
trip with brightness verified, HmIP-WRC2 events discovered, no HA
|
|
134
|
-
warnings.
|
|
135
|
-
- she (Smart Home Engine) as consumer: the user moved their she dev
|
|
136
|
-
instance to the test broker, and both lab flows now publish there as
|
|
137
|
-
well (second mqtt-broker config in each flow), so that instance's
|
|
138
|
-
HA-discovery view lists the 5 lab devices (no orphaned/duplicate
|
|
139
|
-
flags) — the quick check for future B-16 changes; a private she on the
|
|
140
|
-
lab broker exists too. Details and addresses in the lab hand-over note.
|
|
141
|
-
- Still open: editor smoke test in a browser on a lab box (device table,
|
|
142
|
-
ccu-mqtt select), a real key press (event entity), CI. Cover/climate
|
|
143
|
-
payloads have no lab hardware — unit tests only.
|
|
144
|
-
- Merge after 4.1.0 is released (rebase onto master; the CHANGELOG has
|
|
145
|
-
separate Unreleased sections, so this is trivial).
|
|
146
|
-
|
|
147
|
-
## Infrastructure (this does not travel via git; addresses live outside the repo)
|
|
148
|
-
|
|
149
|
-
- **Node-RED test box** (Debian bookworm, Node 24, Node-RED 5.0.6, ssh as
|
|
150
|
-
root with key auth): `systemctl {restart,status} node-red`,
|
|
151
|
-
`journalctl -u node-red`, user dir `/root/.node-red`, nginx TLS in
|
|
152
|
-
front with internal CA certs. Deploy: `npm pack` → scp tarball →
|
|
153
|
-
`cd /root/.node-red && npm install /tmp/<tarball> && systemctl restart
|
|
154
|
-
node-red`. Verify: `curl -s http://localhost:1880/nodes -H "Accept:
|
|
155
|
-
application/json"`.
|
|
156
|
-
- **Production CCU3** (fw 3.87.6, stays there, other VLAN): read-only ssh
|
|
157
|
-
as root works; XML-RPC 2001/2010/9292 answer client calls from WSL.
|
|
158
|
-
Contrary to the earlier note it is _not_ HmIP-only: the 2026-09-04
|
|
159
|
-
dump lists ~35 BidCos-RF, 3 BidCos-Wired and ~30 HmIP device types
|
|
160
|
-
plus heating groups. Gotcha that cost hours: the CCU firewall must
|
|
161
|
-
allow the CCU → Node-RED callback port, otherwise inits hang for
|
|
162
|
-
minutes and metadata never arrives — only the Node-RED test box is
|
|
163
|
-
allowed through.
|
|
164
|
-
- **Lab CCUs**: see Decisions above and `../RedMatic/HANDOFF.md`
|
|
165
|
-
("Building and testing locally") for the scripted-check recipes
|
|
166
|
-
(Node-RED token via `POST /addons/red/auth/token`, CCU session via the
|
|
167
|
-
JSON-API).
|
|
168
|
-
- **Firmware image** `ccu3-3.89.8.tgz` lives in a temp dir on the old
|
|
169
|
-
Mac only — if needed again, re-download from the official CCU3
|
|
170
|
-
firmware page. Its analysis is preserved in docs/paramsets.md.
|
|
171
|
-
- **gh CLI**: needs auth on the new machine (`gh auth login`,
|
|
172
|
-
account hobbyquaker). Issue/PR comments are signed
|
|
173
|
-
"Claude (Fable 5) … on behalf of @hobbyquaker" (German or English
|
|
174
|
-
matching the issue).
|
|
175
|
-
|
|
176
|
-
## Waiting on externals (do not gate 4.1.0)
|
|
177
|
-
|
|
178
|
-
- Reporter dumps: #177 (BSL-V2), #144 (WRCD), #159 (CuxD) — for B-15 +
|
|
179
|
-
paramsets; requested in the issues 2026-09-02.
|
|
180
|
-
- Retest answers: #111, #145, #146, #151 (close ~2026-12 if silent);
|
|
181
|
-
#112, #117 (retest comments posted).
|
|
182
|
-
- Hardware confirmation for B-14 from reporters (#136/#154/#175).
|
|
183
|
-
|
|
184
|
-
## After 4.3.0 (queue)
|
|
185
|
-
|
|
186
|
-
1. Browser smoke test of the config dialogs changed in 4.3.0 (see above).
|
|
187
|
-
2. Editor loader consolidation (Phase 3 §6.4 + §8.1 defect 3, shared
|
|
188
|
-
`resources/` script for the 9 dialogs) — needs a user smoke test on
|
|
189
|
-
the Node-RED test box afterwards.
|
|
190
|
-
3. Remaining Phase 3: split rpc/rega/queue out of ccu-connection.js,
|
|
191
|
-
async/await as touched, i18n/help consolidation (#58). `lib/` grew
|
|
192
|
-
`dynconfig`, `channelfilter`, `valuestatus` and `localccu` in 4.3.0;
|
|
193
|
-
`ccu-connection.js` is still ~3100 lines.
|
|
194
|
-
4. Remaining Phase 4: B-11 (re-init robustness — the `rpcCheckInit`
|
|
195
|
-
early return for device-less interfaces is still there, deliberately
|
|
196
|
-
left alone in 4.3.0 to keep its scope), B-12 (auth/TLS, #27), B-13
|
|
197
|
-
(party mode, #161/#156), B-15 (new HmIP channel types, #177/#144),
|
|
198
|
-
B-8/B-9/B-10.
|
|
199
|
-
5. Still open from §8.3: the stale device-table cache (#181 — 4.3.0's
|
|
200
|
-
refresh covers names/rooms/functions only) and the internal system
|
|
201
|
-
variables (#184, needs a `homematic-rega` release).
|