Added
-
TLS and authentication for every connection to a CCU on the network
(task 5, #27). With TLS/SSL on, all XML-RPC interfaces are reached over
the CCU's TLS ports (42000, 42001, 42010, 49292; CCU-Jack 2122), the ReGaHSS
over 48181 and openccu-lite's metadata api over 443; with Authentication
on, the username and password go out as HTTP basic auth on every call, the
initincluded, to every XML-RPC interface and the ReGaHSS. Both are the
CCU's web server's - a CCU3 switches them on in its firewall settings,
openccu-lite under remote access. A local connection (Node-RED on the
system,localhost/127.0.0.1) reaches the interface processes directly
on the loopback and uses neither, whatever the dialog says: https to a plain
port or credentials in a BIN-RPC frame only broke the connection before;
the dialog hides the fields for a loopback address and says so. BIN-RPC has
neither: with TLS on, BidCos-RF goes XML-RPC over TLS even when the hidden
bcrfBinRpcproperty asked for BIN-RPC (a warning names it); CUxD's BIN-RPC
never has them. Node-RED's own callback server for the CCU's events stays
plain HTTP - the CCU presents no credentials and cannot verify our
certificate; the help text says so and asks for a firewall rule on the
Node-RED host. Ticking Authentication ticks TLS/SSL with a notice in the
editor instead of a browser alert. Without Ignore invalid TLS
certificates, the CCU's self-signed certificate is refused, as before. -
One topic template in every node that emits, the value node's input
takes the emitted shape (task 6, #39 @psi-4ward). Theget valuenode has a Topic
field now, the same${…}template as rpc-event, value, sysvar, program,
rpc and script; empty (the default, and every existing flow) leaves
msg.topicas it came in. The value node's input accepts a datapoint
address inmsg.topicin the shape the nodes emit
(ccu3/BidCos-RF/OEQ1868878:1/STATE,hm/BidCos-RF/OEQ1868878:1/STATE: the
last three slash-separated segments) besides the old
BidCos-RF.OEQ1868878:1.STATE, so an event's topic can be fed straight back.
No default changed: whoever wants one scheme everywhere enters e.g.
hm/${Interface}/${channel}/${datapoint}in each node; the README's Topics
section lists the defaults and the placeholders, the help texts of
rpc-event, value and get value the placeholders. -
Help texts for every node in German and English, as locale files
(task 7, #58). The help moved from inline blocks in the node files into
nodes/locales/de/andnodes/locales/en-US/, the layout Node-RED
documents for node help: the runtime serves one language's text per
request through the same lookup as its own nodes (deandde-DEboth
get the German text, everything else the English one) instead of shipping
every language's block with the node. German is the source; the English texts of the connection,
value, rpc-event, set-value, sysvar and switch nodes, which were missing or
one-line stubs, are complete now, the mqtt node's help describes its topics,
commands and payload formats in both languages, the set-value node's German
configuration list (empty bullets since 3.x) and the rpc-event node's output
section are written, and the value nodes link the eQ-3 HmIP device
documentation for what a datapoint means (@lolli78). A unit test guards
that every node has both files, that neither is a stub, and that no inline
help is left.
Fixed
- Writing one party-mode datapoint of an HmIP thermostat reset the other
two (task 2, #156 @ben-5555, #161 @lolli78). An HmIP eTRV/WTH takes
PARTY_TIME_START,PARTY_TIME_ENDandPARTY_SET_POINT_TEMPERATUREonly
together: asetValueof one of them put the others back to
1999_11_30 00:00, so party or holiday mode could not be set from the
value nodes at all. A write to one of the three through the value or
set-value node now goes out as oneputParamsetonVALUESwith all
three, the other two taken from our own last write, the value cache or a
getParamsetread of the channel - the way the WebUI writes them. The two
times may be given as the device'sYYYY_MM_DD HH:MMstring, a JavaScript
Date, an ISO string or epoch milliseconds; they are formatted for the device
in local time. Any other datapoint of the channel is written as before. The
older HM thermostats (PARTY_MODE_SUBMIT) are not covered. - A callback call with an unknown interface id ended Node-RED (B-32).
Anything on the system can connect to the connection's callback ports on
the loopback; asystem.listMethodswithout parameters, aneventwith an
id that is not one of ours, or anewDeviceslist with a malformed entry
threw inside the RPC server's handler, which runs from an event emitter -
an uncaughtTypeError, and the whole Node-RED process exited. Such a call
is now answered with an empty result (the method list for
system.listMethods) and logged at debug; a throw inside a handler is
logged as an error and answered instead of ending the process. - A metadata api detection that timed out at start left the connection in
ReGa mode for good (B-28). On openccu-lite the connection asks
GET /api/meta/v1/versiononce at start; when that probe ran into its 5 s
timeout - on a Raspberry Pi 3 Node-RED's own start blocks the event loop
long enough for that at every start, on a busy system now and then - the
connection settled for the ReGaHSS, the ReGa polls failed every 30 s and
names, rooms and functions stayed empty; the only re-detection ran from rare
error paths, at most every five minutes. A timeout, a refused connection or
a 502/503/504 is now taken as "not decided": the ReGa path starts as before,
the detection is repeated after 1, 2, 4, 8 s and then every 15 s (up to 20
times, then the five-minute rule again), and the failing ReGa poll asks for
a re-detection too. A CCU's 404 is still a conclusive "no". - After an hmipserver restart HmIP-RF events stopped for up to ten minutes
(B-29). hmipserver forgets its clients when it restarts and does not tell
them: theinithad succeeded, nothing failed, and the events simply stopped
until the 600 s silence timeout calledinitagain. The connection now
pings HmIP-RF after 30 s without an event and, when no event (the PONG)
arrives within 10 s, subscribes again at once - the interface shows
waiting meanwhile, one warning names the reason, and the retry of 4.4.4
covers the time the process is down. AnewDevicesfrom the restarted
hmipserver (it sends one about 16 s in) triggers the ping right away, so
events are back well within a minute. An interface that never delivered an
event since itsinitis not re-subscribed on a missing PONG alone. - A queued write of the same set point was dropped after the actuator had
been operated by hand (B-19, #151 @vigeland). The value node's Queue compared the
new value with the value cache, and the cache of a control channel
(HmIP-FROLL/BROLL:4, the status lives in:3) holds the echo of our own
last write for good - a blind moved by hand reports no new set point there,
so the same1could never be sent again while Homematic Manager moved the
blind at once. A cached value that is the echo of our own last write no
longer dedupes; only a value from another source does. The value node has a
Force option (andmsg.config.force), as set-value has it; set-value's
own pre-check no longer drops a forced write when the cache already holds
the value.
Security
- The CCU password and the openccu-lite token were stored in plain text in
flows.jsonand went out with every exported flow (B-31). Both are
Node-RED credentials now (flows_cred.json, encrypted, never exported).
A flow written before this version still carries them as plain properties:
the connection uses them once, moves them into the credentials and warns;
the editor no longer knows the two properties, so the next deploy removes
them fromflows.json. Nothing to do by hand.
Changed
- The device table follows the CCU, and can be re-read by hand (task 9,
#146 @guny74, #181 @vore). A device or channel the CCU reports with another TYPE,
VERSION or FIRMWARE than the cache holds replaces the cached entry, leaves
its old type list and gets its datapoints fetched again - a channel whose
type changed in place kept its old datapoints before, until the cache file
was deleted. The connection node's dialog has a Re-read device data
button that asks every connected interface for its device list again
(new and changed devices get their datapoints, removed ones go) and
reports what changed. The editor's channel pickers no longer empty the
configured channel when the connection is still initialising: they show
loading device data and ask again. - An interface without devices is watched too (task 9, old B-11). The
ping watchdog returned early for an interface with no devices in the
cache, so such an interface never pinged and never re-initialised after a
CCU reboot. It pings now, and re-initialises after the ping timeout once
it has ever delivered an event (a PONG counts) - a process that answers no
ping at all is not asked toinitevery timeout. - The
listDevicesanswer to hmipserver lists the CCU's virtual remote
control (HmIP-RCV-1) again (task 13). It was left out since CCU3 firmware
3.43.15 (2019), whose hmipserver failed on an answer that held it; current
hmipservers take it, and without it everyinitmade hmipserver log a
handleIDMigration warning and send the whole virtual remote (52
descriptions) again withnewDevices.
Commits since v4.4.5
- 4.5.0 - TLS and authentication for remote CCUs, party mode, device table re-read, help texts, callback and liveness fixes (4be79e9)
- Help texts for every node in German and English, as locale files (task 7, #58) (0287001)
- Party mode on HmIP thermostats: one datapoint written means all three go out in one putParamset (task 2, #156, #161) (8222e97)
- One topic template in every node that emits, the value node's input takes the emitted shape (task 6, #39) (ac67320)
- TLS and authentication for every connection to a CCU on the network (task 5, #27) (9253d07)
- Device table: changed devices are taken over, a re-read button, pickers that wait, the watchdog for device-less interfaces (task 9) (725dbfb)
- listDevices lists the virtual remote control (HmIP-RCV-1) again (task 13) (a9e191e)
- test: wait for the event stream before sending an event to the provider (B-30) (fcc1147)
- The CCU password and the openccu-lite token are Node-RED credentials, not flow properties (B-31) (ad5ff52)
- Queued writes: the echo of our own write does not dedupe, force on the value node (B-19, #151) (b66a03f)
- HmIP-RF liveness: a ping every 30 s without an event, init again when no PONG comes within 10 s (B-29) (2f75934)
- An inconclusive metadata api detection at start is repeated instead of settling for the ReGa (B-28) (efe4141)
- Callback calls with an unknown interface id are answered, never thrown on (B-32) (c950935)