@camstack/addon-provider-reolink 1.2.202 → 1.2.204

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 CHANGED
@@ -36,7 +36,7 @@ let node_os = require("node:os");
36
36
  node_os = require_chunk.__toESM(node_os, 1);
37
37
  let node_fs = require("node:fs");
38
38
  node_fs = require_chunk.__toESM(node_fs, 1);
39
- //#region ../types/dist/event-category-7pZEBmVg.mjs
39
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
40
40
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
41
41
  EventCategory["SystemBoot"] = "system.boot";
42
42
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -353,6 +353,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
353
353
  */
354
354
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
355
355
  /**
356
+ * A camera's motion source has fired constantly with no subject for an hour
357
+ * (motion duty or session count over the bar, zero detections) — it is not
358
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
359
+ * {@link PipelineMotionCalm}.
360
+ */
361
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
362
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
363
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
364
+ /**
356
365
  * Per-camera pipeline config was mutated by the orchestrator
357
366
  * (3-level settings change via `setAgentAddonDefaults` /
358
367
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -5459,7 +5468,7 @@ var ZodIssueCode = {
5459
5468
  var ZodFirstPartyTypeKind;
5460
5469
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5461
5470
  //#endregion
5462
- //#region ../types/dist/sleep-CueztlR1.mjs
5471
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5463
5472
  /**
5464
5473
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5465
5474
  * window to float samples (D455).
@@ -7992,7 +8001,7 @@ var EntryDescriptorSchema = object({
7992
8001
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7993
8002
  fields: record(string(), unknown())
7994
8003
  }).strict();
7995
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8004
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7996
8005
  var RecordKindDeclarationSchema = object({
7997
8006
  database: _enum(RECORD_DATABASES).default("settings"),
7998
8007
  class: _enum(RECORD_CLASSES),
@@ -8011,14 +8020,6 @@ var RecordKindDeclarationSchema = object({
8011
8020
  secretPaths: array(string().min(1)).default([]),
8012
8021
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8013
8022
  secretArrayKeys: record(string(), string()).default({}),
8014
- /**
8015
- * RETIRED (D900): the legacy table a kind adopted from during the records
8016
- * migration. Nothing declares it any more and nothing reads it; the schema
8017
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8018
- * (an orphaned kind is never redeclared) and an addon built before the
8019
- * removal still sends it. Never set it.
8020
- */
8021
- adoptsFrom: string().min(1).optional(),
8022
8023
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8023
8024
  transactFamily: string().min(1).optional(),
8024
8025
  entry: EntryDescriptorSchema.optional()
@@ -13310,17 +13311,6 @@ object({
13310
13311
  createdAt: number(),
13311
13312
  updatedAt: number()
13312
13313
  });
13313
- object({
13314
- id: string(),
13315
- label: string(),
13316
- isAdmin: boolean().default(false),
13317
- allowedProviders: AllowedProviderSchema,
13318
- allowedDevices: AllowedDevicesSchema,
13319
- tokenHash: string(),
13320
- tokenPrefix: string(),
13321
- createdAt: number(),
13322
- lastUsedAt: number().optional()
13323
- });
13324
13314
  object({
13325
13315
  id: string(),
13326
13316
  userId: string(),
@@ -17302,16 +17292,36 @@ var RecordKindStateSchema = _enum([
17302
17292
  var DeclareKindResultSchema = object({
17303
17293
  kindId: number().int(),
17304
17294
  state: RecordKindStateSchema,
17305
- createdIndexes: array(string()),
17306
- /**
17307
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17308
- * it stays on the wire, null, because an addon built before the removal reads
17309
- * an ABSENT field as "adoption pending" and refuses to start.
17310
- */
17311
- adoptionPending: _null()
17295
+ createdIndexes: array(string())
17312
17296
  });
17313
17297
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17314
17298
  var SecretRefsList = array(string());
17299
+ /**
17300
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17301
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17302
+ */
17303
+ var RecordTransactOpSchema = discriminatedUnion("op", [
17304
+ object({
17305
+ op: literal("put"),
17306
+ kind: RecordKindNameSchema,
17307
+ record: RecordInputSchema,
17308
+ ifRev: number().int().min(0).optional()
17309
+ }),
17310
+ object({
17311
+ op: literal("patch"),
17312
+ kind: RecordKindNameSchema,
17313
+ id: RecordIdSchema,
17314
+ data: RecordBodySchema,
17315
+ at: number().int().nullable().optional(),
17316
+ expiresAt: number().int().nullable().optional(),
17317
+ ifRev: number().int().min(1).optional()
17318
+ }),
17319
+ object({
17320
+ op: literal("delete"),
17321
+ kind: RecordKindNameSchema,
17322
+ id: RecordIdSchema
17323
+ })
17324
+ ]);
17315
17325
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17316
17326
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17317
17327
  kind: "mutation",
@@ -17418,6 +17428,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17418
17428
  }), {
17419
17429
  kind: "mutation",
17420
17430
  auth: "admin"
17431
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17432
+ results: array(object({
17433
+ rev: number().int().nullable(),
17434
+ deleted: boolean()
17435
+ })),
17436
+ releasedRefs: SecretRefsList,
17437
+ secretRefs: SecretRefsList
17438
+ }), {
17439
+ kind: "mutation",
17440
+ auth: "admin"
17421
17441
  }), method(object({
17422
17442
  deviceId: number().int(),
17423
17443
  kinds: array(RecordKindNameSchema).optional()
@@ -43165,9 +43185,13 @@ var NcSystemEventKindSchema = _enum([
43165
43185
  "node-updating",
43166
43186
  "node-inference-unavailable",
43167
43187
  "detection-blind",
43188
+ "motion-noisy",
43189
+ "motion-calm",
43168
43190
  "recording-stalled",
43169
43191
  "recording-healthy",
43170
43192
  "recording-degraded",
43193
+ "device-attention-required",
43194
+ "device-attention-resolved",
43171
43195
  "storage-location-low",
43172
43196
  "storage-location-critical",
43173
43197
  "storage-location-ok",
@@ -48728,7 +48752,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
48728
48752
  modelId: string()
48729
48753
  }),
48730
48754
  object({ kind: literal("cpu-device") }),
48731
- object({ kind: literal("coral-untouched") }),
48732
48755
  object({ kind: literal("device-disabled") }),
48733
48756
  object({ kind: literal("device-unavailable") }),
48734
48757
  object({ kind: literal("node-offline") }),
@@ -48826,11 +48849,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
48826
48849
  kind: literal("detector-store-unreadable"),
48827
48850
  error: string()
48828
48851
  }),
48829
- object({
48830
- kind: literal("coral-enabled"),
48831
- nodeId: string(),
48832
- deviceKey: string()
48833
- }),
48834
48852
  object({
48835
48853
  kind: literal("custom-pin-kept"),
48836
48854
  nodeId: string(),
@@ -57013,6 +57031,16 @@ var DishwasherStatusSchema = object({
57013
57031
  powerState: string().nullable(),
57014
57032
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
57015
57033
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
57034
+ /**
57035
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
57036
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
57037
+ * when none is reported. A cleared reminder is not an unknown one.
57038
+ */
57039
+ filterCleaningDue: boolean().nullable(),
57040
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
57041
+ machineCareDue: boolean().nullable(),
57042
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
57043
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
57016
57044
  /** Option states: null when the appliance does not expose the option or has not said. */
57017
57045
  halfLoad: boolean().nullable(),
57018
57046
  hygienePlus: boolean().nullable(),
@@ -66233,16 +66261,6 @@ var UpdateUserInputSchema = object({
66233
66261
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
66234
66262
  scopes: array(TokenScopeSchema).optional()
66235
66263
  });
66236
- var ApiKeySummarySchema = object({
66237
- id: string(),
66238
- label: string(),
66239
- isAdmin: boolean().default(false),
66240
- allowedProviders: union([array(string()), literal("*")]).optional(),
66241
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
66242
- tokenPrefix: string(),
66243
- createdAt: number(),
66244
- lastUsedAt: number().optional()
66245
- });
66246
66264
  var OauthSessionSummarySchema = object({
66247
66265
  id: string(),
66248
66266
  userId: string(),
@@ -66264,8 +66282,7 @@ var TotpStatusSchema = object({
66264
66282
  confirmedAt: number().nullable()
66265
66283
  });
66266
66284
  /**
66267
- * user-management — singleton capability for user accounts and the
66268
- * legacy API-key rows.
66285
+ * user-management — singleton capability for user accounts.
66269
66286
  *
66270
66287
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
66271
66288
  * — the subset check on `setUserScopes` is moot
@@ -66321,10 +66338,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
66321
66338
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
66322
66339
  kind: "mutation",
66323
66340
  access: "view"
66324
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
66325
- kind: "mutation",
66326
- auth: "admin",
66327
- access: "delete"
66328
66341
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
66329
66342
  kind: "mutation",
66330
66343
  auth: "admin",
@@ -75795,6 +75808,12 @@ Object.freeze({
75795
75808
  addonId: null,
75796
75809
  access: "view"
75797
75810
  },
75811
+ "records.transact": {
75812
+ capName: "records",
75813
+ capScope: "system",
75814
+ addonId: null,
75815
+ access: "create"
75816
+ },
75798
75817
  "sceneMonitor.captureReference": {
75799
75818
  capName: "scene-monitor",
75800
75819
  capScope: "device",
@@ -77127,12 +77146,6 @@ Object.freeze({
77127
77146
  addonId: null,
77128
77147
  access: "view"
77129
77148
  },
77130
- "userManagement.listApiKeys": {
77131
- capName: "user-management",
77132
- capScope: "system",
77133
- addonId: null,
77134
- access: "view"
77135
- },
77136
77149
  "userManagement.listExternalIdentities": {
77137
77150
  capName: "user-management",
77138
77151
  capScope: "system",
@@ -77187,12 +77200,6 @@ Object.freeze({
77187
77200
  addonId: null,
77188
77201
  access: "create"
77189
77202
  },
77190
- "userManagement.revokeApiKey": {
77191
- capName: "user-management",
77192
- capScope: "system",
77193
- addonId: null,
77194
- access: "delete"
77195
- },
77196
77203
  "userManagement.revokeOauthSession": {
77197
77204
  capName: "user-management",
77198
77205
  capScope: "system",
@@ -80709,9 +80716,13 @@ new Map(Object.entries({
80709
80716
  "stream-online": "device-events",
80710
80717
  "stream-offline": "device-events",
80711
80718
  "detection-blind": "device-events",
80719
+ "motion-noisy": "device-events",
80720
+ "motion-calm": "device-events",
80712
80721
  "recording-stalled": "device-events",
80713
80722
  "recording-healthy": "device-events",
80714
80723
  "recording-degraded": "device-events",
80724
+ "device-attention-required": "device-events",
80725
+ "device-attention-resolved": "device-events",
80715
80726
  "node-online": "system",
80716
80727
  "node-offline": "system",
80717
80728
  "node-restarting": "system",
@@ -80794,6 +80805,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80794
80805
  label: "Detecting nothing",
80795
80806
  kinds: ["detection-blind"]
80796
80807
  },
80808
+ {
80809
+ id: "motion-noise",
80810
+ family: "device-events",
80811
+ label: "Motion without a subject",
80812
+ kinds: ["motion-noisy", "motion-calm"]
80813
+ },
80797
80814
  {
80798
80815
  id: "recording",
80799
80816
  family: "device-events",
@@ -80804,6 +80821,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80804
80821
  "recording-degraded"
80805
80822
  ]
80806
80823
  },
80824
+ {
80825
+ id: "device-attention",
80826
+ family: "device-events",
80827
+ label: "Needs attention",
80828
+ kinds: ["device-attention-required", "device-attention-resolved"]
80829
+ },
80807
80830
  {
80808
80831
  id: "nodes",
80809
80832
  family: "system",
@@ -80943,6 +80966,7 @@ var ALERT_EPISODE = [
80943
80966
  "alert-error",
80944
80967
  "alert-critical-resolved"
80945
80968
  ];
80969
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
80946
80970
  var UPDATES = [
80947
80971
  "addon-update-available",
80948
80972
  "server-update-available",
@@ -80972,9 +80996,12 @@ var DEVICE_EVENTS = [
80972
80996
  "stream-online",
80973
80997
  "stream-offline",
80974
80998
  "detection-blind",
80999
+ "motion-noisy",
81000
+ "motion-calm",
80975
81001
  "recording-stalled",
80976
81002
  "recording-healthy",
80977
81003
  "recording-degraded",
81004
+ ...DEVICE_ATTENTION,
80978
81005
  ...ALARM
80979
81006
  ];
80980
81007
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -81142,7 +81169,9 @@ var STATE_SUMMARY_VARS = [
81142
81169
  [...RULE_TEXT],
81143
81170
  [...RULE_TEXT],
81144
81171
  [...RULE_TEXT],
81145
- ([...RULE_TEXT], [...ALERT_EPISODE]),
81172
+ [...RULE_TEXT],
81173
+ [...RULE_TEXT],
81174
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
81146
81175
  [...RULE_TEXT],
81147
81176
  [...RULE_TEXT],
81148
81177
  [...RULE_TEXT],
@@ -81164,11 +81193,11 @@ var STATE_SUMMARY_VARS = [
81164
81193
  [...RULE_TEXT],
81165
81194
  [...RULE_TEXT],
81166
81195
  [...RULE_TEXT],
81196
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
81167
81197
  ([...RULE_TEXT], [...ALERT_EPISODE]),
81198
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
81168
81199
  ([...RULE_TEXT], [...ALERT_EPISODE]),
81169
- ([...RULE_TEXT], [...ALERT_EPISODE]),
81170
- ([...RULE_TEXT], [...ALERT_EPISODE]),
81171
- ([...RULE_TEXT], [...ALERT_EPISODE]),
81200
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
81172
81201
  [...RULE_TEXT],
81173
81202
  [...RULE_TEXT],
81174
81203
  [...RULE_TEXT],
@@ -81244,6 +81273,15 @@ new Map([
81244
81273
  snapshotLabel: "Tanks low or full now",
81245
81274
  snapshotSection: "tanks"
81246
81275
  },
81276
+ {
81277
+ id: "motion-noise",
81278
+ family: "device-events",
81279
+ label: "Motion without a subject (constant / calm again)",
81280
+ bad: ["motion-noisy"],
81281
+ recovery: ["motion-calm"],
81282
+ snapshotLabel: "Cameras with constant motion now",
81283
+ snapshotSection: null
81284
+ },
81247
81285
  {
81248
81286
  id: "recording-health",
81249
81287
  family: "device-events",
@@ -81253,6 +81291,15 @@ new Map([
81253
81291
  snapshotLabel: "Recordings stalled now",
81254
81292
  snapshotSection: null
81255
81293
  },
81294
+ {
81295
+ id: "device-attention",
81296
+ family: "device-events",
81297
+ label: "Device needs attention (raised / resolved)",
81298
+ bad: ["device-attention-required"],
81299
+ recovery: ["device-attention-resolved"],
81300
+ snapshotLabel: "Devices needing attention now",
81301
+ snapshotSection: null
81302
+ },
81256
81303
  {
81257
81304
  id: "node-connectivity",
81258
81305
  family: "system",
@@ -188577,8 +188624,8 @@ var CLIP_REFRESH_SECTION_ID = "clip-catalog-refresh";
188577
188624
  * settings nobody could reason about. So the difference is in the operator's
188578
188625
  * own text, at both levels, not only in a record.
188579
188626
  */
188580
- var CLIP_CATALOG_REFRESH_MINUTES_DESCRIPTION = "How often CamStack re-reads what a Reolink camera holds on its own storage. It costs almost nothing on a camera it can reach: a hub child is read through the hub on the session that is already open (measured 65 ms, and the camera itself never hears it), and a mains camera is read on its own socket. On a STANDALONE BATTERY camera the timer cannot read anything at all — logging in is what wakes such a camera — so there it only marks the catalog as ageing, and the real re-read happens the next time the camera wakes up for its own reasons (motion, a stream, something you did). Set 0 to switch the timer off.";
188581
- var CLIP_CATALOG_FORCED_WAKE_DESCRIPTION = "Let the refresh timer WAKE this camera. Off unless you mean it: on a standalone battery camera every read is a login and every login is a wake, so a 15-minute timer is 96 wakes a day (24 at 60 minutes) against the 1–20 clips a day these cameras actually record — five to a hundred times their normal wake count, and the battery pays for all of it. One interval buys exactly one wake, successful or not. It has no effect on a hub child or a mains camera, which are never woken by this timer.";
188627
+ var CLIP_CATALOG_REFRESH_MINUTES_DESCRIPTION = "On a standalone battery camera the timer only marks the catalog as ageing; it never wakes the camera. 0 turns it off.";
188628
+ var CLIP_CATALOG_FORCED_WAKE_DESCRIPTION = "Let the timer wake a standalone battery camera: one wake per interval, at the battery’s cost. No effect on hub children or mains cameras.";
188582
188629
  /**
188583
188630
  * The addon-level (global) default. Per-camera overrides live on the device,
188584
188631
  * under the SAME key, and a device that sets nothing — or resets — resolves to
@@ -188588,7 +188635,7 @@ function buildClipRefreshSettingsSchema() {
188588
188635
  return { sections: [{
188589
188636
  id: CLIP_REFRESH_SECTION_ID,
188590
188637
  title: "Clip catalog refresh",
188591
- description: "The default for every Reolink camera. Each camera can override it in its own Recording settings; a camera that overrides nothing uses this value.",
188638
+ description: "Default for every camera; a camera can override it in its Recording settings.",
188592
188639
  columns: 1,
188593
188640
  fields: [{
188594
188641
  type: "number",
@@ -188618,7 +188665,7 @@ function buildClipRefreshDeviceSection(input) {
188618
188665
  id: CLIP_REFRESH_SECTION_ID,
188619
188666
  tab: "recording",
188620
188667
  title: "Clip catalog refresh",
188621
- description: "How often this camera’s own clip list is re-read. Leave the interval empty to use the default from the Reolink addon settings.",
188668
+ description: "Leave the interval empty to use the default from the Reolink addon settings.",
188622
188669
  columns: 1,
188623
188670
  fields: [{
188624
188671
  type: "number",
@@ -188897,7 +188944,7 @@ function buildSnapshotFreshnessSection(cache, opts) {
188897
188944
  tab: "advanced",
188898
188945
  title: "Snapshot freshness",
188899
188946
  titleKey: "provider-reolink:snapshotFreshnessSection.s_snapshotFreshness.title",
188900
- description: "When each cached camera reading was last fetched. Groups without a stamp were persisted before per-snapshot tracking — their age is unknown, not fresh. Use \"Refresh from camera\" (General) to re-read an awake camera.",
188947
+ description: "Groups without a stamp are of unknown age, not fresh.",
188901
188948
  descriptionKey: "provider-reolink:snapshotFreshnessSection.s_snapshotFreshness.description",
188902
188949
  columns: 1,
188903
188950
  fields: [{
@@ -189928,7 +189975,7 @@ var BatteryHourlyRefresh = class {
189928
189975
  //#endregion
189929
189976
  //#region src/battery-refresh-settings.ts
189930
189977
  var BATTERY_REFRESH_SECTION_ID = "battery-refresh";
189931
- var BATTERY_REFRESH_MINUTES_DESCRIPTION = `Once per window this camera refreshes everything CamStack knows about it — battery level and charging, signal, device info, every state panel and the cached snapshot. If the camera is awake at some point in the window (a motion event, a live view, anything that woke it) it is refreshed then and not woken again; if the whole window passes with the camera asleep, it is woken ONCE near the end of the window, refreshed, and left to go back to sleep. A camera that does not answer is retried at most twice per window. 15–240 minutes, default 60; 0 turns the scheduled refresh off (the battery level then ages until the camera next wakes by itself).`;
189978
+ var BATTERY_REFRESH_MINUTES_DESCRIPTION = "A camera that slept the whole window is woken once to refresh. 0 turns the scheduled refresh off.";
189932
189979
  /** Battery cameras only: a mains camera keeps its facts fresh on its own socket. */
189933
189980
  function buildBatteryRefreshDeviceSection(input) {
189934
189981
  if (!input.isBattery) return [];
@@ -189936,7 +189983,6 @@ function buildBatteryRefreshDeviceSection(input) {
189936
189983
  id: BATTERY_REFRESH_SECTION_ID,
189937
189984
  tab: "general",
189938
189985
  title: "Scheduled refresh",
189939
- description: "How often this battery camera is guaranteed to have been read, so a battery level never goes stale unseen.",
189940
189986
  columns: 1,
189941
189987
  fields: [{
189942
189988
  type: "number",
@@ -190030,7 +190076,7 @@ async function refreshSnapshotCacheOnce(input) {
190030
190076
  */
190031
190077
  var CH_BAICHUAN = declareLogChannel({
190032
190078
  name: "provider-reolink.baichuan",
190033
- description: "Every Baichuan protocol frame this camera sends and receives, plus UDP keepalives and battery-camera sleep inference. Loud on an active camera — arm it for one camera and a short window.",
190079
+ description: "Every Baichuan protocol frame this camera sends and receives. Loud: arm it for one camera and a short window.",
190034
190080
  defaultLevel: "info",
190035
190081
  perDevice: true
190036
190082
  });
@@ -190045,7 +190091,7 @@ var CH_BAICHUAN = declareLogChannel({
190045
190091
  */
190046
190092
  var CH_HANDSHAKE = declareLogChannel({
190047
190093
  name: "provider-reolink.handshake",
190048
- description: "Login and socket lifecycle for this camera: the pre-login dial, the battery-camera wake a login causes, login failures and the reconnects that follow. The channel to arm when a camera looks present but answers nothing.",
190094
+ description: "Login and socket lifecycle for this camera. Arm it when a camera looks present but answers nothing.",
190049
190095
  defaultLevel: "info",
190050
190096
  perDevice: true
190051
190097
  });
@@ -190454,7 +190500,7 @@ function buildOsdSection(snapshot, values, opts) {
190454
190500
  tab: "image",
190455
190501
  title: "OSD overlay",
190456
190502
  titleKey: "provider-reolink:osdSection.s_osd.title",
190457
- description: "On-screen overlays burned into the video by the camera. Read with `GetOsdDatetime` (cmd_id 44) and pushed with `SetOsdDatetime` (cmd_id 45). Positions are the four frame corners; an overlay the camera holds somewhere else keeps that placement unless a corner is chosen.",
190503
+ description: "An overlay the camera holds somewhere else keeps that placement unless a corner is chosen.",
190458
190504
  descriptionKey: "provider-reolink:osdSection.s_osd.description",
190459
190505
  columns: 2,
190460
190506
  fields: [
@@ -190466,8 +190512,6 @@ function buildOsdSection(snapshot, values, opts) {
190466
190512
  key: "osdChannelName",
190467
190513
  label: "Channel name",
190468
190514
  labelKey: "provider-reolink:fields.osdChannelName.label",
190469
- description: "Text shown in the channel-name overlay.",
190470
- descriptionKey: "provider-reolink:fields.osdChannelName.description",
190471
190515
  default: values.osdChannelName,
190472
190516
  placeholder: "Front door"
190473
190517
  },
@@ -190951,7 +190995,7 @@ var SirenAccessory = class extends BaseDevice {
190951
190995
  id: "siren",
190952
190996
  title: "Siren",
190953
190997
  titleKey: "provider-reolink:schema.s_siren.title",
190954
- description: "Tone duration when triggered. Set to 0 for \"play until turned off\"; positive values pulse for that many seconds.",
190998
+ description: "0 = play until turned off.",
190955
190999
  descriptionKey: "provider-reolink:schema.s_siren.description",
190956
191000
  columns: 1,
190957
191001
  fields: [{
@@ -190959,8 +191003,6 @@ var SirenAccessory = class extends BaseDevice {
190959
191003
  key: "sirenDurationS",
190960
191004
  label: "Default duration (seconds)",
190961
191005
  labelKey: "provider-reolink:schema.s_siren.sirenDurationS.label",
190962
- description: "Forwarded to `setSiren(on=true, duration)` (cmd_id 30) when the operator flips the switch.",
190963
- descriptionKey: "provider-reolink:schema.s_siren.sirenDurationS.description",
190964
191006
  default: 0,
190965
191007
  min: 0,
190966
191008
  max: 300,
@@ -190970,16 +191012,12 @@ var SirenAccessory = class extends BaseDevice {
190970
191012
  id: "motion-siren",
190971
191013
  title: "Motion-triggered siren",
190972
191014
  titleKey: "provider-reolink:schema.s_motion-siren.title",
190973
- description: "Detection classes that fire the siren when \"Trigger on motion\" is armed. Forwarded as a `typeScheduleList` to `setSirenOnMotion` (cmd_id 231). Saved values re-apply on every motion-trigger flip.",
190974
- descriptionKey: "provider-reolink:schema.s_motion-siren.description",
190975
191015
  columns: 1,
190976
191016
  fields: [{
190977
191017
  type: "select",
190978
191018
  key: "motionSirenDetectType",
190979
191019
  label: "Detection classes",
190980
191020
  labelKey: "provider-reolink:schema.s_motion-siren.motionSirenDetectType.label",
190981
- description: "Object/motion classes that arm the siren. `MD` = generic motion detection.",
190982
- descriptionKey: "provider-reolink:schema.s_motion-siren.motionSirenDetectType.description",
190983
191021
  options: SIREN_DETECT_TYPE_CHOICES.map((v) => ({
190984
191022
  value: v,
190985
191023
  label: v.replace(/,/g, " + ").replace(/_/g, "+")
@@ -191443,16 +191481,12 @@ var FloodlightAccessory = class extends BaseDevice {
191443
191481
  id: "motion-floodlight",
191444
191482
  title: "Motion-triggered floodlight",
191445
191483
  titleKey: "provider-reolink:schema.s_motion-floodlight.title",
191446
- description: "Pushed to the camera (`FloodlightTask`) when the \"Trigger on motion\" toggle is armed. Saved values also re-apply on every motion-trigger flip so the firmware always honours your preference.",
191447
- descriptionKey: "provider-reolink:schema.s_motion-floodlight.description",
191448
191484
  columns: 2,
191449
191485
  fields: [{
191450
191486
  type: "number",
191451
191487
  key: "motionLightDurationS",
191452
191488
  label: "Light duration (s)",
191453
191489
  labelKey: "provider-reolink:schema.s_motion-floodlight.motionLightDurationS.label",
191454
- description: "Seconds the floodlight stays lit after a motion event. Reolink range 1..600s.",
191455
- descriptionKey: "provider-reolink:schema.s_motion-floodlight.motionLightDurationS.description",
191456
191490
  min: 1,
191457
191491
  max: 600,
191458
191492
  step: 1,
@@ -191462,8 +191496,6 @@ var FloodlightAccessory = class extends BaseDevice {
191462
191496
  key: "motionLightDetectType",
191463
191497
  label: "Detection classes",
191464
191498
  labelKey: "provider-reolink:schema.s_motion-floodlight.motionLightDetectType.label",
191465
- description: "Object classes that turn the floodlight on. Composed values (e.g. \"people,vehicle\") fire when ANY listed class detects.",
191466
- descriptionKey: "provider-reolink:schema.s_motion-floodlight.motionLightDetectType.description",
191467
191499
  options: FLOODLIGHT_DETECT_TYPE_CHOICES.map((v) => ({
191468
191500
  value: v,
191469
191501
  label: v.replace(/,/g, " + ").replace(/_/g, "+")
@@ -191703,8 +191735,6 @@ var PirAccessory = class extends BaseDevice {
191703
191735
  id: "pir",
191704
191736
  title: "PIR sensor",
191705
191737
  titleKey: "provider-reolink:schema.s_pir.title",
191706
- description: "Hardware passive-infrared trigger configuration. Pushed via cmd_id 153 (SetPirInfo).",
191707
- descriptionKey: "provider-reolink:schema.s_pir.description",
191708
191738
  columns: 2,
191709
191739
  fields: [
191710
191740
  {
@@ -191712,8 +191742,6 @@ var PirAccessory = class extends BaseDevice {
191712
191742
  key: "pirSensitive",
191713
191743
  label: "Sensitivity",
191714
191744
  labelKey: "provider-reolink:schema.s_pir.pirSensitive.label",
191715
- description: "Higher value → triggers on smaller motion. Most cameras max at 100.",
191716
- descriptionKey: "provider-reolink:schema.s_pir.pirSensitive.description",
191717
191745
  min: 1,
191718
191746
  max: 100,
191719
191747
  step: 1,
@@ -191725,7 +191753,6 @@ var PirAccessory = class extends BaseDevice {
191725
191753
  key: "pirIntervalS",
191726
191754
  label: "Cooldown (seconds)",
191727
191755
  labelKey: "provider-reolink:schema.s_pir.pirIntervalS.label",
191728
- description: `Minimum delay between consecutive PIR triggers. Reolink app range 5..${intervalMax}s; firmware clamps on push.`,
191729
191756
  min: 5,
191730
191757
  max: intervalMax,
191731
191758
  step: 1,
@@ -191738,8 +191765,6 @@ var PirAccessory = class extends BaseDevice {
191738
191765
  key: "pirReduceAlarm",
191739
191766
  label: "Reduce false alarms",
191740
191767
  labelKey: "provider-reolink:schema.s_pir.pirReduceAlarm.label",
191741
- description: "Trades detection range for fewer false positives. Maps to firmware `reduceAlarm` flag.",
191742
- descriptionKey: "provider-reolink:schema.s_pir.pirReduceAlarm.description",
191743
191768
  ...typeof reduceAlarm === "boolean" ? { default: reduceAlarm } : {},
191744
191769
  style: "switch",
191745
191770
  span: 2
@@ -193288,8 +193313,6 @@ function buildSessionsTabSections(snap, opts) {
193288
193313
  return [{
193289
193314
  id: "sessions-status",
193290
193315
  title: opts.title ?? "Sessions",
193291
- description: "Diagnostics for the Baichuan control channel. Auto-refreshes when older than 1 minute; click Refresh to force.",
193292
- descriptionKey: "provider-reolink:sessionsTabSections.s_sessions-status.description",
193293
193316
  tab: opts.tabId,
193294
193317
  order: 0,
193295
193318
  columns: 1,
@@ -193307,8 +193330,6 @@ function buildSessionsTabSections(snap, opts) {
193307
193330
  key: "sessionsOnlineUsers",
193308
193331
  label: "Online users (firmware)",
193309
193332
  labelKey: "provider-reolink:sessionsTabSections.s_sessions-status.sessionsOnlineUsers.label",
193310
- description: "Active user sessions reported by the device (cmd_id 145). Includes other admins, mobile app, NVR linkups.",
193311
- descriptionKey: "provider-reolink:sessionsTabSections.s_sessions-status.sessionsOnlineUsers.description",
193312
193333
  columns: [
193313
193334
  {
193314
193335
  key: "userName",
@@ -193351,8 +193372,6 @@ function buildSessionsTabSections(snap, opts) {
193351
193372
  key: "sessionsSocketPool",
193352
193373
  label: "Our socket pool",
193353
193374
  labelKey: "provider-reolink:sessionsTabSections.s_sessions-status.sessionsSocketPool.label",
193354
- description: "Open Baichuan TCP/UDP sockets this process holds for the device. One row per pool tag.",
193355
- descriptionKey: "provider-reolink:sessionsTabSections.s_sessions-status.sessionsSocketPool.description",
193356
193375
  columns: [{
193357
193376
  key: "tag",
193358
193377
  label: "Tag",
@@ -193373,8 +193392,6 @@ function buildSessionsTabSections(snap, opts) {
193373
193392
  key: "sessionsDedicated",
193374
193393
  label: "Dedicated lib sessions",
193375
193394
  labelKey: "provider-reolink:sessionsTabSections.s_sessions-status.sessionsDedicated.label",
193376
- description: "Internal lib-side dedicated sessions (streaming/talk channels). Older lib versions leave this list empty.",
193377
- descriptionKey: "provider-reolink:sessionsTabSections.s_sessions-status.sessionsDedicated.description",
193378
193395
  columns: [{
193379
193396
  key: "key",
193380
193397
  label: "Session key",
@@ -195759,7 +195776,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
195759
195776
  tab: "motion",
195760
195777
  title: "Battery motion (sleep push)",
195761
195778
  titleKey: "provider-reolink:emailPushSection.s_sleep-push.title",
195762
- description: "Battery cameras sleep and can't be polled for motion. Prefer HaCfg webhook when the firmware supports it (cmd 806); otherwise use Email/SMTP. Enable the matching server under Integrations → Reolink, then Auto-configure. Only one path should be armed — the preference below gates which inbound source is accepted.",
195779
+ description: "Prefer the HaCfg webhook when the firmware supports it; arm only one path.",
195763
195780
  descriptionKey: "provider-reolink:emailPushSection.s_sleep-push.description",
195764
195781
  columns: 1,
195765
195782
  fields: [
@@ -195825,7 +195842,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
195825
195842
  tab: "email",
195826
195843
  title: "SMTP server",
195827
195844
  titleKey: "provider-reolink:emailTabSections.s_email-smtp.title",
195828
- description: "The camera's own outgoing-mail (SMTP) settings. Edit and save to write them to the camera, or use \"Auto-configure email push\" under Motion to point it at the built-in server. Leave the password blank to keep the current one.",
195845
+ description: "Leave the password blank to keep the current one.",
195829
195846
  descriptionKey: "provider-reolink:emailTabSections.s_email-smtp.description",
195830
195847
  columns: 2,
195831
195848
  fields: [
@@ -195880,8 +195897,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
195880
195897
  tab: "email",
195881
195898
  title: "Recipients",
195882
195899
  titleKey: "provider-reolink:emailTabSections.s_email-recipients.title",
195883
- description: "Up to three recipient addresses the camera sends motion mail to.",
195884
- descriptionKey: "provider-reolink:emailTabSections.s_email-recipients.description",
195885
195900
  columns: 1,
195886
195901
  fields: [
195887
195902
  {
@@ -195910,8 +195925,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
195910
195925
  tab: "email",
195911
195926
  title: "Alarm schedule",
195912
195927
  titleKey: "provider-reolink:emailTabSections.s_email-schedule.title",
195913
- description: "Master enable for the camera's email alarm schedule (EmailTask).",
195914
- descriptionKey: "provider-reolink:emailTabSections.s_email-schedule.description",
195915
195928
  columns: 1,
195916
195929
  fields: [{
195917
195930
  type: "boolean",
@@ -199787,7 +199800,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
199787
199800
  tab: "general",
199788
199801
  title: "Camera data",
199789
199802
  titleKey: "provider-reolink:schema.s_driver-refresh.title",
199790
- description: "Go and ask the camera now. Every other read here is deliberately cheap about a battery camera — it serves what it already knows and refreshes quietly behind you, and never wakes a sleeping camera just because you opened this tab. This button is the exception: it wakes the camera, re-reads everything, and tells you what it got. Use it after changing settings from the Reolink app, or whenever you want to be sure the form is showing the camera and not a memory of it.",
199803
+ description: "Wakes a sleeping camera and re-reads everything; no other read here wakes it.",
199791
199804
  descriptionKey: "provider-reolink:schema.s_driver-refresh.description",
199792
199805
  columns: 1,
199793
199806
  fields: [{
@@ -199806,8 +199819,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
199806
199819
  tab: "general",
199807
199820
  title: "Connection",
199808
199821
  titleKey: "provider-reolink:schema.s_connection.title",
199809
- description: "Baichuan protocol connection settings.",
199810
- descriptionKey: "provider-reolink:schema.s_connection.description",
199811
199822
  columns: 2,
199812
199823
  fields: [
199813
199824
  {
@@ -199850,7 +199861,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
199850
199861
  tab: "network",
199851
199862
  title: "Service ports",
199852
199863
  titleKey: "provider-reolink:schema.s_network-ports.title",
199853
- description: "Per-protocol enable toggle + port number, pushed via Baichuan `SetNetPort` (cmd_id 36). The Baichuan control port is the Connection → Port field. Changing a port number breaks existing URLs for that protocol until consumers are reconfigured.",
199864
+ description: "Changing a port breaks existing URLs for that protocol.",
199854
199865
  descriptionKey: "provider-reolink:schema.s_network-ports.description",
199855
199866
  columns: 2,
199856
199867
  fields: [
@@ -199951,8 +199962,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
199951
199962
  tab: "network",
199952
199963
  title: "Time / NTP",
199953
199964
  titleKey: "provider-reolink:schema.s_time-ntp.title",
199954
- description: "Network time synchronisation. The camera-side push goes through the native Baichuan NTP commands; until those land in the driver lib the values persist to the driver config and apply on the next lib update.",
199955
- descriptionKey: "provider-reolink:schema.s_time-ntp.description",
199956
199965
  columns: 2,
199957
199966
  fields: [
199958
199967
  {
@@ -199960,8 +199969,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
199960
199969
  key: "timeZoneId",
199961
199970
  label: "Timezone",
199962
199971
  labelKey: "provider-reolink:schema.s_time-ntp.timeZoneId.label",
199963
- description: "Camera timezone. Selecting a zone pushes its standard UTC offset (Baichuan `SetSystemGeneral`, cmd 105) and DST rule (`SetDst`, cmd 107) to the camera — DST is handled automatically by the chosen zone, so summer/winter clocks track correctly without a separate toggle.",
199964
- descriptionKey: "provider-reolink:schema.s_time-ntp.timeZoneId.description",
199965
199972
  default: this.config.get("timeZoneId") ?? reolinkTimeZoneToIana(this.config.get("deviceCache")?.systemGeneralSnapshot?.timeZone) ?? "",
199966
199973
  span: 2
199967
199974
  },
@@ -200010,16 +200017,12 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200010
200017
  tab: "motion",
200011
200018
  title: "On-camera motion (MdAlarm)",
200012
200019
  titleKey: "provider-reolink:schema.s_motion.title",
200013
- description: "Camera-side motion detection master switch + sensitivity. Pushed via Baichuan `SetMdAlarm` (cmd_id 47). Range 1..50 matches the Reolink mobile app + web UI; the driver inverts to the camera-side raw value (`51 - value`) before push.",
200014
- descriptionKey: "provider-reolink:schema.s_motion.description",
200015
200020
  columns: 2,
200016
200021
  fields: [{
200017
200022
  type: "boolean",
200018
200023
  key: "motionEnabled",
200019
200024
  label: "Motion detection",
200020
200025
  labelKey: "provider-reolink:schema.s_motion.motionEnabled.label",
200021
- description: "Master switch for the camera's on-board motion detector. Disabling stops the camera from emitting motion events on the alarm channel.",
200022
- descriptionKey: "provider-reolink:schema.s_motion.motionEnabled.description",
200023
200026
  default: motionSnap.enabled ?? true,
200024
200027
  style: "switch",
200025
200028
  span: 2
@@ -200028,8 +200031,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200028
200031
  key: "motionSensitivity",
200029
200032
  label: "Sensitivity",
200030
200033
  labelKey: "provider-reolink:schema.s_motion.motionSensitivity.label",
200031
- description: "Higher = triggers on smaller motion. Reolink user-facing range 1..50.",
200032
- descriptionKey: "provider-reolink:schema.s_motion.motionSensitivity.description",
200033
200034
  min: 1,
200034
200035
  max: 50,
200035
200036
  step: 1,
@@ -200044,8 +200045,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200044
200045
  tab: "motion",
200045
200046
  title: "AI detection sensitivity",
200046
200047
  titleKey: "provider-reolink:schema.s_ai-sensitivity.title",
200047
- description: "Per-class on-camera AI sensitivity, stay time (dwell) + min/max target-size gates. Pushed via `SetAiAlarm` (cmd_id 343) in one consolidated write. Sensitivity range 0..100; stay time is the seconds the camera keeps the alarm asserted after the object leaves; target-size gates are the fraction of the frame (0..1) an object must occupy to be considered. Each group appears only when the camera advertises the corresponding detector.",
200048
- descriptionKey: "provider-reolink:schema.s_ai-sensitivity.description",
200049
200048
  columns: 2,
200050
200049
  fields: [
200051
200050
  [
@@ -200114,7 +200113,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200114
200113
  type: "slider",
200115
200114
  key: stayKey,
200116
200115
  label: `${label} stay time (s)`,
200117
- description: "Seconds the camera keeps the AI alarm asserted after the object leaves frame.",
200118
200116
  min: 0,
200119
200117
  max: 600,
200120
200118
  step: 1,
@@ -200177,8 +200175,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200177
200175
  tab: "image",
200178
200176
  title: "Image",
200179
200177
  titleKey: "provider-reolink:schema.s_image.title",
200180
- description: "Core image settings pushed via Baichuan `SetImage` (cmd_id 25). Each slider rearms the camera on save; defaults seed from a `GetVideoInput` probe at boot (refreshed on every `applySettingsPatch`). Range 0..255 — most Reolink models clamp to 0..100 internally.",
200181
- descriptionKey: "provider-reolink:schema.s_image.description",
200182
200178
  columns: 2,
200183
200179
  fields: [
200184
200180
  {
@@ -200249,24 +200245,18 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200249
200245
  tab: "image",
200250
200246
  title: "Advanced (ISP)",
200251
200247
  titleKey: "provider-reolink:schema.s_isp.title",
200252
- description: "Day/Night + exposure + HDR. Pushed via `SetIsp` (cmd_id 25). The day/night threshold uses cmd_id 297 (DayNightThreshold).",
200253
- descriptionKey: "provider-reolink:schema.s_isp.description",
200254
200248
  columns: 2,
200255
200249
  fields: [{
200256
200250
  type: "text",
200257
200251
  key: "ispDayNight",
200258
200252
  label: "Day/Night mode",
200259
200253
  labelKey: "provider-reolink:schema.s_isp.ispDayNight.label",
200260
- description: "Camera-specific values — common: `auto`, `color`, `blackAndWhite`. The driver normalizes case before push.",
200261
- descriptionKey: "provider-reolink:schema.s_isp.ispDayNight.description",
200262
200254
  default: imgSnap.dayNight ?? "auto"
200263
200255
  }, {
200264
200256
  type: "text",
200265
200257
  key: "ispExposure",
200266
200258
  label: "Exposure",
200267
200259
  labelKey: "provider-reolink:schema.s_isp.ispExposure.label",
200268
- description: "Common values: `auto`, `manual`. Lowercased before push.",
200269
- descriptionKey: "provider-reolink:schema.s_isp.ispExposure.description",
200270
200260
  default: "auto"
200271
200261
  }]
200272
200262
  }] : [],
@@ -200275,8 +200265,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200275
200265
  tab: "image",
200276
200266
  title: "IR + status LED",
200277
200267
  titleKey: "provider-reolink:schema.s_ir-lights.title",
200278
- description: "IR LED control + per-camera IR brightness. Pushed via `SetIrLights` (cmd_id 209). State `Auto` lets the camera switch IR on automatically at low light; `Off` forces colour-only mode.",
200279
- descriptionKey: "provider-reolink:schema.s_ir-lights.description",
200280
200268
  columns: 2,
200281
200269
  fields: [
200282
200270
  {
@@ -200308,7 +200296,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200308
200296
  key: "irLightsBrightness",
200309
200297
  label: "IR brightness",
200310
200298
  labelKey: "provider-reolink:schema.s_ir-lights.irLightsBrightness.label",
200311
- description: "Only applied when the camera advertises programmable IR brightness. 0..255 raw range; many models clamp to 0..100.",
200299
+ description: "Only applied when the camera supports adjustable IR brightness.",
200312
200300
  descriptionKey: "provider-reolink:schema.s_ir-lights.irLightsBrightness.description",
200313
200301
  min: 0,
200314
200302
  max: 255,
@@ -200322,8 +200310,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200322
200310
  key: "statusLedEnabled",
200323
200311
  label: "Status LED",
200324
200312
  labelKey: "provider-reolink:schema.s_ir-lights.statusLedEnabled.label",
200325
- description: "The visible status/power LED on the camera body. Pushed via `SetIrLights` (cmd_id 209) as `lightState`.",
200326
- descriptionKey: "provider-reolink:schema.s_ir-lights.statusLedEnabled.description",
200327
200313
  default: cache?.ledSnapshot?.statusEnabled ?? true,
200328
200314
  style: "switch",
200329
200315
  span: cache?.ledSnapshot?.doorbellSupported === true ? 1 : 2
@@ -200333,8 +200319,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200333
200319
  key: "doorbellLedEnabled",
200334
200320
  label: "Doorbell LED",
200335
200321
  labelKey: "provider-reolink:schema.s_ir-lights.doorbellLedEnabled.label",
200336
- description: "The doorbell button ring LED. Pushed via `SetIrLights` (cmd_id 209) as `doorbellLightState`.",
200337
- descriptionKey: "provider-reolink:schema.s_ir-lights.doorbellLedEnabled.description",
200338
200322
  default: cache?.ledSnapshot?.doorbellEnabled ?? true,
200339
200323
  style: "switch"
200340
200324
  }] : []
@@ -200349,7 +200333,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200349
200333
  tab: "image",
200350
200334
  title: "Auto focus",
200351
200335
  titleKey: "provider-reolink:schema.s_auto-focus.title",
200352
- description: "Toggles the lens auto-focus subsystem. Pushed via `SetAutoFocus` (cmd_id 225). Disabling locks the lens at its current focal position — useful for fixed-distance scenes where AF would hunt.",
200336
+ description: "Disabling locks the lens at its current focus.",
200353
200337
  descriptionKey: "provider-reolink:schema.s_auto-focus.description",
200354
200338
  columns: 1,
200355
200339
  fields: [{
@@ -200366,8 +200350,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200366
200350
  tab: "audio",
200367
200351
  title: "Audio output",
200368
200352
  titleKey: "provider-reolink:schema.s_audio.title",
200369
- description: "Speaker volumes pushed via `SetAudioCfg` (cmd_id 265). All ranges 0..100. Doorbell models expose the visitor / talkAndReply channels — non-doorbell cameras ignore those without erroring.",
200370
- descriptionKey: "provider-reolink:schema.s_audio.description",
200371
200353
  columns: 2,
200372
200354
  fields: [
200373
200355
  {
@@ -200387,7 +200369,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200387
200369
  key: "audioTalkAndReplyVolume",
200388
200370
  label: "Talk + reply volume",
200389
200371
  labelKey: "provider-reolink:schema.s_audio.audioTalkAndReplyVolume.label",
200390
- description: "Two-way audio + canned reply playback. Doorbell-only on most firmwares.",
200372
+ description: "Doorbell models only.",
200391
200373
  descriptionKey: "provider-reolink:schema.s_audio.audioTalkAndReplyVolume.description",
200392
200374
  min: 0,
200393
200375
  max: 100,
@@ -200401,7 +200383,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200401
200383
  key: "audioVisitorVolume",
200402
200384
  label: "Visitor volume",
200403
200385
  labelKey: "provider-reolink:schema.s_audio.audioVisitorVolume.label",
200404
- description: "Visitor / chime playback channel. Doorbell-only on most firmwares.",
200386
+ description: "Doorbell models only.",
200405
200387
  descriptionKey: "provider-reolink:schema.s_audio.audioVisitorVolume.description",
200406
200388
  min: 0,
200407
200389
  max: 100,
@@ -200418,8 +200400,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200418
200400
  tab: "audio",
200419
200401
  title: "Audio noise reduction",
200420
200402
  titleKey: "provider-reolink:schema.s_audio-noise.title",
200421
- description: "On-camera AI denoise applied to the encoded audio track. Pushed via `SetAudioNoise` (cmd_id 440). 0 disables; 1..3 maps to the Reolink mobile app levels (low / mid / high).",
200422
- descriptionKey: "provider-reolink:schema.s_audio-noise.description",
200423
200403
  columns: 1,
200424
200404
  fields: [{
200425
200405
  type: "slider",
@@ -200441,7 +200421,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200441
200421
  tab: "audio",
200442
200422
  title: "Intercom",
200443
200423
  titleKey: "provider-reolink:schema.s_intercom.title",
200444
- description: "Push-to-talk pipeline tuning. Settings take effect on the next talk session — restart any active session for changes to apply.",
200424
+ description: "Changes apply to the next talk session.",
200445
200425
  descriptionKey: "provider-reolink:schema.s_intercom.description",
200446
200426
  columns: 2,
200447
200427
  fields: [
@@ -200450,7 +200430,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200450
200430
  key: "intercomBlocksPerPayload",
200451
200431
  label: "Blocks per payload",
200452
200432
  labelKey: "provider-reolink:schema.s_intercom.intercomBlocksPerPayload.label",
200453
- description: "Lower = lower latency (more sendAudio calls/sec). Higher = fewer calls, less per-call socket overhead. Range 1..8. Default 1 (lowest latency).",
200433
+ description: "Lower is lower latency, higher is fewer calls. Range 1..8.",
200454
200434
  descriptionKey: "provider-reolink:schema.s_intercom.intercomBlocksPerPayload.description",
200455
200435
  min: 1,
200456
200436
  max: 8,
@@ -200464,7 +200444,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200464
200444
  key: "intercomMaxBacklogMs",
200465
200445
  label: "Max backlog (ms)",
200466
200446
  labelKey: "provider-reolink:schema.s_intercom.intercomMaxBacklogMs.label",
200467
- description: "Maximum PCM backlog before dropping oldest samples to cap latency. Higher = more stable on slow systems but more latency. Range 20..5000. Default 120.",
200447
+ description: "Higher is more stable on slow systems but adds latency. Range 20..5000.",
200468
200448
  descriptionKey: "provider-reolink:schema.s_intercom.intercomMaxBacklogMs.description",
200469
200449
  min: 20,
200470
200450
  max: 5e3,
@@ -200478,7 +200458,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200478
200458
  key: "intercomGain",
200479
200459
  label: "Output gain",
200480
200460
  labelKey: "provider-reolink:schema.s_intercom.intercomGain.label",
200481
- description: "Multiplier applied to PCM samples before IMA-ADPCM encode. 1.0 = neutral, 2.0 ≈ +6dB, 0.5 ≈ -6dB. Hard-clipped at int16 bounds.",
200461
+ description: "1.0 = neutral, 2.0 ≈ +6 dB, 0.5 ≈ -6 dB.",
200482
200462
  descriptionKey: "provider-reolink:schema.s_intercom.intercomGain.description",
200483
200463
  min: .1,
200484
200464
  max: 10,
@@ -200495,7 +200475,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200495
200475
  tab: "advanced",
200496
200476
  title: "Keyframe interval (GOP)",
200497
200477
  titleKey: "provider-reolink:schema.s_keyframe-gop.title",
200498
- description: "Main-stream keyframe interval in seconds. Pushed via `SetEnc` (cmd_id 57) as `<gop><cur>`. Lower = more keyframes (faster seek/recovery, higher bitrate); higher = fewer keyframes (lower bitrate). The camera clamps to its supported range.",
200478
+ description: "Lower = more keyframes (faster recovery, higher bitrate).",
200499
200479
  descriptionKey: "provider-reolink:schema.s_keyframe-gop.description",
200500
200480
  columns: 1,
200501
200481
  fields: [{
@@ -200516,8 +200496,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200516
200496
  tab: "advanced",
200517
200497
  title: "PIR detection",
200518
200498
  titleKey: "provider-reolink:schema.s_pir-reduce-alarm.title",
200519
- description: "Passive-infrared false-alarm filter. Pushed via `SetPirInfo` (cmd_id 213) as `reduceAlarm`. Enabling makes the camera require a stronger/longer PIR signal before triggering, cutting false motion alerts from heat/light flicker.",
200520
- descriptionKey: "provider-reolink:schema.s_pir-reduce-alarm.description",
200521
200499
  columns: 1,
200522
200500
  fields: [{
200523
200501
  type: "boolean",
@@ -200533,8 +200511,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200533
200511
  tab: "advanced",
200534
200512
  title: "Auto reboot",
200535
200513
  titleKey: "provider-reolink:schema.s_auto-reboot.title",
200536
- description: "Scheduled automatic reboot. Pushed via `SetAutoReboot` (cmd_id 100). Useful for long-uptime stability. Choose a day (or every day) + time; the camera reboots once per matching window.",
200537
- descriptionKey: "provider-reolink:schema.s_auto-reboot.description",
200538
200514
  columns: 2,
200539
200515
  fields: [
200540
200516
  {
@@ -200623,7 +200599,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200623
200599
  tab: "advanced",
200624
200600
  title: "Debug",
200625
200601
  titleKey: "provider-reolink:schema.s_debug.title",
200626
- description: "Lib-side Baichuan tracing. Changing these resets the control-channel client (active streams keep running) so new debug options take effect on the next dial.",
200602
+ description: "Debug logging adds log volume; use it temporarily.",
200627
200603
  descriptionKey: "provider-reolink:schema.s_debug.description",
200628
200604
  columns: 1,
200629
200605
  fields: [{
@@ -200631,8 +200607,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200631
200607
  key: "debugGeneral",
200632
200608
  label: "General debug logs",
200633
200609
  labelKey: "provider-reolink:schema.s_debug.debugGeneral.label",
200634
- description: "Forwards `DebugOptions.general=true` — verbose lib protocol logs.",
200635
- descriptionKey: "provider-reolink:schema.s_debug.debugGeneral.description",
200636
200610
  default: false,
200637
200611
  style: "switch"
200638
200612
  }, {
@@ -200640,7 +200614,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200640
200614
  key: "debugSocketLogs",
200641
200615
  label: "Socket trace categories",
200642
200616
  labelKey: "provider-reolink:schema.s_debug.debugSocketLogs.label",
200643
- description: "Per-area lib tracing. Pick only what you need; each adds log volume.",
200617
+ description: "Each area adds log volume.",
200644
200618
  descriptionKey: "provider-reolink:schema.s_debug.debugSocketLogs.description",
200645
200619
  default: [],
200646
200620
  options: [
@@ -202211,7 +202185,7 @@ var ReolinkHub = class ReolinkHub extends BaseDevice {
202211
202185
  tab: "general",
202212
202186
  title: "Connection",
202213
202187
  titleKey: "provider-reolink:hub.s_connection.title",
202214
- description: "Baichuan protocol connection settings for the hub. The same socket fronts every adopted channel — child cameras inherit these credentials, no per-channel login needed.",
202188
+ description: "Child cameras inherit these credentials.",
202215
202189
  descriptionKey: "provider-reolink:hub.s_connection.description",
202216
202190
  columns: 2,
202217
202191
  fields: [
@@ -202255,8 +202229,6 @@ var ReolinkHub = class ReolinkHub extends BaseDevice {
202255
202229
  tab: "general",
202256
202230
  title: "Hub identity",
202257
202231
  titleKey: "provider-reolink:hub.s_identity.title",
202258
- description: "Read-only summary from the autodetect probe. Channel count and model are persisted at first contact so the panel renders without re-probing.",
202259
- descriptionKey: "provider-reolink:hub.s_identity.description",
202260
202232
  columns: 2,
202261
202233
  fields: [{
202262
202234
  type: "text",
@@ -202279,7 +202251,7 @@ var ReolinkHub = class ReolinkHub extends BaseDevice {
202279
202251
  tab: "advanced",
202280
202252
  title: "Debug",
202281
202253
  titleKey: "provider-reolink:hub.s_debug.title",
202282
- description: "Lib-side Baichuan tracing. Changing these resets the control-channel client (active streams keep running) so new debug options take effect on the next dial.",
202254
+ description: "Debug logging adds log volume; use it temporarily.",
202283
202255
  descriptionKey: "provider-reolink:hub.s_debug.description",
202284
202256
  columns: 1,
202285
202257
  fields: [{
@@ -202287,8 +202259,6 @@ var ReolinkHub = class ReolinkHub extends BaseDevice {
202287
202259
  key: "debugGeneral",
202288
202260
  label: "General debug logs",
202289
202261
  labelKey: "provider-reolink:hub.s_debug.debugGeneral.label",
202290
- description: "Forwards `DebugOptions.general=true` — verbose lib protocol logs.",
202291
- descriptionKey: "provider-reolink:hub.s_debug.debugGeneral.description",
202292
202262
  default: false,
202293
202263
  style: "switch"
202294
202264
  }, {
@@ -202296,7 +202266,7 @@ var ReolinkHub = class ReolinkHub extends BaseDevice {
202296
202266
  key: "debugSocketLogs",
202297
202267
  label: "Socket trace categories",
202298
202268
  labelKey: "provider-reolink:hub.s_debug.debugSocketLogs.label",
202299
- description: "Per-area lib tracing. Pick only what you need; each adds log volume.",
202269
+ description: "Each area adds log volume.",
202300
202270
  descriptionKey: "provider-reolink:hub.s_debug.debugSocketLogs.description",
202301
202271
  default: [],
202302
202272
  options: [
@@ -203059,7 +203029,7 @@ function buildDiscoveryParamsFormSchema() {
203059
203029
  id: "credentials",
203060
203030
  title: "Credentials",
203061
203031
  titleKey: "provider-reolink:discoveryParams.s_credentials.title",
203062
- description: "Used to probe the cameras and pre-filled into each result so you can add it in one click. Assumes all cameras share these credentials.",
203032
+ description: "Assumes all cameras share these credentials.",
203063
203033
  descriptionKey: "provider-reolink:discoveryParams.s_credentials.description",
203064
203034
  columns: 2,
203065
203035
  fields: [{
@@ -203081,7 +203051,7 @@ function buildDiscoveryParamsFormSchema() {
203081
203051
  id: "scan",
203082
203052
  title: "Scan options",
203083
203053
  titleKey: "provider-reolink:discoveryParams.s_scan.title",
203084
- description: "Leave the network blank to scan the local subnet. To find cameras on a different subnet, enter its CIDR (e.g. 192.168.20.0/24).",
203054
+ description: "Leave blank to scan the local subnet; for another subnet enter its CIDR (e.g. 192.168.20.0/24).",
203085
203055
  descriptionKey: "provider-reolink:discoveryParams.s_scan.description",
203086
203056
  columns: 1,
203087
203057
  fields: [
@@ -203132,8 +203102,6 @@ function buildCreationFormSchema() {
203132
203102
  id: "credentials",
203133
203103
  title: "Credentials",
203134
203104
  titleKey: "provider-reolink:creation.s_credentials.title",
203135
- description: "Required for the autodetect probe — entered before the host so Test can run immediately.",
203136
- descriptionKey: "provider-reolink:creation.s_credentials.description",
203137
203105
  columns: 2,
203138
203106
  fields: [{
203139
203107
  type: "text",
@@ -203155,8 +203123,6 @@ function buildCreationFormSchema() {
203155
203123
  id: "connection",
203156
203124
  title: "Connection",
203157
203125
  titleKey: "provider-reolink:creation.s_connection.title",
203158
- description: "Click Test to auto-detect the device type (regular camera / NVR / battery / UDP-only). The detected type is then used at save time.",
203159
- descriptionKey: "provider-reolink:creation.s_connection.description",
203160
203126
  columns: 2,
203161
203127
  fields: [
203162
203128
  {
@@ -203165,7 +203131,7 @@ function buildCreationFormSchema() {
203165
203131
  label: "Connection mode",
203166
203132
  labelKey: "provider-reolink:creation.s_connection.transport.label",
203167
203133
  default: "auto",
203168
- description: "Auto: try TCP first, fall back to UDP — best for unknown devices. UDP is required for battery cameras behind NAT.",
203134
+ description: "Auto tries TCP, then UDP. Battery cameras behind NAT need UDP.",
203169
203135
  descriptionKey: "provider-reolink:creation.s_connection.transport.description",
203170
203136
  options: [
203171
203137
  {
@@ -203192,7 +203158,7 @@ function buildCreationFormSchema() {
203192
203158
  labelKey: "provider-reolink:creation.s_connection.host.label",
203193
203159
  required: true,
203194
203160
  placeholder: "192.168.10.100",
203195
- 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.",
203161
+ description: "In UDP-only mode leave blank and use the UID below.",
203196
203162
  descriptionKey: "provider-reolink:creation.s_connection.host.description",
203197
203163
  inputType: "text"
203198
203164
  },
@@ -203205,8 +203171,6 @@ function buildCreationFormSchema() {
203205
203171
  min: 1,
203206
203172
  max: 65535,
203207
203173
  step: 1,
203208
- description: "Baichuan port. Default 9000 — applies to TCP. Ignored for UDP transport.",
203209
- descriptionKey: "provider-reolink:creation.s_connection.port.description",
203210
203174
  showWhen: {
203211
203175
  field: "transport",
203212
203176
  notEquals: "udp"
@@ -203218,7 +203182,7 @@ function buildCreationFormSchema() {
203218
203182
  label: "Device UID",
203219
203183
  labelKey: "provider-reolink:creation.s_connection.uid.label",
203220
203184
  placeholder: "9527000XXXXXXXX",
203221
- description: "Required for battery / UDP cameras when not on the same LAN. Optional for local-direct UDP discovery and ignored for pure TCP.",
203185
+ description: "Needed for battery / UDP cameras that are not on the same LAN.",
203222
203186
  descriptionKey: "provider-reolink:creation.s_connection.uid.description",
203223
203187
  showWhen: {
203224
203188
  field: "transport",
@@ -203759,7 +203723,7 @@ function buildEmailPushSettingsSchema(recommendedHost) {
203759
203723
  id: "email-push",
203760
203724
  title: "Battery-cam Motion (Email/SMTP Push)",
203761
203725
  titleKey: "provider-reolink:emailPushSettings.s_email-push.title",
203762
- description: "Emulate an SMTP server that battery Reolink cameras push to on motion. Lets you capture motion from sleeping battery cams without polling them awake. Enable, then use \"Auto-configure email push\" on each battery camera.",
203726
+ description: "Lets battery cameras report motion by email without being woken.",
203763
203727
  descriptionKey: "provider-reolink:emailPushSettings.s_email-push.description",
203764
203728
  columns: 2,
203765
203729
  fields: [
@@ -203799,7 +203763,7 @@ function buildEmailPushSettingsSchema(recommendedHost) {
203799
203763
  id: "email-push-auth",
203800
203764
  title: "Email Push Authentication",
203801
203765
  titleKey: "provider-reolink:emailPushSettings.s_email-push-auth.title",
203802
- description: "AUTH credentials the camera must present. Reolink firmwares are more reliable with AUTH on. Random values are generated on first boot — re-run Auto-configure on cameras after changing them.",
203766
+ description: "Random values are generated on first boot; re-run Auto-configure on cameras after changing them.",
203803
203767
  descriptionKey: "provider-reolink:emailPushSettings.s_email-push-auth.description",
203804
203768
  columns: 2,
203805
203769
  fields: [
@@ -204008,7 +203972,7 @@ function buildBaichuanWebhookSettingsSchema(recommendedHost) {
204008
203972
  id: "baichuan-webhook",
204009
203973
  title: "Battery-cam Motion (HaCfg Webhook)",
204010
203974
  titleKey: "provider-reolink:baichuanWebhookSettings.s_baichuan-webhook.title",
204011
- description: "HTTP intake for Baichuan HaCfg wake/sleep push (cmd 806/807). Prefer this over SMTP when the camera firmware supports it — lower latency, no AUTH dance. Enable, then use \"Auto-configure HaCfg webhook\" on each battery camera (or set preference to Auto).",
203975
+ description: "Preferred over email push when the camera firmware supports it.",
204012
203976
  descriptionKey: "provider-reolink:baichuanWebhookSettings.s_baichuan-webhook.description",
204013
203977
  columns: 2,
204014
203978
  fields: [