iobroker.agent-dvr 0.0.2 → 0.0.4
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 +198 -0
- package/README.md +164 -88
- package/admin/i18n/de.json +3 -2
- package/admin/i18n/en.json +3 -2
- package/admin/i18n/es.json +3 -2
- package/admin/i18n/fr.json +3 -2
- package/admin/i18n/it.json +3 -2
- package/admin/i18n/nl.json +3 -2
- package/admin/i18n/pl.json +3 -2
- package/admin/i18n/pt.json +3 -2
- package/admin/i18n/ru.json +3 -2
- package/admin/i18n/uk.json +3 -2
- package/admin/i18n/zh-cn.json +3 -2
- package/admin/jsonConfig.json +5 -0
- package/build/main.js +159 -0
- package/build/main.js.map +3 -3
- package/io-package.json +28 -1
- package/package.json +3 -3
package/README.de.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+

|
|
2
|
+
# ioBroker.agent-dvr
|
|
3
|
+
|
|
4
|
+
[](https://www.npmjs.com/package/iobroker.agent-dvr)
|
|
5
|
+
[](https://www.npmjs.com/package/iobroker.agent-dvr)
|
|
6
|
+

|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
**Tests:** 
|
|
10
|
+
|
|
11
|
+
## agent-dvr Adapter für ioBroker
|
|
12
|
+
|
|
13
|
+
Verbindet ioBroker mit [AgentDVR](https://www.ispyconnect.com): Kameras und Mikrofone werden automatisch erkannt, alle Gerätewerte als Datenpunkte gespiegelt, Steuerbefehle (Aufnahme, Arm/Disarm, PTZ, …) als Buttons bereitgestellt und neue Aufnahmen per Push-Trigger sofort gemeldet. Pro Kamera wird eine responsive HTML-Galerie mit optionalem Such- und Tag-Filter erzeugt.
|
|
14
|
+
|
|
15
|
+
## Funktionen
|
|
16
|
+
|
|
17
|
+
- Automatische Erkennung aller AgentDVR-Kameras und -Mikrofone beim Start
|
|
18
|
+
- Alle Geräteeigenschaften als flache Datenpunkte (aus der API gespiegelt)
|
|
19
|
+
- Steuerbuttons pro Gerät: Aufnahme, Snapshot, Erkennung, Alarm ein/aus, Gerät ein/aus, Objekterkennung, Ordner leeren, …
|
|
20
|
+
- Systemweite Buttons: Arm, Disarm, alle ein/aus, Konfiguration neu laden, Speicherverwaltung, Neustart, …
|
|
21
|
+
- **Profil-Selektor** — beschreibbarer Dropdown mit dem aktuell aktiven AgentDVR-Profil (Home / Away / Night / benutzerdefiniert); Änderungen werden sofort übernommen
|
|
22
|
+
- **Snapshot als Base64** — State `snapshot_b64` (Rolle `media.picture`) pro Kamera, manuell per Button abrufbar oder automatisch bei jedem Poll aktualisiert
|
|
23
|
+
- PTZ-Steuerung mit Hold-Switches (links, rechts, oben, unten, Diagonalen, Zoom ein/aus, Stop, Mitte)
|
|
24
|
+
- Stream-URLs pro Kamera (Snapshot, Foto, MJPEG, MP4)
|
|
25
|
+
- Push-Trigger — ioBroker-Skripte reagieren sofort wenn AgentDVR eine neue Aufnahme meldet
|
|
26
|
+
- HTML-Galerie-Widget pro Kamera (reines HTML/CSS oder JS-Modus mit Suche und Tag-Filter)
|
|
27
|
+
- Übersichts-Widget mit allen Kameras in einem HTML-State
|
|
28
|
+
- Rohdaten-JSON-State für fortgeschrittene Anwendungsfälle
|
|
29
|
+
|
|
30
|
+
## Konfiguration
|
|
31
|
+
|
|
32
|
+
| Einstellung | Beschreibung | Standard |
|
|
33
|
+
|-------------|-------------|---------|
|
|
34
|
+
| AgentDVR IP | IP-Adresse des AgentDVR-Servers | — |
|
|
35
|
+
| Port | AgentDVR-Port | `8090` |
|
|
36
|
+
| Benutzername / Passwort | Optionale HTTP-Basic-Authentifizierung | — |
|
|
37
|
+
| Abfrageintervall (s) | Wie oft Daten von AgentDVR abgerufen werden | `30` |
|
|
38
|
+
| HTTP-Timeout (ms) | Timeout pro API-Anfrage | `8000` |
|
|
39
|
+
| Systemsteuerungs-Buttons | Arm/Disarm/Neustart/…-Buttons und Profil-Selektor anlegen | `true` |
|
|
40
|
+
| PTZ-Steuerungs-Buttons | PTZ Hold-Switches pro Kamera anlegen | `true` |
|
|
41
|
+
| Stream-URLs erzeugen | URL-States (Snapshot, MJPEG, MP4) pro Kamera anlegen | `true` |
|
|
42
|
+
| Snapshot als Base64 | Aktuelles Kamerabild bei jedem Poll als Base64 speichern | `false` |
|
|
43
|
+
| Ereignis-Datenpunkte | Aufnahme-Metadaten spiegeln (letztes Ereignis, Anzahl, …) | `true` |
|
|
44
|
+
| Echtzeit-Push-Trigger | Push-Trigger-State anlegen, auf den Skripte subscriben können | `true` |
|
|
45
|
+
| Übersichts-Widget | Einzelner HTML-State mit allen Kamera-Live-Kacheln | `true` |
|
|
46
|
+
| Galerie-Widget pro Kamera | HTML-Aufnahmegalerie pro Kamera | `true` |
|
|
47
|
+
| Roh-API-JSON speichern | Die vollständige getObjects-Antwort in `system.raw_getObjects` schreiben | `false` |
|
|
48
|
+
|
|
49
|
+
## Datenpunkte
|
|
50
|
+
|
|
51
|
+
Der Adapter erzeugt folgende Datenpunkt-Struktur. `<cam>` steht für `cam_<oid>_<name>`, z.B. `cam_8_Reolink`. Mikrofone verwenden dasselbe Layout mit Präfix `mic_<oid>_<name>`.
|
|
52
|
+
|
|
53
|
+
### System
|
|
54
|
+
|
|
55
|
+
| Datenpunkt | Typ | R/W | Beschreibung |
|
|
56
|
+
|-----------|-----|-----|-------------|
|
|
57
|
+
| `system.online` | boolean | R | Verbindung zu AgentDVR hergestellt |
|
|
58
|
+
| `system.lastUpdate` | string | R | ISO-Zeitstempel der letzten erfolgreichen Abfrage |
|
|
59
|
+
| `system.lastPoll` | number | R | Unix-Zeitstempel der letzten Abfrage |
|
|
60
|
+
| `system.cameraCount` | number | R | Anzahl erkannter Kameras |
|
|
61
|
+
| `system.disk_free_gb` | number | R | Freier Speicherplatz in GB |
|
|
62
|
+
| `system.settings.*` | verschiedene | R | Flache AgentDVR-Servereinstellungen |
|
|
63
|
+
| `system.stats.*` | verschiedene | R | CPU / RAM / Festplatten-Statistiken |
|
|
64
|
+
| `system.status.*` | verschiedene | R | Systemstatus (armed, Geräteanzahl, Version, …) |
|
|
65
|
+
| `system.raw_getObjects` | string | R | Roh-getObjects-JSON (wenn aktiviert) |
|
|
66
|
+
|
|
67
|
+
### Systemsteuerung *(erfordert „Systemsteuerungs-Buttons")*
|
|
68
|
+
|
|
69
|
+
| Datenpunkt | Typ | R/W | Beschreibung |
|
|
70
|
+
|-----------|-----|-----|-------------|
|
|
71
|
+
| `system.control.arm` | Button | W | System scharf schalten |
|
|
72
|
+
| `system.control.disarm` | Button | W | System unscharf schalten |
|
|
73
|
+
| `system.control.allOn` | Button | W | Alle Geräte einschalten |
|
|
74
|
+
| `system.control.allOff` | Button | W | Alle Geräte ausschalten |
|
|
75
|
+
| `system.control.reloadConfig` | Button | W | AgentDVR-Konfiguration neu laden |
|
|
76
|
+
| `system.control.reloadObjects` | Button | W | Objekte neu laden |
|
|
77
|
+
| `system.control.runStorageMgmt` | Button | W | Speicherverwaltung ausführen |
|
|
78
|
+
| `system.control.blockExternal` | Button | W | Externen Zugriff sperren |
|
|
79
|
+
| `system.control.unblockExternal` | Button | W | Externen Zugriff freigeben |
|
|
80
|
+
| `system.control.restart` | Button | W | AgentDVR neu starten |
|
|
81
|
+
| `system.control.refresh` | Button | W | Sofortige Abfrage erzwingen |
|
|
82
|
+
| `system.profile.selector` | number | R/W | Aktiver Profil-Index — Dropdown aus AgentDVR befüllt (0 = Home, 1 = Away, …); aktives Profil wird bei jedem Poll aktualisiert |
|
|
83
|
+
| `system.profile.list` | string | R | Verfügbare Profile als JSON-Array |
|
|
84
|
+
|
|
85
|
+
### Pro Kamera / Mikrofon
|
|
86
|
+
|
|
87
|
+
Die rohen Gerätedaten aus AgentDVR werden rekursiv gespiegelt (Tiefe konfigurierbar, Standard 6). Der wichtigste Unterordner ist `<cam>.data.*`:
|
|
88
|
+
|
|
89
|
+
| Datenpunkt | Typ | R/W | Beschreibung |
|
|
90
|
+
|-----------|-----|-----|-------------|
|
|
91
|
+
| `<cam>.name` | string | R | Gerätename |
|
|
92
|
+
| `<cam>.data.online` | boolean | R | Gerät ist online |
|
|
93
|
+
| `<cam>.data.connected` | boolean | R | Stream ist verbunden |
|
|
94
|
+
| `<cam>.data.recording` | boolean | R | Aufnahme läuft gerade |
|
|
95
|
+
| `<cam>.data.detected` | boolean | R | Bewegung/Objekt erkannt |
|
|
96
|
+
| `<cam>.data.detectorActive` | boolean | R | Bewegungsdetektor aktiv |
|
|
97
|
+
| `<cam>.data.alertsActive` | boolean | R | Alarm aktiviert |
|
|
98
|
+
| `<cam>.data.alerted` | boolean | R | Alarm wird gerade ausgelöst |
|
|
99
|
+
| `<cam>.data.scheduleActive` | boolean | R | Zeitplan aktiv |
|
|
100
|
+
| `<cam>.data.width` / `height` | number | R | Stream-Auflösung |
|
|
101
|
+
| `<cam>.data.*` | verschiedene | R | Alle weiteren Geräteeigenschaften aus AgentDVR |
|
|
102
|
+
| `<cam>.snapshot_b64` | string | R | Aktuelles Kamerabild als `data:image/jpeg;base64,…` (Rolle `media.picture`) |
|
|
103
|
+
| `<cam>.control.record` | Button | W | Aufnahme starten |
|
|
104
|
+
| `<cam>.control.recordStop` | Button | W | Aufnahme stoppen |
|
|
105
|
+
| `<cam>.control.recordRestart` | Button | W | Aufnahme neu starten |
|
|
106
|
+
| `<cam>.control.triggerRecord` | Button | W | Aufnahme auslösen (läuft bis Timeout) |
|
|
107
|
+
| `<cam>.control.snapshot` | Button | W | AgentDVR einen Snapshot auf Disk speichern lassen |
|
|
108
|
+
| `<cam>.control.refreshSnapshotB64` | Button | W | Aktuelles Bild abrufen und in `snapshot_b64` schreiben |
|
|
109
|
+
| `<cam>.control.detect` | Button | W | Bewegungserkennung auslösen |
|
|
110
|
+
| `<cam>.control.alertOn` | Button | W | Alarm aktivieren |
|
|
111
|
+
| `<cam>.control.alertOff` | Button | W | Alarm deaktivieren |
|
|
112
|
+
| `<cam>.control.switchOn` | Button | W | Gerät einschalten |
|
|
113
|
+
| `<cam>.control.switchOff` | Button | W | Gerät ausschalten |
|
|
114
|
+
| `<cam>.control.objectDetectOn` | Button | W | Objekterkennung aktivieren |
|
|
115
|
+
| `<cam>.control.objectDetectOff` | Button | W | Objekterkennung deaktivieren |
|
|
116
|
+
| `<cam>.control.recOnAlert` | Button | W | „Aufnahme bei Alarm" aktivieren |
|
|
117
|
+
| `<cam>.control.recOnDetect` | Button | W | „Aufnahme bei Erkennung" aktivieren |
|
|
118
|
+
| `<cam>.control.purge` | Button | W | Alle Aufnahmen im Geräteordner löschen |
|
|
119
|
+
|
|
120
|
+
### PTZ *(nur Kameras, erfordert „PTZ-Steuerungs-Buttons")*
|
|
121
|
+
|
|
122
|
+
| Datenpunkt | Typ | R/W | Beschreibung |
|
|
123
|
+
|-----------|-----|-----|-------------|
|
|
124
|
+
| `<cam>.control.ptz.left` | Switch | R/W | Nach links schwenken (halten = Dauerbewegung) |
|
|
125
|
+
| `<cam>.control.ptz.right` | Switch | R/W | Nach rechts schwenken |
|
|
126
|
+
| `<cam>.control.ptz.up` | Switch | R/W | Nach oben neigen |
|
|
127
|
+
| `<cam>.control.ptz.down` | Switch | R/W | Nach unten neigen |
|
|
128
|
+
| `<cam>.control.ptz.upLeft` | Switch | R/W | Diagonal oben-links |
|
|
129
|
+
| `<cam>.control.ptz.upRight` | Switch | R/W | Diagonal oben-rechts |
|
|
130
|
+
| `<cam>.control.ptz.downLeft` | Switch | R/W | Diagonal unten-links |
|
|
131
|
+
| `<cam>.control.ptz.downRight` | Switch | R/W | Diagonal unten-rechts |
|
|
132
|
+
| `<cam>.control.ptz.zoomIn` | Switch | R/W | Reinzoomen |
|
|
133
|
+
| `<cam>.control.ptz.zoomOut` | Switch | R/W | Rauszoomen |
|
|
134
|
+
| `<cam>.control.ptz.stop` | Button | W | PTZ-Bewegung stoppen |
|
|
135
|
+
| `<cam>.control.ptz.center` | Button | W | In Mittelposition/Home fahren |
|
|
136
|
+
|
|
137
|
+
### Stream-URLs *(nur Kameras, erfordert „Stream-URLs erzeugen")*
|
|
138
|
+
|
|
139
|
+
| Datenpunkt | Typ | R/W | Beschreibung |
|
|
140
|
+
|-----------|-----|-----|-------------|
|
|
141
|
+
| `<cam>.urls.snapshot` | string | R | URL zum aktuellen JPEG-Snapshot (`/grab.jpg`) |
|
|
142
|
+
| `<cam>.urls.photo` | string | R | URL zum Foto-Endpoint (`/photo.jpg`) |
|
|
143
|
+
| `<cam>.urls.mjpeg` | string | R | URL zum MJPEG-Livestream (`/video.mjpg`) |
|
|
144
|
+
| `<cam>.urls.mp4` | string | R | URL zum MP4-Livestream (`/video.mp4`) |
|
|
145
|
+
|
|
146
|
+
### Ereignisse / Galerie *(nur Kameras)*
|
|
147
|
+
|
|
148
|
+
| Datenpunkt | Typ | R/W | Beschreibung |
|
|
149
|
+
|-----------|-----|-----|-------------|
|
|
150
|
+
| `<cam>.events.*` | verschiedene | R | Metadaten der letzten Aufnahme (Dateiname, Datum, Dauer, Tags, …) — erfordert „Ereignis-Datenpunkte" |
|
|
151
|
+
| `<cam>.push` | string | R | Push-Trigger — wird sofort aktualisiert wenn AgentDVR eine neue Aufnahme meldet — erfordert „Echtzeit-Push-Trigger" |
|
|
152
|
+
| `<cam>.gallery` | string | R | HTML-Galerie der letzten Aufnahmen — erfordert „Galerie-Widget" |
|
|
153
|
+
|
|
154
|
+
### Übersicht *(erfordert „Übersichts-Widget")*
|
|
155
|
+
|
|
156
|
+
| Datenpunkt | Typ | R/W | Beschreibung |
|
|
157
|
+
|-----------|-----|-----|-------------|
|
|
158
|
+
| `overview` | string | R | HTML-Kachelraster aller Kameras mit Livestream-Links |
|
|
159
|
+
|
|
160
|
+
## Snapshot als Base64
|
|
161
|
+
|
|
162
|
+
Der State `snapshot_b64` enthält das aktuelle Kamerabild als `data:image/jpeg;base64,…`-String und kann direkt in vis/vis-2-Bild-Widgets verwendet werden, ohne dass der Browser einen eigenen HTTP-Request durchführen muss.
|
|
163
|
+
|
|
164
|
+
**Manuell aktualisieren:** `true` in `<cam>.control.refreshSnapshotB64` schreiben — kein Adapter-Neustart nötig.
|
|
165
|
+
|
|
166
|
+
**Automatisch aktualisieren:** „Snapshot als Base64" in den Adapter-Einstellungen aktivieren — dann wird der State bei jedem Poll-Zyklus neu befüllt.
|
|
167
|
+
|
|
168
|
+
## Changelog
|
|
169
|
+
|
|
170
|
+
<!--
|
|
171
|
+
Placeholder for the next version (at the beginning of the line):
|
|
172
|
+
### **WORK IN PROGRESS**
|
|
173
|
+
-->
|
|
174
|
+
### 0.0.4 (2026-06-27)
|
|
175
|
+
* (ipod86) fix: DP-Rollen korrigiert: snapshot_b64 → state (E1008), Profil-Selektor → level (E1011)
|
|
176
|
+
|
|
177
|
+
### 0.0.3 (2026-06-27)
|
|
178
|
+
* (ipod86) feat: Profil-Selektor — liest Profile aus getObjects, beschreibbarer Dropdown mit aktivem Profil bei jedem Poll
|
|
179
|
+
* (ipod86) feat: snapshot_b64-State (media.picture) immer vorhanden + manueller Refresh-Button; Auto-Poll optional
|
|
180
|
+
|
|
181
|
+
### 0.0.2 (2026-06-27)
|
|
182
|
+
* (ipod86) npm Trusted Publishing eingerichtet und Repochecker-Findings behoben
|
|
183
|
+
|
|
184
|
+
### 0.0.1 (2026-06-27)
|
|
185
|
+
* (ipod86) Erstveröffentlichung
|
|
186
|
+
|
|
187
|
+
[Ältere Changelog-Einträge in CHANGELOG_OLD.md](CHANGELOG_OLD.md)
|
|
188
|
+
|
|
189
|
+
## Lizenz
|
|
190
|
+
MIT License
|
|
191
|
+
|
|
192
|
+
Copyright (c) 2026 ipod86 <david@graef.email>
|
|
193
|
+
|
|
194
|
+
Hiermit wird unentgeltlich jeder Person, die eine Kopie der Software und der zugehörigen Dokumentationen (die „Software") erhält, die Erlaubnis erteilt, sie uneingeschränkt zu nutzen, inklusive und ohne Ausnahme mit dem Recht, sie zu verwenden, zu kopieren, zu verändern, zusammenzuführen, zu veröffentlichen, zu verbreiten, zu unterlizenzieren und/oder zu verkaufen, und Personen, denen diese Software überlassen wird, diese Rechte zu verschaffen, unter den folgenden Bedingungen:
|
|
195
|
+
|
|
196
|
+
Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in allen Kopien oder Teilkopien der Software beizulegen.
|
|
197
|
+
|
|
198
|
+
DIE SOFTWARE WIRD OHNE JEDE AUSDRÜCKLICHE ODER IMPLIZIERTE GARANTIE BEREITGESTELLT, EINSCHLIEẞLICH DER GARANTIE ZUR BENUTZUNG FÜR DEN VORGESEHENEN ODER EINEM BESTIMMTEN ZWECK SOWIE JEGLICHER RECHTSVERLETZUNG, JEDOCH NICHT DARAUF BESCHRÄNKT. IN KEINEM FALL SIND DIE AUTOREN ODER COPYRIGHTINHABER FÜR JEGLICHEN SCHADEN ODER SONSTIGE ANSPRÜCHE HAFTBAR ZU MACHEN, OB INFOLGE DER ERFÜLLUNG EINES VERTRAGES, EINES DELIKTES ODER ANDERS IM ZUSAMMENHANG MIT DER SOFTWARE ODER SONSTIGER VERWENDUNG DER SOFTWARE ENTSTANDEN.
|
package/README.md
CHANGED
|
@@ -12,99 +12,175 @@
|
|
|
12
12
|
|
|
13
13
|
## agent-dvr adapter for ioBroker
|
|
14
14
|
|
|
15
|
-
Connects ioBroker to AgentDVR: auto-discovers cameras, mirrors
|
|
16
|
-
|
|
17
|
-
##
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
|
60
|
-
|
|
61
|
-
| `
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
15
|
+
Connects ioBroker to [AgentDVR](https://www.ispyconnect.com): auto-discovers all cameras and microphones, mirrors every device property as data points, provides buttons for all common commands (record, arm, PTZ, …), delivers push-triggered gallery updates on new recordings, and generates a responsive HTML gallery widget per camera.
|
|
16
|
+
|
|
17
|
+
## Features
|
|
18
|
+
|
|
19
|
+
- Auto-discovery of all AgentDVR cameras and microphones on startup
|
|
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, …
|
|
22
|
+
- System-level buttons: arm, disarm, all on/off, reload, storage management, restart, …
|
|
23
|
+
- **Profile selector** — writable dropdown that reflects the current AgentDVR profile (Home / Away / Night / custom); changes apply immediately
|
|
24
|
+
- **Snapshot as Base64** — `snapshot_b64` state (role `media.picture`) per camera, writable via button or auto-updated every poll cycle
|
|
25
|
+
- PTZ control with hold-to-move switches (left, right, up, down, diagonals, zoom in/out, stop, center)
|
|
26
|
+
- Stream URLs per camera (snapshot, photo, MJPEG, MP4)
|
|
27
|
+
- Push trigger state — ioBroker scripts can react instantly when AgentDVR reports a new recording
|
|
28
|
+
- HTML gallery widget per camera (pure HTML/CSS or full JS mode with search and tag filter)
|
|
29
|
+
- Overview widget combining all cameras in one HTML state
|
|
30
|
+
- Raw API JSON state for advanced use cases
|
|
31
|
+
|
|
32
|
+
## Configuration
|
|
33
|
+
|
|
34
|
+
| Setting | Description | Default |
|
|
35
|
+
|---------|-------------|---------|
|
|
36
|
+
| AgentDVR IP | IP address of the AgentDVR server | — |
|
|
37
|
+
| Port | AgentDVR port | `8090` |
|
|
38
|
+
| Username / Password | Optional HTTP basic auth | — |
|
|
39
|
+
| Poll interval (s) | How often to fetch data from AgentDVR | `30` |
|
|
40
|
+
| HTTP timeout (ms) | Timeout per API request | `8000` |
|
|
41
|
+
| System control buttons | Create arm/disarm/restart/… buttons and the profile selector | `true` |
|
|
42
|
+
| PTZ control buttons | Create per-camera PTZ hold-switches | `true` |
|
|
43
|
+
| Generate stream URLs | Create URL states (snapshot, MJPEG, MP4) per camera | `true` |
|
|
44
|
+
| Snapshot as Base64 | Auto-fetch and store the current frame as Base64 on every poll | `false` |
|
|
45
|
+
| Event data points | Mirror recording metadata (latest event, count, …) | `true` |
|
|
46
|
+
| Real-time push trigger | Create push-trigger state that scripts can subscribe to | `true` |
|
|
47
|
+
| Overview widget | Single HTML state combining all camera live tiles | `true` |
|
|
48
|
+
| Gallery widget per camera | HTML recording gallery per camera | `true` |
|
|
49
|
+
| Store raw API JSON | Write the full getObjects response to `system.raw_getObjects` | `false` |
|
|
50
|
+
|
|
51
|
+
## Data points
|
|
52
|
+
|
|
53
|
+
The adapter creates the following data point tree. `<cam>` stands for `cam_<oid>_<name>`, e.g. `cam_8_Reolink`. Microphones use the same layout but with prefix `mic_<oid>_<name>`.
|
|
54
|
+
|
|
55
|
+
### System
|
|
56
|
+
|
|
57
|
+
| Data point | Type | R/W | Description |
|
|
58
|
+
|-----------|------|-----|-------------|
|
|
59
|
+
| `system.online` | boolean | R | Connection to AgentDVR established |
|
|
60
|
+
| `system.lastUpdate` | string | R | ISO timestamp of last successful poll |
|
|
61
|
+
| `system.lastPoll` | number | R | Unix timestamp of last poll |
|
|
62
|
+
| `system.cameraCount` | number | R | Number of cameras discovered |
|
|
63
|
+
| `system.disk_free_gb` | number | R | Free disk space in GB |
|
|
64
|
+
| `system.settings.*` | various | R | Flattened AgentDVR server settings |
|
|
65
|
+
| `system.stats.*` | various | R | CPU / RAM / disk stats |
|
|
66
|
+
| `system.status.*` | various | R | System status (armed, devices, version, …) |
|
|
67
|
+
| `system.raw_getObjects` | string | R | Raw getObjects JSON (if enabled) |
|
|
68
|
+
|
|
69
|
+
### System controls *(requires "System control buttons")*
|
|
70
|
+
|
|
71
|
+
| Data point | Type | R/W | Description |
|
|
72
|
+
|-----------|------|-----|-------------|
|
|
73
|
+
| `system.control.arm` | button | W | Arm the system |
|
|
74
|
+
| `system.control.disarm` | button | W | Disarm the system |
|
|
75
|
+
| `system.control.allOn` | button | W | Switch all devices on |
|
|
76
|
+
| `system.control.allOff` | button | W | Switch all devices off |
|
|
77
|
+
| `system.control.reloadConfig` | button | W | Reload AgentDVR configuration |
|
|
78
|
+
| `system.control.reloadObjects` | button | W | Reload objects |
|
|
79
|
+
| `system.control.runStorageMgmt` | button | W | Run storage management |
|
|
80
|
+
| `system.control.blockExternal` | button | W | Block external access |
|
|
81
|
+
| `system.control.unblockExternal` | button | W | Unblock external access |
|
|
82
|
+
| `system.control.restart` | button | W | Restart AgentDVR |
|
|
83
|
+
| `system.control.refresh` | button | W | Force immediate poll |
|
|
84
|
+
| `system.profile.selector` | number | R/W | Active profile index — dropdown populated from AgentDVR (0 = Home, 1 = Away, …) |
|
|
85
|
+
| `system.profile.list` | string | R | Available profiles as JSON array |
|
|
86
|
+
|
|
87
|
+
### Per camera / microphone
|
|
88
|
+
|
|
89
|
+
The raw device data from AgentDVR is mirrored recursively (depth configurable, default 6). The most important sub-tree is `<cam>.data.*`:
|
|
90
|
+
|
|
91
|
+
| Data point | Type | R/W | Description |
|
|
92
|
+
|-----------|------|-----|-------------|
|
|
93
|
+
| `<cam>.name` | string | R | Device name |
|
|
94
|
+
| `<cam>.data.online` | boolean | R | Device is online |
|
|
95
|
+
| `<cam>.data.connected` | boolean | R | Stream is connected |
|
|
96
|
+
| `<cam>.data.recording` | boolean | R | Currently recording |
|
|
97
|
+
| `<cam>.data.detected` | boolean | R | Motion/object detected |
|
|
98
|
+
| `<cam>.data.detectorActive` | boolean | R | Motion detector enabled |
|
|
99
|
+
| `<cam>.data.alertsActive` | boolean | R | Alerts enabled |
|
|
100
|
+
| `<cam>.data.alerted` | boolean | R | Alert currently active |
|
|
101
|
+
| `<cam>.data.scheduleActive` | boolean | R | Schedule enabled |
|
|
102
|
+
| `<cam>.data.width` / `height` | number | R | Stream resolution |
|
|
103
|
+
| `<cam>.data.*` | various | R | All further device properties from AgentDVR |
|
|
104
|
+
| `<cam>.snapshot_b64` | string | R | Current frame as `data:image/jpeg;base64,…` (role `media.picture`) |
|
|
105
|
+
| `<cam>.control.record` | button | W | Start recording |
|
|
106
|
+
| `<cam>.control.recordStop` | button | W | Stop recording |
|
|
107
|
+
| `<cam>.control.recordRestart` | button | W | Restart recording |
|
|
108
|
+
| `<cam>.control.triggerRecord` | button | W | Trigger recording (runs until timeout) |
|
|
109
|
+
| `<cam>.control.snapshot` | button | W | Tell AgentDVR to save a snapshot to disk |
|
|
110
|
+
| `<cam>.control.refreshSnapshotB64` | button | W | Fetch current frame and write to `snapshot_b64` |
|
|
111
|
+
| `<cam>.control.detect` | button | W | Trigger motion detection |
|
|
112
|
+
| `<cam>.control.alertOn` | button | W | Arm alerts |
|
|
113
|
+
| `<cam>.control.alertOff` | button | W | Disarm alerts |
|
|
114
|
+
| `<cam>.control.switchOn` | button | W | Switch device on |
|
|
115
|
+
| `<cam>.control.switchOff` | button | W | Switch device off |
|
|
116
|
+
| `<cam>.control.objectDetectOn` | button | W | Enable object detection |
|
|
117
|
+
| `<cam>.control.objectDetectOff` | button | W | Disable object detection |
|
|
118
|
+
| `<cam>.control.recOnAlert` | button | W | Enable "record on alert" |
|
|
119
|
+
| `<cam>.control.recOnDetect` | button | W | Enable "record on detect" |
|
|
120
|
+
| `<cam>.control.purge` | button | W | Delete all recordings in the device folder |
|
|
121
|
+
|
|
122
|
+
### PTZ *(cameras only, requires "PTZ control buttons")*
|
|
123
|
+
|
|
124
|
+
| Data point | Type | R/W | Description |
|
|
125
|
+
|-----------|------|-----|-------------|
|
|
126
|
+
| `<cam>.control.ptz.left` | switch | R/W | Pan left (hold to keep moving) |
|
|
127
|
+
| `<cam>.control.ptz.right` | switch | R/W | Pan right |
|
|
128
|
+
| `<cam>.control.ptz.up` | switch | R/W | Tilt up |
|
|
129
|
+
| `<cam>.control.ptz.down` | switch | R/W | Tilt down |
|
|
130
|
+
| `<cam>.control.ptz.upLeft` | switch | R/W | Diagonal up-left |
|
|
131
|
+
| `<cam>.control.ptz.upRight` | switch | R/W | Diagonal up-right |
|
|
132
|
+
| `<cam>.control.ptz.downLeft` | switch | R/W | Diagonal down-left |
|
|
133
|
+
| `<cam>.control.ptz.downRight` | switch | R/W | Diagonal down-right |
|
|
134
|
+
| `<cam>.control.ptz.zoomIn` | switch | R/W | Zoom in |
|
|
135
|
+
| `<cam>.control.ptz.zoomOut` | switch | R/W | Zoom out |
|
|
136
|
+
| `<cam>.control.ptz.stop` | button | W | Stop PTZ movement |
|
|
137
|
+
| `<cam>.control.ptz.center` | button | W | Move to center/home position |
|
|
138
|
+
|
|
139
|
+
### Stream URLs *(cameras only, requires "Generate stream URLs")*
|
|
140
|
+
|
|
141
|
+
| Data point | Type | R/W | Description |
|
|
142
|
+
|-----------|------|-----|-------------|
|
|
143
|
+
| `<cam>.urls.snapshot` | string | R | URL to current JPEG snapshot (`/grab.jpg`) |
|
|
144
|
+
| `<cam>.urls.photo` | string | R | URL to photo endpoint (`/photo.jpg`) |
|
|
145
|
+
| `<cam>.urls.mjpeg` | string | R | URL to MJPEG live stream (`/video.mjpg`) |
|
|
146
|
+
| `<cam>.urls.mp4` | string | R | URL to MP4 live stream (`/video.mp4`) |
|
|
147
|
+
|
|
148
|
+
### Events / Gallery *(cameras only)*
|
|
149
|
+
|
|
150
|
+
| Data point | Type | R/W | Description |
|
|
151
|
+
|-----------|------|-----|-------------|
|
|
152
|
+
| `<cam>.events.*` | various | R | Latest recording metadata (filename, date, duration, tags, …) — requires "Event data points" |
|
|
153
|
+
| `<cam>.push` | string | R | Push trigger — updated immediately when AgentDVR reports a new recording — requires "Real-time push trigger" |
|
|
154
|
+
| `<cam>.gallery` | string | R | HTML gallery of recent recordings — requires "Gallery widget" |
|
|
155
|
+
|
|
156
|
+
### Overview *(requires "Overview widget")*
|
|
157
|
+
|
|
158
|
+
| Data point | Type | R/W | Description |
|
|
159
|
+
|-----------|------|-----|-------------|
|
|
160
|
+
| `overview` | string | R | HTML tile grid of all cameras with live stream links |
|
|
161
|
+
|
|
162
|
+
## Snapshot as Base64
|
|
163
|
+
|
|
164
|
+
The `snapshot_b64` state stores the current camera frame as a `data:image/jpeg;base64,…` string so it can be used directly in vis/vis-2 image widgets without a separate HTTP request from the browser.
|
|
165
|
+
|
|
166
|
+
**Manual refresh:** Write `true` to `<cam>.control.refreshSnapshotB64` to fetch a new frame on demand — no adapter restart required.
|
|
167
|
+
|
|
168
|
+
**Auto-refresh:** Enable *"Snapshot as Base64"* in the adapter configuration to refresh automatically on every poll cycle.
|
|
102
169
|
|
|
103
170
|
## Changelog
|
|
171
|
+
|
|
104
172
|
<!--
|
|
105
173
|
Placeholder for the next version (at the beginning of the line):
|
|
106
174
|
### **WORK IN PROGRESS**
|
|
107
175
|
-->
|
|
176
|
+
### 0.0.4 (2026-06-27)
|
|
177
|
+
* (ipod86) fix: snapshot_b64 role corrected to `state` (E1008)
|
|
178
|
+
* (ipod86) fix: profile selector role corrected to `level` (E1011)
|
|
179
|
+
|
|
180
|
+
### 0.0.3 (2026-06-27)
|
|
181
|
+
* (ipod86) feat: profile selector — reads profiles from getObjects, writable dropdown with active profile reflected on every poll
|
|
182
|
+
* (ipod86) feat: snapshot_b64 state (media.picture) always present per camera + manual refresh button; auto-poll optional
|
|
183
|
+
|
|
108
184
|
### 0.0.2 (2026-06-27)
|
|
109
185
|
* (ipod86) setup npm trusted publishing and fix repochecker findings
|
|
110
186
|
|
|
@@ -134,4 +210,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
134
210
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
135
211
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
136
212
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
137
|
-
SOFTWARE.
|
|
213
|
+
SOFTWARE.
|
package/admin/i18n/de.json
CHANGED
|
@@ -36,5 +36,6 @@
|
|
|
36
36
|
"cfgMaxArray": "Max. Array-Länge zum Erweitern",
|
|
37
37
|
"cfgEventTagsDynamic": "Ereignis-Tags automatisch aus Aufnahmen erkennen",
|
|
38
38
|
"cfgEventTagsIgnore": "Zu ignorierende Ereignis-Tags (kommagetrennt)",
|
|
39
|
-
"cfgEventTags": "Feste Ereignis-Tags, die immer erstellt werden (kommagetrennt)"
|
|
40
|
-
|
|
39
|
+
"cfgEventTags": "Feste Ereignis-Tags, die immer erstellt werden (kommagetrennt)",
|
|
40
|
+
"cfgEnableSnapshotB64": "Snapshot als Base64 (media.picture-State pro Kamera)"
|
|
41
|
+
}
|
package/admin/i18n/en.json
CHANGED
|
@@ -36,5 +36,6 @@
|
|
|
36
36
|
"cfgMaxArray": "Max. array length to expand",
|
|
37
37
|
"cfgEventTagsDynamic": "Auto-detect event tags from recordings",
|
|
38
38
|
"cfgEventTagsIgnore": "Event tags to ignore (comma-separated)",
|
|
39
|
-
"cfgEventTags": "Fixed event tags to always create (comma-separated)"
|
|
40
|
-
|
|
39
|
+
"cfgEventTags": "Fixed event tags to always create (comma-separated)",
|
|
40
|
+
"cfgEnableSnapshotB64": "Snapshot as Base64 (media.picture state per camera)"
|
|
41
|
+
}
|
package/admin/i18n/es.json
CHANGED
|
@@ -36,5 +36,6 @@
|
|
|
36
36
|
"cfgMaxArray": "Longitud máxima de array a expandir",
|
|
37
37
|
"cfgEventTagsDynamic": "Detectar automáticamente etiquetas de eventos desde grabaciones",
|
|
38
38
|
"cfgEventTagsIgnore": "Etiquetas de eventos a ignorar (separadas por comas)",
|
|
39
|
-
"cfgEventTags": "Etiquetas de eventos fijas a crear siempre (separadas por comas)"
|
|
40
|
-
|
|
39
|
+
"cfgEventTags": "Etiquetas de eventos fijas a crear siempre (separadas por comas)",
|
|
40
|
+
"cfgEnableSnapshotB64": "Snapshot como Base64 (estado media.picture por cámara)"
|
|
41
|
+
}
|
package/admin/i18n/fr.json
CHANGED
|
@@ -36,5 +36,6 @@
|
|
|
36
36
|
"cfgMaxArray": "Longueur maximale du tableau à développer",
|
|
37
37
|
"cfgEventTagsDynamic": "Détecter automatiquement les tags d'événements depuis les enregistrements",
|
|
38
38
|
"cfgEventTagsIgnore": "Tags d'événements à ignorer (séparés par des virgules)",
|
|
39
|
-
"cfgEventTags": "Tags d'événements fixes à toujours créer (séparés par des virgules)"
|
|
40
|
-
|
|
39
|
+
"cfgEventTags": "Tags d'événements fixes à toujours créer (séparés par des virgules)",
|
|
40
|
+
"cfgEnableSnapshotB64": "Snapshot en Base64 (état media.picture par caméra)"
|
|
41
|
+
}
|
package/admin/i18n/it.json
CHANGED
|
@@ -36,5 +36,6 @@
|
|
|
36
36
|
"cfgMaxArray": "Lunghezza massima dell'array da espandere",
|
|
37
37
|
"cfgEventTagsDynamic": "Rilevamento automatico dei tag degli eventi dalle registrazioni",
|
|
38
38
|
"cfgEventTagsIgnore": "Tag degli eventi da ignorare (separati da virgola)",
|
|
39
|
-
"cfgEventTags": "Tag degli eventi fissi da creare sempre (separati da virgola)"
|
|
40
|
-
|
|
39
|
+
"cfgEventTags": "Tag degli eventi fissi da creare sempre (separati da virgola)",
|
|
40
|
+
"cfgEnableSnapshotB64": "Snapshot come Base64 (stato media.picture per telecamera)"
|
|
41
|
+
}
|
package/admin/i18n/nl.json
CHANGED
|
@@ -36,5 +36,6 @@
|
|
|
36
36
|
"cfgMaxArray": "Max. arraylengte om uit te breiden",
|
|
37
37
|
"cfgEventTagsDynamic": "Gebeurtenistags automatisch detecteren uit opnames",
|
|
38
38
|
"cfgEventTagsIgnore": "Te negeren gebeurtenistags (kommagescheiden)",
|
|
39
|
-
"cfgEventTags": "Vaste gebeurtenistags die altijd worden aangemaakt (kommagescheiden)"
|
|
40
|
-
|
|
39
|
+
"cfgEventTags": "Vaste gebeurtenistags die altijd worden aangemaakt (kommagescheiden)",
|
|
40
|
+
"cfgEnableSnapshotB64": "Snapshot als Base64 (media.picture state per camera)"
|
|
41
|
+
}
|
package/admin/i18n/pl.json
CHANGED
|
@@ -36,5 +36,6 @@
|
|
|
36
36
|
"cfgMaxArray": "Maks. długość tablicy do rozwinięcia",
|
|
37
37
|
"cfgEventTagsDynamic": "Automatyczne wykrywanie tagów zdarzeń z nagrań",
|
|
38
38
|
"cfgEventTagsIgnore": "Tagi zdarzeń do zignorowania (oddzielone przecinkami)",
|
|
39
|
-
"cfgEventTags": "Stałe tagi zdarzeń do zawsze tworzenia (oddzielone przecinkami)"
|
|
40
|
-
|
|
39
|
+
"cfgEventTags": "Stałe tagi zdarzeń do zawsze tworzenia (oddzielone przecinkami)",
|
|
40
|
+
"cfgEnableSnapshotB64": "Snapshot jako Base64 (stan media.picture na kamerę)"
|
|
41
|
+
}
|
package/admin/i18n/pt.json
CHANGED
|
@@ -36,5 +36,6 @@
|
|
|
36
36
|
"cfgMaxArray": "Comprimento máximo do array a expandir",
|
|
37
37
|
"cfgEventTagsDynamic": "Detetar automaticamente tags de eventos das gravações",
|
|
38
38
|
"cfgEventTagsIgnore": "Tags de eventos a ignorar (separadas por vírgulas)",
|
|
39
|
-
"cfgEventTags": "Tags de eventos fixas a criar sempre (separadas por vírgulas)"
|
|
40
|
-
|
|
39
|
+
"cfgEventTags": "Tags de eventos fixas a criar sempre (separadas por vírgulas)",
|
|
40
|
+
"cfgEnableSnapshotB64": "Snapshot como Base64 (estado media.picture por câmera)"
|
|
41
|
+
}
|
package/admin/i18n/ru.json
CHANGED
|
@@ -36,5 +36,6 @@
|
|
|
36
36
|
"cfgMaxArray": "Макс. длина массива для разворачивания",
|
|
37
37
|
"cfgEventTagsDynamic": "Автоматически определять теги событий из записей",
|
|
38
38
|
"cfgEventTagsIgnore": "Теги событий для игнорирования (через запятую)",
|
|
39
|
-
"cfgEventTags": "Фиксированные теги событий, которые всегда создаются (через запятую)"
|
|
40
|
-
|
|
39
|
+
"cfgEventTags": "Фиксированные теги событий, которые всегда создаются (через запятую)",
|
|
40
|
+
"cfgEnableSnapshotB64": "Снимок в Base64 (состояние media.picture для каждой камеры)"
|
|
41
|
+
}
|
package/admin/i18n/uk.json
CHANGED
|
@@ -36,5 +36,6 @@
|
|
|
36
36
|
"cfgMaxArray": "Макс. довжина масиву для розгортання",
|
|
37
37
|
"cfgEventTagsDynamic": "Автоматично визначати теги подій із записів",
|
|
38
38
|
"cfgEventTagsIgnore": "Теги подій для ігнорування (через кому)",
|
|
39
|
-
"cfgEventTags": "Фіксовані теги подій, які завжди створюються (через кому)"
|
|
40
|
-
|
|
39
|
+
"cfgEventTags": "Фіксовані теги подій, які завжди створюються (через кому)",
|
|
40
|
+
"cfgEnableSnapshotB64": "Знімок як Base64 (стан media.picture для кожної камери)"
|
|
41
|
+
}
|
package/admin/i18n/zh-cn.json
CHANGED
|
@@ -36,5 +36,6 @@
|
|
|
36
36
|
"cfgMaxArray": "要展开的最大数组长度",
|
|
37
37
|
"cfgEventTagsDynamic": "从录像中自动检测事件标签",
|
|
38
38
|
"cfgEventTagsIgnore": "要忽略的事件标签(逗号分隔)",
|
|
39
|
-
"cfgEventTags": "始终创建的固定事件标签(逗号分隔)"
|
|
40
|
-
|
|
39
|
+
"cfgEventTags": "始终创建的固定事件标签(逗号分隔)",
|
|
40
|
+
"cfgEnableSnapshotB64": "快照为 Base64(每个摄像头的 media.picture 状态)"
|
|
41
|
+
}
|
package/admin/jsonConfig.json
CHANGED
|
@@ -67,6 +67,11 @@
|
|
|
67
67
|
"label": "cfgEnableUrls",
|
|
68
68
|
"xs": 12, "sm": 6, "md": 4, "lg": 4, "xl": 4
|
|
69
69
|
},
|
|
70
|
+
"enableSnapshotB64": {
|
|
71
|
+
"type": "checkbox",
|
|
72
|
+
"label": "cfgEnableSnapshotB64",
|
|
73
|
+
"xs": 12, "sm": 6, "md": 4, "lg": 4, "xl": 4
|
|
74
|
+
},
|
|
70
75
|
"enableEventDps": {
|
|
71
76
|
"type": "checkbox",
|
|
72
77
|
"label": "cfgEnableEventDps",
|