iobroker.waip-web 1.0.0 → 1.0.1

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
@@ -415,7 +415,7 @@ siehe [Verbindung](#verbindung)), und öffnet für jeden der bis zu N
415
415
  passenden Einsätze nacheinander (nie parallel) eine **kurzlebige**
416
416
  Socket.IO-Verbindung, um dessen aktuellen Stand abzurufen, bevor sie
417
417
  wieder geschlossen wird. Ein vollständiger Refresh dauert dadurch
418
- realistisch einige Sekunden pro belegtem Slot, nicht Millisekunden –
418
+ realistisch einige Sekunden pro belegtem `einsatzN`, nicht Millisekunden –
419
419
  das Minimum beim **Refresh-Intervall** unten trägt dem Rechnung.
420
420
 
421
421
  | Feld | Beschreibung | Standard |
@@ -431,24 +431,24 @@ manueller Refresh lässt sich jederzeit über den Button-State
431
431
  `dashboard.refreshNow` auslösen, z. B. per VIS-Button oder Skript.
432
432
 
433
433
  Kartenbilder unter `dashboard.einsatzN.kartenbildPfad` werden **nicht**
434
- eigens für Dashboard-Slots erzeugt – sie werden aus demselben
434
+ eigens für das Dashboard erzeugt – sie werden aus demselben
435
435
  Datei-Fundus abgeleitet, den [Einsatzkarte](#einsatzkarte) für den
436
- eigenen Monitor dieser Instanz bereits erzeugt hat. Ein Slot hat also
436
+ eigenen Monitor dieser Instanz bereits erzeugt hat. `einsatzN` hat also
437
437
  nur dann ein Kartenbild, wenn dieser Adapter für genau diesen Einsatz
438
438
  über die eigene `einsatzAktuell.*`-Alarmverarbeitung bereits eines erzeugt
439
439
  hat – am vollständigsten, wenn die **Monitor-ID** auf `0` (alle
440
440
  Wachalarme) steht und **Kartenbild für jeden Einsatz erzeugen**
441
441
  aktiviert ist, da dann jeder Einsatz, der im Dashboard erscheinen kann,
442
442
  zuvor auch schon einmal `einsatzAktuell.*` durchlaufen hat. Bei einer
443
- enger gefassten Monitor-ID fehlt Dashboard-Slots für Einsätze außerhalb
443
+ enger gefassten Monitor-ID fehlt `einsatzN`-Einträgen für Einsätze außerhalb
444
444
  der eigenen Alarm-Historie das Kartenbild – das ist erwartetes
445
445
  Verhalten, kein Fehler.
446
446
 
447
447
  Wird das Feature deaktiviert, wird der komplette `dashboard.*`-Objekt-
448
448
  baum entfernt (Kanäle und States, nicht nur deren Werte); wird **Number
449
449
  of incidents to show** verringert, werden nur die dadurch nicht mehr
450
- benötigten Slots am Ende entfernt (z. B. entfernt eine Reduzierung von
451
- 10 auf 5 die Slots `dashboard.einsatz6` … `einsatz10`). Beide Änderungen
450
+ benötigten `einsatzN`-Einträge am Ende entfernt (z. B. entfernt eine Reduzierung von
451
+ 10 auf 5 die Einträge `dashboard.einsatz6` … `einsatz10`). Beide Änderungen
452
452
  wirken erst nach dem **nächsten Adapter-Neustart** nach dem Speichern
453
453
  (ioBroker startet die Instanz ohnehin bei jeder Konfigurationsänderung
454
454
  neu – die Entfernung passiert nicht sofort, während der Admin-Dialog
@@ -583,14 +583,14 @@ relevant, deshalb wird nur die jeweils letzte vorgehalten.
583
583
  Nur vorhanden, wenn [Dashboard](#dashboard) aktiviert ist – siehe dort
584
584
  für den Objektbaum-Lebenszyklus bei Aktivierung/Deaktivierung/
585
585
  Größenänderung. `dashboard.einsatzN` (`N` = 1 … die konfigurierte
586
- Slot-Anzahl) spiegelt dasselbe Schema wie `einsatzAktuell`/`einsatzAktuell.json`
586
+ Anzahl anzuzeigender Einsätze) spiegelt dasselbe Schema wie `einsatzAktuell`/`einsatzAktuell.json`
587
587
  oben, für den N-aktuellsten Einsatz, der zum Monitor dieser Instanz
588
588
  passt – **nicht** beschränkt auf den einen aktuellen Einsatz. Alle
589
- Felder eines belegten Slots werden bei jedem Refresh immer komplett
589
+ Felder eines belegten `einsatzN` werden bei jedem Refresh immer komplett
590
590
  neu geschrieben (nicht nur bei Änderung), damit laufende Rückmeldungen
591
- für einen Einsatz, der über mehrere Refreshs hinweg auf demselben Slot
592
- bleibt, weiter aktualisiert werden; ein unbelegter Slot (weniger
593
- passende Einsätze als konfigurierte Slots) trägt an allen Feldern den
591
+ für einen Einsatz, der über mehrere Refreshs hinweg an demselben `einsatzN`
592
+ bleibt, weiter aktualisiert werden; ein unbelegtes `einsatzN` (weniger
593
+ passende Einsätze als konfiguriert) trägt an allen Feldern den
594
594
  Leerwert, genau wie `einsatzAktuell.*`, wenn kein Einsatz aktiv ist.
595
595
 
596
596
  Bewusst **ohne** `restzeit`/`ablaufzeit` (WAIP-Webs `/dbrd/`-
@@ -604,7 +604,7 @@ das nur im `/dbrd`-Payload enthalten ist.
604
604
  | State | Typ | Beschreibung |
605
605
  | --- | --- | --- |
606
606
  | `refreshNow` | boolean (Button) | `true` schreiben, um einen sofortigen Dashboard-Refresh auszulösen, z. B. per VIS-Button oder Skript. Setzt sich nach Abschluss des Refreshs selbst auf `false` zurück |
607
- | `einsatzN.alarmAktiv` | boolean | `true`, solange der Slot mit einem passenden Einsatz belegt ist |
607
+ | `einsatzN.alarmAktiv` | boolean | `true`, solange `einsatzN` mit einem passenden Einsatz belegt ist |
608
608
  | `einsatzN.id` | number | Interne Einsatz-ID |
609
609
  | `einsatzN.uuid` | string | Eindeutige Einsatz-UUID |
610
610
  | `einsatzN.einsatzart` | string | Gleiche Bedeutung wie [einsatzAktuell.einsatzart](#einsatzaktuell) |
@@ -616,14 +616,14 @@ das nur im `/dbrd`-Payload enthalten ist.
616
616
  | `einsatzN.sondersignal` | number | `1` = Sondersignal (Blaulicht & Martinshorn), sonst keins |
617
617
  | `einsatzN.latitude` / `einsatzN.longitude` | number | Einsatzort, gleiche Normalisierung wie bei [einsatzAktuell](#einsatzaktuell) |
618
618
  | `einsatzN.kartenbildPfad` | string | Pfad zu einem passenden, bereits erzeugten Einsatzkarten-Bild – siehe [Dashboard](#dashboard) oben. Leer, falls keins gefunden wurde |
619
- | `einsatzN.routenGesamt` | number | Anzahl Routen für den Einsatz dieses Slots |
620
- | `einsatzN.rueckmeldungenGesamt` | number | Rückmeldungen gesamt für den Einsatz dieses Slots |
621
- | `einsatzN.rueckmeldungen.rollen.*` / `.funktionen.*` | number | Dieselben acht Rückmeldungs-Zähler wie bei [einsatzAktuell.rueckmeldungen](#einsatzaktuell), pro Slot |
622
- | `einsatzN.json.current` | string (JSON-Array) | Flache Einsatzdaten dieses Slots, gleiches Schema wie `einsatzAktuell.json.current` (ohne `registeredMonitor`/`registeredMonitorName`) |
623
- | `einsatzN.json.routen` | string (JSON-Array) | Routen des Einsatzes dieses Slots, gleiches Schema wie `einsatzAktuell.json.routen` |
624
- | `einsatzN.json.rueckmeldungen` | string (JSON-Array) | Rückmeldungen des Einsatzes dieses Slots |
625
- | `einsatzN.json.emAlarmiert` | string (JSON-Array) | Alarmierte Einsatzmittel des Einsatzes dieses Slots |
626
- | `einsatzN.json.wachen` | string (JSON-Array) | Am Einsatz dieses Slots beteiligte Wachen (`em_station_id`/`em_station_name`) – nur über `/dbrd` verfügbar, kein `einsatzAktuell.json.*`-Gegenstück |
619
+ | `einsatzN.routenGesamt` | number | Anzahl Routen für den Einsatz von `einsatzN` |
620
+ | `einsatzN.rueckmeldungenGesamt` | number | Rückmeldungen gesamt für den Einsatz von `einsatzN` |
621
+ | `einsatzN.rueckmeldungen.rollen.*` / `.funktionen.*` | number | Dieselben acht Rückmeldungs-Zähler wie bei [einsatzAktuell.rueckmeldungen](#einsatzaktuell), pro `einsatzN` |
622
+ | `einsatzN.json.current` | string (JSON-Array) | Flache Einsatzdaten von `einsatzN`, gleiches Schema wie `einsatzAktuell.json.current` (ohne `registeredMonitor`/`registeredMonitorName`) |
623
+ | `einsatzN.json.routen` | string (JSON-Array) | Routen des Einsatzes von `einsatzN`, gleiches Schema wie `einsatzAktuell.json.routen` |
624
+ | `einsatzN.json.rueckmeldungen` | string (JSON-Array) | Rückmeldungen des Einsatzes von `einsatzN` |
625
+ | `einsatzN.json.emAlarmiert` | string (JSON-Array) | Alarmierte Einsatzmittel des Einsatzes von `einsatzN` |
626
+ | `einsatzN.json.wachen` | string (JSON-Array) | Am Einsatz von `einsatzN` beteiligte Wachen (`em_station_id`/`em_station_name`) – nur über `/dbrd` verfügbar, kein `einsatzAktuell.json.*`-Gegenstück |
627
627
 
628
628
  ### debug
629
629
 
package/README.md CHANGED
@@ -406,7 +406,7 @@ itself - see [Connection](#connection)), and for each of up to N
406
406
  matching incidents opens one **short-lived** Socket.IO connection in
407
407
  turn (never in parallel) to collect its current state, then closes it
408
408
  again. A full refresh therefore realistically takes a few seconds per
409
- occupied slot, not milliseconds - the minimum **Refresh interval**
409
+ occupied `einsatzN`, not milliseconds - the minimum **Refresh interval**
410
410
  below reflects that.
411
411
 
412
412
  | Field | Description | Default |
@@ -422,21 +422,21 @@ refresh can be triggered any time via the `dashboard.refreshNow`
422
422
  button state, e.g. from a VIS button or a script.
423
423
 
424
424
  Map images shown as `dashboard.einsatzN.kartenbildPfad` are **not**
425
- generated separately for dashboard slots - they are looked up in the
425
+ generated separately for the dashboard - they are looked up in the
426
426
  same file history [Incident map image](#incident-map-image) already
427
- produces for this instance's own monitor. A slot only has a map image
427
+ produces for this instance's own monitor. `einsatzN` only has a map image
428
428
  when this adapter has *already* generated one for that exact incident
429
429
  via its own `einsatzAktuell.*` alarm handling - most complete when **Monitor
430
430
  ID** is `0` (all dispatch monitors) and **Generate a map image for
431
431
  each incident** is enabled, since then every incident that can appear
432
432
  on the dashboard has also passed through `einsatzAktuell.*` at least once.
433
- With a narrower Monitor ID, dashboard slots for incidents outside that
433
+ With a narrower Monitor ID, `einsatzN` entries for incidents outside that
434
434
  monitor's own alarm history will have no map image - this is expected,
435
435
  not a bug.
436
436
 
437
437
  Disabling the feature removes the entire `dashboard.*` object tree
438
438
  (channels and states, not just their values); reducing **Number of
439
- incidents to show** removes only the now-unused slots at the end
439
+ incidents to show** removes only the now-unused `einsatzN` entries at the end
440
440
  (e.g. going from 10 to 5 removes `dashboard.einsatz6` … `einsatz10`).
441
441
  Both changes only take effect on the **next adapter restart** after
442
442
  saving (ioBroker restarts the instance on any configuration change
@@ -570,15 +570,15 @@ only matters in the moment, so only the most recent one is kept.
570
570
 
571
571
  Only present when [Dashboard](#dashboard) is enabled - see there for
572
572
  the object-tree lifecycle on enable/disable/resize. `dashboard.einsatzN`
573
- (`N` = 1 … the configured slot count) mirrors the same shape as
574
- `einsatzAktuell`/`einsatzAktuell.json` above, for the Nth most recent
575
- incident matching this instance's monitor - **not** limited to the
576
- single current incident. All fields of an occupied slot are always
577
- rewritten on every refresh (not just on change), so ongoing feedback for
578
- an incident that stays on the same slot across refreshes keeps updating;
579
- an unoccupied slot (fewer matching incidents than configured slots)
580
- has all fields at their empty value, exactly like `einsatzAktuell.*`
581
- when no incident is active.
573
+ (`N` = 1 … the configured number of incidents to show) mirrors the same
574
+ shape as `einsatzAktuell`/`einsatzAktuell.json` above, for the Nth most
575
+ recent incident matching this instance's monitor - **not** limited to
576
+ the single current incident. All fields of an occupied `einsatzN` are
577
+ always rewritten on every refresh (not just on change), so ongoing
578
+ feedback for an incident that stays at the same `einsatzN` across
579
+ refreshes keeps updating; an unoccupied `einsatzN` (fewer matching
580
+ incidents than configured) has all fields at their empty value, exactly
581
+ like `einsatzAktuell.*` when no incident is active.
582
582
 
583
583
  Deliberately **without** `restzeit`/`ablaufzeit` (WAIP-Web's `/dbrd/`
584
584
  incident-detail data has no equivalent field, unlike the live `/waip`
@@ -591,7 +591,7 @@ only the `/dbrd` payload includes.
591
591
  | State | Type | Description |
592
592
  | --- | --- | --- |
593
593
  | `refreshNow` | boolean (button) | Write `true` to trigger an immediate dashboard refresh, e.g. from a VIS button or a script. Resets itself to `false` once the refresh completes |
594
- | `einsatzN.alarmAktiv` | boolean | `true` while the slot is occupied by a matching incident |
594
+ | `einsatzN.alarmAktiv` | boolean | `true` while `einsatzN` is occupied by a matching incident |
595
595
  | `einsatzN.id` | number | Internal incident ID |
596
596
  | `einsatzN.uuid` | string | Unique incident UUID |
597
597
  | `einsatzN.einsatzart` | string | Same meaning as [einsatzAktuell.einsatzart](#einsatzaktuell) |
@@ -603,14 +603,14 @@ only the `/dbrd` payload includes.
603
603
  | `einsatzN.sondersignal` | number | `1` = special signal (lights & siren), otherwise none |
604
604
  | `einsatzN.latitude` / `einsatzN.longitude` | number | Incident location, same normalization as [einsatzAktuell](#einsatzaktuell) |
605
605
  | `einsatzN.kartenbildPfad` | string | Path to a matching, previously generated incident map image - see [Dashboard](#dashboard) above. Empty if none was found |
606
- | `einsatzN.routenGesamt` | number | Number of routes for this slot's incident |
607
- | `einsatzN.rueckmeldungenGesamt` | number | Total feedback count for this slot's incident |
608
- | `einsatzN.rueckmeldungen.rollen.*` / `.funktionen.*` | number | Same eight feedback counters as [einsatzAktuell.rueckmeldungen](#einsatzaktuell), per slot |
609
- | `einsatzN.json.current` | string (JSON array) | This slot's flat incident data, same shape as `einsatzAktuell.json.current` (without `registeredMonitor`/`registeredMonitorName`) |
610
- | `einsatzN.json.routen` | string (JSON array) | Routes of this slot's incident, same shape as `einsatzAktuell.json.routen` |
611
- | `einsatzN.json.rueckmeldungen` | string (JSON array) | Feedback entries of this slot's incident |
612
- | `einsatzN.json.emAlarmiert` | string (JSON array) | Alerted resources of this slot's incident |
613
- | `einsatzN.json.wachen` | string (JSON array) | Participating stations of this slot's incident (`em_station_id`/`em_station_name`) - only available via `/dbrd`, no `einsatzAktuell.json.*` counterpart |
606
+ | `einsatzN.routenGesamt` | number | Number of routes for `einsatzN`'s incident |
607
+ | `einsatzN.rueckmeldungenGesamt` | number | Total feedback count for `einsatzN`'s incident |
608
+ | `einsatzN.rueckmeldungen.rollen.*` / `.funktionen.*` | number | Same eight feedback counters as [einsatzAktuell.rueckmeldungen](#einsatzaktuell), per `einsatzN` |
609
+ | `einsatzN.json.current` | string (JSON array) | `einsatzN`'s flat incident data, same shape as `einsatzAktuell.json.current` (without `registeredMonitor`/`registeredMonitorName`) |
610
+ | `einsatzN.json.routen` | string (JSON array) | Routes of `einsatzN`'s incident, same shape as `einsatzAktuell.json.routen` |
611
+ | `einsatzN.json.rueckmeldungen` | string (JSON array) | Feedback entries of `einsatzN`'s incident |
612
+ | `einsatzN.json.emAlarmiert` | string (JSON array) | Alerted resources of `einsatzN`'s incident |
613
+ | `einsatzN.json.wachen` | string (JSON array) | Participating stations of `einsatzN`'s incident (`em_station_id`/`em_station_name`) - only available via `/dbrd`, no `einsatzAktuell.json.*` counterpart |
614
614
 
615
615
  ### debug
616
616
 
@@ -645,6 +645,22 @@ example.
645
645
  Re-add it afterwards (or use `npm run release -- --addPlaceholder`).
646
646
  Collect changes for the upcoming release underneath it.
647
647
  -->
648
+ ### 1.0.1 (2026-09-19)
649
+
650
+ - `registrationTimeoutSec` and `reconnectDelaySec` are now clamped in
651
+ code to their admin UI range (1-120s), matching how every other
652
+ numeric configuration value (e.g. `historySize`, `mapImageWidth`) was
653
+ already handled - a direct instance config JSON edit/import can no
654
+ longer set them outside that range.
655
+ - The `stateChange` listener (used only for `dashboard.refreshNow`) is
656
+ now registered only while the Dashboard feature is enabled, matching
657
+ its `subscribeStates()` call, instead of unconditionally in the
658
+ constructor.
659
+ - Fixed the "Number of Installations" and "Current version in stable
660
+ repository" badges, which pointed at the shields.io homepage instead
661
+ of the actual `iobroker.live` badge images and therefore rendered as
662
+ broken links.
663
+
648
664
  ### 1.0.0 (2026-08-30)
649
665
 
650
666
  - **Breaking change:** the `einsatz` channel is renamed to `einsatzAktuell`
@@ -656,8 +672,8 @@ example.
656
672
  bindings/scripts referencing the old `einsatz.*`/`einsatz.json.history10`
657
673
  paths - they are removed automatically on upgrade, along with their
658
674
  values.
659
- - Dashboard channel/state display names no longer use "Slot" - they now
660
- say "Einsatz N" consistently with the `einsatzAktuell.*` naming, and
675
+ - Dashboard channel/state display names are now consistent: they use
676
+ "Einsatz N" throughout, matching the `einsatzAktuell.*` naming, and
661
677
  the redundant "flat JSON array" phrase was removed from every state
662
678
  name. Object IDs are unaffected, only the display names shown in
663
679
  Admin/VIS.
@@ -690,7 +706,7 @@ example.
690
706
  not a permanent connection - see [Dashboard](#dashboard) and
691
707
  [dashboard states](#dashboard-states) for the full behavior,
692
708
  including the manual refresh button and the object-deletion behavior
693
- when disabling the feature or reducing the slot count.
709
+ when disabling the feature or reducing the number of incidents to show.
694
710
 
695
711
  ### 0.7.38 (2026-08-27)
696
712
 
@@ -714,16 +730,6 @@ example.
714
730
  the state-definition consistency. `npm test` now runs it alongside the
715
731
  package tests.
716
732
 
717
- ### 0.7.37 (2026-08-26)
718
-
719
- - Fixed a bug where a routes update (`io.routes`) or TTS announcement
720
- (`io.playtts`) arriving after an incident had already ended
721
- (`io.standby`) could revive `einsatz.json.current`/`.routen`/
722
- `einsatz.routenGesamt` or `einsatz.tts.last`/`.lastTimestamp` for the
723
- already-finished incident, while every other `einsatz.*` field
724
- correctly stayed cleared. Both handlers now ignore such events while
725
- no incident is active.
726
-
727
733
  Older entries have been moved to [CHANGELOG_OLD.md](CHANGELOG_OLD.md).
728
734
 
729
735
  ## License
package/io-package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "waip-web",
4
- "version": "1.0.0",
4
+ "version": "1.0.1",
5
5
  "news": {
6
+ "1.0.1": {
7
+ "en": "- `registrationTimeoutSec` and `reconnectDelaySec` are now clamped in\n code to their admin UI range (1-120s), matching how every other\n numeric configuration value (e.g. `historySize`, `mapImageWidth`) was\n already handled - a direct instance config JSON edit/import can no\n longer set them outside that range.\n- The `stateChange` listener (used only for `dashboard.refreshNow`) is\n now registered only while the Dashboard feature is enabled, matching\n its `subscribeStates()` call, instead of unconditionally in the\n constructor.\n- Fixed the \"Number of Installations\" and \"Current version in stable\n repository\" badges, which pointed at the shields.io homepage instead\n of the actual `iobroker.live` badge images and therefore rendered as\n broken links.",
8
+ "de": "- `RegistrationTimeoutSec` und `ReconnectDelaySec` sind nun fest\n Code für ihre Admin-UI (1—120 s), passt wie alle\n Der numerische Wert (z. B. `historySize`, `mapImageWidth`) war\n schon erledigt — ein JSON-Import kann nicht\n setzt sie länger aus dem Bereich.\n- Der `StateChange`-Listener (nur für `Dashboard.RefreshNow`) ist\n jetzt nur bei aktiviertem Dashboard registriert, passend\n es ist `subscribeStates () `-Aufruf, statt bedingungslos im\n Konstrukteur.\n- „Anzahl der Installationen“ und „Aktuelle Version“ behoben\n Archiv“ -Badges, die stattdessen auf die Shields.io-Homepage zeigten\n der echten `iobroker.live`-Badge-Bilder und daher gerendert als\n Kaputte Links.",
9
+ "ru": "- «Время ожидания регистрации» и «Задержка повторного подключения» теперь заблокированы\n код для их диапазона пользовательского интерфейса администратора (1-120 секунд), совпадающий с любым другим\n числовое значение конфигурации (например, `historySize`, `MapImageWidth`) было\n уже обработано - конфигурация прямого экземпляра JSON редактировать/импортировать невозможно\n дольше выведите их за пределы этого диапазона.\n- Слушатель `StateChange` (используется только для `Dashboard.RefreshNow`)\n теперь зарегистрирован только при включенной функции Dashboard, совпадение\n его вызов `subscribeStates () `вместо безоговорочного вызова в\n конструктор.\n- Исправлены ошибки «Количество установок» и «Текущая версия в стабильной версии»\n значки «репозитория», которые вместо этого указывали на домашнюю страницу shields.io\n фактических изображений бейджей `iobroker.live`, которые, следовательно, отображаются в виде\n неработающие ссылки.",
10
+ "pt": "- `registrationTimeoutSec` e `reconnectDelaySec` agora estão presos\n código para sua UI admin (1-120s), igual a todos os outros\n valor de configuração numérica (ex: `historySize`, `mapImageWidth`) foi\n já tratado - uma instância direta JSON edit/import não pode\n deixe-os fora dessa faixa.\n- O ouvinte `stateChange` (usado só em `dashboard.refreshNow`) é\n agora registrado apenas com o recurso Painel ativado\n sua chamada `subscribeStates () `, em vez de incondicional no\n construtor.\n- Corrigido o “Número de instalações” e “Versão atual estável\n selos repository”, que apontavam para a página inicial shields.io\n das imagens reais do selo `iobroker.live` e, portanto, como\n links falidos.",
11
+ "nl": "- `RegistrationTimeOutSec` en `ReconnectDelaySec` zijn nu ingeklemd\n code voor hun beheerdersinterfacebereik (1-120s), overeenkomend met elke andere\n De numerieke configuratiewaarde (bijv. `HistorySize`, `MapImageWidth`) was\n al afgehandeld - een directe instantieconfiguratie voor JSON bewerken/importeren kan nee\n plaats ze langer buiten dat bereik.\n- De `StateChange` listener (alleen gebruikt voor `Dashboard.RefreshNow`) is\n nu alleen geregistreerd als de Dashboard-functie is ingeschakeld, wat overeenkomt met\n het is de `SubscribeStates () `aanroep, in plaats van onvoorwaardelijk in de\n constructeur.\n- Het „Aantal installaties” en „Huidige versie” is opgelost in stabiel\n badges van de repository, die in plaats daarvan naar de homepagina van shields.io verwezen\n van de daadwerkelijke afbeeldingen van de `iobroker.live` badge en daarom weergegeven als\n verbroken links.",
12
+ "fr": "- `RegistrationTimeoutSec` et `ReconnectDelaySec` sont désormais bloqués\n code vers leur interface d'administration (1 à 120 s), comme les autres\n valeur de configuration numérique (par exemple « HistorySize », « MapImageWidth ») était\n déjà géré - une instance directe JSON edit/import ne peut pas\n les placer plus longtemps en dehors de ce cadre.\n- L'écouteur StateChange (utilisé uniquement pour Dashboard.RefreshNow) est\n désormais enregistrée uniquement lorsque le tableau de bord est activé\n son appel `subscribeStates () `, au lieu d'être inconditionnel dans\n constructeur.\n- Correction du « nombre d'installations » et de la « version stable »\n des badges « repository », qui pointaient plutôt vers la page d'accueil de Shields.io\n des images réelles du badge « iobroker.live » et donc rendu comme\n liens brisés.",
13
+ "it": "- `RegistrationTimeoutSec` e `ReconnectDelaySec` sono ora bloccati\n codice per la loro interfaccia utente admin (1-120 s)\n valore numerico (ad es. `historySize`, `mapImageWidth`) era\n già gestito - un JSON edit/import diretto non può\n più a lungo fuori da quel range.\n- Il listener StateChange (usato solo per Dashboard.refreshNow) è\n ora registrato solo se la funzione Dashboard è attiva, abbinata\n la sua chiamata `subscribeStates () `, invece che incondizionata\n costruttore.\n- Risolti «Numero di installazioni» e «Versione attuale stabile\n badge «repository», che indicavano invece la homepage di shields.io\n delle vere immagini dei badge `iobroker.live` e quindi rese come\n link rotti.",
14
+ "es": "- `RegistrationTimeoutSec` y `ReconnectDelaySec` ya están restringidos\n código para su rango de UI de administrador (1 a 120 s), que coincide con cada\n el valor de configuración numérico (p. ej., `HistorySize`, `MapImageWidth`) era\n ya gestionado: una instancia directa JSON edit/import no puede\n ya no los puso fuera de ese rango.\n- El oyente `StateChange` (solo se usa para `Dashboard.RefreshNow`) es\n ahora registrado solo con la función Panel de control habilitada, coincidente\n su llamada `SubscribeStates () `, en lugar de incondicionalmente en\n constructor.\n- Se corrigieron «Número de instalaciones» y «Versión actual en estable»\n insignias «repositorio», que apuntaban a la página principal de shields.io\n de las imágenes reales de la placa de «iobroker.live» y, por lo tanto, renderizadas como\n enlaces rotos.",
15
+ "pl": "- `RegistrationTimeOutSec` i `ReconnectDelaySec` są teraz zaciśnięte\n kod do zakresu interfejsu administratora (1-120 s), pasujący do każdego innego\n wartość konfiguracji liczbowej (np. `HistorySize`, `MapImageWidth`) była\n już obsługiwane - bezpośrednia konfiguracja instancji JSON edit/import nie może\n Dłużej ustawić je poza tym zakresem.\n- Słuchacz `StateChange` (używany tylko dla `dashboard.RefreshNow`) jest\n teraz zarejestrowany tylko wtedy, gdy funkcja pulpitu nawigacyjnego jest włączona, dopasowanie\n jego wywołanie `subscribeStates () `zamiast bezwarunkowo w\n konstruktor.\n- Naprawiono „Liczba instalacji” i „Aktualna wersja w stabilnej\n repozytorium” odznaki, które wskazywały zamiast tego na stronę główną shields.io\n rzeczywistych obrazów plakietek „iobroker.live”, a zatem renderowanych jako\n uszkodzone linki.",
16
+ "uk": "- `RegistrationTimeoutSec` та `ReconnectDelaySec` тепер затиснуті\n код до їх діапазону інтерфейсу адміністратора (1-120 с), відповідаючи кожному іншому\n числове значення конфігурації (наприклад, `historySize`, `mapImageWidth`) було\n вже оброблено - прямий конфігураційний екземпляр JSON редагувати/імпортувати не може\n довше виставити їх за межі цього діапазону.\n- Слухач `StateChange` (використовується лише для `Dashboard.RefreshNow`)\n тепер зареєстрований лише тоді, коли функція Dashboard увімкнена, відповідає\n його виклик `subscribeStates () `замість беззастережно в\n конструктор.\n- Виправлено «Кількість установок» та «Поточна версія у стабільній\n репозиторій» значки, які замість цього вказували на домашню сторінку shields.io\n фактичних зображень значків `iobroker.live` і, отже, відтворено як\n несправні посилання.",
17
+ "zh-cn": "-`registrationTimeoutSec` 和 `reconnectDelaySec` 现已被限制\n 代码到他们的管理界面范围(1-120 秒),相互匹配\n 数字配置值(例如 `HistorySize`、`mapImageWidth`)是\n 已经处理了——直接实例配置 JSON 编辑/导入不能\n 将它们设置在该范围之外的时间更长。\n-`StateChange` 监听器(仅用于 `dashboard.refreshNow`)是\n 现在仅在启用仪表板功能时注册,匹配\n 它的 `subscribeStates () `调用,而不是无条件地调用\n 建造者。\n-修复了稳定版中的 “安装次数” 和 “当前版本”\n 存储库” 徽章,改为指向 shields.io 主页\n 实际的 “iobroker.live” 徽章图片,因此呈现为\n 断开的链接。"
18
+ },
6
19
  "1.0.0": {
7
20
  "en": "- **Breaking change:** the `einsatz` channel is renamed to `einsatzAktuell`\n (to distinguish it from the `dashboard.einsatz1` … `einsatzN` dashboard\n channels), and `einsatzAktuell.json.history10` is renamed to\n `einsatzAktuell.json.history`, now holding a configurable number of\n entries (new \"Number of incidents in history\" setting on the\n [Connection](#connection) tab, 1-100, default 10). Update any VIS\n bindings/scripts referencing the old `einsatz.*`/`einsatz.json.history10`\n paths - they are removed automatically on upgrade, along with their\n values.\n- Dashboard channel/state display names no longer use \"Slot\" - they now\n say \"Einsatz N\" consistently with the `einsatzAktuell.*` naming, and\n the redundant \"flat JSON array\" phrase was removed from every state\n name. Object IDs are unaffected, only the display names shown in\n Admin/VIS.",
8
21
  "de": "- **Breaking Change:** Der Kanal „einsatz“ wird in „einsatzAktuell“ umbenannt\n (zur Unterscheidung vom Dashboard „dashboard.einsatz1“ … „einsatzN“.\nKanäle), und `einsatzAktuell.json.history10` wird umbenannt in\n`einsatzAktuell.json.history`, das nun eine konfigurierbare Anzahl von\nEinträge (neue Einstellung „Anzahl der Vorfälle in der Historie“)\nRegisterkarte [Verbindung](#Verbindung), 1-100, Standardwert 10). Aktualisieren Sie beliebige VIS.\n Bindungen/Skripte, die auf den alten `einsatz.*`/`einsatz.json.history10` verweisen\nPfade – diese werden beim Upgrade automatisch zusammen mit ihren\n Werte.\n- Die Anzeigenamen der Dashboard-Kanäle/Status verwenden nicht mehr \"Slot\" - sie werden jetzt\n Sagen Sie „Einsatz N“ konsistent mit der Benennung „einsatzAktuell.*“ und\nDer überflüssige Ausdruck „flaches JSON-Array“ wurde aus jedem Zustand entfernt.\nName. Objekt-IDs bleiben unberührt, nur die angezeigten Anzeigenamen werden geändert.\nAdmin/VIS.",
package/main.js CHANGED
@@ -68,6 +68,23 @@ const DEFAULT_SESSION_KEEPALIVE_SEC = 300;
68
68
  // server/app_cfg.js: 60s!) - so the interval below is derived adaptively from the
69
69
  // expiry time the server reports, instead of assuming a fixed value.
70
70
  const SESSION_KEEPALIVE_MIN_MS = 55 * 1000;
71
+ // DE: Konfigurierbarer Bereich für registrationTimeoutSec/reconnectDelaySec (siehe
72
+ // onReady()) - identisch zu den Admin-UI-Grenzen (min: 1, max: 120), zusätzlich per
73
+ // clampNumber() im Code selbst durchgesetzt. Ohne diese Klemmung könnte eine direkte
74
+ // Instanzkonfigurations-JSON-Bearbeitung/ein Import einen Wert außerhalb des
75
+ // Admin-UI-Bereichs enthalten (z.B. negativ oder unrealistisch groß), der ungeprüft in
76
+ // setTimeout()/setInterval() landen würde.
77
+ // EN: Configurable range for registrationTimeoutSec/reconnectDelaySec (see onReady()) -
78
+ // identical to the admin UI limits (min: 1, max: 120), additionally enforced in code via
79
+ // clampNumber(). Without this clamp, a direct instance config JSON edit/import could
80
+ // contain a value outside the admin UI range (e.g. negative or unrealistically large)
81
+ // that would end up unchecked in setTimeout()/setInterval().
82
+ const REGISTRATION_TIMEOUT_SEC_MIN = 1;
83
+ const REGISTRATION_TIMEOUT_SEC_MAX = 120;
84
+ const DEFAULT_REGISTRATION_TIMEOUT_SEC = 10;
85
+ const RECONNECT_DELAY_SEC_MIN = 1;
86
+ const RECONNECT_DELAY_SEC_MAX = 120;
87
+ const DEFAULT_RECONNECT_DELAY_SEC = 5;
71
88
  // DE: Konfigurierbarer Bereich für die Größe von einsatzAktuell.json.history (siehe
72
89
  // onReady()/pushEinsatzToHistory()/trimHistoryIfNeeded()) - historySize ist ein
73
90
  // Konfigurationswert (1..100, Default 10 zur Wahrung des bisherigen Verhaltens
@@ -1650,13 +1667,6 @@ class WaipWeb extends utils.Adapter {
1650
1667
  this.on('ready', this.onReady.bind(this));
1651
1668
  this.on('unload', this.onUnload.bind(this));
1652
1669
  this.on('message', this.onMessage.bind(this));
1653
- // DE: Erstmaliger stateChange-Listener in diesem Adapter (siehe onStateChange()) -
1654
- // bisher wurde nirgends subscribeStates() genutzt. Nur für den Dashboard-Refresh-
1655
- // Button (dashboard.refreshNow, Plandokument Abschnitt 3.5) benötigt.
1656
- // EN: First stateChange listener in this adapter (see onStateChange()) - until now
1657
- // subscribeStates() was never used anywhere. Only needed for the dashboard refresh
1658
- // button (dashboard.refreshNow, plan document section 3.5).
1659
- this.on('stateChange', this.onStateChange.bind(this));
1660
1670
 
1661
1671
  this.socket = null;
1662
1672
  this.currentMonitor = '';
@@ -1724,14 +1734,26 @@ class WaipWeb extends utils.Adapter {
1724
1734
  }
1725
1735
 
1726
1736
  async onReady() {
1727
- this.REGISTRATION_TIMEOUT_MS = (Number(this.config.registrationTimeoutSec) || 10) * 1000;
1728
- this.RECONNECT_DELAY_MS = (Number(this.config.reconnectDelaySec) || 5) * 1000;
1729
- // DE: Größe von einsatzAktuell.json.history (siehe pushEinsatzToHistory()) - anders
1730
- // als die beiden Timeout-Werte oben per clampNumber() geklemmt, da eine direkte
1737
+ this.REGISTRATION_TIMEOUT_MS =
1738
+ clampNumber(
1739
+ this.config.registrationTimeoutSec,
1740
+ REGISTRATION_TIMEOUT_SEC_MIN,
1741
+ REGISTRATION_TIMEOUT_SEC_MAX,
1742
+ DEFAULT_REGISTRATION_TIMEOUT_SEC,
1743
+ ) * 1000;
1744
+ this.RECONNECT_DELAY_MS =
1745
+ clampNumber(
1746
+ this.config.reconnectDelaySec,
1747
+ RECONNECT_DELAY_SEC_MIN,
1748
+ RECONNECT_DELAY_SEC_MAX,
1749
+ DEFAULT_RECONNECT_DELAY_SEC,
1750
+ ) * 1000;
1751
+ // DE: Größe von einsatzAktuell.json.history (siehe pushEinsatzToHistory()) - ebenso
1752
+ // per clampNumber() geklemmt wie die beiden Timeout-Werte oben, da eine direkte
1731
1753
  // Instanzkonfigurations-JSON-Bearbeitung/ein Import Werte außerhalb des
1732
1754
  // Admin-UI-Bereichs (1..100) enthalten könnte.
1733
- // EN: Size of einsatzAktuell.json.history (see pushEinsatzToHistory()) - unlike the
1734
- // two timeout values above, clamped via clampNumber() since a direct instance
1755
+ // EN: Size of einsatzAktuell.json.history (see pushEinsatzToHistory()) - clamped via
1756
+ // clampNumber() just like the two timeout values above, since a direct instance
1735
1757
  // config JSON edit/import could contain values outside the admin UI range (1..100).
1736
1758
  this.historySize = clampNumber(
1737
1759
  this.config.historySize,
@@ -1960,8 +1982,18 @@ class WaipWeb extends utils.Adapter {
1960
1982
  this.startDashboardRefreshInterval();
1961
1983
  // DE: Nur abonnieren, wenn das Feature aktiv ist - kein Sinn, den Button bei
1962
1984
  // deaktiviertem Dashboard zu abonnieren (siehe Plandokument Abschnitt 3.5).
1985
+ // Der stateChange-Listener selbst wird ebenfalls erst hier registriert (nicht
1986
+ // schon im Constructor) - onStateChange() behandelt ausschließlich
1987
+ // dashboard.refreshNow, ein Listener ohne zugehöriges subscribeStates() liefe
1988
+ // ohnehin nie an, wäre aber unnötige tote Infrastruktur bei deaktiviertem
1989
+ // Dashboard.
1963
1990
  // EN: Only subscribe when the feature is active - no point subscribing to the
1964
1991
  // button while the dashboard is disabled (see the plan document section 3.5).
1992
+ // The stateChange listener itself is also only registered here (not already in
1993
+ // the constructor) - onStateChange() exclusively handles dashboard.refreshNow,
1994
+ // a listener without a matching subscribeStates() would never fire anyway, but
1995
+ // would be unnecessary dead infrastructure while the dashboard is disabled.
1996
+ this.on('stateChange', this.onStateChange.bind(this));
1965
1997
  this.subscribeStates('dashboard.refreshNow');
1966
1998
  }
1967
1999
  // DE: Nicht awaiten - der Alarm-Empfang soll nicht auf diesen (rein informativen)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.waip-web",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
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",
@@ -36,7 +36,7 @@
36
36
  "README.de.md"
37
37
  ],
38
38
  "dependencies": {
39
- "@iobroker/adapter-core": "^3.4.1",
39
+ "@iobroker/adapter-core": "^3.4.3",
40
40
  "jimp": "^1.6.1",
41
41
  "socket.io-client": "^4.7.5"
42
42
  },
@@ -47,7 +47,7 @@
47
47
  "@alcalzone/release-script-plugin-manual-review": "^5.2.0",
48
48
  "@iobroker/adapter-dev": "^1.5.0",
49
49
  "@iobroker/eslint-config": "^2.2.0",
50
- "@iobroker/testing": "^5.2.2",
50
+ "@iobroker/testing": "^6.2.1",
51
51
  "@tsconfig/node22": "^22.0.6",
52
52
  "@types/node": "^22.0.0"
53
53
  },