@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.mjs CHANGED
@@ -28,7 +28,7 @@ import { URL as URL$1 } from "url";
28
28
  import { spawn as spawn$1 } from "node:child_process";
29
29
  import os, { tmpdir } from "node:os";
30
30
  import { createReadStream } from "node:fs";
31
- //#region ../types/dist/event-category-7pZEBmVg.mjs
31
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
32
32
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
33
33
  EventCategory["SystemBoot"] = "system.boot";
34
34
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -345,6 +345,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
345
345
  */
346
346
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
347
347
  /**
348
+ * A camera's motion source has fired constantly with no subject for an hour
349
+ * (motion duty or session count over the bar, zero detections) — it is not
350
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
351
+ * {@link PipelineMotionCalm}.
352
+ */
353
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
354
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
355
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
356
+ /**
348
357
  * Per-camera pipeline config was mutated by the orchestrator
349
358
  * (3-level settings change via `setAgentAddonDefaults` /
350
359
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -5451,7 +5460,7 @@ var ZodIssueCode = {
5451
5460
  var ZodFirstPartyTypeKind;
5452
5461
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5453
5462
  //#endregion
5454
- //#region ../types/dist/sleep-CueztlR1.mjs
5463
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5455
5464
  /**
5456
5465
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5457
5466
  * window to float samples (D455).
@@ -7984,7 +7993,7 @@ var EntryDescriptorSchema = object({
7984
7993
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7985
7994
  fields: record(string(), unknown())
7986
7995
  }).strict();
7987
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
7996
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7988
7997
  var RecordKindDeclarationSchema = object({
7989
7998
  database: _enum(RECORD_DATABASES).default("settings"),
7990
7999
  class: _enum(RECORD_CLASSES),
@@ -8003,14 +8012,6 @@ var RecordKindDeclarationSchema = object({
8003
8012
  secretPaths: array(string().min(1)).default([]),
8004
8013
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8005
8014
  secretArrayKeys: record(string(), string()).default({}),
8006
- /**
8007
- * RETIRED (D900): the legacy table a kind adopted from during the records
8008
- * migration. Nothing declares it any more and nothing reads it; the schema
8009
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8010
- * (an orphaned kind is never redeclared) and an addon built before the
8011
- * removal still sends it. Never set it.
8012
- */
8013
- adoptsFrom: string().min(1).optional(),
8014
8015
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8015
8016
  transactFamily: string().min(1).optional(),
8016
8017
  entry: EntryDescriptorSchema.optional()
@@ -13302,17 +13303,6 @@ object({
13302
13303
  createdAt: number(),
13303
13304
  updatedAt: number()
13304
13305
  });
13305
- object({
13306
- id: string(),
13307
- label: string(),
13308
- isAdmin: boolean().default(false),
13309
- allowedProviders: AllowedProviderSchema,
13310
- allowedDevices: AllowedDevicesSchema,
13311
- tokenHash: string(),
13312
- tokenPrefix: string(),
13313
- createdAt: number(),
13314
- lastUsedAt: number().optional()
13315
- });
13316
13306
  object({
13317
13307
  id: string(),
13318
13308
  userId: string(),
@@ -17294,16 +17284,36 @@ var RecordKindStateSchema = _enum([
17294
17284
  var DeclareKindResultSchema = object({
17295
17285
  kindId: number().int(),
17296
17286
  state: RecordKindStateSchema,
17297
- createdIndexes: array(string()),
17298
- /**
17299
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17300
- * it stays on the wire, null, because an addon built before the removal reads
17301
- * an ABSENT field as "adoption pending" and refuses to start.
17302
- */
17303
- adoptionPending: _null()
17287
+ createdIndexes: array(string())
17304
17288
  });
17305
17289
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17306
17290
  var SecretRefsList = array(string());
17291
+ /**
17292
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17293
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17294
+ */
17295
+ var RecordTransactOpSchema = discriminatedUnion("op", [
17296
+ object({
17297
+ op: literal("put"),
17298
+ kind: RecordKindNameSchema,
17299
+ record: RecordInputSchema,
17300
+ ifRev: number().int().min(0).optional()
17301
+ }),
17302
+ object({
17303
+ op: literal("patch"),
17304
+ kind: RecordKindNameSchema,
17305
+ id: RecordIdSchema,
17306
+ data: RecordBodySchema,
17307
+ at: number().int().nullable().optional(),
17308
+ expiresAt: number().int().nullable().optional(),
17309
+ ifRev: number().int().min(1).optional()
17310
+ }),
17311
+ object({
17312
+ op: literal("delete"),
17313
+ kind: RecordKindNameSchema,
17314
+ id: RecordIdSchema
17315
+ })
17316
+ ]);
17307
17317
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17308
17318
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17309
17319
  kind: "mutation",
@@ -17410,6 +17420,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17410
17420
  }), {
17411
17421
  kind: "mutation",
17412
17422
  auth: "admin"
17423
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17424
+ results: array(object({
17425
+ rev: number().int().nullable(),
17426
+ deleted: boolean()
17427
+ })),
17428
+ releasedRefs: SecretRefsList,
17429
+ secretRefs: SecretRefsList
17430
+ }), {
17431
+ kind: "mutation",
17432
+ auth: "admin"
17413
17433
  }), method(object({
17414
17434
  deviceId: number().int(),
17415
17435
  kinds: array(RecordKindNameSchema).optional()
@@ -43157,9 +43177,13 @@ var NcSystemEventKindSchema = _enum([
43157
43177
  "node-updating",
43158
43178
  "node-inference-unavailable",
43159
43179
  "detection-blind",
43180
+ "motion-noisy",
43181
+ "motion-calm",
43160
43182
  "recording-stalled",
43161
43183
  "recording-healthy",
43162
43184
  "recording-degraded",
43185
+ "device-attention-required",
43186
+ "device-attention-resolved",
43163
43187
  "storage-location-low",
43164
43188
  "storage-location-critical",
43165
43189
  "storage-location-ok",
@@ -48720,7 +48744,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
48720
48744
  modelId: string()
48721
48745
  }),
48722
48746
  object({ kind: literal("cpu-device") }),
48723
- object({ kind: literal("coral-untouched") }),
48724
48747
  object({ kind: literal("device-disabled") }),
48725
48748
  object({ kind: literal("device-unavailable") }),
48726
48749
  object({ kind: literal("node-offline") }),
@@ -48818,11 +48841,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
48818
48841
  kind: literal("detector-store-unreadable"),
48819
48842
  error: string()
48820
48843
  }),
48821
- object({
48822
- kind: literal("coral-enabled"),
48823
- nodeId: string(),
48824
- deviceKey: string()
48825
- }),
48826
48844
  object({
48827
48845
  kind: literal("custom-pin-kept"),
48828
48846
  nodeId: string(),
@@ -57005,6 +57023,16 @@ var DishwasherStatusSchema = object({
57005
57023
  powerState: string().nullable(),
57006
57024
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
57007
57025
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
57026
+ /**
57027
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
57028
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
57029
+ * when none is reported. A cleared reminder is not an unknown one.
57030
+ */
57031
+ filterCleaningDue: boolean().nullable(),
57032
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
57033
+ machineCareDue: boolean().nullable(),
57034
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
57035
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
57008
57036
  /** Option states: null when the appliance does not expose the option or has not said. */
57009
57037
  halfLoad: boolean().nullable(),
57010
57038
  hygienePlus: boolean().nullable(),
@@ -66225,16 +66253,6 @@ var UpdateUserInputSchema = object({
66225
66253
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
66226
66254
  scopes: array(TokenScopeSchema).optional()
66227
66255
  });
66228
- var ApiKeySummarySchema = object({
66229
- id: string(),
66230
- label: string(),
66231
- isAdmin: boolean().default(false),
66232
- allowedProviders: union([array(string()), literal("*")]).optional(),
66233
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
66234
- tokenPrefix: string(),
66235
- createdAt: number(),
66236
- lastUsedAt: number().optional()
66237
- });
66238
66256
  var OauthSessionSummarySchema = object({
66239
66257
  id: string(),
66240
66258
  userId: string(),
@@ -66256,8 +66274,7 @@ var TotpStatusSchema = object({
66256
66274
  confirmedAt: number().nullable()
66257
66275
  });
66258
66276
  /**
66259
- * user-management — singleton capability for user accounts and the
66260
- * legacy API-key rows.
66277
+ * user-management — singleton capability for user accounts.
66261
66278
  *
66262
66279
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
66263
66280
  * — the subset check on `setUserScopes` is moot
@@ -66313,10 +66330,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
66313
66330
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
66314
66331
  kind: "mutation",
66315
66332
  access: "view"
66316
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
66317
- kind: "mutation",
66318
- auth: "admin",
66319
- access: "delete"
66320
66333
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
66321
66334
  kind: "mutation",
66322
66335
  auth: "admin",
@@ -75787,6 +75800,12 @@ Object.freeze({
75787
75800
  addonId: null,
75788
75801
  access: "view"
75789
75802
  },
75803
+ "records.transact": {
75804
+ capName: "records",
75805
+ capScope: "system",
75806
+ addonId: null,
75807
+ access: "create"
75808
+ },
75790
75809
  "sceneMonitor.captureReference": {
75791
75810
  capName: "scene-monitor",
75792
75811
  capScope: "device",
@@ -77119,12 +77138,6 @@ Object.freeze({
77119
77138
  addonId: null,
77120
77139
  access: "view"
77121
77140
  },
77122
- "userManagement.listApiKeys": {
77123
- capName: "user-management",
77124
- capScope: "system",
77125
- addonId: null,
77126
- access: "view"
77127
- },
77128
77141
  "userManagement.listExternalIdentities": {
77129
77142
  capName: "user-management",
77130
77143
  capScope: "system",
@@ -77179,12 +77192,6 @@ Object.freeze({
77179
77192
  addonId: null,
77180
77193
  access: "create"
77181
77194
  },
77182
- "userManagement.revokeApiKey": {
77183
- capName: "user-management",
77184
- capScope: "system",
77185
- addonId: null,
77186
- access: "delete"
77187
- },
77188
77195
  "userManagement.revokeOauthSession": {
77189
77196
  capName: "user-management",
77190
77197
  capScope: "system",
@@ -80701,9 +80708,13 @@ new Map(Object.entries({
80701
80708
  "stream-online": "device-events",
80702
80709
  "stream-offline": "device-events",
80703
80710
  "detection-blind": "device-events",
80711
+ "motion-noisy": "device-events",
80712
+ "motion-calm": "device-events",
80704
80713
  "recording-stalled": "device-events",
80705
80714
  "recording-healthy": "device-events",
80706
80715
  "recording-degraded": "device-events",
80716
+ "device-attention-required": "device-events",
80717
+ "device-attention-resolved": "device-events",
80707
80718
  "node-online": "system",
80708
80719
  "node-offline": "system",
80709
80720
  "node-restarting": "system",
@@ -80786,6 +80797,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80786
80797
  label: "Detecting nothing",
80787
80798
  kinds: ["detection-blind"]
80788
80799
  },
80800
+ {
80801
+ id: "motion-noise",
80802
+ family: "device-events",
80803
+ label: "Motion without a subject",
80804
+ kinds: ["motion-noisy", "motion-calm"]
80805
+ },
80789
80806
  {
80790
80807
  id: "recording",
80791
80808
  family: "device-events",
@@ -80796,6 +80813,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80796
80813
  "recording-degraded"
80797
80814
  ]
80798
80815
  },
80816
+ {
80817
+ id: "device-attention",
80818
+ family: "device-events",
80819
+ label: "Needs attention",
80820
+ kinds: ["device-attention-required", "device-attention-resolved"]
80821
+ },
80799
80822
  {
80800
80823
  id: "nodes",
80801
80824
  family: "system",
@@ -80935,6 +80958,7 @@ var ALERT_EPISODE = [
80935
80958
  "alert-error",
80936
80959
  "alert-critical-resolved"
80937
80960
  ];
80961
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
80938
80962
  var UPDATES = [
80939
80963
  "addon-update-available",
80940
80964
  "server-update-available",
@@ -80964,9 +80988,12 @@ var DEVICE_EVENTS = [
80964
80988
  "stream-online",
80965
80989
  "stream-offline",
80966
80990
  "detection-blind",
80991
+ "motion-noisy",
80992
+ "motion-calm",
80967
80993
  "recording-stalled",
80968
80994
  "recording-healthy",
80969
80995
  "recording-degraded",
80996
+ ...DEVICE_ATTENTION,
80970
80997
  ...ALARM
80971
80998
  ];
80972
80999
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -81134,7 +81161,9 @@ var STATE_SUMMARY_VARS = [
81134
81161
  [...RULE_TEXT],
81135
81162
  [...RULE_TEXT],
81136
81163
  [...RULE_TEXT],
81137
- ([...RULE_TEXT], [...ALERT_EPISODE]),
81164
+ [...RULE_TEXT],
81165
+ [...RULE_TEXT],
81166
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
81138
81167
  [...RULE_TEXT],
81139
81168
  [...RULE_TEXT],
81140
81169
  [...RULE_TEXT],
@@ -81156,11 +81185,11 @@ var STATE_SUMMARY_VARS = [
81156
81185
  [...RULE_TEXT],
81157
81186
  [...RULE_TEXT],
81158
81187
  [...RULE_TEXT],
81188
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
81159
81189
  ([...RULE_TEXT], [...ALERT_EPISODE]),
81190
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
81160
81191
  ([...RULE_TEXT], [...ALERT_EPISODE]),
81161
- ([...RULE_TEXT], [...ALERT_EPISODE]),
81162
- ([...RULE_TEXT], [...ALERT_EPISODE]),
81163
- ([...RULE_TEXT], [...ALERT_EPISODE]),
81192
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
81164
81193
  [...RULE_TEXT],
81165
81194
  [...RULE_TEXT],
81166
81195
  [...RULE_TEXT],
@@ -81236,6 +81265,15 @@ new Map([
81236
81265
  snapshotLabel: "Tanks low or full now",
81237
81266
  snapshotSection: "tanks"
81238
81267
  },
81268
+ {
81269
+ id: "motion-noise",
81270
+ family: "device-events",
81271
+ label: "Motion without a subject (constant / calm again)",
81272
+ bad: ["motion-noisy"],
81273
+ recovery: ["motion-calm"],
81274
+ snapshotLabel: "Cameras with constant motion now",
81275
+ snapshotSection: null
81276
+ },
81239
81277
  {
81240
81278
  id: "recording-health",
81241
81279
  family: "device-events",
@@ -81245,6 +81283,15 @@ new Map([
81245
81283
  snapshotLabel: "Recordings stalled now",
81246
81284
  snapshotSection: null
81247
81285
  },
81286
+ {
81287
+ id: "device-attention",
81288
+ family: "device-events",
81289
+ label: "Device needs attention (raised / resolved)",
81290
+ bad: ["device-attention-required"],
81291
+ recovery: ["device-attention-resolved"],
81292
+ snapshotLabel: "Devices needing attention now",
81293
+ snapshotSection: null
81294
+ },
81248
81295
  {
81249
81296
  id: "node-connectivity",
81250
81297
  family: "system",
@@ -188569,8 +188616,8 @@ var CLIP_REFRESH_SECTION_ID = "clip-catalog-refresh";
188569
188616
  * settings nobody could reason about. So the difference is in the operator's
188570
188617
  * own text, at both levels, not only in a record.
188571
188618
  */
188572
- 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.";
188573
- 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.";
188619
+ 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.";
188620
+ 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.";
188574
188621
  /**
188575
188622
  * The addon-level (global) default. Per-camera overrides live on the device,
188576
188623
  * under the SAME key, and a device that sets nothing — or resets — resolves to
@@ -188580,7 +188627,7 @@ function buildClipRefreshSettingsSchema() {
188580
188627
  return { sections: [{
188581
188628
  id: CLIP_REFRESH_SECTION_ID,
188582
188629
  title: "Clip catalog refresh",
188583
- 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.",
188630
+ description: "Default for every camera; a camera can override it in its Recording settings.",
188584
188631
  columns: 1,
188585
188632
  fields: [{
188586
188633
  type: "number",
@@ -188610,7 +188657,7 @@ function buildClipRefreshDeviceSection(input) {
188610
188657
  id: CLIP_REFRESH_SECTION_ID,
188611
188658
  tab: "recording",
188612
188659
  title: "Clip catalog refresh",
188613
- 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.",
188660
+ description: "Leave the interval empty to use the default from the Reolink addon settings.",
188614
188661
  columns: 1,
188615
188662
  fields: [{
188616
188663
  type: "number",
@@ -188889,7 +188936,7 @@ function buildSnapshotFreshnessSection(cache, opts) {
188889
188936
  tab: "advanced",
188890
188937
  title: "Snapshot freshness",
188891
188938
  titleKey: "provider-reolink:snapshotFreshnessSection.s_snapshotFreshness.title",
188892
- 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.",
188939
+ description: "Groups without a stamp are of unknown age, not fresh.",
188893
188940
  descriptionKey: "provider-reolink:snapshotFreshnessSection.s_snapshotFreshness.description",
188894
188941
  columns: 1,
188895
188942
  fields: [{
@@ -189920,7 +189967,7 @@ var BatteryHourlyRefresh = class {
189920
189967
  //#endregion
189921
189968
  //#region src/battery-refresh-settings.ts
189922
189969
  var BATTERY_REFRESH_SECTION_ID = "battery-refresh";
189923
- 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).`;
189970
+ var BATTERY_REFRESH_MINUTES_DESCRIPTION = "A camera that slept the whole window is woken once to refresh. 0 turns the scheduled refresh off.";
189924
189971
  /** Battery cameras only: a mains camera keeps its facts fresh on its own socket. */
189925
189972
  function buildBatteryRefreshDeviceSection(input) {
189926
189973
  if (!input.isBattery) return [];
@@ -189928,7 +189975,6 @@ function buildBatteryRefreshDeviceSection(input) {
189928
189975
  id: BATTERY_REFRESH_SECTION_ID,
189929
189976
  tab: "general",
189930
189977
  title: "Scheduled refresh",
189931
- description: "How often this battery camera is guaranteed to have been read, so a battery level never goes stale unseen.",
189932
189978
  columns: 1,
189933
189979
  fields: [{
189934
189980
  type: "number",
@@ -190022,7 +190068,7 @@ async function refreshSnapshotCacheOnce(input) {
190022
190068
  */
190023
190069
  var CH_BAICHUAN = declareLogChannel({
190024
190070
  name: "provider-reolink.baichuan",
190025
- 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.",
190071
+ description: "Every Baichuan protocol frame this camera sends and receives. Loud: arm it for one camera and a short window.",
190026
190072
  defaultLevel: "info",
190027
190073
  perDevice: true
190028
190074
  });
@@ -190037,7 +190083,7 @@ var CH_BAICHUAN = declareLogChannel({
190037
190083
  */
190038
190084
  var CH_HANDSHAKE = declareLogChannel({
190039
190085
  name: "provider-reolink.handshake",
190040
- 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.",
190086
+ description: "Login and socket lifecycle for this camera. Arm it when a camera looks present but answers nothing.",
190041
190087
  defaultLevel: "info",
190042
190088
  perDevice: true
190043
190089
  });
@@ -190446,7 +190492,7 @@ function buildOsdSection(snapshot, values, opts) {
190446
190492
  tab: "image",
190447
190493
  title: "OSD overlay",
190448
190494
  titleKey: "provider-reolink:osdSection.s_osd.title",
190449
- 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.",
190495
+ description: "An overlay the camera holds somewhere else keeps that placement unless a corner is chosen.",
190450
190496
  descriptionKey: "provider-reolink:osdSection.s_osd.description",
190451
190497
  columns: 2,
190452
190498
  fields: [
@@ -190458,8 +190504,6 @@ function buildOsdSection(snapshot, values, opts) {
190458
190504
  key: "osdChannelName",
190459
190505
  label: "Channel name",
190460
190506
  labelKey: "provider-reolink:fields.osdChannelName.label",
190461
- description: "Text shown in the channel-name overlay.",
190462
- descriptionKey: "provider-reolink:fields.osdChannelName.description",
190463
190507
  default: values.osdChannelName,
190464
190508
  placeholder: "Front door"
190465
190509
  },
@@ -190943,7 +190987,7 @@ var SirenAccessory = class extends BaseDevice {
190943
190987
  id: "siren",
190944
190988
  title: "Siren",
190945
190989
  titleKey: "provider-reolink:schema.s_siren.title",
190946
- description: "Tone duration when triggered. Set to 0 for \"play until turned off\"; positive values pulse for that many seconds.",
190990
+ description: "0 = play until turned off.",
190947
190991
  descriptionKey: "provider-reolink:schema.s_siren.description",
190948
190992
  columns: 1,
190949
190993
  fields: [{
@@ -190951,8 +190995,6 @@ var SirenAccessory = class extends BaseDevice {
190951
190995
  key: "sirenDurationS",
190952
190996
  label: "Default duration (seconds)",
190953
190997
  labelKey: "provider-reolink:schema.s_siren.sirenDurationS.label",
190954
- description: "Forwarded to `setSiren(on=true, duration)` (cmd_id 30) when the operator flips the switch.",
190955
- descriptionKey: "provider-reolink:schema.s_siren.sirenDurationS.description",
190956
190998
  default: 0,
190957
190999
  min: 0,
190958
191000
  max: 300,
@@ -190962,16 +191004,12 @@ var SirenAccessory = class extends BaseDevice {
190962
191004
  id: "motion-siren",
190963
191005
  title: "Motion-triggered siren",
190964
191006
  titleKey: "provider-reolink:schema.s_motion-siren.title",
190965
- 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.",
190966
- descriptionKey: "provider-reolink:schema.s_motion-siren.description",
190967
191007
  columns: 1,
190968
191008
  fields: [{
190969
191009
  type: "select",
190970
191010
  key: "motionSirenDetectType",
190971
191011
  label: "Detection classes",
190972
191012
  labelKey: "provider-reolink:schema.s_motion-siren.motionSirenDetectType.label",
190973
- description: "Object/motion classes that arm the siren. `MD` = generic motion detection.",
190974
- descriptionKey: "provider-reolink:schema.s_motion-siren.motionSirenDetectType.description",
190975
191013
  options: SIREN_DETECT_TYPE_CHOICES.map((v) => ({
190976
191014
  value: v,
190977
191015
  label: v.replace(/,/g, " + ").replace(/_/g, "+")
@@ -191435,16 +191473,12 @@ var FloodlightAccessory = class extends BaseDevice {
191435
191473
  id: "motion-floodlight",
191436
191474
  title: "Motion-triggered floodlight",
191437
191475
  titleKey: "provider-reolink:schema.s_motion-floodlight.title",
191438
- 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.",
191439
- descriptionKey: "provider-reolink:schema.s_motion-floodlight.description",
191440
191476
  columns: 2,
191441
191477
  fields: [{
191442
191478
  type: "number",
191443
191479
  key: "motionLightDurationS",
191444
191480
  label: "Light duration (s)",
191445
191481
  labelKey: "provider-reolink:schema.s_motion-floodlight.motionLightDurationS.label",
191446
- description: "Seconds the floodlight stays lit after a motion event. Reolink range 1..600s.",
191447
- descriptionKey: "provider-reolink:schema.s_motion-floodlight.motionLightDurationS.description",
191448
191482
  min: 1,
191449
191483
  max: 600,
191450
191484
  step: 1,
@@ -191454,8 +191488,6 @@ var FloodlightAccessory = class extends BaseDevice {
191454
191488
  key: "motionLightDetectType",
191455
191489
  label: "Detection classes",
191456
191490
  labelKey: "provider-reolink:schema.s_motion-floodlight.motionLightDetectType.label",
191457
- description: "Object classes that turn the floodlight on. Composed values (e.g. \"people,vehicle\") fire when ANY listed class detects.",
191458
- descriptionKey: "provider-reolink:schema.s_motion-floodlight.motionLightDetectType.description",
191459
191491
  options: FLOODLIGHT_DETECT_TYPE_CHOICES.map((v) => ({
191460
191492
  value: v,
191461
191493
  label: v.replace(/,/g, " + ").replace(/_/g, "+")
@@ -191695,8 +191727,6 @@ var PirAccessory = class extends BaseDevice {
191695
191727
  id: "pir",
191696
191728
  title: "PIR sensor",
191697
191729
  titleKey: "provider-reolink:schema.s_pir.title",
191698
- description: "Hardware passive-infrared trigger configuration. Pushed via cmd_id 153 (SetPirInfo).",
191699
- descriptionKey: "provider-reolink:schema.s_pir.description",
191700
191730
  columns: 2,
191701
191731
  fields: [
191702
191732
  {
@@ -191704,8 +191734,6 @@ var PirAccessory = class extends BaseDevice {
191704
191734
  key: "pirSensitive",
191705
191735
  label: "Sensitivity",
191706
191736
  labelKey: "provider-reolink:schema.s_pir.pirSensitive.label",
191707
- description: "Higher value → triggers on smaller motion. Most cameras max at 100.",
191708
- descriptionKey: "provider-reolink:schema.s_pir.pirSensitive.description",
191709
191737
  min: 1,
191710
191738
  max: 100,
191711
191739
  step: 1,
@@ -191717,7 +191745,6 @@ var PirAccessory = class extends BaseDevice {
191717
191745
  key: "pirIntervalS",
191718
191746
  label: "Cooldown (seconds)",
191719
191747
  labelKey: "provider-reolink:schema.s_pir.pirIntervalS.label",
191720
- description: `Minimum delay between consecutive PIR triggers. Reolink app range 5..${intervalMax}s; firmware clamps on push.`,
191721
191748
  min: 5,
191722
191749
  max: intervalMax,
191723
191750
  step: 1,
@@ -191730,8 +191757,6 @@ var PirAccessory = class extends BaseDevice {
191730
191757
  key: "pirReduceAlarm",
191731
191758
  label: "Reduce false alarms",
191732
191759
  labelKey: "provider-reolink:schema.s_pir.pirReduceAlarm.label",
191733
- description: "Trades detection range for fewer false positives. Maps to firmware `reduceAlarm` flag.",
191734
- descriptionKey: "provider-reolink:schema.s_pir.pirReduceAlarm.description",
191735
191760
  ...typeof reduceAlarm === "boolean" ? { default: reduceAlarm } : {},
191736
191761
  style: "switch",
191737
191762
  span: 2
@@ -193280,8 +193305,6 @@ function buildSessionsTabSections(snap, opts) {
193280
193305
  return [{
193281
193306
  id: "sessions-status",
193282
193307
  title: opts.title ?? "Sessions",
193283
- description: "Diagnostics for the Baichuan control channel. Auto-refreshes when older than 1 minute; click Refresh to force.",
193284
- descriptionKey: "provider-reolink:sessionsTabSections.s_sessions-status.description",
193285
193308
  tab: opts.tabId,
193286
193309
  order: 0,
193287
193310
  columns: 1,
@@ -193299,8 +193322,6 @@ function buildSessionsTabSections(snap, opts) {
193299
193322
  key: "sessionsOnlineUsers",
193300
193323
  label: "Online users (firmware)",
193301
193324
  labelKey: "provider-reolink:sessionsTabSections.s_sessions-status.sessionsOnlineUsers.label",
193302
- description: "Active user sessions reported by the device (cmd_id 145). Includes other admins, mobile app, NVR linkups.",
193303
- descriptionKey: "provider-reolink:sessionsTabSections.s_sessions-status.sessionsOnlineUsers.description",
193304
193325
  columns: [
193305
193326
  {
193306
193327
  key: "userName",
@@ -193343,8 +193364,6 @@ function buildSessionsTabSections(snap, opts) {
193343
193364
  key: "sessionsSocketPool",
193344
193365
  label: "Our socket pool",
193345
193366
  labelKey: "provider-reolink:sessionsTabSections.s_sessions-status.sessionsSocketPool.label",
193346
- description: "Open Baichuan TCP/UDP sockets this process holds for the device. One row per pool tag.",
193347
- descriptionKey: "provider-reolink:sessionsTabSections.s_sessions-status.sessionsSocketPool.description",
193348
193367
  columns: [{
193349
193368
  key: "tag",
193350
193369
  label: "Tag",
@@ -193365,8 +193384,6 @@ function buildSessionsTabSections(snap, opts) {
193365
193384
  key: "sessionsDedicated",
193366
193385
  label: "Dedicated lib sessions",
193367
193386
  labelKey: "provider-reolink:sessionsTabSections.s_sessions-status.sessionsDedicated.label",
193368
- description: "Internal lib-side dedicated sessions (streaming/talk channels). Older lib versions leave this list empty.",
193369
- descriptionKey: "provider-reolink:sessionsTabSections.s_sessions-status.sessionsDedicated.description",
193370
193387
  columns: [{
193371
193388
  key: "key",
193372
193389
  label: "Session key",
@@ -195751,7 +195768,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
195751
195768
  tab: "motion",
195752
195769
  title: "Battery motion (sleep push)",
195753
195770
  titleKey: "provider-reolink:emailPushSection.s_sleep-push.title",
195754
- 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.",
195771
+ description: "Prefer the HaCfg webhook when the firmware supports it; arm only one path.",
195755
195772
  descriptionKey: "provider-reolink:emailPushSection.s_sleep-push.description",
195756
195773
  columns: 1,
195757
195774
  fields: [
@@ -195817,7 +195834,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
195817
195834
  tab: "email",
195818
195835
  title: "SMTP server",
195819
195836
  titleKey: "provider-reolink:emailTabSections.s_email-smtp.title",
195820
- 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.",
195837
+ description: "Leave the password blank to keep the current one.",
195821
195838
  descriptionKey: "provider-reolink:emailTabSections.s_email-smtp.description",
195822
195839
  columns: 2,
195823
195840
  fields: [
@@ -195872,8 +195889,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
195872
195889
  tab: "email",
195873
195890
  title: "Recipients",
195874
195891
  titleKey: "provider-reolink:emailTabSections.s_email-recipients.title",
195875
- description: "Up to three recipient addresses the camera sends motion mail to.",
195876
- descriptionKey: "provider-reolink:emailTabSections.s_email-recipients.description",
195877
195892
  columns: 1,
195878
195893
  fields: [
195879
195894
  {
@@ -195902,8 +195917,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
195902
195917
  tab: "email",
195903
195918
  title: "Alarm schedule",
195904
195919
  titleKey: "provider-reolink:emailTabSections.s_email-schedule.title",
195905
- description: "Master enable for the camera's email alarm schedule (EmailTask).",
195906
- descriptionKey: "provider-reolink:emailTabSections.s_email-schedule.description",
195907
195920
  columns: 1,
195908
195921
  fields: [{
195909
195922
  type: "boolean",
@@ -199779,7 +199792,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
199779
199792
  tab: "general",
199780
199793
  title: "Camera data",
199781
199794
  titleKey: "provider-reolink:schema.s_driver-refresh.title",
199782
- 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.",
199795
+ description: "Wakes a sleeping camera and re-reads everything; no other read here wakes it.",
199783
199796
  descriptionKey: "provider-reolink:schema.s_driver-refresh.description",
199784
199797
  columns: 1,
199785
199798
  fields: [{
@@ -199798,8 +199811,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
199798
199811
  tab: "general",
199799
199812
  title: "Connection",
199800
199813
  titleKey: "provider-reolink:schema.s_connection.title",
199801
- description: "Baichuan protocol connection settings.",
199802
- descriptionKey: "provider-reolink:schema.s_connection.description",
199803
199814
  columns: 2,
199804
199815
  fields: [
199805
199816
  {
@@ -199842,7 +199853,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
199842
199853
  tab: "network",
199843
199854
  title: "Service ports",
199844
199855
  titleKey: "provider-reolink:schema.s_network-ports.title",
199845
- 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.",
199856
+ description: "Changing a port breaks existing URLs for that protocol.",
199846
199857
  descriptionKey: "provider-reolink:schema.s_network-ports.description",
199847
199858
  columns: 2,
199848
199859
  fields: [
@@ -199943,8 +199954,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
199943
199954
  tab: "network",
199944
199955
  title: "Time / NTP",
199945
199956
  titleKey: "provider-reolink:schema.s_time-ntp.title",
199946
- 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.",
199947
- descriptionKey: "provider-reolink:schema.s_time-ntp.description",
199948
199957
  columns: 2,
199949
199958
  fields: [
199950
199959
  {
@@ -199952,8 +199961,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
199952
199961
  key: "timeZoneId",
199953
199962
  label: "Timezone",
199954
199963
  labelKey: "provider-reolink:schema.s_time-ntp.timeZoneId.label",
199955
- 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.",
199956
- descriptionKey: "provider-reolink:schema.s_time-ntp.timeZoneId.description",
199957
199964
  default: this.config.get("timeZoneId") ?? reolinkTimeZoneToIana(this.config.get("deviceCache")?.systemGeneralSnapshot?.timeZone) ?? "",
199958
199965
  span: 2
199959
199966
  },
@@ -200002,16 +200009,12 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200002
200009
  tab: "motion",
200003
200010
  title: "On-camera motion (MdAlarm)",
200004
200011
  titleKey: "provider-reolink:schema.s_motion.title",
200005
- 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.",
200006
- descriptionKey: "provider-reolink:schema.s_motion.description",
200007
200012
  columns: 2,
200008
200013
  fields: [{
200009
200014
  type: "boolean",
200010
200015
  key: "motionEnabled",
200011
200016
  label: "Motion detection",
200012
200017
  labelKey: "provider-reolink:schema.s_motion.motionEnabled.label",
200013
- description: "Master switch for the camera's on-board motion detector. Disabling stops the camera from emitting motion events on the alarm channel.",
200014
- descriptionKey: "provider-reolink:schema.s_motion.motionEnabled.description",
200015
200018
  default: motionSnap.enabled ?? true,
200016
200019
  style: "switch",
200017
200020
  span: 2
@@ -200020,8 +200023,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200020
200023
  key: "motionSensitivity",
200021
200024
  label: "Sensitivity",
200022
200025
  labelKey: "provider-reolink:schema.s_motion.motionSensitivity.label",
200023
- description: "Higher = triggers on smaller motion. Reolink user-facing range 1..50.",
200024
- descriptionKey: "provider-reolink:schema.s_motion.motionSensitivity.description",
200025
200026
  min: 1,
200026
200027
  max: 50,
200027
200028
  step: 1,
@@ -200036,8 +200037,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200036
200037
  tab: "motion",
200037
200038
  title: "AI detection sensitivity",
200038
200039
  titleKey: "provider-reolink:schema.s_ai-sensitivity.title",
200039
- 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.",
200040
- descriptionKey: "provider-reolink:schema.s_ai-sensitivity.description",
200041
200040
  columns: 2,
200042
200041
  fields: [
200043
200042
  [
@@ -200106,7 +200105,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200106
200105
  type: "slider",
200107
200106
  key: stayKey,
200108
200107
  label: `${label} stay time (s)`,
200109
- description: "Seconds the camera keeps the AI alarm asserted after the object leaves frame.",
200110
200108
  min: 0,
200111
200109
  max: 600,
200112
200110
  step: 1,
@@ -200169,8 +200167,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200169
200167
  tab: "image",
200170
200168
  title: "Image",
200171
200169
  titleKey: "provider-reolink:schema.s_image.title",
200172
- 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.",
200173
- descriptionKey: "provider-reolink:schema.s_image.description",
200174
200170
  columns: 2,
200175
200171
  fields: [
200176
200172
  {
@@ -200241,24 +200237,18 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200241
200237
  tab: "image",
200242
200238
  title: "Advanced (ISP)",
200243
200239
  titleKey: "provider-reolink:schema.s_isp.title",
200244
- description: "Day/Night + exposure + HDR. Pushed via `SetIsp` (cmd_id 25). The day/night threshold uses cmd_id 297 (DayNightThreshold).",
200245
- descriptionKey: "provider-reolink:schema.s_isp.description",
200246
200240
  columns: 2,
200247
200241
  fields: [{
200248
200242
  type: "text",
200249
200243
  key: "ispDayNight",
200250
200244
  label: "Day/Night mode",
200251
200245
  labelKey: "provider-reolink:schema.s_isp.ispDayNight.label",
200252
- description: "Camera-specific values — common: `auto`, `color`, `blackAndWhite`. The driver normalizes case before push.",
200253
- descriptionKey: "provider-reolink:schema.s_isp.ispDayNight.description",
200254
200246
  default: imgSnap.dayNight ?? "auto"
200255
200247
  }, {
200256
200248
  type: "text",
200257
200249
  key: "ispExposure",
200258
200250
  label: "Exposure",
200259
200251
  labelKey: "provider-reolink:schema.s_isp.ispExposure.label",
200260
- description: "Common values: `auto`, `manual`. Lowercased before push.",
200261
- descriptionKey: "provider-reolink:schema.s_isp.ispExposure.description",
200262
200252
  default: "auto"
200263
200253
  }]
200264
200254
  }] : [],
@@ -200267,8 +200257,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200267
200257
  tab: "image",
200268
200258
  title: "IR + status LED",
200269
200259
  titleKey: "provider-reolink:schema.s_ir-lights.title",
200270
- 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.",
200271
- descriptionKey: "provider-reolink:schema.s_ir-lights.description",
200272
200260
  columns: 2,
200273
200261
  fields: [
200274
200262
  {
@@ -200300,7 +200288,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200300
200288
  key: "irLightsBrightness",
200301
200289
  label: "IR brightness",
200302
200290
  labelKey: "provider-reolink:schema.s_ir-lights.irLightsBrightness.label",
200303
- description: "Only applied when the camera advertises programmable IR brightness. 0..255 raw range; many models clamp to 0..100.",
200291
+ description: "Only applied when the camera supports adjustable IR brightness.",
200304
200292
  descriptionKey: "provider-reolink:schema.s_ir-lights.irLightsBrightness.description",
200305
200293
  min: 0,
200306
200294
  max: 255,
@@ -200314,8 +200302,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200314
200302
  key: "statusLedEnabled",
200315
200303
  label: "Status LED",
200316
200304
  labelKey: "provider-reolink:schema.s_ir-lights.statusLedEnabled.label",
200317
- description: "The visible status/power LED on the camera body. Pushed via `SetIrLights` (cmd_id 209) as `lightState`.",
200318
- descriptionKey: "provider-reolink:schema.s_ir-lights.statusLedEnabled.description",
200319
200305
  default: cache?.ledSnapshot?.statusEnabled ?? true,
200320
200306
  style: "switch",
200321
200307
  span: cache?.ledSnapshot?.doorbellSupported === true ? 1 : 2
@@ -200325,8 +200311,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200325
200311
  key: "doorbellLedEnabled",
200326
200312
  label: "Doorbell LED",
200327
200313
  labelKey: "provider-reolink:schema.s_ir-lights.doorbellLedEnabled.label",
200328
- description: "The doorbell button ring LED. Pushed via `SetIrLights` (cmd_id 209) as `doorbellLightState`.",
200329
- descriptionKey: "provider-reolink:schema.s_ir-lights.doorbellLedEnabled.description",
200330
200314
  default: cache?.ledSnapshot?.doorbellEnabled ?? true,
200331
200315
  style: "switch"
200332
200316
  }] : []
@@ -200341,7 +200325,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200341
200325
  tab: "image",
200342
200326
  title: "Auto focus",
200343
200327
  titleKey: "provider-reolink:schema.s_auto-focus.title",
200344
- 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.",
200328
+ description: "Disabling locks the lens at its current focus.",
200345
200329
  descriptionKey: "provider-reolink:schema.s_auto-focus.description",
200346
200330
  columns: 1,
200347
200331
  fields: [{
@@ -200358,8 +200342,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200358
200342
  tab: "audio",
200359
200343
  title: "Audio output",
200360
200344
  titleKey: "provider-reolink:schema.s_audio.title",
200361
- 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.",
200362
- descriptionKey: "provider-reolink:schema.s_audio.description",
200363
200345
  columns: 2,
200364
200346
  fields: [
200365
200347
  {
@@ -200379,7 +200361,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200379
200361
  key: "audioTalkAndReplyVolume",
200380
200362
  label: "Talk + reply volume",
200381
200363
  labelKey: "provider-reolink:schema.s_audio.audioTalkAndReplyVolume.label",
200382
- description: "Two-way audio + canned reply playback. Doorbell-only on most firmwares.",
200364
+ description: "Doorbell models only.",
200383
200365
  descriptionKey: "provider-reolink:schema.s_audio.audioTalkAndReplyVolume.description",
200384
200366
  min: 0,
200385
200367
  max: 100,
@@ -200393,7 +200375,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200393
200375
  key: "audioVisitorVolume",
200394
200376
  label: "Visitor volume",
200395
200377
  labelKey: "provider-reolink:schema.s_audio.audioVisitorVolume.label",
200396
- description: "Visitor / chime playback channel. Doorbell-only on most firmwares.",
200378
+ description: "Doorbell models only.",
200397
200379
  descriptionKey: "provider-reolink:schema.s_audio.audioVisitorVolume.description",
200398
200380
  min: 0,
200399
200381
  max: 100,
@@ -200410,8 +200392,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200410
200392
  tab: "audio",
200411
200393
  title: "Audio noise reduction",
200412
200394
  titleKey: "provider-reolink:schema.s_audio-noise.title",
200413
- 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).",
200414
- descriptionKey: "provider-reolink:schema.s_audio-noise.description",
200415
200395
  columns: 1,
200416
200396
  fields: [{
200417
200397
  type: "slider",
@@ -200433,7 +200413,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200433
200413
  tab: "audio",
200434
200414
  title: "Intercom",
200435
200415
  titleKey: "provider-reolink:schema.s_intercom.title",
200436
- description: "Push-to-talk pipeline tuning. Settings take effect on the next talk session — restart any active session for changes to apply.",
200416
+ description: "Changes apply to the next talk session.",
200437
200417
  descriptionKey: "provider-reolink:schema.s_intercom.description",
200438
200418
  columns: 2,
200439
200419
  fields: [
@@ -200442,7 +200422,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200442
200422
  key: "intercomBlocksPerPayload",
200443
200423
  label: "Blocks per payload",
200444
200424
  labelKey: "provider-reolink:schema.s_intercom.intercomBlocksPerPayload.label",
200445
- description: "Lower = lower latency (more sendAudio calls/sec). Higher = fewer calls, less per-call socket overhead. Range 1..8. Default 1 (lowest latency).",
200425
+ description: "Lower is lower latency, higher is fewer calls. Range 1..8.",
200446
200426
  descriptionKey: "provider-reolink:schema.s_intercom.intercomBlocksPerPayload.description",
200447
200427
  min: 1,
200448
200428
  max: 8,
@@ -200456,7 +200436,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200456
200436
  key: "intercomMaxBacklogMs",
200457
200437
  label: "Max backlog (ms)",
200458
200438
  labelKey: "provider-reolink:schema.s_intercom.intercomMaxBacklogMs.label",
200459
- 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.",
200439
+ description: "Higher is more stable on slow systems but adds latency. Range 20..5000.",
200460
200440
  descriptionKey: "provider-reolink:schema.s_intercom.intercomMaxBacklogMs.description",
200461
200441
  min: 20,
200462
200442
  max: 5e3,
@@ -200470,7 +200450,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200470
200450
  key: "intercomGain",
200471
200451
  label: "Output gain",
200472
200452
  labelKey: "provider-reolink:schema.s_intercom.intercomGain.label",
200473
- description: "Multiplier applied to PCM samples before IMA-ADPCM encode. 1.0 = neutral, 2.0 ≈ +6dB, 0.5 ≈ -6dB. Hard-clipped at int16 bounds.",
200453
+ description: "1.0 = neutral, 2.0 ≈ +6 dB, 0.5 ≈ -6 dB.",
200474
200454
  descriptionKey: "provider-reolink:schema.s_intercom.intercomGain.description",
200475
200455
  min: .1,
200476
200456
  max: 10,
@@ -200487,7 +200467,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200487
200467
  tab: "advanced",
200488
200468
  title: "Keyframe interval (GOP)",
200489
200469
  titleKey: "provider-reolink:schema.s_keyframe-gop.title",
200490
- 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.",
200470
+ description: "Lower = more keyframes (faster recovery, higher bitrate).",
200491
200471
  descriptionKey: "provider-reolink:schema.s_keyframe-gop.description",
200492
200472
  columns: 1,
200493
200473
  fields: [{
@@ -200508,8 +200488,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200508
200488
  tab: "advanced",
200509
200489
  title: "PIR detection",
200510
200490
  titleKey: "provider-reolink:schema.s_pir-reduce-alarm.title",
200511
- 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.",
200512
- descriptionKey: "provider-reolink:schema.s_pir-reduce-alarm.description",
200513
200491
  columns: 1,
200514
200492
  fields: [{
200515
200493
  type: "boolean",
@@ -200525,8 +200503,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200525
200503
  tab: "advanced",
200526
200504
  title: "Auto reboot",
200527
200505
  titleKey: "provider-reolink:schema.s_auto-reboot.title",
200528
- 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.",
200529
- descriptionKey: "provider-reolink:schema.s_auto-reboot.description",
200530
200506
  columns: 2,
200531
200507
  fields: [
200532
200508
  {
@@ -200615,7 +200591,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200615
200591
  tab: "advanced",
200616
200592
  title: "Debug",
200617
200593
  titleKey: "provider-reolink:schema.s_debug.title",
200618
- 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.",
200594
+ description: "Debug logging adds log volume; use it temporarily.",
200619
200595
  descriptionKey: "provider-reolink:schema.s_debug.description",
200620
200596
  columns: 1,
200621
200597
  fields: [{
@@ -200623,8 +200599,6 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200623
200599
  key: "debugGeneral",
200624
200600
  label: "General debug logs",
200625
200601
  labelKey: "provider-reolink:schema.s_debug.debugGeneral.label",
200626
- description: "Forwards `DebugOptions.general=true` — verbose lib protocol logs.",
200627
- descriptionKey: "provider-reolink:schema.s_debug.debugGeneral.description",
200628
200602
  default: false,
200629
200603
  style: "switch"
200630
200604
  }, {
@@ -200632,7 +200606,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
200632
200606
  key: "debugSocketLogs",
200633
200607
  label: "Socket trace categories",
200634
200608
  labelKey: "provider-reolink:schema.s_debug.debugSocketLogs.label",
200635
- description: "Per-area lib tracing. Pick only what you need; each adds log volume.",
200609
+ description: "Each area adds log volume.",
200636
200610
  descriptionKey: "provider-reolink:schema.s_debug.debugSocketLogs.description",
200637
200611
  default: [],
200638
200612
  options: [
@@ -202203,7 +202177,7 @@ var ReolinkHub = class ReolinkHub extends BaseDevice {
202203
202177
  tab: "general",
202204
202178
  title: "Connection",
202205
202179
  titleKey: "provider-reolink:hub.s_connection.title",
202206
- 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.",
202180
+ description: "Child cameras inherit these credentials.",
202207
202181
  descriptionKey: "provider-reolink:hub.s_connection.description",
202208
202182
  columns: 2,
202209
202183
  fields: [
@@ -202247,8 +202221,6 @@ var ReolinkHub = class ReolinkHub extends BaseDevice {
202247
202221
  tab: "general",
202248
202222
  title: "Hub identity",
202249
202223
  titleKey: "provider-reolink:hub.s_identity.title",
202250
- description: "Read-only summary from the autodetect probe. Channel count and model are persisted at first contact so the panel renders without re-probing.",
202251
- descriptionKey: "provider-reolink:hub.s_identity.description",
202252
202224
  columns: 2,
202253
202225
  fields: [{
202254
202226
  type: "text",
@@ -202271,7 +202243,7 @@ var ReolinkHub = class ReolinkHub extends BaseDevice {
202271
202243
  tab: "advanced",
202272
202244
  title: "Debug",
202273
202245
  titleKey: "provider-reolink:hub.s_debug.title",
202274
- 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.",
202246
+ description: "Debug logging adds log volume; use it temporarily.",
202275
202247
  descriptionKey: "provider-reolink:hub.s_debug.description",
202276
202248
  columns: 1,
202277
202249
  fields: [{
@@ -202279,8 +202251,6 @@ var ReolinkHub = class ReolinkHub extends BaseDevice {
202279
202251
  key: "debugGeneral",
202280
202252
  label: "General debug logs",
202281
202253
  labelKey: "provider-reolink:hub.s_debug.debugGeneral.label",
202282
- description: "Forwards `DebugOptions.general=true` — verbose lib protocol logs.",
202283
- descriptionKey: "provider-reolink:hub.s_debug.debugGeneral.description",
202284
202254
  default: false,
202285
202255
  style: "switch"
202286
202256
  }, {
@@ -202288,7 +202258,7 @@ var ReolinkHub = class ReolinkHub extends BaseDevice {
202288
202258
  key: "debugSocketLogs",
202289
202259
  label: "Socket trace categories",
202290
202260
  labelKey: "provider-reolink:hub.s_debug.debugSocketLogs.label",
202291
- description: "Per-area lib tracing. Pick only what you need; each adds log volume.",
202261
+ description: "Each area adds log volume.",
202292
202262
  descriptionKey: "provider-reolink:hub.s_debug.debugSocketLogs.description",
202293
202263
  default: [],
202294
202264
  options: [
@@ -203051,7 +203021,7 @@ function buildDiscoveryParamsFormSchema() {
203051
203021
  id: "credentials",
203052
203022
  title: "Credentials",
203053
203023
  titleKey: "provider-reolink:discoveryParams.s_credentials.title",
203054
- 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.",
203024
+ description: "Assumes all cameras share these credentials.",
203055
203025
  descriptionKey: "provider-reolink:discoveryParams.s_credentials.description",
203056
203026
  columns: 2,
203057
203027
  fields: [{
@@ -203073,7 +203043,7 @@ function buildDiscoveryParamsFormSchema() {
203073
203043
  id: "scan",
203074
203044
  title: "Scan options",
203075
203045
  titleKey: "provider-reolink:discoveryParams.s_scan.title",
203076
- 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).",
203046
+ description: "Leave blank to scan the local subnet; for another subnet enter its CIDR (e.g. 192.168.20.0/24).",
203077
203047
  descriptionKey: "provider-reolink:discoveryParams.s_scan.description",
203078
203048
  columns: 1,
203079
203049
  fields: [
@@ -203124,8 +203094,6 @@ function buildCreationFormSchema() {
203124
203094
  id: "credentials",
203125
203095
  title: "Credentials",
203126
203096
  titleKey: "provider-reolink:creation.s_credentials.title",
203127
- description: "Required for the autodetect probe — entered before the host so Test can run immediately.",
203128
- descriptionKey: "provider-reolink:creation.s_credentials.description",
203129
203097
  columns: 2,
203130
203098
  fields: [{
203131
203099
  type: "text",
@@ -203147,8 +203115,6 @@ function buildCreationFormSchema() {
203147
203115
  id: "connection",
203148
203116
  title: "Connection",
203149
203117
  titleKey: "provider-reolink:creation.s_connection.title",
203150
- description: "Click Test to auto-detect the device type (regular camera / NVR / battery / UDP-only). The detected type is then used at save time.",
203151
- descriptionKey: "provider-reolink:creation.s_connection.description",
203152
203118
  columns: 2,
203153
203119
  fields: [
203154
203120
  {
@@ -203157,7 +203123,7 @@ function buildCreationFormSchema() {
203157
203123
  label: "Connection mode",
203158
203124
  labelKey: "provider-reolink:creation.s_connection.transport.label",
203159
203125
  default: "auto",
203160
- description: "Auto: try TCP first, fall back to UDP — best for unknown devices. UDP is required for battery cameras behind NAT.",
203126
+ description: "Auto tries TCP, then UDP. Battery cameras behind NAT need UDP.",
203161
203127
  descriptionKey: "provider-reolink:creation.s_connection.transport.description",
203162
203128
  options: [
203163
203129
  {
@@ -203184,7 +203150,7 @@ function buildCreationFormSchema() {
203184
203150
  labelKey: "provider-reolink:creation.s_connection.host.label",
203185
203151
  required: true,
203186
203152
  placeholder: "192.168.10.100",
203187
- 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.",
203153
+ description: "In UDP-only mode leave blank and use the UID below.",
203188
203154
  descriptionKey: "provider-reolink:creation.s_connection.host.description",
203189
203155
  inputType: "text"
203190
203156
  },
@@ -203197,8 +203163,6 @@ function buildCreationFormSchema() {
203197
203163
  min: 1,
203198
203164
  max: 65535,
203199
203165
  step: 1,
203200
- description: "Baichuan port. Default 9000 — applies to TCP. Ignored for UDP transport.",
203201
- descriptionKey: "provider-reolink:creation.s_connection.port.description",
203202
203166
  showWhen: {
203203
203167
  field: "transport",
203204
203168
  notEquals: "udp"
@@ -203210,7 +203174,7 @@ function buildCreationFormSchema() {
203210
203174
  label: "Device UID",
203211
203175
  labelKey: "provider-reolink:creation.s_connection.uid.label",
203212
203176
  placeholder: "9527000XXXXXXXX",
203213
- description: "Required for battery / UDP cameras when not on the same LAN. Optional for local-direct UDP discovery and ignored for pure TCP.",
203177
+ description: "Needed for battery / UDP cameras that are not on the same LAN.",
203214
203178
  descriptionKey: "provider-reolink:creation.s_connection.uid.description",
203215
203179
  showWhen: {
203216
203180
  field: "transport",
@@ -203751,7 +203715,7 @@ function buildEmailPushSettingsSchema(recommendedHost) {
203751
203715
  id: "email-push",
203752
203716
  title: "Battery-cam Motion (Email/SMTP Push)",
203753
203717
  titleKey: "provider-reolink:emailPushSettings.s_email-push.title",
203754
- 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.",
203718
+ description: "Lets battery cameras report motion by email without being woken.",
203755
203719
  descriptionKey: "provider-reolink:emailPushSettings.s_email-push.description",
203756
203720
  columns: 2,
203757
203721
  fields: [
@@ -203791,7 +203755,7 @@ function buildEmailPushSettingsSchema(recommendedHost) {
203791
203755
  id: "email-push-auth",
203792
203756
  title: "Email Push Authentication",
203793
203757
  titleKey: "provider-reolink:emailPushSettings.s_email-push-auth.title",
203794
- 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.",
203758
+ description: "Random values are generated on first boot; re-run Auto-configure on cameras after changing them.",
203795
203759
  descriptionKey: "provider-reolink:emailPushSettings.s_email-push-auth.description",
203796
203760
  columns: 2,
203797
203761
  fields: [
@@ -204000,7 +203964,7 @@ function buildBaichuanWebhookSettingsSchema(recommendedHost) {
204000
203964
  id: "baichuan-webhook",
204001
203965
  title: "Battery-cam Motion (HaCfg Webhook)",
204002
203966
  titleKey: "provider-reolink:baichuanWebhookSettings.s_baichuan-webhook.title",
204003
- 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).",
203967
+ description: "Preferred over email push when the camera firmware supports it.",
204004
203968
  descriptionKey: "provider-reolink:baichuanWebhookSettings.s_baichuan-webhook.description",
204005
203969
  columns: 2,
204006
203970
  fields: [