iobroker.zeptrion 0.8.2 → 0.8.4
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 +204 -203
- package/admin/jsonConfig.json +203 -42
- package/io-package.json +25 -68
- package/package.json +8 -11
- package/zeptrion.png +0 -0
package/README.md
CHANGED
|
@@ -7,63 +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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
- **
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
- **
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
(WLAN-Zugangsdaten ändern), `zrap/scheduler`, Smartbutton-Webhook-Programmierung
|
|
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
|
|
57
56
|
(`zapi/smartbt/*`).
|
|
58
57
|
|
|
59
58
|
## Installation
|
|
60
59
|
|
|
61
|
-
### a)
|
|
60
|
+
### a) Local/manual (before store publication)
|
|
62
61
|
|
|
63
62
|
```bash
|
|
64
63
|
cd /opt/iobroker/node_modules
|
|
65
64
|
mkdir iobroker.zeptrion
|
|
66
|
-
|
|
65
|
+
## copy the files of this package here
|
|
67
66
|
cd iobroker.zeptrion
|
|
68
67
|
npm install --production
|
|
69
68
|
|
|
@@ -72,210 +71,212 @@ iobroker upload zeptrion
|
|
|
72
71
|
iobroker add zeptrion
|
|
73
72
|
```
|
|
74
73
|
|
|
75
|
-
### b)
|
|
76
|
-
|
|
77
|
-
Admin
|
|
78
|
-
|
|
79
|
-
##
|
|
80
|
-
|
|
81
|
-
- **HTTP Timeout**:
|
|
82
|
-
- **Discovery
|
|
83
|
-
|
|
84
|
-
`zapp-YYWWNNNN`).
|
|
85
|
-
|
|
86
|
-
(3340-4-x = 4
|
|
87
|
-
|
|
88
|
-
- **
|
|
89
|
-
- `
|
|
90
|
-
`
|
|
91
|
-
|
|
92
|
-
`posEstimate
|
|
93
|
-
`
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
Feller
|
|
98
|
-
|
|
99
|
-
chnotify-
|
|
100
|
-
|
|
101
|
-
##
|
|
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>`)
|
|
102
101
|
|
|
103
102
|
```
|
|
104
103
|
<id>.info.connection / lastError / hw / sw / boot / sn / sys / type / oen / rssi / refresh
|
|
105
104
|
<id>.network.ssid / ip / mac / mode / enc / mask / gw / bssid (read-only)
|
|
106
|
-
<id>.system.reboot / unlock / factoryDefault / networkDefault (
|
|
105
|
+
<id>.system.reboot / unlock / factoryDefault / networkDefault (buttons; factoryDefault requires unlock within 30s)
|
|
107
106
|
<id>.location.name (read/write)
|
|
108
107
|
<id>.ntp.url / per (read/write)
|
|
109
|
-
<id>.date.rfc1123 / tz / dst / syncNow (read/write +
|
|
108
|
+
<id>.date.rfc1123 / tz / dst / syncNow (read/write + button)
|
|
110
109
|
|
|
111
|
-
<id>.channels.chN.val
|
|
112
|
-
<id>.channels.chN.posEstimate
|
|
113
|
-
0=
|
|
114
|
-
<id>.channels.chN.name / group / icon / type / cat
|
|
115
|
-
<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)
|
|
116
115
|
<id>.channels.chN.stop / on / off / toggle / open / close /
|
|
117
|
-
move_open / move_close / dim_up / dim_down (
|
|
118
|
-
<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)
|
|
119
118
|
|
|
120
|
-
<id>.smartfront.temp / lux / hum
|
|
121
|
-
<id>.smartfront.ledState
|
|
122
|
-
<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)
|
|
123
122
|
```
|
|
124
123
|
|
|
125
124
|
Global:
|
|
126
125
|
|
|
127
126
|
```
|
|
128
|
-
info.connection
|
|
129
|
-
control.closeAllShutters
|
|
130
|
-
control.openAllShutters
|
|
131
|
-
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"
|
|
132
131
|
```
|
|
133
132
|
|
|
134
|
-
##
|
|
133
|
+
## Object roles and "kind"
|
|
135
134
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
ioBroker.iot/Alexa
|
|
139
|
-
|
|
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:
|
|
140
139
|
|
|
141
|
-
|
|
|
140
|
+
| Kind | `<ch>.val` role | `stop`/`open`/`close` role |
|
|
142
141
|
|---|---|---|
|
|
143
|
-
|
|
|
144
|
-
|
|
|
145
|
-
|
|
|
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` |
|
|
146
145
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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.
|
|
151
150
|
|
|
152
|
-
##
|
|
151
|
+
## Hail alert usage
|
|
153
152
|
|
|
154
153
|
```javascript
|
|
155
|
-
// JavaScript
|
|
156
|
-
on({id: '
|
|
154
|
+
// JavaScript adapter example
|
|
155
|
+
on({id: 'weather.0.warnings.hail', val: true}, function () {
|
|
157
156
|
setState('zeptrion.0.control.closeAllShutters', true);
|
|
158
157
|
});
|
|
159
158
|
```
|
|
160
159
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
##
|
|
165
|
-
|
|
166
|
-
- **Smartbutton
|
|
167
|
-
|
|
168
|
-
(
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
- **
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
- **Scheduler (`zrap/scheduler`)**
|
|
175
|
-
(`zapi/smartfront/*`, `zapi/smartbt/*`)
|
|
176
|
-
|
|
177
|
-
in `main.js`
|
|
178
|
-
- `chctrl`
|
|
179
|
-
(`maxRedirects: 0`)
|
|
180
|
-
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
##
|
|
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
|
|
184
183
|
|
|
185
184
|
```bash
|
|
186
185
|
npm install
|
|
187
186
|
npm run lint
|
|
188
|
-
npm test #
|
|
189
|
-
npm run test:integration #
|
|
187
|
+
npm test # package consistency + unit tests
|
|
188
|
+
npm run test:integration # starts a real js-controller (takes longer)
|
|
190
189
|
```
|
|
191
190
|
|
|
192
|
-
##
|
|
191
|
+
## Changelog
|
|
193
192
|
|
|
194
|
-
|
|
193
|
+
### 0.8.4 (2026-07-16)
|
|
194
|
+
- Cleanup release addressing the ioBroker adapter store checker findings, no functional/behavioral changes
|
|
195
|
+
- 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)
|
|
196
|
+
- Removed devDependencies already bundled by @iobroker/testing
|
|
197
|
+
- Fixed jsonConfig.json i18n declaration (was "true" without an admin/i18n directory) and added missing translations for the work area "kind" dropdown options
|
|
198
|
+
- Added package-lock.json and aligned dependabot.yml/auto-merge workflow with the current ioBroker-Bot templates
|
|
195
199
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
3. `npx @iobroker/adapter-checker` (bzw. https://adapter-check.iobroker.in/) gegen das
|
|
199
|
-
Repository laufen lassen und alle Fehler/Warnungen bereinigen.
|
|
200
|
-
4. Ersten Release-Tag setzen (`v0.1.0`), CI-Workflow veröffentlicht bei Bedarf automatisch
|
|
201
|
-
auf npm (Secret `NPM_TOKEN` in den Repo-Settings hinterlegen) oder manuell `npm publish`.
|
|
202
|
-
5. Pull Request gegen `ioBroker/ioBroker.repositories` (`sources-dist.json`, Eintrag unter
|
|
203
|
-
`latest`) erstellen.
|
|
204
|
-
6. Nach Review/Merge erscheint der Adapter im Adapter-Store; nach ausreichender Stabilität
|
|
205
|
-
und positiven Bewertungen kann später ein Antrag auf Aufnahme in den `stable`-Zweig
|
|
206
|
-
gestellt werden.
|
|
200
|
+
### 0.8.3 (2026-07-14)
|
|
201
|
+
- 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
|
|
207
202
|
|
|
208
|
-
|
|
203
|
+
### 0.8.2
|
|
204
|
+
- 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
|
|
205
|
+
|
|
206
|
+
### 0.8.1
|
|
207
|
+
- 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
|
|
208
|
+
|
|
209
|
+
### 0.8.0
|
|
210
|
+
- 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)
|
|
209
211
|
|
|
210
212
|
### 0.7.0 (2026-07-10)
|
|
211
|
-
-
|
|
212
|
-
-
|
|
213
|
-
- CSV
|
|
214
|
-
- FIX:
|
|
215
|
-
- FIX:
|
|
213
|
+
- Scaling for 20+ devices: parallel setup, poll jitter, duplicate detection
|
|
214
|
+
- Strict startup validation for every configured device row
|
|
215
|
+
- CSV bulk import (dedicated config tab) with row validation and auto-ID
|
|
216
|
+
- FIX: position estimate correctly handled after a stop during an end-position run
|
|
217
|
+
- FIX: adapter timer cleanup (this.clearTimeout), leading zeros in chdes codes are preserved
|
|
216
218
|
|
|
217
219
|
### 0.6.0 (2026-07-10)
|
|
218
|
-
- Auto-ID
|
|
219
|
-
-
|
|
220
|
+
- Auto-ID from host, device test button (reachability + zeptrion verification + channel count check)
|
|
221
|
+
- Channel object names taken from the device (chdes), new icon, device icons
|
|
220
222
|
|
|
221
223
|
### 0.5.1 (2026-07-10)
|
|
222
|
-
-
|
|
224
|
+
- CRITICAL FIX: the XML parser skipped the payload because of the XML declaration key - all GET values remained null in 0.5.0
|
|
223
225
|
|
|
224
226
|
### 0.5.0 (2026-07-07)
|
|
225
|
-
- setPosition:
|
|
226
|
-
- tiltOpen/tiltClose:
|
|
227
|
-
- calibrate:
|
|
228
|
-
|
|
229
|
-
### 0.4.0 (2026-07-07) - Security
|
|
230
|
-
- **
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
- **
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
- **
|
|
237
|
-
NTP
|
|
238
|
-
|
|
239
|
-
- **Adapter-
|
|
240
|
-
|
|
241
|
-
- **
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
- **chnotify
|
|
245
|
-
- **
|
|
246
|
-
(ID
|
|
247
|
-
- ESLint
|
|
248
|
-
|
|
227
|
+
- setPosition: time-based %-approach for shutters (chunked due to the 32s API limit, reference run when position is unknown)
|
|
228
|
+
- tiltOpen/tiltClose: slat tilt pulses (configurable pulse duration)
|
|
229
|
+
- calibrate: set the position estimate without moving
|
|
230
|
+
|
|
231
|
+
### 0.4.0 (2026-07-07) - Security & quality hardening
|
|
232
|
+
- **Locked factory reset**: `system.factoryDefault` now only works within
|
|
233
|
+
30s of setting `system.unlock` - a single accidental setState from a
|
|
234
|
+
script/VIS can no longer wipe the device.
|
|
235
|
+
- **Crash-safe onStateChange**: the entire handler (including the bulk commands) now
|
|
236
|
+
runs inside centralized error handling - unhandled promise rejections are
|
|
237
|
+
no longer possible.
|
|
238
|
+
- **Input validation**: channel description (32/32/24/4/4 bytes UTF-8), location (32),
|
|
239
|
+
NTP URL (32) and NTP interval (0-255) are validated before sending; a clear
|
|
240
|
+
error message instead of an HTTP 400 from the device. Umlauts are correctly counted as 2 bytes.
|
|
241
|
+
- **Adapter-managed timers** (`this.setTimeout`) used everywhere - automatic cleanup
|
|
242
|
+
on unload per the ioBroker guidelines.
|
|
243
|
+
- **Connection economy**: as long as the chnotify long-poll is running healthily, the
|
|
244
|
+
redundant chscan resync now only runs on every 5th poll (goes easier on the
|
|
245
|
+
weak embedded web servers of the flush-mounted actuators).
|
|
246
|
+
- **chnotify can be disabled** (Expert tab) for environments with connection issues.
|
|
247
|
+
- **New admin UI**: tabs (Devices/Expert), fully EN+DE, input validators
|
|
248
|
+
(ID pattern, host pattern), tooltips on every column, security notice.
|
|
249
|
+
- Migrated ESLint to flat config (v9), lint runs cleanly; smoke tests for
|
|
250
|
+
command validation, byte limits, position math and multicast body.
|
|
249
251
|
|
|
250
252
|
### 0.3.0 (2026-07-07)
|
|
251
|
-
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
-
|
|
256
|
-
|
|
257
|
-
-
|
|
258
|
-
|
|
259
|
-
-
|
|
260
|
-
|
|
253
|
+
- Channel commands for the same device are automatically bundled within a 50ms window
|
|
254
|
+
into a single multicast POST to `/zrap/chctrl` instead of being sent sequentially
|
|
255
|
+
one by one - `control.closeAllShutters` (hail alert) in particular
|
|
256
|
+
benefits massively from this (one request per device instead of one per channel).
|
|
257
|
+
- Optional time-based shutter position estimate (`posEstimate`) based on a configurable
|
|
258
|
+
motor travel time, since the hardware itself does not report a position.
|
|
259
|
+
- Optional Smartfront support (`zapi/smartfront/*`): read temperature/brightness/
|
|
260
|
+
humidity, set LED background color.
|
|
261
|
+
- Role fix: `level.blind` is now applied to the position estimate instead of the
|
|
262
|
+
raw (usually -1) hardware value.
|
|
261
263
|
|
|
262
264
|
### 0.2.0 (2026-07-07)
|
|
263
|
-
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
-
|
|
267
|
-
chscan
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
- Strukturierte `native`-Metadaten (Host, Kanalnummer, Art) an Geräte-/Kanal-Objekten.
|
|
265
|
+
- Channel states are now primarily updated near real-time via `zrap/chnotify`
|
|
266
|
+
(long-poll) instead of only via interval polling; `chscan` polling remains as a
|
|
267
|
+
periodic resync/fallback.
|
|
268
|
+
- An additional safety net (busy window, 5s) prevents a concurrent
|
|
269
|
+
chscan resync from overwriting a just-sent movement command with a stale value.
|
|
270
|
+
- mDNS discovery handler hardened against exceptions caused by malformed/unrelated
|
|
271
|
+
network packets (try/catch per service event instead of only around the subscription).
|
|
272
|
+
- New device field "kind" (Shutter/Light/unknown) controls the default object roles
|
|
273
|
+
(`level.blind`, `button.stop`, `button.open.blind`, `button.close.blind` resp.
|
|
274
|
+
`level.dimmer`) for better VIS/smart-home integration.
|
|
275
|
+
- Structured `native` metadata (host, channel number, kind) on device/channel objects.
|
|
275
276
|
|
|
276
277
|
### 0.1.0 (2026-07-07)
|
|
277
|
-
-
|
|
278
|
-
|
|
278
|
+
- First version: channel control, channel state/description, device/network info,
|
|
279
|
+
system commands, location/NTP/date, bulk commands for hail alerts, mDNS discovery.
|
|
279
280
|
|
|
280
281
|
## License
|
|
281
282
|
|
package/admin/jsonConfig.json
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
+
"i18n": false,
|
|
2
3
|
"type": "tabs",
|
|
3
4
|
"items": {
|
|
4
5
|
"tabDevices": {
|
|
5
6
|
"type": "panel",
|
|
6
|
-
"label": {
|
|
7
|
+
"label": {
|
|
8
|
+
"en": "Devices",
|
|
9
|
+
"de": "Geräte"
|
|
10
|
+
},
|
|
7
11
|
"items": {
|
|
8
12
|
"_infoHeader": {
|
|
9
13
|
"type": "staticText",
|
|
@@ -11,7 +15,11 @@
|
|
|
11
15
|
"en": "Feller zeptrion / zApp WLAN actuators (WLAN-Nebenstelle 4K, WLAN-Zwischenmodul 2K). Host = IP address or mDNS name (e.g. zapp-14250034.local).",
|
|
12
16
|
"de": "Feller zeptrion / zApp WLAN-Aktoren (WLAN-Nebenstelle 4K, WLAN-Zwischenmodul 2K). Host = IP-Adresse oder mDNS-Name (z.B. zapp-14250034.local)."
|
|
13
17
|
},
|
|
14
|
-
"sm": 12
|
|
18
|
+
"sm": 12,
|
|
19
|
+
"xs": 12,
|
|
20
|
+
"md": 12,
|
|
21
|
+
"lg": 12,
|
|
22
|
+
"xl": 12
|
|
15
23
|
},
|
|
16
24
|
"discoverBtn": {
|
|
17
25
|
"newLine": true,
|
|
@@ -24,7 +32,11 @@
|
|
|
24
32
|
"de": "🔍 Netzwerk nach zeptrion-Geräten durchsuchen (mDNS, ca. 4s)"
|
|
25
33
|
},
|
|
26
34
|
"showProcess": true,
|
|
27
|
-
"sm": 12,
|
|
35
|
+
"sm": 12,
|
|
36
|
+
"md": 6,
|
|
37
|
+
"xs": 12,
|
|
38
|
+
"lg": 6,
|
|
39
|
+
"xl": 6
|
|
28
40
|
},
|
|
29
41
|
"testBtn": {
|
|
30
42
|
"type": "sendTo",
|
|
@@ -36,7 +48,11 @@
|
|
|
36
48
|
"de": "🔎 Konfigurierte Geräte testen (erreichbar? wirklich zeptrion?)"
|
|
37
49
|
},
|
|
38
50
|
"showProcess": true,
|
|
39
|
-
"sm": 12,
|
|
51
|
+
"sm": 12,
|
|
52
|
+
"md": 6,
|
|
53
|
+
"xs": 12,
|
|
54
|
+
"lg": 6,
|
|
55
|
+
"xl": 6
|
|
40
56
|
},
|
|
41
57
|
"_discoverHint": {
|
|
42
58
|
"type": "staticText",
|
|
@@ -44,18 +60,28 @@
|
|
|
44
60
|
"en": "Found devices are added DISABLED to the table below. Close and reopen this dialog after scanning, then verify each row (name, channel count, kind) and enable it. mDNS only works within the same network segment / VLAN.",
|
|
45
61
|
"de": "Gefundene Geräte werden DEAKTIVIERT in die Tabelle übernommen. Dialog nach der Suche schliessen und neu öffnen, dann jede Zeile prüfen (Name, Kanalzahl, Art) und aktivieren. mDNS funktioniert nur im gleichen Netzsegment/VLAN."
|
|
46
62
|
},
|
|
47
|
-
"sm": 12
|
|
63
|
+
"sm": 12,
|
|
64
|
+
"xs": 12,
|
|
65
|
+
"md": 12,
|
|
66
|
+
"lg": 12,
|
|
67
|
+
"xl": 12
|
|
48
68
|
},
|
|
49
69
|
"devices": {
|
|
50
70
|
"newLine": true,
|
|
51
71
|
"type": "table",
|
|
52
|
-
"label": {
|
|
72
|
+
"label": {
|
|
73
|
+
"en": "Devices",
|
|
74
|
+
"de": "Geräte"
|
|
75
|
+
},
|
|
53
76
|
"sm": 12,
|
|
54
77
|
"items": [
|
|
55
78
|
{
|
|
56
79
|
"type": "checkbox",
|
|
57
80
|
"attr": "enabled",
|
|
58
|
-
"title": {
|
|
81
|
+
"title": {
|
|
82
|
+
"en": "Active",
|
|
83
|
+
"de": "Aktiv"
|
|
84
|
+
},
|
|
59
85
|
"default": true,
|
|
60
86
|
"width": "5%"
|
|
61
87
|
},
|
|
@@ -63,42 +89,110 @@
|
|
|
63
89
|
"type": "text",
|
|
64
90
|
"attr": "id",
|
|
65
91
|
"title": "ID",
|
|
66
|
-
"tooltip": {
|
|
92
|
+
"tooltip": {
|
|
93
|
+
"en": "Leave empty = auto-generated from host. Only a-z, 0-9, _ and -",
|
|
94
|
+
"de": "Leer lassen = wird automatisch aus dem Host erzeugt. Nur a-z, 0-9, _ und -"
|
|
95
|
+
},
|
|
67
96
|
"validator": "!data.id || /^[a-zA-Z0-9_-]+$/.test(data.id)",
|
|
68
|
-
"validatorErrorText":
|
|
97
|
+
"validatorErrorText": "Only a-z, 0-9, _ and - (or leave empty)",
|
|
69
98
|
"width": "10%"
|
|
70
99
|
},
|
|
71
100
|
{
|
|
72
101
|
"type": "text",
|
|
73
102
|
"attr": "name",
|
|
74
|
-
"title": {
|
|
103
|
+
"title": {
|
|
104
|
+
"en": "Label",
|
|
105
|
+
"de": "Bezeichnung"
|
|
106
|
+
},
|
|
75
107
|
"width": "14%"
|
|
76
108
|
},
|
|
77
109
|
{
|
|
78
110
|
"type": "text",
|
|
79
111
|
"attr": "host",
|
|
80
|
-
"title": {
|
|
112
|
+
"title": {
|
|
113
|
+
"en": "IP address / hostname",
|
|
114
|
+
"de": "IP-Adresse / Hostname"
|
|
115
|
+
},
|
|
81
116
|
"validator": "!data.host || /^[a-zA-Z0-9.\\-]+$/.test(data.host)",
|
|
82
|
-
"validatorErrorText":
|
|
117
|
+
"validatorErrorText": "Invalid host (no protocol, no spaces)",
|
|
83
118
|
"width": "16%"
|
|
84
119
|
},
|
|
85
120
|
{
|
|
86
121
|
"type": "number",
|
|
87
122
|
"attr": "channels",
|
|
88
|
-
"title": {
|
|
89
|
-
|
|
90
|
-
|
|
123
|
+
"title": {
|
|
124
|
+
"en": "Channels",
|
|
125
|
+
"de": "Kanäle"
|
|
126
|
+
},
|
|
127
|
+
"tooltip": {
|
|
128
|
+
"en": "3340-4-x = 4, 3340-2-x = 2",
|
|
129
|
+
"de": "3340-4-x = 4, 3340-2-x = 2"
|
|
130
|
+
},
|
|
131
|
+
"min": 1,
|
|
132
|
+
"max": 4,
|
|
133
|
+
"default": 1,
|
|
91
134
|
"width": "6%"
|
|
92
135
|
},
|
|
93
136
|
{
|
|
94
137
|
"type": "select",
|
|
95
138
|
"attr": "kind",
|
|
96
|
-
"title": {
|
|
97
|
-
|
|
139
|
+
"title": {
|
|
140
|
+
"en": "Kind",
|
|
141
|
+
"de": "Art"
|
|
142
|
+
},
|
|
143
|
+
"tooltip": {
|
|
144
|
+
"en": "Controls ioBroker object roles for VIS/smart home integrations",
|
|
145
|
+
"de": "Steuert ioBroker-Objektrollen für VIS/Smart-Home-Integrationen"
|
|
146
|
+
},
|
|
98
147
|
"options": [
|
|
99
|
-
{
|
|
100
|
-
|
|
101
|
-
|
|
148
|
+
{
|
|
149
|
+
"value": "unknown",
|
|
150
|
+
"label": {
|
|
151
|
+
"en": "unknown/mixed",
|
|
152
|
+
"de": "unbekannt/gemischt",
|
|
153
|
+
"ru": "неизвестно/смешанно",
|
|
154
|
+
"pt": "desconhecido/misto",
|
|
155
|
+
"nl": "onbekend/gemengd",
|
|
156
|
+
"fr": "inconnu/mixte",
|
|
157
|
+
"it": "sconosciuto/misto",
|
|
158
|
+
"es": "desconocido/mixto",
|
|
159
|
+
"pl": "nieznany/mieszany",
|
|
160
|
+
"uk": "невідомо/змішано",
|
|
161
|
+
"zh-cn": "未知/混合"
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"value": "blind",
|
|
166
|
+
"label": {
|
|
167
|
+
"en": "Blinds/shutters",
|
|
168
|
+
"de": "Storen/Rolladen",
|
|
169
|
+
"ru": "Жалюзи/ставни",
|
|
170
|
+
"pt": "Estores/persianas",
|
|
171
|
+
"nl": "Jaloezieën/rolluiken",
|
|
172
|
+
"fr": "Volets/stores",
|
|
173
|
+
"it": "Tapparelle/tende",
|
|
174
|
+
"es": "Persianas/toldos",
|
|
175
|
+
"pl": "Rolety/żaluzje",
|
|
176
|
+
"uk": "Жалюзі/ролети",
|
|
177
|
+
"zh-cn": "百叶窗/卷帘"
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"value": "light",
|
|
182
|
+
"label": {
|
|
183
|
+
"en": "Light",
|
|
184
|
+
"de": "Licht",
|
|
185
|
+
"ru": "Свет",
|
|
186
|
+
"pt": "Luz",
|
|
187
|
+
"nl": "Licht",
|
|
188
|
+
"fr": "Lumière",
|
|
189
|
+
"it": "Luce",
|
|
190
|
+
"es": "Luz",
|
|
191
|
+
"pl": "Światło",
|
|
192
|
+
"uk": "Світло",
|
|
193
|
+
"zh-cn": "灯光"
|
|
194
|
+
}
|
|
195
|
+
}
|
|
102
196
|
],
|
|
103
197
|
"default": "unknown",
|
|
104
198
|
"width": "12%"
|
|
@@ -106,35 +200,48 @@
|
|
|
106
200
|
{
|
|
107
201
|
"type": "number",
|
|
108
202
|
"attr": "travelTimeSec",
|
|
109
|
-
"title": {
|
|
203
|
+
"title": {
|
|
204
|
+
"en": "Motor travel (s)",
|
|
205
|
+
"de": "Motor-Laufzeit (s)"
|
|
206
|
+
},
|
|
110
207
|
"tooltip": {
|
|
111
208
|
"en": "Default travel time in seconds, used for all channels unless overridden per-channel below. 0 = position estimation and setPosition disabled. Only relevant for kind=Blinds.",
|
|
112
209
|
"de": "Standard-Laufzeit in Sekunden, gilt für alle Kanäle, sofern nicht rechts pro Kanal überschrieben. 0 = Positionsschätzung und setPosition deaktiviert. Nur relevant bei Art=Storen."
|
|
113
210
|
},
|
|
114
|
-
"min": 0,
|
|
211
|
+
"min": 0,
|
|
212
|
+
"max": 300,
|
|
213
|
+
"default": 0,
|
|
115
214
|
"width": "8%"
|
|
116
215
|
},
|
|
117
216
|
{
|
|
118
217
|
"type": "text",
|
|
119
218
|
"attr": "travelTimeSecCh",
|
|
120
|
-
"title": {
|
|
219
|
+
"title": {
|
|
220
|
+
"en": "Travel/ch (s)",
|
|
221
|
+
"de": "Laufzeit/Kanal (s)"
|
|
222
|
+
},
|
|
121
223
|
"tooltip": {
|
|
122
224
|
"en": "Optional: comma-separated per-channel override, one value per channel in order (e.g. '22,28' for a 2K device where channel 1 and 2 have different motor travel times). Empty entries fall back to 'Motor travel (s)'. Leave the whole field empty to use the same value for all channels.",
|
|
123
225
|
"de": "Optional: Kommagetrennte Laufzeit pro Kanal, ein Wert je Kanal in Reihenfolge (z.B. '22,28' für ein 2K-Gerät, bei dem Kanal 1 und 2 unterschiedliche Motor-Laufzeiten haben). Leere Einträge verwenden 'Motor-Laufzeit (s)'. Ganzes Feld leer lassen = gleicher Wert für alle Kanäle."
|
|
124
226
|
},
|
|
125
227
|
"validator": "!data.travelTimeSecCh || /^\\s*\\d*\\s*(,\\s*\\d*\\s*){0,3}$/.test(data.travelTimeSecCh)",
|
|
126
|
-
"validatorErrorText":
|
|
228
|
+
"validatorErrorText": "Comma-separated numbers only, max 4 values (e.g. '22,28')",
|
|
127
229
|
"width": "9%"
|
|
128
230
|
},
|
|
129
231
|
{
|
|
130
232
|
"type": "number",
|
|
131
233
|
"attr": "tiltTimeMs",
|
|
132
|
-
"title": {
|
|
234
|
+
"title": {
|
|
235
|
+
"en": "Tilt pulse (ms)",
|
|
236
|
+
"de": "Kipp-Impuls (ms)"
|
|
237
|
+
},
|
|
133
238
|
"tooltip": {
|
|
134
239
|
"en": "Short move pulse for tilting raffstore lamellas via tiltOpen/tiltClose (typically 300-800ms). 0 = disabled. Only relevant for kind=Blinds.",
|
|
135
240
|
"de": "Kurzer Fahr-Impuls zum Schrägstellen von Rafflamellen via tiltOpen/tiltClose (typisch 300-800ms). 0 = deaktiviert. Nur relevant bei Art=Storen."
|
|
136
241
|
},
|
|
137
|
-
"min": 0,
|
|
242
|
+
"min": 0,
|
|
243
|
+
"max": 5000,
|
|
244
|
+
"default": 0,
|
|
138
245
|
"width": "8%"
|
|
139
246
|
},
|
|
140
247
|
{
|
|
@@ -156,16 +263,25 @@
|
|
|
156
263
|
"en": "Interval for RSSI + periodic resync. Real-time channel updates come via long-poll independently.",
|
|
157
264
|
"de": "Intervall für RSSI + periodischen Resync. Echtzeit-Kanalupdates kommen unabhängig davon per Long-Poll."
|
|
158
265
|
},
|
|
159
|
-
"min": 5,
|
|
266
|
+
"min": 5,
|
|
267
|
+
"max": 3600,
|
|
268
|
+
"default": 30,
|
|
160
269
|
"width": "7%"
|
|
161
270
|
}
|
|
162
|
-
]
|
|
271
|
+
],
|
|
272
|
+
"xs": 12,
|
|
273
|
+
"md": 12,
|
|
274
|
+
"lg": 12,
|
|
275
|
+
"xl": 12
|
|
163
276
|
}
|
|
164
277
|
}
|
|
165
278
|
},
|
|
166
279
|
"tabImport": {
|
|
167
280
|
"type": "panel",
|
|
168
|
-
"label": {
|
|
281
|
+
"label": {
|
|
282
|
+
"en": "CSV import",
|
|
283
|
+
"de": "CSV-Import"
|
|
284
|
+
},
|
|
169
285
|
"items": {
|
|
170
286
|
"_csvHelp": {
|
|
171
287
|
"type": "staticText",
|
|
@@ -173,17 +289,28 @@
|
|
|
173
289
|
"en": "Bulk-add devices. One line per device, semicolon separated (recommended if using the last column, since it contains commas):\nhost;name;channels;kind;travel_s;tilt_ms;smartfront;poll_s;travel_s_per_channel\nOnly host is mandatory. kind: blind/light/unknown (also: storen, licht). smartfront: 1/0. travel_s_per_channel (optional): comma-separated per-channel override, e.g. '22,28' for a 2K device with different travel times, empty = use travel_s for all channels. Lines starting with # are ignored, a header line 'host;...' is skipped.\nExample:\n10.195.36.116;Storen Büro;2;blind;22;500;0;30;22,28\n10.195.36.117;Storen Wohnen;2;storen;25",
|
|
174
290
|
"de": "Geräte in Serie anlegen. Eine Zeile pro Gerät, Semikolon getrennt (empfohlen bei Nutzung der letzten Spalte, da diese Kommas enthält):\nhost;name;kanäle;art;laufzeit_s;kipp_ms;smartfront;poll_s;laufzeit_kanal_s\nNur host ist Pflicht. art: blind/light/unknown (auch: storen, licht). smartfront: 1/0. laufzeit_kanal_s (optional): kommagetrennte Laufzeit pro Kanal, z.B. '22,28' für ein 2K-Gerät mit unterschiedlichen Laufzeiten, leer = laufzeit_s für alle Kanäle. Zeilen mit # werden ignoriert, eine Kopfzeile 'host;...' wird übersprungen.\nBeispiel:\n10.195.36.116;Storen Büro;2;blind;22;500;0;30;22,28\n10.195.36.117;Storen Wohnen;2;storen;25"
|
|
175
291
|
},
|
|
176
|
-
"sm": 12
|
|
292
|
+
"sm": 12,
|
|
293
|
+
"xs": 12,
|
|
294
|
+
"md": 12,
|
|
295
|
+
"lg": 12,
|
|
296
|
+
"xl": 12
|
|
177
297
|
},
|
|
178
298
|
"csvText": {
|
|
179
299
|
"newLine": true,
|
|
180
300
|
"type": "text",
|
|
181
|
-
"label": {
|
|
301
|
+
"label": {
|
|
302
|
+
"en": "CSV lines",
|
|
303
|
+
"de": "CSV-Zeilen"
|
|
304
|
+
},
|
|
182
305
|
"minRows": 8,
|
|
183
306
|
"maxRows": 20,
|
|
184
307
|
"trim": false,
|
|
185
308
|
"noClearButton": true,
|
|
186
|
-
"sm": 12
|
|
309
|
+
"sm": 12,
|
|
310
|
+
"xs": 12,
|
|
311
|
+
"md": 12,
|
|
312
|
+
"lg": 12,
|
|
313
|
+
"xl": 12
|
|
187
314
|
},
|
|
188
315
|
"importBtn": {
|
|
189
316
|
"newLine": true,
|
|
@@ -191,9 +318,16 @@
|
|
|
191
318
|
"command": "importCsv",
|
|
192
319
|
"jsonData": "{\"csv\": ${JSON.stringify(data.csvText)}}",
|
|
193
320
|
"variant": "contained",
|
|
194
|
-
"label": {
|
|
321
|
+
"label": {
|
|
322
|
+
"en": "⬆️ Import (validates every line)",
|
|
323
|
+
"de": "⬆️ Importieren (validiert jede Zeile)"
|
|
324
|
+
},
|
|
195
325
|
"showProcess": true,
|
|
196
|
-
"sm": 12,
|
|
326
|
+
"sm": 12,
|
|
327
|
+
"md": 5,
|
|
328
|
+
"xs": 12,
|
|
329
|
+
"lg": 5,
|
|
330
|
+
"xl": 5
|
|
197
331
|
},
|
|
198
332
|
"_importHint": {
|
|
199
333
|
"type": "staticText",
|
|
@@ -201,34 +335,57 @@
|
|
|
201
335
|
"en": "Valid lines are added ENABLED, invalid lines are reported and skipped. Duplicate hosts are rejected. After import the adapter restarts - close and reopen this dialog to see the new table rows.",
|
|
202
336
|
"de": "Gültige Zeilen werden AKTIVIERT übernommen, ungültige gemeldet und übersprungen. Doppelte Hosts werden abgelehnt. Nach dem Import startet der Adapter neu - Dialog schliessen und neu öffnen, um die neuen Tabellenzeilen zu sehen."
|
|
203
337
|
},
|
|
204
|
-
"sm": 12
|
|
338
|
+
"sm": 12,
|
|
339
|
+
"xs": 12,
|
|
340
|
+
"md": 12,
|
|
341
|
+
"lg": 12,
|
|
342
|
+
"xl": 12
|
|
205
343
|
}
|
|
206
344
|
}
|
|
207
345
|
},
|
|
208
346
|
"tabExpert": {
|
|
209
347
|
"type": "panel",
|
|
210
|
-
"label": {
|
|
348
|
+
"label": {
|
|
349
|
+
"en": "Expert",
|
|
350
|
+
"de": "Experten"
|
|
351
|
+
},
|
|
211
352
|
"items": {
|
|
212
353
|
"requestTimeout": {
|
|
213
354
|
"type": "number",
|
|
214
|
-
"label": {
|
|
355
|
+
"label": {
|
|
356
|
+
"en": "HTTP timeout (ms)",
|
|
357
|
+
"de": "HTTP Timeout (ms)"
|
|
358
|
+
},
|
|
215
359
|
"help": {
|
|
216
360
|
"en": "Timeout per request to a device (does not apply to the chnotify long-poll, which uses a fixed 35s).",
|
|
217
361
|
"de": "Timeout pro Request an ein Gerät (gilt nicht für den chnotify-Long-Poll, der fix 35s verwendet)."
|
|
218
362
|
},
|
|
219
|
-
"min": 500,
|
|
220
|
-
"
|
|
363
|
+
"min": 500,
|
|
364
|
+
"max": 30000,
|
|
365
|
+
"default": 4000,
|
|
366
|
+
"sm": 12,
|
|
367
|
+
"md": 4,
|
|
368
|
+
"xs": 12,
|
|
369
|
+
"lg": 4,
|
|
370
|
+
"xl": 4
|
|
221
371
|
},
|
|
222
372
|
"useNotify": {
|
|
223
373
|
"newLine": true,
|
|
224
374
|
"type": "checkbox",
|
|
225
|
-
"label": {
|
|
375
|
+
"label": {
|
|
376
|
+
"en": "Use chnotify long-poll (near real-time updates)",
|
|
377
|
+
"de": "chnotify-Long-Poll verwenden (nahezu Echtzeit-Updates)"
|
|
378
|
+
},
|
|
226
379
|
"help": {
|
|
227
380
|
"en": "Keeps one HTTP connection per device permanently open (device answers within 30s at the latest). Disable only if devices show connection problems; channel states then update only at the poll interval.",
|
|
228
381
|
"de": "Hält dauerhaft eine HTTP-Verbindung pro Gerät offen (Gerät antwortet spätestens nach 30s). Nur deaktivieren, falls Geräte Verbindungsprobleme zeigen; Kanalzustände aktualisieren dann nur noch im Poll-Intervall."
|
|
229
382
|
},
|
|
230
383
|
"default": true,
|
|
231
|
-
"sm": 12,
|
|
384
|
+
"sm": 12,
|
|
385
|
+
"md": 8,
|
|
386
|
+
"xs": 12,
|
|
387
|
+
"lg": 8,
|
|
388
|
+
"xl": 8
|
|
232
389
|
},
|
|
233
390
|
"_safetyHint": {
|
|
234
391
|
"newLine": true,
|
|
@@ -237,7 +394,11 @@
|
|
|
237
394
|
"en": "⚠️ Safety: the factory reset button (system.factoryDefault) is interlocked - it only works within 30s after setting system.unlock. This prevents accidental wipes from scripts/VIS.",
|
|
238
395
|
"de": "⚠️ Sicherheit: der Werksreset-Button (system.factoryDefault) ist verriegelt - er funktioniert nur innerhalb von 30s nach Setzen von system.unlock. Das verhindert versehentliches Löschen durch Scripts/VIS."
|
|
239
396
|
},
|
|
240
|
-
"sm": 12
|
|
397
|
+
"sm": 12,
|
|
398
|
+
"xs": 12,
|
|
399
|
+
"md": 12,
|
|
400
|
+
"lg": 12,
|
|
401
|
+
"xl": 12
|
|
241
402
|
}
|
|
242
403
|
}
|
|
243
404
|
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zeptrion",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.4",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.8.4": {
|
|
7
|
+
"en": "Cleanup release addressing the ioBroker adapter store checker findings, no functional/behavioral changes. 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). Removed devDependencies already bundled by @iobroker/testing. Fixed jsonConfig.json i18n declaration (was 'true' without an admin/i18n directory) and added missing translations for the work area 'kind' dropdown options. Added package-lock.json and aligned dependabot.yml/auto-merge workflow with the current ioBroker-Bot templates.",
|
|
8
|
+
"de": "Aufräum-Release zur Behebung der ioBroker-Store-Checker-Befunde, keine funktionalen/verhaltensändernden Anpassungen. fast-xml-parser 4.5.7 -> 5.9.3, eslint, mocha, chai sowie die testing-action-check GitHub Action aktualisiert (identische XML-Parser-Ausgabe für die von diesem Adapter genutzten zrap-API-Antwortformate verifiziert). Bereits über @iobroker/testing enthaltene devDependencies entfernt. jsonConfig.json-i18n-Deklaration korrigiert (stand auf 'true' ohne admin/i18n-Verzeichnis) und fehlende Übersetzungen der Mähbereich-\"kind\"-Dropdown-Optionen ergänzt. package-lock.json hinzugefügt und dependabot.yml/Auto-Merge-Workflow an die aktuellen ioBroker-Bot-Vorlagen angeglichen."
|
|
9
|
+
},
|
|
10
|
+
"0.8.3": {
|
|
11
|
+
"en": "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",
|
|
12
|
+
"de": "CI-Workflow aktiviert (Lint + Tests bei jedem Push/PR via GitHub Actions), redundante doppelte Icon-Datei im Repo-Root entfernt (nur admin/zeptrion.png wird verwendet), veraltete Publish-Anleitung im README bereinigt",
|
|
13
|
+
"ru": "Активирован CI-воркфлоу (линтинг + тесты при каждом push/PR через GitHub Actions), удалён избыточный дублирующий файл значка в корне репозитория (используется только admin/zeptrion.png), очищены устаревшие инструкции по публикации в README",
|
|
14
|
+
"pt": "Fluxo de trabalho CI ativado (lint + testes em cada push/PR via GitHub Actions), removido o ficheiro de ícone duplicado redundante na raiz do repositório (apenas admin/zeptrion.png é usado), limpas as instruções de publicação desatualizadas no README",
|
|
15
|
+
"nl": "CI-workflow geactiveerd (lint + tests bij elke push/PR via GitHub Actions), overbodig dubbel icoonbestand in de repo-root verwijderd (alleen admin/zeptrion.png wordt gebruikt), verouderde publicatie-instructies in de README opgeschoond",
|
|
16
|
+
"fr": "Workflow CI activé (lint + tests à chaque push/PR via GitHub Actions), suppression du fichier icône dupliqué redondant à la racine du dépôt (seul admin/zeptrion.png est utilisé), nettoyage des instructions de publication obsolètes dans le README",
|
|
17
|
+
"it": "Workflow CI attivato (lint + test a ogni push/PR tramite GitHub Actions), rimosso il file icona duplicato ridondante nella root del repository (viene usato solo admin/zeptrion.png), ripulite le istruzioni di pubblicazione obsolete nel README",
|
|
18
|
+
"es": "Flujo de trabajo CI activado (lint + pruebas en cada push/PR mediante GitHub Actions), eliminado el archivo de icono duplicado redundante en la raíz del repositorio (solo se usa admin/zeptrion.png), limpiadas las instrucciones de publicación obsoletas en el README",
|
|
19
|
+
"pl": "Aktywowano workflow CI (lint + testy przy każdym push/PR przez GitHub Actions), usunięto zbędny zduplikowany plik ikony w katalogu głównym repozytorium (używany jest tylko admin/zeptrion.png), wyczyszczono nieaktualne instrukcje publikacji w README",
|
|
20
|
+
"uk": "Активовано CI-воркфлоу (лінтинг + тести під час кожного push/PR через GitHub Actions), видалено надлишковий дубльований файл значка в корені репозиторію (використовується лише admin/zeptrion.png), очищено застарілі інструкції з публікації в README",
|
|
21
|
+
"zh-cn": "启用CI工作流(每次push/PR通过GitHub Actions执行lint和测试),删除仓库根目录下冗余的重复图标文件(仅使用admin/zeptrion.png),清理README中过时的发布说明"
|
|
22
|
+
},
|
|
6
23
|
"0.8.2": {
|
|
7
24
|
"en": "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",
|
|
8
25
|
"de": "Motor-Laufzeit jetzt auch pro Kanal einstellbar (neue Spalte 'Laufzeit/Kanal (s)' und CSV-Spalte): 2K/4K-Geräte, bei denen einzelne Kanäle unterschiedliche Storen-Laufzeiten haben, lassen sich jetzt korrekt konfigurieren - bisher galt nur eine Laufzeit für alle Kanäle eines Geräts",
|
|
@@ -15,71 +32,6 @@
|
|
|
15
32
|
"pl": "Nadpisanie czasu pracy silnika dla poszczególnych kanałów (nowa kolumna 'Czas/kanał (s)' oraz kolumna CSV): urządzenia 2K/4K, w których poszczególne kanały mają różne czasy pracy rolety, można teraz poprawnie skonfigurować - wcześniej dla wszystkich kanałów urządzenia obowiązywał tylko jeden czas pracy",
|
|
16
33
|
"uk": "Індивідуальний час ходу мотора для кожного каналу (новий стовпець 'Час/канал (с)' та стовпець CSV): пристрої 2K/4K, у яких окремі канали мають різний час ходу штор, тепер можна налаштувати коректно - раніше для всіх каналів пристрою застосовувався лише один час ходу",
|
|
17
34
|
"zh-cn": "支持按通道单独设置电机运行时间(新增\"运行时间/通道(秒)\"列及CSV列):对于各通道卷帘运行时间不同的2K/4K设备,现在可以正确配置——此前一台设备的所有通道只能使用同一个运行时间"
|
|
18
|
-
},
|
|
19
|
-
"0.8.1": {
|
|
20
|
-
"en": "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",
|
|
21
|
-
"de": "Kanalbefehle (open/close/stop/dim/...) werden beim Senden jetzt auf Info-Level geloggt (einzeln und Multicast), Fehlschläge auf Warn-Level - bisher wurden nur Systembefehle geloggt",
|
|
22
|
-
"ru": "Команды канала (открыть/закрыть/стоп/диммирование/...) теперь логируются на уровне info при отправке (одиночные и multicast), включая ошибки на уровне warn - ранее логировались только системные команды",
|
|
23
|
-
"pt": "Os comandos de canal (abrir/fechar/parar/regular/...) agora são registados a nível info ao serem enviados (individual e multicast), incluindo falhas a nível warn - anteriormente apenas os comandos de sistema eram registados",
|
|
24
|
-
"nl": "Kanaalcommando's (openen/sluiten/stop/dimmen/...) worden nu bij verzending gelogd op info-niveau (enkel en multicast), inclusief mislukkingen op warn-niveau - voorheen werden alleen systeemcommando's gelogd",
|
|
25
|
-
"fr": "Les commandes de canal (ouvrir/fermer/stop/dim/...) sont désormais journalisées au niveau info lors de l'envoi (simple et multicast), y compris les échecs au niveau warn - auparavant, seules les commandes système étaient journalisées",
|
|
26
|
-
"it": "I comandi di canale (apri/chiudi/stop/dim/...) vengono ora registrati a livello info all'invio (singolo e multicast), inclusi i fallimenti a livello warn - in precedenza venivano registrati solo i comandi di sistema",
|
|
27
|
-
"es": "Los comandos de canal (abrir/cerrar/detener/atenuar/...) ahora se registran a nivel info al enviarse (individual y multicast), incluidos los fallos a nivel warn - anteriormente solo se registraban los comandos del sistema",
|
|
28
|
-
"pl": "Polecenia kanału (otwórz/zamknij/stop/ściemnij/...) są teraz rejestrowane na poziomie info podczas wysyłania (pojedynczo i multicast), łącznie z błędami na poziomie warn - wcześniej rejestrowane były tylko polecenia systemowe",
|
|
29
|
-
"uk": "Команди каналу (відкрити/закрити/стоп/диммування/...) тепер логуються на рівні info під час надсилання (поодинокі та multicast), включно з помилками на рівні warn - раніше логувалися лише системні команди",
|
|
30
|
-
"zh-cn": "通道指令(开/关/停止/调光等)在发送时(单通道及多播)现在会以info级别记录日志,失败情况以warn级别记录——此前只有系统指令会被记录"
|
|
31
|
-
},
|
|
32
|
-
"0.8.0": {
|
|
33
|
-
"en": "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)",
|
|
34
|
-
"de": "Behoben: verwaiste States blieben nach Entfernen/Ersetzen eines Geräts erhalten (Objekte werden jetzt beim Start aufgeräumt), offizielles Feller-zeptrion-Logo als Icon (mit Genehmigung)",
|
|
35
|
-
"ru": "Исправлено: осиротевшие состояния оставались после удаления/замены устройства (объекты теперь очищаются при запуске), официальный логотип Feller zeptrion в качестве значка (используется с разрешения)",
|
|
36
|
-
"pt": "Corrigido: os estados órfãos permaneciam após a remoção/substituição de um dispositivo (os objetos agora são limpos no arranque), logótipo oficial Feller zeptrion como ícone (usado com autorização)",
|
|
37
|
-
"nl": "Opgelost: verweesde states bleven bestaan na verwijderen/vervangen van een apparaat (objecten worden nu bij het opstarten opgeruimd), officieel Feller zeptrion-logo als icoon (gebruikt met toestemming)",
|
|
38
|
-
"fr": "Correction : les états orphelins subsistant après la suppression/le remplacement d'un appareil (les objets sont désormais nettoyés au démarrage), logo officiel Feller zeptrion comme icône (utilisé avec autorisation)",
|
|
39
|
-
"it": "Corretto: gli stati orfani rimanevano dopo la rimozione/sostituzione di un dispositivo (gli oggetti vengono ora ripuliti all'avvio), logo ufficiale Feller zeptrion come icona (usato con autorizzazione)",
|
|
40
|
-
"es": "Corregido: los estados huérfanos permanecían después de eliminar/sustituir un dispositivo (los objetos ahora se limpian al iniciar), logotipo oficial de Feller zeptrion como icono (usado con permiso)",
|
|
41
|
-
"pl": "Naprawiono: osierocone stany pozostawały po usunięciu/wymianie urządzenia (obiekty są teraz porządkowane przy starcie), oficjalne logo Feller zeptrion jako ikona (użyte za zgodą)",
|
|
42
|
-
"uk": "Виправлено: осиротілі стани залишалися після видалення/заміни пристрою (об'єкти тепер очищуються під час запуску), офіційний логотип Feller zeptrion як значок (використовується з дозволу)",
|
|
43
|
-
"zh-cn": "修复:设备被移除/更换后残留孤立状态的问题(现在会在启动时清理对象),使用Feller zeptrion官方标志作为图标(已获授权使用)"
|
|
44
|
-
},
|
|
45
|
-
"0.7.0": {
|
|
46
|
-
"en": "Scaling for 20+ devices (parallel setup, poll jitter, duplicate detection), strict startup validation of every configured row, CSV bulk import with per-line validation, fixed position estimate after stop during full open/close travel, adapter-managed timer cleanup, leading zeros in chdes codes preserved",
|
|
47
|
-
"de": "Skalierung für 20+ Geräte (paralleles Setup, Poll-Jitter, Duplikat-Erkennung), strikte Startup-Validierung jeder konfigurierten Zeile, CSV-Massenimport mit Zeilen-Validierung, korrigierte Positionsschätzung bei Stopp während Endlagenfahrt, korrektes Adapter-Timer-Cleanup, führende Nullen in chdes-Codes bleiben erhalten",
|
|
48
|
-
"ru": "Масштабирование для 20+ устройств (параллельная настройка, джиттер опроса, обнаружение дубликатов), строгая проверка при запуске каждой настроенной строки, массовый импорт CSV с построчной проверкой, исправленная оценка положения после остановки во время полного хода открытия/закрытия, управляемая адаптером очистка таймеров, сохранение ведущих нулей в кодах chdes",
|
|
49
|
-
"pt": "Escalabilidade para 20+ dispositivos (configuração paralela, jitter de sondagem, deteção de duplicados), validação rigorosa no arranque de cada linha configurada, importação CSV em massa com validação por linha, estimativa de posição corrigida após paragem durante o percurso completo de abertura/fecho, limpeza de temporizadores gerida pelo adaptador, zeros à esquerda nos códigos chdes preservados",
|
|
50
|
-
"nl": "Schaalbaarheid voor 20+ apparaten (parallelle setup, poll-jitter, duplicaatdetectie), strikte opstartvalidatie van elke geconfigureerde rij, CSV-bulkimport met validatie per regel, gecorrigeerde positieschatting na stoppen tijdens volledige open/dicht-beweging, door de adapter beheerde timer-opruiming, voorloopnullen in chdes-codes blijven behouden",
|
|
51
|
-
"fr": "Mise à l'échelle pour 20+ appareils (configuration parallèle, gigue de sondage, détection de doublons), validation stricte au démarrage de chaque ligne configurée, import CSV en masse avec validation ligne par ligne, estimation de position corrigée après arrêt pendant une course complète d'ouverture/fermeture, nettoyage des timers géré par l'adaptateur, zéros non significatifs conservés dans les codes chdes",
|
|
52
|
-
"it": "Scalabilità per 20+ dispositivi (setup parallelo, jitter di polling, rilevamento duplicati), validazione rigorosa all'avvio di ogni riga configurata, importazione CSV in blocco con validazione per riga, stima della posizione corretta dopo l'arresto durante la corsa completa di apertura/chiusura, pulizia dei timer gestita dall'adapter, zeri iniziali nei codici chdes preservati",
|
|
53
|
-
"es": "Escalabilidad para 20+ dispositivos (configuración en paralelo, jitter de sondeo, detección de duplicados), validación estricta al inicio de cada fila configurada, importación masiva CSV con validación por línea, estimación de posición corregida tras detenerse durante un recorrido completo de apertura/cierre, limpieza de temporizadores gestionada por el adaptador, ceros iniciales en los códigos chdes conservados",
|
|
54
|
-
"pl": "Skalowanie dla 20+ urządzeń (równoległa konfiguracja, jitter odpytywania, wykrywanie duplikatów), ścisła walidacja przy starcie każdego skonfigurowanego wiersza, masowy import CSV z walidacją każdej linii, poprawiony szacowany stan pozycji po zatrzymaniu podczas pełnego cyklu otwierania/zamykania, zarządzane przez adapter czyszczenie timerów, zachowane zera wiodące w kodach chdes",
|
|
55
|
-
"uk": "Масштабування для 20+ пристроїв (паралельне налаштування, джитер опитування, виявлення дублікатів), сувора перевірка під час запуску кожного налаштованого рядка, масовий імпорт CSV з перевіркою кожного рядка, виправлена оцінка позиції після зупинки під час повного ходу відкриття/закриття, кероване адаптером очищення таймерів, збережені провідні нулі в кодах chdes",
|
|
56
|
-
"zh-cn": "支持20+设备的扩展性(并行初始化、轮询抖动、重复检测),对每个已配置行进行严格的启动校验,支持带逐行校验的CSV批量导入,修复了在完整开/关行程中途停止后的位置估算问题,由适配器统一管理定时器清理,保留chdes代码中的前导零"
|
|
57
|
-
},
|
|
58
|
-
"0.6.0": {
|
|
59
|
-
"en": "Auto-ID from host, device test button (reachability + zeptrion verification + channel count check), channel object names from device (chdes), new icon, device icons",
|
|
60
|
-
"de": "Auto-ID aus Host, Geräte-Test-Button (Erreichbarkeit + zeptrion-Verifikation + Kanalzahl-Prüfung), Kanal-Objektnamen aus dem Gerät (chdes), neues Icon, Geräte-Icons",
|
|
61
|
-
"ru": "Автоматический ID на основе хоста, кнопка тестирования устройства (доступность + проверка zeptrion + проверка количества каналов), имена объектов каналов из устройства (chdes), новый значок, значки устройств",
|
|
62
|
-
"pt": "ID automático a partir do host, botão de teste do dispositivo (acessibilidade + verificação zeptrion + verificação do número de canais), nomes de objetos de canal a partir do dispositivo (chdes), novo ícone, ícones de dispositivo",
|
|
63
|
-
"nl": "Automatische ID op basis van de host, testknop voor apparaten (bereikbaarheid + zeptrion-verificatie + controle van het aantal kanalen), kanaalobjectnamen van het apparaat (chdes), nieuw icoon, apparaaticonen",
|
|
64
|
-
"fr": "ID automatique à partir de l'hôte, bouton de test d'appareil (accessibilité + vérification zeptrion + contrôle du nombre de canaux), noms d'objets de canal issus de l'appareil (chdes), nouvelle icône, icônes d'appareil",
|
|
65
|
-
"it": "ID automatico dall'host, pulsante di test del dispositivo (raggiungibilità + verifica zeptrion + controllo numero canali), nomi degli oggetti canale dal dispositivo (chdes), nuova icona, icone dispositivo",
|
|
66
|
-
"es": "ID automático a partir del host, botón de prueba de dispositivo (accesibilidad + verificación zeptrion + comprobación del número de canales), nombres de objetos de canal desde el dispositivo (chdes), nuevo icono, iconos de dispositivo",
|
|
67
|
-
"pl": "Automatyczne ID na podstawie hosta, przycisk testu urządzenia (osiągalność + weryfikacja zeptrion + sprawdzenie liczby kanałów), nazwy obiektów kanałów pobierane z urządzenia (chdes), nowa ikona, ikony urządzeń",
|
|
68
|
-
"uk": "Автоматичний ID на основі хоста, кнопка тестування пристрою (доступність + перевірка zeptrion + перевірка кількості каналів), назви об'єктів каналів з пристрою (chdes), новий значок, значки пристроїв",
|
|
69
|
-
"zh-cn": "根据主机自动生成ID,新增设备测试按钮(可达性检测+zeptrion校验+通道数校验),通道对象名称取自设备本身(chdes),新图标,设备图标"
|
|
70
|
-
},
|
|
71
|
-
"0.5.1": {
|
|
72
|
-
"en": "CRITICAL FIX: XML parser skipped payload due to XML declaration key - all GET values (chscan/id/net/chdes/chnotify) stayed null in 0.5.0",
|
|
73
|
-
"de": "KRITISCHER FIX: XML-Parser übersprang die Nutzdaten wegen des XML-Deklarations-Keys - alle GET-Werte (chscan/id/net/chdes/chnotify) blieben in 0.5.0 null",
|
|
74
|
-
"ru": "КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: XML-парсер пропускал полезную нагрузку из-за ключа объявления XML - все значения GET (chscan/id/net/chdes/chnotify) оставались null в версии 0.5.0",
|
|
75
|
-
"pt": "CORREÇÃO CRÍTICA: o analisador XML ignorava os dados úteis devido à chave de declaração XML - todos os valores GET (chscan/id/net/chdes/chnotify) permaneciam null na 0.5.0",
|
|
76
|
-
"nl": "KRITIEKE FIX: de XML-parser sloeg de payload over vanwege de XML-declaratiesleutel - alle GET-waarden (chscan/id/net/chdes/chnotify) bleven null in 0.5.0",
|
|
77
|
-
"fr": "CORRECTION CRITIQUE : l'analyseur XML ignorait les données utiles à cause de la clé de déclaration XML - toutes les valeurs GET (chscan/id/net/chdes/chnotify) restaient nulles dans la 0.5.0",
|
|
78
|
-
"it": "CORREZIONE CRITICA: il parser XML saltava il payload a causa della chiave di dichiarazione XML - tutti i valori GET (chscan/id/net/chdes/chnotify) restavano null nella 0.5.0",
|
|
79
|
-
"es": "CORRECCIÓN CRÍTICA: el analizador XML omitía la carga útil debido a la clave de declaración XML - todos los valores GET (chscan/id/net/chdes/chnotify) permanecían en null en la 0.5.0",
|
|
80
|
-
"pl": "KRYTYCZNA POPRAWKA: parser XML pomijał dane z powodu klucza deklaracji XML - wszystkie wartości GET (chscan/id/net/chdes/chnotify) pozostawały null w wersji 0.5.0",
|
|
81
|
-
"uk": "КРИТИЧНЕ ВИПРАВЛЕННЯ: XML-парсер пропускав корисне навантаження через ключ оголошення XML - усі значення GET (chscan/id/net/chdes/chnotify) залишалися null у версії 0.5.0",
|
|
82
|
-
"zh-cn": "重大修复:由于XML声明键的问题,XML解析器会跳过实际数据——0.5.0版本中所有GET数值(chscan/id/net/chdes/chnotify)始终为null"
|
|
83
35
|
}
|
|
84
36
|
},
|
|
85
37
|
"titleLang": {
|
|
@@ -113,7 +65,12 @@
|
|
|
113
65
|
],
|
|
114
66
|
"dependencies": [
|
|
115
67
|
{
|
|
116
|
-
"js-controller": ">=
|
|
68
|
+
"js-controller": ">=6.0.11"
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"globalDependencies": [
|
|
72
|
+
{
|
|
73
|
+
"admin": ">=7.8.23"
|
|
117
74
|
}
|
|
118
75
|
],
|
|
119
76
|
"keywords": [
|
|
@@ -193,4 +150,4 @@
|
|
|
193
150
|
"native": {}
|
|
194
151
|
}
|
|
195
152
|
]
|
|
196
|
-
}
|
|
153
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.zeptrion",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.4",
|
|
4
4
|
"description": "ioBroker Adapter für Feller zeptrion / zApp WLAN-Aktoren (WLAN-Nebenstelle 4K, WLAN-Zwischenmodul 2K) über die zrap Webservice API - inkl. Sammelbefehlen für Hagelalarm und mDNS-Discovery",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Stefan",
|
|
@@ -32,23 +32,20 @@
|
|
|
32
32
|
"admin/",
|
|
33
33
|
"main.js",
|
|
34
34
|
"io-package.json",
|
|
35
|
-
"LICENSE"
|
|
36
|
-
"zeptrion.png"
|
|
35
|
+
"LICENSE"
|
|
37
36
|
],
|
|
38
37
|
"engines": {
|
|
39
|
-
"node": ">=
|
|
38
|
+
"node": ">=22"
|
|
40
39
|
},
|
|
41
40
|
"dependencies": {
|
|
42
|
-
"@iobroker/adapter-core": "^3.
|
|
43
|
-
"axios": "^1.
|
|
44
|
-
"fast-xml-parser": "^
|
|
41
|
+
"@iobroker/adapter-core": "^3.4.2",
|
|
42
|
+
"axios": "^1.18.1",
|
|
43
|
+
"fast-xml-parser": "^5.9.3",
|
|
45
44
|
"bonjour-service": "^1.2.1"
|
|
46
45
|
},
|
|
47
46
|
"devDependencies": {
|
|
48
|
-
"@iobroker/testing": "^
|
|
49
|
-
"
|
|
50
|
-
"mocha": "^10.2.0",
|
|
51
|
-
"eslint": "^9.0.0"
|
|
47
|
+
"@iobroker/testing": "^5.3.0",
|
|
48
|
+
"eslint": "^10.6.0"
|
|
52
49
|
},
|
|
53
50
|
"scripts": {
|
|
54
51
|
"start": "node main.js",
|
package/zeptrion.png
DELETED
|
Binary file
|