@camstack/addon-provider-amcrest 0.2.152 → 0.2.154

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
@@ -35,7 +35,7 @@ let node_stream_promises = require("node:stream/promises");
35
35
  let node_child_process = require("node:child_process");
36
36
  require("node:zlib");
37
37
  let node_os = require("node:os");
38
- //#region ../types/dist/event-category-7pZEBmVg.mjs
38
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
39
39
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
40
40
  EventCategory["SystemBoot"] = "system.boot";
41
41
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -352,6 +352,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
352
352
  */
353
353
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
354
354
  /**
355
+ * A camera's motion source has fired constantly with no subject for an hour
356
+ * (motion duty or session count over the bar, zero detections) — it is not
357
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
358
+ * {@link PipelineMotionCalm}.
359
+ */
360
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
361
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
362
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
363
+ /**
355
364
  * Per-camera pipeline config was mutated by the orchestrator
356
365
  * (3-level settings change via `setAgentAddonDefaults` /
357
366
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -5458,7 +5467,7 @@ var ZodIssueCode = {
5458
5467
  var ZodFirstPartyTypeKind;
5459
5468
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5460
5469
  //#endregion
5461
- //#region ../types/dist/sleep-CueztlR1.mjs
5470
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5462
5471
  /**
5463
5472
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5464
5473
  * window to float samples (D455).
@@ -7987,7 +7996,7 @@ var EntryDescriptorSchema = object({
7987
7996
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7988
7997
  fields: record(string(), unknown())
7989
7998
  }).strict();
7990
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
7999
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7991
8000
  var RecordKindDeclarationSchema = object({
7992
8001
  database: _enum(RECORD_DATABASES).default("settings"),
7993
8002
  class: _enum(RECORD_CLASSES),
@@ -8006,14 +8015,6 @@ var RecordKindDeclarationSchema = object({
8006
8015
  secretPaths: array(string().min(1)).default([]),
8007
8016
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8008
8017
  secretArrayKeys: record(string(), string()).default({}),
8009
- /**
8010
- * RETIRED (D900): the legacy table a kind adopted from during the records
8011
- * migration. Nothing declares it any more and nothing reads it; the schema
8012
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8013
- * (an orphaned kind is never redeclared) and an addon built before the
8014
- * removal still sends it. Never set it.
8015
- */
8016
- adoptsFrom: string().min(1).optional(),
8017
8018
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8018
8019
  transactFamily: string().min(1).optional(),
8019
8020
  entry: EntryDescriptorSchema.optional()
@@ -12715,17 +12716,6 @@ object({
12715
12716
  createdAt: number(),
12716
12717
  updatedAt: number()
12717
12718
  });
12718
- object({
12719
- id: string(),
12720
- label: string(),
12721
- isAdmin: boolean().default(false),
12722
- allowedProviders: AllowedProviderSchema,
12723
- allowedDevices: AllowedDevicesSchema,
12724
- tokenHash: string(),
12725
- tokenPrefix: string(),
12726
- createdAt: number(),
12727
- lastUsedAt: number().optional()
12728
- });
12729
12719
  object({
12730
12720
  id: string(),
12731
12721
  userId: string(),
@@ -16707,16 +16697,36 @@ var RecordKindStateSchema = _enum([
16707
16697
  var DeclareKindResultSchema = object({
16708
16698
  kindId: number().int(),
16709
16699
  state: RecordKindStateSchema,
16710
- createdIndexes: array(string()),
16711
- /**
16712
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16713
- * it stays on the wire, null, because an addon built before the removal reads
16714
- * an ABSENT field as "adoption pending" and refuses to start.
16715
- */
16716
- adoptionPending: _null()
16700
+ createdIndexes: array(string())
16717
16701
  });
16718
16702
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16719
16703
  var SecretRefsList = array(string());
16704
+ /**
16705
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16706
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16707
+ */
16708
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16709
+ object({
16710
+ op: literal("put"),
16711
+ kind: RecordKindNameSchema,
16712
+ record: RecordInputSchema,
16713
+ ifRev: number().int().min(0).optional()
16714
+ }),
16715
+ object({
16716
+ op: literal("patch"),
16717
+ kind: RecordKindNameSchema,
16718
+ id: RecordIdSchema,
16719
+ data: RecordBodySchema,
16720
+ at: number().int().nullable().optional(),
16721
+ expiresAt: number().int().nullable().optional(),
16722
+ ifRev: number().int().min(1).optional()
16723
+ }),
16724
+ object({
16725
+ op: literal("delete"),
16726
+ kind: RecordKindNameSchema,
16727
+ id: RecordIdSchema
16728
+ })
16729
+ ]);
16720
16730
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16721
16731
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16722
16732
  kind: "mutation",
@@ -16823,6 +16833,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16823
16833
  }), {
16824
16834
  kind: "mutation",
16825
16835
  auth: "admin"
16836
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
16837
+ results: array(object({
16838
+ rev: number().int().nullable(),
16839
+ deleted: boolean()
16840
+ })),
16841
+ releasedRefs: SecretRefsList,
16842
+ secretRefs: SecretRefsList
16843
+ }), {
16844
+ kind: "mutation",
16845
+ auth: "admin"
16826
16846
  }), method(object({
16827
16847
  deviceId: number().int(),
16828
16848
  kinds: array(RecordKindNameSchema).optional()
@@ -42530,9 +42550,13 @@ var NcSystemEventKindSchema = _enum([
42530
42550
  "node-updating",
42531
42551
  "node-inference-unavailable",
42532
42552
  "detection-blind",
42553
+ "motion-noisy",
42554
+ "motion-calm",
42533
42555
  "recording-stalled",
42534
42556
  "recording-healthy",
42535
42557
  "recording-degraded",
42558
+ "device-attention-required",
42559
+ "device-attention-resolved",
42536
42560
  "storage-location-low",
42537
42561
  "storage-location-critical",
42538
42562
  "storage-location-ok",
@@ -48093,7 +48117,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
48093
48117
  modelId: string()
48094
48118
  }),
48095
48119
  object({ kind: literal("cpu-device") }),
48096
- object({ kind: literal("coral-untouched") }),
48097
48120
  object({ kind: literal("device-disabled") }),
48098
48121
  object({ kind: literal("device-unavailable") }),
48099
48122
  object({ kind: literal("node-offline") }),
@@ -48191,11 +48214,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
48191
48214
  kind: literal("detector-store-unreadable"),
48192
48215
  error: string()
48193
48216
  }),
48194
- object({
48195
- kind: literal("coral-enabled"),
48196
- nodeId: string(),
48197
- deviceKey: string()
48198
- }),
48199
48217
  object({
48200
48218
  kind: literal("custom-pin-kept"),
48201
48219
  nodeId: string(),
@@ -56369,6 +56387,16 @@ var DishwasherStatusSchema = object({
56369
56387
  powerState: string().nullable(),
56370
56388
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56371
56389
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56390
+ /**
56391
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56392
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56393
+ * when none is reported. A cleared reminder is not an unknown one.
56394
+ */
56395
+ filterCleaningDue: boolean().nullable(),
56396
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56397
+ machineCareDue: boolean().nullable(),
56398
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56399
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56372
56400
  /** Option states: null when the appliance does not expose the option or has not said. */
56373
56401
  halfLoad: boolean().nullable(),
56374
56402
  hygienePlus: boolean().nullable(),
@@ -65481,16 +65509,6 @@ var UpdateUserInputSchema = object({
65481
65509
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65482
65510
  scopes: array(TokenScopeSchema).optional()
65483
65511
  });
65484
- var ApiKeySummarySchema = object({
65485
- id: string(),
65486
- label: string(),
65487
- isAdmin: boolean().default(false),
65488
- allowedProviders: union([array(string()), literal("*")]).optional(),
65489
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65490
- tokenPrefix: string(),
65491
- createdAt: number(),
65492
- lastUsedAt: number().optional()
65493
- });
65494
65512
  var OauthSessionSummarySchema = object({
65495
65513
  id: string(),
65496
65514
  userId: string(),
@@ -65512,8 +65530,7 @@ var TotpStatusSchema = object({
65512
65530
  confirmedAt: number().nullable()
65513
65531
  });
65514
65532
  /**
65515
- * user-management — singleton capability for user accounts and the
65516
- * legacy API-key rows.
65533
+ * user-management — singleton capability for user accounts.
65517
65534
  *
65518
65535
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65519
65536
  * — the subset check on `setUserScopes` is moot
@@ -65569,10 +65586,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65569
65586
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65570
65587
  kind: "mutation",
65571
65588
  access: "view"
65572
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
65573
- kind: "mutation",
65574
- auth: "admin",
65575
- access: "delete"
65576
65589
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65577
65590
  kind: "mutation",
65578
65591
  auth: "admin",
@@ -75032,6 +75045,12 @@ Object.freeze({
75032
75045
  addonId: null,
75033
75046
  access: "view"
75034
75047
  },
75048
+ "records.transact": {
75049
+ capName: "records",
75050
+ capScope: "system",
75051
+ addonId: null,
75052
+ access: "create"
75053
+ },
75035
75054
  "sceneMonitor.captureReference": {
75036
75055
  capName: "scene-monitor",
75037
75056
  capScope: "device",
@@ -76364,12 +76383,6 @@ Object.freeze({
76364
76383
  addonId: null,
76365
76384
  access: "view"
76366
76385
  },
76367
- "userManagement.listApiKeys": {
76368
- capName: "user-management",
76369
- capScope: "system",
76370
- addonId: null,
76371
- access: "view"
76372
- },
76373
76386
  "userManagement.listExternalIdentities": {
76374
76387
  capName: "user-management",
76375
76388
  capScope: "system",
@@ -76424,12 +76437,6 @@ Object.freeze({
76424
76437
  addonId: null,
76425
76438
  access: "create"
76426
76439
  },
76427
- "userManagement.revokeApiKey": {
76428
- capName: "user-management",
76429
- capScope: "system",
76430
- addonId: null,
76431
- access: "delete"
76432
- },
76433
76440
  "userManagement.revokeOauthSession": {
76434
76441
  capName: "user-management",
76435
76442
  capScope: "system",
@@ -80000,9 +80007,13 @@ new Map(Object.entries({
80000
80007
  "stream-online": "device-events",
80001
80008
  "stream-offline": "device-events",
80002
80009
  "detection-blind": "device-events",
80010
+ "motion-noisy": "device-events",
80011
+ "motion-calm": "device-events",
80003
80012
  "recording-stalled": "device-events",
80004
80013
  "recording-healthy": "device-events",
80005
80014
  "recording-degraded": "device-events",
80015
+ "device-attention-required": "device-events",
80016
+ "device-attention-resolved": "device-events",
80006
80017
  "node-online": "system",
80007
80018
  "node-offline": "system",
80008
80019
  "node-restarting": "system",
@@ -80085,6 +80096,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80085
80096
  label: "Detecting nothing",
80086
80097
  kinds: ["detection-blind"]
80087
80098
  },
80099
+ {
80100
+ id: "motion-noise",
80101
+ family: "device-events",
80102
+ label: "Motion without a subject",
80103
+ kinds: ["motion-noisy", "motion-calm"]
80104
+ },
80088
80105
  {
80089
80106
  id: "recording",
80090
80107
  family: "device-events",
@@ -80095,6 +80112,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80095
80112
  "recording-degraded"
80096
80113
  ]
80097
80114
  },
80115
+ {
80116
+ id: "device-attention",
80117
+ family: "device-events",
80118
+ label: "Needs attention",
80119
+ kinds: ["device-attention-required", "device-attention-resolved"]
80120
+ },
80098
80121
  {
80099
80122
  id: "nodes",
80100
80123
  family: "system",
@@ -80234,6 +80257,7 @@ var ALERT_EPISODE = [
80234
80257
  "alert-error",
80235
80258
  "alert-critical-resolved"
80236
80259
  ];
80260
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
80237
80261
  var UPDATES = [
80238
80262
  "addon-update-available",
80239
80263
  "server-update-available",
@@ -80263,9 +80287,12 @@ var DEVICE_EVENTS = [
80263
80287
  "stream-online",
80264
80288
  "stream-offline",
80265
80289
  "detection-blind",
80290
+ "motion-noisy",
80291
+ "motion-calm",
80266
80292
  "recording-stalled",
80267
80293
  "recording-healthy",
80268
80294
  "recording-degraded",
80295
+ ...DEVICE_ATTENTION,
80269
80296
  ...ALARM
80270
80297
  ];
80271
80298
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80433,7 +80460,9 @@ var STATE_SUMMARY_VARS = [
80433
80460
  [...RULE_TEXT],
80434
80461
  [...RULE_TEXT],
80435
80462
  [...RULE_TEXT],
80436
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80463
+ [...RULE_TEXT],
80464
+ [...RULE_TEXT],
80465
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80437
80466
  [...RULE_TEXT],
80438
80467
  [...RULE_TEXT],
80439
80468
  [...RULE_TEXT],
@@ -80455,11 +80484,11 @@ var STATE_SUMMARY_VARS = [
80455
80484
  [...RULE_TEXT],
80456
80485
  [...RULE_TEXT],
80457
80486
  [...RULE_TEXT],
80487
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80458
80488
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80489
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80459
80490
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80460
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80461
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80462
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80491
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80463
80492
  [...RULE_TEXT],
80464
80493
  [...RULE_TEXT],
80465
80494
  [...RULE_TEXT],
@@ -80535,6 +80564,15 @@ new Map([
80535
80564
  snapshotLabel: "Tanks low or full now",
80536
80565
  snapshotSection: "tanks"
80537
80566
  },
80567
+ {
80568
+ id: "motion-noise",
80569
+ family: "device-events",
80570
+ label: "Motion without a subject (constant / calm again)",
80571
+ bad: ["motion-noisy"],
80572
+ recovery: ["motion-calm"],
80573
+ snapshotLabel: "Cameras with constant motion now",
80574
+ snapshotSection: null
80575
+ },
80538
80576
  {
80539
80577
  id: "recording-health",
80540
80578
  family: "device-events",
@@ -80544,6 +80582,15 @@ new Map([
80544
80582
  snapshotLabel: "Recordings stalled now",
80545
80583
  snapshotSection: null
80546
80584
  },
80585
+ {
80586
+ id: "device-attention",
80587
+ family: "device-events",
80588
+ label: "Device needs attention (raised / resolved)",
80589
+ bad: ["device-attention-required"],
80590
+ recovery: ["device-attention-resolved"],
80591
+ snapshotLabel: "Devices needing attention now",
80592
+ snapshotSection: null
80593
+ },
80547
80594
  {
80548
80595
  id: "node-connectivity",
80549
80596
  family: "system",
@@ -82801,7 +82848,7 @@ function buildExtrasSections(snap) {
82801
82848
  tab: "image",
82802
82849
  title: "IR + status LED",
82803
82850
  titleKey: "provider-amcrest:extrasSections.s_ir-lights.title",
82804
- description: "IR illuminator (`Lighting[0][0]`, separate from the IR-cut filter on the Image tab) + the visible status LED (`LightGlobal[0].Enable`). `Auto` lets the camera drive the IR LEDs from ambient light; `Manual` forces them on at the set brightness; `Off` disables them. All pushed over Dahua CGI `setConfig` on save.",
82851
+ description: "`Auto` follows ambient light; `Manual` forces the LEDs on at the set brightness.",
82805
82852
  descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.description",
82806
82853
  columns: 2,
82807
82854
  fields: [
@@ -82834,8 +82881,6 @@ function buildExtrasSections(snap) {
82834
82881
  key: "irLightBrightness",
82835
82882
  label: "IR brightness",
82836
82883
  labelKey: "provider-amcrest:extrasSections.s_ir-lights.irLightBrightness.label",
82837
- description: "IR LED output (`MiddleLight[0].Light`, 0–100). Applied in Auto and Manual modes.",
82838
- descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.irLightBrightness.description",
82839
82884
  min: 0,
82840
82885
  max: 100,
82841
82886
  step: 5,
@@ -82848,8 +82893,6 @@ function buildExtrasSections(snap) {
82848
82893
  key: "statusLedEnabled",
82849
82894
  label: "Status LED",
82850
82895
  labelKey: "provider-amcrest:extrasSections.s_ir-lights.statusLedEnabled.label",
82851
- description: "The visible indicator LED on the camera body (`LightGlobal[0].Enable`).",
82852
- descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.statusLedEnabled.description",
82853
82896
  default: snap.statusLedEnabled ?? true,
82854
82897
  style: "switch",
82855
82898
  span: 2
@@ -82861,7 +82904,7 @@ function buildExtrasSections(snap) {
82861
82904
  tab: "network",
82862
82905
  title: "Time / NTP",
82863
82906
  titleKey: "provider-amcrest:extrasSections.s_time-ntp.title",
82864
- description: "Network time sync (`NTP.*` over Dahua CGI). The timezone is the Dahua numeric index (0–33) exactly as listed in the camera web UI — 26 is the GMT+8 factory default. NOTE: with NTP disabled this camera drifts badly (it currently believes the year is 2000).",
82907
+ description: "With NTP disabled this camera's clock drifts badly.",
82865
82908
  descriptionKey: "provider-amcrest:extrasSections.s_time-ntp.description",
82866
82909
  columns: 2,
82867
82910
  fields: [
@@ -82908,7 +82951,7 @@ function buildExtrasSections(snap) {
82908
82951
  key: "ntpTimeZoneIndex",
82909
82952
  label: "Timezone index (Dahua, 0–33)",
82910
82953
  labelKey: "provider-amcrest:extrasSections.s_time-ntp.ntpTimeZoneIndex.label",
82911
- description: "Numeric index from the camera web UI timezone list — the firmware rejects anything above 33. Not an IANA zone: the Dahua CGI only speaks this index. 26 = GMT+8 (factory default).",
82954
+ description: "Dahua numeric index (0–33) from the camera web UI timezone list, not an IANA zone. 26 = GMT+8.",
82912
82955
  descriptionKey: "provider-amcrest:extrasSections.s_time-ntp.ntpTimeZoneIndex.description",
82913
82956
  default: snap.ntpTimeZoneIndex ?? 26,
82914
82957
  min: 0,
@@ -82923,8 +82966,6 @@ function buildExtrasSections(snap) {
82923
82966
  tab: "advanced",
82924
82967
  title: "Auto reboot",
82925
82968
  titleKey: "provider-amcrest:extrasSections.s_auto-reboot.title",
82926
- description: "Scheduled automatic reboot (`AutoMaintain.AutoReboot*`). Choose a day (or every day) + time; the camera reboots once per matching window.",
82927
- descriptionKey: "provider-amcrest:extrasSections.s_auto-reboot.description",
82928
82969
  columns: 2,
82929
82970
  fields: [
82930
82971
  {
@@ -83579,8 +83620,6 @@ var AmcrestCamera = class AmcrestCamera extends BaseDevice {
83579
83620
  tab: "general",
83580
83621
  title: "Connection",
83581
83622
  titleKey: "provider-amcrest:schema.s_connection.title",
83582
- description: "Dahua CGI HTTP(S) endpoint + Digest credentials. RTSP is always port 554.",
83583
- descriptionKey: "provider-amcrest:schema.s_connection.description",
83584
83623
  columns: 2,
83585
83624
  fields: [
83586
83625
  {
@@ -97868,8 +97907,6 @@ function buildCreationFormSchema() {
97868
97907
  id: "credentials",
97869
97908
  title: "Credentials",
97870
97909
  titleKey: "provider-amcrest:creation.s_credentials.title",
97871
- description: "Dahua CGI uses HTTP Digest auth — no plaintext password on the wire even over HTTP. Required for the host probe.",
97872
- descriptionKey: "provider-amcrest:creation.s_credentials.description",
97873
97910
  columns: 2,
97874
97911
  fields: [{
97875
97912
  type: "text",
@@ -97891,7 +97928,7 @@ function buildCreationFormSchema() {
97891
97928
  id: "connection",
97892
97929
  title: "Connection",
97893
97930
  titleKey: "provider-amcrest:creation.s_connection.title",
97894
- description: "Dahua CGI HTTP(S) endpoint. Default port 80 (HTTP); switch to 443 + HTTPS for cameras with TLS enabled.",
97931
+ description: "Use 443 with HTTPS for cameras with TLS enabled.",
97895
97932
  descriptionKey: "provider-amcrest:creation.s_connection.description",
97896
97933
  columns: 2,
97897
97934
  fields: [
@@ -97937,7 +97974,7 @@ function buildDiscoveryParamsFormSchema() {
97937
97974
  id: "credentials",
97938
97975
  title: "Credentials",
97939
97976
  titleKey: "provider-amcrest:discoveryParams.s_credentials.title",
97940
- description: "Pre-filled into each result so you can add it in one click. Assumes all cameras share these credentials.",
97977
+ description: "Assumes all cameras share these credentials.",
97941
97978
  descriptionKey: "provider-amcrest:discoveryParams.s_credentials.description",
97942
97979
  columns: 2,
97943
97980
  fields: [{
@@ -97959,7 +97996,7 @@ function buildDiscoveryParamsFormSchema() {
97959
97996
  id: "scan",
97960
97997
  title: "Scan options",
97961
97998
  titleKey: "provider-amcrest:discoveryParams.s_scan.title",
97962
- description: "The credentialed CGI subnet scan is the reliable path (multicast WS-Discovery is not received on a macvlan/br0 hub). IMPORTANT: leaving the network blank scans only the HUB’s own subnet — if your cameras are on a DIFFERENT subnet than the hub, you MUST enter their CIDR here (e.g. 192.168.60.0/24), otherwise the scan returns nothing.",
97999
+ description: "Leave blank to scan the hub's own subnet; enter the CIDR if the cameras are on another one (e.g. 192.168.60.0/24).",
97963
98000
  descriptionKey: "provider-amcrest:discoveryParams.s_scan.description",
97964
98001
  columns: 1,
97965
98002
  fields: [{
package/dist/addon.mjs CHANGED
@@ -14,7 +14,7 @@ import { networkInterfaces } from "node:os";
14
14
  var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
15
15
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
16
16
  //#endregion
17
- //#region ../types/dist/event-category-7pZEBmVg.mjs
17
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
18
18
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
19
19
  EventCategory["SystemBoot"] = "system.boot";
20
20
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -331,6 +331,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
331
331
  */
332
332
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
333
333
  /**
334
+ * A camera's motion source has fired constantly with no subject for an hour
335
+ * (motion duty or session count over the bar, zero detections) — it is not
336
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
337
+ * {@link PipelineMotionCalm}.
338
+ */
339
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
340
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
341
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
342
+ /**
334
343
  * Per-camera pipeline config was mutated by the orchestrator
335
344
  * (3-level settings change via `setAgentAddonDefaults` /
336
345
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -5437,7 +5446,7 @@ var ZodIssueCode = {
5437
5446
  var ZodFirstPartyTypeKind;
5438
5447
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5439
5448
  //#endregion
5440
- //#region ../types/dist/sleep-CueztlR1.mjs
5449
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5441
5450
  /**
5442
5451
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5443
5452
  * window to float samples (D455).
@@ -7966,7 +7975,7 @@ var EntryDescriptorSchema = object({
7966
7975
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7967
7976
  fields: record(string(), unknown())
7968
7977
  }).strict();
7969
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
7978
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7970
7979
  var RecordKindDeclarationSchema = object({
7971
7980
  database: _enum(RECORD_DATABASES).default("settings"),
7972
7981
  class: _enum(RECORD_CLASSES),
@@ -7985,14 +7994,6 @@ var RecordKindDeclarationSchema = object({
7985
7994
  secretPaths: array(string().min(1)).default([]),
7986
7995
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7987
7996
  secretArrayKeys: record(string(), string()).default({}),
7988
- /**
7989
- * RETIRED (D900): the legacy table a kind adopted from during the records
7990
- * migration. Nothing declares it any more and nothing reads it; the schema
7991
- * still ACCEPTS it because the catalog rows the migration wrote carry it
7992
- * (an orphaned kind is never redeclared) and an addon built before the
7993
- * removal still sends it. Never set it.
7994
- */
7995
- adoptsFrom: string().min(1).optional(),
7996
7997
  /** Kinds that must agree through `transact` sit in one file under one family name. */
7997
7998
  transactFamily: string().min(1).optional(),
7998
7999
  entry: EntryDescriptorSchema.optional()
@@ -12694,17 +12695,6 @@ object({
12694
12695
  createdAt: number(),
12695
12696
  updatedAt: number()
12696
12697
  });
12697
- object({
12698
- id: string(),
12699
- label: string(),
12700
- isAdmin: boolean().default(false),
12701
- allowedProviders: AllowedProviderSchema,
12702
- allowedDevices: AllowedDevicesSchema,
12703
- tokenHash: string(),
12704
- tokenPrefix: string(),
12705
- createdAt: number(),
12706
- lastUsedAt: number().optional()
12707
- });
12708
12698
  object({
12709
12699
  id: string(),
12710
12700
  userId: string(),
@@ -16686,16 +16676,36 @@ var RecordKindStateSchema = _enum([
16686
16676
  var DeclareKindResultSchema = object({
16687
16677
  kindId: number().int(),
16688
16678
  state: RecordKindStateSchema,
16689
- createdIndexes: array(string()),
16690
- /**
16691
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16692
- * it stays on the wire, null, because an addon built before the removal reads
16693
- * an ABSENT field as "adoption pending" and refuses to start.
16694
- */
16695
- adoptionPending: _null()
16679
+ createdIndexes: array(string())
16696
16680
  });
16697
16681
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16698
16682
  var SecretRefsList = array(string());
16683
+ /**
16684
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16685
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16686
+ */
16687
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16688
+ object({
16689
+ op: literal("put"),
16690
+ kind: RecordKindNameSchema,
16691
+ record: RecordInputSchema,
16692
+ ifRev: number().int().min(0).optional()
16693
+ }),
16694
+ object({
16695
+ op: literal("patch"),
16696
+ kind: RecordKindNameSchema,
16697
+ id: RecordIdSchema,
16698
+ data: RecordBodySchema,
16699
+ at: number().int().nullable().optional(),
16700
+ expiresAt: number().int().nullable().optional(),
16701
+ ifRev: number().int().min(1).optional()
16702
+ }),
16703
+ object({
16704
+ op: literal("delete"),
16705
+ kind: RecordKindNameSchema,
16706
+ id: RecordIdSchema
16707
+ })
16708
+ ]);
16699
16709
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16700
16710
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16701
16711
  kind: "mutation",
@@ -16802,6 +16812,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16802
16812
  }), {
16803
16813
  kind: "mutation",
16804
16814
  auth: "admin"
16815
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
16816
+ results: array(object({
16817
+ rev: number().int().nullable(),
16818
+ deleted: boolean()
16819
+ })),
16820
+ releasedRefs: SecretRefsList,
16821
+ secretRefs: SecretRefsList
16822
+ }), {
16823
+ kind: "mutation",
16824
+ auth: "admin"
16805
16825
  }), method(object({
16806
16826
  deviceId: number().int(),
16807
16827
  kinds: array(RecordKindNameSchema).optional()
@@ -42509,9 +42529,13 @@ var NcSystemEventKindSchema = _enum([
42509
42529
  "node-updating",
42510
42530
  "node-inference-unavailable",
42511
42531
  "detection-blind",
42532
+ "motion-noisy",
42533
+ "motion-calm",
42512
42534
  "recording-stalled",
42513
42535
  "recording-healthy",
42514
42536
  "recording-degraded",
42537
+ "device-attention-required",
42538
+ "device-attention-resolved",
42515
42539
  "storage-location-low",
42516
42540
  "storage-location-critical",
42517
42541
  "storage-location-ok",
@@ -48072,7 +48096,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
48072
48096
  modelId: string()
48073
48097
  }),
48074
48098
  object({ kind: literal("cpu-device") }),
48075
- object({ kind: literal("coral-untouched") }),
48076
48099
  object({ kind: literal("device-disabled") }),
48077
48100
  object({ kind: literal("device-unavailable") }),
48078
48101
  object({ kind: literal("node-offline") }),
@@ -48170,11 +48193,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
48170
48193
  kind: literal("detector-store-unreadable"),
48171
48194
  error: string()
48172
48195
  }),
48173
- object({
48174
- kind: literal("coral-enabled"),
48175
- nodeId: string(),
48176
- deviceKey: string()
48177
- }),
48178
48196
  object({
48179
48197
  kind: literal("custom-pin-kept"),
48180
48198
  nodeId: string(),
@@ -56348,6 +56366,16 @@ var DishwasherStatusSchema = object({
56348
56366
  powerState: string().nullable(),
56349
56367
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56350
56368
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56369
+ /**
56370
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56371
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56372
+ * when none is reported. A cleared reminder is not an unknown one.
56373
+ */
56374
+ filterCleaningDue: boolean().nullable(),
56375
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56376
+ machineCareDue: boolean().nullable(),
56377
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56378
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56351
56379
  /** Option states: null when the appliance does not expose the option or has not said. */
56352
56380
  halfLoad: boolean().nullable(),
56353
56381
  hygienePlus: boolean().nullable(),
@@ -65460,16 +65488,6 @@ var UpdateUserInputSchema = object({
65460
65488
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65461
65489
  scopes: array(TokenScopeSchema).optional()
65462
65490
  });
65463
- var ApiKeySummarySchema = object({
65464
- id: string(),
65465
- label: string(),
65466
- isAdmin: boolean().default(false),
65467
- allowedProviders: union([array(string()), literal("*")]).optional(),
65468
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65469
- tokenPrefix: string(),
65470
- createdAt: number(),
65471
- lastUsedAt: number().optional()
65472
- });
65473
65491
  var OauthSessionSummarySchema = object({
65474
65492
  id: string(),
65475
65493
  userId: string(),
@@ -65491,8 +65509,7 @@ var TotpStatusSchema = object({
65491
65509
  confirmedAt: number().nullable()
65492
65510
  });
65493
65511
  /**
65494
- * user-management — singleton capability for user accounts and the
65495
- * legacy API-key rows.
65512
+ * user-management — singleton capability for user accounts.
65496
65513
  *
65497
65514
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65498
65515
  * — the subset check on `setUserScopes` is moot
@@ -65548,10 +65565,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65548
65565
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65549
65566
  kind: "mutation",
65550
65567
  access: "view"
65551
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
65552
- kind: "mutation",
65553
- auth: "admin",
65554
- access: "delete"
65555
65568
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65556
65569
  kind: "mutation",
65557
65570
  auth: "admin",
@@ -75011,6 +75024,12 @@ Object.freeze({
75011
75024
  addonId: null,
75012
75025
  access: "view"
75013
75026
  },
75027
+ "records.transact": {
75028
+ capName: "records",
75029
+ capScope: "system",
75030
+ addonId: null,
75031
+ access: "create"
75032
+ },
75014
75033
  "sceneMonitor.captureReference": {
75015
75034
  capName: "scene-monitor",
75016
75035
  capScope: "device",
@@ -76343,12 +76362,6 @@ Object.freeze({
76343
76362
  addonId: null,
76344
76363
  access: "view"
76345
76364
  },
76346
- "userManagement.listApiKeys": {
76347
- capName: "user-management",
76348
- capScope: "system",
76349
- addonId: null,
76350
- access: "view"
76351
- },
76352
76365
  "userManagement.listExternalIdentities": {
76353
76366
  capName: "user-management",
76354
76367
  capScope: "system",
@@ -76403,12 +76416,6 @@ Object.freeze({
76403
76416
  addonId: null,
76404
76417
  access: "create"
76405
76418
  },
76406
- "userManagement.revokeApiKey": {
76407
- capName: "user-management",
76408
- capScope: "system",
76409
- addonId: null,
76410
- access: "delete"
76411
- },
76412
76419
  "userManagement.revokeOauthSession": {
76413
76420
  capName: "user-management",
76414
76421
  capScope: "system",
@@ -79979,9 +79986,13 @@ new Map(Object.entries({
79979
79986
  "stream-online": "device-events",
79980
79987
  "stream-offline": "device-events",
79981
79988
  "detection-blind": "device-events",
79989
+ "motion-noisy": "device-events",
79990
+ "motion-calm": "device-events",
79982
79991
  "recording-stalled": "device-events",
79983
79992
  "recording-healthy": "device-events",
79984
79993
  "recording-degraded": "device-events",
79994
+ "device-attention-required": "device-events",
79995
+ "device-attention-resolved": "device-events",
79985
79996
  "node-online": "system",
79986
79997
  "node-offline": "system",
79987
79998
  "node-restarting": "system",
@@ -80064,6 +80075,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80064
80075
  label: "Detecting nothing",
80065
80076
  kinds: ["detection-blind"]
80066
80077
  },
80078
+ {
80079
+ id: "motion-noise",
80080
+ family: "device-events",
80081
+ label: "Motion without a subject",
80082
+ kinds: ["motion-noisy", "motion-calm"]
80083
+ },
80067
80084
  {
80068
80085
  id: "recording",
80069
80086
  family: "device-events",
@@ -80074,6 +80091,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80074
80091
  "recording-degraded"
80075
80092
  ]
80076
80093
  },
80094
+ {
80095
+ id: "device-attention",
80096
+ family: "device-events",
80097
+ label: "Needs attention",
80098
+ kinds: ["device-attention-required", "device-attention-resolved"]
80099
+ },
80077
80100
  {
80078
80101
  id: "nodes",
80079
80102
  family: "system",
@@ -80213,6 +80236,7 @@ var ALERT_EPISODE = [
80213
80236
  "alert-error",
80214
80237
  "alert-critical-resolved"
80215
80238
  ];
80239
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
80216
80240
  var UPDATES = [
80217
80241
  "addon-update-available",
80218
80242
  "server-update-available",
@@ -80242,9 +80266,12 @@ var DEVICE_EVENTS = [
80242
80266
  "stream-online",
80243
80267
  "stream-offline",
80244
80268
  "detection-blind",
80269
+ "motion-noisy",
80270
+ "motion-calm",
80245
80271
  "recording-stalled",
80246
80272
  "recording-healthy",
80247
80273
  "recording-degraded",
80274
+ ...DEVICE_ATTENTION,
80248
80275
  ...ALARM
80249
80276
  ];
80250
80277
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80412,7 +80439,9 @@ var STATE_SUMMARY_VARS = [
80412
80439
  [...RULE_TEXT],
80413
80440
  [...RULE_TEXT],
80414
80441
  [...RULE_TEXT],
80415
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80442
+ [...RULE_TEXT],
80443
+ [...RULE_TEXT],
80444
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80416
80445
  [...RULE_TEXT],
80417
80446
  [...RULE_TEXT],
80418
80447
  [...RULE_TEXT],
@@ -80434,11 +80463,11 @@ var STATE_SUMMARY_VARS = [
80434
80463
  [...RULE_TEXT],
80435
80464
  [...RULE_TEXT],
80436
80465
  [...RULE_TEXT],
80466
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80437
80467
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80468
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80438
80469
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80439
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80440
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80441
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80470
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80442
80471
  [...RULE_TEXT],
80443
80472
  [...RULE_TEXT],
80444
80473
  [...RULE_TEXT],
@@ -80514,6 +80543,15 @@ new Map([
80514
80543
  snapshotLabel: "Tanks low or full now",
80515
80544
  snapshotSection: "tanks"
80516
80545
  },
80546
+ {
80547
+ id: "motion-noise",
80548
+ family: "device-events",
80549
+ label: "Motion without a subject (constant / calm again)",
80550
+ bad: ["motion-noisy"],
80551
+ recovery: ["motion-calm"],
80552
+ snapshotLabel: "Cameras with constant motion now",
80553
+ snapshotSection: null
80554
+ },
80517
80555
  {
80518
80556
  id: "recording-health",
80519
80557
  family: "device-events",
@@ -80523,6 +80561,15 @@ new Map([
80523
80561
  snapshotLabel: "Recordings stalled now",
80524
80562
  snapshotSection: null
80525
80563
  },
80564
+ {
80565
+ id: "device-attention",
80566
+ family: "device-events",
80567
+ label: "Device needs attention (raised / resolved)",
80568
+ bad: ["device-attention-required"],
80569
+ recovery: ["device-attention-resolved"],
80570
+ snapshotLabel: "Devices needing attention now",
80571
+ snapshotSection: null
80572
+ },
80526
80573
  {
80527
80574
  id: "node-connectivity",
80528
80575
  family: "system",
@@ -82780,7 +82827,7 @@ function buildExtrasSections(snap) {
82780
82827
  tab: "image",
82781
82828
  title: "IR + status LED",
82782
82829
  titleKey: "provider-amcrest:extrasSections.s_ir-lights.title",
82783
- description: "IR illuminator (`Lighting[0][0]`, separate from the IR-cut filter on the Image tab) + the visible status LED (`LightGlobal[0].Enable`). `Auto` lets the camera drive the IR LEDs from ambient light; `Manual` forces them on at the set brightness; `Off` disables them. All pushed over Dahua CGI `setConfig` on save.",
82830
+ description: "`Auto` follows ambient light; `Manual` forces the LEDs on at the set brightness.",
82784
82831
  descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.description",
82785
82832
  columns: 2,
82786
82833
  fields: [
@@ -82813,8 +82860,6 @@ function buildExtrasSections(snap) {
82813
82860
  key: "irLightBrightness",
82814
82861
  label: "IR brightness",
82815
82862
  labelKey: "provider-amcrest:extrasSections.s_ir-lights.irLightBrightness.label",
82816
- description: "IR LED output (`MiddleLight[0].Light`, 0–100). Applied in Auto and Manual modes.",
82817
- descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.irLightBrightness.description",
82818
82863
  min: 0,
82819
82864
  max: 100,
82820
82865
  step: 5,
@@ -82827,8 +82872,6 @@ function buildExtrasSections(snap) {
82827
82872
  key: "statusLedEnabled",
82828
82873
  label: "Status LED",
82829
82874
  labelKey: "provider-amcrest:extrasSections.s_ir-lights.statusLedEnabled.label",
82830
- description: "The visible indicator LED on the camera body (`LightGlobal[0].Enable`).",
82831
- descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.statusLedEnabled.description",
82832
82875
  default: snap.statusLedEnabled ?? true,
82833
82876
  style: "switch",
82834
82877
  span: 2
@@ -82840,7 +82883,7 @@ function buildExtrasSections(snap) {
82840
82883
  tab: "network",
82841
82884
  title: "Time / NTP",
82842
82885
  titleKey: "provider-amcrest:extrasSections.s_time-ntp.title",
82843
- description: "Network time sync (`NTP.*` over Dahua CGI). The timezone is the Dahua numeric index (0–33) exactly as listed in the camera web UI — 26 is the GMT+8 factory default. NOTE: with NTP disabled this camera drifts badly (it currently believes the year is 2000).",
82886
+ description: "With NTP disabled this camera's clock drifts badly.",
82844
82887
  descriptionKey: "provider-amcrest:extrasSections.s_time-ntp.description",
82845
82888
  columns: 2,
82846
82889
  fields: [
@@ -82887,7 +82930,7 @@ function buildExtrasSections(snap) {
82887
82930
  key: "ntpTimeZoneIndex",
82888
82931
  label: "Timezone index (Dahua, 0–33)",
82889
82932
  labelKey: "provider-amcrest:extrasSections.s_time-ntp.ntpTimeZoneIndex.label",
82890
- description: "Numeric index from the camera web UI timezone list — the firmware rejects anything above 33. Not an IANA zone: the Dahua CGI only speaks this index. 26 = GMT+8 (factory default).",
82933
+ description: "Dahua numeric index (0–33) from the camera web UI timezone list, not an IANA zone. 26 = GMT+8.",
82891
82934
  descriptionKey: "provider-amcrest:extrasSections.s_time-ntp.ntpTimeZoneIndex.description",
82892
82935
  default: snap.ntpTimeZoneIndex ?? 26,
82893
82936
  min: 0,
@@ -82902,8 +82945,6 @@ function buildExtrasSections(snap) {
82902
82945
  tab: "advanced",
82903
82946
  title: "Auto reboot",
82904
82947
  titleKey: "provider-amcrest:extrasSections.s_auto-reboot.title",
82905
- description: "Scheduled automatic reboot (`AutoMaintain.AutoReboot*`). Choose a day (or every day) + time; the camera reboots once per matching window.",
82906
- descriptionKey: "provider-amcrest:extrasSections.s_auto-reboot.description",
82907
82948
  columns: 2,
82908
82949
  fields: [
82909
82950
  {
@@ -83558,8 +83599,6 @@ var AmcrestCamera = class AmcrestCamera extends BaseDevice {
83558
83599
  tab: "general",
83559
83600
  title: "Connection",
83560
83601
  titleKey: "provider-amcrest:schema.s_connection.title",
83561
- description: "Dahua CGI HTTP(S) endpoint + Digest credentials. RTSP is always port 554.",
83562
- descriptionKey: "provider-amcrest:schema.s_connection.description",
83563
83602
  columns: 2,
83564
83603
  fields: [
83565
83604
  {
@@ -97847,8 +97886,6 @@ function buildCreationFormSchema() {
97847
97886
  id: "credentials",
97848
97887
  title: "Credentials",
97849
97888
  titleKey: "provider-amcrest:creation.s_credentials.title",
97850
- description: "Dahua CGI uses HTTP Digest auth — no plaintext password on the wire even over HTTP. Required for the host probe.",
97851
- descriptionKey: "provider-amcrest:creation.s_credentials.description",
97852
97889
  columns: 2,
97853
97890
  fields: [{
97854
97891
  type: "text",
@@ -97870,7 +97907,7 @@ function buildCreationFormSchema() {
97870
97907
  id: "connection",
97871
97908
  title: "Connection",
97872
97909
  titleKey: "provider-amcrest:creation.s_connection.title",
97873
- description: "Dahua CGI HTTP(S) endpoint. Default port 80 (HTTP); switch to 443 + HTTPS for cameras with TLS enabled.",
97910
+ description: "Use 443 with HTTPS for cameras with TLS enabled.",
97874
97911
  descriptionKey: "provider-amcrest:creation.s_connection.description",
97875
97912
  columns: 2,
97876
97913
  fields: [
@@ -97916,7 +97953,7 @@ function buildDiscoveryParamsFormSchema() {
97916
97953
  id: "credentials",
97917
97954
  title: "Credentials",
97918
97955
  titleKey: "provider-amcrest:discoveryParams.s_credentials.title",
97919
- description: "Pre-filled into each result so you can add it in one click. Assumes all cameras share these credentials.",
97956
+ description: "Assumes all cameras share these credentials.",
97920
97957
  descriptionKey: "provider-amcrest:discoveryParams.s_credentials.description",
97921
97958
  columns: 2,
97922
97959
  fields: [{
@@ -97938,7 +97975,7 @@ function buildDiscoveryParamsFormSchema() {
97938
97975
  id: "scan",
97939
97976
  title: "Scan options",
97940
97977
  titleKey: "provider-amcrest:discoveryParams.s_scan.title",
97941
- description: "The credentialed CGI subnet scan is the reliable path (multicast WS-Discovery is not received on a macvlan/br0 hub). IMPORTANT: leaving the network blank scans only the HUB’s own subnet — if your cameras are on a DIFFERENT subnet than the hub, you MUST enter their CIDR here (e.g. 192.168.60.0/24), otherwise the scan returns nothing.",
97978
+ description: "Leave blank to scan the hub's own subnet; enter the CIDR if the cameras are on another one (e.g. 192.168.60.0/24).",
97942
97979
  descriptionKey: "provider-amcrest:discoveryParams.s_scan.description",
97943
97980
  columns: 1,
97944
97981
  fields: [{
package/i18n/en.json CHANGED
@@ -2,24 +2,22 @@
2
2
  "creation.s_identity.title": "Camera",
3
3
  "creation.s_identity.name.label": "Name",
4
4
  "creation.s_credentials.title": "Credentials",
5
- "creation.s_credentials.description": "Dahua CGI uses HTTP Digest auth — no plaintext password on the wire even over HTTP. Required for the host probe.",
6
5
  "creation.s_credentials.username.label": "Username",
7
6
  "creation.s_credentials.password.label": "Password",
8
7
  "creation.s_connection.title": "Connection",
9
- "creation.s_connection.description": "Dahua CGI HTTP(S) endpoint. Default port 80 (HTTP); switch to 443 + HTTPS for cameras with TLS enabled.",
8
+ "creation.s_connection.description": "Use 443 with HTTPS for cameras with TLS enabled.",
10
9
  "creation.s_connection.host.label": "Camera IP",
11
10
  "creation.s_connection.port.label": "Port",
12
11
  "creation.s_connection.https.label": "Use HTTPS",
13
12
  "discoveryParams.s_credentials.title": "Credentials",
14
- "discoveryParams.s_credentials.description": "Pre-filled into each result so you can add it in one click. Assumes all cameras share these credentials.",
13
+ "discoveryParams.s_credentials.description": "Assumes all cameras share these credentials.",
15
14
  "discoveryParams.s_credentials.username.label": "Username",
16
15
  "discoveryParams.s_credentials.password.label": "Password",
17
16
  "discoveryParams.s_scan.title": "Scan options",
18
- "discoveryParams.s_scan.description": "The credentialed CGI subnet scan is the reliable path (multicast WS-Discovery is not received on a macvlan/br0 hub). IMPORTANT: leaving the network blank scans only the HUB’s own subnet — if your cameras are on a DIFFERENT subnet than the hub, you MUST enter their CIDR here (e.g. 192.168.60.0/24), otherwise the scan returns nothing.",
17
+ "discoveryParams.s_scan.description": "Leave blank to scan the hub's own subnet; enter the CIDR if the cameras are on another one (e.g. 192.168.60.0/24).",
19
18
  "discoveryParams.s_scan.networkCidr.label": "Network (CIDR) — required if cameras are on a different subnet than the hub",
20
19
  "discoveryParams.s_scan.timeoutMs.label": "WS-Discovery timeout (ms)",
21
20
  "schema.s_connection.title": "Connection",
22
- "schema.s_connection.description": "Dahua CGI HTTP(S) endpoint + Digest credentials. RTSP is always port 554.",
23
21
  "schema.s_connection.host.label": "Camera IP",
24
22
  "schema.s_connection.port.label": "Port",
25
23
  "schema.s_connection.https.label": "Use HTTPS",
@@ -27,25 +25,22 @@
27
25
  "schema.s_connection.username.label": "Username",
28
26
  "schema.s_connection.password.label": "Password",
29
27
  "extrasSections.s_ir-lights.title": "IR + status LED",
30
- "extrasSections.s_ir-lights.description": "IR illuminator (`Lighting[0][0]`, separate from the IR-cut filter on the Image tab) + the visible status LED (`LightGlobal[0].Enable`). `Auto` lets the camera drive the IR LEDs from ambient light; `Manual` forces them on at the set brightness; `Off` disables them. All pushed over Dahua CGI `setConfig` on save.",
28
+ "extrasSections.s_ir-lights.description": "`Auto` follows ambient light; `Manual` forces the LEDs on at the set brightness.",
31
29
  "extrasSections.s_ir-lights.irLightMode.label": "IR illuminator",
32
30
  "extrasSections.s_ir-lights.irLightMode.o_Auto.label": "Auto (camera decides)",
33
31
  "extrasSections.s_ir-lights.irLightMode.o_Manual.label": "Always on",
34
32
  "extrasSections.s_ir-lights.irLightMode.o_Off.label": "Always off",
35
33
  "extrasSections.s_ir-lights.irLightBrightness.label": "IR brightness",
36
- "extrasSections.s_ir-lights.irLightBrightness.description": "IR LED output (`MiddleLight[0].Light`, 0–100). Applied in Auto and Manual modes.",
37
34
  "extrasSections.s_ir-lights.statusLedEnabled.label": "Status LED",
38
- "extrasSections.s_ir-lights.statusLedEnabled.description": "The visible indicator LED on the camera body (`LightGlobal[0].Enable`).",
39
35
  "extrasSections.s_time-ntp.title": "Time / NTP",
40
- "extrasSections.s_time-ntp.description": "Network time sync (`NTP.*` over Dahua CGI). The timezone is the Dahua numeric index (0–33) exactly as listed in the camera web UI — 26 is the GMT+8 factory default. NOTE: with NTP disabled this camera drifts badly (it currently believes the year is 2000).",
36
+ "extrasSections.s_time-ntp.description": "With NTP disabled this camera's clock drifts badly.",
41
37
  "extrasSections.s_time-ntp.ntpEnabled.label": "NTP sync",
42
38
  "extrasSections.s_time-ntp.ntpServer.label": "NTP server",
43
39
  "extrasSections.s_time-ntp.ntpPort.label": "NTP port",
44
40
  "extrasSections.s_time-ntp.ntpUpdatePeriodMin.label": "Sync interval (min)",
45
41
  "extrasSections.s_time-ntp.ntpTimeZoneIndex.label": "Timezone index (Dahua, 0–33)",
46
- "extrasSections.s_time-ntp.ntpTimeZoneIndex.description": "Numeric index from the camera web UI timezone list — the firmware rejects anything above 33. Not an IANA zone: the Dahua CGI only speaks this index. 26 = GMT+8 (factory default).",
42
+ "extrasSections.s_time-ntp.ntpTimeZoneIndex.description": "Dahua numeric index (0–33) from the camera web UI timezone list, not an IANA zone. 26 = GMT+8.",
47
43
  "extrasSections.s_auto-reboot.title": "Auto reboot",
48
- "extrasSections.s_auto-reboot.description": "Scheduled automatic reboot (`AutoMaintain.AutoReboot*`). Choose a day (or every day) + time; the camera reboots once per matching window.",
49
44
  "extrasSections.s_auto-reboot.autoRebootEnabled.label": "Auto reboot",
50
45
  "extrasSections.s_auto-reboot.autoRebootDay.label": "Day",
51
46
  "extrasSections.s_auto-reboot.autoRebootDay.o_7.label": "Every day",
package/i18n/it.json CHANGED
@@ -2,24 +2,22 @@
2
2
  "creation.s_identity.title": "Telecamera",
3
3
  "creation.s_identity.name.label": "Nome",
4
4
  "creation.s_credentials.title": "Credenziali",
5
- "creation.s_credentials.description": "Dahua CGI usa l'autenticazione HTTP Digest: nessuna password in chiaro sulla rete, anche su HTTP. Necessaria per il probe dell'host.",
6
5
  "creation.s_credentials.username.label": "Nome utente",
7
6
  "creation.s_credentials.password.label": "Password",
8
7
  "creation.s_connection.title": "Connessione",
9
- "creation.s_connection.description": "Endpoint HTTP(S) Dahua CGI. Porta predefinita 80 (HTTP); passa a 443 + HTTPS per le telecamere con TLS attivo.",
8
+ "creation.s_connection.description": "Usa 443 con HTTPS per le camere con TLS attivo.",
10
9
  "creation.s_connection.host.label": "IP della telecamera",
11
10
  "creation.s_connection.port.label": "Porta",
12
11
  "creation.s_connection.https.label": "Usa HTTPS",
13
12
  "discoveryParams.s_credentials.title": "Credenziali",
14
- "discoveryParams.s_credentials.description": "Precompilate in ogni risultato, così puoi aggiungere la telecamera con un clic. Presuppone che tutte le telecamere condividano queste credenziali.",
13
+ "discoveryParams.s_credentials.description": "Presuppone che tutte le camere abbiano le stesse credenziali.",
15
14
  "discoveryParams.s_credentials.username.label": "Nome utente",
16
15
  "discoveryParams.s_credentials.password.label": "Password",
17
16
  "discoveryParams.s_scan.title": "Opzioni di scansione",
18
- "discoveryParams.s_scan.description": "La scansione della sottorete CGI con credenziali è il percorso affidabile (il WS-Discovery multicast non arriva su una rete macvlan/br0 dell'hub). IMPORTANTE: lasciando la rete vuota si scansiona solo la sottorete dell'HUB. Se le telecamere sono su una sottorete DIVERSA da quella dell'hub, DEVI inserire qui il loro CIDR (ad es. 192.168.60.0/24), altrimenti la scansione non trova nulla.",
17
+ "discoveryParams.s_scan.description": "Lascia vuoto per scansionare la subnet dell'hub; inserisci il CIDR se le camere sono su un'altra subnet (es. 192.168.60.0/24).",
19
18
  "discoveryParams.s_scan.networkCidr.label": "Rete (CIDR): obbligatoria se le telecamere sono su una sottorete diversa dall'hub",
20
19
  "discoveryParams.s_scan.timeoutMs.label": "Timeout WS-Discovery (ms)",
21
20
  "schema.s_connection.title": "Connessione",
22
- "schema.s_connection.description": "Endpoint HTTP(S) Dahua CGI + credenziali Digest. RTSP usa sempre la porta 554.",
23
21
  "schema.s_connection.host.label": "IP della telecamera",
24
22
  "schema.s_connection.port.label": "Porta",
25
23
  "schema.s_connection.https.label": "Usa HTTPS",
@@ -27,25 +25,22 @@
27
25
  "schema.s_connection.username.label": "Nome utente",
28
26
  "schema.s_connection.password.label": "Password",
29
27
  "extrasSections.s_ir-lights.title": "IR + LED di stato",
30
- "extrasSections.s_ir-lights.description": "Illuminatore IR (`Lighting[0][0]`, separato dal filtro IR-cut della scheda Immagine) + LED di stato visibile (`LightGlobal[0].Enable`). `Automatico` lascia che la telecamera piloti i LED IR con la luce ambiente; `Manuale` li accende sempre alla luminosità impostata; `Spento` li disattiva. Tutto viene inviato con `setConfig` Dahua CGI al salvataggio.",
28
+ "extrasSections.s_ir-lights.description": "`Auto` segue la luce ambientale; `Manual` accende i LED alla luminosità impostata.",
31
29
  "extrasSections.s_ir-lights.irLightMode.label": "Illuminatore IR",
32
30
  "extrasSections.s_ir-lights.irLightMode.o_Auto.label": "Automatico (decide la telecamera)",
33
31
  "extrasSections.s_ir-lights.irLightMode.o_Manual.label": "Sempre acceso",
34
32
  "extrasSections.s_ir-lights.irLightMode.o_Off.label": "Sempre spento",
35
33
  "extrasSections.s_ir-lights.irLightBrightness.label": "Luminosità IR",
36
- "extrasSections.s_ir-lights.irLightBrightness.description": "Potenza dei LED IR (`MiddleLight[0].Light`, 0–100). Applicata nelle modalità Automatico e Manuale.",
37
34
  "extrasSections.s_ir-lights.statusLedEnabled.label": "LED di stato",
38
- "extrasSections.s_ir-lights.statusLedEnabled.description": "L'indicatore visibile sul corpo della telecamera (`LightGlobal[0].Enable`).",
39
35
  "extrasSections.s_time-ntp.title": "Ora / NTP",
40
- "extrasSections.s_time-ntp.description": "Sincronizzazione dell'ora di rete (`NTP.*` via Dahua CGI). Il fuso orario è l'indice numerico Dahua (0–33) esattamente come nell'elenco dell'interfaccia web della telecamera: 26 è il predefinito di fabbrica (GMT+8). NOTA: con NTP disattivato questa telecamera deriva molto (attualmente crede che sia l'anno 2000).",
36
+ "extrasSections.s_time-ntp.description": "Con NTP disattivato l'orologio di questa camera va fuori sincrono.",
41
37
  "extrasSections.s_time-ntp.ntpEnabled.label": "Sincronizzazione NTP",
42
38
  "extrasSections.s_time-ntp.ntpServer.label": "Server NTP",
43
39
  "extrasSections.s_time-ntp.ntpPort.label": "Porta NTP",
44
40
  "extrasSections.s_time-ntp.ntpUpdatePeriodMin.label": "Intervallo di sincronizzazione (min)",
45
41
  "extrasSections.s_time-ntp.ntpTimeZoneIndex.label": "Indice del fuso orario (Dahua, 0–33)",
46
- "extrasSections.s_time-ntp.ntpTimeZoneIndex.description": "Indice numerico dall'elenco dei fusi orari dell'interfaccia web della telecamera: il firmware rifiuta valori sopra 33. Non è una zona IANA: il Dahua CGI usa solo questo indice. 26 = GMT+8 (predefinito di fabbrica).",
42
+ "extrasSections.s_time-ntp.ntpTimeZoneIndex.description": "Indice numerico Dahua (0–33) dalla lista dei fusi orari della web UI della camera, non una zona IANA. 26 = GMT+8.",
47
43
  "extrasSections.s_auto-reboot.title": "Riavvio automatico",
48
- "extrasSections.s_auto-reboot.description": "Riavvio automatico programmato (`AutoMaintain.AutoReboot*`). Scegli un giorno (o ogni giorno) e un orario; la telecamera si riavvia una volta per ogni finestra corrispondente.",
49
44
  "extrasSections.s_auto-reboot.autoRebootEnabled.label": "Riavvio automatico",
50
45
  "extrasSections.s_auto-reboot.autoRebootDay.label": "Giorno",
51
46
  "extrasSections.s_auto-reboot.autoRebootDay.o_7.label": "Ogni giorno",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-amcrest",
3
- "version": "0.2.152",
3
+ "version": "0.2.154",
4
4
  "description": "Amcrest/Dahua camera device provider addon for CamStack — Dahua CGI over HTTP(S) with digest auth (snapshot, RTSP catalog, PTZ, image/day-night config)",
5
5
  "keywords": [
6
6
  "camstack",