iobroker.agent-dvr 0.0.6 → 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.md CHANGED
@@ -12,48 +12,217 @@
12
12
 
13
13
  ## agent-dvr adapter for ioBroker
14
14
 
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.
15
+ Connects ioBroker to [AgentDVR](https://www.ispyconnect.com): auto-discovers all cameras, mirrors every device property as data points, provides buttons for all common commands (record, arm, PTZ, …), delivers push-triggered gallery updates on new recordings, generates a responsive HTML gallery widget per camera, and includes a built-in live dashboard with per-camera stream selection (MJPEG, MP4/FLV with audio, or go2rtc WebRTC).
16
16
 
17
17
  ## Features
18
18
 
19
- - Auto-discovery of all AgentDVR cameras and microphones on startup
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
21
  - Per-device control buttons: record, snapshot, detect, arm/disarm alerts, switch on/off, object detection, purge, …
22
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)
23
+ - **Profile selector** — writable dropdown reflecting the current AgentDVR profile (Home / Away / Night / custom)
24
+ - **Snapshot as Base64** — `snapshot_b64` state per camera, writable via button or auto-updated every poll cycle
25
+ - PTZ control with hold-to-move switches
26
26
  - Stream URLs per camera (snapshot, photo, MJPEG, MP4)
27
- - Push trigger state ioBroker scripts can react instantly when AgentDVR reports a new recording
27
+ - Push trigger state for real-time script reactions to new recordings
28
28
  - HTML gallery widget per camera (pure HTML/CSS or full JS mode with search and tag filter)
29
29
  - Overview widget combining all cameras in one HTML state
30
- - Raw API JSON state for advanced use cases
30
+ - **Built-in live dashboard** at `http://<iobroker>:<webport>/agent-dvr/` no additional app needed:
31
+ - Per-camera stream selection: MJPEG, MP4/FLV with audio, or go2rtc WebRTC/MSE
32
+ - Camera filter badges to show/hide individual cameras (state saved in localStorage)
33
+ - Real-time motion and alert indicators (yellow / orange tile border) via Socket.io
34
+ - Fullscreen view with PTZ overlay and record button
35
+ - Recordings tab with grid and timeline view, search, tag filter, and video player
36
+ - Auto-reconnect for all stream types after network interruption or tab switch
37
+ - Fully color-themeable via adapter config
31
38
 
32
39
  ## Configuration
33
40
 
41
+ ### Tab: Connection
42
+
34
43
  | Setting | Description | Default |
35
44
  |---------|-------------|---------|
36
45
  | 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` |
46
+ | Port | AgentDVR HTTP port | `8090` |
47
+ | Username | Optional HTTP basic auth username | — |
48
+ | Password | Optional HTTP basic auth password | |
49
+ | Poll interval (s) | How often to fetch data from AgentDVR (5–3600) | `30` |
50
+ | HTTP timeout (ms) | Timeout per API request (1000–30000) | `8000` |
51
+
52
+ ### Tab: Features
53
+
54
+ **Controls**
55
+
56
+ | Setting | Description | Default |
57
+ |---------|-------------|---------|
41
58
  | System control buttons | Create arm/disarm/restart/… buttons and the profile selector | `true` |
42
- | PTZ control buttons | Create per-camera PTZ hold-switches | `true` |
59
+ | PTZ control buttons | Create per-camera PTZ hold-switches (left, right, up, down, diagonals, zoom, stop, center) | `true` |
43
60
  | Generate stream URLs | Create URL states (snapshot, MJPEG, MP4) per camera | `true` |
44
61
  | 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` |
62
+
63
+ **Events**
64
+
65
+ | Setting | Description | Default |
66
+ |---------|-------------|---------|
67
+ | Event data points | Mirror recording metadata (latest event, count, tags, …) per camera | `true` |
68
+ | Real-time push trigger | Create a push-trigger state that scripts can subscribe to for new recordings | `true` |
69
+
70
+ **Display**
71
+
72
+ | Setting | Description | Default |
73
+ |---------|-------------|---------|
47
74
  | Overview widget | Single HTML state combining all camera live tiles | `true` |
48
- | Gallery widget per camera | HTML recording gallery per camera | `true` |
75
+
76
+ **Debug**
77
+
78
+ | Setting | Description | Default |
79
+ |---------|-------------|---------|
49
80
  | Store raw API JSON | Write the full getObjects response to `system.raw_getObjects` | `false` |
50
- | Enable go2rtc | Use WebRTC streams from go2rtc instead of MJPEG in the dashboard | `false` |
51
- | go2rtc URL | Base URL of your go2rtc server, e.g. `http://192.168.1.10:1984` | — |
52
- | Stream mapping | Per-camera table: AgentDVR camera key → go2rtc stream name | — |
81
+
82
+ ### Tab: Dashboard
83
+
84
+ **Default view**
85
+
86
+ | Setting | Description | Default |
87
+ |---------|-------------|---------|
88
+ | Default view | Which tab opens when the dashboard loads: Live or Recordings | `Live` |
89
+ | Show offline cameras | Display camera tiles even when the camera is offline | `true` |
90
+
91
+ **Camera grid**
92
+
93
+ | Setting | Description | Default |
94
+ |---------|-------------|---------|
95
+ | Columns | Number of grid columns (0 = auto-fit based on tile width) | `0` |
96
+ | Buttons always visible | Show record/PTZ buttons permanently instead of on hover only | `false` |
97
+ | Tag-badge position | Corner where the camera name badge appears on each tile | `bottom-right` |
98
+
99
+ **Stream**
100
+
101
+ | Setting | Description | Default |
102
+ |---------|-------------|---------|
103
+ | Refresh interval (s) | How often the dashboard re-fetches camera data (10–600) | `60` |
104
+ | Auto-reconnect streams | Automatically reconnect MJPEG, MP4/FLV and go2rtc streams after an error or tab switch | `true` |
105
+
106
+ **Color theme** — 7 color pickers to match your UI:
107
+
108
+ | Setting | Description |
109
+ |---------|-------------|
110
+ | Background | Page/grid background color |
111
+ | Surface | Camera tile background |
112
+ | Accent | Highlight / active element color |
113
+ | Text | Primary text color |
114
+ | Border | Tile border color |
115
+ | Online indicator | Color of the online status dot |
116
+ | Offline indicator | Color of the offline status dot |
117
+
118
+ **Stream assignment**
119
+
120
+ Here you assign a stream source to each camera individually. The dropdown shows all cameras discovered from AgentDVR (microphones are excluded).
121
+
122
+ | Option | Description |
123
+ |--------|-------------|
124
+ | MJPEG *(AgentDVR)* | Classic MJPEG stream served by AgentDVR — lowest latency, no audio |
125
+ | MP4 / FLV with audio *(AgentDVR)* | FLV stream proxied through ioBroker using flv.js — includes audio, correct aspect ratio |
126
+ | *stream name* *(go2rtc)* | WebRTC/MSE stream from go2rtc — smooth, low latency, audio support |
127
+
128
+ The go2rtc stream names are fetched automatically from the go2rtc server when the admin UI is open. If the browser cannot reach go2rtc directly (e.g. mixed-content on HTTPS), the adapter fetches them on the server side as a fallback.
129
+
130
+ **go2rtc URL** *(only visible when at least one camera uses a go2rtc stream)*
131
+
132
+ | Setting | Description | Example |
133
+ |---------|-------------|---------|
134
+ | go2rtc URL | Base URL of your go2rtc instance | `http://192.168.1.10:1984` |
135
+
136
+ > **Note:** go2rtc must already have the streams configured. The adapter only reads the stream list and proxies the WebSocket — it does not configure go2rtc.
137
+
138
+ ### Tab: Widget (gallery widget per camera)
139
+
140
+ **General**
141
+
142
+ | Setting | Description | Default |
143
+ |---------|-------------|---------|
144
+ | Enable widget | Generate an HTML gallery widget per camera | `true` |
145
+ | Widget mode | `No JS` — pure HTML/CSS, embed anywhere; `JS` — full interactivity with search and tag filter | `No JS` |
146
+
147
+ **Layout**
148
+
149
+ | Setting | Description | Default |
150
+ |---------|-------------|---------|
151
+ | Max. entries | Maximum number of recordings shown in the widget | `20` |
152
+ | Min. column width (px) | Minimum width of each thumbnail column | `150` |
153
+ | Max. modal width (px) | Maximum width of the video playback modal | `900` |
154
+
155
+ **Tags**
156
+
157
+ | Setting | Description | Default |
158
+ |---------|-------------|---------|
159
+ | Show tags | Display recording tags on each thumbnail | `true` |
160
+ | Tag-badge position | Corner where tags appear on the thumbnail | `bottom-left` |
161
+
162
+ **Filter**
163
+
164
+ | Setting | Description | Default |
165
+ |---------|-------------|---------|
166
+ | Newest first | Sort recordings with the latest at the top | `true` |
167
+ | Show search | Show a text search field in JS mode | `false` |
168
+ | Compact mode | Denser layout with smaller thumbnails | `false` |
169
+ | Default tag | Pre-select this tag filter when the widget loads | — |
170
+ | Thumbnail size | `Small` / `Medium` / `Large` | `Medium` |
171
+
172
+ **Player**
173
+
174
+ | Setting | Description | Default |
175
+ |---------|-------------|---------|
176
+ | Live aspect ratio | Aspect ratio for the live stream preview, e.g. `16/9` | — |
177
+ | Player URL | Custom URL for the video player used in the widget | — |
178
+
179
+ **Color theme** — 5 color pickers + border radius:
180
+
181
+ | Setting | Description |
182
+ |---------|-------------|
183
+ | Card background | Widget card background |
184
+ | Tag background | Tag chip background |
185
+ | Tag text | Tag chip text color |
186
+ | Accent | Highlight color |
187
+ | Modal background | Video modal background |
188
+ | Border radius (px) | Rounded corner radius for cards | `4` |
189
+
190
+ ### Tab: Advanced
191
+
192
+ | Setting | Description | Default |
193
+ |---------|-------------|---------|
194
+ | Max. recursion depth | How many levels deep the API JSON is flattened into data points (1–10) | `6` |
195
+ | Max. array entries | Maximum number of array elements mirrored per property (1–500) | `30` |
196
+ | Dynamic tags | Automatically create a tag data point for every unique recording tag | `false` |
197
+ | Ignore tags (comma-separated) | Recording tags to exclude from event data points | — |
198
+ | Tag filter (comma-separated) | Only create event data points for recordings matching these tags | — |
199
+
200
+ ## Live Dashboard
201
+
202
+ The adapter ships a built-in live dashboard at `http://<iobroker>:<webport>/agent-dvr/`.
203
+
204
+ **Features:**
205
+ - Per-camera stream selection: MJPEG, MP4/FLV with audio (via flv.js), or go2rtc WebRTC/MSE
206
+ - Camera filter badges — click to show/hide individual cameras; state persisted in localStorage
207
+ - Fullscreen view with PTZ overlay and record button
208
+ - Real-time motion (yellow border) and alert (orange border) indicators via Socket.io
209
+ - Auto-reconnect: MJPEG and FLV reconnect after error; go2rtc reconnects after unexpected WebSocket close or 10 s stall
210
+ - Recordings tab with grid and timeline view, search and tag filter, video player with prev/next navigation
211
+ - Color theming via adapter config
212
+
213
+ ### go2rtc WebRTC Streams
214
+
215
+ [go2rtc](https://github.com/AlexxIT/go2rtc) provides smooth, low-latency WebRTC/MSE streams with audio.
216
+
217
+ **Setup:**
218
+ 1. Install and run go2rtc, configure your camera streams in go2rtc's config.
219
+ 2. In the adapter config → *Dashboard* tab, assign the desired go2rtc stream name to each camera from the dropdown.
220
+ 3. Enter the **go2rtc URL** that appears below the table (e.g. `http://192.168.1.10:1984`).
221
+ 4. Save and restart. The adapter proxies WebSocket traffic through ioBroker to avoid browser cross-origin restrictions.
53
222
 
54
223
  ## Data points
55
224
 
56
- 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>`.
225
+ `<cam>` stands for `cam_<oid>_<name>`, e.g. `cam_8_Reolink`.
57
226
 
58
227
  ### System
59
228
 
@@ -84,17 +253,15 @@ The adapter creates the following data point tree. `<cam>` stands for `cam_<oid>
84
253
  | `system.control.unblockExternal` | button | W | Unblock external access |
85
254
  | `system.control.restart` | button | W | Restart AgentDVR |
86
255
  | `system.control.refresh` | button | W | Force immediate poll |
87
- | `system.profile.selector` | number | R/W | Active profile index — dropdown populated from AgentDVR (0 = Home, 1 = Away, …) |
256
+ | `system.profile.selector` | number | R/W | Active profile index — dropdown (0 = Home, 1 = Away, …) |
88
257
  | `system.profile.list` | string | R | Available profiles as JSON array |
89
258
 
90
- ### Per camera / microphone
91
-
92
- The raw device data from AgentDVR is mirrored recursively (depth configurable, default 6). The most important sub-tree is `<cam>.data.*`:
259
+ ### Per camera
93
260
 
94
261
  | Data point | Type | R/W | Description |
95
262
  |-----------|------|-----|-------------|
96
- | `<cam>.name` | string | R | Device name |
97
- | `<cam>.data.online` | boolean | R | Device is online |
263
+ | `<cam>.name` | string | R | Camera name |
264
+ | `<cam>.data.online` | boolean | R | Camera is online |
98
265
  | `<cam>.data.connected` | boolean | R | Stream is connected |
99
266
  | `<cam>.data.recording` | boolean | R | Currently recording |
100
267
  | `<cam>.data.detected` | boolean | R | Motion/object detected |
@@ -114,15 +281,15 @@ The raw device data from AgentDVR is mirrored recursively (depth configurable, d
114
281
  | `<cam>.control.detect` | button | W | Trigger motion detection |
115
282
  | `<cam>.control.alertOn` | button | W | Arm alerts |
116
283
  | `<cam>.control.alertOff` | button | W | Disarm alerts |
117
- | `<cam>.control.switchOn` | button | W | Switch device on |
118
- | `<cam>.control.switchOff` | button | W | Switch device off |
284
+ | `<cam>.control.switchOn` | button | W | Switch camera on |
285
+ | `<cam>.control.switchOff` | button | W | Switch camera off |
119
286
  | `<cam>.control.objectDetectOn` | button | W | Enable object detection |
120
287
  | `<cam>.control.objectDetectOff` | button | W | Disable object detection |
121
288
  | `<cam>.control.recOnAlert` | button | W | Enable "record on alert" |
122
289
  | `<cam>.control.recOnDetect` | button | W | Enable "record on detect" |
123
- | `<cam>.control.purge` | button | W | Delete all recordings in the device folder |
290
+ | `<cam>.control.purge` | button | W | Delete all recordings for this camera |
124
291
 
125
- ### PTZ *(cameras only, requires "PTZ control buttons")*
292
+ ### PTZ *(requires "PTZ control buttons")*
126
293
 
127
294
  | Data point | Type | R/W | Description |
128
295
  |-----------|------|-----|-------------|
@@ -139,62 +306,28 @@ The raw device data from AgentDVR is mirrored recursively (depth configurable, d
139
306
  | `<cam>.control.ptz.stop` | button | W | Stop PTZ movement |
140
307
  | `<cam>.control.ptz.center` | button | W | Move to center/home position |
141
308
 
142
- ### Stream URLs *(cameras only, requires "Generate stream URLs")*
309
+ ### Stream URLs *(requires "Generate stream URLs")*
143
310
 
144
311
  | Data point | Type | R/W | Description |
145
312
  |-----------|------|-----|-------------|
146
- | `<cam>.urls.snapshot` | string | R | URL to current JPEG snapshot (`/grab.jpg`) |
147
- | `<cam>.urls.photo` | string | R | URL to photo endpoint (`/photo.jpg`) |
148
- | `<cam>.urls.mjpeg` | string | R | URL to MJPEG live stream (`/video.mjpg`) |
149
- | `<cam>.urls.mp4` | string | R | URL to MP4 live stream (`/video.mp4`) |
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 |
150
317
 
151
318
  ### Events / Gallery *(cameras only)*
152
319
 
153
320
  | Data point | Type | R/W | Description |
154
321
  |-----------|------|-----|-------------|
155
- | `<cam>.events.*` | various | R | Latest recording metadata (filename, date, duration, tags, …) — requires "Event data points" |
156
- | `<cam>.push` | string | R | Push trigger — updated immediately when AgentDVR reports a new recording — requires "Real-time push trigger" |
157
- | `<cam>.gallery` | string | R | HTML gallery of recent recordings — requires "Gallery widget" |
322
+ | `<cam>.events.*` | various | R | Latest recording metadata — requires "Event data points" |
323
+ | `<cam>.push` | string | R | Push trigger — updated when AgentDVR reports a new recording — requires "Real-time push trigger" |
324
+ | `<cam>.gallery` | string | R | HTML recording gallery — requires "Gallery widget" |
158
325
 
159
326
  ### Overview *(requires "Overview widget")*
160
327
 
161
328
  | Data point | Type | R/W | Description |
162
329
  |-----------|------|-----|-------------|
163
- | `overview` | string | R | HTML tile grid of all cameras with live stream links |
164
-
165
- ## Live Dashboard
166
-
167
- The adapter ships a built-in live dashboard at `http://<iobroker>:<webport>/agent-dvr/`.
168
-
169
- **Features:**
170
- - Live MJPEG or WebRTC stream per camera tile (configurable)
171
- - Fullscreen view with PTZ overlay and record button
172
- - Real-time motion (yellow border) and alert (orange border) indicators
173
- - Recordings tab with grid and timeline view, search and tag filter, video player with prev/next navigation
174
- - Color theming via adapter config (7 color pickers)
175
-
176
- ## go2rtc WebRTC Streams
177
-
178
- The dashboard can use [go2rtc](https://github.com/AlexxIT/go2rtc) to display smooth WebRTC streams instead of the MJPEG fallback.
179
-
180
- **Requirements:** go2rtc must be installed and running, with streams already configured pointing to your cameras.
181
-
182
- **Setup:**
183
- 1. In the adapter config → *Live Dashboard* tab, enable **go2rtc** and enter the **go2rtc URL** (e.g. `http://192.168.1.10:1984`).
184
- 2. Fill in the **Stream mapping** table — one row per camera:
185
- - **AgentDVR camera key**: the ioBroker data point prefix, e.g. `cam_8_Reolink` (visible in the ioBroker object tree)
186
- - **go2rtc stream name**: the stream name as shown in go2rtc's web UI or `/api/streams` endpoint, e.g. `Reolink`
187
- 3. Save and restart the adapter. Mapped cameras show the WebRTC stream; unmapped cameras continue using MJPEG.
188
-
189
- **How it works:** The dashboard connects via WebSocket to the ioBroker web adapter, which proxies the WebRTC signaling to go2rtc internally. This avoids browser cross-origin restrictions without any go2rtc configuration changes.
190
-
191
- ## Snapshot as Base64
192
-
193
- 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.
194
-
195
- **Manual refresh:** Write `true` to `<cam>.control.refreshSnapshotB64` to fetch a new frame on demand — no adapter restart required.
196
-
197
- **Auto-refresh:** Enable *"Snapshot as Base64"* in the adapter configuration to refresh automatically on every poll cycle.
330
+ | `overview` | string | R | HTML tile grid of all cameras |
198
331
 
199
332
  ## Changelog
200
333
 
@@ -202,42 +335,44 @@ The `snapshot_b64` state stores the current camera frame as a `data:image/jpeg;b
202
335
  Placeholder for the next version (at the beginning of the line):
203
336
  ### **WORK IN PROGRESS**
204
337
  -->
338
+ ### 0.2.0 (2026-07-04)
339
+ * (ipod86) feat: dashboard camera filter badges with localStorage persistence
340
+ * (ipod86) feat: FLV/MP4 stream auto-reconnect after network error (5 s delay)
341
+ * (ipod86) feat: go2rtc WebSocket auto-reconnect after unexpected disconnect (5 s delay)
342
+ * (ipod86) feat: go2rtc stall detection — retry if stream stays black after 10 s
343
+ * (ipod86) fix: cameraStreams missing from io-package.json native defaults (settings not saved)
344
+ * (ipod86) fix: adminUI.config "custom" → "materialize" (404 on adapter settings page)
345
+ * (ipod86) fix: remove resolution overlay on FLV stream load
346
+ * (ipod86) fix: remove CDN fallback for flv.js — local copy only
347
+ * (ipod86) fix: remove AgentDVR/go2rtc section headers from dashboard grid
348
+ * (ipod86) fix: cfgGo2rtcMapping_tt tooltip corrected in all 11 languages
349
+ * (ipod86) fix: plain setTimeout() replaced by this.setTimeout() (E5005)
350
+ * (ipod86) fix: remove obsolete jsonConfig.json — settings handled by React admin (W5046)
351
+ * (ipod86) chore: exclude admin/ directory from ESLint to prevent OOM in CI
352
+ * (ipod86) docs: rewrite README and README.de with all tabs and settings documented
353
+
354
+ ### 0.1.0 (2026-07-01)
355
+ * (ipod86) feat: add full i18n to live dashboard — all UI strings translated into 11 languages
356
+ * (ipod86) fix: add missing sm/md/lg/xl size attributes to go2rtcMapping table in jsonConfig.json (E5507)
357
+ * (ipod86) fix: translate missing admin i18n keys into 9 languages (E5606)
358
+
205
359
  ### 0.0.6 (2026-07-01)
206
360
  * (ipod86) docs: add Live Dashboard and go2rtc WebRTC sections to README
207
361
 
208
362
  ### 0.0.5 (2026-07-01)
209
363
  * (ipod86) feat: go2rtc WebRTC stream integration — per-camera mapping table in admin, ioBroker WebSocket proxy to bypass browser cross-origin restrictions
210
364
  * (ipod86) feat: auto-delete camera/microphone data points when device is removed from AgentDVR
211
- * (ipod86) feat: dedicated `status.*` data points per camera — `recording`, `online`, `connected`, `detected`, `alerted` with correct ioBroker roles
212
- * (ipod86) feat: `/api/record` endpoint start/stop recording via ioBroker state from the dashboard
213
- * (ipod86) feat: dashboard — full color theming (7 color pickers), configurable tag-badge corner position
365
+ * (ipod86) feat: dedicated `status.*` data points per camera
366
+ * (ipod86) feat: dashboardfull color theming, configurable tag-badge corner position
214
367
  * (ipod86) feat: dashboard — record/stop button on camera tiles and in fullscreen panel
215
- * (ipod86) feat: dashboard — real-time motion (yellow border) and alert (orange border) indicators via Socket.io subscription
216
- * (ipod86) feat: dashboard — recording timeline view in recordings tab: proportional blocks per day, click to play
217
- * (ipod86) feat: dashboard — PTZ and record buttons visible in fullscreen panel with PTZ overlay
218
- * (ipod86) feat: dashboard — `dashBtnsVisible` setting: always show or hover-only for both PTZ and record buttons
219
- * (ipod86) feat: dashboard — MJPEG streams stop on tab hide, restart on return (saves bandwidth)
220
- * (ipod86) feat: dashboard — last selected camera in recordings tab persisted to localStorage
221
- * (ipod86) fix: dashboard — recording prev/next navigation now follows chronological order
222
- * (ipod86) fix: dashboard — PTZ button contrast improved, DL button in video modal, X button top-right
223
- * (ipod86) fix: dashboard — stream reconnect after tab return no longer triggers snapshot fallback
224
- * (ipod86) fix: jsonConfig header items missing required `size` property (E5512)
225
- * (ipod86) fix: admin config label improvements (snapshot Base64, widget tooltips, go2rtc tooltip)
368
+ * (ipod86) feat: dashboard — real-time motion and alert indicators via Socket.io
369
+ * (ipod86) feat: dashboard — recording timeline view
370
+ * (ipod86) feat: dashboard — PTZ and record buttons in fullscreen panel
226
371
 
227
372
  ### 0.0.4 (2026-06-27)
228
373
  * (ipod86) fix: snapshot_b64 role corrected to `state` (E1008)
229
374
  * (ipod86) fix: profile selector role corrected to `level` (E1011)
230
375
 
231
- ### 0.0.3 (2026-06-27)
232
- * (ipod86) feat: profile selector — reads profiles from getObjects, writable dropdown with active profile reflected on every poll
233
- * (ipod86) feat: snapshot_b64 state (media.picture) always present per camera + manual refresh button; auto-poll optional
234
-
235
- ### 0.0.2 (2026-06-27)
236
- * (ipod86) setup npm trusted publishing and fix repochecker findings
237
-
238
- ### 0.0.1 (2026-06-27)
239
- * (ipod86) initial release
240
-
241
376
  [Older changelog entries in CHANGELOG_OLD.md](CHANGELOG_OLD.md)
242
377
 
243
378
  ## License