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 +33 -12
- package/README.md +32 -11
- package/build/main.js +71 -7
- package/build/main.js.map +2 -2
- package/io-package.json +14 -14
- package/package.json +1 -1
- package/www/index.html +7693 -38
- package/www/flv.min.js +0 -7534
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
|
|
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
|
|
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
|
-
###
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
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
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
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
|
-
|
|
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);
|