iobroker.zeptrion 0.8.5 → 1.0.0
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 +10 -68
- package/io-package.json +27 -1
- package/lib/adapter-config.d.ts +19 -0
- package/main.js +82 -8
- package/package.json +6 -3
package/README.md
CHANGED
|
@@ -190,6 +190,13 @@ npm run test:integration # starts a real js-controller (takes longer)
|
|
|
190
190
|
|
|
191
191
|
## Changelog
|
|
192
192
|
|
|
193
|
+
### 1.0.0 (2026-07-17)
|
|
194
|
+
- First 1.0 release - the adapter has reached a stable, complete feature set (multicast command bundling, mDNS discovery, hail bulk commands, position estimation, Smartfront support, CSV import, full i18n).
|
|
195
|
+
- FIX: the previous release corrected calibrate/ntp.per roles and the info.connection translation, but ensureState() never updates an object that already exists - so installations updated from an older version kept the old, incorrect objects forever. Added a one-time startup migration that force-corrects exactly those known objects via extendObjectAsync(), without touching anything else (including the adapter's own built-in root info.connection object).
|
|
196
|
+
|
|
197
|
+
### 0.8.6 (2026-07-17)
|
|
198
|
+
- Corrected object role/type mismatches found by the ioBroker store submission's object structure check: calibrate and ntp.per used role 'value', which strictly requires read=true/write=false and does not fit these intentionally writable states - changed to role 'level'. Also added the missing full i18n translation for info.connection.
|
|
199
|
+
|
|
193
200
|
### 0.8.5 (2026-07-16)
|
|
194
201
|
- 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
202
|
|
|
@@ -212,74 +219,9 @@ npm run test:integration # starts a real js-controller (takes longer)
|
|
|
212
219
|
### 0.8.0
|
|
213
220
|
- 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
221
|
|
|
215
|
-
### 0.7.0
|
|
216
|
-
|
|
217
|
-
|
|
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
|
|
221
|
-
|
|
222
|
-
### 0.6.0 (2026-07-10)
|
|
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
|
|
225
|
-
|
|
226
|
-
### 0.5.1 (2026-07-10)
|
|
227
|
-
- CRITICAL FIX: the XML parser skipped the payload because of the XML declaration key - all GET values remained null in 0.5.0
|
|
228
|
-
|
|
229
|
-
### 0.5.0 (2026-07-07)
|
|
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.
|
|
254
|
-
|
|
255
|
-
### 0.3.0 (2026-07-07)
|
|
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.
|
|
266
|
-
|
|
267
|
-
### 0.2.0 (2026-07-07)
|
|
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.
|
|
279
|
-
|
|
280
|
-
### 0.1.0 (2026-07-07)
|
|
281
|
-
- First version: channel control, channel state/description, device/network info,
|
|
282
|
-
system commands, location/NTP/date, bulk commands for hail alerts, mDNS discovery.
|
|
222
|
+
### 0.7.0 and older
|
|
223
|
+
|
|
224
|
+
Older changelog entries can be found in [CHANGELOG_OLD.md](CHANGELOG_OLD.md).
|
|
283
225
|
|
|
284
226
|
## License
|
|
285
227
|
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zeptrion",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"news": {
|
|
6
|
+
"1.0.0": {
|
|
7
|
+
"en": "First 1.0 release. FIX: the previous release corrected calibrate/ntp.per roles and the info.connection translation, but ensureState() never updates an object that already exists - so installations updated from an older version kept the old, incorrect objects forever. Added a one-time startup migration that force-corrects exactly those known objects via extendObjectAsync(), without touching anything else (including the adapter's own built-in root info.connection object). No other functional changes since 0.8.6 - the version bump to 1.0.0 reflects that the adapter has reached a stable, complete feature set (multicast command bundling, mDNS discovery, hail bulk commands, position estimation, Smartfront support, CSV import, full i18n).",
|
|
8
|
+
"de": "Erstes 1.0-Release. FIX: Das vorherige Release hat die calibrate/ntp.per-Rollen und die info.connection-Übersetzung korrigiert, aber ensureState() aktualisiert nie ein bereits existierendes Objekt - Installationen, die von einer älteren Version aktualisiert haben, behielten die alten, falschen Objekte dauerhaft. Eine einmalige Start-Migration ergänzt, die genau diese bekannten Objekte per extendObjectAsync() zwangskorrigiert, ohne sonst etwas anzufassen (auch nicht das adaptereigene, eingebaute root-info.connection-Objekt). Keine weiteren funktionalen Änderungen seit 0.8.6 - der Sprung auf 1.0.0 spiegelt wider, dass der Adapter einen stabilen, vollständigen Funktionsumfang erreicht hat (Multicast-Befehlsbündelung, mDNS-Discovery, Hagel-Sammelbefehle, Positionsschätzung, Smartfront-Unterstützung, CSV-Import, vollständige i18n).",
|
|
9
|
+
"ru": "Первый релиз 1.0. ИСПРАВЛЕНИЕ: предыдущий релиз исправил роли calibrate/ntp.per и перевод info.connection, но ensureState() никогда не обновляет уже существующий объект - поэтому установки, обновлённые с более старой версии, навсегда сохраняли старые, неверные объекты. Добавлена одноразовая миграция при запуске, принудительно исправляющая именно эти известные объекты.",
|
|
10
|
+
"pt": "Primeiro lançamento 1.0. CORREÇÃO: o lançamento anterior corrigiu as funções calibrate/ntp.per e a tradução info.connection, mas ensureState() nunca atualiza um objeto já existente - por isso as instalações atualizadas de uma versão mais antiga mantinham para sempre os objetos antigos incorretos. Adicionada uma migração única no arranque.",
|
|
11
|
+
"nl": "Eerste 1.0-release. FIX: de vorige release corrigeerde de calibrate/ntp.per-rollen en de info.connection-vertaling, maar ensureState() werkt nooit een reeds bestaand object bij - installaties bijgewerkt vanaf een oudere versie behielden dus permanent de oude, onjuiste objecten. Eenmalige opstartmigratie toegevoegd.",
|
|
12
|
+
"fr": "Première version 1.0. CORRECTIF : la version précédente a corrigé les rôles calibrate/ntp.per et la traduction info.connection, mais ensureState() ne met jamais à jour un objet déjà existant - les installations mises à jour depuis une version plus ancienne conservaient donc indéfiniment les anciens objets incorrects. Migration unique au démarrage ajoutée.",
|
|
13
|
+
"it": "Prima versione 1.0. CORREZIONE: la versione precedente ha corretto i ruoli calibrate/ntp.per e la traduzione info.connection, ma ensureState() non aggiorna mai un oggetto già esistente - le installazioni aggiornate da una versione precedente mantenevano quindi per sempre i vecchi oggetti errati. Aggiunta una migrazione una tantum all'avvio.",
|
|
14
|
+
"es": "Primera versión 1.0. CORRECCIÓN: la versión anterior corrigió los roles calibrate/ntp.per y la traducción de info.connection, pero ensureState() nunca actualiza un objeto ya existente, por lo que las instalaciones actualizadas desde una versión anterior conservaban para siempre los objetos antiguos incorrectos. Se añadió una migración única al inicio.",
|
|
15
|
+
"pl": "Pierwsze wydanie 1.0. POPRAWKA: poprzednie wydanie naprawiło role calibrate/ntp.per oraz tłumaczenie info.connection, ale ensureState() nigdy nie aktualizuje już istniejącego obiektu - instalacje zaktualizowane ze starszej wersji na stałe zachowywały więc stare, błędne obiekty. Dodano jednorazową migrację przy starcie.",
|
|
16
|
+
"uk": "Перший реліз 1.0. ВИПРАВЛЕННЯ: попередній реліз виправив ролі calibrate/ntp.per та переклад info.connection, але ensureState() ніколи не оновлює вже існуючий об'єкт - тому інсталяції, оновлені зі старішої версії, назавжди зберігали старі, неправильні об'єкти. Додано одноразову міграцію під час запуску.",
|
|
17
|
+
"zh-cn": "首个 1.0 版本。修复:上一版本修正了 calibrate/ntp.per 角色和 info.connection 翻译,但 ensureState() 从不更新已存在的对象——因此从旧版本升级的安装会永久保留旧的、不正确的对象。新增了一次性启动迁移来强制修正这些已知对象。"
|
|
18
|
+
},
|
|
19
|
+
"0.8.6": {
|
|
20
|
+
"en": "Corrected object role/type mismatches found by the ioBroker store submission's object structure check: calibrate and ntp.per used role 'value', which strictly requires read=true/write=false and does not fit these intentionally writable states - changed to role 'level'. Also added the missing full i18n translation for info.connection. No functional/API changes - purely metadata (common.role/common.name) corrections.",
|
|
21
|
+
"de": "Objekt-Rollen-/Typ-Abweichungen behoben, die beim Objektstruktur-Check der ioBroker-Store-Einreichung gefunden wurden: calibrate und ntp.per nutzten die Rolle 'value', die zwingend read=true/write=false erfordert und nicht zu diesen bewusst schreibbaren States passt - auf Rolle 'level' umgestellt. Zusätzlich die fehlende vollständige i18n-Übersetzung für info.connection ergänzt. Keine funktionalen/API-Änderungen - reine Metadaten-Korrekturen (common.role/common.name).",
|
|
22
|
+
"ru": "Исправлены несоответствия ролей/типов объектов, найденных при проверке структуры объектов для подачи в магазин ioBroker: calibrate и ntp.per использовали роль 'value', которая строго требует read=true/write=false и не подходит для этих намеренно записываемых состояний - изменено на роль 'level'. Также добавлен отсутствующий полный перевод i18n для info.connection.",
|
|
23
|
+
"pt": "Corrigidas incompatibilidades de função/tipo de objeto encontradas na verificação da estrutura de objetos da submissão à loja ioBroker: calibrate e ntp.per usavam a função 'value', que exige estritamente read=true/write=false e não se adequa a estes estados intencionalmente graváveis - alterado para a função 'level'. Também foi adicionada a tradução i18n completa em falta para info.connection.",
|
|
24
|
+
"nl": "Object rol/type-mismatches gecorrigeerd die zijn gevonden bij de objectstructuurcontrole van de ioBroker store-inzending: calibrate en ntp.per gebruikten de rol 'value', die strikt read=true/write=false vereist en niet past bij deze bewust schrijfbare states - gewijzigd naar rol 'level'. Ook de ontbrekende volledige i18n-vertaling voor info.connection toegevoegd.",
|
|
25
|
+
"fr": "Correction des incohérences de rôle/type d'objet détectées lors de la vérification de la structure des objets pour la soumission au store ioBroker : calibrate et ntp.per utilisaient le rôle 'value', qui exige strictement read=true/write=false et ne convient pas à ces états volontairement modifiables - changé en rôle 'level'. La traduction i18n complète manquante pour info.connection a également été ajoutée.",
|
|
26
|
+
"it": "Corrette le discrepanze di ruolo/tipo degli oggetti riscontrate durante il controllo della struttura degli oggetti per l'invio allo store ioBroker: calibrate e ntp.per utilizzavano il ruolo 'value', che richiede rigorosamente read=true/write=false e non si adatta a questi stati intenzionalmente scrivibili - cambiato in ruolo 'level'. Aggiunta anche la traduzione i18n completa mancante per info.connection.",
|
|
27
|
+
"es": "Se corrigieron discrepancias de rol/tipo de objeto encontradas en la verificación de estructura de objetos del envío a la tienda ioBroker: calibrate y ntp.per usaban el rol 'value', que requiere estrictamente read=true/write=false y no encaja con estos estados intencionalmente escribibles - cambiado a rol 'level'. También se añadió la traducción i18n completa faltante para info.connection.",
|
|
28
|
+
"pl": "Naprawiono niezgodności ról/typów obiektów wykryte podczas sprawdzania struktury obiektów zgłoszenia do sklepu ioBroker: calibrate i ntp.per używały roli 'value', która wymaga ściśle read=true/write=false i nie pasuje do tych celowo zapisywalnych stanów - zmieniono na rolę 'level'. Dodano również brakujące pełne tłumaczenie i18n dla info.connection.",
|
|
29
|
+
"uk": "Виправлено невідповідності ролей/типів об'єктів, знайдені під час перевірки структури об'єктів для подання до магазину ioBroker: calibrate і ntp.per використовували роль 'value', яка суворо вимагає read=true/write=false і не підходить для цих навмисно записуваних станів - змінено на роль 'level'. Також додано відсутній повний переклад i18n для info.connection.",
|
|
30
|
+
"zh-cn": "修复了在 ioBroker 商店提交的对象结构检查中发现的对象角色/类型不匹配问题:calibrate 和 ntp.per 使用了角色 'value',该角色严格要求 read=true/write=false,不适合这些故意可写的状态——已更改为角色 'level'。同时还补充了 info.connection 缺失的完整 i18n 翻译。"
|
|
31
|
+
},
|
|
6
32
|
"0.8.5": {
|
|
7
33
|
"en": "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.",
|
|
8
34
|
"de": "Automatisierte npm-Releases über GitHub Actions mittels npm Trusted Publishing (OIDC) aktiviert - kein manuelles Veröffentlichen mehr nötig, dieses und alle künftigen getaggten Releases werden automatisch mit npm-Provenance signiert. Keine funktionalen Änderungen/API-Änderungen.",
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// This file extends the AdapterConfig type from "@types/iobroker"
|
|
2
|
+
// using the actual properties present in io-package.json
|
|
3
|
+
// in order to provide typings for adapter.config properties
|
|
4
|
+
|
|
5
|
+
import { native } from '../io-package.json';
|
|
6
|
+
|
|
7
|
+
type _AdapterConfig = typeof native;
|
|
8
|
+
|
|
9
|
+
// Augment the globally declared type ioBroker.AdapterConfig
|
|
10
|
+
declare global {
|
|
11
|
+
namespace ioBroker {
|
|
12
|
+
interface AdapterConfig extends _AdapterConfig {
|
|
13
|
+
// Do not enter anything here!
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// this is required so the above AdapterConfig is found by TypeScript / type checking
|
|
19
|
+
export {};
|
package/main.js
CHANGED
|
@@ -120,10 +120,69 @@ class Zeptrion extends utils.Adapter {
|
|
|
120
120
|
|
|
121
121
|
// ---------------------------------------------------------------- ready
|
|
122
122
|
|
|
123
|
+
// Force-corrects a small set of known-bad object roles/names left over from before this fix.
|
|
124
|
+
// Only touches an object if it still holds the exact old, known-bad value, so it never
|
|
125
|
+
// clobbers anything a user might have customized in the meantime. Role fixes are matched by
|
|
126
|
+
// ID suffix (calibrate/ntp.per are always per-device, unambiguous); the info.connection name
|
|
127
|
+
// fix is matched by its exact old string value instead of by ID, since the adapter's own
|
|
128
|
+
// built-in root "info.connection" object (not created by ensureState, must not be touched)
|
|
129
|
+
// would otherwise be hard to tell apart from the per-device one by ID pattern alone.
|
|
130
|
+
async migrateObjectRoles() {
|
|
131
|
+
try {
|
|
132
|
+
const objects = await this.getAdapterObjectsAsync();
|
|
133
|
+
let fixedCount = 0;
|
|
134
|
+
for (const id of Object.keys(objects)) {
|
|
135
|
+
const obj = objects[id];
|
|
136
|
+
if (!obj || obj.type !== 'state' || !obj.common) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (/\.calibrate$/.test(id) && obj.common.role === 'value') {
|
|
140
|
+
await this.extendObjectAsync(id, { common: { role: 'level' } });
|
|
141
|
+
fixedCount++;
|
|
142
|
+
} else if (/\.ntp\.per$/.test(id) && obj.common.role === 'value') {
|
|
143
|
+
await this.extendObjectAsync(id, { common: { role: 'level' } });
|
|
144
|
+
fixedCount++;
|
|
145
|
+
} else if (/\.info\.connection$/.test(id) && obj.common.name === 'Verbindung OK') {
|
|
146
|
+
await this.extendObjectAsync(id, {
|
|
147
|
+
common: {
|
|
148
|
+
name: {
|
|
149
|
+
en: 'Connection OK',
|
|
150
|
+
de: 'Verbindung OK',
|
|
151
|
+
ru: 'Соединение в порядке',
|
|
152
|
+
pt: 'Ligação OK',
|
|
153
|
+
nl: 'Verbinding OK',
|
|
154
|
+
fr: 'Connexion OK',
|
|
155
|
+
it: 'Connessione OK',
|
|
156
|
+
es: 'Conexión OK',
|
|
157
|
+
pl: 'Połączenie OK',
|
|
158
|
+
uk: "З'єднання в порядку",
|
|
159
|
+
'zh-cn': '连接正常'
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
fixedCount++;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (fixedCount > 0) {
|
|
167
|
+
this.log.info(`Migration: corrected role/name on ${fixedCount} existing object(s) created by an older version.`);
|
|
168
|
+
}
|
|
169
|
+
} catch (e) {
|
|
170
|
+
// Never let a migration failure block adapter startup.
|
|
171
|
+
this.log.warn(`Migration of object roles/names failed (non-fatal, adapter will continue starting): ${e}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
123
175
|
async onReady() {
|
|
176
|
+
// One-time (cheap-and-idempotent-every-startup) fix for role/name mistakes present in
|
|
177
|
+
// objects created before this fix (see CHANGELOG). ensureState()/setObjectNotExistsAsync()
|
|
178
|
+
// never touches an object that already exists, so simply updating the adapter does not
|
|
179
|
+
// correct objects an already-running installation had already created - this actively
|
|
180
|
+
// force-corrects them via extendObjectAsync() instead.
|
|
181
|
+
await this.migrateObjectRoles();
|
|
182
|
+
|
|
124
183
|
await this.setStateAsync('info.connection', { val: false, ack: true });
|
|
125
184
|
|
|
126
|
-
const timeout = parseInt(this.config.requestTimeout, 10) || 4000;
|
|
185
|
+
const timeout = parseInt(String(this.config.requestTimeout), 10) || 4000;
|
|
127
186
|
this.requestTimeout = Math.min(Math.max(timeout, 500), 30000);
|
|
128
187
|
|
|
129
188
|
const devicesCfg = Array.isArray(this.config.devices) ? this.config.devices : [];
|
|
@@ -395,7 +454,22 @@ class Zeptrion extends utils.Adapter {
|
|
|
395
454
|
|
|
396
455
|
// --- info ---
|
|
397
456
|
await this.setObjectNotExistsAsync(`${id}.info`, { type: 'channel', common: { name: 'Geräteinformationen' }, native: {} });
|
|
398
|
-
await this.ensureState(`${id}.info.connection`, {
|
|
457
|
+
await this.ensureState(`${id}.info.connection`, {
|
|
458
|
+
name: {
|
|
459
|
+
en: 'Connection OK',
|
|
460
|
+
de: 'Verbindung OK',
|
|
461
|
+
ru: 'Соединение в порядке',
|
|
462
|
+
pt: 'Ligação OK',
|
|
463
|
+
nl: 'Verbinding OK',
|
|
464
|
+
fr: 'Connexion OK',
|
|
465
|
+
it: 'Connessione OK',
|
|
466
|
+
es: 'Conexión OK',
|
|
467
|
+
pl: 'Połączenie OK',
|
|
468
|
+
uk: "З'єднання в порядку",
|
|
469
|
+
'zh-cn': '连接正常'
|
|
470
|
+
},
|
|
471
|
+
type: 'boolean', role: 'indicator.reachable', read: true, write: false, def: false
|
|
472
|
+
});
|
|
399
473
|
await this.ensureState(`${id}.info.lastError`, { name: 'Letzter Fehler', type: 'string', role: 'text', read: true, write: false, def: '' });
|
|
400
474
|
await this.ensureState(`${id}.info.hw`, { name: 'Hardware-Version', type: 'string', role: 'info.hardware', read: true, write: false });
|
|
401
475
|
await this.ensureState(`${id}.info.sw`, { name: 'Software-Version', type: 'string', role: 'info.firmware', read: true, write: false });
|
|
@@ -435,7 +509,7 @@ class Zeptrion extends utils.Adapter {
|
|
|
435
509
|
// --- ntp (zrap/ntp) ---
|
|
436
510
|
await this.setObjectNotExistsAsync(`${id}.ntp`, { type: 'channel', common: { name: 'NTP' }, native: {} });
|
|
437
511
|
await this.ensureState(`${id}.ntp.url`, { name: 'NTP-Server (URL/IP, max. 32 Zeichen)', type: 'string', role: 'text', read: true, write: true });
|
|
438
|
-
await this.ensureState(`${id}.ntp.per`, { name: 'Abfrageintervall in Stunden (0=deaktiviert)', type: 'number', role: '
|
|
512
|
+
await this.ensureState(`${id}.ntp.per`, { name: 'Abfrageintervall in Stunden (0=deaktiviert)', type: 'number', role: 'level', read: true, write: true, min: 0, max: 255 });
|
|
439
513
|
|
|
440
514
|
// --- date (zrap/date) ---
|
|
441
515
|
await this.setObjectNotExistsAsync(`${id}.date`, { type: 'channel', common: { name: 'Datum/Zeit' }, native: {} });
|
|
@@ -513,7 +587,7 @@ class Zeptrion extends utils.Adapter {
|
|
|
513
587
|
});
|
|
514
588
|
await this.ensureState(`${ch}.calibrate`, {
|
|
515
589
|
name: 'Schätzung setzen OHNE Fahrt (z.B. nach manueller Bedienung am Wandtaster): aktuellen Ist-Zustand in % eintragen',
|
|
516
|
-
type: 'number', role: '
|
|
590
|
+
type: 'number', role: 'level', min: 0, max: 100, read: false, write: true
|
|
517
591
|
});
|
|
518
592
|
await this.extendObjectAsync(`${ch}.tiltOpen`, {
|
|
519
593
|
type: 'state',
|
|
@@ -1519,13 +1593,13 @@ class Zeptrion extends utils.Adapter {
|
|
|
1519
1593
|
id: candidate,
|
|
1520
1594
|
name: row.name || row.host,
|
|
1521
1595
|
host: row.host,
|
|
1522
|
-
channels: parseInt(row.channels, 10) || 1,
|
|
1596
|
+
channels: parseInt(String(row.channels), 10) || 1,
|
|
1523
1597
|
kind: row.kind,
|
|
1524
|
-
travelTimeSec: parseInt(row.travelTimeSec, 10) || 0,
|
|
1598
|
+
travelTimeSec: parseInt(String(row.travelTimeSec), 10) || 0,
|
|
1525
1599
|
travelTimeSecCh: String(row.travelTimeSecCh || '').trim(),
|
|
1526
|
-
tiltTimeMs: parseInt(row.tiltTimeMs, 10) || 0,
|
|
1600
|
+
tiltTimeMs: parseInt(String(row.tiltTimeMs), 10) || 0,
|
|
1527
1601
|
smartfront: row.smartfront,
|
|
1528
|
-
pollInterval: parseInt(row.pollInterval, 10) || 30
|
|
1602
|
+
pollInterval: parseInt(String(row.pollInterval), 10) || 30
|
|
1529
1603
|
});
|
|
1530
1604
|
existingHosts.add(row.host.toLowerCase());
|
|
1531
1605
|
existingIds.add(candidate);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.zeptrion",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
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",
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
"files": [
|
|
32
32
|
"admin/",
|
|
33
33
|
"main.js",
|
|
34
|
+
"lib/",
|
|
34
35
|
"io-package.json",
|
|
35
36
|
"LICENSE"
|
|
36
37
|
],
|
|
@@ -45,7 +46,9 @@
|
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
47
48
|
"@iobroker/testing": "^5.3.0",
|
|
48
|
-
"eslint": "^10.6.0"
|
|
49
|
+
"eslint": "^10.6.0",
|
|
50
|
+
"@tsconfig/node22": "^22.0.5",
|
|
51
|
+
"@types/node": "^22.20.1"
|
|
49
52
|
},
|
|
50
53
|
"scripts": {
|
|
51
54
|
"start": "node main.js",
|
|
@@ -55,4 +58,4 @@
|
|
|
55
58
|
"test:integration": "mocha test/integration.js --exit --timeout 60000",
|
|
56
59
|
"test": "npm run test:package && npm run test:unit"
|
|
57
60
|
}
|
|
58
|
-
}
|
|
61
|
+
}
|