iobroker.zeptrion 0.8.3 → 0.8.5
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/README.md +210 -188
- package/admin/jsonConfig.json +442 -56
- package/io-package.json +34 -55
- package/package.json +7 -9
package/README.md
CHANGED
|
@@ -7,62 +7,62 @@
|
|
|
7
7
|
[](https://github.com/bueste/ioBroker.zeptrion/actions)
|
|
8
8
|
[](LICENSE)
|
|
9
9
|
|
|
10
|
-
Adapter
|
|
11
|
-
WLAN
|
|
12
|
-
zrap
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
##
|
|
17
|
-
|
|
18
|
-
- **
|
|
19
|
-
dim_up/dim_down
|
|
20
|
-
recall_s1-4 / store_s1-4 / delete_s1-4 -
|
|
21
|
-
`command
|
|
22
|
-
- **
|
|
23
|
-
|
|
24
|
-
read/write:
|
|
25
|
-
- **
|
|
26
|
-
|
|
27
|
-
- **
|
|
28
|
-
- **
|
|
29
|
-
|
|
30
|
-
- **
|
|
31
|
-
- **
|
|
32
|
-
(`zrap/date`)
|
|
33
|
-
- **mDNS
|
|
34
|
-
zeptrion
|
|
35
|
-
(
|
|
36
|
-
- **
|
|
37
|
-
`stopAllShutters`
|
|
38
|
-
-
|
|
39
|
-
- **Multicast
|
|
40
|
-
|
|
41
|
-
(
|
|
42
|
-
- **
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
- **Smartfront
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
(WLAN
|
|
10
|
+
Adapter for Feller **zeptrion / zApp** WLAN actuators (WLAN Nebenstelle 4K = zApp gateway,
|
|
11
|
+
WLAN Zwischenmodul 2K = zApp booster) for light and shutter/blind control, based on the
|
|
12
|
+
zrap web service API (Feller document 10.ZEPAPI-E.1612 / version 1.0, firmware from 01.08.18).
|
|
13
|
+
|
|
14
|
+
_(Eine deutsche Version dieser README ist verfügbar unter [README_de.md](README_de.md).)_
|
|
15
|
+
|
|
16
|
+
## Feature overview
|
|
17
|
+
|
|
18
|
+
- **Channel control** (`zrap/chctrl`): on/off/stop/toggle, open/close, move_open/move_close,
|
|
19
|
+
dim_up/dim_down including timed variants (`_t` in ms), as well as scenes
|
|
20
|
+
recall_s1-4 / store_s1-4 / delete_s1-4 - both as individual buttons AND as a free-text
|
|
21
|
+
`command` field.
|
|
22
|
+
- **Channel state** (`zrap/chscan` as a periodic resync + `zrap/chnotify` as a long-poll
|
|
23
|
+
push for near real-time updates) and **channel description** (`zrap/chdes`,
|
|
24
|
+
read/write: name, group, icon, type, category).
|
|
25
|
+
- **Device information** (`zrap/id`): hardware/software/bootloader version, serial number,
|
|
26
|
+
system name, device type.
|
|
27
|
+
- **Signal strength** (`zrap/rssi`, polled).
|
|
28
|
+
- **Network status** (`zrap/net`, read-only): SSID, IP, MAC, mode, encryption,
|
|
29
|
+
mask, gateway.
|
|
30
|
+
- **System commands** (`zrap/sys`): reboot, factory reset, reset to access-point mode.
|
|
31
|
+
- **Location** (`zrap/loc`), **NTP configuration** (`zrap/ntp`) and **date/time**
|
|
32
|
+
(`zrap/date`) including one-click synchronization of the device clock with the ioBroker host.
|
|
33
|
+
- **mDNS discovery** (chapter 4 of the API documentation): scans the local network for
|
|
34
|
+
zeptrion devices and adds finds to the configuration table in a disabled state
|
|
35
|
+
(discovery combined with manual review/activation).
|
|
36
|
+
- **Bulk commands for hail alerts**: `control.closeAllShutters` / `openAllShutters` /
|
|
37
|
+
`stopAllShutters` control all configured channels across all active devices at once
|
|
38
|
+
- thanks to multicast bundling (see below), as a single request per device, not per channel.
|
|
39
|
+
- **Multicast command bundling**: channel commands for the same device that arrive within
|
|
40
|
+
50ms of each other are automatically bundled into a single `zrap/chctrl` multicast POST
|
|
41
|
+
(chapter 3.6.5 of the API documentation) instead of several sequential individual requests.
|
|
42
|
+
- **Shutter position estimation** (optional, `posEstimate`): since the hardware, per the
|
|
43
|
+
documentation, practically always reports `-1` (unknown) for shutter channels, a motor
|
|
44
|
+
travel time can be configured per device; the adapter estimates the position from this
|
|
45
|
+
based on direction of movement and elapsed time (best effort, no hardware feedback,
|
|
46
|
+
manually calibratable).
|
|
47
|
+
- **Smartfront support** (optional, `zapi/smartfront/*`): read temperature/brightness/
|
|
48
|
+
humidity, set LED background color (only for devices with a connected Feller Smartfront
|
|
49
|
+
switch, checkbox in the configuration).
|
|
50
|
+
- Robust error handling: distinguishes ECONNREFUSED/timeout/DNS errors, backoff on
|
|
51
|
+
repeated failures, per-device and global connection status. mDNS discovery is
|
|
52
|
+
additionally hardened against exceptions caused by malformed/unrelated network packets.
|
|
53
|
+
|
|
54
|
+
Not implemented (see "Known limitations"): write access to `zrap/net`
|
|
55
|
+
(changing WLAN credentials), `zrap/scheduler`, Smartbutton webhook programming
|
|
56
56
|
(`zapi/smartbt/*`).
|
|
57
57
|
|
|
58
58
|
## Installation
|
|
59
59
|
|
|
60
|
-
### a)
|
|
60
|
+
### a) Local/manual (before store publication)
|
|
61
61
|
|
|
62
62
|
```bash
|
|
63
63
|
cd /opt/iobroker/node_modules
|
|
64
64
|
mkdir iobroker.zeptrion
|
|
65
|
-
|
|
65
|
+
## copy the files of this package here
|
|
66
66
|
cd iobroker.zeptrion
|
|
67
67
|
npm install --production
|
|
68
68
|
|
|
@@ -71,193 +71,215 @@ iobroker upload zeptrion
|
|
|
71
71
|
iobroker add zeptrion
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
### b)
|
|
75
|
-
|
|
76
|
-
Admin
|
|
77
|
-
|
|
78
|
-
##
|
|
79
|
-
|
|
80
|
-
- **HTTP Timeout**:
|
|
81
|
-
- **Discovery
|
|
82
|
-
|
|
83
|
-
`zapp-YYWWNNNN`).
|
|
84
|
-
|
|
85
|
-
(3340-4-x = 4
|
|
86
|
-
|
|
87
|
-
- **
|
|
88
|
-
- `
|
|
89
|
-
`
|
|
90
|
-
|
|
91
|
-
`posEstimate
|
|
92
|
-
`
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
Feller
|
|
97
|
-
|
|
98
|
-
chnotify-
|
|
99
|
-
|
|
100
|
-
##
|
|
74
|
+
### b) Via the ioBroker Adapter Store (once published)
|
|
75
|
+
|
|
76
|
+
Admin UI -> Adapters -> search for "zeptrion" -> Install.
|
|
77
|
+
|
|
78
|
+
## Configuration
|
|
79
|
+
|
|
80
|
+
- **HTTP Timeout**: timeout per request to a device (default 4000 ms).
|
|
81
|
+
- **Discovery button**: scans the local network via mDNS (service type `_zapp._tcp`,
|
|
82
|
+
fallback `_http._tcp` for firmware < 01.08.xx based on the hostname pattern
|
|
83
|
+
`zapp-YYWWNNNN`). Newly found devices are added to the table in a **disabled** state
|
|
84
|
+
- review the row afterwards, assign an ID/name, verify the channel count
|
|
85
|
+
(3340-4-x = 4 channels, 3340-2-x = 2 channels) and enable it. mDNS only works
|
|
86
|
+
within the same network segment/VLAN.
|
|
87
|
+
- **Device table** (can also be filled in entirely manually, without discovery):
|
|
88
|
+
- `Active`, `ID` (a-z 0-9 _ -), `Name`, `IP address/hostname`,
|
|
89
|
+
`Channels` (1-4), `Kind` (Shutter/Light/unknown - controls the ioBroker object roles,
|
|
90
|
+
see below), `Shutter motor travel time` (seconds, 0=disabled - enables
|
|
91
|
+
`posEstimate`, see below, acts as the default for all channels),
|
|
92
|
+
`Travel time/channel` (optional, comma-separated, e.g. `22,28` - overrides the
|
|
93
|
+
default travel time individually per channel; useful for 2K devices where the two
|
|
94
|
+
channels have different motor travel times; empty entries fall back to
|
|
95
|
+
the default travel time), `Smartfront` (checkbox, only enable if a
|
|
96
|
+
Feller Smartfront switch is connected), `Poll (s)` (default 30, for RSSI +
|
|
97
|
+
periodic chscan resync; the actual channel updates run independently
|
|
98
|
+
via the chnotify long-poll).
|
|
99
|
+
|
|
100
|
+
## Object tree per device (`zeptrion.0.<id>`)
|
|
101
101
|
|
|
102
102
|
```
|
|
103
103
|
<id>.info.connection / lastError / hw / sw / boot / sn / sys / type / oen / rssi / refresh
|
|
104
104
|
<id>.network.ssid / ip / mac / mode / enc / mask / gw / bssid (read-only)
|
|
105
|
-
<id>.system.reboot / unlock / factoryDefault / networkDefault (
|
|
105
|
+
<id>.system.reboot / unlock / factoryDefault / networkDefault (buttons; factoryDefault requires unlock within 30s)
|
|
106
106
|
<id>.location.name (read/write)
|
|
107
107
|
<id>.ntp.url / per (read/write)
|
|
108
|
-
<id>.date.rfc1123 / tz / dst / syncNow (read/write +
|
|
108
|
+
<id>.date.rfc1123 / tz / dst / syncNow (read/write + button)
|
|
109
109
|
|
|
110
|
-
<id>.channels.chN.val
|
|
111
|
-
<id>.channels.chN.posEstimate
|
|
112
|
-
0=
|
|
113
|
-
<id>.channels.chN.name / group / icon / type / cat
|
|
114
|
-
<id>.channels.chN.command
|
|
110
|
+
<id>.channels.chN.val channel state 0-100 / -1 (raw hardware value)
|
|
111
|
+
<id>.channels.chN.posEstimate only for kind=Shutter: software position estimate
|
|
112
|
+
0=closed/100=open, also manually writable (calibration)
|
|
113
|
+
<id>.channels.chN.name / group / icon / type / cat channel description (read/write)
|
|
114
|
+
<id>.channels.chN.command free-text command (string)
|
|
115
115
|
<id>.channels.chN.stop / on / off / toggle / open / close /
|
|
116
|
-
move_open / move_close / dim_up / dim_down (
|
|
117
|
-
<id>.channels.chN.recall_s1..4 / store_s1..4 / delete_s1..4 (
|
|
116
|
+
move_open / move_close / dim_up / dim_down (buttons)
|
|
117
|
+
<id>.channels.chN.recall_s1..4 / store_s1..4 / delete_s1..4 (buttons)
|
|
118
118
|
|
|
119
|
-
<id>.smartfront.temp / lux / hum
|
|
120
|
-
<id>.smartfront.ledState
|
|
121
|
-
<id>.smartfront.ledSet LED(s)
|
|
119
|
+
<id>.smartfront.temp / lux / hum only if "Smartfront" is enabled (read)
|
|
120
|
+
<id>.smartfront.ledState current LED status as JSON (read)
|
|
121
|
+
<id>.smartfront.ledSet set LED(s), JSON array (write)
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
Global:
|
|
125
125
|
|
|
126
126
|
```
|
|
127
|
-
info.connection
|
|
128
|
-
control.closeAllShutters
|
|
129
|
-
control.openAllShutters
|
|
130
|
-
control.stopAllShutters
|
|
127
|
+
info.connection at least one device reachable
|
|
128
|
+
control.closeAllShutters button: ALL configured channels -> "close"
|
|
129
|
+
control.openAllShutters button: ALL configured channels -> "open"
|
|
130
|
+
control.stopAllShutters button: ALL configured channels -> "stop"
|
|
131
131
|
```
|
|
132
132
|
|
|
133
|
-
##
|
|
133
|
+
## Object roles and "kind"
|
|
134
134
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
ioBroker.iot/Alexa
|
|
138
|
-
|
|
135
|
+
The zrap API itself does not distinguish between a light and a shutter channel - that
|
|
136
|
+
is purely a matter of wiring/the actuator. So that visualizations (VIS, possibly a
|
|
137
|
+
future ioBroker.iot/Alexa integration) can still classify channels meaningfully, the
|
|
138
|
+
"kind" can be set per device:
|
|
139
139
|
|
|
140
|
-
|
|
|
140
|
+
| Kind | `<ch>.val` role | `stop`/`open`/`close` role |
|
|
141
141
|
|---|---|---|
|
|
142
|
-
|
|
|
143
|
-
|
|
|
144
|
-
|
|
|
142
|
+
| Shutter/blind | `level.blind` | `button.stop` / `button.open.blind` / `button.close.blind` |
|
|
143
|
+
| Light | `level.dimmer` | generic `button` |
|
|
144
|
+
| unknown (default) | `value` | generic `button` |
|
|
145
145
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
146
|
+
Important: `level.blind` does **not** fake genuine position feedback - per the Feller
|
|
147
|
+
documentation, `chscan`/`chnotify` for a shutter channel almost always returns `-1`
|
|
148
|
+
(unknown), since the hardware itself does not report a blind position. The role only
|
|
149
|
+
improves recognition by VIS widgets; the numeric value generally remains uninformative.
|
|
150
150
|
|
|
151
|
-
##
|
|
151
|
+
## Hail alert usage
|
|
152
152
|
|
|
153
153
|
```javascript
|
|
154
|
-
// JavaScript
|
|
155
|
-
on({id: '
|
|
154
|
+
// JavaScript adapter example
|
|
155
|
+
on({id: 'weather.0.warnings.hail', val: true}, function () {
|
|
156
156
|
setState('zeptrion.0.control.closeAllShutters', true);
|
|
157
157
|
});
|
|
158
158
|
```
|
|
159
159
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
##
|
|
164
|
-
|
|
165
|
-
- **Smartbutton
|
|
166
|
-
|
|
167
|
-
(
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- **
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
- **Scheduler (`zrap/scheduler`)**
|
|
174
|
-
(`zapi/smartfront/*`, `zapi/smartbt/*`)
|
|
175
|
-
|
|
176
|
-
in `main.js`
|
|
177
|
-
- `chctrl`
|
|
178
|
-
(`maxRedirects: 0`)
|
|
179
|
-
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
##
|
|
160
|
+
Failures on individual devices (offline, etc.) do not interrupt the remaining channels -
|
|
161
|
+
each failed channel is logged individually and recorded in `<id>.info.lastError`.
|
|
162
|
+
|
|
163
|
+
## Known limitations / deliberate decisions
|
|
164
|
+
|
|
165
|
+
- **Smartbutton webhook programming** (`zapi/smartbt/prgm`/`prgn`/`prgs`) is not
|
|
166
|
+
implemented: this would have the switch call a URL on ioBroker directly on a button
|
|
167
|
+
press (true push, no polling at all). That would require an incoming HTTP server in
|
|
168
|
+
the adapter, which does not currently exist - a larger architectural extension, not a
|
|
169
|
+
small addition. Documented as a possible future enhancement.
|
|
170
|
+
- **Write access to `zrap/net`** is not implemented - changing an actuator's WLAN
|
|
171
|
+
credentials via script is risky (loss of connection, reboot required). Can be added
|
|
172
|
+
if needed.
|
|
173
|
+
- **Scheduler (`zrap/scheduler`)** and the **zeptrionAir Smartfront services**
|
|
174
|
+
(`zapi/smartfront/*`, `zapi/smartbt/*`) are not implemented, as they are not relevant
|
|
175
|
+
to the shutter/hail use case. The existing `zrapGet`/`zrapPost` structure
|
|
176
|
+
in `main.js` can easily be extended.
|
|
177
|
+
- Per the documentation, `chctrl` returns HTTP 302 without a body - redirects are
|
|
178
|
+
deliberately not followed (`maxRedirects: 0`) to avoid unnecessary extra requests.
|
|
179
|
+
- On repeated failures for a device, the poll interval is extended up to a maximum of
|
|
180
|
+
5x (simple backoff).
|
|
181
|
+
|
|
182
|
+
## Development / Tests
|
|
183
183
|
|
|
184
184
|
```bash
|
|
185
185
|
npm install
|
|
186
186
|
npm run lint
|
|
187
|
-
npm test #
|
|
188
|
-
npm run test:integration #
|
|
187
|
+
npm test # package consistency + unit tests
|
|
188
|
+
npm run test:integration # starts a real js-controller (takes longer)
|
|
189
189
|
```
|
|
190
|
+
|
|
190
191
|
## Changelog
|
|
191
192
|
|
|
193
|
+
### 0.8.5 (2026-07-16)
|
|
194
|
+
- Enabled automated npm releases via GitHub Actions using npm Trusted Publishing (OIDC) - no more manual publishing, and this and all future tagged releases are automatically signed with npm provenance. No functional/API changes.
|
|
195
|
+
|
|
196
|
+
### 0.8.4 (2026-07-16)
|
|
197
|
+
- Cleanup release addressing the ioBroker adapter store checker findings, no functional/behavioral changes
|
|
198
|
+
- Updated fast-xml-parser 4.5.7 -> 5.9.3, eslint, mocha, chai and the testing-action-check GitHub Action (verified identical XML parsing output for the zrap API response shapes used by this adapter)
|
|
199
|
+
- Removed devDependencies already bundled by @iobroker/testing
|
|
200
|
+
- Fixed jsonConfig.json i18n declaration (was "true" without an admin/i18n directory) and added missing translations for the work area "kind" dropdown options
|
|
201
|
+
- Added package-lock.json and aligned dependabot.yml/auto-merge workflow with the current ioBroker-Bot templates
|
|
202
|
+
|
|
203
|
+
### 0.8.3 (2026-07-14)
|
|
204
|
+
- CI workflow activated (lint + tests on every push/PR via GitHub Actions), removed redundant duplicate icon file at repo root (only admin/zeptrion.png is used), cleaned up outdated publish instructions in README
|
|
205
|
+
|
|
206
|
+
### 0.8.2
|
|
207
|
+
- Per-channel motor travel time override (new "Travel/ch (s)" column and CSV column): 2K/4K devices where individual channels have different shutter travel times can now be configured correctly - previously only one travel time applied to all channels of a device
|
|
208
|
+
|
|
209
|
+
### 0.8.1
|
|
210
|
+
- Channel commands (open/close/stop/dim/...) are now logged at info level on send (single and multicast), including failures on warn level - previously only system commands were logged
|
|
211
|
+
|
|
212
|
+
### 0.8.0
|
|
213
|
+
- Fixed orphaned states remaining after a device is removed/replaced (objects are now cleaned up on start), official Feller zeptrion logo as icon (used with permission)
|
|
214
|
+
|
|
192
215
|
### 0.7.0 (2026-07-10)
|
|
193
|
-
-
|
|
194
|
-
-
|
|
195
|
-
- CSV
|
|
196
|
-
- FIX:
|
|
197
|
-
- FIX:
|
|
216
|
+
- Scaling for 20+ devices: parallel setup, poll jitter, duplicate detection
|
|
217
|
+
- Strict startup validation for every configured device row
|
|
218
|
+
- CSV bulk import (dedicated config tab) with row validation and auto-ID
|
|
219
|
+
- FIX: position estimate correctly handled after a stop during an end-position run
|
|
220
|
+
- FIX: adapter timer cleanup (this.clearTimeout), leading zeros in chdes codes are preserved
|
|
198
221
|
|
|
199
222
|
### 0.6.0 (2026-07-10)
|
|
200
|
-
- Auto-ID
|
|
201
|
-
-
|
|
223
|
+
- Auto-ID from host, device test button (reachability + zeptrion verification + channel count check)
|
|
224
|
+
- Channel object names taken from the device (chdes), new icon, device icons
|
|
202
225
|
|
|
203
226
|
### 0.5.1 (2026-07-10)
|
|
204
|
-
-
|
|
227
|
+
- CRITICAL FIX: the XML parser skipped the payload because of the XML declaration key - all GET values remained null in 0.5.0
|
|
205
228
|
|
|
206
229
|
### 0.5.0 (2026-07-07)
|
|
207
|
-
- setPosition:
|
|
208
|
-
- tiltOpen/tiltClose:
|
|
209
|
-
- calibrate:
|
|
210
|
-
|
|
211
|
-
### 0.4.0 (2026-07-07) - Security
|
|
212
|
-
- **
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
- **
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
- **
|
|
219
|
-
NTP
|
|
220
|
-
|
|
221
|
-
- **Adapter-
|
|
222
|
-
|
|
223
|
-
- **
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
- **chnotify
|
|
227
|
-
- **
|
|
228
|
-
(ID
|
|
229
|
-
- ESLint
|
|
230
|
-
|
|
230
|
+
- setPosition: time-based %-approach for shutters (chunked due to the 32s API limit, reference run when position is unknown)
|
|
231
|
+
- tiltOpen/tiltClose: slat tilt pulses (configurable pulse duration)
|
|
232
|
+
- calibrate: set the position estimate without moving
|
|
233
|
+
|
|
234
|
+
### 0.4.0 (2026-07-07) - Security & quality hardening
|
|
235
|
+
- **Locked factory reset**: `system.factoryDefault` now only works within
|
|
236
|
+
30s of setting `system.unlock` - a single accidental setState from a
|
|
237
|
+
script/VIS can no longer wipe the device.
|
|
238
|
+
- **Crash-safe onStateChange**: the entire handler (including the bulk commands) now
|
|
239
|
+
runs inside centralized error handling - unhandled promise rejections are
|
|
240
|
+
no longer possible.
|
|
241
|
+
- **Input validation**: channel description (32/32/24/4/4 bytes UTF-8), location (32),
|
|
242
|
+
NTP URL (32) and NTP interval (0-255) are validated before sending; a clear
|
|
243
|
+
error message instead of an HTTP 400 from the device. Umlauts are correctly counted as 2 bytes.
|
|
244
|
+
- **Adapter-managed timers** (`this.setTimeout`) used everywhere - automatic cleanup
|
|
245
|
+
on unload per the ioBroker guidelines.
|
|
246
|
+
- **Connection economy**: as long as the chnotify long-poll is running healthily, the
|
|
247
|
+
redundant chscan resync now only runs on every 5th poll (goes easier on the
|
|
248
|
+
weak embedded web servers of the flush-mounted actuators).
|
|
249
|
+
- **chnotify can be disabled** (Expert tab) for environments with connection issues.
|
|
250
|
+
- **New admin UI**: tabs (Devices/Expert), fully EN+DE, input validators
|
|
251
|
+
(ID pattern, host pattern), tooltips on every column, security notice.
|
|
252
|
+
- Migrated ESLint to flat config (v9), lint runs cleanly; smoke tests for
|
|
253
|
+
command validation, byte limits, position math and multicast body.
|
|
231
254
|
|
|
232
255
|
### 0.3.0 (2026-07-07)
|
|
233
|
-
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
-
|
|
238
|
-
|
|
239
|
-
-
|
|
240
|
-
|
|
241
|
-
-
|
|
242
|
-
|
|
256
|
+
- Channel commands for the same device are automatically bundled within a 50ms window
|
|
257
|
+
into a single multicast POST to `/zrap/chctrl` instead of being sent sequentially
|
|
258
|
+
one by one - `control.closeAllShutters` (hail alert) in particular
|
|
259
|
+
benefits massively from this (one request per device instead of one per channel).
|
|
260
|
+
- Optional time-based shutter position estimate (`posEstimate`) based on a configurable
|
|
261
|
+
motor travel time, since the hardware itself does not report a position.
|
|
262
|
+
- Optional Smartfront support (`zapi/smartfront/*`): read temperature/brightness/
|
|
263
|
+
humidity, set LED background color.
|
|
264
|
+
- Role fix: `level.blind` is now applied to the position estimate instead of the
|
|
265
|
+
raw (usually -1) hardware value.
|
|
243
266
|
|
|
244
267
|
### 0.2.0 (2026-07-07)
|
|
245
|
-
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
-
|
|
249
|
-
chscan
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
- Strukturierte `native`-Metadaten (Host, Kanalnummer, Art) an Geräte-/Kanal-Objekten.
|
|
268
|
+
- Channel states are now primarily updated near real-time via `zrap/chnotify`
|
|
269
|
+
(long-poll) instead of only via interval polling; `chscan` polling remains as a
|
|
270
|
+
periodic resync/fallback.
|
|
271
|
+
- An additional safety net (busy window, 5s) prevents a concurrent
|
|
272
|
+
chscan resync from overwriting a just-sent movement command with a stale value.
|
|
273
|
+
- mDNS discovery handler hardened against exceptions caused by malformed/unrelated
|
|
274
|
+
network packets (try/catch per service event instead of only around the subscription).
|
|
275
|
+
- New device field "kind" (Shutter/Light/unknown) controls the default object roles
|
|
276
|
+
(`level.blind`, `button.stop`, `button.open.blind`, `button.close.blind` resp.
|
|
277
|
+
`level.dimmer`) for better VIS/smart-home integration.
|
|
278
|
+
- Structured `native` metadata (host, channel number, kind) on device/channel objects.
|
|
257
279
|
|
|
258
280
|
### 0.1.0 (2026-07-07)
|
|
259
|
-
-
|
|
260
|
-
|
|
281
|
+
- First version: channel control, channel state/description, device/network info,
|
|
282
|
+
system commands, location/NTP/date, bulk commands for hail alerts, mDNS discovery.
|
|
261
283
|
|
|
262
284
|
## License
|
|
263
285
|
|