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 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` | mixed | `"pending"` direkt nach Connect, `true` sobald das erste Event empfangen wurde, sonst `false` nach Ablauf des Registrierungs-Timeouts |
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` | mixed | Berechtigungsflag der Registrierung (Vollzugriff auf Detailkarte ja/nein) |
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` | mixed | `"pending"` right after connecting, `true` once the first event was received, otherwise `false` once the registration timeout elapses |
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` | mixed | The registration's permission flag (full access to the detail map yes/no) |
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.9",
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: 'mixed',
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 bestätigt (true/false/pending)',
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: 'mixed', role: 'json', name: 'Berechtigungs-Flag der Registrierung' },
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
- if (val === null || typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean') {
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', 'pending', true);
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.9",
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.