iobroker.agent-dvr 0.4.0 → 0.4.2

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.
@@ -1,142 +1,145 @@
1
1
  {
2
2
  "agent-dvr adapter settings": "Agent DVR 适配器设置",
3
- "tabConnection": "连接",
4
- "tabFeatures": "功能",
5
- "tabWidget": "小部件",
6
- "tabAdvanced": "高级",
7
- "cfgIp": "AgentDVR IP 地址",
8
- "cfgPort": "端口",
9
- "cfgUser": "用户名(可选)",
10
- "cfgPass": "密码(可选)",
11
- "cfgPollSeconds": "轮询间隔(秒)",
12
- "cfgHttpTimeoutMs": "HTTP 超时(毫秒)",
13
- "cfgEnableSystemControls": "系统控制按钮",
14
- "cfgEnablePtz": "PTZ 控制按钮",
15
- "cfgEnableUrls": "生成流 URL",
3
+ "cfgCameraColumn": "AgentDVR 摄像头",
4
+ "cfgDashBtnsVisible": "按钮始终可见",
5
+ "cfgDashBtnsVisible_tt": "始终显示录制和PTZ按钮(否则仅在悬停时显示)",
6
+ "cfgDashColorAccent": "强调色",
7
+ "cfgDashColorAccent_tt": "主强调色(按钮、活动元素、边框)",
8
+ "cfgDashColorBg": "背景",
9
+ "cfgDashColorBg_tt": "仪表板主背景色",
10
+ "cfgDashColorBorder": "边框颜色",
11
+ "cfgDashColorBorder_tt": "分隔线和边框的颜色",
12
+ "cfgDashColorOffline": "离线颜色",
13
+ "cfgDashColorOffline_tt": "离线状态指示器的颜色",
14
+ "cfgDashColorOnline": "在线颜色",
15
+ "cfgDashColorOnline_tt": "在线状态指示器的颜色",
16
+ "cfgDashColorSurface": "表面 / 卡片",
17
+ "cfgDashColorSurface_tt": "磁贴和卡片的背景色",
18
+ "cfgDashColorText": "文字颜色",
19
+ "cfgDashColorText_tt": "主文字颜色",
20
+ "cfgDashDefaultView": "打开时的默认视图",
21
+ "cfgDashDefaultView_tt": "打开仪表板时哪个选项卡处于活动状态",
22
+ "cfgDashGridCols": "列数(0 = 自动)",
23
+ "cfgDashGridCols_tt": "强制设置固定的摄像头列数。0 = 自动计算最优数量。",
24
+ "cfgDashRefreshSec": "每隔(秒)重新加载摄像头列表",
25
+ "cfgDashRefreshSec_tt": "从服务器重新加载摄像头列表的频率(0 = 不自动重新加载)",
26
+ "cfgDashShowOffline": "显示离线摄像头",
27
+ "cfgDashShowOffline_tt": "在实时网格中显示当前离线的摄像头",
28
+ "cfgDashStreamReconnect": "自动重新连接流",
29
+ "cfgDashStreamReconnect_tt": "连接断开后自动重启 MJPEG 流",
30
+ "cfgDashTagPosition": "标签徽章位置",
31
+ "cfgDashTagPosition_tt": "录像磁贴上标签徽章显示的角落",
32
+ "cfgDashViewLive": "实时视图",
33
+ "cfgDashViewRec": "录像",
16
34
  "cfgEnableEventDps": "事件数据点",
17
- "cfgEnablePush": "实时推送触发器",
35
+ "cfgEnableEventDps_tt": "镜像最近一次录像的元数据(文件名、日期、时长、标签)",
18
36
  "cfgEnableOverview": "总览小部件(所有摄像头)",
19
- "cfgStoreRawJson": "存储原始 API JSON",
20
- "cfgEnableWidget": "每个摄像头的图库小部件",
21
- "cfgWidgetMode": "小部件模式",
22
- "cfgWidgetModeNojs": "纯 HTML/CSS(无 JavaScript,到处兼容)",
23
- "cfgWidgetModeJs": "完整 JS(搜索 + 标签过滤,需要执行脚本)",
24
- "cfgWidgetAnzahl": "图库中最大录像数",
25
- "cfgWidgetMinCol": "最小列宽(像素)",
26
- "cfgWidgetShowTags": "显示事件标签",
27
- "cfgWidgetLiveAspect": "实时磁贴宽高比(例如 16/9,留空为自动)",
28
- "cfgWidgetTagPosition": "标签徽章位置",
29
- "cfgTagPosTopLeft": "左上",
30
- "cfgTagPosTopRight": "右上",
31
- "cfgTagPosBotLeft": "左下",
32
- "cfgTagPosBotRight": "右下",
33
- "cfgWidgetMaxModalWidth": "播放器最大宽度(像素)",
34
- "cfgWidgetPlayerUrl": "外部播放器 URL(留空使用内置播放器)",
35
- "cfgMaxDepth": "对象展平最大深度",
36
- "cfgMaxArray": "要展开的最大数组长度",
37
- "cfgEventTagsDynamic": "从录像中自动检测事件标签",
38
- "cfgEventTagsIgnore": "要忽略的事件标签(逗号分隔)",
39
- "cfgEventTags": "始终创建的固定事件标签(逗号分隔)",
37
+ "cfgEnableOverview_tt": "所有摄像头的 HTML 瓦片网格状态(用于可视化、仪表盘等)",
38
+ "cfgEnablePtz": "PTZ 控制按钮",
39
+ "cfgEnablePtz_tt": "每个摄像头的 PTZ 保持开关(左/右/上/下/变焦)",
40
+ "cfgEnablePush": "实时推送触发器",
41
+ "cfgEnablePush_tt": " AgentDVR 报告新录像时,push 触发状态立即更新",
40
42
  "cfgEnableSnapshotB64": "快照为 Base64",
41
- "hdrControls": "控制按钮",
42
- "hdrEvents": "事件与 Push",
43
- "hdrDisplay": "显示",
44
- "hdrDebug": "调试",
45
- "hdrWidgetGeneral": "图库小部件",
46
- "hdrWidgetLayout": "布局",
47
- "hdrWidgetTags": "标签",
48
- "hdrWidgetPlayer": "直播流与播放器",
43
+ "cfgEnableSnapshotB64_tt": "每次轮询时将摄像头图像保存为 Base64(photo.jpg,全分辨率)。刷新按钮始终存在。",
44
+ "cfgEnableStreamProxy": "MJPEG 代理",
45
+ "cfgEnableStreamProxy_tt": "通过 ioBroker 路由 MJPEG 和快照(仅 MJPEG 模式需要 — FLV 和 go2rtc 始终通过代理)",
46
+ "cfgEnableSystemControls": "系统控制按钮",
49
47
  "cfgEnableSystemControls_tt": "布防/撤防/重启按钮、配置文件选择器及所有系统控制命令",
50
- "cfgEnablePtz_tt": "每个摄像头的 PTZ 保持开关(左/右/上/下/变焦)",
48
+ "cfgEnableUrls": "生成流 URL",
51
49
  "cfgEnableUrls_tt": "每个摄像头的快照、MJPEG 和 MP4 流 URL 状态",
52
- "cfgEnableSnapshotB64_tt": "每次轮询时将摄像头图像保存为 Base64(photo.jpg,全分辨率)。刷新按钮始终存在。",
53
- "cfgEnableEventDps_tt": "镜像最近一次录像的元数据(文件名、日期、时长、标签)",
54
- "cfgEnablePush_tt": "当 AgentDVR 报告新录像时,push 触发状态立即更新",
55
- "cfgEnableOverview_tt": "所有摄像头的 HTML 瓦片网格状态(用于可视化、仪表盘等)",
56
- "cfgStoreRawJson_tt": "将完整的 getObjects 响应写入 system.raw_getObjects(用于调试)",
50
+ "cfgEnableWidget": "每个摄像头的图库小部件",
57
51
  "cfgEnableWidget_tt": "每个摄像头的 HTML 录像库(用于可视化、仪表盘等)",
58
- "cfgWidgetMode_tt": "纯 HTML/CSS,到处兼容。完整 JS 含搜索框和标签过滤器(需要执行脚本)。",
52
+ "cfgEventTags": "始终创建的固定事件标签(逗号分隔)",
53
+ "cfgEventTagsDynamic": "从录像中自动检测事件标签",
54
+ "cfgEventTagsIgnore": "要忽略的事件标签(逗号分隔)",
55
+ "cfgGo2rtcEnabled": "启用 go2rtc WebRTC 流",
56
+ "cfgGo2rtcEnabled_tt": "集成 go2rtc 服务器。保存后可为每个摄像头选择 go2rtc 流。",
57
+ "cfgGo2rtcMapping_tt": "为每个摄像头选择流来源:MJPEG、MP4/FLV(通过AgentDVR)或go2rtc流。",
58
+ "cfgGo2rtcUrl": "go2rtc URL",
59
+ "cfgGo2rtcUrl_tt": "go2rtc 服务器的基础 URL,例如 http://192.168.1.1:1984",
60
+ "cfgHttpTimeoutMs": "HTTP 超时(毫秒)",
61
+ "cfgIp": "AgentDVR IP 地址",
62
+ "cfgIpMissing": "AgentDVR IP地址为必填项",
63
+ "cfgMaxArray": "要展开的最大数组长度",
64
+ "cfgMaxDepth": "对象展平最大深度",
65
+ "cfgNoCamerasFound": "未找到摄像头 — 适配器是否已配置并至少轮询过一次?",
66
+ "cfgPass": "密码(可选)",
67
+ "cfgPollSeconds": "轮询间隔(秒)",
68
+ "cfgPort": "端口",
69
+ "cfgStoreRawJson": "存储原始 API JSON",
70
+ "cfgStoreRawJson_tt": "将完整的 getObjects 响应写入 system.raw_getObjects(用于调试)",
71
+ "cfgStreamSourceColumn": "流来源",
72
+ "cfgTagPosBotLeft": "左下",
73
+ "cfgTagPosBotRight": "右下",
74
+ "cfgTagPosTopLeft": "左上",
75
+ "cfgTagPosTopRight": "右上",
76
+ "cfgUser": "用户名(可选)",
77
+ "cfgWidgetAnzahl": "图库中最大录像数",
59
78
  "cfgWidgetAnzahl_tt": "每个摄像头在图库中的最大录像数",
60
- "cfgWidgetMinCol_tt": "图库网格的最小列宽(像素)",
61
- "cfgWidgetMaxModalWidth_tt": "模态对话框中视频播放器的最大宽度(像素)",
62
- "cfgWidgetShowTags_tt": "在图库磁贴上将事件标签显示为彩色徽章",
63
- "cfgWidgetTagPosition_tt": "图像上标签徽章显示的角落",
64
- "cfgWidgetLiveAspect_tt": "直播流磁贴的宽高比,例如 16/9。留空则自动。",
65
- "cfgWidgetPlayerUrl_tt": "外部视频播放器的 URL。留空使用内置播放器。",
66
- "hdrWidgetFilter": "过滤与排序",
67
- "cfgWidgetSortNewest": "最新在前",
68
- "cfgWidgetSortNewest_tt": "按日期排序录像,最新在前",
69
- "cfgWidgetShowSearch": "显示搜索框(仅 JS 模式)",
70
- "cfgWidgetShowSearch_tt": "在 JS 模式下显示按日期、标签和文件名的文本搜索",
79
+ "cfgWidgetBorderRadius": "边框半径(px)",
80
+ "cfgWidgetBorderRadius_tt": "缩略图磁贴的圆角半径(像素,0 = 方形)",
81
+ "cfgWidgetColorAccent": "强调色",
82
+ "cfgWidgetColorAccent_tt": "小部件中链接和按钮的强调色",
83
+ "cfgWidgetColorCardBg": "磁贴背景",
84
+ "cfgWidgetColorCardBg_tt": "缩略图磁贴的背景色 – rgba(r,g,b,a) 或 #hex",
85
+ "cfgWidgetColorModalBg": "模态背景",
86
+ "cfgWidgetColorModalBg_tt": "视频播放器对话框的背景色",
87
+ "cfgWidgetColorTagBg": "标签徽章背景",
88
+ "cfgWidgetColorTagBg_tt": "标签徽章的背景色",
89
+ "cfgWidgetColorTagText": "标签徽章文字颜色",
90
+ "cfgWidgetColorTagText_tt": "标签徽章的文字颜色",
71
91
  "cfgWidgetCompact": "紧凑布局",
72
92
  "cfgWidgetCompact_tt": "更小的间距和字体 – 一眼看到更多条目(两种模式均可使用)",
73
93
  "cfgWidgetDefaultTag": "默认标签过滤器(空 = 全部)",
74
94
  "cfgWidgetDefaultTag_tt": "首次加载时预选此标签(仅 JS 模式)",
95
+ "cfgWidgetLiveAspect": "实时磁贴宽高比(例如 16/9,留空为自动)",
96
+ "cfgWidgetLiveAspect_tt": "直播流磁贴的宽高比,例如 16/9。留空则自动。",
97
+ "cfgWidgetMaxModalWidth": "播放器最大宽度(像素)",
98
+ "cfgWidgetMaxModalWidth_tt": "模态对话框中视频播放器的最大宽度(像素)",
99
+ "cfgWidgetMinCol": "最小列宽(像素)",
100
+ "cfgWidgetMinCol_tt": "图库网格的最小列宽(像素)",
101
+ "cfgWidgetMode": "小部件模式",
102
+ "cfgWidgetModeJs": "完整 JS(搜索 + 标签过滤,需要执行脚本)",
103
+ "cfgWidgetModeNojs": "纯 HTML/CSS(无 JavaScript,到处兼容)",
104
+ "cfgWidgetMode_tt": "纯 HTML/CSS,到处兼容。完整 JS 含搜索框和标签过滤器(需要执行脚本)。",
105
+ "cfgWidgetPlayerUrl": "外部播放器 URL(留空使用内置播放器)",
106
+ "cfgWidgetPlayerUrl_tt": "外部视频播放器的 URL。留空使用内置播放器。",
107
+ "cfgWidgetShowSearch": "显示搜索框(仅 JS 模式)",
108
+ "cfgWidgetShowSearch_tt": "在 JS 模式下显示按日期、标签和文件名的文本搜索",
109
+ "cfgWidgetShowTags": "显示事件标签",
110
+ "cfgWidgetShowTags_tt": "在图库磁贴上将事件标签显示为彩色徽章",
111
+ "cfgWidgetSortNewest": "最新在前",
112
+ "cfgWidgetSortNewest_tt": "按日期排序录像,最新在前",
113
+ "cfgWidgetTagPosition": "标签徽章位置",
114
+ "cfgWidgetTagPosition_tt": "图像上标签徽章显示的角落",
115
+ "cfgWidgetThumbLarge": "大(240 px)",
116
+ "cfgWidgetThumbMedium": "中(180 px)",
75
117
  "cfgWidgetThumbSize": "缩略图大小",
76
118
  "cfgWidgetThumbSize_tt": "图库中预览图像的宽度(覆盖最小列宽)",
77
119
  "cfgWidgetThumbSmall": "小(120 px)",
78
- "cfgWidgetThumbMedium": "中(180 px)",
79
- "cfgWidgetThumbLarge": "大(240 px)",
80
- "tabDashboard": "实时仪表板",
81
- "hdrDashView": "视图",
82
- "cfgDashDefaultView": "打开时的默认视图",
83
- "cfgDashDefaultView_tt": "打开仪表板时哪个选项卡处于活动状态",
84
- "cfgDashViewLive": "实时视图",
85
- "cfgDashViewRec": "录像",
86
- "cfgDashShowOffline": "显示离线摄像头",
87
- "cfgDashShowOffline_tt": "在实时网格中显示当前离线的摄像头",
120
+ "hdrCameraStreams": "流分配",
121
+ "hdrControls": "控制按钮",
88
122
  "hdrDashGrid": "摄像头网格",
89
- "cfgDashGridCols": "列数(0 = 自动)",
90
- "cfgDashGridCols_tt": "强制设置固定的摄像头列数。0 = 自动计算最优数量。",
91
123
  "hdrDashStream": "流与刷新",
92
- "cfgDashRefreshSec": "每隔(秒)重新加载摄像头列表",
93
- "cfgDashRefreshSec_tt": "从服务器重新加载摄像头列表的频率(0 = 不自动重新加载)",
94
- "cfgDashStreamReconnect": "自动重新连接流",
95
- "cfgDashStreamReconnect_tt": "连接断开后自动重启 MJPEG 流",
96
- "hdrWidgetTheme": "颜色与设计",
97
- "cfgWidgetColorCardBg": "磁贴背景",
98
- "cfgWidgetColorCardBg_tt": "缩略图磁贴的背景色 – rgba(r,g,b,a) 或 #hex",
99
- "cfgWidgetColorTagBg": "标签徽章背景",
100
- "cfgWidgetColorTagBg_tt": "标签徽章的背景色",
101
- "cfgWidgetColorTagText": "标签徽章文字颜色",
102
- "cfgWidgetColorTagText_tt": "标签徽章的文字颜色",
103
- "cfgWidgetColorAccent": "强调色",
104
- "cfgWidgetColorAccent_tt": "小部件中链接和按钮的强调色",
105
- "cfgWidgetColorModalBg": "模态背景",
106
- "cfgWidgetColorModalBg_tt": "视频播放器对话框的背景色",
107
- "cfgWidgetBorderRadius": "边框半径(px)",
108
- "cfgWidgetBorderRadius_tt": "缩略图磁贴的圆角半径(像素,0 = 方形)",
109
124
  "hdrDashTheme": "颜色与设计",
110
- "cfgDashColorBg": "背景",
111
- "cfgDashColorBg_tt": "仪表板主背景色",
112
- "cfgDashColorSurface": "表面 / 卡片",
113
- "cfgDashColorSurface_tt": "磁贴和卡片的背景色",
114
- "cfgDashColorAccent": "强调色",
115
- "cfgDashColorAccent_tt": "主强调色(按钮、活动元素、边框)",
116
- "cfgDashColorText": "文字颜色",
117
- "cfgDashColorText_tt": "主文字颜色",
118
- "cfgDashColorBorder": "边框颜色",
119
- "cfgDashColorBorder_tt": "分隔线和边框的颜色",
120
- "cfgDashColorOnline": "在线颜色",
121
- "cfgDashColorOnline_tt": "在线状态指示器的颜色",
122
- "cfgDashColorOffline": "离线颜色",
123
- "cfgDashColorOffline_tt": "离线状态指示器的颜色",
124
- "cfgDashTagPosition": "标签徽章位置",
125
- "cfgDashTagPosition_tt": "录像磁贴上标签徽章显示的角落",
126
- "cfgDashBtnsVisible": "按钮始终可见",
127
- "cfgDashBtnsVisible_tt": "始终显示录制和PTZ按钮(否则仅在悬停时显示)",
128
- "hdrCameraStreams": "流分配",
125
+ "hdrDashView": "视图",
126
+ "hdrDebug": "调试",
127
+ "hdrDisplay": "显示",
128
+ "hdrEvents": "事件与 Push",
129
129
  "hdrGo2rtc": "go2rtc WebRTC 流",
130
- "cfgGo2rtcUrl": "go2rtc URL",
131
- "cfgGo2rtcUrl_tt": "go2rtc 服务器的基础 URL,例如 http://192.168.1.1:1984",
132
- "cfgGo2rtcMapping_tt": "为每个摄像头选择流来源:MJPEG、MP4/FLV(通过AgentDVR)或go2rtc流。",
133
- "cfgIpMissing": "AgentDVR IP地址为必填项",
134
- "cfgNoCamerasFound": "未找到摄像头 — 适配器是否已配置并至少轮询过一次?",
130
+ "hdrProxy": "代理",
131
+ "hdrWidgetFilter": "过滤与排序",
132
+ "hdrWidgetGeneral": "图库小部件",
133
+ "hdrWidgetLayout": "布局",
134
+ "hdrWidgetPlayer": "直播流与播放器",
135
+ "hdrWidgetTags": "标签",
136
+ "hdrWidgetTheme": "颜色与设计",
135
137
  "loadingCamerasAndStreams": "正在加载摄像头和流…",
136
- "cfgCameraColumn": "AgentDVR 摄像头",
137
- "cfgStreamSourceColumn": "流来源",
138
138
  "reload": "重新加载",
139
- "hdrProxy": "代理",
140
- "cfgEnableStreamProxy": "MJPEG 代理",
141
- "cfgEnableStreamProxy_tt": "通过 ioBroker 路由 MJPEG 和快照(仅 MJPEG 模式需要 — FLV 和 go2rtc 始终通过代理)"
142
- }
139
+ "tabAdvanced": "高级",
140
+ "tabConnection": "连接",
141
+ "tabDashboard": "实时仪表板",
142
+ "tabFeatures": "功能",
143
+ "tabWidget": "小部件",
144
+ "cfgDashStreamMp4": "MP4 / FLV(含音频)"
145
+ }
@@ -18,7 +18,7 @@
18
18
  };
19
19
  document.head.appendChild(script);
20
20
  </script>
21
- <script type="module" crossorigin src="./assets/index-B13Ujb6j.js"></script>
21
+ <script type="module" crossorigin src="./assets/index-_IaWp3oU.js"></script>
22
22
  </head>
23
23
  <body>
24
24
  <noscript>You need to enable JavaScript to run this app.</noscript>
package/build/main.js CHANGED
@@ -326,7 +326,7 @@ class AgentDvr extends utils.Adapter {
326
326
  const rawLang = (_a = sysConfig == null ? void 0 : sysConfig.common) == null ? void 0 : _a.language;
327
327
  this.wt = (0, import_widget_i18n.getWidgetLabels)(rawLang != null ? rawLang : "en");
328
328
  const pollSeconds = Math.max(5, Math.min(3600, this.config.pollSeconds || 30));
329
- this.baseUrl = `http://${this.config.ip}:${this.config.port || 8090}`;
329
+ this.baseUrl = `http://${this.config.serverIp}:${this.config.port || 8090}`;
330
330
  if (this.config.user || this.config.pass) {
331
331
  this.authHeader = `Basic ${Buffer.from(`${this.config.user}:${this.config.pass}`).toString("base64")}`;
332
332
  }
@@ -460,7 +460,7 @@ class AgentDvr extends utils.Adapter {
460
460
  return new Promise((resolve) => {
461
461
  const timeout = Math.max(1e3, Math.min(3e4, this.config.httpTimeoutMs || 8e3));
462
462
  const opts = {
463
- hostname: this.config.ip,
463
+ hostname: this.config.serverIp,
464
464
  port: this.config.port || 8090,
465
465
  path,
466
466
  method: "GET",
@@ -499,7 +499,7 @@ class AgentDvr extends utils.Adapter {
499
499
  return new Promise((resolve) => {
500
500
  const timeout = Math.max(1e3, Math.min(3e4, this.config.httpTimeoutMs || 8e3));
501
501
  const opts = {
502
- hostname: this.config.ip,
502
+ hostname: this.config.serverIp,
503
503
  port: this.config.port || 8090,
504
504
  path,
505
505
  method: "GET",
@@ -550,12 +550,6 @@ class AgentDvr extends utils.Adapter {
550
550
  }
551
551
  }
552
552
  }
553
- guessRole(id, val) {
554
- if (typeof val === "string" && /^https?:\/\//i.test(val)) {
555
- return "string";
556
- }
557
- return "string";
558
- }
559
553
  async writeLeaf(id, val) {
560
554
  const t = typeof val;
561
555
  let common;
@@ -754,11 +748,14 @@ class AgentDvr extends utils.Adapter {
754
748
  continue;
755
749
  }
756
750
  const id = `${sfid}.${dp.key}`;
757
- await this.setObjectNotExistsAsync(id, {
758
- type: "state",
759
- common: { name: dp.name, type: "boolean", role: dp.role, read: true, write: false, def: false },
760
- native: {}
761
- });
751
+ if (!this.ensuredFolders.has(id)) {
752
+ await this.setObjectNotExistsAsync(id, {
753
+ type: "state",
754
+ common: { name: dp.name, type: "boolean", role: dp.role, read: true, write: false, def: false },
755
+ native: {}
756
+ });
757
+ this.ensuredFolders.add(id);
758
+ }
762
759
  await this.setStateAsync(id, { val: !!data[dp.key], ack: true });
763
760
  }
764
761
  }