iobroker.agent-dvr 0.1.0 → 0.2.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
@@ -4,195 +4,325 @@
4
4
  [![NPM version](https://img.shields.io/npm/v/iobroker.agent-dvr.svg)](https://www.npmjs.com/package/iobroker.agent-dvr)
5
5
  [![Downloads](https://img.shields.io/npm/dm/iobroker.agent-dvr.svg)](https://www.npmjs.com/package/iobroker.agent-dvr)
6
6
  ![Number of Installations](https://iobroker.live/badges/agent-dvr-installed.svg)
7
- ![Current version in stable repository](https://iobroker.live/badges/agent-dvr-stable.svg)
8
-
9
- **Tests:** ![Test and Release](https://github.com/ipod86/ioBroker.agent-dvr/workflows/Test%20and%20Release/badge.svg)
10
7
 
11
8
  ## agent-dvr Adapter für ioBroker
12
9
 
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.
10
+ Verbindet ioBroker mit [AgentDVR](https://www.ispyconnect.com): erkennt automatisch alle Kameras, spiegelt jede Geräteeigenschaft als Datenpunkt, stellt Schaltflächen für alle gängigen Befehle bereit (Aufnahme, Scharf, PTZ, …), liefert Push-getriggerte Galerie-Updates bei neuen Aufnahmen, erzeugt ein responsives HTML-Galerie-Widget pro Kamera und enthält ein eingebautes Live-Dashboard mit kameraindividueller Stream-Auswahl (MJPEG, MP4/FLV mit Ton oder go2rtc WebRTC).
14
11
 
15
12
  ## Funktionen
16
13
 
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)
14
+ - Automatische Erkennung aller AgentDVR-Kameras beim Start (Mikrofone ausgenommen)
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, …
17
+ - Systemschaltflächen: Scharf/Unscharf, Alle Ein/Aus, Konfiguration neu laden, Speicherverwaltung, Neustart, …
18
+ - **Profilauswahl** — beschreibbares Dropdown, das das aktuelle AgentDVR-Profil widerspiegelt (Zuhause / Weg / Nacht / eigene)
19
+ - **Snapshot als Base64** — `snapshot_b64`-Zustand pro Kamera, per Schaltfläche oder automatisch bei jedem Poll aktualisierbar
20
+ - PTZ-Steuerung mit Halte-Schaltern (links, rechts, oben, unten, diagonal, Zoom, Stopp, Mitte)
24
21
  - Stream-URLs pro Kamera (Snapshot, Foto, MJPEG, MP4)
25
- - Push-Trigger — ioBroker-Skripte reagieren sofort wenn AgentDVR eine neue Aufnahme meldet
22
+ - Push-Trigger-Zustand für sofortige Skript-Reaktionen auf neue Aufnahmen
26
23
  - 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
24
+ - Übersichts-Widget, das alle Kameras in einem HTML-Zustand kombiniert
25
+ - **Eingebautes Live-Dashboard** unter `http://<iobroker>:<webport>/agent-dvr/` keine zusätzliche App nötig:
26
+ - Kameraindividuelle Stream-Auswahl: MJPEG, MP4/FLV mit Ton oder go2rtc WebRTC/MSE
27
+ - Kamera-Filter-Badges zum Ein-/Ausblenden einzelner Kameras (Zustand im localStorage gespeichert)
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
31
+ - Automatischer Reconnect für alle Stream-Typen nach Netzwerkunterbrechung oder Tab-Wechsel
32
+ - Farbdesign vollständig über die Adapter-Konfiguration anpassbar
29
33
 
30
34
  ## Konfiguration
31
35
 
36
+ ### Tab: Verbindung
37
+
32
38
  | Einstellung | Beschreibung | Standard |
33
39
  |-------------|-------------|---------|
34
40
  | 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
- | go2rtc aktivieren | WebRTC-Streams von go2rtc statt MJPEG im Dashboard verwenden | `false` |
49
- | go2rtc URL | Basis-URL des go2rtc-Servers, z.B. `http://192.168.1.10:1984` | |
50
- | Stream-Mapping | Tabelle pro Kamera: AgentDVR-Kamera-Key go2rtc-Stream-Name | |
41
+ | Port | AgentDVR HTTP-Port | `8090` |
42
+ | Benutzername | Optionaler HTTP-Basic-Auth-Benutzername | — |
43
+ | Passwort | Optionales HTTP-Basic-Auth-Passwort | |
44
+ | Poll-Intervall (s) | Wie oft Daten von AgentDVR abgerufen werden (5–3600) | `30` |
45
+ | HTTP-Timeout (ms) | Timeout pro API-Anfrage (1000–30000) | `8000` |
46
+
47
+ ### Tab: Funktionen
48
+
49
+ **Steuerung**
50
+
51
+ | Einstellung | Beschreibung | Standard |
52
+ |-------------|-------------|---------|
53
+ | System-Steuertasten | Scharf/Unscharf/Neustart/…-Tasten und Profilauswahl anlegen | `ja` |
54
+ | PTZ-Steuertasten | PTZ-Halte-Schalter pro Kamera anlegen | `ja` |
55
+ | Stream-URLs generieren | URL-Zustände (Snapshot, MJPEG, MP4) pro Kamera anlegen | `ja` |
56
+ | Snapshot als Base64 | Aktuelles Bild bei jedem Poll automatisch als Base64 speichern | `nein` |
57
+
58
+ **Ereignisse**
59
+
60
+ | Einstellung | Beschreibung | Standard |
61
+ |-------------|-------------|---------|
62
+ | Ereignis-Datenpunkte | Aufnahme-Metadaten (neuestes Ereignis, Anzahl, Tags, …) pro Kamera spiegeln | `ja` |
63
+ | Echtzeit-Push-Trigger | Push-Trigger-Zustand anlegen, auf den Skripte bei neuen Aufnahmen reagieren können | `ja` |
64
+
65
+ **Anzeige**
66
+
67
+ | Einstellung | Beschreibung | Standard |
68
+ |-------------|-------------|---------|
69
+ | Übersichts-Widget | Einen HTML-Zustand mit allen Kamerakacheln zusammengefasst anlegen | `ja` |
70
+
71
+ **Debug**
72
+
73
+ | Einstellung | Beschreibung | Standard |
74
+ |-------------|-------------|---------|
75
+ | Rohe API-JSON speichern | Die vollständige getObjects-Antwort unter `system.raw_getObjects` ablegen | `nein` |
76
+
77
+ ### Tab: Dashboard
78
+
79
+ **Standardansicht**
80
+
81
+ | Einstellung | Beschreibung | Standard |
82
+ |-------------|-------------|---------|
83
+ | Standardansicht | Welcher Tab beim Öffnen des Dashboards aktiv ist: Live oder Aufnahmen | `Live` |
84
+ | Offline-Kameras anzeigen | Kamerakacheln auch dann anzeigen, wenn die Kamera offline ist | `ja` |
85
+
86
+ **Kameraraster**
87
+
88
+ | Einstellung | Beschreibung | Standard |
89
+ |-------------|-------------|---------|
90
+ | Spalten | Anzahl der Rasterspalten (0 = automatisch anhand der Kachelbreite) | `0` |
91
+ | Buttons immer sichtbar | Aufnahme-/PTZ-Tasten dauerhaft anzeigen statt nur beim Hover | `nein` |
92
+ | Tag-Badge Position | Ecke, in der das Kamera-Namens-Badge auf der Kachel erscheint | `unten rechts` |
93
+
94
+ **Stream**
95
+
96
+ | Einstellung | Beschreibung | Standard |
97
+ |-------------|-------------|---------|
98
+ | Refresh-Intervall (s) | Wie oft das Dashboard Kameradaten neu lädt (10–600) | `60` |
99
+ | Automatisch wiederverbinden | MJPEG-, MP4/FLV- und go2rtc-Streams bei Fehler oder Tab-Wechsel automatisch neu verbinden | `ja` |
100
+
101
+ **Farbdesign** — 7 Farbfelder zur Anpassung der Oberfläche:
102
+
103
+ | Einstellung | Beschreibung |
104
+ |-------------|-------------|
105
+ | Hintergrund | Seiten-/Raster-Hintergrundfarbe |
106
+ | Kachel (Surface) | Hintergrundfarbe der Kamerakacheln |
107
+ | Akzent | Hervorhebungs- / aktive Elementfarbe |
108
+ | Text | Primäre Textfarbe |
109
+ | Rahmen | Rahmenfarbe der Kacheln |
110
+ | Online-Indikator | Farbe des Online-Statuspunkts |
111
+ | Offline-Indikator | Farbe des Offline-Statuspunkts |
112
+
113
+ **Stream-Zuweisung**
114
+
115
+ Hier wird jeder Kamera individuell eine Stream-Quelle zugewiesen. Das Dropdown listet alle von AgentDVR erkannten Kameras (Mikrofone werden nicht angezeigt).
116
+
117
+ | Option | Beschreibung |
118
+ |--------|-------------|
119
+ | MJPEG *(AgentDVR)* | Klassischer MJPEG-Stream von AgentDVR — geringste Latenz, kein Ton |
120
+ | MP4 / FLV mit Ton *(AgentDVR)* | FLV-Stream über ioBroker proxied mit flv.js — inklusive Ton, korrektes Seitenverhältnis |
121
+ | *Streamname* *(go2rtc)* | WebRTC/MSE-Stream von go2rtc — flüssig, geringe Latenz, Ton-Unterstützung |
122
+
123
+ Die go2rtc-Streamnamen werden automatisch vom go2rtc-Server abgerufen, wenn das Admin-UI geöffnet ist. Falls der Browser go2rtc nicht direkt erreichen kann (z. B. Mixed-Content bei HTTPS), holt der Adapter sie serverseitig als Fallback.
124
+
125
+ **go2rtc-URL** *(erscheint nur, wenn mindestens eine Kamera einen go2rtc-Stream nutzt)*
126
+
127
+ | Einstellung | Beschreibung | Beispiel |
128
+ |-------------|-------------|---------|
129
+ | go2rtc-URL | Basis-URL der go2rtc-Instanz | `http://192.168.1.10:1984` |
130
+
131
+ > **Hinweis:** go2rtc muss bereits installiert und die Streams dort konfiguriert sein. Der Adapter liest nur die Stream-Liste und proxied den WebSocket — er konfiguriert go2rtc nicht.
132
+
133
+ ### Tab: Widget (Galerie-Widget pro Kamera)
134
+
135
+ **Allgemein**
136
+
137
+ | Einstellung | Beschreibung | Standard |
138
+ |-------------|-------------|---------|
139
+ | Widget aktivieren | HTML-Galerie-Widget pro Kamera erzeugen | `ja` |
140
+ | Widget-Modus | `Kein JS` — reines HTML/CSS, überall einbettbar; `JS` — vollständige Interaktivität mit Suche und Tag-Filter | `Kein JS` |
141
+
142
+ **Layout**
143
+
144
+ | Einstellung | Beschreibung | Standard |
145
+ |-------------|-------------|---------|
146
+ | Max. Einträge | Maximale Anzahl der im Widget angezeigten Aufnahmen | `20` |
147
+ | Min. Spaltenbreite (px) | Mindestbreite einer Thumbnail-Spalte | `150` |
148
+ | Max. Modal-Breite (px) | Maximale Breite des Video-Wiedergabe-Modals | `900` |
149
+
150
+ **Tags**
151
+
152
+ | Einstellung | Beschreibung | Standard |
153
+ |-------------|-------------|---------|
154
+ | Tags anzeigen | Aufnahme-Tags auf jedem Thumbnail anzeigen | `ja` |
155
+ | Tag-Badge Position | Ecke, in der Tags auf dem Thumbnail erscheinen | `unten links` |
156
+
157
+ **Filter**
158
+
159
+ | Einstellung | Beschreibung | Standard |
160
+ |-------------|-------------|---------|
161
+ | Neueste zuerst | Aufnahmen absteigend nach Datum sortieren | `ja` |
162
+ | Suche anzeigen | Textsuchfeld im JS-Modus einblenden | `nein` |
163
+ | Kompakt-Modus | Dichteres Layout mit kleineren Thumbnails | `nein` |
164
+ | Standard-Tag | Diesen Tag-Filter beim Laden des Widgets vorauswählen | — |
165
+ | Vorschaugröße | `Klein` / `Mittel` / `Groß` | `Mittel` |
166
+
167
+ **Player**
168
+
169
+ | Einstellung | Beschreibung | Standard |
170
+ |-------------|-------------|---------|
171
+ | Live-Seitenverhältnis | Seitenverhältnis der Live-Vorschau, z. B. `16/9` | — |
172
+ | Player-URL | Benutzerdefinierte URL für den Video-Player im Widget | — |
173
+
174
+ **Farbdesign** — 5 Farbfelder + Border-Radius:
175
+
176
+ | Einstellung | Beschreibung |
177
+ |-------------|-------------|
178
+ | Karten-Hintergrund | Hintergrundfarbe der Widget-Karten |
179
+ | Tag-Hintergrund | Hintergrundfarbe der Tag-Chips |
180
+ | Tag-Text | Textfarbe der Tag-Chips |
181
+ | Akzent | Hervorhebungsfarbe |
182
+ | Modal-Hintergrund | Hintergrundfarbe des Video-Modals |
183
+ | Border-Radius (px) | Abrundungsradius der Kartenecken | `4` |
184
+
185
+ ### Tab: Erweitert
186
+
187
+ | Einstellung | Beschreibung | Standard |
188
+ |-------------|-------------|---------|
189
+ | Max. Rekursionstiefe | Wie viele Ebenen tief das API-JSON in Datenpunkte umgewandelt wird (1–10) | `6` |
190
+ | Max. Array-Einträge | Maximale Anzahl der gespiegelten Array-Elemente pro Eigenschaft (1–500) | `30` |
191
+ | Tags dynamisch | Für jeden eindeutigen Aufnahme-Tag automatisch einen Datenpunkt anlegen | `nein` |
192
+ | Tags ignorieren (kommagetrennt) | Aufnahme-Tags, die bei Ereignis-Datenpunkten ausgeschlossen werden | — |
193
+ | Tag-Filter (kommagetrennt) | Nur Aufnahmen mit diesen Tags als Ereignis-Datenpunkte anlegen | — |
194
+
195
+ ## Live-Dashboard
196
+
197
+ Das eingebaute Live-Dashboard ist erreichbar unter `http://<iobroker>:<webport>/agent-dvr/`.
198
+
199
+ **Funktionen:**
200
+ - Kameraindividuelle Stream-Auswahl: MJPEG, MP4/FLV mit Ton (via flv.js) oder go2rtc WebRTC/MSE
201
+ - Kamera-Filter-Badges — per Klick einzelne Kameras ein-/ausblenden; Zustand wird im localStorage gespeichert
202
+ - Vollbildansicht mit PTZ-Overlay und Aufnahme-Schaltfläche
203
+ - Echtzeit-Bewegungs- (gelber Rahmen) und Alarm-Indikatoren (oranger Rahmen) via Socket.io
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
206
+ - Farbdesign über die Adapter-Konfiguration einstellbar
207
+
208
+ ### go2rtc WebRTC-Streams
209
+
210
+ [go2rtc](https://github.com/AlexxIT/go2rtc) liefert flüssige, latenzarme WebRTC/MSE-Streams mit Ton.
211
+
212
+ **Einrichtung:**
213
+ 1. go2rtc installieren und starten, Kamera-Streams in der go2rtc-Konfiguration einrichten.
214
+ 2. Im Adapter-Admin → Tab *Dashboard* → *Stream-Zuweisung* für jede Kamera den gewünschten go2rtc-Streamnamen aus dem Dropdown wählen.
215
+ 3. Die **go2rtc-URL** eintragen, die unterhalb der Tabelle erscheint (z. B. `http://192.168.1.10:1984`).
216
+ 4. Speichern und Adapter neu starten. Der Adapter proxied den WebSocket-Traffic über ioBroker, um Browser-CORS-Probleme zu umgehen.
51
217
 
52
218
  ## Datenpunkte
53
219
 
54
- 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>`.
220
+ `<cam>` steht für `cam_<oid>_<name>`, z. B. `cam_8_Reolink`.
55
221
 
56
222
  ### System
57
223
 
58
224
  | Datenpunkt | Typ | R/W | Beschreibung |
59
225
  |-----------|-----|-----|-------------|
60
- | `system.online` | boolean | R | Verbindung zu AgentDVR hergestellt |
61
- | `system.lastUpdate` | string | R | ISO-Zeitstempel der letzten erfolgreichen Abfrage |
62
- | `system.lastPoll` | number | R | Unix-Zeitstempel der letzten Abfrage |
226
+ | `system.online` | boolean | R | Verbindung zu AgentDVR aktiv |
227
+ | `system.lastUpdate` | string | R | ISO-Zeitstempel des letzten erfolgreichen Polls |
228
+ | `system.lastPoll` | number | R | Unix-Zeitstempel des letzten Polls |
63
229
  | `system.cameraCount` | number | R | Anzahl erkannter Kameras |
64
230
  | `system.disk_free_gb` | number | R | Freier Speicherplatz in GB |
65
- | `system.settings.*` | verschiedene | R | Flache AgentDVR-Servereinstellungen |
66
- | `system.stats.*` | verschiedene | R | CPU / RAM / Festplatten-Statistiken |
67
- | `system.status.*` | verschiedene | R | Systemstatus (armed, Geräteanzahl, Version, …) |
68
- | `system.raw_getObjects` | string | R | Roh-getObjects-JSON (wenn aktiviert) |
231
+ | `system.settings.*` | verschieden | R | Flachgeklopfte AgentDVR-Servereinstellungen |
232
+ | `system.stats.*` | verschieden | R | CPU-/RAM-/Festplatten-Statistiken |
233
+ | `system.status.*` | verschieden | R | Systemstatus (scharf, Geräte, Version, …) |
234
+ | `system.raw_getObjects` | string | R | Rohe getObjects-JSON (wenn aktiviert) |
69
235
 
70
- ### Systemsteuerung *(erfordert „Systemsteuerungs-Buttons")*
236
+ ### Systemsteuerung *(erfordert „System-Steuertasten")*
71
237
 
72
238
  | Datenpunkt | Typ | R/W | Beschreibung |
73
239
  |-----------|-----|-----|-------------|
74
- | `system.control.arm` | Button | W | System scharf schalten |
75
- | `system.control.disarm` | Button | W | System unscharf schalten |
76
- | `system.control.allOn` | Button | W | Alle Geräte einschalten |
77
- | `system.control.allOff` | Button | W | Alle Geräte ausschalten |
78
- | `system.control.reloadConfig` | Button | W | AgentDVR-Konfiguration neu laden |
79
- | `system.control.reloadObjects` | Button | W | Objekte neu laden |
80
- | `system.control.runStorageMgmt` | Button | W | Speicherverwaltung ausführen |
81
- | `system.control.blockExternal` | Button | W | Externen Zugriff sperren |
82
- | `system.control.unblockExternal` | Button | W | Externen Zugriff freigeben |
83
- | `system.control.restart` | Button | W | AgentDVR neu starten |
84
- | `system.control.refresh` | Button | W | Sofortige Abfrage erzwingen |
85
- | `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 |
240
+ | `system.control.arm` | Taste | W | System scharf schalten |
241
+ | `system.control.disarm` | Taste | W | System unscharf schalten |
242
+ | `system.control.allOn` | Taste | W | Alle Geräte einschalten |
243
+ | `system.control.allOff` | Taste | W | Alle Geräte ausschalten |
244
+ | `system.control.reloadConfig` | Taste | W | AgentDVR-Konfiguration neu laden |
245
+ | `system.control.reloadObjects` | Taste | W | Objekte neu laden |
246
+ | `system.control.runStorageMgmt` | Taste | W | Speicherverwaltung ausführen |
247
+ | `system.control.blockExternal` | Taste | W | Externen Zugriff sperren |
248
+ | `system.control.unblockExternal` | Taste | W | Externen Zugriff freigeben |
249
+ | `system.control.restart` | Taste | W | AgentDVR neu starten |
250
+ | `system.control.refresh` | Taste | W | Sofortigen Poll erzwingen |
251
+ | `system.profile.selector` | number | R/W | Aktiver Profilindex — Dropdown (0 = Zuhause, 1 = Weg, …) |
86
252
  | `system.profile.list` | string | R | Verfügbare Profile als JSON-Array |
87
253
 
88
- ### Pro Kamera / Mikrofon
89
-
90
- Die rohen Gerätedaten aus AgentDVR werden rekursiv gespiegelt (Tiefe konfigurierbar, Standard 6). Der wichtigste Unterordner ist `<cam>.data.*`:
254
+ ### Pro Kamera
91
255
 
92
256
  | Datenpunkt | Typ | R/W | Beschreibung |
93
257
  |-----------|-----|-----|-------------|
94
- | `<cam>.name` | string | R | Gerätename |
95
- | `<cam>.data.online` | boolean | R | Gerät ist online |
258
+ | `<cam>.name` | string | R | Kameraname |
259
+ | `<cam>.data.online` | boolean | R | Kamera ist online |
96
260
  | `<cam>.data.connected` | boolean | R | Stream ist verbunden |
97
- | `<cam>.data.recording` | boolean | R | Aufnahme läuft gerade |
261
+ | `<cam>.data.recording` | boolean | R | Nimmt gerade auf |
98
262
  | `<cam>.data.detected` | boolean | R | Bewegung/Objekt erkannt |
99
- | `<cam>.data.detectorActive` | boolean | R | Bewegungsdetektor aktiv |
100
- | `<cam>.data.alertsActive` | boolean | R | Alarm aktiviert |
101
- | `<cam>.data.alerted` | boolean | R | Alarm wird gerade ausgelöst |
263
+ | `<cam>.data.detectorActive` | boolean | R | Bewegungserkennung aktiv |
264
+ | `<cam>.data.alertsActive` | boolean | R | Alarme aktiv |
265
+ | `<cam>.data.alerted` | boolean | R | Alarm gerade ausgelöst |
102
266
  | `<cam>.data.scheduleActive` | boolean | R | Zeitplan aktiv |
103
267
  | `<cam>.data.width` / `height` | number | R | Stream-Auflösung |
104
- | `<cam>.data.*` | verschiedene | R | Alle weiteren Geräteeigenschaften aus AgentDVR |
105
- | `<cam>.snapshot_b64` | string | R | Aktuelles Kamerabild als `data:image/jpeg;base64,…` (Rolle `media.picture`) |
106
- | `<cam>.control.record` | Button | W | Aufnahme starten |
107
- | `<cam>.control.recordStop` | Button | W | Aufnahme stoppen |
108
- | `<cam>.control.recordRestart` | Button | W | Aufnahme neu starten |
109
- | `<cam>.control.triggerRecord` | Button | W | Aufnahme auslösen (läuft bis Timeout) |
110
- | `<cam>.control.snapshot` | Button | W | AgentDVR einen Snapshot auf Disk speichern lassen |
111
- | `<cam>.control.refreshSnapshotB64` | Button | W | Aktuelles Bild abrufen und in `snapshot_b64` schreiben |
112
- | `<cam>.control.detect` | Button | W | Bewegungserkennung auslösen |
113
- | `<cam>.control.alertOn` | Button | W | Alarm aktivieren |
114
- | `<cam>.control.alertOff` | Button | W | Alarm deaktivieren |
115
- | `<cam>.control.switchOn` | Button | W | Gerät einschalten |
116
- | `<cam>.control.switchOff` | Button | W | Gerät ausschalten |
117
- | `<cam>.control.objectDetectOn` | Button | W | Objekterkennung aktivieren |
118
- | `<cam>.control.objectDetectOff` | Button | W | Objekterkennung deaktivieren |
119
- | `<cam>.control.recOnAlert` | Button | W | „Aufnahme bei Alarm" aktivieren |
120
- | `<cam>.control.recOnDetect` | Button | W | „Aufnahme bei Erkennung" aktivieren |
121
- | `<cam>.control.purge` | Button | W | Alle Aufnahmen im Geräteordner löschen |
122
-
123
- ### PTZ *(nur Kameras, erfordert „PTZ-Steuerungs-Buttons")*
268
+ | `<cam>.data.*` | verschieden | R | Alle weiteren Geräteeigenschaften von AgentDVR |
269
+ | `<cam>.snapshot_b64` | string | R | Aktuelles Bild als `data:image/jpeg;base64,…` (Rolle `media.picture`) |
270
+ | `<cam>.control.record` | Taste | W | Aufnahme starten |
271
+ | `<cam>.control.recordStop` | Taste | W | Aufnahme stoppen |
272
+ | `<cam>.control.recordRestart` | Taste | W | Aufnahme neu starten |
273
+ | `<cam>.control.triggerRecord` | Taste | W | Aufnahme auslösen (läuft bis Timeout) |
274
+ | `<cam>.control.snapshot` | Taste | W | AgentDVR anweisen, Snapshot auf Disk zu speichern |
275
+ | `<cam>.control.refreshSnapshotB64` | Taste | W | Aktuelles Bild abrufen und in `snapshot_b64` schreiben |
276
+ | `<cam>.control.detect` | Taste | W | Bewegungserkennung auslösen |
277
+ | `<cam>.control.alertOn` | Taste | W | Alarme aktivieren |
278
+ | `<cam>.control.alertOff` | Taste | W | Alarme deaktivieren |
279
+ | `<cam>.control.switchOn` | Taste | W | Kamera einschalten |
280
+ | `<cam>.control.switchOff` | Taste | W | Kamera ausschalten |
281
+ | `<cam>.control.objectDetectOn` | Taste | W | Objekterkennung einschalten |
282
+ | `<cam>.control.objectDetectOff` | Taste | W | Objekterkennung ausschalten |
283
+ | `<cam>.control.recOnAlert` | Taste | W | „Bei Alarm aufnehmen" aktivieren |
284
+ | `<cam>.control.recOnDetect` | Taste | W | „Bei Erkennung aufnehmen" aktivieren |
285
+ | `<cam>.control.purge` | Taste | W | Alle Aufnahmen dieser Kamera löschen |
286
+
287
+ ### PTZ *(erfordert „PTZ-Steuertasten")*
124
288
 
125
289
  | Datenpunkt | Typ | R/W | Beschreibung |
126
290
  |-----------|-----|-----|-------------|
127
- | `<cam>.control.ptz.left` | Switch | R/W | Nach links schwenken (halten = Dauerbewegung) |
128
- | `<cam>.control.ptz.right` | Switch | R/W | Nach rechts schwenken |
129
- | `<cam>.control.ptz.up` | Switch | R/W | Nach oben neigen |
130
- | `<cam>.control.ptz.down` | Switch | R/W | Nach unten neigen |
131
- | `<cam>.control.ptz.upLeft` | Switch | R/W | Diagonal oben-links |
132
- | `<cam>.control.ptz.upRight` | Switch | R/W | Diagonal oben-rechts |
133
- | `<cam>.control.ptz.downLeft` | Switch | R/W | Diagonal unten-links |
134
- | `<cam>.control.ptz.downRight` | Switch | R/W | Diagonal unten-rechts |
135
- | `<cam>.control.ptz.zoomIn` | Switch | R/W | Reinzoomen |
136
- | `<cam>.control.ptz.zoomOut` | Switch | R/W | Rauszoomen |
137
- | `<cam>.control.ptz.stop` | Button | W | PTZ-Bewegung stoppen |
138
- | `<cam>.control.ptz.center` | Button | W | In Mittelposition/Home fahren |
139
-
140
- ### Stream-URLs *(nur Kameras, erfordert „Stream-URLs erzeugen")*
291
+ | `<cam>.control.ptz.left` | Schalter | R/W | Links schwenken (halten = weiter bewegen) |
292
+ | `<cam>.control.ptz.right` | Schalter | R/W | Rechts schwenken |
293
+ | `<cam>.control.ptz.up` | Schalter | R/W | Nach oben neigen |
294
+ | `<cam>.control.ptz.down` | Schalter | R/W | Nach unten neigen |
295
+ | `<cam>.control.ptz.upLeft` | Schalter | R/W | Diagonal oben-links |
296
+ | `<cam>.control.ptz.upRight` | Schalter | R/W | Diagonal oben-rechts |
297
+ | `<cam>.control.ptz.downLeft` | Schalter | R/W | Diagonal unten-links |
298
+ | `<cam>.control.ptz.downRight` | Schalter | R/W | Diagonal unten-rechts |
299
+ | `<cam>.control.ptz.zoomIn` | Schalter | R/W | Heranzoomen |
300
+ | `<cam>.control.ptz.zoomOut` | Schalter | R/W | Herauszoomen |
301
+ | `<cam>.control.ptz.stop` | Taste | W | PTZ-Bewegung stoppen |
302
+ | `<cam>.control.ptz.center` | Taste | W | Mitte-/Ausgangsposition anfahren |
303
+
304
+ ### Stream-URLs *(erfordert „Stream-URLs generieren")*
141
305
 
142
306
  | Datenpunkt | Typ | R/W | Beschreibung |
143
307
  |-----------|-----|-----|-------------|
144
- | `<cam>.urls.snapshot` | string | R | URL zum aktuellen JPEG-Snapshot (`/grab.jpg`) |
145
- | `<cam>.urls.photo` | string | R | URL zum Foto-Endpoint (`/photo.jpg`) |
146
- | `<cam>.urls.mjpeg` | string | R | URL zum MJPEG-Livestream (`/video.mjpg`) |
147
- | `<cam>.urls.mp4` | string | R | URL zum MP4-Livestream (`/video.mp4`) |
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 |
148
312
 
149
- ### Ereignisse / Galerie *(nur Kameras)*
313
+ ### Ereignisse / Galerie
150
314
 
151
315
  | Datenpunkt | Typ | R/W | Beschreibung |
152
316
  |-----------|-----|-----|-------------|
153
- | `<cam>.events.*` | verschiedene | R | Metadaten der letzten Aufnahme (Dateiname, Datum, Dauer, Tags, …) — erfordert „Ereignis-Datenpunkte" |
154
- | `<cam>.push` | string | R | Push-Trigger — wird sofort aktualisiert wenn AgentDVR eine neue Aufnahme meldet — erfordert „Echtzeit-Push-Trigger" |
155
- | `<cam>.gallery` | string | R | HTML-Galerie der letzten Aufnahmen — erfordert „Galerie-Widget" |
317
+ | `<cam>.events.*` | verschieden | R | Metadaten der letzten Aufnahme — erfordert „Ereignis-Datenpunkte" |
318
+ | `<cam>.push` | string | R | Push-Trigger — wird bei neuer Aufnahme sofort aktualisiert — erfordert „Echtzeit-Push-Trigger" |
319
+ | `<cam>.gallery` | string | R | HTML-Aufnahmegalerie — erfordert „Galerie-Widget" |
156
320
 
157
321
  ### Übersicht *(erfordert „Übersichts-Widget")*
158
322
 
159
323
  | Datenpunkt | Typ | R/W | Beschreibung |
160
324
  |-----------|-----|-----|-------------|
161
- | `overview` | string | R | HTML-Kachelraster aller Kameras mit Livestream-Links |
162
-
163
- ## Live-Dashboard
164
-
165
- Der Adapter liefert ein eingebautes Live-Dashboard unter `http://<iobroker>:<webport>/agent-dvr/`.
166
-
167
- **Funktionen:**
168
- - MJPEG- oder WebRTC-Livestream pro Kachel (konfigurierbar)
169
- - Vollbild-Ansicht mit PTZ-Overlay und Aufnahme-Button
170
- - Echtzeit-Bewegungs- (gelber Rahmen) und Alert-Indikator (oranger Rahmen)
171
- - Aufnahmen-Tab mit Raster- und Timeline-Ansicht, Suche und Tag-Filter, Video-Player mit Vor/Zurück-Navigation
172
- - Farbthema über Adapter-Konfiguration (7 Color-Picker)
173
-
174
- ## go2rtc WebRTC-Streams
175
-
176
- Das Dashboard kann [go2rtc](https://github.com/AlexxIT/go2rtc) nutzen, um flüssige WebRTC-Streams statt des MJPEG-Fallbacks anzuzeigen.
177
-
178
- **Voraussetzung:** go2rtc muss installiert und gestartet sein, mit bereits konfigurierten Streams für die Kameras.
179
-
180
- **Einrichtung:**
181
- 1. In der Adapter-Konfiguration → Tab *Live-Dashboard*: **go2rtc aktivieren** und die **go2rtc URL** eintragen (z.B. `http://192.168.1.10:1984`).
182
- 2. Die **Stream-Mapping**-Tabelle befüllen — eine Zeile pro Kamera:
183
- - **AgentDVR Kamera-Key**: der ioBroker-Datenpunkt-Präfix, z.B. `cam_8_Reolink` (im ioBroker-Objektbaum sichtbar)
184
- - **go2rtc Stream-Name**: der Stream-Name wie in der go2rtc-Oberfläche oder unter `/api/streams`, z.B. `Reolink`
185
- 3. Speichern und Adapter neu starten. Gemappte Kameras zeigen den WebRTC-Stream; nicht gemappte Kameras verwenden weiterhin MJPEG.
186
-
187
- **Funktionsweise:** Das Dashboard verbindet sich per WebSocket mit dem ioBroker-Webadapter, der die WebRTC-Signalisierung intern an go2rtc weiterleitet. Damit werden Browser-Cross-Origin-Beschränkungen umgangen, ohne go2rtc konfigurieren zu müssen.
188
-
189
- ## Snapshot als Base64
190
-
191
- 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.
192
-
193
- **Manuell aktualisieren:** `true` in `<cam>.control.refreshSnapshotB64` schreiben — kein Adapter-Neustart nötig.
194
-
195
- **Automatisch aktualisieren:** „Snapshot als Base64" in den Adapter-Einstellungen aktivieren — dann wird der State bei jedem Poll-Zyklus neu befüllt.
325
+ | `overview` | string | R | HTML-Kachelraster aller Kameras |
196
326
 
197
327
  ## Changelog
198
328
 
@@ -200,40 +330,26 @@ Der State `snapshot_b64` enthält das aktuelle Kamerabild als `data:image/jpeg;b
200
330
  Placeholder for the next version (at the beginning of the line):
201
331
  ### **WORK IN PROGRESS**
202
332
  -->
203
- ### 0.0.6 (2026-07-01)
204
- * (ipod86) docs: Live-Dashboard- und go2rtc-WebRTC-Abschnitte zur README hinzugefügt
205
-
206
- ### 0.0.5 (2026-07-01)
207
- * (ipod86) feat: go2rtc WebRTC-Stream-IntegrationMapping-Tabelle pro Kamera im Admin, ioBroker WebSocket-Proxy umgeht Browser-Cross-Origin-Sperre
208
- * (ipod86) feat: Automatisches Löschen von Kamera-/Mikrofon-Datenpunkten wenn das Gerät in AgentDVR entfernt wird
209
- * (ipod86) feat: Dedizierte `status.*`-Datenpunkte pro Kamera `recording`, `online`, `connected`, `detected`, `alerted` mit korrekten ioBroker-Rollen
210
- * (ipod86) feat: `/api/record`-Endpoint Aufnahme über ioBroker-State aus dem Dashboard starten/stoppen
211
- * (ipod86) feat: Dashboard vollständiges Farbthema (7 Color-Picker), konfigurierbarer Tag-Badge-Bereich
212
- * (ipod86) feat: Dashboard — Aufnahme-/Stop-Button auf Kacheln und im Vollbild-Panel
213
- * (ipod86) feat: Dashboard Echtzeit-Bewegungs- (gelber Rahmen) und Alert-Indikator (oranger Rahmen) via Socket.io
214
- * (ipod86) feat: Dashboard Aufnahme-Timeline in der Aufnahmen-Ansicht: proportionale Blöcke pro Tag, Klick zum Abspielen
215
- * (ipod86) feat: DashboardPTZ- und Aufnahme-Buttons im Vollbild-Panel mit PTZ-Overlay
216
- * (ipod86) feat: Dashboard Einstellung `dashBtnsVisible`: PTZ- und Aufnahme-Button immer oder nur bei Hover anzeigen
217
- * (ipod86) feat: Dashboard MJPEG-Streams stoppen bei Tab-Wechsel, Neustart beim Zurückkehren (Bandbreite sparen)
218
- * (ipod86) feat: Dashboard — Zuletzt gewählte Kamera in der Aufnahmen-Ansicht im localStorage gespeichert
219
- * (ipod86) fix: Dashboard — Vor/Zurück-Navigation bei Aufnahmen folgt nun chronologischer Reihenfolge
220
- * (ipod86) fix: Dashboard — PTZ-Button-Kontrast verbessert, Download-Button im Video-Modal, Schließen-Button oben rechts
221
- * (ipod86) fix: Dashboard — Stream-Neuverbindung nach Tab-Rückkehr löst keine Snapshot-Rückfall mehr aus
222
- * (ipod86) fix: jsonConfig-Header-Einträge fehlendes Pflichtfeld `size` ergänzt (E5512)
223
- * (ipod86) fix: Admin-Config-Beschriftungen bereinigt (Snapshot Base64, Widget-Tooltips, go2rtc-Tooltip)
224
-
225
- ### 0.0.4 (2026-06-27)
226
- * (ipod86) fix: DP-Rollen korrigiert: snapshot_b64 → state (E1008), Profil-Selektor → level (E1011)
227
-
228
- ### 0.0.3 (2026-06-27)
229
- * (ipod86) feat: Profil-Selektor — liest Profile aus getObjects, beschreibbarer Dropdown mit aktivem Profil bei jedem Poll
230
- * (ipod86) feat: snapshot_b64-State (media.picture) immer vorhanden + manueller Refresh-Button; Auto-Poll optional
231
-
232
- ### 0.0.2 (2026-06-27)
233
- * (ipod86) npm Trusted Publishing eingerichtet und Repochecker-Findings behoben
234
-
235
- ### 0.0.1 (2026-06-27)
236
- * (ipod86) Erstveröffentlichung
333
+ ### **WORK IN PROGRESS**
334
+ * (ipod86) feat: Kamera-Filter-Badges im Dashboard mit localStorage-Persistenz
335
+ * (ipod86) feat: FLV/MP4-Stream automatischer Reconnect nach Netzwerkfehler (5 s Verzögerung)
336
+ * (ipod86) feat: go2rtc WebSocket automatischer Reconnect nach unerwartetem Verbindungsabbruch (5 s)
337
+ * (ipod86) feat: go2rtc Stall-ErkennungRetry wenn Stream nach 10 s schwarz bleibt
338
+ * (ipod86) fix: cameraStreams fehlte in io-package.json native-Defaults (Einstellungen wurden nicht gespeichert)
339
+ * (ipod86) fix: adminUI.config „custom" „materialize" (404 auf der Adapter-Einstellungsseite)
340
+ * (ipod86) fix: Auflösungsanzeige beim FLV-Stream-Laden entfernt
341
+ * (ipod86) fix: CDN-Fallback für flv.js entfernt nur lokale Kopie
342
+ * (ipod86) fix: AgentDVR/go2rtc-Sektionsüberschriften aus dem Dashboard-Raster entfernt
343
+ * (ipod86) fix: cfgGo2rtcMapping_tt Tooltip in allen 11 Sprachen korrigiert
344
+ * (ipod86) fix: setTimeout() durch this.setTimeout() ersetzt (E5005)
345
+ * (ipod86) fix: veraltete jsonConfig.json entfernt Einstellungen werden durch React-Admin verwaltet (W5046)
346
+ * (ipod86) chore: admin/-Verzeichnis aus ESLint ausgeschlossen (OOM im CI verhindert)
347
+ * (ipod86) docs: README und README.de vollständig neu geschrieben mit allen Tabs und Einstellungen
348
+
349
+ ### 0.1.0 (2026-07-01)
350
+ * (ipod86) feat: vollständige i18n im Live-Dashboard — alle UI-Texte in 11 Sprachen übersetzt
351
+ * (ipod86) fix: fehlende sm/md/lg/xl-Größenattribute in go2rtcMapping-Tabelle ergänzt (E5507)
352
+ * (ipod86) fix: fehlende Admin-i18n-Keys in 9 Sprachen übersetzt (E5606)
237
353
 
238
354
  [Ältere Changelog-Einträge in CHANGELOG_OLD.md](CHANGELOG_OLD.md)
239
355
 
@@ -242,8 +358,6 @@ MIT License
242
358
 
243
359
  Copyright (c) 2026 ipod86 <david@graef.email>
244
360
 
245
- 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:
246
-
247
- Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in allen Kopien oder Teilkopien der Software beizulegen.
361
+ 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 ändern, zusammenzuführen, zu veröffentlichen, zu verteilen, zu unterlizenzieren und/oder zu verkaufen, und Personen, denen diese Software überlassen wird, diese Rechte zu verschaffen, unter den folgenden Bedingungen: Der obige Urheberrechtsvermerk und dieser Erlaubnishinweis sind in allen Kopien oder Teilkopien der Software beizulegen.
248
362
 
249
- 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.
363
+ 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.