@camstack/addon-provider-amcrest 0.2.151 → 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-DOl51-Ij.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
@@ -723,6 +732,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
723
732
  EventCategory["BackupRestored"] = "backup.restored";
724
733
  EventCategory["NotificationDispatched"] = "notification.dispatched";
725
734
  EventCategory["NotificationFailed"] = "notification.failed";
735
+ /**
736
+ * A notification rule that cannot work (D905): its stored row does not load,
737
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
738
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
739
+ */
740
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
741
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
742
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
726
743
  EventCategory["DeviceUpdated"] = "device.updated";
727
744
  /**
728
745
  * Transport-level connectivity. Emitted by the device driver when
@@ -5450,7 +5467,7 @@ var ZodIssueCode = {
5450
5467
  var ZodFirstPartyTypeKind;
5451
5468
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5452
5469
  //#endregion
5453
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5470
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5454
5471
  /**
5455
5472
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5456
5473
  * window to float samples (D455).
@@ -7979,7 +7996,7 @@ var EntryDescriptorSchema = object({
7979
7996
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7980
7997
  fields: record(string(), unknown())
7981
7998
  }).strict();
7982
- /** 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. */
7983
8000
  var RecordKindDeclarationSchema = object({
7984
8001
  database: _enum(RECORD_DATABASES).default("settings"),
7985
8002
  class: _enum(RECORD_CLASSES),
@@ -7998,14 +8015,6 @@ var RecordKindDeclarationSchema = object({
7998
8015
  secretPaths: array(string().min(1)).default([]),
7999
8016
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8000
8017
  secretArrayKeys: record(string(), string()).default({}),
8001
- /**
8002
- * RETIRED (D900): the legacy table a kind adopted from during the records
8003
- * migration. Nothing declares it any more and nothing reads it; the schema
8004
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8005
- * (an orphaned kind is never redeclared) and an addon built before the
8006
- * removal still sends it. Never set it.
8007
- */
8008
- adoptsFrom: string().min(1).optional(),
8009
8018
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8010
8019
  transactFamily: string().min(1).optional(),
8011
8020
  entry: EntryDescriptorSchema.optional()
@@ -12707,17 +12716,6 @@ object({
12707
12716
  createdAt: number(),
12708
12717
  updatedAt: number()
12709
12718
  });
12710
- object({
12711
- id: string(),
12712
- label: string(),
12713
- isAdmin: boolean().default(false),
12714
- allowedProviders: AllowedProviderSchema,
12715
- allowedDevices: AllowedDevicesSchema,
12716
- tokenHash: string(),
12717
- tokenPrefix: string(),
12718
- createdAt: number(),
12719
- lastUsedAt: number().optional()
12720
- });
12721
12719
  object({
12722
12720
  id: string(),
12723
12721
  userId: string(),
@@ -16699,16 +16697,36 @@ var RecordKindStateSchema = _enum([
16699
16697
  var DeclareKindResultSchema = object({
16700
16698
  kindId: number().int(),
16701
16699
  state: RecordKindStateSchema,
16702
- createdIndexes: array(string()),
16703
- /**
16704
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16705
- * it stays on the wire, null, because an addon built before the removal reads
16706
- * an ABSENT field as "adoption pending" and refuses to start.
16707
- */
16708
- adoptionPending: _null()
16700
+ createdIndexes: array(string())
16709
16701
  });
16710
16702
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16711
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
+ ]);
16712
16730
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16713
16731
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16714
16732
  kind: "mutation",
@@ -16815,6 +16833,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16815
16833
  }), {
16816
16834
  kind: "mutation",
16817
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"
16818
16846
  }), method(object({
16819
16847
  deviceId: number().int(),
16820
16848
  kinds: array(RecordKindNameSchema).optional()
@@ -42522,9 +42550,13 @@ var NcSystemEventKindSchema = _enum([
42522
42550
  "node-updating",
42523
42551
  "node-inference-unavailable",
42524
42552
  "detection-blind",
42553
+ "motion-noisy",
42554
+ "motion-calm",
42525
42555
  "recording-stalled",
42526
42556
  "recording-healthy",
42527
42557
  "recording-degraded",
42558
+ "device-attention-required",
42559
+ "device-attention-resolved",
42528
42560
  "storage-location-low",
42529
42561
  "storage-location-critical",
42530
42562
  "storage-location-ok",
@@ -42548,6 +42580,8 @@ var NcSystemEventKindSchema = _enum([
42548
42580
  "alert-critical",
42549
42581
  "alert-error",
42550
42582
  "alert-critical-resolved",
42583
+ "rule-broken",
42584
+ "rule-repaired",
42551
42585
  "camera-online",
42552
42586
  "camera-offline",
42553
42587
  "camera-disabled",
@@ -56359,6 +56393,16 @@ var DishwasherStatusSchema = object({
56359
56393
  powerState: string().nullable(),
56360
56394
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56361
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(),
56362
56406
  /** Option states: null when the appliance does not expose the option or has not said. */
56363
56407
  halfLoad: boolean().nullable(),
56364
56408
  hygienePlus: boolean().nullable(),
@@ -65471,16 +65515,6 @@ var UpdateUserInputSchema = object({
65471
65515
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65472
65516
  scopes: array(TokenScopeSchema).optional()
65473
65517
  });
65474
- var ApiKeySummarySchema = object({
65475
- id: string(),
65476
- label: string(),
65477
- isAdmin: boolean().default(false),
65478
- allowedProviders: union([array(string()), literal("*")]).optional(),
65479
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65480
- tokenPrefix: string(),
65481
- createdAt: number(),
65482
- lastUsedAt: number().optional()
65483
- });
65484
65518
  var OauthSessionSummarySchema = object({
65485
65519
  id: string(),
65486
65520
  userId: string(),
@@ -65502,8 +65536,7 @@ var TotpStatusSchema = object({
65502
65536
  confirmedAt: number().nullable()
65503
65537
  });
65504
65538
  /**
65505
- * user-management — singleton capability for user accounts and the
65506
- * legacy API-key rows.
65539
+ * user-management — singleton capability for user accounts.
65507
65540
  *
65508
65541
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65509
65542
  * — the subset check on `setUserScopes` is moot
@@ -65559,10 +65592,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65559
65592
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65560
65593
  kind: "mutation",
65561
65594
  access: "view"
65562
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
65563
- kind: "mutation",
65564
- auth: "admin",
65565
- access: "delete"
65566
65595
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65567
65596
  kind: "mutation",
65568
65597
  auth: "admin",
@@ -75022,6 +75051,12 @@ Object.freeze({
75022
75051
  addonId: null,
75023
75052
  access: "view"
75024
75053
  },
75054
+ "records.transact": {
75055
+ capName: "records",
75056
+ capScope: "system",
75057
+ addonId: null,
75058
+ access: "create"
75059
+ },
75025
75060
  "sceneMonitor.captureReference": {
75026
75061
  capName: "scene-monitor",
75027
75062
  capScope: "device",
@@ -76354,12 +76389,6 @@ Object.freeze({
76354
76389
  addonId: null,
76355
76390
  access: "view"
76356
76391
  },
76357
- "userManagement.listApiKeys": {
76358
- capName: "user-management",
76359
- capScope: "system",
76360
- addonId: null,
76361
- access: "view"
76362
- },
76363
76392
  "userManagement.listExternalIdentities": {
76364
76393
  capName: "user-management",
76365
76394
  capScope: "system",
@@ -76414,12 +76443,6 @@ Object.freeze({
76414
76443
  addonId: null,
76415
76444
  access: "create"
76416
76445
  },
76417
- "userManagement.revokeApiKey": {
76418
- capName: "user-management",
76419
- capScope: "system",
76420
- addonId: null,
76421
- access: "delete"
76422
- },
76423
76446
  "userManagement.revokeOauthSession": {
76424
76447
  capName: "user-management",
76425
76448
  capScope: "system",
@@ -79990,9 +80013,13 @@ new Map(Object.entries({
79990
80013
  "stream-online": "device-events",
79991
80014
  "stream-offline": "device-events",
79992
80015
  "detection-blind": "device-events",
80016
+ "motion-noisy": "device-events",
80017
+ "motion-calm": "device-events",
79993
80018
  "recording-stalled": "device-events",
79994
80019
  "recording-healthy": "device-events",
79995
80020
  "recording-degraded": "device-events",
80021
+ "device-attention-required": "device-events",
80022
+ "device-attention-resolved": "device-events",
79996
80023
  "node-online": "system",
79997
80024
  "node-offline": "system",
79998
80025
  "node-restarting": "system",
@@ -80009,6 +80036,8 @@ new Map(Object.entries({
80009
80036
  "alert-critical": "system",
80010
80037
  "alert-error": "system",
80011
80038
  "alert-critical-resolved": "system",
80039
+ "rule-broken": "system",
80040
+ "rule-repaired": "system",
80012
80041
  "storage-location-low": "system",
80013
80042
  "storage-location-critical": "system",
80014
80043
  "storage-location-ok": "system",
@@ -80073,6 +80102,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80073
80102
  label: "Detecting nothing",
80074
80103
  kinds: ["detection-blind"]
80075
80104
  },
80105
+ {
80106
+ id: "motion-noise",
80107
+ family: "device-events",
80108
+ label: "Motion without a subject",
80109
+ kinds: ["motion-noisy", "motion-calm"]
80110
+ },
80076
80111
  {
80077
80112
  id: "recording",
80078
80113
  family: "device-events",
@@ -80083,6 +80118,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80083
80118
  "recording-degraded"
80084
80119
  ]
80085
80120
  },
80121
+ {
80122
+ id: "device-attention",
80123
+ family: "device-events",
80124
+ label: "Needs attention",
80125
+ kinds: ["device-attention-required", "device-attention-resolved"]
80126
+ },
80086
80127
  {
80087
80128
  id: "nodes",
80088
80129
  family: "system",
@@ -80143,6 +80184,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80143
80184
  "alert-critical-resolved"
80144
80185
  ]
80145
80186
  },
80187
+ {
80188
+ id: "rule-health",
80189
+ family: "system",
80190
+ label: "Notification rules",
80191
+ kinds: ["rule-broken", "rule-repaired"]
80192
+ },
80146
80193
  {
80147
80194
  id: "alarm",
80148
80195
  family: "alarm",
@@ -80216,6 +80263,7 @@ var ALERT_EPISODE = [
80216
80263
  "alert-error",
80217
80264
  "alert-critical-resolved"
80218
80265
  ];
80266
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
80219
80267
  var UPDATES = [
80220
80268
  "addon-update-available",
80221
80269
  "server-update-available",
@@ -80245,9 +80293,12 @@ var DEVICE_EVENTS = [
80245
80293
  "stream-online",
80246
80294
  "stream-offline",
80247
80295
  "detection-blind",
80296
+ "motion-noisy",
80297
+ "motion-calm",
80248
80298
  "recording-stalled",
80249
80299
  "recording-healthy",
80250
80300
  "recording-degraded",
80301
+ ...DEVICE_ATTENTION,
80251
80302
  ...ALARM
80252
80303
  ];
80253
80304
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80415,7 +80466,13 @@ var STATE_SUMMARY_VARS = [
80415
80466
  [...RULE_TEXT],
80416
80467
  [...RULE_TEXT],
80417
80468
  [...RULE_TEXT],
80418
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80469
+ [...RULE_TEXT],
80470
+ [...RULE_TEXT],
80471
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80472
+ [...RULE_TEXT],
80473
+ [...RULE_TEXT],
80474
+ [...RULE_TEXT],
80475
+ [...RULE_TEXT],
80419
80476
  [...RULE_TEXT],
80420
80477
  [...RULE_TEXT],
80421
80478
  [...RULE_TEXT],
@@ -80433,11 +80490,11 @@ var STATE_SUMMARY_VARS = [
80433
80490
  [...RULE_TEXT],
80434
80491
  [...RULE_TEXT],
80435
80492
  [...RULE_TEXT],
80493
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80436
80494
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80495
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80437
80496
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80438
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80439
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80440
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80497
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80441
80498
  [...RULE_TEXT],
80442
80499
  [...RULE_TEXT],
80443
80500
  [...RULE_TEXT],
@@ -80458,6 +80515,125 @@ var STATE_SUMMARY_VARS = [
80458
80515
  [...RULE_TEXT],
80459
80516
  ...STATE_SUMMARY_VARS
80460
80517
  ];
80518
+ new Map([
80519
+ {
80520
+ id: "device-connectivity",
80521
+ family: "device-events",
80522
+ label: "Device connectivity (offline / back online)",
80523
+ bad: ["device-offline"],
80524
+ recovery: ["device-online"],
80525
+ snapshotLabel: "Devices offline now",
80526
+ snapshotSection: "device-state"
80527
+ },
80528
+ {
80529
+ id: "device-switch",
80530
+ family: "device-events",
80531
+ label: "Device switched off / back on",
80532
+ bad: ["device-disabled"],
80533
+ recovery: ["device-enabled"],
80534
+ snapshotLabel: "Devices switched off now",
80535
+ snapshotSection: "device-state"
80536
+ },
80537
+ {
80538
+ id: "stream-connectivity",
80539
+ family: "device-events",
80540
+ label: "Stream connectivity (offline / back online)",
80541
+ bad: ["stream-offline"],
80542
+ recovery: ["stream-online"],
80543
+ snapshotLabel: "Streams offline now",
80544
+ snapshotSection: "streams"
80545
+ },
80546
+ {
80547
+ id: "battery",
80548
+ family: "device-events",
80549
+ label: "Battery (low / back to normal)",
80550
+ bad: ["device-battery-low"],
80551
+ recovery: ["device-battery-normal"],
80552
+ snapshotLabel: "Batteries low now",
80553
+ snapshotSection: "battery"
80554
+ },
80555
+ {
80556
+ id: "consumables",
80557
+ family: "device-events",
80558
+ label: "Consumables (low / replaced)",
80559
+ bad: ["device-consumable-low"],
80560
+ recovery: ["device-consumable-normal"],
80561
+ snapshotLabel: "Consumables low now",
80562
+ snapshotSection: "consumables"
80563
+ },
80564
+ {
80565
+ id: "tanks",
80566
+ family: "device-events",
80567
+ label: "Tanks (low or full / back to normal)",
80568
+ bad: ["device-tank-low", "device-tank-full"],
80569
+ recovery: ["device-tank-normal"],
80570
+ snapshotLabel: "Tanks low or full now",
80571
+ snapshotSection: "tanks"
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
+ },
80582
+ {
80583
+ id: "recording-health",
80584
+ family: "device-events",
80585
+ label: "Recording health (stalled or degraded / recording again)",
80586
+ bad: ["recording-stalled", "recording-degraded"],
80587
+ recovery: ["recording-healthy"],
80588
+ snapshotLabel: "Recordings stalled now",
80589
+ snapshotSection: null
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
+ },
80600
+ {
80601
+ id: "node-connectivity",
80602
+ family: "system",
80603
+ label: "Node connectivity (offline / back online)",
80604
+ bad: ["node-offline"],
80605
+ recovery: ["node-online"],
80606
+ snapshotLabel: "Nodes offline now",
80607
+ snapshotSection: "nodes"
80608
+ },
80609
+ {
80610
+ id: "storage-space",
80611
+ family: "system",
80612
+ label: "Storage space (low or critical / ok again)",
80613
+ bad: ["storage-location-low", "storage-location-critical"],
80614
+ recovery: ["storage-location-ok"],
80615
+ snapshotLabel: "Storage locations low now",
80616
+ snapshotSection: null
80617
+ },
80618
+ {
80619
+ id: "critical-alerts",
80620
+ family: "system",
80621
+ label: "Critical alerts (raised / resolved)",
80622
+ bad: ["alert-critical"],
80623
+ recovery: ["alert-critical-resolved"],
80624
+ snapshotLabel: "Critical alerts open now",
80625
+ snapshotSection: null
80626
+ },
80627
+ {
80628
+ id: "rule-health",
80629
+ family: "system",
80630
+ label: "Rule health (broken / repaired)",
80631
+ bad: ["rule-broken"],
80632
+ recovery: ["rule-repaired"],
80633
+ snapshotLabel: "Notification rules broken now",
80634
+ snapshotSection: null
80635
+ }
80636
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
80461
80637
  new Set([
80462
80638
  "disarmed",
80463
80639
  "armed_home",
@@ -82678,7 +82854,7 @@ function buildExtrasSections(snap) {
82678
82854
  tab: "image",
82679
82855
  title: "IR + status LED",
82680
82856
  titleKey: "provider-amcrest:extrasSections.s_ir-lights.title",
82681
- 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.",
82682
82858
  descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.description",
82683
82859
  columns: 2,
82684
82860
  fields: [
@@ -82711,8 +82887,6 @@ function buildExtrasSections(snap) {
82711
82887
  key: "irLightBrightness",
82712
82888
  label: "IR brightness",
82713
82889
  labelKey: "provider-amcrest:extrasSections.s_ir-lights.irLightBrightness.label",
82714
- description: "IR LED output (`MiddleLight[0].Light`, 0–100). Applied in Auto and Manual modes.",
82715
- descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.irLightBrightness.description",
82716
82890
  min: 0,
82717
82891
  max: 100,
82718
82892
  step: 5,
@@ -82725,8 +82899,6 @@ function buildExtrasSections(snap) {
82725
82899
  key: "statusLedEnabled",
82726
82900
  label: "Status LED",
82727
82901
  labelKey: "provider-amcrest:extrasSections.s_ir-lights.statusLedEnabled.label",
82728
- description: "The visible indicator LED on the camera body (`LightGlobal[0].Enable`).",
82729
- descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.statusLedEnabled.description",
82730
82902
  default: snap.statusLedEnabled ?? true,
82731
82903
  style: "switch",
82732
82904
  span: 2
@@ -82738,7 +82910,7 @@ function buildExtrasSections(snap) {
82738
82910
  tab: "network",
82739
82911
  title: "Time / NTP",
82740
82912
  titleKey: "provider-amcrest:extrasSections.s_time-ntp.title",
82741
- 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.",
82742
82914
  descriptionKey: "provider-amcrest:extrasSections.s_time-ntp.description",
82743
82915
  columns: 2,
82744
82916
  fields: [
@@ -82785,7 +82957,7 @@ function buildExtrasSections(snap) {
82785
82957
  key: "ntpTimeZoneIndex",
82786
82958
  label: "Timezone index (Dahua, 0–33)",
82787
82959
  labelKey: "provider-amcrest:extrasSections.s_time-ntp.ntpTimeZoneIndex.label",
82788
- 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.",
82789
82961
  descriptionKey: "provider-amcrest:extrasSections.s_time-ntp.ntpTimeZoneIndex.description",
82790
82962
  default: snap.ntpTimeZoneIndex ?? 26,
82791
82963
  min: 0,
@@ -82800,8 +82972,6 @@ function buildExtrasSections(snap) {
82800
82972
  tab: "advanced",
82801
82973
  title: "Auto reboot",
82802
82974
  titleKey: "provider-amcrest:extrasSections.s_auto-reboot.title",
82803
- description: "Scheduled automatic reboot (`AutoMaintain.AutoReboot*`). Choose a day (or every day) + time; the camera reboots once per matching window.",
82804
- descriptionKey: "provider-amcrest:extrasSections.s_auto-reboot.description",
82805
82975
  columns: 2,
82806
82976
  fields: [
82807
82977
  {
@@ -83456,8 +83626,6 @@ var AmcrestCamera = class AmcrestCamera extends BaseDevice {
83456
83626
  tab: "general",
83457
83627
  title: "Connection",
83458
83628
  titleKey: "provider-amcrest:schema.s_connection.title",
83459
- description: "Dahua CGI HTTP(S) endpoint + Digest credentials. RTSP is always port 554.",
83460
- descriptionKey: "provider-amcrest:schema.s_connection.description",
83461
83629
  columns: 2,
83462
83630
  fields: [
83463
83631
  {
@@ -97745,8 +97913,6 @@ function buildCreationFormSchema() {
97745
97913
  id: "credentials",
97746
97914
  title: "Credentials",
97747
97915
  titleKey: "provider-amcrest:creation.s_credentials.title",
97748
- description: "Dahua CGI uses HTTP Digest auth — no plaintext password on the wire even over HTTP. Required for the host probe.",
97749
- descriptionKey: "provider-amcrest:creation.s_credentials.description",
97750
97916
  columns: 2,
97751
97917
  fields: [{
97752
97918
  type: "text",
@@ -97768,7 +97934,7 @@ function buildCreationFormSchema() {
97768
97934
  id: "connection",
97769
97935
  title: "Connection",
97770
97936
  titleKey: "provider-amcrest:creation.s_connection.title",
97771
- 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.",
97772
97938
  descriptionKey: "provider-amcrest:creation.s_connection.description",
97773
97939
  columns: 2,
97774
97940
  fields: [
@@ -97814,7 +97980,7 @@ function buildDiscoveryParamsFormSchema() {
97814
97980
  id: "credentials",
97815
97981
  title: "Credentials",
97816
97982
  titleKey: "provider-amcrest:discoveryParams.s_credentials.title",
97817
- 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.",
97818
97984
  descriptionKey: "provider-amcrest:discoveryParams.s_credentials.description",
97819
97985
  columns: 2,
97820
97986
  fields: [{
@@ -97836,7 +98002,7 @@ function buildDiscoveryParamsFormSchema() {
97836
98002
  id: "scan",
97837
98003
  title: "Scan options",
97838
98004
  titleKey: "provider-amcrest:discoveryParams.s_scan.title",
97839
- 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).",
97840
98006
  descriptionKey: "provider-amcrest:discoveryParams.s_scan.description",
97841
98007
  columns: 1,
97842
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-DOl51-Ij.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
@@ -702,6 +711,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
702
711
  EventCategory["BackupRestored"] = "backup.restored";
703
712
  EventCategory["NotificationDispatched"] = "notification.dispatched";
704
713
  EventCategory["NotificationFailed"] = "notification.failed";
714
+ /**
715
+ * A notification rule that cannot work (D905): its stored row does not load,
716
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
717
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
718
+ */
719
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
720
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
721
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
705
722
  EventCategory["DeviceUpdated"] = "device.updated";
706
723
  /**
707
724
  * Transport-level connectivity. Emitted by the device driver when
@@ -5429,7 +5446,7 @@ var ZodIssueCode = {
5429
5446
  var ZodFirstPartyTypeKind;
5430
5447
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5431
5448
  //#endregion
5432
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5449
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5433
5450
  /**
5434
5451
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5435
5452
  * window to float samples (D455).
@@ -7958,7 +7975,7 @@ var EntryDescriptorSchema = object({
7958
7975
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7959
7976
  fields: record(string(), unknown())
7960
7977
  }).strict();
7961
- /** 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. */
7962
7979
  var RecordKindDeclarationSchema = object({
7963
7980
  database: _enum(RECORD_DATABASES).default("settings"),
7964
7981
  class: _enum(RECORD_CLASSES),
@@ -7977,14 +7994,6 @@ var RecordKindDeclarationSchema = object({
7977
7994
  secretPaths: array(string().min(1)).default([]),
7978
7995
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7979
7996
  secretArrayKeys: record(string(), string()).default({}),
7980
- /**
7981
- * RETIRED (D900): the legacy table a kind adopted from during the records
7982
- * migration. Nothing declares it any more and nothing reads it; the schema
7983
- * still ACCEPTS it because the catalog rows the migration wrote carry it
7984
- * (an orphaned kind is never redeclared) and an addon built before the
7985
- * removal still sends it. Never set it.
7986
- */
7987
- adoptsFrom: string().min(1).optional(),
7988
7997
  /** Kinds that must agree through `transact` sit in one file under one family name. */
7989
7998
  transactFamily: string().min(1).optional(),
7990
7999
  entry: EntryDescriptorSchema.optional()
@@ -12686,17 +12695,6 @@ object({
12686
12695
  createdAt: number(),
12687
12696
  updatedAt: number()
12688
12697
  });
12689
- object({
12690
- id: string(),
12691
- label: string(),
12692
- isAdmin: boolean().default(false),
12693
- allowedProviders: AllowedProviderSchema,
12694
- allowedDevices: AllowedDevicesSchema,
12695
- tokenHash: string(),
12696
- tokenPrefix: string(),
12697
- createdAt: number(),
12698
- lastUsedAt: number().optional()
12699
- });
12700
12698
  object({
12701
12699
  id: string(),
12702
12700
  userId: string(),
@@ -16678,16 +16676,36 @@ var RecordKindStateSchema = _enum([
16678
16676
  var DeclareKindResultSchema = object({
16679
16677
  kindId: number().int(),
16680
16678
  state: RecordKindStateSchema,
16681
- createdIndexes: array(string()),
16682
- /**
16683
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16684
- * it stays on the wire, null, because an addon built before the removal reads
16685
- * an ABSENT field as "adoption pending" and refuses to start.
16686
- */
16687
- adoptionPending: _null()
16679
+ createdIndexes: array(string())
16688
16680
  });
16689
16681
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16690
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
+ ]);
16691
16709
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16692
16710
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16693
16711
  kind: "mutation",
@@ -16794,6 +16812,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16794
16812
  }), {
16795
16813
  kind: "mutation",
16796
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"
16797
16825
  }), method(object({
16798
16826
  deviceId: number().int(),
16799
16827
  kinds: array(RecordKindNameSchema).optional()
@@ -42501,9 +42529,13 @@ var NcSystemEventKindSchema = _enum([
42501
42529
  "node-updating",
42502
42530
  "node-inference-unavailable",
42503
42531
  "detection-blind",
42532
+ "motion-noisy",
42533
+ "motion-calm",
42504
42534
  "recording-stalled",
42505
42535
  "recording-healthy",
42506
42536
  "recording-degraded",
42537
+ "device-attention-required",
42538
+ "device-attention-resolved",
42507
42539
  "storage-location-low",
42508
42540
  "storage-location-critical",
42509
42541
  "storage-location-ok",
@@ -42527,6 +42559,8 @@ var NcSystemEventKindSchema = _enum([
42527
42559
  "alert-critical",
42528
42560
  "alert-error",
42529
42561
  "alert-critical-resolved",
42562
+ "rule-broken",
42563
+ "rule-repaired",
42530
42564
  "camera-online",
42531
42565
  "camera-offline",
42532
42566
  "camera-disabled",
@@ -56338,6 +56372,16 @@ var DishwasherStatusSchema = object({
56338
56372
  powerState: string().nullable(),
56339
56373
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56340
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(),
56341
56385
  /** Option states: null when the appliance does not expose the option or has not said. */
56342
56386
  halfLoad: boolean().nullable(),
56343
56387
  hygienePlus: boolean().nullable(),
@@ -65450,16 +65494,6 @@ var UpdateUserInputSchema = object({
65450
65494
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65451
65495
  scopes: array(TokenScopeSchema).optional()
65452
65496
  });
65453
- var ApiKeySummarySchema = object({
65454
- id: string(),
65455
- label: string(),
65456
- isAdmin: boolean().default(false),
65457
- allowedProviders: union([array(string()), literal("*")]).optional(),
65458
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65459
- tokenPrefix: string(),
65460
- createdAt: number(),
65461
- lastUsedAt: number().optional()
65462
- });
65463
65497
  var OauthSessionSummarySchema = object({
65464
65498
  id: string(),
65465
65499
  userId: string(),
@@ -65481,8 +65515,7 @@ var TotpStatusSchema = object({
65481
65515
  confirmedAt: number().nullable()
65482
65516
  });
65483
65517
  /**
65484
- * user-management — singleton capability for user accounts and the
65485
- * legacy API-key rows.
65518
+ * user-management — singleton capability for user accounts.
65486
65519
  *
65487
65520
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65488
65521
  * — the subset check on `setUserScopes` is moot
@@ -65538,10 +65571,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65538
65571
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65539
65572
  kind: "mutation",
65540
65573
  access: "view"
65541
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
65542
- kind: "mutation",
65543
- auth: "admin",
65544
- access: "delete"
65545
65574
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65546
65575
  kind: "mutation",
65547
65576
  auth: "admin",
@@ -75001,6 +75030,12 @@ Object.freeze({
75001
75030
  addonId: null,
75002
75031
  access: "view"
75003
75032
  },
75033
+ "records.transact": {
75034
+ capName: "records",
75035
+ capScope: "system",
75036
+ addonId: null,
75037
+ access: "create"
75038
+ },
75004
75039
  "sceneMonitor.captureReference": {
75005
75040
  capName: "scene-monitor",
75006
75041
  capScope: "device",
@@ -76333,12 +76368,6 @@ Object.freeze({
76333
76368
  addonId: null,
76334
76369
  access: "view"
76335
76370
  },
76336
- "userManagement.listApiKeys": {
76337
- capName: "user-management",
76338
- capScope: "system",
76339
- addonId: null,
76340
- access: "view"
76341
- },
76342
76371
  "userManagement.listExternalIdentities": {
76343
76372
  capName: "user-management",
76344
76373
  capScope: "system",
@@ -76393,12 +76422,6 @@ Object.freeze({
76393
76422
  addonId: null,
76394
76423
  access: "create"
76395
76424
  },
76396
- "userManagement.revokeApiKey": {
76397
- capName: "user-management",
76398
- capScope: "system",
76399
- addonId: null,
76400
- access: "delete"
76401
- },
76402
76425
  "userManagement.revokeOauthSession": {
76403
76426
  capName: "user-management",
76404
76427
  capScope: "system",
@@ -79969,9 +79992,13 @@ new Map(Object.entries({
79969
79992
  "stream-online": "device-events",
79970
79993
  "stream-offline": "device-events",
79971
79994
  "detection-blind": "device-events",
79995
+ "motion-noisy": "device-events",
79996
+ "motion-calm": "device-events",
79972
79997
  "recording-stalled": "device-events",
79973
79998
  "recording-healthy": "device-events",
79974
79999
  "recording-degraded": "device-events",
80000
+ "device-attention-required": "device-events",
80001
+ "device-attention-resolved": "device-events",
79975
80002
  "node-online": "system",
79976
80003
  "node-offline": "system",
79977
80004
  "node-restarting": "system",
@@ -79988,6 +80015,8 @@ new Map(Object.entries({
79988
80015
  "alert-critical": "system",
79989
80016
  "alert-error": "system",
79990
80017
  "alert-critical-resolved": "system",
80018
+ "rule-broken": "system",
80019
+ "rule-repaired": "system",
79991
80020
  "storage-location-low": "system",
79992
80021
  "storage-location-critical": "system",
79993
80022
  "storage-location-ok": "system",
@@ -80052,6 +80081,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80052
80081
  label: "Detecting nothing",
80053
80082
  kinds: ["detection-blind"]
80054
80083
  },
80084
+ {
80085
+ id: "motion-noise",
80086
+ family: "device-events",
80087
+ label: "Motion without a subject",
80088
+ kinds: ["motion-noisy", "motion-calm"]
80089
+ },
80055
80090
  {
80056
80091
  id: "recording",
80057
80092
  family: "device-events",
@@ -80062,6 +80097,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80062
80097
  "recording-degraded"
80063
80098
  ]
80064
80099
  },
80100
+ {
80101
+ id: "device-attention",
80102
+ family: "device-events",
80103
+ label: "Needs attention",
80104
+ kinds: ["device-attention-required", "device-attention-resolved"]
80105
+ },
80065
80106
  {
80066
80107
  id: "nodes",
80067
80108
  family: "system",
@@ -80122,6 +80163,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
80122
80163
  "alert-critical-resolved"
80123
80164
  ]
80124
80165
  },
80166
+ {
80167
+ id: "rule-health",
80168
+ family: "system",
80169
+ label: "Notification rules",
80170
+ kinds: ["rule-broken", "rule-repaired"]
80171
+ },
80125
80172
  {
80126
80173
  id: "alarm",
80127
80174
  family: "alarm",
@@ -80195,6 +80242,7 @@ var ALERT_EPISODE = [
80195
80242
  "alert-error",
80196
80243
  "alert-critical-resolved"
80197
80244
  ];
80245
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
80198
80246
  var UPDATES = [
80199
80247
  "addon-update-available",
80200
80248
  "server-update-available",
@@ -80224,9 +80272,12 @@ var DEVICE_EVENTS = [
80224
80272
  "stream-online",
80225
80273
  "stream-offline",
80226
80274
  "detection-blind",
80275
+ "motion-noisy",
80276
+ "motion-calm",
80227
80277
  "recording-stalled",
80228
80278
  "recording-healthy",
80229
80279
  "recording-degraded",
80280
+ ...DEVICE_ATTENTION,
80230
80281
  ...ALARM
80231
80282
  ];
80232
80283
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80394,7 +80445,13 @@ var STATE_SUMMARY_VARS = [
80394
80445
  [...RULE_TEXT],
80395
80446
  [...RULE_TEXT],
80396
80447
  [...RULE_TEXT],
80397
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80448
+ [...RULE_TEXT],
80449
+ [...RULE_TEXT],
80450
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80451
+ [...RULE_TEXT],
80452
+ [...RULE_TEXT],
80453
+ [...RULE_TEXT],
80454
+ [...RULE_TEXT],
80398
80455
  [...RULE_TEXT],
80399
80456
  [...RULE_TEXT],
80400
80457
  [...RULE_TEXT],
@@ -80412,11 +80469,11 @@ var STATE_SUMMARY_VARS = [
80412
80469
  [...RULE_TEXT],
80413
80470
  [...RULE_TEXT],
80414
80471
  [...RULE_TEXT],
80472
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80415
80473
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80474
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80416
80475
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80417
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80418
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80419
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80476
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80420
80477
  [...RULE_TEXT],
80421
80478
  [...RULE_TEXT],
80422
80479
  [...RULE_TEXT],
@@ -80437,6 +80494,125 @@ var STATE_SUMMARY_VARS = [
80437
80494
  [...RULE_TEXT],
80438
80495
  ...STATE_SUMMARY_VARS
80439
80496
  ];
80497
+ new Map([
80498
+ {
80499
+ id: "device-connectivity",
80500
+ family: "device-events",
80501
+ label: "Device connectivity (offline / back online)",
80502
+ bad: ["device-offline"],
80503
+ recovery: ["device-online"],
80504
+ snapshotLabel: "Devices offline now",
80505
+ snapshotSection: "device-state"
80506
+ },
80507
+ {
80508
+ id: "device-switch",
80509
+ family: "device-events",
80510
+ label: "Device switched off / back on",
80511
+ bad: ["device-disabled"],
80512
+ recovery: ["device-enabled"],
80513
+ snapshotLabel: "Devices switched off now",
80514
+ snapshotSection: "device-state"
80515
+ },
80516
+ {
80517
+ id: "stream-connectivity",
80518
+ family: "device-events",
80519
+ label: "Stream connectivity (offline / back online)",
80520
+ bad: ["stream-offline"],
80521
+ recovery: ["stream-online"],
80522
+ snapshotLabel: "Streams offline now",
80523
+ snapshotSection: "streams"
80524
+ },
80525
+ {
80526
+ id: "battery",
80527
+ family: "device-events",
80528
+ label: "Battery (low / back to normal)",
80529
+ bad: ["device-battery-low"],
80530
+ recovery: ["device-battery-normal"],
80531
+ snapshotLabel: "Batteries low now",
80532
+ snapshotSection: "battery"
80533
+ },
80534
+ {
80535
+ id: "consumables",
80536
+ family: "device-events",
80537
+ label: "Consumables (low / replaced)",
80538
+ bad: ["device-consumable-low"],
80539
+ recovery: ["device-consumable-normal"],
80540
+ snapshotLabel: "Consumables low now",
80541
+ snapshotSection: "consumables"
80542
+ },
80543
+ {
80544
+ id: "tanks",
80545
+ family: "device-events",
80546
+ label: "Tanks (low or full / back to normal)",
80547
+ bad: ["device-tank-low", "device-tank-full"],
80548
+ recovery: ["device-tank-normal"],
80549
+ snapshotLabel: "Tanks low or full now",
80550
+ snapshotSection: "tanks"
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
+ },
80561
+ {
80562
+ id: "recording-health",
80563
+ family: "device-events",
80564
+ label: "Recording health (stalled or degraded / recording again)",
80565
+ bad: ["recording-stalled", "recording-degraded"],
80566
+ recovery: ["recording-healthy"],
80567
+ snapshotLabel: "Recordings stalled now",
80568
+ snapshotSection: null
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
+ },
80579
+ {
80580
+ id: "node-connectivity",
80581
+ family: "system",
80582
+ label: "Node connectivity (offline / back online)",
80583
+ bad: ["node-offline"],
80584
+ recovery: ["node-online"],
80585
+ snapshotLabel: "Nodes offline now",
80586
+ snapshotSection: "nodes"
80587
+ },
80588
+ {
80589
+ id: "storage-space",
80590
+ family: "system",
80591
+ label: "Storage space (low or critical / ok again)",
80592
+ bad: ["storage-location-low", "storage-location-critical"],
80593
+ recovery: ["storage-location-ok"],
80594
+ snapshotLabel: "Storage locations low now",
80595
+ snapshotSection: null
80596
+ },
80597
+ {
80598
+ id: "critical-alerts",
80599
+ family: "system",
80600
+ label: "Critical alerts (raised / resolved)",
80601
+ bad: ["alert-critical"],
80602
+ recovery: ["alert-critical-resolved"],
80603
+ snapshotLabel: "Critical alerts open now",
80604
+ snapshotSection: null
80605
+ },
80606
+ {
80607
+ id: "rule-health",
80608
+ family: "system",
80609
+ label: "Rule health (broken / repaired)",
80610
+ bad: ["rule-broken"],
80611
+ recovery: ["rule-repaired"],
80612
+ snapshotLabel: "Notification rules broken now",
80613
+ snapshotSection: null
80614
+ }
80615
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
80440
80616
  new Set([
80441
80617
  "disarmed",
80442
80618
  "armed_home",
@@ -82657,7 +82833,7 @@ function buildExtrasSections(snap) {
82657
82833
  tab: "image",
82658
82834
  title: "IR + status LED",
82659
82835
  titleKey: "provider-amcrest:extrasSections.s_ir-lights.title",
82660
- 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.",
82661
82837
  descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.description",
82662
82838
  columns: 2,
82663
82839
  fields: [
@@ -82690,8 +82866,6 @@ function buildExtrasSections(snap) {
82690
82866
  key: "irLightBrightness",
82691
82867
  label: "IR brightness",
82692
82868
  labelKey: "provider-amcrest:extrasSections.s_ir-lights.irLightBrightness.label",
82693
- description: "IR LED output (`MiddleLight[0].Light`, 0–100). Applied in Auto and Manual modes.",
82694
- descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.irLightBrightness.description",
82695
82869
  min: 0,
82696
82870
  max: 100,
82697
82871
  step: 5,
@@ -82704,8 +82878,6 @@ function buildExtrasSections(snap) {
82704
82878
  key: "statusLedEnabled",
82705
82879
  label: "Status LED",
82706
82880
  labelKey: "provider-amcrest:extrasSections.s_ir-lights.statusLedEnabled.label",
82707
- description: "The visible indicator LED on the camera body (`LightGlobal[0].Enable`).",
82708
- descriptionKey: "provider-amcrest:extrasSections.s_ir-lights.statusLedEnabled.description",
82709
82881
  default: snap.statusLedEnabled ?? true,
82710
82882
  style: "switch",
82711
82883
  span: 2
@@ -82717,7 +82889,7 @@ function buildExtrasSections(snap) {
82717
82889
  tab: "network",
82718
82890
  title: "Time / NTP",
82719
82891
  titleKey: "provider-amcrest:extrasSections.s_time-ntp.title",
82720
- 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.",
82721
82893
  descriptionKey: "provider-amcrest:extrasSections.s_time-ntp.description",
82722
82894
  columns: 2,
82723
82895
  fields: [
@@ -82764,7 +82936,7 @@ function buildExtrasSections(snap) {
82764
82936
  key: "ntpTimeZoneIndex",
82765
82937
  label: "Timezone index (Dahua, 0–33)",
82766
82938
  labelKey: "provider-amcrest:extrasSections.s_time-ntp.ntpTimeZoneIndex.label",
82767
- 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.",
82768
82940
  descriptionKey: "provider-amcrest:extrasSections.s_time-ntp.ntpTimeZoneIndex.description",
82769
82941
  default: snap.ntpTimeZoneIndex ?? 26,
82770
82942
  min: 0,
@@ -82779,8 +82951,6 @@ function buildExtrasSections(snap) {
82779
82951
  tab: "advanced",
82780
82952
  title: "Auto reboot",
82781
82953
  titleKey: "provider-amcrest:extrasSections.s_auto-reboot.title",
82782
- description: "Scheduled automatic reboot (`AutoMaintain.AutoReboot*`). Choose a day (or every day) + time; the camera reboots once per matching window.",
82783
- descriptionKey: "provider-amcrest:extrasSections.s_auto-reboot.description",
82784
82954
  columns: 2,
82785
82955
  fields: [
82786
82956
  {
@@ -83435,8 +83605,6 @@ var AmcrestCamera = class AmcrestCamera extends BaseDevice {
83435
83605
  tab: "general",
83436
83606
  title: "Connection",
83437
83607
  titleKey: "provider-amcrest:schema.s_connection.title",
83438
- description: "Dahua CGI HTTP(S) endpoint + Digest credentials. RTSP is always port 554.",
83439
- descriptionKey: "provider-amcrest:schema.s_connection.description",
83440
83608
  columns: 2,
83441
83609
  fields: [
83442
83610
  {
@@ -97724,8 +97892,6 @@ function buildCreationFormSchema() {
97724
97892
  id: "credentials",
97725
97893
  title: "Credentials",
97726
97894
  titleKey: "provider-amcrest:creation.s_credentials.title",
97727
- description: "Dahua CGI uses HTTP Digest auth — no plaintext password on the wire even over HTTP. Required for the host probe.",
97728
- descriptionKey: "provider-amcrest:creation.s_credentials.description",
97729
97895
  columns: 2,
97730
97896
  fields: [{
97731
97897
  type: "text",
@@ -97747,7 +97913,7 @@ function buildCreationFormSchema() {
97747
97913
  id: "connection",
97748
97914
  title: "Connection",
97749
97915
  titleKey: "provider-amcrest:creation.s_connection.title",
97750
- 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.",
97751
97917
  descriptionKey: "provider-amcrest:creation.s_connection.description",
97752
97918
  columns: 2,
97753
97919
  fields: [
@@ -97793,7 +97959,7 @@ function buildDiscoveryParamsFormSchema() {
97793
97959
  id: "credentials",
97794
97960
  title: "Credentials",
97795
97961
  titleKey: "provider-amcrest:discoveryParams.s_credentials.title",
97796
- 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.",
97797
97963
  descriptionKey: "provider-amcrest:discoveryParams.s_credentials.description",
97798
97964
  columns: 2,
97799
97965
  fields: [{
@@ -97815,7 +97981,7 @@ function buildDiscoveryParamsFormSchema() {
97815
97981
  id: "scan",
97816
97982
  title: "Scan options",
97817
97983
  titleKey: "provider-amcrest:discoveryParams.s_scan.title",
97818
- 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).",
97819
97985
  descriptionKey: "provider-amcrest:discoveryParams.s_scan.description",
97820
97986
  columns: 1,
97821
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.151",
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",