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 CHANGED
@@ -1,96 +1,3 @@
1
- # Agent Instructions
1
+ # Agent instructions
2
2
 
3
- Instructions for AI coding agents (Claude Code, etc.) working in this repository.
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
@@ -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
- delete this.clients[iface];
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.1",
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.2.0",
54
- "homematic-rega": "^2.0.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.2.0"
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).