@camstack/addon-provider-reolink 1.2.171 → 1.2.172
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/dist/addon.js +54 -14
- package/dist/addon.mjs +54 -14
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -11566,7 +11566,16 @@ var AutomationActionSchema = discriminatedUnion("kind", [
|
|
|
11566
11566
|
}),
|
|
11567
11567
|
object({
|
|
11568
11568
|
kind: literal("cap"),
|
|
11569
|
-
|
|
11569
|
+
/**
|
|
11570
|
+
* One device, several same-family devices (locks / climate family / …),
|
|
11571
|
+
* or `{ $var }` for the device that triggered the run. An array is
|
|
11572
|
+
* fan-out at codegen — each id gets the same cap.method call.
|
|
11573
|
+
*/
|
|
11574
|
+
deviceId: union([
|
|
11575
|
+
number().int(),
|
|
11576
|
+
array(number().int()).min(1),
|
|
11577
|
+
object({ $var: string().min(1) })
|
|
11578
|
+
]),
|
|
11570
11579
|
cap: string().min(1),
|
|
11571
11580
|
method: string().min(1),
|
|
11572
11581
|
/** Values may carry `{{vars.x}}` slots, which SUBSTITUTE and do not
|
|
@@ -14821,7 +14830,7 @@ DeviceType.Camera;
|
|
|
14821
14830
|
* This matters here more than anywhere else in the repo, because every provider
|
|
14822
14831
|
* that knows a device's host knows its PASSWORD too: `{ host, port, username,
|
|
14823
14832
|
* password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
|
|
14824
|
-
* and `http://admin:hunter2@192.168.
|
|
14833
|
+
* and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
|
|
14825
14834
|
* camera's own page will ask for its own login. That is correct, and pre-
|
|
14826
14835
|
* filling it is the operator's business, not ours.
|
|
14827
14836
|
*
|
|
@@ -21118,17 +21127,41 @@ var NC_ALARM_TRIGGERED_MAX_SEC = 3600;
|
|
|
21118
21127
|
var NcAlarmDelaySecSchema = number().int().min(0).max(600);
|
|
21119
21128
|
var NcAlarmTriggeredSecSchema = number().int().min(0).max(NC_ALARM_TRIGGERED_MAX_SEC);
|
|
21120
21129
|
var uniqueModes = (entries) => new Set(entries.map((e) => e.mode)).size === entries.length;
|
|
21130
|
+
/**
|
|
21131
|
+
* What the panel does when a bounded triggered window ends.
|
|
21132
|
+
* - `rearmAfter` — return to the armed mode
|
|
21133
|
+
* - `disableAfter` — auto-disarm
|
|
21134
|
+
* - `doNothing` — stay triggered until a human disarms
|
|
21135
|
+
*/
|
|
21136
|
+
var NcAlarmPostTriggeredActionSchema = _enum([
|
|
21137
|
+
"rearmAfter",
|
|
21138
|
+
"disableAfter",
|
|
21139
|
+
"doNothing"
|
|
21140
|
+
]);
|
|
21121
21141
|
var NcAlarmModeDelaysListSchema = array(object({
|
|
21122
21142
|
mode: AlarmArmModeSchema,
|
|
21123
21143
|
exitDelaySec: NcAlarmDelaySecSchema.optional(),
|
|
21124
21144
|
entryDelaySec: NcAlarmDelaySecSchema.optional(),
|
|
21125
|
-
|
|
21145
|
+
/**
|
|
21146
|
+
* Duration of `triggered` before {@link postTriggeredAction}. Kept as the
|
|
21147
|
+
* historical field name so older clients still read/write a number.
|
|
21148
|
+
*/
|
|
21149
|
+
triggeredDurationSec: NcAlarmTriggeredSecSchema.optional(),
|
|
21150
|
+
postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
|
|
21151
|
+
/**
|
|
21152
|
+
* When this mode may be armed. Absent / null = always allowed (same as a
|
|
21153
|
+
* rule with no `schedule`). Evaluated with {@link isScheduleActive}.
|
|
21154
|
+
*/
|
|
21155
|
+
schedule: NcScheduleSchema.optional()
|
|
21126
21156
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
|
|
21127
21157
|
var NcAlarmModeDelaysEditListSchema = array(object({
|
|
21128
21158
|
mode: AlarmArmModeSchema,
|
|
21129
21159
|
exitDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
|
|
21130
21160
|
entryDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
|
|
21131
|
-
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional()
|
|
21161
|
+
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
|
|
21162
|
+
postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
|
|
21163
|
+
/** Set a schedule, or `null` to clear (mode always allowed again). */
|
|
21164
|
+
schedule: NcScheduleSchema.nullable().optional()
|
|
21132
21165
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
|
|
21133
21166
|
/** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
|
|
21134
21167
|
var NcAlarmNonBlockingEditSchema = object({
|
|
@@ -21200,12 +21233,18 @@ var NcAlarmSettingsSchema = object({
|
|
|
21200
21233
|
/** Grace period between a trigger and the alarm firing. 0 = immediate. */
|
|
21201
21234
|
entryDelaySec: NcAlarmDelaySecSchema,
|
|
21202
21235
|
/**
|
|
21203
|
-
* How long `triggered` lasts before
|
|
21204
|
-
*
|
|
21205
|
-
*
|
|
21236
|
+
* How long `triggered` lasts before {@link postTriggeredAction} runs.
|
|
21237
|
+
* Ignored when the action is `doNothing`. Historical name kept so older
|
|
21238
|
+
* clients still round-trip a number.
|
|
21206
21239
|
*/
|
|
21207
21240
|
triggeredDurationSec: NcAlarmTriggeredSecSchema,
|
|
21208
21241
|
/**
|
|
21242
|
+
* What happens when the triggered window ends. Absent on a blob older than
|
|
21243
|
+
* this field → derived from {@link triggeredDurationSec} (`>0` ⇒ rearmAfter,
|
|
21244
|
+
* else doNothing).
|
|
21245
|
+
*/
|
|
21246
|
+
postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
|
|
21247
|
+
/**
|
|
21209
21248
|
* Deprecated by D630 — every transition is announced. Parsed, never read;
|
|
21210
21249
|
* remove after one release. Optional so an older admin's patch (which still
|
|
21211
21250
|
* sends it) parses rather than failing the whole save.
|
|
@@ -33164,7 +33203,7 @@ var LocalInterfaceSchema = object({
|
|
|
33164
33203
|
name: string(),
|
|
33165
33204
|
family: _enum(["IPv4", "IPv6"]),
|
|
33166
33205
|
address: string(),
|
|
33167
|
-
/** CIDR shorthand (e.g. `192.168.
|
|
33206
|
+
/** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
|
|
33168
33207
|
cidr: string(),
|
|
33169
33208
|
/** OS netmask. Stable across calls so the SDK can hash on it. */
|
|
33170
33209
|
netmask: string(),
|
|
@@ -33678,7 +33717,7 @@ var MeshPeerSchema = object({
|
|
|
33678
33717
|
tags: array(string()).readonly(),
|
|
33679
33718
|
/** True when the peer advertises itself as an exit-node candidate. */
|
|
33680
33719
|
exitNodeOption: boolean(),
|
|
33681
|
-
/** Subnet routes the peer advertises (e.g. `["192.168.
|
|
33720
|
+
/** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
|
|
33682
33721
|
advertisedRoutes: array(string()).readonly(),
|
|
33683
33722
|
/** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
|
|
33684
33723
|
userLogin: string().nullable(),
|
|
@@ -49845,6 +49884,7 @@ Object.freeze({
|
|
|
49845
49884
|
access: "create"
|
|
49846
49885
|
}
|
|
49847
49886
|
});
|
|
49887
|
+
DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
|
|
49848
49888
|
DeviceFeature.BatteryOperated;
|
|
49849
49889
|
/**
|
|
49850
49890
|
* The vocabulary, in the order a picker offers it.
|
|
@@ -172265,7 +172305,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
|
|
|
172265
172305
|
key: "host",
|
|
172266
172306
|
label: "Camera IP",
|
|
172267
172307
|
required: true,
|
|
172268
|
-
placeholder: "192.168.
|
|
172308
|
+
placeholder: "192.168.x.x"
|
|
172269
172309
|
},
|
|
172270
172310
|
{
|
|
172271
172311
|
type: "number",
|
|
@@ -174471,7 +174511,7 @@ var ReolinkHub = class ReolinkHub extends BaseDevice {
|
|
|
174471
174511
|
key: "host",
|
|
174472
174512
|
label: "Hub IP",
|
|
174473
174513
|
required: true,
|
|
174474
|
-
placeholder: "192.168.
|
|
174514
|
+
placeholder: "192.168.x.x"
|
|
174475
174515
|
},
|
|
174476
174516
|
{
|
|
174477
174517
|
type: "number",
|
|
@@ -175305,7 +175345,7 @@ function buildDiscoveryParamsFormSchema() {
|
|
|
175305
175345
|
}, {
|
|
175306
175346
|
id: "scan",
|
|
175307
175347
|
title: "Scan options",
|
|
175308
|
-
description: "Leave the network blank to scan the local subnet. To find cameras on a different subnet, enter its CIDR (e.g. 192.168.
|
|
175348
|
+
description: "Leave the network blank to scan the local subnet. To find cameras on a different subnet, enter its CIDR (e.g. 192.168.x.x/24).",
|
|
175309
175349
|
columns: 1,
|
|
175310
175350
|
fields: [
|
|
175311
175351
|
{
|
|
@@ -175313,7 +175353,7 @@ function buildDiscoveryParamsFormSchema() {
|
|
|
175313
175353
|
key: "networkCidr",
|
|
175314
175354
|
label: "Network (CIDR)",
|
|
175315
175355
|
required: false,
|
|
175316
|
-
placeholder: "192.168.
|
|
175356
|
+
placeholder: "192.168.x.x/24"
|
|
175317
175357
|
},
|
|
175318
175358
|
{
|
|
175319
175359
|
type: "boolean",
|
|
@@ -175397,7 +175437,7 @@ function buildCreationFormSchema() {
|
|
|
175397
175437
|
key: "host",
|
|
175398
175438
|
label: "Host (IP / hostname / UID)",
|
|
175399
175439
|
required: true,
|
|
175400
|
-
placeholder: "192.168.
|
|
175440
|
+
placeholder: "192.168.x.x",
|
|
175401
175441
|
description: "For UDP-only mode you can leave the host blank and supply the camera UID below — the library will discover it on the network.",
|
|
175402
175442
|
inputType: "text"
|
|
175403
175443
|
},
|
package/dist/addon.mjs
CHANGED
|
@@ -11558,7 +11558,16 @@ var AutomationActionSchema = discriminatedUnion("kind", [
|
|
|
11558
11558
|
}),
|
|
11559
11559
|
object({
|
|
11560
11560
|
kind: literal("cap"),
|
|
11561
|
-
|
|
11561
|
+
/**
|
|
11562
|
+
* One device, several same-family devices (locks / climate family / …),
|
|
11563
|
+
* or `{ $var }` for the device that triggered the run. An array is
|
|
11564
|
+
* fan-out at codegen — each id gets the same cap.method call.
|
|
11565
|
+
*/
|
|
11566
|
+
deviceId: union([
|
|
11567
|
+
number().int(),
|
|
11568
|
+
array(number().int()).min(1),
|
|
11569
|
+
object({ $var: string().min(1) })
|
|
11570
|
+
]),
|
|
11562
11571
|
cap: string().min(1),
|
|
11563
11572
|
method: string().min(1),
|
|
11564
11573
|
/** Values may carry `{{vars.x}}` slots, which SUBSTITUTE and do not
|
|
@@ -14813,7 +14822,7 @@ DeviceType.Camera;
|
|
|
14813
14822
|
* This matters here more than anywhere else in the repo, because every provider
|
|
14814
14823
|
* that knows a device's host knows its PASSWORD too: `{ host, port, username,
|
|
14815
14824
|
* password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
|
|
14816
|
-
* and `http://admin:hunter2@192.168.
|
|
14825
|
+
* and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
|
|
14817
14826
|
* camera's own page will ask for its own login. That is correct, and pre-
|
|
14818
14827
|
* filling it is the operator's business, not ours.
|
|
14819
14828
|
*
|
|
@@ -21110,17 +21119,41 @@ var NC_ALARM_TRIGGERED_MAX_SEC = 3600;
|
|
|
21110
21119
|
var NcAlarmDelaySecSchema = number().int().min(0).max(600);
|
|
21111
21120
|
var NcAlarmTriggeredSecSchema = number().int().min(0).max(NC_ALARM_TRIGGERED_MAX_SEC);
|
|
21112
21121
|
var uniqueModes = (entries) => new Set(entries.map((e) => e.mode)).size === entries.length;
|
|
21122
|
+
/**
|
|
21123
|
+
* What the panel does when a bounded triggered window ends.
|
|
21124
|
+
* - `rearmAfter` — return to the armed mode
|
|
21125
|
+
* - `disableAfter` — auto-disarm
|
|
21126
|
+
* - `doNothing` — stay triggered until a human disarms
|
|
21127
|
+
*/
|
|
21128
|
+
var NcAlarmPostTriggeredActionSchema = _enum([
|
|
21129
|
+
"rearmAfter",
|
|
21130
|
+
"disableAfter",
|
|
21131
|
+
"doNothing"
|
|
21132
|
+
]);
|
|
21113
21133
|
var NcAlarmModeDelaysListSchema = array(object({
|
|
21114
21134
|
mode: AlarmArmModeSchema,
|
|
21115
21135
|
exitDelaySec: NcAlarmDelaySecSchema.optional(),
|
|
21116
21136
|
entryDelaySec: NcAlarmDelaySecSchema.optional(),
|
|
21117
|
-
|
|
21137
|
+
/**
|
|
21138
|
+
* Duration of `triggered` before {@link postTriggeredAction}. Kept as the
|
|
21139
|
+
* historical field name so older clients still read/write a number.
|
|
21140
|
+
*/
|
|
21141
|
+
triggeredDurationSec: NcAlarmTriggeredSecSchema.optional(),
|
|
21142
|
+
postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
|
|
21143
|
+
/**
|
|
21144
|
+
* When this mode may be armed. Absent / null = always allowed (same as a
|
|
21145
|
+
* rule with no `schedule`). Evaluated with {@link isScheduleActive}.
|
|
21146
|
+
*/
|
|
21147
|
+
schedule: NcScheduleSchema.optional()
|
|
21118
21148
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
|
|
21119
21149
|
var NcAlarmModeDelaysEditListSchema = array(object({
|
|
21120
21150
|
mode: AlarmArmModeSchema,
|
|
21121
21151
|
exitDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
|
|
21122
21152
|
entryDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
|
|
21123
|
-
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional()
|
|
21153
|
+
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
|
|
21154
|
+
postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
|
|
21155
|
+
/** Set a schedule, or `null` to clear (mode always allowed again). */
|
|
21156
|
+
schedule: NcScheduleSchema.nullable().optional()
|
|
21124
21157
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
|
|
21125
21158
|
/** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
|
|
21126
21159
|
var NcAlarmNonBlockingEditSchema = object({
|
|
@@ -21192,12 +21225,18 @@ var NcAlarmSettingsSchema = object({
|
|
|
21192
21225
|
/** Grace period between a trigger and the alarm firing. 0 = immediate. */
|
|
21193
21226
|
entryDelaySec: NcAlarmDelaySecSchema,
|
|
21194
21227
|
/**
|
|
21195
|
-
* How long `triggered` lasts before
|
|
21196
|
-
*
|
|
21197
|
-
*
|
|
21228
|
+
* How long `triggered` lasts before {@link postTriggeredAction} runs.
|
|
21229
|
+
* Ignored when the action is `doNothing`. Historical name kept so older
|
|
21230
|
+
* clients still round-trip a number.
|
|
21198
21231
|
*/
|
|
21199
21232
|
triggeredDurationSec: NcAlarmTriggeredSecSchema,
|
|
21200
21233
|
/**
|
|
21234
|
+
* What happens when the triggered window ends. Absent on a blob older than
|
|
21235
|
+
* this field → derived from {@link triggeredDurationSec} (`>0` ⇒ rearmAfter,
|
|
21236
|
+
* else doNothing).
|
|
21237
|
+
*/
|
|
21238
|
+
postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
|
|
21239
|
+
/**
|
|
21201
21240
|
* Deprecated by D630 — every transition is announced. Parsed, never read;
|
|
21202
21241
|
* remove after one release. Optional so an older admin's patch (which still
|
|
21203
21242
|
* sends it) parses rather than failing the whole save.
|
|
@@ -33156,7 +33195,7 @@ var LocalInterfaceSchema = object({
|
|
|
33156
33195
|
name: string(),
|
|
33157
33196
|
family: _enum(["IPv4", "IPv6"]),
|
|
33158
33197
|
address: string(),
|
|
33159
|
-
/** CIDR shorthand (e.g. `192.168.
|
|
33198
|
+
/** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
|
|
33160
33199
|
cidr: string(),
|
|
33161
33200
|
/** OS netmask. Stable across calls so the SDK can hash on it. */
|
|
33162
33201
|
netmask: string(),
|
|
@@ -33670,7 +33709,7 @@ var MeshPeerSchema = object({
|
|
|
33670
33709
|
tags: array(string()).readonly(),
|
|
33671
33710
|
/** True when the peer advertises itself as an exit-node candidate. */
|
|
33672
33711
|
exitNodeOption: boolean(),
|
|
33673
|
-
/** Subnet routes the peer advertises (e.g. `["192.168.
|
|
33712
|
+
/** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
|
|
33674
33713
|
advertisedRoutes: array(string()).readonly(),
|
|
33675
33714
|
/** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
|
|
33676
33715
|
userLogin: string().nullable(),
|
|
@@ -49837,6 +49876,7 @@ Object.freeze({
|
|
|
49837
49876
|
access: "create"
|
|
49838
49877
|
}
|
|
49839
49878
|
});
|
|
49879
|
+
DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
|
|
49840
49880
|
DeviceFeature.BatteryOperated;
|
|
49841
49881
|
/**
|
|
49842
49882
|
* The vocabulary, in the order a picker offers it.
|
|
@@ -172257,7 +172297,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
|
|
|
172257
172297
|
key: "host",
|
|
172258
172298
|
label: "Camera IP",
|
|
172259
172299
|
required: true,
|
|
172260
|
-
placeholder: "192.168.
|
|
172300
|
+
placeholder: "192.168.x.x"
|
|
172261
172301
|
},
|
|
172262
172302
|
{
|
|
172263
172303
|
type: "number",
|
|
@@ -174463,7 +174503,7 @@ var ReolinkHub = class ReolinkHub extends BaseDevice {
|
|
|
174463
174503
|
key: "host",
|
|
174464
174504
|
label: "Hub IP",
|
|
174465
174505
|
required: true,
|
|
174466
|
-
placeholder: "192.168.
|
|
174506
|
+
placeholder: "192.168.x.x"
|
|
174467
174507
|
},
|
|
174468
174508
|
{
|
|
174469
174509
|
type: "number",
|
|
@@ -175297,7 +175337,7 @@ function buildDiscoveryParamsFormSchema() {
|
|
|
175297
175337
|
}, {
|
|
175298
175338
|
id: "scan",
|
|
175299
175339
|
title: "Scan options",
|
|
175300
|
-
description: "Leave the network blank to scan the local subnet. To find cameras on a different subnet, enter its CIDR (e.g. 192.168.
|
|
175340
|
+
description: "Leave the network blank to scan the local subnet. To find cameras on a different subnet, enter its CIDR (e.g. 192.168.x.x/24).",
|
|
175301
175341
|
columns: 1,
|
|
175302
175342
|
fields: [
|
|
175303
175343
|
{
|
|
@@ -175305,7 +175345,7 @@ function buildDiscoveryParamsFormSchema() {
|
|
|
175305
175345
|
key: "networkCidr",
|
|
175306
175346
|
label: "Network (CIDR)",
|
|
175307
175347
|
required: false,
|
|
175308
|
-
placeholder: "192.168.
|
|
175348
|
+
placeholder: "192.168.x.x/24"
|
|
175309
175349
|
},
|
|
175310
175350
|
{
|
|
175311
175351
|
type: "boolean",
|
|
@@ -175389,7 +175429,7 @@ function buildCreationFormSchema() {
|
|
|
175389
175429
|
key: "host",
|
|
175390
175430
|
label: "Host (IP / hostname / UID)",
|
|
175391
175431
|
required: true,
|
|
175392
|
-
placeholder: "192.168.
|
|
175432
|
+
placeholder: "192.168.x.x",
|
|
175393
175433
|
description: "For UDP-only mode you can leave the host blank and supply the camera UID below — the library will discover it on the network.",
|
|
175394
175434
|
inputType: "text"
|
|
175395
175435
|
},
|