iobroker.waip-web 0.7.9 → 0.7.12
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.de.md +3 -2
- package/README.md +33 -12
- package/io-package.json +40 -14
- package/main.js +47 -5
- package/package.json +2 -3
- package/CHANGELOG_OLD.md +0 -410
package/README.de.md
CHANGED
|
@@ -130,7 +130,8 @@ und Trigger ohne JSON-Parsing auskommen.
|
|
|
130
130
|
| `restzeit` | number (s) | Verbleibende Sekunden bis `einsatz.ablaufzeit`, sekündlich aktualisiert |
|
|
131
131
|
| `registeredMonitor` | string | Zuletzt beim Server registrierte Monitor-ID |
|
|
132
132
|
| `registeredMonitorName` | string | Anzeigename dieses Monitors ohne ID (z. B. „Leitstelle: Lausitz"); wird einmalig beim Start von derselben `/waip/`-Übersichtsseite wie das Admin-Dropdown aufgelöst, `null` falls nicht auflösbar |
|
|
133
|
-
| `registrationAccepted` |
|
|
133
|
+
| `registrationAccepted` | boolean | `true` sobald das erste Event empfangen wurde, sonst `false` direkt nach Connect oder nach Ablauf des Registrierungs-Timeouts |
|
|
134
|
+
| `registrationPending` | boolean | `true` direkt nach Connect, solange noch auf eine Antwort vom Server gewartet wird, sonst `false` sobald bestätigt oder Timeout erreicht |
|
|
134
135
|
|
|
135
136
|
### einsatz
|
|
136
137
|
|
|
@@ -156,7 +157,7 @@ stehen. Der zuletzt abgeschlossene Einsatz bleibt trotzdem über
|
|
|
156
157
|
| `ablaufzeit` | string (date) | Ende der Standby-Anzeigedauer, Basis für `status.restzeit` |
|
|
157
158
|
| `einsatznummer` | string | Einsatznummer (sofern vom Server vergeben) |
|
|
158
159
|
| `sondersignal` | number | `1` = Sondersignal, sonst kein Sondersignal |
|
|
159
|
-
| `permissions` |
|
|
160
|
+
| `permissions` | string | Berechtigungsflag der Registrierung (Vollzugriff auf Detailkarte ja/nein); wird immer als String gespeichert (z.B. `"true"`), da der Server hier ein rohes Boolean sendet |
|
|
160
161
|
| `latitude` / `longitude` | number | Position des Einsatzortes (normalisiert aus wgs84-Feldern oder GeoJSON-Mittelpunkt) |
|
|
161
162
|
| `json` | string (JSON) | Vollständiges Einsatz-Objekt: alle Felder oben plus `emAlarmiert[]`, `emWeitere[]`, `routen[]`, `rueckmeldungen[]` |
|
|
162
163
|
| `history10` | string (JSON-Array) | Letzte 10 abgeschlossenen Einsätze, gleicher Objekt-Shape wie `json`, geschrieben bei `io.standby` |
|
package/README.md
CHANGED
|
@@ -138,7 +138,8 @@ bindings and triggers don't need JSON parsing.
|
|
|
138
138
|
| `restzeit` | number (s) | Remaining seconds until `einsatz.ablaufzeit`, updated every second |
|
|
139
139
|
| `registeredMonitor` | string | Monitor ID last registered with the server |
|
|
140
140
|
| `registeredMonitorName` | string | Display name of that monitor, without the ID (e.g. "Leitstelle: Lausitz"); resolved once at startup from the same `/waip/` overview page as the admin dropdown, `null` if it couldn't be resolved |
|
|
141
|
-
| `registrationAccepted` |
|
|
141
|
+
| `registrationAccepted` | boolean | `true` once the first event was received, `false` right after connecting or once the registration timeout elapses |
|
|
142
|
+
| `registrationPending` | boolean | `true` right after connecting while a response from the server is still awaited, `false` once accepted or timed out |
|
|
142
143
|
|
|
143
144
|
### einsatz
|
|
144
145
|
|
|
@@ -164,7 +165,7 @@ live data. The most recently finished incident remains available via
|
|
|
164
165
|
| `ablaufzeit` | string (date) | End of the standby display duration, basis for `status.restzeit` |
|
|
165
166
|
| `einsatznummer` | string | Incident number (if assigned by the server) |
|
|
166
167
|
| `sondersignal` | number | `1` = special signal (lights & siren), otherwise none |
|
|
167
|
-
| `permissions` |
|
|
168
|
+
| `permissions` | string | The registration's permission flag (full access to the detail map yes/no); always stringified (e.g. `"true"`), since the server sends it as a raw boolean |
|
|
168
169
|
| `latitude` / `longitude` | number | Incident location (normalized from wgs84 fields or GeoJSON centroid) |
|
|
169
170
|
| `json` | string (JSON) | Complete incident object: all fields above plus `emAlarmiert[]`, `emWeitere[]`, `routen[]`, `rueckmeldungen[]` |
|
|
170
171
|
| `history10` | string (JSON array) | Last 10 completed incidents, same object shape as `json`, written on `io.standby` |
|
|
@@ -206,6 +207,36 @@ inside the JSON value, not their own ioBroker states.
|
|
|
206
207
|
|
|
207
208
|
## Changelog
|
|
208
209
|
|
|
210
|
+
### 0.7.12 (2026-08-21)
|
|
211
|
+
|
|
212
|
+
- Fixed **[E3005]**: `einsatz.permissions` is declared as
|
|
213
|
+
`common.type: "string"`, but `setField()` passed raw
|
|
214
|
+
booleans/numbers through unchanged (the WAIP server sends this
|
|
215
|
+
field as a raw boolean flag), so the stored `val` didn't match the
|
|
216
|
+
declared type. `setField()` now looks up the declared type and
|
|
217
|
+
always stringifies values for string-typed states, regardless of
|
|
218
|
+
the incoming JS type - found by the `ioBroker.repositories` object
|
|
219
|
+
structure check.
|
|
220
|
+
|
|
221
|
+
### 0.7.11 (2026-08-21)
|
|
222
|
+
|
|
223
|
+
- Fixed **[E3009]** (57 findings): added the missing channel/folder
|
|
224
|
+
objects (`status`, `einsatz`, `einsatz.rueckmeldungAnzahl`, `debug`,
|
|
225
|
+
`tts`) that ioBroker requires for every state path segment - found
|
|
226
|
+
by the `ioBroker.repositories` object structure check.
|
|
227
|
+
- Fixed **[E3005]**/**[E1009]**: replaced the unsupported
|
|
228
|
+
`common.type: "mixed"` on `einsatz.permissions` (now `string`) and
|
|
229
|
+
`status.registrationAccepted` (now split into two booleans:
|
|
230
|
+
`registrationAccepted` and the new `registrationPending`).
|
|
231
|
+
|
|
232
|
+
### 0.7.10 (2026-08-21)
|
|
233
|
+
|
|
234
|
+
- Fixed **[S9508]**: excluded `CHANGELOG_OLD.md` from the npm package
|
|
235
|
+
(removed from `package.json`'s `files` allowlist) - ioBroker shows
|
|
236
|
+
the README via a GitHub link, not from the installed npm package, so
|
|
237
|
+
the file remains fully readable on GitHub without needing to ship
|
|
238
|
+
inside the tarball.
|
|
239
|
+
|
|
209
240
|
### 0.7.9 (2026-08-21)
|
|
210
241
|
|
|
211
242
|
- Fixed **[E5025]**/**[E5036]**: installed the missing
|
|
@@ -236,16 +267,6 @@ inside the JSON value, not their own ioBroker states.
|
|
|
236
267
|
version-bump/tag workflow (see below) is unchanged; the tool is
|
|
237
268
|
available but not actively used for releasing yet.
|
|
238
269
|
|
|
239
|
-
### 0.7.5 (2026-08-21)
|
|
240
|
-
|
|
241
|
-
*(Also never tagged/published to npm - superseded directly by 0.7.6.)*
|
|
242
|
-
|
|
243
|
-
- Fixed **[E2004]**: removed the orphaned `0.7.3` entry from
|
|
244
|
-
`common.news` in `io-package.json` - that version (see below) was
|
|
245
|
-
never actually tagged/published to npm, `0.7.2` was followed directly
|
|
246
|
-
by `0.7.4`. Confirmed via a bot recheck that every other finding from
|
|
247
|
-
the last two rounds is now fixed.
|
|
248
|
-
|
|
249
270
|
Older entries have moved to [CHANGELOG_OLD.md](CHANGELOG_OLD.md).
|
|
250
271
|
|
|
251
272
|
## License
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "waip-web",
|
|
4
|
-
"version": "0.7.
|
|
4
|
+
"version": "0.7.12",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.7.12": {
|
|
7
|
+
"en": "Fixed [E3005]: einsatz.permissions is declared as common.type \"string\", but setField() passed raw booleans/numbers through unchanged (the WAIP server sends this field as a raw boolean flag), so the stored val didn't match the declared type. setField() now looks up the declared type and always stringifies values for string-typed states, regardless of the incoming JS type.",
|
|
8
|
+
"de": "[E3005] behoben: einsatz.permissions ist als common.type \"string\" deklariert, setField() ließ rohe Booleans/Zahlen aber unverändert durch (der WAIP-Server sendet dieses Feld als rohes Boolean-Flag), wodurch der gespeicherte val nicht zum deklarierten Typ passte. setField() ermittelt jetzt den deklarierten Typ und stringifiziert Werte für string-typisierte States immer, unabhängig vom eingehenden JS-Typ.",
|
|
9
|
+
"ru": "Исправлено [E3005]: einsatz.permissions объявляется как common.type «строка», но setField() передает необработанные логические значения/числа без изменений (сервер WAIP отправляет это поле как необработанный логический флаг), поэтому сохраненное значение не соответствует объявленному типу. setField() теперь ищет объявленный тип и всегда преобразует в строку значения для состояний строкового типа, независимо от входящего типа JS.",
|
|
10
|
+
"pt": "Corrigido [E3005]: einsatz.permissions é declarado como common.type \"string\", mas setField() passava booleanos/números brutos inalterados (o servidor WAIP envia este campo como um sinalizador booleano bruto), então o val armazenado não correspondia ao tipo declarado. setField() agora procura o tipo declarado e sempre codifica valores para estados digitados em string, independentemente do tipo JS de entrada.",
|
|
11
|
+
"nl": "Opgelost [E3005]: einsatz.permissions wordt gedeclareerd als common.type \"string\", maar setField() gaf onbewerkte booleans/getallen ongewijzigd door (de WAIP-server verzendt dit veld als een onbewerkte booleaanse vlag), dus de opgeslagen waarde kwam niet overeen met het gedeclareerde type. setField() zoekt nu het gedeclareerde type op en tekent altijd waarden voor string-getypeerde toestanden, ongeacht het binnenkomende JS-type.",
|
|
12
|
+
"fr": "Corrigé [E3005] : einsatz.permissions est déclaré comme common.type \"string\", mais setField() transmettait les booléens/nombres bruts sans modification (le serveur WAIP envoie ce champ comme un indicateur booléen brut), donc la valeur stockée ne correspondait pas au type déclaré. setField() recherche désormais le type déclaré et chaîne toujours les valeurs pour les états typés chaîne, quel que soit le type JS entrant.",
|
|
13
|
+
"it": "Risolto [E3005]: einsatz.permissions è dichiarato come common.type \"string\", ma setField() ha passato booleani/numeri grezzi senza modifiche (il server WAIP invia questo campo come flag booleano grezzo), quindi il val memorizzato non corrispondeva al tipo dichiarato. setField() ora cerca il tipo dichiarato e stringa sempre i valori per gli stati tipizzati come stringa, indipendentemente dal tipo JS in entrata.",
|
|
14
|
+
"es": "Corregido [E3005]: einsatz.permissions se declara como \"cadena\" common.type, pero setField() pasó números/booleanos sin cambios sin cambios (el servidor WAIP envía este campo como un indicador booleano sin formato), por lo que el valor almacenado no coincidía con el tipo declarado. setField() ahora busca el tipo declarado y siempre codifica valores para estados tipo cadena, independientemente del tipo JS entrante.",
|
|
15
|
+
"pl": "Naprawiono [E3005]: einsatz.permissions jest zadeklarowane jako common.type „string”, ale setField() przekazała surowe wartości logiczne/liczby bez zmian (serwer WAIP wysyła to pole jako surową flagę boolowską), więc przechowywana wartość nie pasowała do zadeklarowanego typu. setField() wyszukuje teraz zadeklarowany typ i zawsze stringuje wartości dla stanów typu string, niezależnie od przychodzącego typu JS.",
|
|
16
|
+
"uk": "Виправлено [E3005]: einsatz.permissions оголошено як common.type \"рядок\", але setField() передав необроблені логічні значення/числа без змін (сервер WAIP надсилає це поле як необроблений логічний прапор), тому збережене значення не відповідало заявленому типу. setField() тепер шукає оголошений тип і завжди перетворює значення в рядки для рядкових типів станів, незалежно від вхідного типу JS.",
|
|
17
|
+
"zh-cn": "已修复 [E3005]:einsatz.permissions 被声明为 common.type“string”,但 setField() 未更改地传递原始布尔值/数字(WAIP 服务器将此字段作为原始布尔标志发送),因此存储的 val 与声明的类型不匹配。 setField() 现在查找声明的类型,并始终对字符串类型状态的值进行字符串化,无论传入的 JS 类型如何。"
|
|
18
|
+
},
|
|
19
|
+
"0.7.11": {
|
|
20
|
+
"en": "Fixed [E3009] (57 findings): added the missing channel/folder objects (status, einsatz, einsatz.rueckmeldungAnzahl, debug, tts) that ioBroker requires for every state path segment. Fixed [E3005]/[E1009]: replaced the unsupported common.type 'mixed' on einsatz.permissions (now string) and status.registrationAccepted (now split into two booleans: registrationAccepted and the new registrationPending) - all found by the ioBroker.repositories object structure check.",
|
|
21
|
+
"de": "[E3009] behoben (57 Fundstellen): fehlende Channel-/Folder-Objekte (status, einsatz, einsatz.rueckmeldungAnzahl, debug, tts) ergänzt, die ioBroker für jedes Pfadsegment eines States benötigt. [E3005]/[E1009] behoben: den nicht unterstützten common.type 'mixed' bei einsatz.permissions (jetzt string) und status.registrationAccepted (jetzt aufgeteilt in zwei Booleans: registrationAccepted und den neuen registrationPending) ersetzt - alles gefunden beim Objektstruktur-Check von ioBroker.repositories.",
|
|
22
|
+
"ru": "Исправлено [E3009] (57 результатов): добавлены отсутствующие объекты канала/папки (status, einsatz, einsatz.rueckmeldungAnzahl, debug, tts), которые ioBroker требует для каждого сегмента пути к состоянию. Исправлено [E3005]/[E1009]: заменен неподдерживаемый common.type «mixed» на einsatz.permissions (теперь строка) и status.registrationAccepted (теперь разделен на два логических значения: RegistrationAccepted и новое RegistrationPending) – все они найдены при проверке структуры объекта ioBroker.repositories.",
|
|
23
|
+
"pt": "Corrigido [E3009] (57 descobertas): foram adicionados os objetos de canal/pasta ausentes (status, einsatz, einsatz.rueckmeldungAnzahl, debug, tts) que o ioBroker requer para cada segmento de caminho de estado. Corrigido [E3005]/[E1009]: substituiu o common.type 'mixed' não suportado em einsatz.permissions (agora string) e status.registrationAccepted (agora dividido em dois booleanos: RegistrationAccepted e o novo RegistrationPending) - todos encontrados pela verificação da estrutura do objeto ioBroker.repositories.",
|
|
24
|
+
"nl": "Opgelost [E3009] (57 bevindingen): de ontbrekende kanaal-/mapobjecten toegevoegd (status, einsatz, einsatz.rueckmeldungAnzahl, debug, tts) die ioBroker nodig heeft voor elk statuspadsegment. [E3005]/[E1009] opgelost: het niet-ondersteunde common.type 'gemengd' vervangen op einsatz.permissions (nu string) en status.registrationAccepted (nu opgesplitst in twee booleans: RegistrationAccepted en de nieuwe RegistrationPending) - allemaal gevonden door de controle van de objectstructuur van ioBroker.repositories.",
|
|
25
|
+
"fr": "Corrigé [E3009] (57 résultats) : ajout des objets canal/dossier manquants (status, einsatz, einsatz.rueckmeldungAnzahl, debug, tts) dont ioBroker a besoin pour chaque segment de chemin d'état. Corrigé [E3005]/[E1009] : remplacement du common.type 'mixed' non pris en charge par einsatz.permissions (maintenant chaîne) et status.registrationAccepted (maintenant divisé en deux booléens : RegistrationAccepted et le nouveau RegistrationPending) - tous trouvés par la vérification de la structure de l'objet ioBroker.repositories.",
|
|
26
|
+
"it": "Risolto [E3009] (57 risultati): aggiunti gli oggetti canale/cartella mancanti (status, einsatz, einsatz.rueckmeldungAnzahl, debug, tts) che ioBroker richiede per ogni segmento del percorso di stato. Risolto il problema [E3005]/[E1009]: sostituito il common.type 'mixed' non supportato su einsatz.permissions (ora stringa) e status.registrationAccepted (ora diviso in due booleani: RegistrationAccepted e il nuovo RegistrationPending) - tutti trovati dal controllo della struttura dell'oggetto ioBroker.repositories.",
|
|
27
|
+
"es": "Corregido [E3009] (57 hallazgos): se agregaron los objetos de canal/carpeta faltantes (status, einsatz, einsatz.rueckmeldungAnzahl, debug, tts) que ioBroker requiere para cada segmento de ruta de estado. Se corrigió [E3005]/[E1009]: reemplazó el common.type 'mixed' no admitido en einsatz.permissions (ahora cadena) y status.registrationAccepted (ahora dividido en dos booleanos: RegistrationAccepted y el nuevo RegistrationPending): todos encontrados mediante la verificación de la estructura del objeto ioBroker.repositories.",
|
|
28
|
+
"pl": "Naprawiono [E3009] (57 wyników): dodano brakujące obiekty kanału/folderu (status, einsatz, einsatz.rueckmeldungAnzahl, debug, tts), których ioBroker wymaga dla każdego segmentu ścieżki stanu. Naprawiono [E3005]/[E1009]: zastąpiono nieobsługiwany typ common.type „mixed” w einsatz.permissions (teraz ciąg znaków) i status.registrationAccepted (teraz podzielony na dwie wartości logiczne: RegistrationAccepted i nowa rejestracjaPending) – wszystkie znalezione podczas sprawdzania struktury obiektu ioBroker.repositories.",
|
|
29
|
+
"uk": "Виправлено [E3009] (57 знахідок): додано відсутні об’єкти каналу/папки (status, einsatz, einsatz.rueckmeldungAnzahl, debug, tts), які потрібні ioBroker для кожного сегмента шляху стану. Виправлено [E3005]/[E1009]: замінено непідтримуваний common.type «mixed» на einsatz.permissions (тепер рядок) і status.registrationAccepted (тепер розділений на два логічних значення: registrationAccepted і нове registrationPending) — усе це виявлено під час перевірки структури об’єкта ioBroker.repositories.",
|
|
30
|
+
"zh-cn": "修复了 [E3009](57 个结果):添加了 ioBroker 为每个状态路径段所需的缺失通道/文件夹对象(状态、einsatz、einsatz.rueckmeldungAnzahl、调试、tts)。修复了 [E3005]/[E1009]:替换了 einsatz.permissions(现在为字符串)和 status.registrationAccepted(现在分为两个布尔值:registrationAccepted 和新的 RegistrationPending)上不支持的 common.type 'mixed' - 所有这些都由 ioBroker.repositories 对象结构检查找到。"
|
|
31
|
+
},
|
|
32
|
+
"0.7.10": {
|
|
33
|
+
"en": "Fixed [S9508]: excluded CHANGELOG_OLD.md from the npm package (removed from package.json's files allowlist) - ioBroker shows the README via a GitHub link, not from the installed npm package, so the file remains fully readable on GitHub without needing to ship inside the tarball.",
|
|
34
|
+
"de": "[S9508] behoben: CHANGELOG_OLD.md aus dem npm-Paket ausgeschlossen (aus der files-Liste in package.json entfernt) - ioBroker zeigt das README über einen GitHub-Link an, nicht aus dem installierten npm-Paket, die Datei bleibt also auf GitHub weiterhin vollständig lesbar, ohne im Tarball enthalten sein zu müssen.",
|
|
35
|
+
"ru": "Исправлено [S9508]: CHANGELOG_OLD.md исключён из npm-пакета (удалён из списка files в package.json) - ioBroker показывает README по ссылке на GitHub, а не из установленного npm-пакета, поэтому файл остаётся полностью читаемым на GitHub без необходимости включать его в архив.",
|
|
36
|
+
"pt": "Corrigido [S9508]: CHANGELOG_OLD.md excluído do pacote npm (removido da lista files em package.json) - o ioBroker exibe o README via link do GitHub, não a partir do pacote npm instalado, então o arquivo permanece totalmente legível no GitHub sem precisar estar no tarball.",
|
|
37
|
+
"nl": "[S9508] opgelost: CHANGELOG_OLD.md uitgesloten van het npm-pakket (verwijderd uit de files-lijst in package.json) - ioBroker toont het README via een GitHub-link, niet vanuit het geïnstalleerde npm-pakket, dus het bestand blijft volledig leesbaar op GitHub zonder in de tarball te hoeven zitten.",
|
|
38
|
+
"fr": "Correction de [S9508] : exclusion de CHANGELOG_OLD.md du paquet npm (retiré de la liste files dans package.json) - ioBroker affiche le README via un lien GitHub, pas depuis le paquet npm installé, le fichier reste donc entièrement lisible sur GitHub sans devoir être inclus dans l'archive.",
|
|
39
|
+
"it": "Risolto [S9508]: escluso CHANGELOG_OLD.md dal pacchetto npm (rimosso dall'elenco files in package.json) - ioBroker mostra il README tramite un link GitHub, non dal pacchetto npm installato, quindi il file resta pienamente leggibile su GitHub senza dover essere incluso nel tarball.",
|
|
40
|
+
"es": "Se corrigió [S9508]: se excluyó CHANGELOG_OLD.md del paquete npm (eliminado de la lista files en package.json) - ioBroker muestra el README mediante un enlace de GitHub, no desde el paquete npm instalado, por lo que el archivo sigue siendo totalmente legible en GitHub sin necesidad de incluirlo en el tarball.",
|
|
41
|
+
"pl": "Naprawiono [S9508]: wykluczono CHANGELOG_OLD.md z pakietu npm (usunięto z listy files w package.json) - ioBroker wyświetla README przez link do GitHub, a nie z zainstalowanego pakietu npm, więc plik pozostaje w pełni czytelny na GitHub bez konieczności umieszczania go w tarballu.",
|
|
42
|
+
"uk": "Виправлено [S9508]: виключено CHANGELOG_OLD.md з npm-пакета (видалено зі списку files у package.json) - ioBroker показує README через посилання на GitHub, а не з встановленого npm-пакета, тож файл залишається повністю доступним для читання на GitHub без потреби включати його до архіву.",
|
|
43
|
+
"zh-cn": "修复了 [S9508]:已将 CHANGELOG_OLD.md 从 npm 包中排除(从 package.json 的 files 列表中移除)——ioBroker 通过 GitHub 链接显示 README,而不是从已安装的 npm 包中读取,因此该文件在 GitHub 上仍然完全可读,无需包含在发布包中。"
|
|
44
|
+
},
|
|
6
45
|
"0.7.9": {
|
|
7
46
|
"en": "Fixed [E5025]/[E5036]: installed the missing @alcalzone/release-script-plugin-license devDependency required for the 'license' plugin referenced in .releaseconfig.json.",
|
|
8
47
|
"de": "[E5025]/[E5036] behoben: fehlende Dev-Dependency @alcalzone/release-script-plugin-license nachinstalliert, die für das in .releaseconfig.json referenzierte 'license'-Plugin benötigt wird.",
|
|
@@ -80,19 +119,6 @@
|
|
|
80
119
|
"pl": "Naprawiono wszystkie ustalenia oficjalnego ioBroker Check and Service Bot: podniesiono minimalne wersje (engines.node >=20, @iobroker/adapter-core ^3.4.1, js-controller >=6.0.11, admin >=7.6.17), README podzielono na anglojęzyczny README.md i niemiecki README.de.md (checker wymaga README wyłącznie po angielsku), sekcję License przeniesiono na sam koniec, dodano brakujące atrybuty i18n/rozmiaru w jsonConfig.json, przełączono na prefiks node: dla wbudowanych require, usunięto zbędny .npmignore i dodano .commitinfo do .gitignore. Usunięto też osierocony wpis news 0.7.0 (nigdy faktycznie nie opublikowany w npm).",
|
|
81
120
|
"uk": "Виправлено всі зауваження офіційного ioBroker Check and Service Bot: підвищено мінімальні версії (engines.node >=20, @iobroker/adapter-core ^3.4.1, js-controller >=6.0.11, admin >=7.6.17), README розділено на англомовний README.md та німецький README.de.md (перевірник вимагає README лише англійською), розділ License переміщено в самий кінець, додано відсутні атрибути i18n/розміру в jsonConfig.json, вбудовані require переведено на префікс node:, видалено зайвий .npmignore та додано .commitinfo до .gitignore. Також видалено осиротілий запис новин 0.7.0 (ніколи не публікувався на npm).",
|
|
82
121
|
"zh-cn": "修复了官方 ioBroker Check and Service Bot 报告的所有问题:提升了最低版本要求(engines.node >=20、@iobroker/adapter-core ^3.4.1、js-controller >=6.0.11、admin >=7.6.17);将 README 拆分为纯英文的 README.md 和德文的 README.de.md(检查器要求 README 仅使用英文);将 License 部分移动到文件末尾;为 jsonConfig.json 添加了缺失的 i18n/尺寸属性;将内置模块的 require 改为使用 node: 前缀;移除了多余的 .npmignore;并在 .gitignore 中添加了 .commitinfo。同时移除了从未真正发布到 npm 的孤立新闻条目 0.7.0。"
|
|
83
|
-
},
|
|
84
|
-
"0.7.1": {
|
|
85
|
-
"en": "Added a License badge to the README.",
|
|
86
|
-
"de": "Lizenz-Badge im README ergänzt.",
|
|
87
|
-
"ru": "В README добавлен значок лицензии.",
|
|
88
|
-
"pt": "Adicionado um selo de licença ao README.",
|
|
89
|
-
"nl": "Licentiebadge toegevoegd aan de README.",
|
|
90
|
-
"fr": "Ajout d'un badge de licence au README.",
|
|
91
|
-
"it": "Aggiunto un badge di licenza al README.",
|
|
92
|
-
"es": "Se añadió una insignia de licencia al README.",
|
|
93
|
-
"pl": "Dodano odznakę licencji do README.",
|
|
94
|
-
"uk": "До README додано значок ліцензії.",
|
|
95
|
-
"zh-cn": "已在 README 中添加许可证徽章。"
|
|
96
122
|
}
|
|
97
123
|
},
|
|
98
124
|
"titleLang": {
|
package/main.js
CHANGED
|
@@ -95,6 +95,17 @@ const OBSOLETE_OBJECT_IDS = [
|
|
|
95
95
|
'routen.count',
|
|
96
96
|
];
|
|
97
97
|
|
|
98
|
+
// Übergeordnete Channel/Folder-Objekte, die für jeden State-Zweig existieren müssen.
|
|
99
|
+
// ioBroker verlangt ein eigenes Objekt für jedes Segment eines State-Pfads - reine
|
|
100
|
+
// State-Blätter (siehe STATE_DEFS) reichen dafür nicht aus.
|
|
101
|
+
const CHANNEL_DEFS = [
|
|
102
|
+
{ id: 'status', type: 'channel', name: 'Verbindungs- und Registrierungsstatus' },
|
|
103
|
+
{ id: 'einsatz', type: 'channel', name: 'Aktueller Einsatz' },
|
|
104
|
+
{ id: 'einsatz.rueckmeldungAnzahl', type: 'folder', name: 'Rückmeldungen nach Funktion' },
|
|
105
|
+
{ id: 'debug', type: 'channel', name: 'Diagnose- und Debug-Informationen' },
|
|
106
|
+
{ id: 'tts', type: 'channel', name: 'TTS-Ansagen' },
|
|
107
|
+
];
|
|
108
|
+
|
|
98
109
|
// Definition aller States, die beim Start sichergestellt werden.
|
|
99
110
|
const STATE_DEFS = [
|
|
100
111
|
{
|
|
@@ -122,9 +133,17 @@ const STATE_DEFS = [
|
|
|
122
133
|
},
|
|
123
134
|
{
|
|
124
135
|
id: 'status.registrationAccepted',
|
|
125
|
-
type: '
|
|
136
|
+
type: 'boolean',
|
|
137
|
+
role: 'indicator',
|
|
138
|
+
name: 'Registrierung bestätigt',
|
|
139
|
+
def: false,
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
id: 'status.registrationPending',
|
|
143
|
+
type: 'boolean',
|
|
126
144
|
role: 'indicator',
|
|
127
|
-
name: 'Registrierung
|
|
145
|
+
name: 'Registrierung angefragt, Antwort vom Server steht noch aus',
|
|
146
|
+
def: false,
|
|
128
147
|
},
|
|
129
148
|
{ id: 'debug.lastEvent', type: 'string', role: 'json', name: 'Letztes empfangenes Socket-Event' },
|
|
130
149
|
{ id: 'debug.normalizedPosition', type: 'string', role: 'json', name: 'Letzte normalisierte Position' },
|
|
@@ -162,7 +181,7 @@ const STATE_DEFS = [
|
|
|
162
181
|
{ id: 'einsatz.ablaufzeit', type: 'string', role: 'date', name: 'Ablaufzeit' },
|
|
163
182
|
{ id: 'einsatz.einsatznummer', type: 'string', role: 'text', name: 'Einsatznummer' },
|
|
164
183
|
{ id: 'einsatz.sondersignal', type: 'number', role: 'value', name: 'Sondersignal', def: 0 },
|
|
165
|
-
{ id: 'einsatz.permissions', type: '
|
|
184
|
+
{ id: 'einsatz.permissions', type: 'string', role: 'json', name: 'Berechtigungs-Flag der Registrierung' },
|
|
166
185
|
{ id: 'einsatz.latitude', type: 'number', role: 'value.gps.latitude', name: 'Breitengrad' },
|
|
167
186
|
{ id: 'einsatz.longitude', type: 'number', role: 'value.gps.longitude', name: 'Längengrad' },
|
|
168
187
|
// verschachteltes Gesamtobjekt + Historie
|
|
@@ -236,6 +255,8 @@ const STATE_DEFS = [
|
|
|
236
255
|
{ id: 'tts.lastTimestamp', type: 'string', role: 'date', name: 'Zeitstempel letzte TTS-Ansage' },
|
|
237
256
|
{ id: 'tts.history10', type: 'string', role: 'json', name: `Letzte ${HISTORY_SIZE} TTS-Ansagen (JSON-Array)` },
|
|
238
257
|
];
|
|
258
|
+
// Schneller Zugriff von setField() auf den deklarierten Typ eines States (siehe dort).
|
|
259
|
+
const STATE_DEF_BY_ID = new Map(STATE_DEFS.map(def => [def.id, def]));
|
|
239
260
|
|
|
240
261
|
/* Prüft ob eine monitorID gültig ist (nicht-leer). */
|
|
241
262
|
function isValidMonitor(mon) {
|
|
@@ -572,6 +593,13 @@ class WaipWeb extends utils.Adapter {
|
|
|
572
593
|
}
|
|
573
594
|
|
|
574
595
|
async initObjects() {
|
|
596
|
+
for (const def of CHANNEL_DEFS) {
|
|
597
|
+
await this.setObjectNotExistsAsync(def.id, {
|
|
598
|
+
type: def.type,
|
|
599
|
+
common: { name: def.name },
|
|
600
|
+
native: {},
|
|
601
|
+
});
|
|
602
|
+
}
|
|
575
603
|
for (const def of STATE_DEFS) {
|
|
576
604
|
await this.setObjectNotExistsAsync(def.id, {
|
|
577
605
|
type: 'state',
|
|
@@ -934,7 +962,16 @@ class WaipWeb extends utils.Adapter {
|
|
|
934
962
|
async setField(path, val) {
|
|
935
963
|
try {
|
|
936
964
|
let toSet;
|
|
937
|
-
|
|
965
|
+
const def = STATE_DEF_BY_ID.get(path);
|
|
966
|
+
if (val === null) {
|
|
967
|
+
toSet = null;
|
|
968
|
+
} else if (def && def.type === 'string') {
|
|
969
|
+
// Der State ist als "string" deklariert (z.B. role "json") - unabhängig vom
|
|
970
|
+
// tatsächlichen JS-Typ der Serverantwort (etwa ein rohes Boolean/Number-Flag
|
|
971
|
+
// wie bei einsatz.permissions) muss "val" den deklarierten Typ einhalten,
|
|
972
|
+
// sonst schlägt die ioBroker-Objektstrukturprüfung fehl (E3005).
|
|
973
|
+
toSet = typeof val === 'string' ? val : JSON.stringify(val);
|
|
974
|
+
} else if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean') {
|
|
938
975
|
toSet = val;
|
|
939
976
|
} else {
|
|
940
977
|
toSet = JSON.stringify(val);
|
|
@@ -1028,6 +1065,7 @@ class WaipWeb extends utils.Adapter {
|
|
|
1028
1065
|
this.registrationTimer = null;
|
|
1029
1066
|
}
|
|
1030
1067
|
this.registrationPending = false;
|
|
1068
|
+
this.setState('status.registrationPending', false, true);
|
|
1031
1069
|
}
|
|
1032
1070
|
|
|
1033
1071
|
try {
|
|
@@ -1448,6 +1486,7 @@ class WaipWeb extends utils.Adapter {
|
|
|
1448
1486
|
this.socket = null;
|
|
1449
1487
|
this.connecting = false;
|
|
1450
1488
|
this.registrationPending = false;
|
|
1489
|
+
this.setState('status.registrationPending', false, true);
|
|
1451
1490
|
if (this.registrationTimer) {
|
|
1452
1491
|
this.clearTimeout(this.registrationTimer);
|
|
1453
1492
|
this.registrationTimer = null;
|
|
@@ -1512,13 +1551,15 @@ class WaipWeb extends utils.Adapter {
|
|
|
1512
1551
|
// Gecachter Anzeigename (siehe refreshMonitorName) - keine erneute HTTP-Abfrage
|
|
1513
1552
|
// bei jedem (Re-)Connect, ist ggf. beim allerersten Connect noch null.
|
|
1514
1553
|
this.setState('status.registeredMonitorName', this.monitorName, true);
|
|
1515
|
-
this.setState('status.registrationAccepted',
|
|
1554
|
+
this.setState('status.registrationAccepted', false, true);
|
|
1555
|
+
this.setState('status.registrationPending', true, true);
|
|
1516
1556
|
if (this.registrationTimer) {
|
|
1517
1557
|
this.clearTimeout(this.registrationTimer);
|
|
1518
1558
|
this.registrationTimer = null;
|
|
1519
1559
|
}
|
|
1520
1560
|
this.registrationTimer = this.setTimeout(async () => {
|
|
1521
1561
|
this.registrationPending = false;
|
|
1562
|
+
this.setState('status.registrationPending', false, true);
|
|
1522
1563
|
const accState = await this.getStateAsync('status.registrationAccepted');
|
|
1523
1564
|
const acc = accState ? accState.val : null;
|
|
1524
1565
|
if (acc !== true) {
|
|
@@ -1545,6 +1586,7 @@ class WaipWeb extends utils.Adapter {
|
|
|
1545
1586
|
this.logDisconnect(`Socket disconnected: ${reason}`);
|
|
1546
1587
|
this.registrationPending = false;
|
|
1547
1588
|
this.setState('status.registrationAccepted', false, true);
|
|
1589
|
+
this.setState('status.registrationPending', false, true);
|
|
1548
1590
|
if (this.registrationTimer) {
|
|
1549
1591
|
this.clearTimeout(this.registrationTimer);
|
|
1550
1592
|
this.registrationTimer = null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.waip-web",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.12",
|
|
4
4
|
"description": "Wachalarm IP-Web (WAIP) Adapter für ioBroker – bindet Alarmierungen, Rückmeldungen, Routen und TTS-Ansagen per Socket.IO an ioBroker an.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "rnc11",
|
|
@@ -33,8 +33,7 @@
|
|
|
33
33
|
"io-package.json",
|
|
34
34
|
"main.js",
|
|
35
35
|
"LICENSE",
|
|
36
|
-
"README.de.md"
|
|
37
|
-
"CHANGELOG_OLD.md"
|
|
36
|
+
"README.de.md"
|
|
38
37
|
],
|
|
39
38
|
"dependencies": {
|
|
40
39
|
"@iobroker/adapter-core": "^3.4.1",
|
package/CHANGELOG_OLD.md
DELETED
|
@@ -1,410 +0,0 @@
|
|
|
1
|
-
# Older changes
|
|
2
|
-
|
|
3
|
-
### 0.7.4 (2026-08-21)
|
|
4
|
-
|
|
5
|
-
- Bumped the `ioBroker/testing-action-check` GitHub Action used by the
|
|
6
|
-
`check-and-lint` CI job from `@v1` to `@v2` (via a
|
|
7
|
-
[Dependabot](https://github.com/rnc11/ioBroker.waip-web/pull/10) PR -
|
|
8
|
-
the first one filed by the `.github/dependabot.yml` added in 0.7.3).
|
|
9
|
-
Purely additive on the action's side (adds an optional `test-command:
|
|
10
|
-
'false'` flag), no behavior change for us.
|
|
11
|
-
|
|
12
|
-
### 0.7.3 (2026-08-21)
|
|
13
|
-
|
|
14
|
-
*(Never tagged/published to npm - superseded directly by 0.7.4; kept
|
|
15
|
-
here for a complete history of what was worked on.)*
|
|
16
|
-
|
|
17
|
-
- Addressed further findings from the official ioBroker Check and
|
|
18
|
-
Service Bot (which re-scans the repository after every push):
|
|
19
|
-
- Removed the deprecated `common.materialize` field from
|
|
20
|
-
`io-package.json` (superseded by `common.adminUI.config`)
|
|
21
|
-
- Raised `engines.node` to `>=22` and dropped Node.js 20 (reached
|
|
22
|
-
End of Life on 2026-04-30) from the CI test matrix
|
|
23
|
-
- Raised the `admin` dependency to `>=7.8.23`
|
|
24
|
-
- Moved the `check-and-lint` CI job to Node 24.x
|
|
25
|
-
- Added `.github/dependabot.yml` for automated dependency updates
|
|
26
|
-
(weekly `npm`/`github-actions` checks)
|
|
27
|
-
|
|
28
|
-
### 0.7.2 (2026-08-21)
|
|
29
|
-
|
|
30
|
-
- README is now English-only (per the official ioBroker adapter checker,
|
|
31
|
-
which flags mixed-language READMEs); the German version moved to a
|
|
32
|
-
separate [README.de.md](README.de.md), linked near the top.
|
|
33
|
-
- Moved the License section to the very end of the file (was before the
|
|
34
|
-
Changelog) - the checker requires License to be the last section.
|
|
35
|
-
- `package.json`: raised `engines.node` to `>=20` and `@iobroker/adapter-core`
|
|
36
|
-
to `^3.4.1`.
|
|
37
|
-
- `io-package.json`: raised the `js-controller` dependency to `>=6.0.11`
|
|
38
|
-
and the `admin` dependency to `>=7.6.17`; removed the `0.7.0` news
|
|
39
|
-
entry (never published to npm, only `0.7.1` and later actually are).
|
|
40
|
-
- `admin/jsonConfig.json`: added the root `"i18n": true` attribute (now
|
|
41
|
-
required since the fields resolve translations from `admin/i18n/*.json`)
|
|
42
|
-
and explicit `xs`/`xl` grid sizes on all fields.
|
|
43
|
-
- `main.js`: `require('http')`/`require('https')`/`require('url')` now
|
|
44
|
-
use the `node:` prefix for Node's built-in modules.
|
|
45
|
-
- `.gitignore`: added `.commitinfo`.
|
|
46
|
-
- Removed `.npmignore` - redundant with the `files` allowlist already
|
|
47
|
-
used in `package.json`.
|
|
48
|
-
- CI: `adapter-tests` now explicitly declares `needs: check-and-lint`;
|
|
49
|
-
raised the Node.js version used by the `check-and-lint` and `deploy`
|
|
50
|
-
jobs.
|
|
51
|
-
|
|
52
|
-
### 0.7.1 (2026-08-21)
|
|
53
|
-
|
|
54
|
-
- Added a License badge to the README.
|
|
55
|
-
|
|
56
|
-
### 0.7.0 (2026-08-21)
|
|
57
|
-
|
|
58
|
-
- Prepared the admin UI for community translation via
|
|
59
|
-
[ioBroker's Weblate](https://weblate.iobroker.net/engage/adapters/):
|
|
60
|
-
added `@iobroker/adapter-dev` as a dev dependency (`npm run
|
|
61
|
-
translate`), converted `admin/jsonConfig.json`'s `label`/`help` fields
|
|
62
|
-
from inline `en`/`de` objects to plain English keys, and added
|
|
63
|
-
`admin/i18n/{en,de,ru,pt,nl,fr,it,es,pl,uk,zh-cn}.json` (German
|
|
64
|
-
curated manually, the rest auto-translated via the official
|
|
65
|
-
`translate-adapter` tool — the same tool that already maintains the
|
|
66
|
-
`io-package.json` translations). Added a "Translation status" badge to
|
|
67
|
-
the README; like the "installed"/"stable" badges, it only shows real
|
|
68
|
-
data once the adapter is actually registered as a component on
|
|
69
|
-
weblate.iobroker.net (not done yet).
|
|
70
|
-
|
|
71
|
-
### 0.6.11 (2026-08-21)
|
|
72
|
-
|
|
73
|
-
- README: logo now shown enlarged (115×115) via a new
|
|
74
|
-
`admin/waip-web-logo.png`, nearest-neighbor-scaled from the 32×32
|
|
75
|
-
source icon for a crisp (if visibly pixelated) result instead of a
|
|
76
|
-
blurry interpolated one — no higher-resolution source exists anywhere
|
|
77
|
-
in the WAIP-Web ecosystem (checked the Lausitz instance and the
|
|
78
|
-
upstream project, both use the same 32×32 favicon). The actual
|
|
79
|
-
ioBroker adapter icon (`admin/waip-web.png`, referenced from
|
|
80
|
-
`io-package.json`) is unchanged.
|
|
81
|
-
- Simplified the README title back to "ioBroker.waip-web".
|
|
82
|
-
|
|
83
|
-
### 0.6.10 (2026-08-21)
|
|
84
|
-
|
|
85
|
-
- Added the adapter logo and npm/installation badges (NPM version,
|
|
86
|
-
downloads, installed, stable) to the README, matching standard
|
|
87
|
-
ioBroker adapter conventions. The "installed"/"stable" badges won't
|
|
88
|
-
show meaningful data until the adapter is listed in the official
|
|
89
|
-
[ioBroker.repositories](https://github.com/ioBroker/ioBroker.repositories)
|
|
90
|
-
("latest" repository PR pending), but will populate automatically once
|
|
91
|
-
it is.
|
|
92
|
-
|
|
93
|
-
### 0.6.9 (2026-08-21)
|
|
94
|
-
|
|
95
|
-
- Fixed adapter-checker finding **[E254]**: removed `common.news` entries
|
|
96
|
-
for versions that were never actually published to npm (`0.6.1`–`0.6.5`,
|
|
97
|
-
`0.6.7` were only version bumps in git/GitHub, without a matching
|
|
98
|
-
tagged npm release). `common.news` now only lists versions that really
|
|
99
|
-
exist on the npm registry (`0.6.6`, `0.6.8`); the full history remains
|
|
100
|
-
in this changelog regardless of what was actually published.
|
|
101
|
-
|
|
102
|
-
### 0.6.8 (2026-08-21)
|
|
103
|
-
|
|
104
|
-
- Renamed the README title to "ioBroker-Adapter (ioBroker.waip-web)".
|
|
105
|
-
- This release doubles as the first end-to-end test of the automatic
|
|
106
|
-
npm publish via Trusted Publishing introduced in 0.6.7.
|
|
107
|
-
|
|
108
|
-
### 0.6.7 (2026-08-21)
|
|
109
|
-
|
|
110
|
-
- Enabled automatic npm publishing: the `deploy` job in
|
|
111
|
-
`.github/workflows/test-and-release.yml` is no longer commented out
|
|
112
|
-
and now runs on every version tag (`vX.Y.Z`), publishing to npm via
|
|
113
|
-
[Trusted Publishing](https://docs.npmjs.com/trusted-publishers) (OIDC,
|
|
114
|
-
no `NPM_TOKEN` secret needed).
|
|
115
|
-
|
|
116
|
-
### 0.6.6 (2026-08-21)
|
|
117
|
-
|
|
118
|
-
- Added `.gitattributes` `eol=lf` so all contributors get consistent LF
|
|
119
|
-
line endings regardless of their local git `autocrlf` setting
|
|
120
|
-
(previously caused hundreds of spurious local lint errors on Windows
|
|
121
|
-
without affecting CI, since CI checkouts weren't affected).
|
|
122
|
-
- Added `package-lock.json` and switched CI to the default `npm ci` with
|
|
123
|
-
caching instead of `npm install` without caching, now that a lockfile
|
|
124
|
-
exists.
|
|
125
|
-
|
|
126
|
-
### 0.6.5 (2026-08-21)
|
|
127
|
-
|
|
128
|
-
- Fixed all issues reported by the official [ioBroker adapter checker](https://adapter-check.iobroker.in/):
|
|
129
|
-
- Bumped the required `js-controller` dependency to `>=5.0.19` and `@iobroker/adapter-core` to `^3.2.2`
|
|
130
|
-
- Replaced the deprecated `common.license`/`common.title`/`common.main` fields with `common.licenseInformation`/`common.titleLang`; `common.main` is redundant with `package.json`'s `main` field
|
|
131
|
-
- Added the required `common.tier` (`2` - external/cloud data source)
|
|
132
|
-
- Added translations of `titleLang`, `desc` and the kept `common.news` entries into all 10 additional ioBroker admin languages (ru, pt, nl, fr, it, es, pl, uk, zh-cn)
|
|
133
|
-
- Trimmed `common.news` to the 7 most recent entries, as recommended (the repository builder truncates there anyway); the full history stays in this changelog
|
|
134
|
-
|
|
135
|
-
### 0.6.4 (2026-08-21)
|
|
136
|
-
|
|
137
|
-
- New state `status.registeredMonitorName` shows the registered monitor
|
|
138
|
-
as text without the ID (e.g. "Leitstelle: Lausitz"), resolved once at
|
|
139
|
-
startup from the same `/waip/` overview page as the admin dropdown.
|
|
140
|
-
`status.registeredMonitor` is unchanged and keeps showing the ID.
|
|
141
|
-
|
|
142
|
-
### 0.6.3 (2026-08-21)
|
|
143
|
-
|
|
144
|
-
- Admin UI: the Monitor ID field is now always full-width, placed on its
|
|
145
|
-
own row below the WAIP server URL, so the (sometimes long) dropdown
|
|
146
|
-
entries have enough room to display without being cramped.
|
|
147
|
-
|
|
148
|
-
### 0.6.2 (2026-08-21)
|
|
149
|
-
|
|
150
|
-
- Monitor dropdown entries are now sorted by numeric monitor ID instead
|
|
151
|
-
of following the source page's (per-category) order.
|
|
152
|
-
|
|
153
|
-
### 0.6.1 (2026-08-21)
|
|
154
|
-
|
|
155
|
-
- Monitor dropdown entries now start with the actual monitor ID, e.g.
|
|
156
|
-
"4 - Leitstelle: Lausitz", so the numeric ID stays visible even after
|
|
157
|
-
a monitor has been selected.
|
|
158
|
-
|
|
159
|
-
### 0.6.0 (2026-08-21)
|
|
160
|
-
|
|
161
|
-
- **Admin UI:** Monitor ID is now a live dropdown (`selectSendTo`) instead
|
|
162
|
-
of a plain text field. The adapter fetches the configured server's
|
|
163
|
-
public `/waip/` overview page on demand and offers every monitor it
|
|
164
|
-
finds there, grouped by Leitstelle/Kreis/Träger/Wache, with "Alle
|
|
165
|
-
Wachalarme" (ID `0`) as an explicit first option. Manual entry remains
|
|
166
|
-
available if the server can't be reached or uses a different page
|
|
167
|
-
layout, so existing configurations keep working unchanged.
|
|
168
|
-
- Removed the static "session keepalive interval" info text from the
|
|
169
|
-
admin UI (the behavior itself is unchanged).
|
|
170
|
-
- Added help text to the "Registration timeout" and "Reconnect delay"
|
|
171
|
-
fields.
|
|
172
|
-
|
|
173
|
-
### 0.5.1 (2026-08-21)
|
|
174
|
-
|
|
175
|
-
- **Logging:** Reclassified log levels so `warn` becomes a reliable signal
|
|
176
|
-
again. Session-cookie rotation, the known "Fehler beim Erneuern der
|
|
177
|
-
Session" server message, and detected server restarts are now logged
|
|
178
|
-
as `info` instead of `warn`, since they're part of this instance's
|
|
179
|
-
normal, self-healing ~10-minute session cycle. Events discarded for a
|
|
180
|
-
different monitor ID are now `info` (frequency remains tracked via
|
|
181
|
-
`debug.ignoredCount`). Failures that only affect internal housekeeping
|
|
182
|
-
(`debug.monitorAudit`, socket cleanup) are now `debug`. A duplicate
|
|
183
|
-
`connect_error` log line (logged once at `warn`, once at `info`) was
|
|
184
|
-
removed. Introduced `error` level for cases where an incident,
|
|
185
|
-
feedback, route or TTS event genuinely failed to be processed (actual
|
|
186
|
-
data loss), so these now stand out instead of being buried among
|
|
187
|
-
routine `warn` noise.
|
|
188
|
-
|
|
189
|
-
### 0.5.0 (2026-08-20)
|
|
190
|
-
|
|
191
|
-
- **Behavior change:** On `io.standby`, all `einsatz.*` states (including
|
|
192
|
-
`einsatz.json` and all counters) are now cleared instead of leaving the
|
|
193
|
-
finished incident's data in place – matching the official frontend,
|
|
194
|
-
which also clears keyword, location data etc. on standby.
|
|
195
|
-
`status.alarmAktiv` is therefore now a reliable switch for whether
|
|
196
|
-
`einsatz.*` currently holds real live data. The finished incident
|
|
197
|
-
remains fully available via `einsatz.history10` (archived there first).
|
|
198
|
-
|
|
199
|
-
### 0.4.9 (2026-08-20)
|
|
200
|
-
|
|
201
|
-
- **CI fix:** Reverted a self-introduced, unnecessary line wrap in
|
|
202
|
-
`connect()` (engine-packet preview) – `prettier/prettier` flagged it as
|
|
203
|
-
superfluous; the line actually fits on one line within the configured
|
|
204
|
-
print width.
|
|
205
|
-
|
|
206
|
-
### 0.4.8 (2026-08-20)
|
|
207
|
-
|
|
208
|
-
- **CI fix:** Fixed the final 16 lint errors – this time the complete,
|
|
209
|
-
non-truncated error list including the exact desired replacement text
|
|
210
|
-
was available, so every location could be corrected precisely 1:1
|
|
211
|
-
(line wraps for overly long calls/objects, one `prefer-template`
|
|
212
|
-
case). Lint should now be fully green.
|
|
213
|
-
|
|
214
|
-
### 0.4.7 (2026-08-20)
|
|
215
|
-
|
|
216
|
-
- **CI fix:** Fixed the remaining lint errors in `main.js` – consistently
|
|
217
|
-
applied `curly` (braces even for single-line `if`/`for`),
|
|
218
|
-
`no-unused-vars` for empty `catch` blocks (`catch (e) {}` → `catch {}`
|
|
219
|
-
where `e` isn't used), and `arrowParens: avoid` (removed parentheses
|
|
220
|
-
around single-parameter arrow functions). Purely mechanical code-style
|
|
221
|
-
fixes, no behavior change.
|
|
222
|
-
|
|
223
|
-
### 0.4.6 (2026-08-20)
|
|
224
|
-
|
|
225
|
-
- **CI fix:** The `lint` step failed with hundreds of formatting errors
|
|
226
|
-
(e.g. "Replace 'x' with "x""). Cause: `@iobroker/eslint-config`
|
|
227
|
-
requires its own `prettier.config.mjs` in addition to
|
|
228
|
-
`eslint.config.mjs`, re-exporting the ioBroker formatting style
|
|
229
|
-
(single quotes, 4-space indentation, `trailingComma: 'all'`) – without
|
|
230
|
-
it, Prettier fell back to its own defaults (double quotes). File added.
|
|
231
|
-
|
|
232
|
-
### 0.4.5 (2026-08-20)
|
|
233
|
-
|
|
234
|
-
- **CI fix:** The first pipeline run failed with "Dependencies lock file
|
|
235
|
-
is not found". Cause: `actions/setup-node`'s built-in npm caching
|
|
236
|
-
needs a `package-lock.json` for its cache key, independent of the
|
|
237
|
-
install command used. Since none is committed to the repo yet,
|
|
238
|
-
`package-cache: 'false'` is now set on both jobs.
|
|
239
|
-
|
|
240
|
-
### 0.4.4 (2026-08-20)
|
|
241
|
-
|
|
242
|
-
- Set up the CI pipeline (`.github/workflows/test-and-release.yml`),
|
|
243
|
-
following the standard pattern of the official
|
|
244
|
-
`@iobroker/create-adapter` template: a `check-and-lint` job (ESLint
|
|
245
|
-
via `@iobroker/eslint-config`) and an `adapter-tests` matrix (Node
|
|
246
|
-
20/22/24 × Ubuntu/Windows/macOS) via the central
|
|
247
|
-
`testing-action-check`/`testing-action-adapter` actions. Added
|
|
248
|
-
`test/package.js` and `test/integration.js` (`@iobroker/testing`)
|
|
249
|
-
plus `eslint.config.mjs` for this; bumped `@iobroker/testing` to
|
|
250
|
-
`^5.2.2`. Since no `package-lock.json` is committed yet, the pipeline
|
|
251
|
-
uses `npm install` instead of `npm ci`.
|
|
252
|
-
- Raised `engines.node` in `package.json` to `>=18` (matching the tested
|
|
253
|
-
Node versions and `@iobroker/testing` 5.x's requirements)
|
|
254
|
-
- A `deploy` job (automatic npm publishing) is prepared but commented
|
|
255
|
-
out until npm Trusted Publishing is set up
|
|
256
|
-
|
|
257
|
-
### 0.4.3 (2026-08-20)
|
|
258
|
-
|
|
259
|
-
- **Bugfix:** `einsatz.id` and `einsatz.sondersignal` were declared as
|
|
260
|
-
`string`, but the server actually sends them as numbers
|
|
261
|
-
(`sondersignal`, per `client_waip.js`: `switch (data.sondersignal) {
|
|
262
|
-
case 1: ... }`) – ioBroker therefore logged a type warning on every
|
|
263
|
-
incident. Both states are now declared as `number`. Existing objects
|
|
264
|
-
with the old (wrong) type are automatically recreated on the next
|
|
265
|
-
adapter start (`migrateObjectTypes()`, generic for future type
|
|
266
|
-
corrections).
|
|
267
|
-
|
|
268
|
-
### 0.4.2 (2026-08-20)
|
|
269
|
-
|
|
270
|
-
- Removed the "Session keepalive interval – upper bound" config field
|
|
271
|
-
again: the official `/js/session_keepalive.js` on the site hard-codes
|
|
272
|
-
this upper bound at 5 minutes and doesn't make it configurable. Having
|
|
273
|
-
an admin field for it wrongly suggested a fixed interval, even though
|
|
274
|
-
the actual renewal has long been fully automatic (see 0.4.1). The
|
|
275
|
-
upper bound is now likewise fixed at 5 minutes.
|
|
276
|
-
|
|
277
|
-
### 0.4.1 (2026-08-20)
|
|
278
|
-
|
|
279
|
-
- **Robustness:** The session keepalive interval is now adaptive instead
|
|
280
|
-
of a fixed assumption. WAIP-Web's source code (`server/app_cfg.js`)
|
|
281
|
-
shows that the session cookie's lifetime is configurable per instance
|
|
282
|
-
via an environment variable (server default: 60s instead of the
|
|
283
|
-
previously assumed 10 minutes) – the adapter now derives the renewal
|
|
284
|
-
interval from the expiry time actually reported by the server
|
|
285
|
-
(matching `/js/session_keepalive.js` on the site: 80% of the observed
|
|
286
|
-
lifetime, min. 55s, at most the configured upper bound). The "Session
|
|
287
|
-
keepalive interval" config option is accordingly now an upper bound
|
|
288
|
-
rather than a fixed interval.
|
|
289
|
-
- Corrected a comment about `io.version`/server restarts: per
|
|
290
|
-
`server/auth.js`, WAIP-Web stores sessions persistently (SQLite), not
|
|
291
|
-
in-memory – a restart therefore normally doesn't clear them. The
|
|
292
|
-
proactive session refresh + reconnect on server restart remains as a
|
|
293
|
-
general safeguard, only the previous justification was inaccurate.
|
|
294
|
-
|
|
295
|
-
### 0.4.0 (2026-08-20)
|
|
296
|
-
|
|
297
|
-
- **Restructured the object tree:** Feedback and routes are 1:n lists
|
|
298
|
-
per incident and now live as nested JSON arrays inside one overall
|
|
299
|
-
object `einsatz.json` (including `emAlarmiert[]`, `emWeitere[]`,
|
|
300
|
-
`routen[]`, `rueckmeldungen[]`) instead of several loose states.
|
|
301
|
-
- `einsatz.history10` replaces `history.last10` – now with the **full**
|
|
302
|
-
nested incident object per entry instead of just 6 reduced fields.
|
|
303
|
-
- New counters directly under `einsatz.*`: `routenGesamt`,
|
|
304
|
-
`rueckmeldungGesamt`, `rueckmeldungAnzahl.{ek,gf,zf,vf,agt,fzf,ma,med}`
|
|
305
|
-
(replaces `rueckmeldung.counts.*`).
|
|
306
|
-
- `einsatz.latitude`/`einsatz.longitude` replace
|
|
307
|
-
`geo.latitude`/`geo.longitude` (position is additionally available in
|
|
308
|
-
`einsatz.json.position`).
|
|
309
|
-
- New state `tts.history10` (last 10 TTS announcements).
|
|
310
|
-
- **Removed:** the entire `vis.*` channel, `json.raw`, `json.einsatz`,
|
|
311
|
-
`geo.position`, `rueckmeldung.last.json`, `routen.json`,
|
|
312
|
-
`routen.count`, `einsatz.emWeitere` (now part of `einsatz.json`).
|
|
313
|
-
- The adapter automatically removes all obsolete objects from the
|
|
314
|
-
previous structure on its first start after the update
|
|
315
|
-
(`cleanupObsoleteObjects()`).
|
|
316
|
-
|
|
317
|
-
### 0.3.4 (2026-08-20)
|
|
318
|
-
|
|
319
|
-
- All state names (`common.name`) consistently switched to German
|
|
320
|
-
(previously a mix of English and German) – the adapter only makes
|
|
321
|
-
sense for German-speaking users anyway
|
|
322
|
-
|
|
323
|
-
### 0.3.3 (2026-08-20)
|
|
324
|
-
|
|
325
|
-
- **Bugfix (potential data loss):** For a specific monitor ID (≠ `0`),
|
|
326
|
-
events were silently discarded ("unknownMonitor") after the
|
|
327
|
-
registration timeout elapsed, because real WAIP payloads, per
|
|
328
|
-
`client_waip.js`, **never** contain a monitor-identifying field – that
|
|
329
|
-
assignment happens entirely server-side via Socket.IO rooms. As a
|
|
330
|
-
result, alarm delivery could stop completely after 10s even though
|
|
331
|
-
the connection was technically up. `status.registrationAccepted`
|
|
332
|
-
stayed permanently `false` for the same reason, even for the global
|
|
333
|
-
monitor (`0`). Now any received event confirms the registration;
|
|
334
|
-
events are only discarded if a payload explicitly names a different
|
|
335
|
-
monitor ID.
|
|
336
|
-
|
|
337
|
-
### 0.3.2 (2026-08-20)
|
|
338
|
-
|
|
339
|
-
- Also switched the "Registration timeout" and "Reconnect delay" config
|
|
340
|
-
fields from milliseconds to seconds (`registrationTimeout` →
|
|
341
|
-
`registrationTimeoutSec`, default `10`; `reconnectDelay` →
|
|
342
|
-
`reconnectDelaySec`, default `5`). Existing instances without a newly
|
|
343
|
-
set value automatically use the defaults.
|
|
344
|
-
|
|
345
|
-
### 0.3.1 (2026-08-20)
|
|
346
|
-
|
|
347
|
-
- Switched the "Session keepalive interval" config field from
|
|
348
|
-
milliseconds to seconds (`sessionKeepaliveInterval` →
|
|
349
|
-
`sessionKeepaliveIntervalSec`, still defaulting to 5 min = `300`).
|
|
350
|
-
Existing instances without a newly set value automatically use the
|
|
351
|
-
default.
|
|
352
|
-
|
|
353
|
-
### 0.3.0 (2026-08-20)
|
|
354
|
-
|
|
355
|
-
- **Bugfix:** `wgs84_x`/`wgs84_y` were swapped (latitude/longitude). Per
|
|
356
|
-
the official web frontend (`client_waip.js`), `wgs84_x = latitude,
|
|
357
|
-
wgs84_y = longitude` – contrary to the usual GIS convention.
|
|
358
|
-
`geo.latitude`/`geo.longitude` were therefore swapped for directly
|
|
359
|
-
transmitted coordinates (not the GeoJSON fallback path).
|
|
360
|
-
- Added the missing `io.standby` handler: `status.alarmAktiv` was
|
|
361
|
-
previously never reset when an incident ended
|
|
362
|
-
- Captured new incident fields (previously only contained in the raw
|
|
363
|
-
`json.raw`/`json.einsatz`, now as their own states): `zeitstempel`,
|
|
364
|
-
`einsatznummer`, `objekt`, `objektteil`, `strasse`, `hausnummer`,
|
|
365
|
-
`einsatzdetails`, `besonderheiten`, `permissions`
|
|
366
|
-
- `em_alarmiert` (alerted resources) is now stored in
|
|
367
|
-
`vis.fahrzeugTabelle`, `em_weitere` in `einsatz.emWeitere`
|
|
368
|
-
- Feedback is now collected per incident (`vis.rueckmeldungenTabelle`)
|
|
369
|
-
and aggregated into counters per role/capability
|
|
370
|
-
(`rueckmeldung.counts.*`), mirroring the live badges
|
|
371
|
-
(EK/GF/ZF/VF/AGT/FZF/MA/MED) on the web UI
|
|
372
|
-
- New handlers for `io.error` (→ `debug.lastError`) and `io.version`
|
|
373
|
-
(server-restart detection → session-cookie refresh + forced reconnect)
|
|
374
|
-
- Generalized `reconnectForRotatedSession()` into the more generic
|
|
375
|
-
`forceReconnect(reason)` (now also used on a server version change)
|
|
376
|
-
|
|
377
|
-
### 0.2.1 (2026-08-20)
|
|
378
|
-
|
|
379
|
-
- Detected session-cookie rotation: if `/session/keepalive` returns a
|
|
380
|
-
different cookie value than before (e.g. because the old session was
|
|
381
|
-
already invalid server-side – a missed keepalive, a server restart
|
|
382
|
-
with an in-memory session store), an existing Socket.IO connection is
|
|
383
|
-
now actively rebuilt with the new session instead of waiting for a
|
|
384
|
-
silent failure
|
|
385
|
-
|
|
386
|
-
### 0.2.0 (2026-08-20)
|
|
387
|
-
|
|
388
|
-
- Introduced session-cookie management: the adapter fetches and renews
|
|
389
|
-
the WAIP server's `connect.sid` session cookie itself (`GET
|
|
390
|
-
/session/keepalive`, matching `/js/session_keepalive.js` on the site)
|
|
391
|
-
and attaches it to the Socket.IO connection. Fixes alarm delivery
|
|
392
|
-
stopping after about 10 minutes without an active browser session.
|
|
393
|
-
- New state `debug.sessionExpires` and a new config option "Session
|
|
394
|
-
keepalive interval (ms)" (default `300000`)
|
|
395
|
-
|
|
396
|
-
### 0.1.1 (2026-08-20)
|
|
397
|
-
|
|
398
|
-
- Adopted the favicon from `wachalarm.leitstelle-lausitz.de` as the
|
|
399
|
-
adapter icon (`admin/waip-web.png`), replacing the previous
|
|
400
|
-
placeholder
|
|
401
|
-
- Renamed the GitHub repository from `ioBroker.WAIP-Web` to
|
|
402
|
-
`ioBroker.waip-web` (uppercase letters in the repo name prevented
|
|
403
|
-
installation via `iobroker url` with `Process exited with code 25`);
|
|
404
|
-
updated all URLs in `package.json`/`io-package.json` accordingly
|
|
405
|
-
|
|
406
|
-
### 0.1.0 (2026-08-20)
|
|
407
|
-
|
|
408
|
-
- Initial version: ported the original "WAIP Instrumented v3.9" ioBroker
|
|
409
|
-
JavaScript-adapter script into a standalone adapter. The URL/monitor
|
|
410
|
-
ID now come from the admin configuration instead of a runtime state.
|