@camstack/addon-provider-amcrest 0.2.152 → 0.2.153

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",
@@ -56369,6 +56393,16 @@ var DishwasherStatusSchema = object({
56369
56393
  powerState: string().nullable(),
56370
56394
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56371
56395
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56396
+ /**
56397
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56398
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56399
+ * when none is reported. A cleared reminder is not an unknown one.
56400
+ */
56401
+ filterCleaningDue: boolean().nullable(),
56402
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56403
+ machineCareDue: boolean().nullable(),
56404
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56405
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56372
56406
  /** Option states: null when the appliance does not expose the option or has not said. */
56373
56407
  halfLoad: boolean().nullable(),
56374
56408
  hygienePlus: boolean().nullable(),
@@ -65481,16 +65515,6 @@ var UpdateUserInputSchema = object({
65481
65515
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65482
65516
  scopes: array(TokenScopeSchema).optional()
65483
65517
  });
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
65518
  var OauthSessionSummarySchema = object({
65495
65519
  id: string(),
65496
65520
  userId: string(),
@@ -65512,8 +65536,7 @@ var TotpStatusSchema = object({
65512
65536
  confirmedAt: number().nullable()
65513
65537
  });
65514
65538
  /**
65515
- * user-management — singleton capability for user accounts and the
65516
- * legacy API-key rows.
65539
+ * user-management — singleton capability for user accounts.
65517
65540
  *
65518
65541
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65519
65542
  * — the subset check on `setUserScopes` is moot
@@ -65569,10 +65592,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65569
65592
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65570
65593
  kind: "mutation",
65571
65594
  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
65595
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65577
65596
  kind: "mutation",
65578
65597
  auth: "admin",
@@ -75032,6 +75051,12 @@ Object.freeze({
75032
75051
  addonId: null,
75033
75052
  access: "view"
75034
75053
  },
75054
+ "records.transact": {
75055
+ capName: "records",
75056
+ capScope: "system",
75057
+ addonId: null,
75058
+ access: "create"
75059
+ },
75035
75060
  "sceneMonitor.captureReference": {
75036
75061
  capName: "scene-monitor",
75037
75062
  capScope: "device",
@@ -76364,12 +76389,6 @@ Object.freeze({
76364
76389
  addonId: null,
76365
76390
  access: "view"
76366
76391
  },
76367
- "userManagement.listApiKeys": {
76368
- capName: "user-management",
76369
- capScope: "system",
76370
- addonId: null,
76371
- access: "view"
76372
- },
76373
76392
  "userManagement.listExternalIdentities": {
76374
76393
  capName: "user-management",
76375
76394
  capScope: "system",
@@ -76424,12 +76443,6 @@ Object.freeze({
76424
76443
  addonId: null,
76425
76444
  access: "create"
76426
76445
  },
76427
- "userManagement.revokeApiKey": {
76428
- capName: "user-management",
76429
- capScope: "system",
76430
- addonId: null,
76431
- access: "delete"
76432
- },
76433
76446
  "userManagement.revokeOauthSession": {
76434
76447
  capName: "user-management",
76435
76448
  capScope: "system",
@@ -80000,9 +80013,13 @@ new Map(Object.entries({
80000
80013
  "stream-online": "device-events",
80001
80014
  "stream-offline": "device-events",
80002
80015
  "detection-blind": "device-events",
80016
+ "motion-noisy": "device-events",
80017
+ "motion-calm": "device-events",
80003
80018
  "recording-stalled": "device-events",
80004
80019
  "recording-healthy": "device-events",
80005
80020
  "recording-degraded": "device-events",
80021
+ "device-attention-required": "device-events",
80022
+ "device-attention-resolved": "device-events",
80006
80023
  "node-online": "system",
80007
80024
  "node-offline": "system",
80008
80025
  "node-restarting": "system",
@@ -80085,6 +80102,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80085
80102
  label: "Detecting nothing",
80086
80103
  kinds: ["detection-blind"]
80087
80104
  },
80105
+ {
80106
+ id: "motion-noise",
80107
+ family: "device-events",
80108
+ label: "Motion without a subject",
80109
+ kinds: ["motion-noisy", "motion-calm"]
80110
+ },
80088
80111
  {
80089
80112
  id: "recording",
80090
80113
  family: "device-events",
@@ -80095,6 +80118,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80095
80118
  "recording-degraded"
80096
80119
  ]
80097
80120
  },
80121
+ {
80122
+ id: "device-attention",
80123
+ family: "device-events",
80124
+ label: "Needs attention",
80125
+ kinds: ["device-attention-required", "device-attention-resolved"]
80126
+ },
80098
80127
  {
80099
80128
  id: "nodes",
80100
80129
  family: "system",
@@ -80234,6 +80263,7 @@ var ALERT_EPISODE = [
80234
80263
  "alert-error",
80235
80264
  "alert-critical-resolved"
80236
80265
  ];
80266
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
80237
80267
  var UPDATES = [
80238
80268
  "addon-update-available",
80239
80269
  "server-update-available",
@@ -80263,9 +80293,12 @@ var DEVICE_EVENTS = [
80263
80293
  "stream-online",
80264
80294
  "stream-offline",
80265
80295
  "detection-blind",
80296
+ "motion-noisy",
80297
+ "motion-calm",
80266
80298
  "recording-stalled",
80267
80299
  "recording-healthy",
80268
80300
  "recording-degraded",
80301
+ ...DEVICE_ATTENTION,
80269
80302
  ...ALARM
80270
80303
  ];
80271
80304
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80433,7 +80466,9 @@ var STATE_SUMMARY_VARS = [
80433
80466
  [...RULE_TEXT],
80434
80467
  [...RULE_TEXT],
80435
80468
  [...RULE_TEXT],
80436
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80469
+ [...RULE_TEXT],
80470
+ [...RULE_TEXT],
80471
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80437
80472
  [...RULE_TEXT],
80438
80473
  [...RULE_TEXT],
80439
80474
  [...RULE_TEXT],
@@ -80455,11 +80490,11 @@ var STATE_SUMMARY_VARS = [
80455
80490
  [...RULE_TEXT],
80456
80491
  [...RULE_TEXT],
80457
80492
  [...RULE_TEXT],
80493
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80458
80494
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80495
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80459
80496
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80460
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80461
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80462
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80497
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80463
80498
  [...RULE_TEXT],
80464
80499
  [...RULE_TEXT],
80465
80500
  [...RULE_TEXT],
@@ -80535,6 +80570,15 @@ new Map([
80535
80570
  snapshotLabel: "Tanks low or full now",
80536
80571
  snapshotSection: "tanks"
80537
80572
  },
80573
+ {
80574
+ id: "motion-noise",
80575
+ family: "device-events",
80576
+ label: "Motion without a subject (constant / calm again)",
80577
+ bad: ["motion-noisy"],
80578
+ recovery: ["motion-calm"],
80579
+ snapshotLabel: "Cameras with constant motion now",
80580
+ snapshotSection: null
80581
+ },
80538
80582
  {
80539
80583
  id: "recording-health",
80540
80584
  family: "device-events",
@@ -80544,6 +80588,15 @@ new Map([
80544
80588
  snapshotLabel: "Recordings stalled now",
80545
80589
  snapshotSection: null
80546
80590
  },
80591
+ {
80592
+ id: "device-attention",
80593
+ family: "device-events",
80594
+ label: "Device needs attention (raised / resolved)",
80595
+ bad: ["device-attention-required"],
80596
+ recovery: ["device-attention-resolved"],
80597
+ snapshotLabel: "Devices needing attention now",
80598
+ snapshotSection: null
80599
+ },
80547
80600
  {
80548
80601
  id: "node-connectivity",
80549
80602
  family: "system",
@@ -82801,7 +82854,7 @@ function buildExtrasSections(snap) {
82801
82854
  tab: "image",
82802
82855
  title: "IR + status LED",
82803
82856
  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.",
82857
+ description: "`Auto` follows ambient light; `Manual` forces the LEDs on at the set brightness.",
82805
82858
  descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.description",
82806
82859
  columns: 2,
82807
82860
  fields: [
@@ -82834,8 +82887,6 @@ function buildExtrasSections(snap) {
82834
82887
  key: "irLightBrightness",
82835
82888
  label: "IR brightness",
82836
82889
  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
82890
  min: 0,
82840
82891
  max: 100,
82841
82892
  step: 5,
@@ -82848,8 +82899,6 @@ function buildExtrasSections(snap) {
82848
82899
  key: "statusLedEnabled",
82849
82900
  label: "Status LED",
82850
82901
  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
82902
  default: snap.statusLedEnabled ?? true,
82854
82903
  style: "switch",
82855
82904
  span: 2
@@ -82861,7 +82910,7 @@ function buildExtrasSections(snap) {
82861
82910
  tab: "network",
82862
82911
  title: "Time / NTP",
82863
82912
  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).",
82913
+ description: "With NTP disabled this camera's clock drifts badly.",
82865
82914
  descriptionKey: "provider-amcrest:extrasSections.s_time-ntp.description",
82866
82915
  columns: 2,
82867
82916
  fields: [
@@ -82908,7 +82957,7 @@ function buildExtrasSections(snap) {
82908
82957
  key: "ntpTimeZoneIndex",
82909
82958
  label: "Timezone index (Dahua, 0–33)",
82910
82959
  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).",
82960
+ description: "Dahua numeric index (0–33) from the camera web UI timezone list, not an IANA zone. 26 = GMT+8.",
82912
82961
  descriptionKey: "provider-amcrest:extrasSections.s_time-ntp.ntpTimeZoneIndex.description",
82913
82962
  default: snap.ntpTimeZoneIndex ?? 26,
82914
82963
  min: 0,
@@ -82923,8 +82972,6 @@ function buildExtrasSections(snap) {
82923
82972
  tab: "advanced",
82924
82973
  title: "Auto reboot",
82925
82974
  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
82975
  columns: 2,
82929
82976
  fields: [
82930
82977
  {
@@ -83579,8 +83626,6 @@ var AmcrestCamera = class AmcrestCamera extends BaseDevice {
83579
83626
  tab: "general",
83580
83627
  title: "Connection",
83581
83628
  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
83629
  columns: 2,
83585
83630
  fields: [
83586
83631
  {
@@ -97868,8 +97913,6 @@ function buildCreationFormSchema() {
97868
97913
  id: "credentials",
97869
97914
  title: "Credentials",
97870
97915
  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
97916
  columns: 2,
97874
97917
  fields: [{
97875
97918
  type: "text",
@@ -97891,7 +97934,7 @@ function buildCreationFormSchema() {
97891
97934
  id: "connection",
97892
97935
  title: "Connection",
97893
97936
  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.",
97937
+ description: "Use 443 with HTTPS for cameras with TLS enabled.",
97895
97938
  descriptionKey: "provider-amcrest:creation.s_connection.description",
97896
97939
  columns: 2,
97897
97940
  fields: [
@@ -97937,7 +97980,7 @@ function buildDiscoveryParamsFormSchema() {
97937
97980
  id: "credentials",
97938
97981
  title: "Credentials",
97939
97982
  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.",
97983
+ description: "Assumes all cameras share these credentials.",
97941
97984
  descriptionKey: "provider-amcrest:discoveryParams.s_credentials.description",
97942
97985
  columns: 2,
97943
97986
  fields: [{
@@ -97959,7 +98002,7 @@ function buildDiscoveryParamsFormSchema() {
97959
98002
  id: "scan",
97960
98003
  title: "Scan options",
97961
98004
  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.",
98005
+ 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
98006
  descriptionKey: "provider-amcrest:discoveryParams.s_scan.description",
97964
98007
  columns: 1,
97965
98008
  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",
@@ -56348,6 +56372,16 @@ var DishwasherStatusSchema = object({
56348
56372
  powerState: string().nullable(),
56349
56373
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56350
56374
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56375
+ /**
56376
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56377
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56378
+ * when none is reported. A cleared reminder is not an unknown one.
56379
+ */
56380
+ filterCleaningDue: boolean().nullable(),
56381
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56382
+ machineCareDue: boolean().nullable(),
56383
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56384
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56351
56385
  /** Option states: null when the appliance does not expose the option or has not said. */
56352
56386
  halfLoad: boolean().nullable(),
56353
56387
  hygienePlus: boolean().nullable(),
@@ -65460,16 +65494,6 @@ var UpdateUserInputSchema = object({
65460
65494
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65461
65495
  scopes: array(TokenScopeSchema).optional()
65462
65496
  });
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
65497
  var OauthSessionSummarySchema = object({
65474
65498
  id: string(),
65475
65499
  userId: string(),
@@ -65491,8 +65515,7 @@ var TotpStatusSchema = object({
65491
65515
  confirmedAt: number().nullable()
65492
65516
  });
65493
65517
  /**
65494
- * user-management — singleton capability for user accounts and the
65495
- * legacy API-key rows.
65518
+ * user-management — singleton capability for user accounts.
65496
65519
  *
65497
65520
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65498
65521
  * — the subset check on `setUserScopes` is moot
@@ -65548,10 +65571,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65548
65571
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65549
65572
  kind: "mutation",
65550
65573
  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
65574
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65556
65575
  kind: "mutation",
65557
65576
  auth: "admin",
@@ -75011,6 +75030,12 @@ Object.freeze({
75011
75030
  addonId: null,
75012
75031
  access: "view"
75013
75032
  },
75033
+ "records.transact": {
75034
+ capName: "records",
75035
+ capScope: "system",
75036
+ addonId: null,
75037
+ access: "create"
75038
+ },
75014
75039
  "sceneMonitor.captureReference": {
75015
75040
  capName: "scene-monitor",
75016
75041
  capScope: "device",
@@ -76343,12 +76368,6 @@ Object.freeze({
76343
76368
  addonId: null,
76344
76369
  access: "view"
76345
76370
  },
76346
- "userManagement.listApiKeys": {
76347
- capName: "user-management",
76348
- capScope: "system",
76349
- addonId: null,
76350
- access: "view"
76351
- },
76352
76371
  "userManagement.listExternalIdentities": {
76353
76372
  capName: "user-management",
76354
76373
  capScope: "system",
@@ -76403,12 +76422,6 @@ Object.freeze({
76403
76422
  addonId: null,
76404
76423
  access: "create"
76405
76424
  },
76406
- "userManagement.revokeApiKey": {
76407
- capName: "user-management",
76408
- capScope: "system",
76409
- addonId: null,
76410
- access: "delete"
76411
- },
76412
76425
  "userManagement.revokeOauthSession": {
76413
76426
  capName: "user-management",
76414
76427
  capScope: "system",
@@ -79979,9 +79992,13 @@ new Map(Object.entries({
79979
79992
  "stream-online": "device-events",
79980
79993
  "stream-offline": "device-events",
79981
79994
  "detection-blind": "device-events",
79995
+ "motion-noisy": "device-events",
79996
+ "motion-calm": "device-events",
79982
79997
  "recording-stalled": "device-events",
79983
79998
  "recording-healthy": "device-events",
79984
79999
  "recording-degraded": "device-events",
80000
+ "device-attention-required": "device-events",
80001
+ "device-attention-resolved": "device-events",
79985
80002
  "node-online": "system",
79986
80003
  "node-offline": "system",
79987
80004
  "node-restarting": "system",
@@ -80064,6 +80081,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80064
80081
  label: "Detecting nothing",
80065
80082
  kinds: ["detection-blind"]
80066
80083
  },
80084
+ {
80085
+ id: "motion-noise",
80086
+ family: "device-events",
80087
+ label: "Motion without a subject",
80088
+ kinds: ["motion-noisy", "motion-calm"]
80089
+ },
80067
80090
  {
80068
80091
  id: "recording",
80069
80092
  family: "device-events",
@@ -80074,6 +80097,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80074
80097
  "recording-degraded"
80075
80098
  ]
80076
80099
  },
80100
+ {
80101
+ id: "device-attention",
80102
+ family: "device-events",
80103
+ label: "Needs attention",
80104
+ kinds: ["device-attention-required", "device-attention-resolved"]
80105
+ },
80077
80106
  {
80078
80107
  id: "nodes",
80079
80108
  family: "system",
@@ -80213,6 +80242,7 @@ var ALERT_EPISODE = [
80213
80242
  "alert-error",
80214
80243
  "alert-critical-resolved"
80215
80244
  ];
80245
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
80216
80246
  var UPDATES = [
80217
80247
  "addon-update-available",
80218
80248
  "server-update-available",
@@ -80242,9 +80272,12 @@ var DEVICE_EVENTS = [
80242
80272
  "stream-online",
80243
80273
  "stream-offline",
80244
80274
  "detection-blind",
80275
+ "motion-noisy",
80276
+ "motion-calm",
80245
80277
  "recording-stalled",
80246
80278
  "recording-healthy",
80247
80279
  "recording-degraded",
80280
+ ...DEVICE_ATTENTION,
80248
80281
  ...ALARM
80249
80282
  ];
80250
80283
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80412,7 +80445,9 @@ var STATE_SUMMARY_VARS = [
80412
80445
  [...RULE_TEXT],
80413
80446
  [...RULE_TEXT],
80414
80447
  [...RULE_TEXT],
80415
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80448
+ [...RULE_TEXT],
80449
+ [...RULE_TEXT],
80450
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80416
80451
  [...RULE_TEXT],
80417
80452
  [...RULE_TEXT],
80418
80453
  [...RULE_TEXT],
@@ -80434,11 +80469,11 @@ var STATE_SUMMARY_VARS = [
80434
80469
  [...RULE_TEXT],
80435
80470
  [...RULE_TEXT],
80436
80471
  [...RULE_TEXT],
80472
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80437
80473
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80474
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80438
80475
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80439
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80440
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80441
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80476
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80442
80477
  [...RULE_TEXT],
80443
80478
  [...RULE_TEXT],
80444
80479
  [...RULE_TEXT],
@@ -80514,6 +80549,15 @@ new Map([
80514
80549
  snapshotLabel: "Tanks low or full now",
80515
80550
  snapshotSection: "tanks"
80516
80551
  },
80552
+ {
80553
+ id: "motion-noise",
80554
+ family: "device-events",
80555
+ label: "Motion without a subject (constant / calm again)",
80556
+ bad: ["motion-noisy"],
80557
+ recovery: ["motion-calm"],
80558
+ snapshotLabel: "Cameras with constant motion now",
80559
+ snapshotSection: null
80560
+ },
80517
80561
  {
80518
80562
  id: "recording-health",
80519
80563
  family: "device-events",
@@ -80523,6 +80567,15 @@ new Map([
80523
80567
  snapshotLabel: "Recordings stalled now",
80524
80568
  snapshotSection: null
80525
80569
  },
80570
+ {
80571
+ id: "device-attention",
80572
+ family: "device-events",
80573
+ label: "Device needs attention (raised / resolved)",
80574
+ bad: ["device-attention-required"],
80575
+ recovery: ["device-attention-resolved"],
80576
+ snapshotLabel: "Devices needing attention now",
80577
+ snapshotSection: null
80578
+ },
80526
80579
  {
80527
80580
  id: "node-connectivity",
80528
80581
  family: "system",
@@ -82780,7 +82833,7 @@ function buildExtrasSections(snap) {
82780
82833
  tab: "image",
82781
82834
  title: "IR + status LED",
82782
82835
  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.",
82836
+ description: "`Auto` follows ambient light; `Manual` forces the LEDs on at the set brightness.",
82784
82837
  descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.description",
82785
82838
  columns: 2,
82786
82839
  fields: [
@@ -82813,8 +82866,6 @@ function buildExtrasSections(snap) {
82813
82866
  key: "irLightBrightness",
82814
82867
  label: "IR brightness",
82815
82868
  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
82869
  min: 0,
82819
82870
  max: 100,
82820
82871
  step: 5,
@@ -82827,8 +82878,6 @@ function buildExtrasSections(snap) {
82827
82878
  key: "statusLedEnabled",
82828
82879
  label: "Status LED",
82829
82880
  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
82881
  default: snap.statusLedEnabled ?? true,
82833
82882
  style: "switch",
82834
82883
  span: 2
@@ -82840,7 +82889,7 @@ function buildExtrasSections(snap) {
82840
82889
  tab: "network",
82841
82890
  title: "Time / NTP",
82842
82891
  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).",
82892
+ description: "With NTP disabled this camera's clock drifts badly.",
82844
82893
  descriptionKey: "provider-amcrest:extrasSections.s_time-ntp.description",
82845
82894
  columns: 2,
82846
82895
  fields: [
@@ -82887,7 +82936,7 @@ function buildExtrasSections(snap) {
82887
82936
  key: "ntpTimeZoneIndex",
82888
82937
  label: "Timezone index (Dahua, 0–33)",
82889
82938
  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).",
82939
+ description: "Dahua numeric index (0–33) from the camera web UI timezone list, not an IANA zone. 26 = GMT+8.",
82891
82940
  descriptionKey: "provider-amcrest:extrasSections.s_time-ntp.ntpTimeZoneIndex.description",
82892
82941
  default: snap.ntpTimeZoneIndex ?? 26,
82893
82942
  min: 0,
@@ -82902,8 +82951,6 @@ function buildExtrasSections(snap) {
82902
82951
  tab: "advanced",
82903
82952
  title: "Auto reboot",
82904
82953
  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
82954
  columns: 2,
82908
82955
  fields: [
82909
82956
  {
@@ -83558,8 +83605,6 @@ var AmcrestCamera = class AmcrestCamera extends BaseDevice {
83558
83605
  tab: "general",
83559
83606
  title: "Connection",
83560
83607
  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
83608
  columns: 2,
83564
83609
  fields: [
83565
83610
  {
@@ -97847,8 +97892,6 @@ function buildCreationFormSchema() {
97847
97892
  id: "credentials",
97848
97893
  title: "Credentials",
97849
97894
  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
97895
  columns: 2,
97853
97896
  fields: [{
97854
97897
  type: "text",
@@ -97870,7 +97913,7 @@ function buildCreationFormSchema() {
97870
97913
  id: "connection",
97871
97914
  title: "Connection",
97872
97915
  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.",
97916
+ description: "Use 443 with HTTPS for cameras with TLS enabled.",
97874
97917
  descriptionKey: "provider-amcrest:creation.s_connection.description",
97875
97918
  columns: 2,
97876
97919
  fields: [
@@ -97916,7 +97959,7 @@ function buildDiscoveryParamsFormSchema() {
97916
97959
  id: "credentials",
97917
97960
  title: "Credentials",
97918
97961
  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.",
97962
+ description: "Assumes all cameras share these credentials.",
97920
97963
  descriptionKey: "provider-amcrest:discoveryParams.s_credentials.description",
97921
97964
  columns: 2,
97922
97965
  fields: [{
@@ -97938,7 +97981,7 @@ function buildDiscoveryParamsFormSchema() {
97938
97981
  id: "scan",
97939
97982
  title: "Scan options",
97940
97983
  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.",
97984
+ 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
97985
  descriptionKey: "provider-amcrest:discoveryParams.s_scan.description",
97943
97986
  columns: 1,
97944
97987
  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.153",
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",