iobroker.agent-dvr 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.de.md CHANGED
@@ -13,7 +13,7 @@ Verbindet ioBroker mit [AgentDVR](https://www.ispyconnect.com): erkennt automati
13
13
 
14
14
  - Automatische Erkennung aller AgentDVR-Kameras beim Start (Mikrofone ausgenommen)
15
15
  - Alle Geräteeigenschaften als Datenpunkte gespiegelt (aus der API flachgeklopft)
16
- - Schaltflächen pro Gerät: Aufnahme, Snapshot, Erkennung, Scharf/Unscharf, Ein/Aus, Objekterkennung, Bereinigen, …
16
+ - Schaltflächen pro Gerät: Aufnahme, Snapshot, Erkennung, Scharf/Unscharf, Ein/Aus, Objekterkennung, Zeitplan Ein/Aus, Detektor Ein/Aus, Empfindlichkeit (Min/Max/Gain), Bereinigen, …
17
17
  - Systemschaltflächen: Scharf/Unscharf, Alle Ein/Aus, Konfiguration neu laden, Speicherverwaltung, Neustart, …
18
18
  - **Profilauswahl** — beschreibbares Dropdown, das das aktuelle AgentDVR-Profil widerspiegelt (Zuhause / Weg / Nacht / eigene)
19
19
  - **Snapshot als Base64** — `snapshot_b64`-Zustand pro Kamera, per Schaltfläche oder automatisch bei jedem Poll aktualisierbar
@@ -26,8 +26,8 @@ Verbindet ioBroker mit [AgentDVR](https://www.ispyconnect.com): erkennt automati
26
26
  - Kameraindividuelle Stream-Auswahl: MJPEG, MP4/FLV mit Ton oder go2rtc WebRTC/MSE
27
27
  - Kamera-Filter-Badges zum Ein-/Ausblenden einzelner Kameras (Zustand im localStorage gespeichert)
28
28
  - Echtzeit-Bewegungs- und Alarm-Indikatoren (gelber / oranger Kachelrahmen) via Socket.io
29
- - Vollbildansicht mit PTZ-Overlay und Aufnahme-Schaltfläche
30
- - Aufnahmen-Tab mit Raster- und Timeline-Ansicht, Suche, Tag-Filter und Video-Player
29
+ - Vollbildansicht mit PTZ-Overlay, Aufnahme-, Ton- und **nativer Browser-Vollbild-Schaltfläche**; Header blendet sich nach 3 s Inaktivität aus
30
+ - Aufnahmen-Tab mit Raster- und Timeline-Ansicht, Suche, **ausklappbarem Tag-Filter** und Video-Player
31
31
  - Automatischer Reconnect für alle Stream-Typen nach Netzwerkunterbrechung oder Tab-Wechsel
32
32
  - Farbdesign vollständig über die Adapter-Konfiguration anpassbar
33
33
 
@@ -199,10 +199,10 @@ Das eingebaute Live-Dashboard ist erreichbar unter `http://<iobroker>:<webport>/
199
199
  **Funktionen:**
200
200
  - Kameraindividuelle Stream-Auswahl: MJPEG, MP4/FLV mit Ton (via flv.js) oder go2rtc WebRTC/MSE
201
201
  - Kamera-Filter-Badges — per Klick einzelne Kameras ein-/ausblenden; Zustand wird im localStorage gespeichert
202
- - Vollbildansicht mit PTZ-Overlay und Aufnahme-Schaltfläche
202
+ - Vollbildansicht mit PTZ-Overlay, Aufnahme-, Ton- und nativer Browser-Vollbild-Schaltfläche; Header blendet sich nach 3 s Inaktivität aus
203
203
  - Echtzeit-Bewegungs- (gelber Rahmen) und Alarm-Indikatoren (oranger Rahmen) via Socket.io
204
204
  - Automatischer Reconnect: MJPEG und FLV bei Fehler; go2rtc bei unerwartetem WebSocket-Close oder 10 s ohne Bild
205
- - Aufnahmen-Tab mit Raster- und Timeline-Ansicht, Suche und Tag-Filter, Video-Player mit Vor-/Zurück-Navigation
205
+ - Aufnahmen-Tab mit Raster- und Timeline-Ansicht, Suche und ausklappbarem Tag-Filter, Video-Player mit Vor-/Zurück-Navigation
206
206
  - Farbdesign über die Adapter-Konfiguration einstellbar
207
207
 
208
208
  ### go2rtc WebRTC-Streams
@@ -278,8 +278,15 @@ Das eingebaute Live-Dashboard ist erreichbar unter `http://<iobroker>:<webport>/
278
278
  | `<cam>.control.alertOff` | Taste | W | Alarme deaktivieren |
279
279
  | `<cam>.control.switchOn` | Taste | W | Kamera einschalten |
280
280
  | `<cam>.control.switchOff` | Taste | W | Kamera ausschalten |
281
- | `<cam>.control.objectDetectOn` | Taste | W | Objekterkennung einschalten |
282
- | `<cam>.control.objectDetectOff` | Taste | W | Objekterkennung ausschalten |
281
+ | `<cam>.control.objectDetectOn` | Taste | W | Objekterkennung einschalten *(nur Kameras)* |
282
+ | `<cam>.control.objectDetectOff` | Taste | W | Objekterkennung ausschalten *(nur Kameras)* |
283
+ | `<cam>.control.scheduleOn` | Taste | W | Gerätezeitplan aktivieren |
284
+ | `<cam>.control.scheduleOff` | Taste | W | Gerätezeitplan deaktivieren |
285
+ | `<cam>.control.detectorOn` | Taste | W | Bewegungsmelder aktivieren |
286
+ | `<cam>.control.detectorOff` | Taste | W | Bewegungsmelder deaktivieren |
287
+ | `<cam>.control.sensitivityMin` | Zahl 0–100 | R/W | Empfindlichkeit — untere Schwelle *(nur Kameras)* |
288
+ | `<cam>.control.sensitivityMax` | Zahl 0–100 | R/W | Empfindlichkeit — obere Schwelle *(nur Kameras)* |
289
+ | `<cam>.control.sensitivityGain` | Zahl 0–100 | R/W | Empfindlichkeit — Verstärkung *(nur Kameras)* |
283
290
  | `<cam>.control.recOnAlert` | Taste | W | „Bei Alarm aufnehmen" aktivieren |
284
291
  | `<cam>.control.recOnDetect` | Taste | W | „Bei Erkennung aufnehmen" aktivieren |
285
292
  | `<cam>.control.purge` | Taste | W | Alle Aufnahmen dieser Kamera löschen |
@@ -305,10 +312,12 @@ Das eingebaute Live-Dashboard ist erreichbar unter `http://<iobroker>:<webport>/
305
312
 
306
313
  | Datenpunkt | Typ | R/W | Beschreibung |
307
314
  |-----------|-----|-----|-------------|
308
- | `<cam>.urls.snapshot` | string | R | URL zum aktuellen JPEG-Snapshot |
309
- | `<cam>.urls.photo` | string | R | URL zum Foto-Endpoint |
310
- | `<cam>.urls.mjpeg` | string | R | URL zum MJPEG-Livestream |
311
- | `<cam>.urls.mp4` | string | R | URL zum MP4-Livestream |
315
+ | `<cam>.urls.snapshot` | string | R | URL zum aktuellen JPEG-Snapshot *(nur Kameras)* |
316
+ | `<cam>.urls.photo` | string | R | URL zum Foto-Endpoint *(nur Kameras)* |
317
+ | `<cam>.urls.mjpeg` | string | R | URL zum MJPEG-Livestream *(nur Kameras)* |
318
+ | `<cam>.urls.mp4` | string | R | URL zum MP4-Livestream *(nur Kameras)* |
319
+ | `<mic>.urls.audio_mp3` | string | R | URL zum MP3-Audiostream *(nur Mikrofone)* |
320
+ | `<mic>.urls.audio_ogg` | string | R | URL zum OGG-Audiostream *(nur Mikrofone)* |
312
321
 
313
322
  ### Ereignisse / Galerie
314
323
 
@@ -330,7 +339,19 @@ Das eingebaute Live-Dashboard ist erreichbar unter `http://<iobroker>:<webport>/
330
339
  Placeholder for the next version (at the beginning of the line):
331
340
  ### **WORK IN PROGRESS**
332
341
  -->
333
- ### **WORK IN PROGRESS**
342
+ ### 0.3.0 (2026-07-06)
343
+ * (ipod86) feat: Steuerbuttons scheduleOn/Off und detectorOn/Off für Kameras und Mikrofone
344
+ * (ipod86) feat: Empfindlichkeitszustände sensitivityMin, sensitivityMax, sensitivityGain für Kameras (0–100)
345
+ * (ipod86) feat: URL-Zustände audio_mp3 und audio_ogg für Mikrofone
346
+ * (ipod86) fix: objectDetectOn/Off und Snapshot-Schaltfläche auf Kameras (ot=2) beschränkt
347
+ * (ipod86) feat: flv.js in Dashboard-HTML eingebettet — keine externe Datei mehr nötig
348
+ * (ipod86) fix: FLV-Stream-Seitenverhältnis nach Tab-Wechsel korrekt beibehalten
349
+ * (ipod86) feat: ausklappbarer Tag-Filter in Aufnahmen- und Timeline-Ansicht
350
+ * (ipod86) feat: nativer Browser-Vollbild-Button im Live-View-Modal mit korrektem Seitenverhältnis
351
+ * (ipod86) feat: Header im Live-View-Modal blendet sich nach 3 s Inaktivität aus, erscheint bei Maus/Touch wieder
352
+ * (ipod86) fix: i18n-Keys fsEnter, fsExit, filterByLabel, timelineView, closePanel in allen 10 Sprachen
353
+
354
+ ### 0.2.2 (2026-07-04)
334
355
  * (ipod86) fix: verbleibende deutsche Strings im DashboardPanel via I18n.t() übersetzt
335
356
  * (ipod86) fix: i18n-Keys loadingCamerasAndStreams, cfgCameraColumn, cfgStreamSourceColumn, reload in allen 11 Sprachen ergänzt
336
357
  * (ipod86) chore: POSIX mv durch plattformübergreifendes node rename im src-admin Build-Script ersetzt
package/README.md CHANGED
@@ -18,7 +18,7 @@ Connects ioBroker to [AgentDVR](https://www.ispyconnect.com): auto-discovers all
18
18
 
19
19
  - Auto-discovery of all AgentDVR cameras on startup (microphones excluded)
20
20
  - All device properties mirrored as data points (flattened from the API)
21
- - Per-device control buttons: record, snapshot, detect, arm/disarm alerts, switch on/off, object detection, purge, …
21
+ - Per-device control buttons: record, snapshot, detect, arm/disarm alerts, switch on/off, object detection, schedule on/off, detector on/off, sensitivity (min/max/gain), purge, …
22
22
  - System-level buttons: arm, disarm, all on/off, reload, storage management, restart, …
23
23
  - **Profile selector** — writable dropdown reflecting the current AgentDVR profile (Home / Away / Night / custom)
24
24
  - **Snapshot as Base64** — `snapshot_b64` state per camera, writable via button or auto-updated every poll cycle
@@ -31,8 +31,8 @@ Connects ioBroker to [AgentDVR](https://www.ispyconnect.com): auto-discovers all
31
31
  - Per-camera stream selection: MJPEG, MP4/FLV with audio, or go2rtc WebRTC/MSE
32
32
  - Camera filter badges to show/hide individual cameras (state saved in localStorage)
33
33
  - Real-time motion and alert indicators (yellow / orange tile border) via Socket.io
34
- - Fullscreen view with PTZ overlay and record button
35
- - Recordings tab with grid and timeline view, search, tag filter, and video player
34
+ - Fullscreen view with PTZ overlay, record, mute, and native browser fullscreen button; header auto-hides
35
+ - Recordings tab with grid and timeline view, search, collapsible tag filter, and video player
36
36
  - Auto-reconnect for all stream types after network interruption or tab switch
37
37
  - Fully color-themeable via adapter config
38
38
 
@@ -204,10 +204,10 @@ The adapter ships a built-in live dashboard at `http://<iobroker>:<webport>/agen
204
204
  **Features:**
205
205
  - Per-camera stream selection: MJPEG, MP4/FLV with audio (via flv.js), or go2rtc WebRTC/MSE
206
206
  - Camera filter badges — click to show/hide individual cameras; state persisted in localStorage
207
- - Fullscreen view with PTZ overlay and record button
207
+ - Fullscreen view with PTZ overlay, record button, mute button, and **native browser fullscreen** (header auto-hides after 3 s of inactivity; reappears on mouse or touch)
208
208
  - Real-time motion (yellow border) and alert (orange border) indicators via Socket.io
209
209
  - Auto-reconnect: MJPEG and FLV reconnect after error; go2rtc reconnects after unexpected WebSocket close or 10 s stall
210
- - Recordings tab with grid and timeline view, search and tag filter, video player with prev/next navigation
210
+ - Recordings tab with grid and timeline view, search, **collapsible tag filter**, and video player with prev/next navigation
211
211
  - Color theming via adapter config
212
212
 
213
213
  ### go2rtc WebRTC Streams
@@ -283,8 +283,15 @@ The adapter ships a built-in live dashboard at `http://<iobroker>:<webport>/agen
283
283
  | `<cam>.control.alertOff` | button | W | Disarm alerts |
284
284
  | `<cam>.control.switchOn` | button | W | Switch camera on |
285
285
  | `<cam>.control.switchOff` | button | W | Switch camera off |
286
- | `<cam>.control.objectDetectOn` | button | W | Enable object detection |
287
- | `<cam>.control.objectDetectOff` | button | W | Disable object detection |
286
+ | `<cam>.control.objectDetectOn` | button | W | Enable object detection *(cameras only)* |
287
+ | `<cam>.control.objectDetectOff` | button | W | Disable object detection *(cameras only)* |
288
+ | `<cam>.control.scheduleOn` | button | W | Enable the device schedule |
289
+ | `<cam>.control.scheduleOff` | button | W | Disable the device schedule |
290
+ | `<cam>.control.detectorOn` | button | W | Enable the motion detector |
291
+ | `<cam>.control.detectorOff` | button | W | Disable the motion detector |
292
+ | `<cam>.control.sensitivityMin` | number 0–100 | R/W | Detector sensitivity — minimum threshold *(cameras only)* |
293
+ | `<cam>.control.sensitivityMax` | number 0–100 | R/W | Detector sensitivity — maximum threshold *(cameras only)* |
294
+ | `<cam>.control.sensitivityGain` | number 0–100 | R/W | Detector sensitivity — gain *(cameras only)* |
288
295
  | `<cam>.control.recOnAlert` | button | W | Enable "record on alert" |
289
296
  | `<cam>.control.recOnDetect` | button | W | Enable "record on detect" |
290
297
  | `<cam>.control.purge` | button | W | Delete all recordings for this camera |
@@ -310,10 +317,12 @@ The adapter ships a built-in live dashboard at `http://<iobroker>:<webport>/agen
310
317
 
311
318
  | Data point | Type | R/W | Description |
312
319
  |-----------|------|-----|-------------|
313
- | `<cam>.urls.snapshot` | string | R | URL to current JPEG snapshot |
314
- | `<cam>.urls.photo` | string | R | URL to photo endpoint |
315
- | `<cam>.urls.mjpeg` | string | R | URL to MJPEG live stream |
316
- | `<cam>.urls.mp4` | string | R | URL to MP4 live stream |
320
+ | `<cam>.urls.snapshot` | string | R | URL to current JPEG snapshot *(cameras only)* |
321
+ | `<cam>.urls.photo` | string | R | URL to photo endpoint *(cameras only)* |
322
+ | `<cam>.urls.mjpeg` | string | R | URL to MJPEG live stream *(cameras only)* |
323
+ | `<cam>.urls.mp4` | string | R | URL to MP4 live stream *(cameras only)* |
324
+ | `<mic>.urls.audio_mp3` | string | R | URL to MP3 audio stream *(microphones only)* |
325
+ | `<mic>.urls.audio_ogg` | string | R | URL to OGG audio stream *(microphones only)* |
317
326
 
318
327
  ### Events / Gallery *(cameras only)*
319
328
 
@@ -335,6 +344,18 @@ The adapter ships a built-in live dashboard at `http://<iobroker>:<webport>/agen
335
344
  Placeholder for the next version (at the beginning of the line):
336
345
  ### **WORK IN PROGRESS**
337
346
  -->
347
+ ### 0.3.0 (2026-07-06)
348
+ * (ipod86) feat: add scheduleOn/Off and detectorOn/Off control buttons for cameras and microphones
349
+ * (ipod86) feat: add sensitivityMin, sensitivityMax, sensitivityGain level states for cameras (0–100)
350
+ * (ipod86) feat: add audio_mp3 and audio_ogg URL states for microphones
351
+ * (ipod86) fix: restrict objectDetectOn/Off and snapshot buttons to cameras (ot=2) only
352
+ * (ipod86) feat: inline flv.js into dashboard HTML — no external file required
353
+ * (ipod86) fix: preserve FLV stream aspect ratio after tab visibility change (all three player call sites)
354
+ * (ipod86) feat: collapsible tag filter row on recordings and timeline pages
355
+ * (ipod86) feat: native browser fullscreen button in live view modal with correct aspect ratio
356
+ * (ipod86) feat: live view modal header auto-hides after 3 s of inactivity; reappears on mouse/touch
357
+ * (ipod86) fix: add fsEnter, fsExit, filterByLabel, timelineView, closePanel i18n keys in all 10 languages
358
+
338
359
  ### 0.2.2 (2026-07-04)
339
360
  * (ipod86) fix: translate remaining German strings in DashboardPanel to English via I18n.t()
340
361
  * (ipod86) fix: add i18n keys loadingCamerasAndStreams, cfgCameraColumn, cfgStreamSourceColumn, reload in all 11 languages
package/build/main.js CHANGED
@@ -45,6 +45,10 @@ const CAM_COMMANDS = [
45
45
  },
46
46
  { id: "recOnAlert", path: "/command/recordOnAlertOn", params: ["oid", "ot"], name: "Record on alert: on" },
47
47
  { id: "recOnDetect", path: "/command/recordOnDetectOn", params: ["oid", "ot"], name: "Record on detect: on" },
48
+ { id: "scheduleOn", path: "/command/scheduleOn", params: ["oid", "ot"], name: "Enable schedule" },
49
+ { id: "scheduleOff", path: "/command/scheduleOff", params: ["oid", "ot"], name: "Disable schedule" },
50
+ { id: "detectorOn", path: "/command/switchDetector?on=true", params: ["oid", "ot"], name: "Enable detector" },
51
+ { id: "detectorOff", path: "/command/switchDetector?on=false", params: ["oid", "ot"], name: "Disable detector" },
48
52
  { id: "purge", path: "/command/purge", params: ["oid", "ot"], name: "Purge folder (caution!)" }
49
53
  ];
50
54
  const SYS_COMMANDS = [
@@ -617,6 +621,19 @@ class AgentDvr extends utils.Adapter {
617
621
  ensureButton(id, name, entry) {
618
622
  return this.ensureControl(id, name, entry, "button");
619
623
  }
624
+ async ensureLevel(id, name, entry, min, max) {
625
+ if (!this.ensuredFolders.has(id)) {
626
+ await this.ensurePath(id);
627
+ await this.setObjectNotExistsAsync(id, {
628
+ type: "state",
629
+ common: { name, type: "number", role: "level", read: true, write: true, min, max },
630
+ native: {}
631
+ });
632
+ await this.setStateAsync(id, { val: 0, ack: true });
633
+ this.ensuredFolders.add(id);
634
+ }
635
+ this.registry.set(id, entry);
636
+ }
620
637
  async ensureSelector(id, name, entry, states) {
621
638
  if (!this.ensuredFolders.has(id)) {
622
639
  await this.ensurePath(id);
@@ -756,8 +773,9 @@ class AgentDvr extends utils.Adapter {
756
773
  await this.flattenWrite(d.raw, fid, 0);
757
774
  await this.writeStatusDps(d, fid);
758
775
  await this.ensureFolder(`${fid}.control`, "Control", "channel");
776
+ const CAM_ONLY = /* @__PURE__ */ new Set(["snapshot", "objectDetectOn", "objectDetectOff"]);
759
777
  for (const c of CAM_COMMANDS) {
760
- if (c.id === "snapshot" && d.ot !== 2) {
778
+ if (CAM_ONLY.has(c.id) && d.ot !== 2) {
761
779
  continue;
762
780
  }
763
781
  await this.ensureButton(`${fid}.control.${c.id}`, c.name, {
@@ -784,12 +802,41 @@ class AgentDvr extends utils.Adapter {
784
802
  }
785
803
  }
786
804
  }
787
- if (this.config.enableUrls && d.ot === 2) {
805
+ if (d.ot === 2) {
806
+ const sfx = { kind: "levelCmd", path: "/command/setSensitivity", oid: d.oid, ot: d.ot };
807
+ await this.ensureLevel(
808
+ `${fid}.control.sensitivityMin`,
809
+ "Sensitivity min (0-100)",
810
+ { ...sfx, valueParam: "min" },
811
+ 0,
812
+ 100
813
+ );
814
+ await this.ensureLevel(
815
+ `${fid}.control.sensitivityMax`,
816
+ "Sensitivity max (0-100)",
817
+ { ...sfx, valueParam: "max" },
818
+ 0,
819
+ 100
820
+ );
821
+ await this.ensureLevel(
822
+ `${fid}.control.sensitivityGain`,
823
+ "Sensitivity gain (0-100)",
824
+ { ...sfx, valueParam: "gain" },
825
+ 0,
826
+ 100
827
+ );
828
+ }
829
+ if (this.config.enableUrls) {
788
830
  await this.ensureFolder(`${fid}.urls`, "URLs", "channel");
789
- await this.writeLeaf(`${fid}.urls.snapshot`, `${this.baseUrl}/grab.jpg?oid=${d.oid}`);
790
- await this.writeLeaf(`${fid}.urls.photo`, `${this.baseUrl}/photo.jpg?oid=${d.oid}`);
791
- await this.writeLeaf(`${fid}.urls.mjpeg`, `${this.baseUrl}/video.mjpg?oids=${d.oid}`);
792
- await this.writeLeaf(`${fid}.urls.mp4`, `${this.baseUrl}/video.mp4?oids=${d.oid}`);
831
+ if (d.ot === 2) {
832
+ await this.writeLeaf(`${fid}.urls.snapshot`, `${this.baseUrl}/grab.jpg?oid=${d.oid}`);
833
+ await this.writeLeaf(`${fid}.urls.photo`, `${this.baseUrl}/photo.jpg?oid=${d.oid}`);
834
+ await this.writeLeaf(`${fid}.urls.mjpeg`, `${this.baseUrl}/video.mjpg?oids=${d.oid}`);
835
+ await this.writeLeaf(`${fid}.urls.mp4`, `${this.baseUrl}/video.mp4?oids=${d.oid}`);
836
+ } else if (d.ot === 1) {
837
+ await this.writeLeaf(`${fid}.urls.audio_mp3`, `${this.baseUrl}/audio.mp3?oid=${d.oid}`);
838
+ await this.writeLeaf(`${fid}.urls.audio_ogg`, `${this.baseUrl}/audio.ogg?oid=${d.oid}`);
839
+ }
793
840
  }
794
841
  if (d.ot === 2) {
795
842
  const snapId = `${fid}.snapshot_b64`;
@@ -1288,7 +1335,9 @@ class AgentDvr extends utils.Adapter {
1288
1335
  qs.push(`ot=${encodeURIComponent(String(entry.ot))}`);
1289
1336
  }
1290
1337
  }
1291
- return (entry.path || "") + (qs.length ? `?${qs.join("&")}` : "");
1338
+ const base = entry.path || "";
1339
+ const sep = base.includes("?") ? "&" : "?";
1340
+ return base + (qs.length ? `${sep}${qs.join("&")}` : "");
1292
1341
  }
1293
1342
  async clearPtzSiblings(stateId) {
1294
1343
  const prefix = stateId.slice(0, stateId.lastIndexOf(".") + 1);
@@ -1318,6 +1367,21 @@ class AgentDvr extends utils.Adapter {
1318
1367
  }
1319
1368
  return;
1320
1369
  }
1370
+ if (entry.kind === "levelCmd") {
1371
+ const num = typeof val === "number" ? val : parseFloat(String(val != null ? val : ""));
1372
+ if (!isNaN(num)) {
1373
+ const url2 = `${entry.path}?oid=${encodeURIComponent(String(entry.oid))}&ot=${encodeURIComponent(String(entry.ot))}&${entry.valueParam}=${Math.round(num)}`;
1374
+ const cmdRes2 = await this.apiGet(url2);
1375
+ if (cmdRes2.ok) {
1376
+ this.log.debug(`OK: ${url2}`);
1377
+ await this.setStateAsync(relId, { val: Math.round(num), ack: true });
1378
+ } else {
1379
+ this.log.warn(`Command failed (${url2}): ${cmdRes2.error}`);
1380
+ }
1381
+ this.scheduleRefresh();
1382
+ }
1383
+ return;
1384
+ }
1321
1385
  if (entry.kind === "snapshotB64") {
1322
1386
  const snapId = `${entry.fid}.snapshot_b64`;
1323
1387
  await this.fetchSnapshotB64(entry.oid, snapId);