iobroker.waip-web 0.7.35 → 0.7.37

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
@@ -104,7 +104,7 @@ Rettungsdienst-Wache:
104
104
  ansetzen (oder die URL direkt abspielen), um den Einsatz über
105
105
  Gebäudelautsprecher anzusagen, sobald `io.playtts` feuert – hilfreich,
106
106
  wenn nicht alle Mitglieder gerade auf einen Bildschirm schauen.
107
- - **Live-Übersicht der Rückmeldungen.** Die `einsatz.rueckmeldungAnzahl.*`
107
+ - **Live-Übersicht der Rückmeldungen.** Die `einsatz.rueckmeldungen.*`
108
108
  Zähler (`rollen.ek`/`.gf`/`.zf`/`.vf` pro Rolle, `funktionen.agt`/`.fzf`/
109
109
  `.ma`/`.med` pro Zusatzfunktion) aktualisieren sich in Echtzeit, sobald
110
110
  Einsatzkräfte per App zurückmelden – als Gauge- oder Zahlen-Widget
@@ -454,21 +454,21 @@ stehen. Der zuletzt abgeschlossene Einsatz bleibt trotzdem über
454
454
  | `beschreibung` | string | Beschreibung zu `stichwort`, lokal ermittelt (wird nicht vom Server gesendet) - siehe [Rettungsdienst](#rettungsdienst)/[Stichwort-Stammdaten](#stichwort-stammdaten) unten. `null` falls nichts passte |
455
455
  | `ort` | string | Ort |
456
456
  | `ortsteil` | string | Ortsteil (falls abweichend vom Ort) |
457
- | `zeitstempel` | string (date) | Alarmzeit |
457
+ | `alarmierungszeit` | string (date) | Alarmzeit |
458
458
  | `ablaufzeit` | string (date) | Ende der Standby-Anzeigedauer, Basis für `restzeit` |
459
459
  | `sondersignal` | number | `1` = Sondersignal, sonst kein Sondersignal |
460
460
  | `latitude` / `longitude` | number | Position des Einsatzortes (normalisiert aus wgs84-Feldern oder GeoJSON-Mittelpunkt) |
461
461
  | `kartenbildPfad` | string | Pfad zum zuletzt erzeugten Einsatzkarten-Bild (PNG) - siehe [Einsatzkarte](#einsatzkarte). Leer bis das Bild für den aktuellen Einsatz fertig ist; wird außerdem zu Beginn eines neuen Einsatzes, bei einem Fehlschlag der Erzeugung oder falls das OSM-Timeout überschritten wird geleert (bzw. bleibt leer), sowie - wie die übrigen Felder oben - bei `io.standby`. Die zugrundeliegende Bild-Datei selbst wird beim Leeren des States nicht gelöscht (nur das 10er-Rotationslimit entfernt Dateien, siehe [Einsatzkarte](#einsatzkarte)) |
462
462
  | `routenGesamt` | number | Anzahl Routen im aktuellen Einsatz |
463
- | `rueckmeldungGesamt` | number | Rückmeldungen gesamt im aktuellen Einsatz |
464
- | `rueckmeldungAnzahl.rollen.ek` | number | Anzahl Rückmeldungen als Einsatzkraft |
465
- | `rueckmeldungAnzahl.rollen.gf` | number | Anzahl Rückmeldungen als Gruppenführer |
466
- | `rueckmeldungAnzahl.rollen.zf` | number | Anzahl Rückmeldungen als Zugführer |
467
- | `rueckmeldungAnzahl.rollen.vf` | number | Anzahl Rückmeldungen als Verbandsführer |
468
- | `rueckmeldungAnzahl.funktionen.agt` | number | Anzahl Rückmeldungen mit Atemschutz-Befähigung |
469
- | `rueckmeldungAnzahl.funktionen.fzf` | number | Anzahl Rückmeldungen als Fahrzeugführer |
470
- | `rueckmeldungAnzahl.funktionen.ma` | number | Anzahl Rückmeldungen als Maschinist |
471
- | `rueckmeldungAnzahl.funktionen.med` | number | Anzahl Rückmeldungen mit medizinischer Befähigung |
463
+ | `rueckmeldungenGesamt` | number | Rückmeldungen gesamt im aktuellen Einsatz |
464
+ | `rueckmeldungen.rollen.ek` | number | Anzahl Rückmeldungen als Einsatzkraft |
465
+ | `rueckmeldungen.rollen.gf` | number | Anzahl Rückmeldungen als Gruppenführer |
466
+ | `rueckmeldungen.rollen.zf` | number | Anzahl Rückmeldungen als Zugführer |
467
+ | `rueckmeldungen.rollen.vf` | number | Anzahl Rückmeldungen als Verbandsführer |
468
+ | `rueckmeldungen.funktionen.agt` | number | Anzahl Rückmeldungen mit Atemschutz-Befähigung |
469
+ | `rueckmeldungen.funktionen.fzf` | number | Anzahl Rückmeldungen als Fahrzeugführer |
470
+ | `rueckmeldungen.funktionen.ma` | number | Anzahl Rückmeldungen als Maschinist |
471
+ | `rueckmeldungen.funktionen.med` | number | Anzahl Rückmeldungen mit medizinischer Befähigung |
472
472
 
473
473
  ### einsatz.json
474
474
 
@@ -484,7 +484,7 @@ Abschnitt [`einsatz`](#einsatz).
484
484
 
485
485
  | State | Typ | Beschreibung |
486
486
  | --- | --- | --- |
487
- | `current` | string (JSON-Array) | Flache Daten des aktuellen Einsatzes: dieselben 12 Felder wie die einzelnen `einsatz.*`-States oben (`id` … `zeitstempel`, plus `beschreibung`, `lat`/`lon`), zusätzlich `registeredMonitor`/`registeredMonitorName` (der Monitor, auf den der Adapter zu diesem Zeitpunkt registriert war), gebündelt als ein Objekt innerhalb eines Arrays mit einem Element (`[]` falls kein Einsatz aktiv) – der Array-Wrapper ist nötig, weil die meisten Tabellen-Widgets am Root ein Array statt eines nackten Objekts erwarten |
487
+ | `current` | string (JSON-Array) | Flache Daten des aktuellen Einsatzes: dieselben 12 Felder wie die einzelnen `einsatz.*`-States oben (`id` … `sondersignal`, plus `beschreibung`, `alarmierungszeit`, `lat`/`lon`), zusätzlich `registeredMonitor`/`registeredMonitorName` (der Monitor, auf den der Adapter zu diesem Zeitpunkt registriert war), gebündelt als ein Objekt innerhalb eines Arrays mit einem Element (`[]` falls kein Einsatz aktiv) – der Array-Wrapper ist nötig, weil die meisten Tabellen-Widgets am Root ein Array statt eines nackten Objekts erwarten |
488
488
  | `history10` | string (JSON-Array) | Letzte 10 abgeschlossenen Einsätze, gleiches Schema wie `current`, ein Array-Eintrag pro Einsatz, geschrieben bei `io.standby` |
489
489
  | `routen` | string (JSON-Array) | Routen des aktuellen Einsatzes; jeder Eintrag hat `nr_wache`, `name_wache`, `color`, `lat`, `lon` (`position` zu flachem `lat`/`lon` aufgelöst) |
490
490
  | `rueckmeldungen` | string (JSON-Array) | Rückmeldungen des aktuellen Einsatzes, wie vom Server empfangen |
package/README.md CHANGED
@@ -111,7 +111,7 @@ adapter provides – typical use in a fire station/EMS environment:
111
111
  automation at it (or just play the URL directly) to have the incident
112
112
  announced over building speakers the moment `io.playtts` fires –
113
113
  useful where members aren't all looking at a screen.
114
- - **Live headcount / feedback board.** The `einsatz.rueckmeldungAnzahl.*`
114
+ - **Live headcount / feedback board.** The `einsatz.rueckmeldungen.*`
115
115
  counters (`rollen.ek`/`.gf`/`.zf`/`.vf` per role, `funktionen.agt`/`.fzf`/
116
116
  `.ma`/`.med` per qualification) update in real time as responders
117
117
  confirm via the app – bind them to gauge or number widgets for an
@@ -439,21 +439,21 @@ The most recently finished incident remains available via
439
439
  | `beschreibung` | string | Description for `stichwort`, resolved locally (not sent by the server) - see [Rescue service](#rescue-service)/[Keyword descriptions](#keyword-descriptions) below. `null` if nothing matched |
440
440
  | `ort` | string | Location/town |
441
441
  | `ortsteil` | string | District (if different from `ort`) |
442
- | `zeitstempel` | string (date) | Alarm time |
442
+ | `alarmierungszeit` | string (date) | Alarm time |
443
443
  | `ablaufzeit` | string (date) | End of the standby display duration, basis for `restzeit` |
444
444
  | `sondersignal` | number | `1` = special signal (lights & siren), otherwise none |
445
445
  | `latitude` / `longitude` | number | Incident location (normalized from wgs84 fields or GeoJSON centroid) |
446
446
  | `kartenbildPfad` | string | Path to the most recently generated incident map image (PNG) - see [Incident map image](#incident-map-image). Empty until the first image for the current incident is ready; also cleared (stays empty) at the start of a new incident, if generation fails, or if it doesn't finish within the OSM timeout, and - like the other fields above - on `io.standby`. The underlying image file itself is not deleted when the state is cleared (only the 10-image retention limit removes files, see [Incident map image](#incident-map-image)) |
447
447
  | `routenGesamt` | number | Number of routes in the current incident |
448
- | `rueckmeldungGesamt` | number | Total feedback count for the current incident |
449
- | `rueckmeldungAnzahl.rollen.ek` | number | Feedback count as team member ("Einsatzkraft") |
450
- | `rueckmeldungAnzahl.rollen.gf` | number | Feedback count as crew leader ("Gruppenführer") |
451
- | `rueckmeldungAnzahl.rollen.zf` | number | Feedback count as division chief ("Zugführer") |
452
- | `rueckmeldungAnzahl.rollen.vf` | number | Feedback count as group commander ("Verbandsführer") |
453
- | `rueckmeldungAnzahl.funktionen.agt` | number | Feedback count with breathing-apparatus qualification ("Atemschutzgeräteträger") |
454
- | `rueckmeldungAnzahl.funktionen.fzf` | number | Feedback count as vehicle commander ("Fahrzeugführer") |
455
- | `rueckmeldungAnzahl.funktionen.ma` | number | Feedback count as driver/operator ("Maschinist") |
456
- | `rueckmeldungAnzahl.funktionen.med` | number | Feedback count with a medical qualification |
448
+ | `rueckmeldungenGesamt` | number | Total feedback count for the current incident |
449
+ | `rueckmeldungen.rollen.ek` | number | Feedback count as team member ("Einsatzkraft") |
450
+ | `rueckmeldungen.rollen.gf` | number | Feedback count as crew leader ("Gruppenführer") |
451
+ | `rueckmeldungen.rollen.zf` | number | Feedback count as division chief ("Zugführer") |
452
+ | `rueckmeldungen.rollen.vf` | number | Feedback count as group commander ("Verbandsführer") |
453
+ | `rueckmeldungen.funktionen.agt` | number | Feedback count with breathing-apparatus qualification ("Atemschutzgeräteträger") |
454
+ | `rueckmeldungen.funktionen.fzf` | number | Feedback count as vehicle commander ("Fahrzeugführer") |
455
+ | `rueckmeldungen.funktionen.ma` | number | Feedback count as driver/operator ("Maschinist") |
456
+ | `rueckmeldungen.funktionen.med` | number | Feedback count with a medical qualification |
457
457
 
458
458
  ### einsatz.json
459
459
 
@@ -468,7 +468,7 @@ incident – see the note in the [`einsatz`](#einsatz) section.
468
468
 
469
469
  | State | Type | Description |
470
470
  | --- | --- | --- |
471
- | `current` | string (JSON array) | Current incident's flat data: the same 12 fields as the individual `einsatz.*` states above (`id` … `zeitstempel`, plus `beschreibung`, `lat`/`lon`), plus `registeredMonitor`/`registeredMonitorName` (the monitor the adapter was registered to at the time), bundled as one object inside a single-element array (`[]` if no incident is active) – the array wrapper is needed because most table widgets require an array at the root, not a bare object |
471
+ | `current` | string (JSON array) | Current incident's flat data: the same 12 fields as the individual `einsatz.*` states above (`id` … `sondersignal`, plus `beschreibung`, `alarmierungszeit`, `lat`/`lon`), plus `registeredMonitor`/`registeredMonitorName` (the monitor the adapter was registered to at the time), bundled as one object inside a single-element array (`[]` if no incident is active) – the array wrapper is needed because most table widgets require an array at the root, not a bare object |
472
472
  | `history10` | string (JSON array) | Last 10 completed incidents, same shape as `current`, one array entry per incident, written on `io.standby` |
473
473
  | `routen` | string (JSON array) | Routes of the current incident; each entry has `nr_wache`, `name_wache`, `color`, `lat`, `lon` (`position` resolved to flat `lat`/`lon`) |
474
474
  | `rueckmeldungen` | string (JSON array) | Feedback entries of the current incident, as received from the server |
@@ -514,6 +514,27 @@ example.
514
514
 
515
515
  ## Changelog
516
516
 
517
+ ### 0.7.37 (2026-08-26)
518
+
519
+ - Fixed a bug where a routes update (`io.routes`) or TTS announcement
520
+ (`io.playtts`) arriving after an incident had already ended
521
+ (`io.standby`) could revive `einsatz.json.current`/`.routen`/
522
+ `einsatz.routenGesamt` or `einsatz.tts.last`/`.lastTimestamp` for the
523
+ already-finished incident, while every other `einsatz.*` field
524
+ correctly stayed cleared. Both handlers now ignore such events while
525
+ no incident is active.
526
+
527
+ ### 0.7.36 (2026-08-25)
528
+
529
+ - Object structure change: `einsatz.rueckmeldungAnzahl` is now
530
+ **`einsatz.rueckmeldungen`** (the `rollen.*`/`funktionen.*`
531
+ sub-channels are unchanged), `einsatz.rueckmeldungGesamt` is now
532
+ **`einsatz.rueckmeldungenGesamt`**, and `einsatz.zeitstempel` is now
533
+ **`einsatz.alarmierungszeit`**. Old objects (including now-orphaned
534
+ channel/folder objects, not just states) are removed automatically
535
+ on upgrade; scripts/VIS bindings referencing the old paths need to
536
+ be updated - see [einsatz](#einsatz).
537
+
517
538
  ### 0.7.35 (2026-08-24)
518
539
 
519
540
  - Object structure change: the eight feedback counters under
@@ -549,31 +570,6 @@ example.
549
570
  marker dot's size isn't configurable) is now hidden while **Show
550
571
  incident-area polygon** is off.
551
572
 
552
- ### 0.7.32 (2026-08-24)
553
-
554
- - Fixed a startup-only error: if the adapter was stopped while it was
555
- still creating its ioBroker objects (e.g. a fast restart right after
556
- an update), a "Connection is closed" failure could surface as an
557
- `unhandled promise rejection` error in the log instead of being
558
- caught - harmless, but noisy. Object initialization now stops
559
- cleanly and logs a single warning instead.
560
-
561
- ### 0.7.31 (2026-08-24)
562
-
563
- - Fixed two `einsatz.kartenbildPfad` timing/staleness issues:
564
- - Alarm processing now **waits** for the
565
- [incident map image](#incident-map-image) to finish before
566
- continuing, instead of generating it in the background - so
567
- `einsatz.kartenbildPfad` and `einsatz.alarmAktiv` become available
568
- together. The wait is capped by a new configurable **OSM timeout**
569
- (1-60s, default 10s): if the image isn't ready in time, a warning
570
- is logged and `kartenbildPfad` stays empty for that incident
571
- instead of blocking alarm processing indefinitely.
572
- - `einsatz.kartenbildPfad` is now reset immediately when a new
573
- incident starts, instead of possibly still showing a previous
574
- incident's stale image path (e.g. when the new incident has no
575
- coordinates, or the map image feature just got disabled).
576
-
577
573
  Older entries have moved to [CHANGELOG_OLD.md](CHANGELOG_OLD.md) - this
578
574
  section shows only the 5 most recent versions.
579
575
 
@@ -26,8 +26,8 @@
26
26
  "Match": "Abgleich",
27
27
  "Maximum time to wait for the map image (OSM tile download and composition) to finish before continuing to process the incident. If it isn't ready within this time, a warning is logged and einsatz.kartenbildPfad stays empty for this incident.": "Maximale Wartezeit auf die Fertigstellung des Kartenbilds (OSM-Kachel-Download und -Zusammensetzung), bevor mit der Verarbeitung des Einsatzes fortgefahren wird. Ist es nicht rechtzeitig fertig, wird eine Warnung geloggt und einsatz.kartenbildPfad bleibt für diesen Einsatz leer.",
28
28
  "Monitor ID": "Monitor-ID",
29
- "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "OpenStreetMap-Zoomstufe (1 = ganze Welt, 19 = Gebäudeebene). Fester Wert für die Punkt-Markierung; Maximalwert für den Polygon-Umriss, wird bei Bedarf automatisch reduziert, damit er vollständig sichtbar bleibt (siehe 'Einsatzgebiet-Polygon anzeigen').",
30
29
  "OSM timeout (s)": "OSM-Timeout (s)",
30
+ "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "OpenStreetMap-Zoomstufe (1 = ganze Welt, 19 = Gebäudeebene). Fester Wert für die Punkt-Markierung; Maximalwert für den Polygon-Umriss, wird bei Bedarf automatisch reduziert, damit er vollständig sichtbar bleibt (siehe 'Einsatzgebiet-Polygon anzeigen').",
31
31
  "Outline thickness (px)": "Umriss-Strichstärke (px)",
32
32
  "Process rescue-service incidents": "Rettungsdienst-Einsätze verarbeiten",
33
33
  "Reconnect delay (s)": "Wiederverbindungs-Verzögerung (s)",
@@ -26,8 +26,8 @@
26
26
  "Match": "Fósforo",
27
27
  "Maximum time to wait for the map image (OSM tile download and composition) to finish before continuing to process the incident. If it isn't ready within this time, a warning is logged and einsatz.kartenbildPfad stays empty for this incident.": "Tiempo máximo de espera para que la imagen del mapa (descarga y composición de teselas OSM) se complete antes de continuar procesando el incidente. Si no está lista dentro de este tiempo, se registra una advertencia y einsatz.kartenbildPfad permanece vacío para este incidente.",
28
28
  "Monitor ID": "Identificador del monitor",
29
- "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Nivel de zoom de OpenStreetMap (1 = mundo entero, 19 = nivel de edificio). Zoom fijo para el punto marcador; un máximo para el contorno del polígono, reducido automáticamente si es necesario para mantenerlo completamente visible (ver 'Mostrar polígono del área del incidente').",
30
29
  "OSM timeout (s)": "Tiempo de espera de OSM (s)",
30
+ "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Nivel de zoom de OpenStreetMap (1 = mundo entero, 19 = nivel de edificio). Zoom fijo para el punto marcador; un máximo para el contorno del polígono, reducido automáticamente si es necesario para mantenerlo completamente visible (ver 'Mostrar polígono del área del incidente').",
31
31
  "Outline thickness (px)": "Grosor del contorno (px)",
32
32
  "Process rescue-service incidents": "Procesar incidentes del servicio de rescate",
33
33
  "Reconnect delay (s)": "Retardo(s) de reconexión",
@@ -26,8 +26,8 @@
26
26
  "Match": "Correspondre",
27
27
  "Maximum time to wait for the map image (OSM tile download and composition) to finish before continuing to process the incident. If it isn't ready within this time, a warning is logged and einsatz.kartenbildPfad stays empty for this incident.": "Délai d'attente maximal pour que l'image de carte (téléchargement et composition des tuiles OSM) soit terminée avant de continuer à traiter l'intervention. Si elle n'est pas prête dans ce délai, un avertissement est consigné et einsatz.kartenbildPfad reste vide pour cette intervention.",
28
28
  "Monitor ID": "ID du moniteur",
29
- "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Niveau de zoom OpenStreetMap (1 = monde entier, 19 = niveau du bâtiment). Zoom fixe pour le point marqueur ; un maximum pour le contour du polygone, réduit automatiquement si nécessaire pour le garder entièrement visible (voir 'Afficher le polygone de la zone d'intervention').",
30
29
  "OSM timeout (s)": "Délai d'attente OSM (s)",
30
+ "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Niveau de zoom OpenStreetMap (1 = monde entier, 19 = niveau du bâtiment). Zoom fixe pour le point marqueur ; un maximum pour le contour du polygone, réduit automatiquement si nécessaire pour le garder entièrement visible (voir 'Afficher le polygone de la zone d'intervention').",
31
31
  "Outline thickness (px)": "Épaisseur du contour (px)",
32
32
  "Process rescue-service incidents": "Traiter les incidents du service de secours",
33
33
  "Reconnect delay (s)": "Délai(s) de reconnexion",
@@ -26,8 +26,8 @@
26
26
  "Match": "Incontro",
27
27
  "Maximum time to wait for the map image (OSM tile download and composition) to finish before continuing to process the incident. If it isn't ready within this time, a warning is logged and einsatz.kartenbildPfad stays empty for this incident.": "Tempo massimo di attesa per il completamento dell'immagine della mappa (download e composizione dei tile OSM) prima di continuare a elaborare l'intervento. Se non è pronta entro questo tempo, viene registrato un avviso e einsatz.kartenbildPfad rimane vuoto per questo intervento.",
28
28
  "Monitor ID": "Monitorare l'identità",
29
- "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Livello di zoom di OpenStreetMap (1 = mondo intero, 19 = livello edificio). Zoom fisso per il punto marcatore; un massimo per il contorno del poligono, ridotto automaticamente se necessario per mantenerlo completamente visibile (vedi 'Mostra il poligono dell'area dell'incidente').",
30
29
  "OSM timeout (s)": "Timeout OSM (s)",
30
+ "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Livello di zoom di OpenStreetMap (1 = mondo intero, 19 = livello edificio). Zoom fisso per il punto marcatore; un massimo per il contorno del poligono, ridotto automaticamente se necessario per mantenerlo completamente visibile (vedi 'Mostra il poligono dell'area dell'incidente').",
31
31
  "Outline thickness (px)": "Spessore del contorno (px)",
32
32
  "Process rescue-service incidents": "Elaborare gli incidenti del servizio di soccorso",
33
33
  "Reconnect delay (s)": "Ritardo/i di riconnessione",
@@ -26,8 +26,8 @@
26
26
  "Match": "Overeenkomst",
27
27
  "Maximum time to wait for the map image (OSM tile download and composition) to finish before continuing to process the incident. If it isn't ready within this time, a warning is logged and einsatz.kartenbildPfad stays empty for this incident.": "Maximale wachttijd voor het voltooien van de kaartafbeelding (OSM-tegels downloaden en samenstellen) voordat wordt doorgegaan met het verwerken van het incident. Is deze niet op tijd klaar, dan wordt een waarschuwing gelogd en blijft einsatz.kartenbildPfad leeg voor dit incident.",
28
28
  "Monitor ID": "Monitor-ID",
29
- "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "OpenStreetMap-zoomniveau (1 = hele wereld, 19 = gebouwniveau). Vast zoomniveau voor de puntmarkering; een maximum voor de polygoon-contour, automatisch verlaagd indien nodig om deze volledig zichtbaar te houden (zie 'Incidentgebied-polygoon tonen').",
30
29
  "OSM timeout (s)": "OSM-time-out (s)",
30
+ "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "OpenStreetMap-zoomniveau (1 = hele wereld, 19 = gebouwniveau). Vast zoomniveau voor de puntmarkering; een maximum voor de polygoon-contour, automatisch verlaagd indien nodig om deze volledig zichtbaar te houden (zie 'Incidentgebied-polygoon tonen').",
31
31
  "Outline thickness (px)": "Contourdikte (px)",
32
32
  "Process rescue-service incidents": "Reddingsdienst-incidenten verwerken",
33
33
  "Reconnect delay (s)": "Vertraging(en) opnieuw verbinden",
@@ -26,8 +26,8 @@
26
26
  "Match": "Mecz",
27
27
  "Maximum time to wait for the map image (OSM tile download and composition) to finish before continuing to process the incident. If it isn't ready within this time, a warning is logged and einsatz.kartenbildPfad stays empty for this incident.": "Maksymalny czas oczekiwania na ukończenie obrazu mapy (pobranie i złożenie kafelków OSM) przed kontynuowaniem przetwarzania zdarzenia. Jeśli nie będzie gotowy w tym czasie, zostanie zarejestrowane ostrzeżenie, a einsatz.kartenbildPfad pozostanie puste dla tego zdarzenia.",
28
28
  "Monitor ID": "Identyfikator monitora",
29
- "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Poziom powiększenia OpenStreetMap (1 = cały świat, 19 = poziom budynku). Stały poziom dla znacznika punktowego; maksimum dla konturu poligonu, automatycznie zmniejszane w razie potrzeby, aby pozostał w pełni widoczny (zobacz 'Pokaż poligon obszaru zdarzenia').",
30
29
  "OSM timeout (s)": "Limit czasu OSM (s)",
30
+ "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Poziom powiększenia OpenStreetMap (1 = cały świat, 19 = poziom budynku). Stały poziom dla znacznika punktowego; maksimum dla konturu poligonu, automatycznie zmniejszane w razie potrzeby, aby pozostał w pełni widoczny (zobacz 'Pokaż poligon obszaru zdarzenia').",
31
31
  "Outline thickness (px)": "Grubość konturu (px)",
32
32
  "Process rescue-service incidents": "Przetwarzaj zdarzenia ratownictwa medycznego",
33
33
  "Reconnect delay (s)": "Opóźnienie ponownego podłączenia",
@@ -26,8 +26,8 @@
26
26
  "Match": "Corresponder",
27
27
  "Maximum time to wait for the map image (OSM tile download and composition) to finish before continuing to process the incident. If it isn't ready within this time, a warning is logged and einsatz.kartenbildPfad stays empty for this incident.": "Tempo máximo de espera para que a imagem do mapa (download e composição dos blocos OSM) seja concluída antes de continuar a processar a ocorrência. Se não estiver pronta dentro deste tempo, um aviso é registado e einsatz.kartenbildPfad permanece vazio para esta ocorrência.",
28
28
  "Monitor ID": "ID do monitor",
29
- "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Nível de zoom do OpenStreetMap (1 = mundo inteiro, 19 = nível de edifício). Zoom fixo para o ponto marcador; um máximo para o contorno do polígono, reduzido automaticamente se necessário para mantê-lo totalmente visível (ver 'Mostrar polígono da área da ocorrência').",
30
29
  "OSM timeout (s)": "Tempo limite OSM (s)",
30
+ "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Nível de zoom do OpenStreetMap (1 = mundo inteiro, 19 = nível de edifício). Zoom fixo para o ponto marcador; um máximo para o contorno do polígono, reduzido automaticamente se necessário para mantê-lo totalmente visível (ver 'Mostrar polígono da área da ocorrência').",
31
31
  "Outline thickness (px)": "Espessura do contorno (px)",
32
32
  "Process rescue-service incidents": "Processar ocorrências do serviço de resgate",
33
33
  "Reconnect delay (s)": "Atraso(s) de reconexão",
@@ -26,8 +26,8 @@
26
26
  "Match": "Соответствовать",
27
27
  "Maximum time to wait for the map image (OSM tile download and composition) to finish before continuing to process the incident. If it isn't ready within this time, a warning is logged and einsatz.kartenbildPfad stays empty for this incident.": "Максимальное время ожидания завершения создания карты (загрузка и сборка тайлов OSM) перед продолжением обработки вызова. Если изображение не готово за это время, регистрируется предупреждение, а einsatz.kartenbildPfad остаётся пустым для этого вызова.",
28
28
  "Monitor ID": "Идентификатор монитора",
29
- "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Уровень масштабирования OpenStreetMap (1 = весь мир, 19 = уровень здания). Фиксированный масштаб для точечного маркера; максимум для контура полигона, автоматически уменьшается при необходимости, чтобы он оставался полностью видимым (см. 'Показывать полигон зоны вызова').",
30
29
  "OSM timeout (s)": "Тайм-аут OSM (с)",
30
+ "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Уровень масштабирования OpenStreetMap (1 = весь мир, 19 = уровень здания). Фиксированный масштаб для точечного маркера; максимум для контура полигона, автоматически уменьшается при необходимости, чтобы он оставался полностью видимым (см. 'Показывать полигон зоны вызова').",
31
31
  "Outline thickness (px)": "Толщина контура (px)",
32
32
  "Process rescue-service incidents": "Обрабатывать вызовы скорой помощи",
33
33
  "Reconnect delay (s)": "Задержка повторного подключения (с)",
@@ -26,8 +26,8 @@
26
26
  "Match": "Матч",
27
27
  "Maximum time to wait for the map image (OSM tile download and composition) to finish before continuing to process the incident. If it isn't ready within this time, a warning is logged and einsatz.kartenbildPfad stays empty for this incident.": "Максимальний час очікування завершення створення карти (завантаження та складання тайлів OSM) перед продовженням обробки виклику. Якщо зображення не готове за цей час, реєструється попередження, а einsatz.kartenbildPfad залишається порожнім для цього виклику.",
28
28
  "Monitor ID": "ID монітора",
29
- "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Рівень масштабування OpenStreetMap (1 = увесь світ, 19 = рівень будівлі). Фіксований масштаб для точкового маркера; максимум для контуру полігона, автоматично зменшується за потреби, щоб він залишався повністю видимим (див. 'Показувати полігон зони виклику').",
30
29
  "OSM timeout (s)": "Тайм-аут OSM (с)",
30
+ "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "Рівень масштабування OpenStreetMap (1 = увесь світ, 19 = рівень будівлі). Фіксований масштаб для точкового маркера; максимум для контуру полігона, автоматично зменшується за потреби, щоб він залишався повністю видимим (див. 'Показувати полігон зони виклику').",
31
31
  "Outline thickness (px)": "Товщина контуру (px)",
32
32
  "Process rescue-service incidents": "Обробляти виклики швидкої допомоги",
33
33
  "Reconnect delay (s)": "Затримка повторного підключення (с)",
@@ -26,8 +26,8 @@
26
26
  "Match": "匹配",
27
27
  "Maximum time to wait for the map image (OSM tile download and composition) to finish before continuing to process the incident. If it isn't ready within this time, a warning is logged and einsatz.kartenbildPfad stays empty for this incident.": "生成地图图片(下载并拼接 OSM 瓦片)的最长等待时间,超过后将继续处理该出警事件。如果在此时间内未能完成,将记录一条警告,且本次事件的 einsatz.kartenbildPfad 将保持为空。",
28
28
  "Monitor ID": "显示器ID",
29
- "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "OpenStreetMap 缩放级别(1 = 整个世界,19 = 建筑物级别)。标记点使用固定缩放级别;多边形轮廓使用最大缩放级别,必要时会自动缩小以保持完全可见(参见\"显示事件区域多边形\")。",
30
29
  "OSM timeout (s)": "OSM 超时(秒)",
30
+ "OpenStreetMap zoom level (1 = whole world, 19 = building level). Fixed zoom for the marker dot; a maximum for the polygon outline, auto-reduced if needed to keep it fully visible (see 'Show incident-area polygon').": "OpenStreetMap 缩放级别(1 = 整个世界,19 = 建筑物级别)。标记点使用固定缩放级别;多边形轮廓使用最大缩放级别,必要时会自动缩小以保持完全可见(参见\"显示事件区域多边形\")。",
31
31
  "Outline thickness (px)": "轮廓粗细(px)",
32
32
  "Process rescue-service incidents": "处理急救服务事件",
33
33
  "Reconnect delay (s)": "重新连接延迟(秒)",
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "waip-web",
4
- "version": "0.7.35",
4
+ "version": "0.7.37",
5
5
  "news": {
6
+ "0.7.37": {
7
+ "en": "Fixed a bug where a routes update (io.routes) or TTS announcement (io.playtts) arriving after an incident had already ended (io.standby) could revive einsatz.json.current/.routen/einsatz.routenGesamt or einsatz.tts.last/.lastTimestamp for the already-finished incident, while every other einsatz.* field correctly stayed cleared. Both handlers now ignore such events while no incident is active.",
8
+ "de": "Einen Fehler behoben, bei dem eine Routen-Aktualisierung (io.routes) oder eine TTS-Ansage (io.playtts), die erst nach Abschluss eines Einsatzes (io.standby) eintraf, einsatz.json.current/.routen/einsatz.routenGesamt bzw. einsatz.tts.last/.lastTimestamp für den bereits beendeten Einsatz wiederbeleben konnte, während alle anderen einsatz.*-Felder korrekt geleert blieben. Beide Handler ignorieren solche Events jetzt, solange kein Einsatz aktiv ist.",
9
+ "ru": "Исправлена ​​ошибка, из-за которой обновление маршрутов (io.routes) или объявление TTS (io.playtts), поступившее после того, как инцидент уже завершился (io.standby), могло восстановить einsatz.json.current/.routen/einsatz.routenGesamt или einsatz.tts.last/.lastTimestamp для уже завершенного инцидента, в то время как все остальные поля einsatz.* корректно оставались очищенными. Оба обработчика теперь игнорируют такие события, пока ни один инцидент не активен.",
10
+ "pt": "Corrigido um bug onde uma atualização de rotas (io.routes) ou anúncio de TTS (io.playtts) chegando após um incidente já ter terminado (io.standby) poderia reviver einsatz.json.current/.routen/einsatz.routenGesamt ou einsatz.tts.last/.lastTimestamp para o incidente já concluído, enquanto todos os outros campos einsatz.* permaneciam corretamente limpos. Ambos os manipuladores agora ignoram tais eventos enquanto nenhum incidente estiver ativo.",
11
+ "nl": "Een bug opgelost waarbij een route-update (io.routes) of TTS-aankondiging (io.playtts) die binnenkwam nadat een incident al was geëindigd (io.standby) einsatz.json.current/.routen/einsatz.routenGesamt of einsatz.tts.last/.lastTimestamp voor het reeds voltooide incident kon doen herleven, terwijl elk ander einsatz.*-veld correct leeg bleef. Beide handlers negeren nu dergelijke gebeurtenissen terwijl er geen incident actief is.",
12
+ "fr": "Correction d'un bug où une mise à jour des itinéraires (io.routes) ou une annonce TTS (io.playtts) arrivant après la fin d'un incident (io.standby) pouvait relancer einsatz.json.current/.routen/einsatz.routenGesamt ou einsatz.tts.last/.lastTimestamp pour l'incident déjà terminé, tandis que tous les autres champs einsatz.* restaient correctement effacés. Les deux gestionnaires ignorent désormais ces événements tant qu’aucun incident n’est actif.",
13
+ "it": "Risolto un bug per il quale un aggiornamento dei percorsi (io.routes) o un annuncio TTS (io.playtts) arrivato dopo che un incidente era già terminato (io.standby) poteva riattivare einsatz.json.current/.routen/einsatz.routenGesamt o einsatz.tts.last/.lastTimestamp per l'incidente già terminato, mentre ogni altro campo einsatz.* rimaneva correttamente cancellato. Entrambi i gestori ora ignorano tali eventi mentre non è attivo alcun incidente.",
14
+ "es": "Se corrigió un error por el cual una actualización de rutas (io.routes) o un anuncio TTS (io.playtts) que llegaba después de que un incidente ya había finalizado (io.standby) podía reactivar einsatz.json.current/.routen/einsatz.routenGesamt o einsatz.tts.last/.lastTimestamp para el incidente ya finalizado, mientras que todos los demás campos einsatz.* permanecían correctamente despejados. Ambos controladores ahora ignoran dichos eventos mientras no haya ningún incidente activo.",
15
+ "pl": "Naprawiono błąd, który powodował, że aktualizacja tras (io.routes) lub ogłoszenie TTS (io.playtts) pojawiające się po zakończeniu incydentu (io.standby) mogły przywrócić einsatz.json.current/.routen/einsatz.routenGesamt lub einsatz.tts.last/.lastTimestamp dla już zakończonego zdarzenia, podczas gdy wszystkie pozostałe pola einsatz.* pozostały poprawnie wyczyszczone. Obydwa programy obsługi ignorują teraz takie zdarzenia, dopóki żadne zdarzenie nie jest aktywne.",
16
+ "uk": "Виправлено помилку, через яку оновлення маршрутів (io.routes) або повідомлення TTS (io.playtts), що надходить після завершення інциденту (io.standby), могло відновити einsatz.json.current/.routen/einsatz.routenGesamt або einsatz.tts.last/.lastTimestamp для вже завершеного інциденту, тоді як усі інші einsatz.* поле правильно залишилося очищеним. Обидва обробники тепер ігнорують такі події, поки немає активних інцидентів.",
17
+ "zh-cn": "修复了以下错误:在事件已经结束 (io.standby) 后到达的路线更新 (io.routes) 或 TTS 公告 (io.playtts) 可能会恢复已完成事件的 einsatz.json.current/.routen/einsatz.routenGesamt 或 einsatz.tts.last/.lastTimestamp,而所有其他 einsatz.* 字段正确保持清除状态。现在,当没有事件处于活动状态时,两个处理程序都会忽略此类事件。"
18
+ },
19
+ "0.7.36": {
20
+ "en": "Object structure change: einsatz.rueckmeldungAnzahl is now einsatz.rueckmeldungen (rollen.*/funktionen.* sub-channels unchanged), einsatz.rueckmeldungGesamt is now einsatz.rueckmeldungenGesamt, and einsatz.zeitstempel is now einsatz.alarmierungszeit. Old objects are automatically removed on upgrade (including now-orphaned channel/folder objects, not just states); scripts/VIS bindings referencing the old paths need to be updated.",
21
+ "de": "Objektstruktur geändert: einsatz.rueckmeldungAnzahl heißt jetzt einsatz.rueckmeldungen (Unter-Kanäle rollen.*/funktionen.* unverändert), einsatz.rueckmeldungGesamt heißt jetzt einsatz.rueckmeldungenGesamt, und einsatz.zeitstempel heißt jetzt einsatz.alarmierungszeit. Alte Objekte werden beim Update automatisch entfernt (auch jetzt verwaiste Kanal-/Ordner-Objekte, nicht nur States); Skripte/VIS-Bindings, die die alten Pfade nutzen, müssen angepasst werden.",
22
+ "es": "Cambio en la estructura de objetos: einsatz.rueckmeldungAnzahl ahora es einsatz.rueckmeldungen (los subcanales rollen.*/funktionen.* no cambian), einsatz.rueckmeldungGesamt ahora es einsatz.rueckmeldungenGesamt, y einsatz.zeitstempel ahora es einsatz.alarmierungszeit. Los objetos antiguos se eliminan automáticamente al actualizar (incluidos los objetos de canal/carpeta ahora huérfanos, no solo los estados); los scripts/vinculaciones de VIS que hagan referencia a las rutas antiguas deben actualizarse.",
23
+ "fr": "Changement de la structure des objets : einsatz.rueckmeldungAnzahl s'appelle désormais einsatz.rueckmeldungen (les sous-canaux rollen.*/funktionen.* restent inchangés), einsatz.rueckmeldungGesamt s'appelle désormais einsatz.rueckmeldungenGesamt, et einsatz.zeitstempel s'appelle désormais einsatz.alarmierungszeit. Les anciens objets sont automatiquement supprimés lors de la mise à jour (y compris les objets de canal/dossier désormais orphelins, pas seulement les états) ; les scripts/liaisons VIS référençant les anciens chemins doivent être mis à jour.",
24
+ "it": "Modifica della struttura degli oggetti: einsatz.rueckmeldungAnzahl ora si chiama einsatz.rueckmeldungen (i sottocanali rollen.*/funktionen.* restano invariati), einsatz.rueckmeldungGesamt ora si chiama einsatz.rueckmeldungenGesamt, e einsatz.zeitstempel ora si chiama einsatz.alarmierungszeit. I vecchi oggetti vengono rimossi automaticamente durante l'aggiornamento (inclusi gli oggetti canale/cartella ora orfani, non solo gli stati); script/binding VIS che fanno riferimento ai vecchi percorsi devono essere aggiornati.",
25
+ "nl": "Wijziging in de objectstructuur: einsatz.rueckmeldungAnzahl heet nu einsatz.rueckmeldungen (subkanalen rollen.*/funktionen.* ongewijzigd), einsatz.rueckmeldungGesamt heet nu einsatz.rueckmeldungenGesamt, en einsatz.zeitstempel heet nu einsatz.alarmierungszeit. Oude objecten worden bij een update automatisch verwijderd (ook nu wees geworden kanaal-/mapobjecten, niet alleen states); scripts/VIS-bindingen die naar de oude paden verwijzen, moeten worden aangepast.",
26
+ "pl": "Zmiana struktury obiektów: einsatz.rueckmeldungAnzahl nazywa się teraz einsatz.rueckmeldungen (podkanały rollen.*/funktionen.* bez zmian), einsatz.rueckmeldungGesamt nazywa się teraz einsatz.rueckmeldungenGesamt, a einsatz.zeitstempel nazywa się teraz einsatz.alarmierungszeit. Stare obiekty są automatycznie usuwane podczas aktualizacji (w tym osierocone teraz obiekty kanałów/folderów, nie tylko stany); skrypty/powiązania VIS odwołujące się do starych ścieżek należy zaktualizować.",
27
+ "pt": "Alteração na estrutura de objetos: einsatz.rueckmeldungAnzahl agora chama-se einsatz.rueckmeldungen (subcanais rollen.*/funktionen.* inalterados), einsatz.rueckmeldungGesamt agora chama-se einsatz.rueckmeldungenGesamt, e einsatz.zeitstempel agora chama-se einsatz.alarmierungszeit. Os objetos antigos são removidos automaticamente na atualização (incluindo objetos de canal/pasta agora órfãos, não apenas estados); scripts/vinculações do VIS que referenciam os caminhos antigos devem ser atualizados.",
28
+ "ru": "Изменение структуры объектов: einsatz.rueckmeldungAnzahl теперь называется einsatz.rueckmeldungen (подканалы rollen.*/funktionen.* без изменений), einsatz.rueckmeldungGesamt теперь называется einsatz.rueckmeldungenGesamt, а einsatz.zeitstempel теперь называется einsatz.alarmierungszeit. Старые объекты автоматически удаляются при обновлении (включая ставшие теперь бесхозными объекты каналов/папок, а не только состояния); скрипты/привязки VIS, ссылающиеся на старые пути, необходимо обновить.",
29
+ "uk": "Зміна структури об'єктів: einsatz.rueckmeldungAnzahl тепер називається einsatz.rueckmeldungen (підканали rollen.*/funktionen.* без змін), einsatz.rueckmeldungGesamt тепер називається einsatz.rueckmeldungenGesamt, а einsatz.zeitstempel тепер називається einsatz.alarmierungszeit. Старі об'єкти автоматично видаляються під час оновлення (включно з тепер осиротілими об'єктами каналів/папок, а не лише станами); скрипти/прив'язки VIS, що посилаються на старі шляхи, потрібно оновити.",
30
+ "zh-cn": "对象结构变更:einsatz.rueckmeldungAnzahl 现更名为 einsatz.rueckmeldungen(子通道 rollen.*/funktionen.* 保持不变),einsatz.rueckmeldungGesamt 现更名为 einsatz.rueckmeldungenGesamt,einsatz.zeitstempel 现更名为 einsatz.alarmierungszeit。旧对象会在更新时自动移除(包括现已成为孤立对象的通道/文件夹对象,不仅仅是状态);引用旧路径的脚本/VIS 绑定需要更新。"
31
+ },
6
32
  "0.7.35": {
7
33
  "en": "Object structure change: the eight feedback counters under einsatz.rueckmeldungAnzahl are now grouped into two sub-channels - rollen (ek/gf/zf/vf, by role) and funktionen (agt/fzf/ma/med, by qualification) - instead of sitting flat next to each other. The old flat states are automatically removed on upgrade; scripts/VIS bindings referencing the old paths need to be updated to the new einsatz.rueckmeldungAnzahl.rollen.*/funktionen.* paths.",
8
34
  "de": "Objektstruktur geändert: Die acht Rückmeldungs-Zähler unter einsatz.rueckmeldungAnzahl sind jetzt in zwei Unter-Kanälen gruppiert - rollen (ek/gf/zf/vf, nach Rolle) und funktionen (agt/fzf/ma/med, nach Zusatzfunktion) - statt flach nebeneinander zu liegen. Die alten flachen States werden beim Update automatisch entfernt; Skripte/VIS-Bindings, die die alten Pfade nutzen, müssen auf die neuen Pfade einsatz.rueckmeldungAnzahl.rollen.*/funktionen.* angepasst werden.",
@@ -67,32 +93,6 @@
67
93
  "ru": "Исправлены две проблемы синхронизации einsatz.kartenbildPfad: обработка тревоги теперь ожидает изображение карты вызова (ограничено новым настраиваемым тайм-аутом OSM, 1-60с, по умолчанию 10с) перед продолжением, поэтому kartenbildPfad и alarmAktiv становятся доступны одновременно, а не kartenbildPfad обновляется позже асинхронно. Если изображение не готово вовремя, регистрируется предупреждение, а kartenbildPfad остаётся пустым. Кроме того, kartenbildPfad теперь сразу сбрасывается в начале нового вызова, вместо того чтобы по-прежнему показывать устаревший путь изображения предыдущего вызова.",
68
94
  "uk": "Виправлено дві проблеми синхронізації einsatz.kartenbildPfad: обробка тривоги тепер очікує зображення карти виклику (обмежено новим налаштовуваним тайм-аутом OSM, 1-60с, типово 10с) перед продовженням, тому kartenbildPfad і alarmAktiv стають доступні одночасно, а не kartenbildPfad оновлюється пізніше асинхронно. Якщо зображення не готове вчасно, реєструється попередження, а kartenbildPfad залишається порожнім. Крім того, kartenbildPfad тепер одразу скидається на початку нового виклику, замість того щоб і далі показувати застарілий шлях зображення попереднього виклику.",
69
95
  "zh-cn": "修复了 einsatz.kartenbildPfad 的两个时序问题:警报处理现在会等待事件地图图片生成完毕(受新增可配置的 OSM 超时限制,1-60秒,默认10秒)后再继续,因此 kartenbildPfad 与 alarmAktiv 会同时可用,而不是 kartenbildPfad 之后才异步补上。如果图片未能按时生成,将记录一条警告,且 kartenbildPfad 保持为空。此外,kartenbildPfad 现在会在新事件开始时立即重置,而不是可能仍显示上一个事件的过期图片路径。"
70
- },
71
- "0.7.30": {
72
- "en": "New \"Show incident-area polygon\" checkbox for the incident map image (on by default, switch to a centered dot instead); the auto-zoom-fit margin around the polygon is 30% smaller, default zoom raised to 19, default outline thickness to 4px. einsatz.kartenbildPfad is now cleared on io.standby like other fields. Documented Admin's \"delete instance data\" option for removing generated map images on uninstall. Dropped \"Unofficial\" from both READMEs. Changelog now shows only the 5 most recent versions.",
73
- "de": "Neue Checkbox \"Einsatzgebiet-Polygon anzeigen\" für die Einsatzkarte (standardmäßig an, umschaltbar auf einen zentrierten Punkt); der Rand beim automatischen Heranzoomen an das Polygon ist 30% kleiner, Standard-Zoom auf 19 erhöht, Standard-Strichstärke auf 4px. einsatz.kartenbildPfad wird jetzt wie die übrigen Felder bei io.standby geleert. Admin-Option \"Instanzdaten löschen\" zum Entfernen der Kartenbilder bei Deinstallation dokumentiert. \"Inoffiziell\" aus beiden READMEs entfernt. Der Changelog zeigt jetzt nur noch die letzten 5 Versionen.",
74
- "es": "Nueva casilla \"Mostrar polígono del área del incidente\" para la imagen de mapa del incidente (activada por defecto, cambiable a un punto centrado); el margen del ajuste automático de zoom alrededor del polígono es un 30% más pequeño, el zoom predeterminado se elevó a 19, el grosor de contorno predeterminado a 4px. einsatz.kartenbildPfad ahora se borra en io.standby como los demás campos. Se documentó la opción \"eliminar datos de instancia\" de Admin para eliminar las imágenes de mapa generadas al desinstalar. Se eliminó \"Unofficial\" de ambos README. El registro de cambios ahora muestra solo las 5 versiones más recientes.",
75
- "fr": "Nouvelle case à cocher \"Afficher le polygone de la zone d'intervention\" pour l'image de carte de l'incident (activée par défaut, permet de basculer vers un point centré) ; la marge d'ajustement automatique du zoom autour du polygone est réduite de 30 %, le zoom par défaut passe à 19, l'épaisseur de contour par défaut à 4px. einsatz.kartenbildPfad est désormais effacé lors d'un io.standby comme les autres champs. Documentation de l'option \"supprimer les données d'instance\" d'Admin pour supprimer les images de carte générées lors de la désinstallation. Suppression de \"Unofficial\" des deux README. Le journal des modifications n'affiche désormais que les 5 versions les plus récentes.",
76
- "it": "Nuova casella \"Mostra il poligono dell'area dell'incidente\" per l'immagine della mappa dell'incidente (attiva per impostazione predefinita, passa a un punto centrato); il margine dello zoom automatico attorno al poligono è ridotto del 30%, lo zoom predefinito aumentato a 19, lo spessore del contorno predefinito a 4px. einsatz.kartenbildPfad ora viene cancellato su io.standby come gli altri campi. Documentata l'opzione \"elimina dati istanza\" di Admin per rimuovere le immagini della mappa generate alla disinstallazione. Rimosso \"Unofficial\" da entrambi i README. Il changelog ora mostra solo le 5 versioni più recenti.",
77
- "nl": "Nieuw selectievakje \"Incidentgebied-polygoon tonen\" voor de incidentkaartafbeelding (standaard aan, omschakelbaar naar een gecentreerde stip); de marge van de automatische zoom-aanpassing rond de polygoon is 30% kleiner, standaardzoom verhoogd naar 19, standaard contourdikte naar 4px. einsatz.kartenbildPfad wordt nu bij io.standby gewist zoals de andere velden. Admin-optie \"instantiegegevens verwijderen\" gedocumenteerd voor het verwijderen van gegenereerde kaartafbeeldingen bij deïnstallatie. \"Unofficial\" uit beide READMEs verwijderd. Changelog toont nu alleen de 5 meest recente versies.",
78
- "pl": "Nowe pole wyboru \"Pokaż poligon obszaru zdarzenia\" dla obrazu mapy zdarzenia (domyślnie włączone, można przełączyć na wyśrodkowany punkt); margines automatycznego dopasowania powiększenia wokół poligonu jest o 30% mniejszy, domyślne powiększenie zwiększone do 19, domyślna grubość konturu do 4px. einsatz.kartenbildPfad jest teraz czyszczony przy io.standby tak jak inne pola. Udokumentowano opcję Admina \"usuń dane instancji\" do usuwania wygenerowanych obrazów mapy przy odinstalowywaniu. Usunięto \"Unofficial\" z obu plików README. Dziennik zmian pokazuje teraz tylko 5 najnowszych wersji.",
79
- "pt": "Nova caixa de seleção \"Mostrar polígono da área da ocorrência\" para a imagem de mapa da ocorrência (ativada por padrão, pode ser alternada para um ponto centralizado); a margem de ajuste automático de zoom ao redor do polígono é 30% menor, zoom padrão aumentado para 19, espessura de contorno padrão para 4px. einsatz.kartenbildPfad agora é limpo no io.standby como os outros campos. Documentada a opção \"excluir dados da instância\" do Admin para remover imagens de mapa geradas ao desinstalar. Removido \"Unofficial\" de ambos os READMEs. O changelog agora mostra apenas as 5 versões mais recentes.",
80
- "ru": "Новый флажок \"Показывать полигон зоны вызова\" для изображения карты вызова (по умолчанию включён, можно переключить на центрированную точку); отступ автоматического масштабирования вокруг полигона уменьшен на 30%, масштаб по умолчанию увеличен до 19, толщина контура по умолчанию до 4px. einsatz.kartenbildPfad теперь очищается при io.standby, как и другие поля. Задокументирована опция Admin \"удалить данные экземпляра\" для удаления сгенерированных изображений карты при удалении. Из обоих README удалено слово \"Unofficial\". В журнале изменений теперь отображаются только 5 последних версий.",
81
- "uk": "Новий прапорець \"Показувати полігон зони виклику\" для зображення карти виклику (типово увімкнено, можна перемкнути на центровану точку); відступ автоматичного масштабування навколо полігона зменшено на 30%, типовий масштаб збільшено до 19, типову товщину контуру до 4px. einsatz.kartenbildPfad тепер очищається при io.standby, як і інші поля. Задокументовано опцію Admin \"видалити дані екземпляра\" для видалення згенерованих зображень карти при видаленні. З обох README видалено слово \"Unofficial\". Журнал змін тепер показує лише 5 останніх версій.",
82
- "zh-cn": "为事件地图图像新增\"显示事件区域多边形\"复选框(默认启用,可切换为居中圆点);多边形周围自动缩放适配的边距缩小了30%,默认缩放级别提高到19,默认轮廓粗细提高到4px。einsatz.kartenbildPfad 现在会像其他字段一样在 io.standby 时清空。已记录 Admin 中用于卸载时删除生成的地图图像的\"删除实例数据\"选项。已从两个 README 中删除\"Unofficial\"一词。更新日志现在仅显示最近的5个版本。"
83
- },
84
- "0.7.29": {
85
- "en": "Incident map image now draws the actual incident area WAIP-Web sends (usually a circle polygon), not just a marker dot at its center - falls back to the dot if no polygon is available. Rescue-service keyword decoding now defaults to on for new installations (previously off), matching the rescue-service processing checkbox. Trimmed a redundant justification sentence from both checkboxes' descriptions. The incident area now also always stays fully visible - the adapter automatically zooms out past the configured zoom level if needed, instead of clipping it at the image edge. Outline color and thickness are now configurable too.",
86
- "de": "Die Einsatzkarte zeichnet jetzt das tatsächliche vom WAIP-Web gesendete Einsatzgebiet (meist ein kreisförmiges Polygon) statt nur eine Punkt-Markierung in dessen Mitte - fällt auf den Punkt zurück, falls kein Polygon vorliegt. Die Rettungsdienst-Stichwort-Dekodierung ist bei Neuinstallationen jetzt standardmäßig aktiviert (vorher deaktiviert), passend zur Checkbox für die Rettungsdienst-Verarbeitung. Ein redundanter Begründungssatz wurde aus beiden Checkbox-Beschreibungen entfernt. Das Einsatzgebiet bleibt jetzt außerdem immer vollständig sichtbar - der Adapter zoomt bei Bedarf automatisch über die konfigurierte Zoomstufe hinaus heraus, statt es am Bildrand abzuschneiden. Umrissfarbe und -stärke sind jetzt ebenfalls konfigurierbar.",
87
- "es": "La imagen de mapa del incidente ahora dibuja el área real del incidente que envía WAIP-Web (normalmente un polígono circular), no solo un punto marcador en su centro - recurre al punto si no hay ningún polígono disponible. La decodificación de palabras clave del servicio de rescate ahora está activada por defecto para nuevas instalaciones (antes desactivada), igual que la casilla de procesamiento del servicio de rescate. Se eliminó una frase de justificación redundante de las descripciones de ambas casillas. El área del incidente ahora también permanece siempre completamente visible - el adaptador aleja automáticamente el zoom más allá del nivel configurado si es necesario, en lugar de recortarla en el borde de la imagen. El color y el grosor del contorno ahora también son configurables.",
88
- "fr": "L'image de carte de l'incident dessine désormais la véritable zone d'intervention envoyée par WAIP-Web (généralement un polygone circulaire), et non plus seulement un point marqueur en son centre - revient au point si aucun polygone n'est disponible. Le décodage des mots-clés du service de secours est désormais activé par défaut pour les nouvelles installations (auparavant désactivé), comme la case à cocher de traitement du service de secours. Une phrase de justification redondante a été supprimée des descriptions des deux cases à cocher. La zone d'intervention reste désormais aussi toujours entièrement visible - l'adaptateur dézoome automatiquement au-delà du niveau configuré si nécessaire, plutôt que de la rogner au bord de l'image. La couleur et l'épaisseur du contour sont désormais également configurables.",
89
- "it": "L'immagine della mappa dell'incidente ora disegna l'area effettiva dell'incidente inviata da WAIP-Web (di solito un poligono circolare), non solo un punto marcatore al centro - torna al punto se non è disponibile alcun poligono. La decodifica delle parole chiave del servizio di soccorso è ora attiva per impostazione predefinita per le nuove installazioni (prima disattivata), come la casella di elaborazione del servizio di soccorso. È stata rimossa una frase di giustificazione ridondante dalle descrizioni di entrambe le caselle. Ora l'area dell'incidente rimane sempre completamente visibile - l'adattatore riduce automaticamente lo zoom oltre il livello configurato se necessario, invece di ritagliarla al bordo dell'immagine. Anche il colore e lo spessore del contorno sono ora configurabili.",
90
- "nl": "De incidentkaartafbeelding tekent nu het daadwerkelijke incidentgebied dat WAIP-Web verzendt (meestal een cirkelvormige polygoon), niet alleen een puntmarkering in het midden - valt terug op de stip als er geen polygoon beschikbaar is. Het decoderen van reddingsdienst-trefwoorden staat nu standaard aan bij nieuwe installaties (voorheen uit), net als het selectievakje voor reddingsdienstverwerking. Een overbodige verantwoordingszin is uit beide selectievakjes-beschrijvingen verwijderd. Het incidentgebied blijft nu ook altijd volledig zichtbaar - de adapter zoomt indien nodig automatisch verder uit dan het ingestelde zoomniveau, in plaats van het aan de rand van de afbeelding af te snijden. Contourkleur en -dikte zijn nu ook instelbaar.",
91
- "pl": "Obraz mapy zdarzenia rysuje teraz rzeczywisty obszar zdarzenia wysyłany przez WAIP-Web (zwykle poligon kołowy), a nie tylko znacznik punktowy w jego środku - wraca do punktu, jeśli poligon nie jest dostępny. Dekodowanie słów kluczowych pogotowia ratunkowego jest teraz domyślnie włączone dla nowych instalacji (wcześniej wyłączone), tak jak pole wyboru przetwarzania ratownictwa medycznego. Usunięto zbędne zdanie uzasadniające z opisów obu pól wyboru. Obszar zdarzenia pozostaje teraz zawsze w pełni widoczny - adapter automatycznie pomniejsza powiększenie poza skonfigurowany poziom, jeśli to konieczne, zamiast przycinać go na krawędzi obrazu. Kolor i grubość konturu są teraz również konfigurowalne.",
92
- "pt": "A imagem de mapa da ocorrência agora desenha a área real da ocorrência enviada pelo WAIP-Web (normalmente um polígono circular), não apenas um ponto marcador em seu centro - recorre ao ponto se nenhum polígono estiver disponível. A decodificação de palavras-chave do serviço de resgate agora é ativada por padrão para novas instalações (antes desativada), assim como a caixa de seleção de processamento do serviço de resgate. Uma frase de justificativa redundante foi removida das descrições de ambas as caixas de seleção. A área da ocorrência agora também permanece sempre totalmente visível - o adaptador reduz automaticamente o zoom além do nível configurado, se necessário, em vez de cortá-la na borda da imagem. A cor e a espessura do contorno agora também são configuráveis.",
93
- "ru": "Изображение карты вызова теперь отображает реальную зону вызова, отправленную WAIP-Web (обычно круговой полигон), а не просто точку-маркер в её центре - при отсутствии полигона используется точка. Декодирование ключевых слов скорой помощи теперь по умолчанию включено для новых установок (ранее было выключено), как и флажок обработки скорой помощи. Из описаний обоих флажков удалено избыточное поясняющее предложение. Зона вызова теперь также всегда остаётся полностью видимой - адаптер при необходимости автоматически уменьшает масштаб за пределы настроенного уровня, вместо того чтобы обрезать её по краю изображения. Цвет и толщина контура теперь также настраиваются.",
94
- "uk": "Зображення карти виклику тепер відображає реальну зону виклику, надіслану WAIP-Web (зазвичай круговий полігон), а не лише точку-маркер у її центрі - за відсутності полігона використовується точка. Декодування ключових слів швидкої допомоги тепер типово увімкнено для нових інсталяцій (раніше було вимкнено), як і прапорець обробки швидкої допомоги. З описів обох прапорців видалено зайве пояснювальне речення. Зона виклику тепер також завжди залишається повністю видимою - адаптер за потреби автоматично зменшує масштаб за межі налаштованого рівня, замість того щоб обрізати її по краю зображення. Колір і товщина контуру тепер також налаштовуються.",
95
- "zh-cn": "事件地图图像现在会绘制 WAIP-Web 发送的实际事件区域(通常是圆形多边形),而不仅仅是在其中心显示一个圆点标记——如果没有可用的多边形,则回退为圆点。急救服务关键字解码现在默认对新安装启用(之前默认关闭),与急救服务处理复选框保持一致。已从两个复选框的说明中删除了多余的说明句。 现在事件区域也始终保持完全可见——如有必要,适配器会自动缩小超出配置的缩放级别,而不是在图像边缘裁剪该区域。 轮廓的颜色和粗细现在也可配置。"
96
96
  }
97
97
  },
98
98
  "titleLang": {
package/main.js CHANGED
@@ -19,7 +19,7 @@
19
19
  * flache Arrays in einsatz.json.routen/.rueckmeldungen/.emAlarmiert/
20
20
  * .emWeitere - nur für den jeweils aktuellen Einsatz, nicht historisiert.
21
21
  * Ergänzt um schnell bindbare Zähler (einsatz.routenGesamt,
22
- * einsatz.rueckmeldungGesamt, einsatz.rueckmeldungAnzahl.*). Der frühere
22
+ * einsatz.rueckmeldungenGesamt, einsatz.rueckmeldungen.*). Der frühere
23
23
  * vis.*-Kanal entfällt komplett.
24
24
  *
25
25
  * EN: ioBroker.WAIP-Web
@@ -39,8 +39,8 @@
39
39
  * resources live as their own, likewise flat arrays in
40
40
  * einsatz.json.routen/.rueckmeldungen/.emAlarmiert/.emWeitere - only for
41
41
  * the currently running incident, not historized. Complemented by
42
- * quick-to-bind counters (einsatz.routenGesamt, einsatz.rueckmeldungGesamt,
43
- * einsatz.rueckmeldungAnzahl.*). The former vis.* channel is gone entirely.
42
+ * quick-to-bind counters (einsatz.routenGesamt, einsatz.rueckmeldungenGesamt,
43
+ * einsatz.rueckmeldungen.*). The former vis.* channel is gone entirely.
44
44
  */
45
45
 
46
46
  const https = require('node:https');
@@ -99,18 +99,25 @@ const ALLOWED_EINSATZ_FIELDS = [
99
99
  'ortsteil',
100
100
  'ablaufzeit',
101
101
  'sondersignal',
102
- // DE: laut client_waip.js (offizielles Frontend) zusätzlich vorhandenes Feld:
103
- // EN: additional field per client_waip.js (the official frontend):
104
- 'zeitstempel',
102
+ // DE: Das vom Server als "zeitstempel" gesendete Feld (laut client_waip.js, dem
103
+ // offiziellen Frontend, zusätzlich vorhanden) landet als einsatz.alarmierungszeit -
104
+ // bewusst NICHT hier, sondern wie beschreibung als Sonderfall in handleAlarm()
105
+ // behandelt, da der State-Name vom Server-Feldnamen abweicht.
106
+ // EN: The field the server sends as "zeitstempel" (per client_waip.js, the official
107
+ // frontend, an additional field) ends up as einsatz.alarmierungszeit - deliberately
108
+ // NOT listed here, but handled as a special case in handleAlarm() like beschreibung,
109
+ // since the state name differs from the server's field name.
105
110
  ];
106
- // DE: Rückmeldungs-Zähler sind seit 0.7.35 in zwei Unter-Kanäle gruppiert - "rollen" (aus
107
- // rmld_role abgeleitet) und "funktionen" (aus den rmld_capability_*-Flags abgeleitet), siehe
108
- // updateRueckmeldungCounts(). Vorher lagen alle acht Zähler flach direkt unter
109
- // einsatz.rueckmeldungAnzahl.
110
- // EN: Feedback counters have been grouped into two sub-channels since 0.7.35 - "rollen"
111
- // (derived from rmld_role) and "funktionen" (derived from the rmld_capability_* flags), see
112
- // updateRueckmeldungCounts(). Previously all eight counters lived flat directly under
113
- // einsatz.rueckmeldungAnzahl.
111
+ // DE: Rückmeldungs-Zähler sind seit 0.7.35 in zwei Unter-Kanäle unter einsatz.rueckmeldungen
112
+ // gruppiert - "rollen" (aus rmld_role abgeleitet) und "funktionen" (aus den
113
+ // rmld_capability_*-Flags abgeleitet), siehe updateRueckmeldungCounts(). Vorher lagen alle
114
+ // acht Zähler flach direkt unter einsatz.rueckmeldungAnzahl (0.7.35: einsatz.rueckmeldungAnzahl.
115
+ // rollen/.funktionen; der Kanal selbst hieß erst ab 0.7.36 einsatz.rueckmeldungen).
116
+ // EN: Feedback counters have been grouped into two sub-channels under einsatz.rueckmeldungen
117
+ // since 0.7.35 - "rollen" (derived from rmld_role) and "funktionen" (derived from the
118
+ // rmld_capability_* flags), see updateRueckmeldungCounts(). Previously all eight counters
119
+ // lived flat directly under einsatz.rueckmeldungAnzahl (0.7.35: einsatz.rueckmeldungAnzahl.
120
+ // rollen/.funktionen; the channel itself was only renamed to einsatz.rueckmeldungen in 0.7.36).
114
121
  const RUECKMELDUNG_ROLLEN_KEYS = ['ek', 'gf', 'zf', 'vf'];
115
122
  const RUECKMELDUNG_FUNKTIONEN_KEYS = ['agt', 'fzf', 'ma', 'med'];
116
123
  // DE: identische Disconnect-Logs 60s lang unterdrücken
@@ -286,6 +293,52 @@ const OBSOLETE_OBJECT_IDS = [
286
293
  'einsatz.rueckmeldungAnzahl.fzf',
287
294
  'einsatz.rueckmeldungAnzahl.ma',
288
295
  'einsatz.rueckmeldungAnzahl.med',
296
+ // DE: Umstrukturierung in 0.7.36: der Kanal einsatz.rueckmeldungAnzahl (inkl. seiner in
297
+ // 0.7.35 eingeführten Unter-Kanäle .rollen/.funktionen) heißt jetzt einsatz.rueckmeldungen,
298
+ // einsatz.rueckmeldungGesamt heißt jetzt einsatz.rueckmeldungenGesamt und einsatz.zeitstempel
299
+ // heißt jetzt einsatz.alarmierungszeit. Die acht State-Blätter aus 0.7.35
300
+ // (einsatz.rueckmeldungAnzahl.rollen.*/.funktionen.*) sind hier gelistet, damit sie beim
301
+ // Update von 0.7.35 entfernt werden; die dann leeren alten Ordner selbst werden von
302
+ // OBSOLETE_FOLDER_IDS unten erfasst (cleanupObsoleteObjects() löscht hier oben bewusst nur
303
+ // States, nie Channel/Folder, siehe dort).
304
+ // EN: Restructuring in 0.7.36: the einsatz.rueckmeldungAnzahl channel (including its
305
+ // .rollen/.funktionen sub-channels introduced in 0.7.35) is now einsatz.rueckmeldungen,
306
+ // einsatz.rueckmeldungGesamt is now einsatz.rueckmeldungenGesamt, and einsatz.zeitstempel is
307
+ // now einsatz.alarmierungszeit. The eight 0.7.35 state leaves
308
+ // (einsatz.rueckmeldungAnzahl.rollen.*/.funktionen.*) are listed here so they get removed
309
+ // when upgrading from 0.7.35; the then-empty old folders themselves are covered by
310
+ // OBSOLETE_FOLDER_IDS below (cleanupObsoleteObjects() deliberately only ever deletes states
311
+ // here, never channels/folders, see there).
312
+ 'einsatz.rueckmeldungAnzahl.rollen.ek',
313
+ 'einsatz.rueckmeldungAnzahl.rollen.gf',
314
+ 'einsatz.rueckmeldungAnzahl.rollen.zf',
315
+ 'einsatz.rueckmeldungAnzahl.rollen.vf',
316
+ 'einsatz.rueckmeldungAnzahl.funktionen.agt',
317
+ 'einsatz.rueckmeldungAnzahl.funktionen.fzf',
318
+ 'einsatz.rueckmeldungAnzahl.funktionen.ma',
319
+ 'einsatz.rueckmeldungAnzahl.funktionen.med',
320
+ 'einsatz.rueckmeldungGesamt',
321
+ 'einsatz.zeitstempel',
322
+ ];
323
+
324
+ // DE: Wie OBSOLETE_OBJECT_IDS, aber für Channel-/Folder-Objekte, die bei einer Umbenennung
325
+ // übrig bleiben würden: cleanupObsoleteObjects() löscht dort bewusst nur obj.type === 'state',
326
+ // nie Channel/Folder, um ein absichtlich zum Channel gewordenes State-Blatt nicht versehentlich
327
+ // zu löschen (siehe einsatz.json in 0.7.15). Diese Sorge gilt für die hier gelisteten IDs nicht,
328
+ // da der jeweilige Pfad komplett aufgegeben wurde - STATE_DEFS/CHANNEL_DEFS definieren dort
329
+ // nichts mehr, es kann also nie wieder legitim ein Objekt an dieser ID entstehen. Werden daher
330
+ // unabhängig vom aktuellen obj.type gelöscht. Reihenfolge: Kind-Ordner vor Eltern-Ordner.
331
+ // EN: Like OBSOLETE_OBJECT_IDS, but for channel/folder objects that would otherwise linger
332
+ // after a rename: cleanupObsoleteObjects() deliberately only ever deletes obj.type === 'state'
333
+ // there, never channels/folders, to avoid accidentally deleting a leaf that deliberately became
334
+ // a channel (see einsatz.json in 0.7.15). That concern doesn't apply to the IDs listed here,
335
+ // since the path itself has been abandoned entirely - STATE_DEFS/CHANNEL_DEFS no longer define
336
+ // anything there, so a legitimate object can never reappear at this ID again. Deleted regardless
337
+ // of their current obj.type. Order: child folders before the parent folder.
338
+ const OBSOLETE_FOLDER_IDS = [
339
+ 'einsatz.rueckmeldungAnzahl.rollen',
340
+ 'einsatz.rueckmeldungAnzahl.funktionen',
341
+ 'einsatz.rueckmeldungAnzahl',
289
342
  ];
290
343
 
291
344
  // DE: Übergeordnete Channel/Folder-Objekte, die für jeden State-Zweig existieren müssen.
@@ -297,9 +350,9 @@ const OBSOLETE_OBJECT_IDS = [
297
350
  const CHANNEL_DEFS = [
298
351
  { id: 'status', type: 'channel', name: 'Verbindungs- und Registrierungsstatus' },
299
352
  { id: 'einsatz', type: 'channel', name: 'Aktueller Einsatz' },
300
- { id: 'einsatz.rueckmeldungAnzahl', type: 'folder', name: 'Rückmeldungen nach Rolle/Funktion' },
301
- { id: 'einsatz.rueckmeldungAnzahl.rollen', type: 'folder', name: 'Rückmeldungen nach Rolle' },
302
- { id: 'einsatz.rueckmeldungAnzahl.funktionen', type: 'folder', name: 'Rückmeldungen nach Funktion' },
353
+ { id: 'einsatz.rueckmeldungen', type: 'folder', name: 'Rückmeldungen nach Rolle/Funktion' },
354
+ { id: 'einsatz.rueckmeldungen.rollen', type: 'folder', name: 'Rückmeldungen nach Rolle' },
355
+ { id: 'einsatz.rueckmeldungen.funktionen', type: 'folder', name: 'Rückmeldungen nach Funktion' },
303
356
  { id: 'einsatz.json', type: 'folder', name: 'Einsatzdaten als flache JSON-Objekte/Arrays für Tabellen-Widgets' },
304
357
  { id: 'einsatz.tts', type: 'folder', name: 'TTS-Ansage des aktuellen Einsatzes' },
305
358
  { id: 'debug', type: 'channel', name: 'Diagnose- und Debug-Informationen' },
@@ -378,7 +431,7 @@ const STATE_DEFS = [
378
431
  },
379
432
  { id: 'einsatz.ort', type: 'string', role: 'text', name: 'Ort' },
380
433
  { id: 'einsatz.ortsteil', type: 'string', role: 'text', name: 'Ortsteil' },
381
- { id: 'einsatz.zeitstempel', type: 'string', role: 'date', name: 'Alarmzeitstempel' },
434
+ { id: 'einsatz.alarmierungszeit', type: 'string', role: 'date', name: 'Alarmierungszeit' },
382
435
  { id: 'einsatz.ablaufzeit', type: 'string', role: 'date', name: 'Ablaufzeit' },
383
436
  { id: 'einsatz.sondersignal', type: 'number', role: 'value', name: 'Sondersignal', def: 0 },
384
437
  { id: 'einsatz.latitude', type: 'number', role: 'value.gps.latitude', name: 'Breitengrad' },
@@ -437,63 +490,63 @@ const STATE_DEFS = [
437
490
  // EN: derived counters
438
491
  { id: 'einsatz.routenGesamt', type: 'number', role: 'value', name: 'Anzahl Routen im aktuellen Einsatz', def: 0 },
439
492
  {
440
- id: 'einsatz.rueckmeldungGesamt',
493
+ id: 'einsatz.rueckmeldungenGesamt',
441
494
  type: 'number',
442
495
  role: 'value',
443
496
  name: 'Rückmeldungen gesamt im aktuellen Einsatz',
444
497
  def: 0,
445
498
  },
446
499
  {
447
- id: 'einsatz.rueckmeldungAnzahl.rollen.ek',
500
+ id: 'einsatz.rueckmeldungen.rollen.ek',
448
501
  type: 'number',
449
502
  role: 'value',
450
503
  name: 'Rückmeldungen: Einsatzkräfte',
451
504
  def: 0,
452
505
  },
453
506
  {
454
- id: 'einsatz.rueckmeldungAnzahl.rollen.gf',
507
+ id: 'einsatz.rueckmeldungen.rollen.gf',
455
508
  type: 'number',
456
509
  role: 'value',
457
510
  name: 'Rückmeldungen: Gruppenführer',
458
511
  def: 0,
459
512
  },
460
513
  {
461
- id: 'einsatz.rueckmeldungAnzahl.rollen.zf',
514
+ id: 'einsatz.rueckmeldungen.rollen.zf',
462
515
  type: 'number',
463
516
  role: 'value',
464
517
  name: 'Rückmeldungen: Zugführer',
465
518
  def: 0,
466
519
  },
467
520
  {
468
- id: 'einsatz.rueckmeldungAnzahl.rollen.vf',
521
+ id: 'einsatz.rueckmeldungen.rollen.vf',
469
522
  type: 'number',
470
523
  role: 'value',
471
524
  name: 'Rückmeldungen: Verbandsführer',
472
525
  def: 0,
473
526
  },
474
527
  {
475
- id: 'einsatz.rueckmeldungAnzahl.funktionen.agt',
528
+ id: 'einsatz.rueckmeldungen.funktionen.agt',
476
529
  type: 'number',
477
530
  role: 'value',
478
531
  name: 'Rückmeldungen: Atemschutzgeräteträger',
479
532
  def: 0,
480
533
  },
481
534
  {
482
- id: 'einsatz.rueckmeldungAnzahl.funktionen.fzf',
535
+ id: 'einsatz.rueckmeldungen.funktionen.fzf',
483
536
  type: 'number',
484
537
  role: 'value',
485
538
  name: 'Rückmeldungen: Fahrzeugführer',
486
539
  def: 0,
487
540
  },
488
541
  {
489
- id: 'einsatz.rueckmeldungAnzahl.funktionen.ma',
542
+ id: 'einsatz.rueckmeldungen.funktionen.ma',
490
543
  type: 'number',
491
544
  role: 'value',
492
545
  name: 'Rückmeldungen: Maschinisten',
493
546
  def: 0,
494
547
  },
495
548
  {
496
- id: 'einsatz.rueckmeldungAnzahl.funktionen.med',
549
+ id: 'einsatz.rueckmeldungen.funktionen.med',
497
550
  type: 'number',
498
551
  role: 'value',
499
552
  name: 'Rückmeldungen: Medizinisch/Sanitäter',
@@ -1306,7 +1359,9 @@ class WaipWeb extends utils.Adapter {
1306
1359
  value type) explicitly checks that this is really still the old state leaf - relevant
1307
1360
  for IDs like einsatz.json, which changed from state to channel in the 0.7.15
1308
1361
  restructuring but kept the same ID: without this check, the by-now correctly created
1309
- channel would otherwise get deleted and recreated by initObjects() on every restart. */
1362
+ channel would otherwise get deleted and recreated by initObjects() on every restart.
1363
+ Also removes OBSOLETE_FOLDER_IDS - channel/folder objects at paths abandoned entirely
1364
+ by a rename, where that same type-check doesn't apply (see its own comment). */
1310
1365
  async cleanupObsoleteObjects() {
1311
1366
  for (const id of OBSOLETE_OBJECT_IDS) {
1312
1367
  try {
@@ -1319,6 +1374,17 @@ class WaipWeb extends utils.Adapter {
1319
1374
  /* DE: ignorieren - Objekt existierte vermutlich nicht / EN: ignore - object probably didn't exist */
1320
1375
  }
1321
1376
  }
1377
+ for (const id of OBSOLETE_FOLDER_IDS) {
1378
+ try {
1379
+ const obj = await this.getObjectAsync(id);
1380
+ if (obj) {
1381
+ await this.delObjectAsync(id);
1382
+ this.log.info(`Removed obsolete folder object from a previous version: ${id}`);
1383
+ }
1384
+ } catch {
1385
+ /* DE: ignorieren - Objekt existierte vermutlich nicht / EN: ignore - object probably didn't exist */
1386
+ }
1387
+ }
1322
1388
  }
1323
1389
 
1324
1390
  /* DE: Löscht bestehende State-Objekte, deren common.type oder common.role nicht mehr zur
@@ -2446,6 +2512,16 @@ class WaipWeb extends utils.Adapter {
2446
2512
  // but is determined locally by handleAlarm() and carried along in the snapshot (see
2447
2513
  // lookupStichwortBeschreibung()).
2448
2514
  flat.beschreibung = Object.prototype.hasOwnProperty.call(src, 'beschreibung') ? src.beschreibung : null;
2515
+ // DE: alarmierungszeit kommt vom Server als "zeitstempel" und wird ebenfalls als
2516
+ // Sonderfall im Snapshot mitgeführt (siehe handleAlarm()), da der State-Name vom
2517
+ // Server-Feldnamen abweicht - daher nicht in ALLOWED_EINSATZ_FIELDS.
2518
+ // EN: alarmierungszeit comes from the server as "zeitstempel" and is likewise
2519
+ // carried along in the snapshot as a special case (see handleAlarm()), since the
2520
+ // state name differs from the server's field name - hence not in
2521
+ // ALLOWED_EINSATZ_FIELDS.
2522
+ flat.alarmierungszeit = Object.prototype.hasOwnProperty.call(src, 'alarmierungszeit')
2523
+ ? src.alarmierungszeit
2524
+ : null;
2449
2525
  flat.registeredMonitor = this.currentMonitor || null;
2450
2526
  flat.registeredMonitorName = this.monitorName || null;
2451
2527
  return flat;
@@ -2665,13 +2741,13 @@ class WaipWeb extends utils.Adapter {
2665
2741
 
2666
2742
  /* DE: Berechnet aus den im Snapshot gesammelten Rückmeldungen die Zähler pro Rolle/Fähigkeit
2667
2743
  (analog zu den Badges EK/GF/ZF/VF/AGT/FZF/MA/MED/Gesamt der Weboberfläche) und
2668
- aktualisiert einsatz.rueckmeldungAnzahl.rollen.<k> und .funktionen.<k> sowie
2669
- einsatz.rueckmeldungGesamt. EK/GF/ZF/VF (aus rmld_role) liegen unter .rollen, AGT/FZF/MA/
2744
+ aktualisiert einsatz.rueckmeldungen.rollen.<k> und .funktionen.<k> sowie
2745
+ einsatz.rueckmeldungenGesamt. EK/GF/ZF/VF (aus rmld_role) liegen unter .rollen, AGT/FZF/MA/
2670
2746
  MED (aus den rmld_capability_*-Flags) unter .funktionen.
2671
2747
  EN: Computes the per-role/skill counters from the feedback entries collected in the
2672
2748
  snapshot (mirroring the EK/GF/ZF/VF/AGT/FZF/MA/MED/total badges of the web UI) and
2673
- updates einsatz.rueckmeldungAnzahl.rollen.<k> and .funktionen.<k> as well as
2674
- einsatz.rueckmeldungGesamt. EK/GF/ZF/VF (from rmld_role) live under .rollen, AGT/FZF/MA/
2749
+ updates einsatz.rueckmeldungen.rollen.<k> and .funktionen.<k> as well as
2750
+ einsatz.rueckmeldungenGesamt. EK/GF/ZF/VF (from rmld_role) live under .rollen, AGT/FZF/MA/
2675
2751
  MED (from the rmld_capability_* flags) under .funktionen. */
2676
2752
  async updateRueckmeldungCounts() {
2677
2753
  const list = (this.currentEinsatzSnapshot && this.currentEinsatzSnapshot.rueckmeldungen) || [];
@@ -2701,13 +2777,13 @@ class WaipWeb extends utils.Adapter {
2701
2777
  }
2702
2778
  const tasks = [
2703
2779
  ...RUECKMELDUNG_ROLLEN_KEYS.map(k =>
2704
- this.setStateAsync(`einsatz.rueckmeldungAnzahl.rollen.${k}`, counts[k], true),
2780
+ this.setStateAsync(`einsatz.rueckmeldungen.rollen.${k}`, counts[k], true),
2705
2781
  ),
2706
2782
  ...RUECKMELDUNG_FUNKTIONEN_KEYS.map(k =>
2707
- this.setStateAsync(`einsatz.rueckmeldungAnzahl.funktionen.${k}`, counts[k], true),
2783
+ this.setStateAsync(`einsatz.rueckmeldungen.funktionen.${k}`, counts[k], true),
2708
2784
  ),
2709
2785
  ];
2710
- tasks.push(this.setStateAsync('einsatz.rueckmeldungGesamt', list.length, true));
2786
+ tasks.push(this.setStateAsync('einsatz.rueckmeldungenGesamt', list.length, true));
2711
2787
  const results = await Promise.allSettled(tasks);
2712
2788
  for (const r of results) {
2713
2789
  if (r.status === 'rejected') {
@@ -2893,6 +2969,17 @@ class WaipWeb extends utils.Adapter {
2893
2969
  this.currentEinsatzSnapshot.emWeitere = data.em_weitere;
2894
2970
  }
2895
2971
 
2972
+ // DE: Server-Feld "zeitstempel" -> State/Snapshot-Feld einsatz.alarmierungszeit -
2973
+ // bewusst als Sonderfall behandelt (nicht in ALLOWED_EINSATZ_FIELDS), da der
2974
+ // State-Name vom Server-Feldnamen abweicht.
2975
+ // EN: Server field "zeitstempel" -> einsatz.alarmierungszeit state/snapshot field -
2976
+ // deliberately handled as a special case (not in ALLOWED_EINSATZ_FIELDS), since
2977
+ // the state name differs from the server's field name.
2978
+ if (Object.prototype.hasOwnProperty.call(data, 'zeitstempel')) {
2979
+ this.currentEinsatzSnapshot.alarmierungszeit = data.zeitstempel;
2980
+ tasks.push(this.setField('einsatz.alarmierungszeit', data.zeitstempel));
2981
+ }
2982
+
2896
2983
  // DE: Beschreibung zum Stichwort lokal ermitteln (kommt nicht vom Server) und wie die
2897
2984
  // übrigen flachen Felder setzen/im Snapshot mitführen.
2898
2985
  // EN: Determine the keyword's description locally (doesn't come from the server)
@@ -3019,6 +3106,13 @@ class WaipWeb extends utils.Adapter {
3019
3106
  async clearCurrentEinsatzStates() {
3020
3107
  const tasks = this.ALLOWED_EINSATZ_FIELDS.map(k => this.setStateAsync(`einsatz.${k}`, null, true));
3021
3108
  tasks.push(this.setStateAsync('einsatz.beschreibung', null, true));
3109
+ // DE: alarmierungszeit ist wie beschreibung ein Sonderfall (nicht in
3110
+ // ALLOWED_EINSATZ_FIELDS, siehe handleAlarm()) und muss daher hier separat geleert
3111
+ // werden.
3112
+ // EN: alarmierungszeit is a special case like beschreibung (not in
3113
+ // ALLOWED_EINSATZ_FIELDS, see handleAlarm()), so it needs to be cleared separately
3114
+ // here.
3115
+ tasks.push(this.setStateAsync('einsatz.alarmierungszeit', null, true));
3022
3116
  tasks.push(this.setStateAsync('einsatz.latitude', null, true));
3023
3117
  tasks.push(this.setStateAsync('einsatz.longitude', null, true));
3024
3118
  // DE: Anders als einsatz.tts.last (dessen Vorbild ursprünglich für kartenbildPfad
@@ -3044,9 +3138,9 @@ class WaipWeb extends utils.Adapter {
3044
3138
 
3045
3139
  this.currentEinsatzUuid = null;
3046
3140
  this.currentEinsatzSnapshot = null;
3047
- // DE: rueckmeldungGesamt/rueckmeldungAnzahl.* liest aus this.currentEinsatzSnapshot,
3141
+ // DE: rueckmeldungenGesamt/rueckmeldungen.* liest aus this.currentEinsatzSnapshot,
3048
3142
  // ist jetzt also null -> alle Zähler werden konsistent auf 0 zurückgesetzt.
3049
- // EN: rueckmeldungGesamt/rueckmeldungAnzahl.* reads from this.currentEinsatzSnapshot,
3143
+ // EN: rueckmeldungenGesamt/rueckmeldungen.* reads from this.currentEinsatzSnapshot,
3050
3144
  // which is now null -> all counters get consistently reset to 0.
3051
3145
  await this.updateRueckmeldungCounts();
3052
3146
  }
@@ -3122,6 +3216,25 @@ class WaipWeb extends utils.Adapter {
3122
3216
  as an array within einsatz.json.routen[]. */
3123
3217
  async handleRoutes(incoming) {
3124
3218
  try {
3219
+ // DE: Ohne aktiven Einsatz ignorieren - anders als bei Rückmeldungen enthält die
3220
+ // Routen-Payload keine waip_uuid zum gezielten Abgleich (siehe README, Abschnitt
3221
+ // einsatz.json.routen), daher hier nur die schwächere Prüfung "läuft überhaupt
3222
+ // noch ein Einsatz". Verhindert, dass ein verspätetes io.routes-Event, das erst
3223
+ // NACH einem bereits verarbeiteten io.standby eintrifft, einsatz.json.current/
3224
+ // .routen und einsatz.routenGesamt für den bereits beendeten Einsatz wiederbelebt,
3225
+ // während alle anderen einsatz.*-Felder korrekt geleert bleiben.
3226
+ // EN: Ignore without an active incident - unlike feedback, the routes payload
3227
+ // carries no waip_uuid to match against (see README, einsatz.json.routen
3228
+ // section), so this only applies the weaker check "is an incident still being
3229
+ // tracked at all". Prevents a late io.routes event that arrives AFTER an
3230
+ // already-processed io.standby from reviving einsatz.json.current/.routen and
3231
+ // einsatz.routenGesamt for the already-finished incident, while every other
3232
+ // einsatz.* field correctly stays cleared.
3233
+ if (!this.currentEinsatzUuid) {
3234
+ this.log.debug('Ignoring routes update - no incident is currently active');
3235
+ return;
3236
+ }
3237
+
3125
3238
  let data = incoming;
3126
3239
  if (Array.isArray(incoming)) {
3127
3240
  data = incoming.map(i => normalizeData(i));
@@ -3163,6 +3276,22 @@ class WaipWeb extends utils.Adapter {
3163
3276
  explicitly resolved to a full absolute URL here. */
3164
3277
  async handleTTS(incoming) {
3165
3278
  try {
3279
+ // DE: Ohne aktiven Einsatz ignorieren - die io.playtts-Payload ist laut
3280
+ // client_waip.js nur eine nackte URL-Zeichenkette, enthält also keine waip_uuid
3281
+ // zum gezielten Abgleich (anders als bei Rückmeldungen). Verhindert, dass eine
3282
+ // verspätete TTS-Ansage, die erst NACH einem bereits verarbeiteten io.standby
3283
+ // eintrifft, einsatz.tts.last/.lastTimestamp für den bereits beendeten Einsatz
3284
+ // wiederbelebt.
3285
+ // EN: Ignore without an active incident - per client_waip.js the io.playtts
3286
+ // payload is just a bare URL string, so it carries no waip_uuid to match against
3287
+ // (unlike feedback). Prevents a late TTS announcement that arrives AFTER an
3288
+ // already-processed io.standby from reviving einsatz.tts.last/.lastTimestamp for
3289
+ // the already-finished incident.
3290
+ if (!this.currentEinsatzUuid) {
3291
+ this.log.debug('Ignoring TTS announcement - no incident is currently active');
3292
+ return;
3293
+ }
3294
+
3166
3295
  const data = normalizeData(incoming || {});
3167
3296
  const ts = new Date().toISOString();
3168
3297
  await this.setField('einsatz.tts.last', this.resolveTtsUrl(data));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.waip-web",
3
- "version": "0.7.35",
3
+ "version": "0.7.37",
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",