@camstack/addon-provider-ecowitt 0.2.140 → 0.2.142

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
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  let http = require("http");
3
3
  let events = require("events");
4
4
  let dgram = require("dgram");
5
- //#region ../types/dist/event-category-DOl51-Ij.mjs
5
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
6
6
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
7
7
  EventCategory["SystemBoot"] = "system.boot";
8
8
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -319,6 +319,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
319
319
  */
320
320
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
321
321
  /**
322
+ * A camera's motion source has fired constantly with no subject for an hour
323
+ * (motion duty or session count over the bar, zero detections) — it is not
324
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
325
+ * {@link PipelineMotionCalm}.
326
+ */
327
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
328
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
329
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
330
+ /**
322
331
  * Per-camera pipeline config was mutated by the orchestrator
323
332
  * (3-level settings change via `setAgentAddonDefaults` /
324
333
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -690,6 +699,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
690
699
  EventCategory["BackupRestored"] = "backup.restored";
691
700
  EventCategory["NotificationDispatched"] = "notification.dispatched";
692
701
  EventCategory["NotificationFailed"] = "notification.failed";
702
+ /**
703
+ * A notification rule that cannot work (D905): its stored row does not load,
704
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
705
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
706
+ */
707
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
708
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
709
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
693
710
  EventCategory["DeviceUpdated"] = "device.updated";
694
711
  /**
695
712
  * Transport-level connectivity. Emitted by the device driver when
@@ -5417,7 +5434,7 @@ var ZodIssueCode$1 = {
5417
5434
  var ZodFirstPartyTypeKind$1;
5418
5435
  ZodFirstPartyTypeKind$1 || (ZodFirstPartyTypeKind$1 = {});
5419
5436
  //#endregion
5420
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5437
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5421
5438
  /**
5422
5439
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5423
5440
  * window to float samples (D455).
@@ -7946,7 +7963,7 @@ var EntryDescriptorSchema = object({
7946
7963
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7947
7964
  fields: record(string(), unknown())
7948
7965
  }).strict();
7949
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
7966
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7950
7967
  var RecordKindDeclarationSchema = object({
7951
7968
  database: _enum(RECORD_DATABASES).default("settings"),
7952
7969
  class: _enum(RECORD_CLASSES),
@@ -7965,14 +7982,6 @@ var RecordKindDeclarationSchema = object({
7965
7982
  secretPaths: array(string().min(1)).default([]),
7966
7983
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7967
7984
  secretArrayKeys: record(string(), string()).default({}),
7968
- /**
7969
- * RETIRED (D900): the legacy table a kind adopted from during the records
7970
- * migration. Nothing declares it any more and nothing reads it; the schema
7971
- * still ACCEPTS it because the catalog rows the migration wrote carry it
7972
- * (an orphaned kind is never redeclared) and an addon built before the
7973
- * removal still sends it. Never set it.
7974
- */
7975
- adoptsFrom: string().min(1).optional(),
7976
7985
  /** Kinds that must agree through `transact` sit in one file under one family name. */
7977
7986
  transactFamily: string().min(1).optional(),
7978
7987
  entry: EntryDescriptorSchema.optional()
@@ -12664,17 +12673,6 @@ object({
12664
12673
  createdAt: number(),
12665
12674
  updatedAt: number()
12666
12675
  });
12667
- object({
12668
- id: string(),
12669
- label: string(),
12670
- isAdmin: boolean().default(false),
12671
- allowedProviders: AllowedProviderSchema,
12672
- allowedDevices: AllowedDevicesSchema,
12673
- tokenHash: string(),
12674
- tokenPrefix: string(),
12675
- createdAt: number(),
12676
- lastUsedAt: number().optional()
12677
- });
12678
12676
  object({
12679
12677
  id: string(),
12680
12678
  userId: string(),
@@ -16656,16 +16654,36 @@ var RecordKindStateSchema = _enum([
16656
16654
  var DeclareKindResultSchema = object({
16657
16655
  kindId: number().int(),
16658
16656
  state: RecordKindStateSchema,
16659
- createdIndexes: array(string()),
16660
- /**
16661
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16662
- * it stays on the wire, null, because an addon built before the removal reads
16663
- * an ABSENT field as "adoption pending" and refuses to start.
16664
- */
16665
- adoptionPending: _null()
16657
+ createdIndexes: array(string())
16666
16658
  });
16667
16659
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16668
16660
  var SecretRefsList = array(string());
16661
+ /**
16662
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16663
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16664
+ */
16665
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16666
+ object({
16667
+ op: literal("put"),
16668
+ kind: RecordKindNameSchema,
16669
+ record: RecordInputSchema,
16670
+ ifRev: number().int().min(0).optional()
16671
+ }),
16672
+ object({
16673
+ op: literal("patch"),
16674
+ kind: RecordKindNameSchema,
16675
+ id: RecordIdSchema,
16676
+ data: RecordBodySchema,
16677
+ at: number().int().nullable().optional(),
16678
+ expiresAt: number().int().nullable().optional(),
16679
+ ifRev: number().int().min(1).optional()
16680
+ }),
16681
+ object({
16682
+ op: literal("delete"),
16683
+ kind: RecordKindNameSchema,
16684
+ id: RecordIdSchema
16685
+ })
16686
+ ]);
16669
16687
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16670
16688
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16671
16689
  kind: "mutation",
@@ -16772,6 +16790,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16772
16790
  }), {
16773
16791
  kind: "mutation",
16774
16792
  auth: "admin"
16793
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
16794
+ results: array(object({
16795
+ rev: number().int().nullable(),
16796
+ deleted: boolean()
16797
+ })),
16798
+ releasedRefs: SecretRefsList,
16799
+ secretRefs: SecretRefsList
16800
+ }), {
16801
+ kind: "mutation",
16802
+ auth: "admin"
16775
16803
  }), method(object({
16776
16804
  deviceId: number().int(),
16777
16805
  kinds: array(RecordKindNameSchema).optional()
@@ -42479,9 +42507,13 @@ var NcSystemEventKindSchema = _enum([
42479
42507
  "node-updating",
42480
42508
  "node-inference-unavailable",
42481
42509
  "detection-blind",
42510
+ "motion-noisy",
42511
+ "motion-calm",
42482
42512
  "recording-stalled",
42483
42513
  "recording-healthy",
42484
42514
  "recording-degraded",
42515
+ "device-attention-required",
42516
+ "device-attention-resolved",
42485
42517
  "storage-location-low",
42486
42518
  "storage-location-critical",
42487
42519
  "storage-location-ok",
@@ -42505,6 +42537,8 @@ var NcSystemEventKindSchema = _enum([
42505
42537
  "alert-critical",
42506
42538
  "alert-error",
42507
42539
  "alert-critical-resolved",
42540
+ "rule-broken",
42541
+ "rule-repaired",
42508
42542
  "camera-online",
42509
42543
  "camera-offline",
42510
42544
  "camera-disabled",
@@ -55803,6 +55837,16 @@ var DishwasherStatusSchema = object({
55803
55837
  powerState: string().nullable(),
55804
55838
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55805
55839
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55840
+ /**
55841
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55842
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55843
+ * when none is reported. A cleared reminder is not an unknown one.
55844
+ */
55845
+ filterCleaningDue: boolean().nullable(),
55846
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55847
+ machineCareDue: boolean().nullable(),
55848
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55849
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55806
55850
  /** Option states: null when the appliance does not expose the option or has not said. */
55807
55851
  halfLoad: boolean().nullable(),
55808
55852
  hygienePlus: boolean().nullable(),
@@ -64453,16 +64497,6 @@ var UpdateUserInputSchema = object({
64453
64497
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64454
64498
  scopes: array(TokenScopeSchema).optional()
64455
64499
  });
64456
- var ApiKeySummarySchema = object({
64457
- id: string(),
64458
- label: string(),
64459
- isAdmin: boolean().default(false),
64460
- allowedProviders: union([array(string()), literal("*")]).optional(),
64461
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64462
- tokenPrefix: string(),
64463
- createdAt: number(),
64464
- lastUsedAt: number().optional()
64465
- });
64466
64500
  var OauthSessionSummarySchema = object({
64467
64501
  id: string(),
64468
64502
  userId: string(),
@@ -64484,8 +64518,7 @@ var TotpStatusSchema = object({
64484
64518
  confirmedAt: number().nullable()
64485
64519
  });
64486
64520
  /**
64487
- * user-management — singleton capability for user accounts and the
64488
- * legacy API-key rows.
64521
+ * user-management — singleton capability for user accounts.
64489
64522
  *
64490
64523
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64491
64524
  * — the subset check on `setUserScopes` is moot
@@ -64541,10 +64574,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64541
64574
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64542
64575
  kind: "mutation",
64543
64576
  access: "view"
64544
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64545
- kind: "mutation",
64546
- auth: "admin",
64547
- access: "delete"
64548
64577
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64549
64578
  kind: "mutation",
64550
64579
  auth: "admin",
@@ -74000,6 +74029,12 @@ Object.freeze({
74000
74029
  addonId: null,
74001
74030
  access: "view"
74002
74031
  },
74032
+ "records.transact": {
74033
+ capName: "records",
74034
+ capScope: "system",
74035
+ addonId: null,
74036
+ access: "create"
74037
+ },
74003
74038
  "sceneMonitor.captureReference": {
74004
74039
  capName: "scene-monitor",
74005
74040
  capScope: "device",
@@ -75332,12 +75367,6 @@ Object.freeze({
75332
75367
  addonId: null,
75333
75368
  access: "view"
75334
75369
  },
75335
- "userManagement.listApiKeys": {
75336
- capName: "user-management",
75337
- capScope: "system",
75338
- addonId: null,
75339
- access: "view"
75340
- },
75341
75370
  "userManagement.listExternalIdentities": {
75342
75371
  capName: "user-management",
75343
75372
  capScope: "system",
@@ -75392,12 +75421,6 @@ Object.freeze({
75392
75421
  addonId: null,
75393
75422
  access: "create"
75394
75423
  },
75395
- "userManagement.revokeApiKey": {
75396
- capName: "user-management",
75397
- capScope: "system",
75398
- addonId: null,
75399
- access: "delete"
75400
- },
75401
75424
  "userManagement.revokeOauthSession": {
75402
75425
  capName: "user-management",
75403
75426
  capScope: "system",
@@ -78762,9 +78785,13 @@ new Map(Object.entries({
78762
78785
  "stream-online": "device-events",
78763
78786
  "stream-offline": "device-events",
78764
78787
  "detection-blind": "device-events",
78788
+ "motion-noisy": "device-events",
78789
+ "motion-calm": "device-events",
78765
78790
  "recording-stalled": "device-events",
78766
78791
  "recording-healthy": "device-events",
78767
78792
  "recording-degraded": "device-events",
78793
+ "device-attention-required": "device-events",
78794
+ "device-attention-resolved": "device-events",
78768
78795
  "node-online": "system",
78769
78796
  "node-offline": "system",
78770
78797
  "node-restarting": "system",
@@ -78781,6 +78808,8 @@ new Map(Object.entries({
78781
78808
  "alert-critical": "system",
78782
78809
  "alert-error": "system",
78783
78810
  "alert-critical-resolved": "system",
78811
+ "rule-broken": "system",
78812
+ "rule-repaired": "system",
78784
78813
  "storage-location-low": "system",
78785
78814
  "storage-location-critical": "system",
78786
78815
  "storage-location-ok": "system",
@@ -78845,6 +78874,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78845
78874
  label: "Detecting nothing",
78846
78875
  kinds: ["detection-blind"]
78847
78876
  },
78877
+ {
78878
+ id: "motion-noise",
78879
+ family: "device-events",
78880
+ label: "Motion without a subject",
78881
+ kinds: ["motion-noisy", "motion-calm"]
78882
+ },
78848
78883
  {
78849
78884
  id: "recording",
78850
78885
  family: "device-events",
@@ -78855,6 +78890,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78855
78890
  "recording-degraded"
78856
78891
  ]
78857
78892
  },
78893
+ {
78894
+ id: "device-attention",
78895
+ family: "device-events",
78896
+ label: "Needs attention",
78897
+ kinds: ["device-attention-required", "device-attention-resolved"]
78898
+ },
78858
78899
  {
78859
78900
  id: "nodes",
78860
78901
  family: "system",
@@ -78915,6 +78956,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78915
78956
  "alert-critical-resolved"
78916
78957
  ]
78917
78958
  },
78959
+ {
78960
+ id: "rule-health",
78961
+ family: "system",
78962
+ label: "Notification rules",
78963
+ kinds: ["rule-broken", "rule-repaired"]
78964
+ },
78918
78965
  {
78919
78966
  id: "alarm",
78920
78967
  family: "alarm",
@@ -78988,6 +79035,7 @@ var ALERT_EPISODE = [
78988
79035
  "alert-error",
78989
79036
  "alert-critical-resolved"
78990
79037
  ];
79038
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
78991
79039
  var UPDATES = [
78992
79040
  "addon-update-available",
78993
79041
  "server-update-available",
@@ -79017,9 +79065,12 @@ var DEVICE_EVENTS = [
79017
79065
  "stream-online",
79018
79066
  "stream-offline",
79019
79067
  "detection-blind",
79068
+ "motion-noisy",
79069
+ "motion-calm",
79020
79070
  "recording-stalled",
79021
79071
  "recording-healthy",
79022
79072
  "recording-degraded",
79073
+ ...DEVICE_ATTENTION,
79023
79074
  ...ALARM
79024
79075
  ];
79025
79076
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79187,7 +79238,13 @@ var STATE_SUMMARY_VARS = [
79187
79238
  [...RULE_TEXT],
79188
79239
  [...RULE_TEXT],
79189
79240
  [...RULE_TEXT],
79190
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79241
+ [...RULE_TEXT],
79242
+ [...RULE_TEXT],
79243
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79244
+ [...RULE_TEXT],
79245
+ [...RULE_TEXT],
79246
+ [...RULE_TEXT],
79247
+ [...RULE_TEXT],
79191
79248
  [...RULE_TEXT],
79192
79249
  [...RULE_TEXT],
79193
79250
  [...RULE_TEXT],
@@ -79205,11 +79262,11 @@ var STATE_SUMMARY_VARS = [
79205
79262
  [...RULE_TEXT],
79206
79263
  [...RULE_TEXT],
79207
79264
  [...RULE_TEXT],
79265
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79208
79266
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79267
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79209
79268
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79210
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79211
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79212
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79269
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79213
79270
  [...RULE_TEXT],
79214
79271
  [...RULE_TEXT],
79215
79272
  [...RULE_TEXT],
@@ -79230,6 +79287,125 @@ var STATE_SUMMARY_VARS = [
79230
79287
  [...RULE_TEXT],
79231
79288
  ...STATE_SUMMARY_VARS
79232
79289
  ];
79290
+ new Map([
79291
+ {
79292
+ id: "device-connectivity",
79293
+ family: "device-events",
79294
+ label: "Device connectivity (offline / back online)",
79295
+ bad: ["device-offline"],
79296
+ recovery: ["device-online"],
79297
+ snapshotLabel: "Devices offline now",
79298
+ snapshotSection: "device-state"
79299
+ },
79300
+ {
79301
+ id: "device-switch",
79302
+ family: "device-events",
79303
+ label: "Device switched off / back on",
79304
+ bad: ["device-disabled"],
79305
+ recovery: ["device-enabled"],
79306
+ snapshotLabel: "Devices switched off now",
79307
+ snapshotSection: "device-state"
79308
+ },
79309
+ {
79310
+ id: "stream-connectivity",
79311
+ family: "device-events",
79312
+ label: "Stream connectivity (offline / back online)",
79313
+ bad: ["stream-offline"],
79314
+ recovery: ["stream-online"],
79315
+ snapshotLabel: "Streams offline now",
79316
+ snapshotSection: "streams"
79317
+ },
79318
+ {
79319
+ id: "battery",
79320
+ family: "device-events",
79321
+ label: "Battery (low / back to normal)",
79322
+ bad: ["device-battery-low"],
79323
+ recovery: ["device-battery-normal"],
79324
+ snapshotLabel: "Batteries low now",
79325
+ snapshotSection: "battery"
79326
+ },
79327
+ {
79328
+ id: "consumables",
79329
+ family: "device-events",
79330
+ label: "Consumables (low / replaced)",
79331
+ bad: ["device-consumable-low"],
79332
+ recovery: ["device-consumable-normal"],
79333
+ snapshotLabel: "Consumables low now",
79334
+ snapshotSection: "consumables"
79335
+ },
79336
+ {
79337
+ id: "tanks",
79338
+ family: "device-events",
79339
+ label: "Tanks (low or full / back to normal)",
79340
+ bad: ["device-tank-low", "device-tank-full"],
79341
+ recovery: ["device-tank-normal"],
79342
+ snapshotLabel: "Tanks low or full now",
79343
+ snapshotSection: "tanks"
79344
+ },
79345
+ {
79346
+ id: "motion-noise",
79347
+ family: "device-events",
79348
+ label: "Motion without a subject (constant / calm again)",
79349
+ bad: ["motion-noisy"],
79350
+ recovery: ["motion-calm"],
79351
+ snapshotLabel: "Cameras with constant motion now",
79352
+ snapshotSection: null
79353
+ },
79354
+ {
79355
+ id: "recording-health",
79356
+ family: "device-events",
79357
+ label: "Recording health (stalled or degraded / recording again)",
79358
+ bad: ["recording-stalled", "recording-degraded"],
79359
+ recovery: ["recording-healthy"],
79360
+ snapshotLabel: "Recordings stalled now",
79361
+ snapshotSection: null
79362
+ },
79363
+ {
79364
+ id: "device-attention",
79365
+ family: "device-events",
79366
+ label: "Device needs attention (raised / resolved)",
79367
+ bad: ["device-attention-required"],
79368
+ recovery: ["device-attention-resolved"],
79369
+ snapshotLabel: "Devices needing attention now",
79370
+ snapshotSection: null
79371
+ },
79372
+ {
79373
+ id: "node-connectivity",
79374
+ family: "system",
79375
+ label: "Node connectivity (offline / back online)",
79376
+ bad: ["node-offline"],
79377
+ recovery: ["node-online"],
79378
+ snapshotLabel: "Nodes offline now",
79379
+ snapshotSection: "nodes"
79380
+ },
79381
+ {
79382
+ id: "storage-space",
79383
+ family: "system",
79384
+ label: "Storage space (low or critical / ok again)",
79385
+ bad: ["storage-location-low", "storage-location-critical"],
79386
+ recovery: ["storage-location-ok"],
79387
+ snapshotLabel: "Storage locations low now",
79388
+ snapshotSection: null
79389
+ },
79390
+ {
79391
+ id: "critical-alerts",
79392
+ family: "system",
79393
+ label: "Critical alerts (raised / resolved)",
79394
+ bad: ["alert-critical"],
79395
+ recovery: ["alert-critical-resolved"],
79396
+ snapshotLabel: "Critical alerts open now",
79397
+ snapshotSection: null
79398
+ },
79399
+ {
79400
+ id: "rule-health",
79401
+ family: "system",
79402
+ label: "Rule health (broken / repaired)",
79403
+ bad: ["rule-broken"],
79404
+ recovery: ["rule-repaired"],
79405
+ snapshotLabel: "Notification rules broken now",
79406
+ snapshotSection: null
79407
+ }
79408
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
79233
79409
  new Set([
79234
79410
  "disarmed",
79235
79411
  "armed_home",
@@ -85635,7 +85811,7 @@ function buildConnectionFormSchema() {
85635
85811
  id: "transport",
85636
85812
  title: "Transport",
85637
85813
  titleKey: "provider-ecowitt:connection.s_transport.title",
85638
- description: "Choose how CamStack reads the gateway. Local poll connects out to the gateway (recommended). Push listener runs a server the gateway uploads to — configure the gateway \"Customized\" upload to point at this hub.",
85814
+ description: "Local poll connects out to the gateway (recommended). Push listener needs the gateway \"Customized\" upload pointed at this hub.",
85639
85815
  descriptionKey: "provider-ecowitt:connection.s_transport.description",
85640
85816
  columns: 1,
85641
85817
  fields: [{
@@ -85762,7 +85938,7 @@ function buildDiscoveryParamsFormSchema() {
85762
85938
  id: "scan",
85763
85939
  title: "Scan options",
85764
85940
  titleKey: "provider-ecowitt:discoveryParams.s_scan.title",
85765
- description: "Leave empty to scan the local subnet. To scan other subnets, list their broadcast addresses (e.g. 192.168.20.255), gateway IPs (e.g. 192.168.20.181), or CIDRs (e.g. 192.168.20.0/24) — comma or newline separated. Each subnet is swept independently and unreachable ones are skipped.",
85941
+ description: "Leave empty to scan the local subnet; otherwise list broadcast addresses, gateway IPs or CIDRs, comma or newline separated.",
85766
85942
  descriptionKey: "provider-ecowitt:discoveryParams.s_scan.description",
85767
85943
  columns: 1,
85768
85944
  fields: [{
package/dist/addon.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { createServer } from "http";
2
2
  import { EventEmitter } from "events";
3
3
  import { createSocket } from "dgram";
4
- //#region ../types/dist/event-category-DOl51-Ij.mjs
4
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
5
5
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
6
6
  EventCategory["SystemBoot"] = "system.boot";
7
7
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -318,6 +318,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
318
318
  */
319
319
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
320
320
  /**
321
+ * A camera's motion source has fired constantly with no subject for an hour
322
+ * (motion duty or session count over the bar, zero detections) — it is not
323
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
324
+ * {@link PipelineMotionCalm}.
325
+ */
326
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
327
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
328
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
329
+ /**
321
330
  * Per-camera pipeline config was mutated by the orchestrator
322
331
  * (3-level settings change via `setAgentAddonDefaults` /
323
332
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -689,6 +698,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
689
698
  EventCategory["BackupRestored"] = "backup.restored";
690
699
  EventCategory["NotificationDispatched"] = "notification.dispatched";
691
700
  EventCategory["NotificationFailed"] = "notification.failed";
701
+ /**
702
+ * A notification rule that cannot work (D905): its stored row does not load,
703
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
704
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
705
+ */
706
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
707
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
708
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
692
709
  EventCategory["DeviceUpdated"] = "device.updated";
693
710
  /**
694
711
  * Transport-level connectivity. Emitted by the device driver when
@@ -5416,7 +5433,7 @@ var ZodIssueCode$1 = {
5416
5433
  var ZodFirstPartyTypeKind$1;
5417
5434
  ZodFirstPartyTypeKind$1 || (ZodFirstPartyTypeKind$1 = {});
5418
5435
  //#endregion
5419
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5436
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5420
5437
  /**
5421
5438
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5422
5439
  * window to float samples (D455).
@@ -7945,7 +7962,7 @@ var EntryDescriptorSchema = object({
7945
7962
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7946
7963
  fields: record(string(), unknown())
7947
7964
  }).strict();
7948
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
7965
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7949
7966
  var RecordKindDeclarationSchema = object({
7950
7967
  database: _enum(RECORD_DATABASES).default("settings"),
7951
7968
  class: _enum(RECORD_CLASSES),
@@ -7964,14 +7981,6 @@ var RecordKindDeclarationSchema = object({
7964
7981
  secretPaths: array(string().min(1)).default([]),
7965
7982
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7966
7983
  secretArrayKeys: record(string(), string()).default({}),
7967
- /**
7968
- * RETIRED (D900): the legacy table a kind adopted from during the records
7969
- * migration. Nothing declares it any more and nothing reads it; the schema
7970
- * still ACCEPTS it because the catalog rows the migration wrote carry it
7971
- * (an orphaned kind is never redeclared) and an addon built before the
7972
- * removal still sends it. Never set it.
7973
- */
7974
- adoptsFrom: string().min(1).optional(),
7975
7984
  /** Kinds that must agree through `transact` sit in one file under one family name. */
7976
7985
  transactFamily: string().min(1).optional(),
7977
7986
  entry: EntryDescriptorSchema.optional()
@@ -12663,17 +12672,6 @@ object({
12663
12672
  createdAt: number(),
12664
12673
  updatedAt: number()
12665
12674
  });
12666
- object({
12667
- id: string(),
12668
- label: string(),
12669
- isAdmin: boolean().default(false),
12670
- allowedProviders: AllowedProviderSchema,
12671
- allowedDevices: AllowedDevicesSchema,
12672
- tokenHash: string(),
12673
- tokenPrefix: string(),
12674
- createdAt: number(),
12675
- lastUsedAt: number().optional()
12676
- });
12677
12675
  object({
12678
12676
  id: string(),
12679
12677
  userId: string(),
@@ -16655,16 +16653,36 @@ var RecordKindStateSchema = _enum([
16655
16653
  var DeclareKindResultSchema = object({
16656
16654
  kindId: number().int(),
16657
16655
  state: RecordKindStateSchema,
16658
- createdIndexes: array(string()),
16659
- /**
16660
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16661
- * it stays on the wire, null, because an addon built before the removal reads
16662
- * an ABSENT field as "adoption pending" and refuses to start.
16663
- */
16664
- adoptionPending: _null()
16656
+ createdIndexes: array(string())
16665
16657
  });
16666
16658
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16667
16659
  var SecretRefsList = array(string());
16660
+ /**
16661
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16662
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16663
+ */
16664
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16665
+ object({
16666
+ op: literal("put"),
16667
+ kind: RecordKindNameSchema,
16668
+ record: RecordInputSchema,
16669
+ ifRev: number().int().min(0).optional()
16670
+ }),
16671
+ object({
16672
+ op: literal("patch"),
16673
+ kind: RecordKindNameSchema,
16674
+ id: RecordIdSchema,
16675
+ data: RecordBodySchema,
16676
+ at: number().int().nullable().optional(),
16677
+ expiresAt: number().int().nullable().optional(),
16678
+ ifRev: number().int().min(1).optional()
16679
+ }),
16680
+ object({
16681
+ op: literal("delete"),
16682
+ kind: RecordKindNameSchema,
16683
+ id: RecordIdSchema
16684
+ })
16685
+ ]);
16668
16686
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16669
16687
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16670
16688
  kind: "mutation",
@@ -16771,6 +16789,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16771
16789
  }), {
16772
16790
  kind: "mutation",
16773
16791
  auth: "admin"
16792
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
16793
+ results: array(object({
16794
+ rev: number().int().nullable(),
16795
+ deleted: boolean()
16796
+ })),
16797
+ releasedRefs: SecretRefsList,
16798
+ secretRefs: SecretRefsList
16799
+ }), {
16800
+ kind: "mutation",
16801
+ auth: "admin"
16774
16802
  }), method(object({
16775
16803
  deviceId: number().int(),
16776
16804
  kinds: array(RecordKindNameSchema).optional()
@@ -42478,9 +42506,13 @@ var NcSystemEventKindSchema = _enum([
42478
42506
  "node-updating",
42479
42507
  "node-inference-unavailable",
42480
42508
  "detection-blind",
42509
+ "motion-noisy",
42510
+ "motion-calm",
42481
42511
  "recording-stalled",
42482
42512
  "recording-healthy",
42483
42513
  "recording-degraded",
42514
+ "device-attention-required",
42515
+ "device-attention-resolved",
42484
42516
  "storage-location-low",
42485
42517
  "storage-location-critical",
42486
42518
  "storage-location-ok",
@@ -42504,6 +42536,8 @@ var NcSystemEventKindSchema = _enum([
42504
42536
  "alert-critical",
42505
42537
  "alert-error",
42506
42538
  "alert-critical-resolved",
42539
+ "rule-broken",
42540
+ "rule-repaired",
42507
42541
  "camera-online",
42508
42542
  "camera-offline",
42509
42543
  "camera-disabled",
@@ -55802,6 +55836,16 @@ var DishwasherStatusSchema = object({
55802
55836
  powerState: string().nullable(),
55803
55837
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55804
55838
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55839
+ /**
55840
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55841
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55842
+ * when none is reported. A cleared reminder is not an unknown one.
55843
+ */
55844
+ filterCleaningDue: boolean().nullable(),
55845
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55846
+ machineCareDue: boolean().nullable(),
55847
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55848
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55805
55849
  /** Option states: null when the appliance does not expose the option or has not said. */
55806
55850
  halfLoad: boolean().nullable(),
55807
55851
  hygienePlus: boolean().nullable(),
@@ -64452,16 +64496,6 @@ var UpdateUserInputSchema = object({
64452
64496
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64453
64497
  scopes: array(TokenScopeSchema).optional()
64454
64498
  });
64455
- var ApiKeySummarySchema = object({
64456
- id: string(),
64457
- label: string(),
64458
- isAdmin: boolean().default(false),
64459
- allowedProviders: union([array(string()), literal("*")]).optional(),
64460
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64461
- tokenPrefix: string(),
64462
- createdAt: number(),
64463
- lastUsedAt: number().optional()
64464
- });
64465
64499
  var OauthSessionSummarySchema = object({
64466
64500
  id: string(),
64467
64501
  userId: string(),
@@ -64483,8 +64517,7 @@ var TotpStatusSchema = object({
64483
64517
  confirmedAt: number().nullable()
64484
64518
  });
64485
64519
  /**
64486
- * user-management — singleton capability for user accounts and the
64487
- * legacy API-key rows.
64520
+ * user-management — singleton capability for user accounts.
64488
64521
  *
64489
64522
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64490
64523
  * — the subset check on `setUserScopes` is moot
@@ -64540,10 +64573,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64540
64573
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64541
64574
  kind: "mutation",
64542
64575
  access: "view"
64543
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64544
- kind: "mutation",
64545
- auth: "admin",
64546
- access: "delete"
64547
64576
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64548
64577
  kind: "mutation",
64549
64578
  auth: "admin",
@@ -73999,6 +74028,12 @@ Object.freeze({
73999
74028
  addonId: null,
74000
74029
  access: "view"
74001
74030
  },
74031
+ "records.transact": {
74032
+ capName: "records",
74033
+ capScope: "system",
74034
+ addonId: null,
74035
+ access: "create"
74036
+ },
74002
74037
  "sceneMonitor.captureReference": {
74003
74038
  capName: "scene-monitor",
74004
74039
  capScope: "device",
@@ -75331,12 +75366,6 @@ Object.freeze({
75331
75366
  addonId: null,
75332
75367
  access: "view"
75333
75368
  },
75334
- "userManagement.listApiKeys": {
75335
- capName: "user-management",
75336
- capScope: "system",
75337
- addonId: null,
75338
- access: "view"
75339
- },
75340
75369
  "userManagement.listExternalIdentities": {
75341
75370
  capName: "user-management",
75342
75371
  capScope: "system",
@@ -75391,12 +75420,6 @@ Object.freeze({
75391
75420
  addonId: null,
75392
75421
  access: "create"
75393
75422
  },
75394
- "userManagement.revokeApiKey": {
75395
- capName: "user-management",
75396
- capScope: "system",
75397
- addonId: null,
75398
- access: "delete"
75399
- },
75400
75423
  "userManagement.revokeOauthSession": {
75401
75424
  capName: "user-management",
75402
75425
  capScope: "system",
@@ -78761,9 +78784,13 @@ new Map(Object.entries({
78761
78784
  "stream-online": "device-events",
78762
78785
  "stream-offline": "device-events",
78763
78786
  "detection-blind": "device-events",
78787
+ "motion-noisy": "device-events",
78788
+ "motion-calm": "device-events",
78764
78789
  "recording-stalled": "device-events",
78765
78790
  "recording-healthy": "device-events",
78766
78791
  "recording-degraded": "device-events",
78792
+ "device-attention-required": "device-events",
78793
+ "device-attention-resolved": "device-events",
78767
78794
  "node-online": "system",
78768
78795
  "node-offline": "system",
78769
78796
  "node-restarting": "system",
@@ -78780,6 +78807,8 @@ new Map(Object.entries({
78780
78807
  "alert-critical": "system",
78781
78808
  "alert-error": "system",
78782
78809
  "alert-critical-resolved": "system",
78810
+ "rule-broken": "system",
78811
+ "rule-repaired": "system",
78783
78812
  "storage-location-low": "system",
78784
78813
  "storage-location-critical": "system",
78785
78814
  "storage-location-ok": "system",
@@ -78844,6 +78873,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78844
78873
  label: "Detecting nothing",
78845
78874
  kinds: ["detection-blind"]
78846
78875
  },
78876
+ {
78877
+ id: "motion-noise",
78878
+ family: "device-events",
78879
+ label: "Motion without a subject",
78880
+ kinds: ["motion-noisy", "motion-calm"]
78881
+ },
78847
78882
  {
78848
78883
  id: "recording",
78849
78884
  family: "device-events",
@@ -78854,6 +78889,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78854
78889
  "recording-degraded"
78855
78890
  ]
78856
78891
  },
78892
+ {
78893
+ id: "device-attention",
78894
+ family: "device-events",
78895
+ label: "Needs attention",
78896
+ kinds: ["device-attention-required", "device-attention-resolved"]
78897
+ },
78857
78898
  {
78858
78899
  id: "nodes",
78859
78900
  family: "system",
@@ -78914,6 +78955,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78914
78955
  "alert-critical-resolved"
78915
78956
  ]
78916
78957
  },
78958
+ {
78959
+ id: "rule-health",
78960
+ family: "system",
78961
+ label: "Notification rules",
78962
+ kinds: ["rule-broken", "rule-repaired"]
78963
+ },
78917
78964
  {
78918
78965
  id: "alarm",
78919
78966
  family: "alarm",
@@ -78987,6 +79034,7 @@ var ALERT_EPISODE = [
78987
79034
  "alert-error",
78988
79035
  "alert-critical-resolved"
78989
79036
  ];
79037
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
78990
79038
  var UPDATES = [
78991
79039
  "addon-update-available",
78992
79040
  "server-update-available",
@@ -79016,9 +79064,12 @@ var DEVICE_EVENTS = [
79016
79064
  "stream-online",
79017
79065
  "stream-offline",
79018
79066
  "detection-blind",
79067
+ "motion-noisy",
79068
+ "motion-calm",
79019
79069
  "recording-stalled",
79020
79070
  "recording-healthy",
79021
79071
  "recording-degraded",
79072
+ ...DEVICE_ATTENTION,
79022
79073
  ...ALARM
79023
79074
  ];
79024
79075
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79186,7 +79237,13 @@ var STATE_SUMMARY_VARS = [
79186
79237
  [...RULE_TEXT],
79187
79238
  [...RULE_TEXT],
79188
79239
  [...RULE_TEXT],
79189
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79240
+ [...RULE_TEXT],
79241
+ [...RULE_TEXT],
79242
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79243
+ [...RULE_TEXT],
79244
+ [...RULE_TEXT],
79245
+ [...RULE_TEXT],
79246
+ [...RULE_TEXT],
79190
79247
  [...RULE_TEXT],
79191
79248
  [...RULE_TEXT],
79192
79249
  [...RULE_TEXT],
@@ -79204,11 +79261,11 @@ var STATE_SUMMARY_VARS = [
79204
79261
  [...RULE_TEXT],
79205
79262
  [...RULE_TEXT],
79206
79263
  [...RULE_TEXT],
79264
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79207
79265
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79266
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79208
79267
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79209
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79210
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79211
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79268
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79212
79269
  [...RULE_TEXT],
79213
79270
  [...RULE_TEXT],
79214
79271
  [...RULE_TEXT],
@@ -79229,6 +79286,125 @@ var STATE_SUMMARY_VARS = [
79229
79286
  [...RULE_TEXT],
79230
79287
  ...STATE_SUMMARY_VARS
79231
79288
  ];
79289
+ new Map([
79290
+ {
79291
+ id: "device-connectivity",
79292
+ family: "device-events",
79293
+ label: "Device connectivity (offline / back online)",
79294
+ bad: ["device-offline"],
79295
+ recovery: ["device-online"],
79296
+ snapshotLabel: "Devices offline now",
79297
+ snapshotSection: "device-state"
79298
+ },
79299
+ {
79300
+ id: "device-switch",
79301
+ family: "device-events",
79302
+ label: "Device switched off / back on",
79303
+ bad: ["device-disabled"],
79304
+ recovery: ["device-enabled"],
79305
+ snapshotLabel: "Devices switched off now",
79306
+ snapshotSection: "device-state"
79307
+ },
79308
+ {
79309
+ id: "stream-connectivity",
79310
+ family: "device-events",
79311
+ label: "Stream connectivity (offline / back online)",
79312
+ bad: ["stream-offline"],
79313
+ recovery: ["stream-online"],
79314
+ snapshotLabel: "Streams offline now",
79315
+ snapshotSection: "streams"
79316
+ },
79317
+ {
79318
+ id: "battery",
79319
+ family: "device-events",
79320
+ label: "Battery (low / back to normal)",
79321
+ bad: ["device-battery-low"],
79322
+ recovery: ["device-battery-normal"],
79323
+ snapshotLabel: "Batteries low now",
79324
+ snapshotSection: "battery"
79325
+ },
79326
+ {
79327
+ id: "consumables",
79328
+ family: "device-events",
79329
+ label: "Consumables (low / replaced)",
79330
+ bad: ["device-consumable-low"],
79331
+ recovery: ["device-consumable-normal"],
79332
+ snapshotLabel: "Consumables low now",
79333
+ snapshotSection: "consumables"
79334
+ },
79335
+ {
79336
+ id: "tanks",
79337
+ family: "device-events",
79338
+ label: "Tanks (low or full / back to normal)",
79339
+ bad: ["device-tank-low", "device-tank-full"],
79340
+ recovery: ["device-tank-normal"],
79341
+ snapshotLabel: "Tanks low or full now",
79342
+ snapshotSection: "tanks"
79343
+ },
79344
+ {
79345
+ id: "motion-noise",
79346
+ family: "device-events",
79347
+ label: "Motion without a subject (constant / calm again)",
79348
+ bad: ["motion-noisy"],
79349
+ recovery: ["motion-calm"],
79350
+ snapshotLabel: "Cameras with constant motion now",
79351
+ snapshotSection: null
79352
+ },
79353
+ {
79354
+ id: "recording-health",
79355
+ family: "device-events",
79356
+ label: "Recording health (stalled or degraded / recording again)",
79357
+ bad: ["recording-stalled", "recording-degraded"],
79358
+ recovery: ["recording-healthy"],
79359
+ snapshotLabel: "Recordings stalled now",
79360
+ snapshotSection: null
79361
+ },
79362
+ {
79363
+ id: "device-attention",
79364
+ family: "device-events",
79365
+ label: "Device needs attention (raised / resolved)",
79366
+ bad: ["device-attention-required"],
79367
+ recovery: ["device-attention-resolved"],
79368
+ snapshotLabel: "Devices needing attention now",
79369
+ snapshotSection: null
79370
+ },
79371
+ {
79372
+ id: "node-connectivity",
79373
+ family: "system",
79374
+ label: "Node connectivity (offline / back online)",
79375
+ bad: ["node-offline"],
79376
+ recovery: ["node-online"],
79377
+ snapshotLabel: "Nodes offline now",
79378
+ snapshotSection: "nodes"
79379
+ },
79380
+ {
79381
+ id: "storage-space",
79382
+ family: "system",
79383
+ label: "Storage space (low or critical / ok again)",
79384
+ bad: ["storage-location-low", "storage-location-critical"],
79385
+ recovery: ["storage-location-ok"],
79386
+ snapshotLabel: "Storage locations low now",
79387
+ snapshotSection: null
79388
+ },
79389
+ {
79390
+ id: "critical-alerts",
79391
+ family: "system",
79392
+ label: "Critical alerts (raised / resolved)",
79393
+ bad: ["alert-critical"],
79394
+ recovery: ["alert-critical-resolved"],
79395
+ snapshotLabel: "Critical alerts open now",
79396
+ snapshotSection: null
79397
+ },
79398
+ {
79399
+ id: "rule-health",
79400
+ family: "system",
79401
+ label: "Rule health (broken / repaired)",
79402
+ bad: ["rule-broken"],
79403
+ recovery: ["rule-repaired"],
79404
+ snapshotLabel: "Notification rules broken now",
79405
+ snapshotSection: null
79406
+ }
79407
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
79232
79408
  new Set([
79233
79409
  "disarmed",
79234
79410
  "armed_home",
@@ -85634,7 +85810,7 @@ function buildConnectionFormSchema() {
85634
85810
  id: "transport",
85635
85811
  title: "Transport",
85636
85812
  titleKey: "provider-ecowitt:connection.s_transport.title",
85637
- description: "Choose how CamStack reads the gateway. Local poll connects out to the gateway (recommended). Push listener runs a server the gateway uploads to — configure the gateway \"Customized\" upload to point at this hub.",
85813
+ description: "Local poll connects out to the gateway (recommended). Push listener needs the gateway \"Customized\" upload pointed at this hub.",
85638
85814
  descriptionKey: "provider-ecowitt:connection.s_transport.description",
85639
85815
  columns: 1,
85640
85816
  fields: [{
@@ -85761,7 +85937,7 @@ function buildDiscoveryParamsFormSchema() {
85761
85937
  id: "scan",
85762
85938
  title: "Scan options",
85763
85939
  titleKey: "provider-ecowitt:discoveryParams.s_scan.title",
85764
- description: "Leave empty to scan the local subnet. To scan other subnets, list their broadcast addresses (e.g. 192.168.20.255), gateway IPs (e.g. 192.168.20.181), or CIDRs (e.g. 192.168.20.0/24) — comma or newline separated. Each subnet is swept independently and unreachable ones are skipped.",
85940
+ description: "Leave empty to scan the local subnet; otherwise list broadcast addresses, gateway IPs or CIDRs, comma or newline separated.",
85765
85941
  descriptionKey: "provider-ecowitt:discoveryParams.s_scan.description",
85766
85942
  columns: 1,
85767
85943
  fields: [{
package/i18n/en.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "connection.s_identity.title": "Gateway",
3
3
  "connection.s_identity.name.label": "Name",
4
4
  "connection.s_transport.title": "Transport",
5
- "connection.s_transport.description": "Choose how CamStack reads the gateway. Local poll connects out to the gateway (recommended). Push listener runs a server the gateway uploads to — configure the gateway \"Customized\" upload to point at this hub.",
5
+ "connection.s_transport.description": "Local poll connects out to the gateway (recommended). Push listener needs the gateway \"Customized\" upload pointed at this hub.",
6
6
  "connection.s_transport.transport.label": "Transport",
7
7
  "connection.s_transport.transport.o_local.label": "Local poll (recommended)",
8
8
  "connection.s_transport.transport.o_listener.label": "Push listener",
@@ -15,7 +15,7 @@
15
15
  "connection.s_listener.listenPort.label": "Listen port",
16
16
  "connection.s_listener.listenHost.label": "Bind host (optional)",
17
17
  "discoveryParams.s_scan.title": "Scan options",
18
- "discoveryParams.s_scan.description": "Leave empty to scan the local subnet. To scan other subnets, list their broadcast addresses (e.g. 192.168.20.255), gateway IPs (e.g. 192.168.20.181), or CIDRs (e.g. 192.168.20.0/24) — comma or newline separated. Each subnet is swept independently and unreachable ones are skipped.",
18
+ "discoveryParams.s_scan.description": "Leave empty to scan the local subnet; otherwise list broadcast addresses, gateway IPs or CIDRs, comma or newline separated.",
19
19
  "discoveryParams.s_scan.broadcastAddress.label": "Broadcast addresses / gateway IPs / CIDRs",
20
20
  "discoveryParams.s_scan.timeoutMs.label": "UDP timeout (ms)"
21
21
  }
package/i18n/it.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "connection.s_identity.title": "Gateway",
3
3
  "connection.s_identity.name.label": "Nome",
4
4
  "connection.s_transport.title": "Trasporto",
5
- "connection.s_transport.description": "Scegli come CamStack legge il gateway. La lettura locale si collega al gateway (consigliato). Il listener push avvia un server a cui il gateway invia i dati: configura il caricamento \"Personalizzato\" del gateway per puntare a questo hub.",
5
+ "connection.s_transport.description": "Il polling locale si connette al gateway (consigliato). Il listener push richiede che l'upload \"Customized\" del gateway punti a questo hub.",
6
6
  "connection.s_transport.transport.label": "Trasporto",
7
7
  "connection.s_transport.transport.o_local.label": "Lettura locale (consigliato)",
8
8
  "connection.s_transport.transport.o_listener.label": "Listener push",
@@ -15,7 +15,7 @@
15
15
  "connection.s_listener.listenPort.label": "Porta di ascolto",
16
16
  "connection.s_listener.listenHost.label": "Host di ascolto (facoltativo)",
17
17
  "discoveryParams.s_scan.title": "Opzioni di scansione",
18
- "discoveryParams.s_scan.description": "Lascia vuoto per scansionare la sottorete locale. Per scansionare altre sottoreti, inserisci i loro indirizzi di broadcast (ad es. 192.168.20.255), gli IP dei gateway (ad es. 192.168.20.181) o i CIDR (ad es. 192.168.20.0/24), separati da virgola o a capo. Ogni sottorete viene scansionata in modo indipendente e quelle irraggiungibili vengono saltate.",
18
+ "discoveryParams.s_scan.description": "Lascia vuoto per scansionare la subnet locale; altrimenti elenca indirizzi broadcast, IP dei gateway o CIDR, separati da virgola o a capo.",
19
19
  "discoveryParams.s_scan.broadcastAddress.label": "Indirizzi di broadcast / IP dei gateway / CIDR",
20
20
  "discoveryParams.s_scan.timeoutMs.label": "Timeout UDP (ms)"
21
21
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-ecowitt",
3
- "version": "0.2.140",
3
+ "version": "0.2.142",
4
4
  "description": "Ecowitt weather-station device-provider addon for CamStack — wraps the @apocaliss92/nodewitt local-poll / push client",
5
5
  "keywords": [
6
6
  "camstack",