@camstack/addon-provider-homematic 1.2.151 → 1.2.152

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
@@ -8,7 +8,7 @@ let http = require("http");
8
8
  let crypto$1 = require("crypto");
9
9
  let fs_promises = require("fs/promises");
10
10
  let path = require("path");
11
- //#region ../types/dist/event-category-7pZEBmVg.mjs
11
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
12
12
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
13
13
  EventCategory["SystemBoot"] = "system.boot";
14
14
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -325,6 +325,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
325
325
  */
326
326
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
327
327
  /**
328
+ * A camera's motion source has fired constantly with no subject for an hour
329
+ * (motion duty or session count over the bar, zero detections) — it is not
330
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
331
+ * {@link PipelineMotionCalm}.
332
+ */
333
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
334
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
335
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
336
+ /**
328
337
  * Per-camera pipeline config was mutated by the orchestrator
329
338
  * (3-level settings change via `setAgentAddonDefaults` /
330
339
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -5564,7 +5573,7 @@ var ZodIssueCode = {
5564
5573
  var ZodFirstPartyTypeKind;
5565
5574
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5566
5575
  //#endregion
5567
- //#region ../types/dist/sleep-CueztlR1.mjs
5576
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5568
5577
  /**
5569
5578
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5570
5579
  * window to float samples (D455).
@@ -8163,7 +8172,7 @@ var EntryDescriptorSchema = object({
8163
8172
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8164
8173
  fields: record(string(), unknown())
8165
8174
  }).strict();
8166
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8175
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8167
8176
  var RecordKindDeclarationSchema = object({
8168
8177
  database: _enum(RECORD_DATABASES).default("settings"),
8169
8178
  class: _enum(RECORD_CLASSES),
@@ -8182,14 +8191,6 @@ var RecordKindDeclarationSchema = object({
8182
8191
  secretPaths: array(string().min(1)).default([]),
8183
8192
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8184
8193
  secretArrayKeys: record(string(), string()).default({}),
8185
- /**
8186
- * RETIRED (D900): the legacy table a kind adopted from during the records
8187
- * migration. Nothing declares it any more and nothing reads it; the schema
8188
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8189
- * (an orphaned kind is never redeclared) and an addon built before the
8190
- * removal still sends it. Never set it.
8191
- */
8192
- adoptsFrom: string().min(1).optional(),
8193
8194
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8194
8195
  transactFamily: string().min(1).optional(),
8195
8196
  entry: EntryDescriptorSchema.optional()
@@ -12985,17 +12986,6 @@ object({
12985
12986
  createdAt: number(),
12986
12987
  updatedAt: number()
12987
12988
  });
12988
- object({
12989
- id: string(),
12990
- label: string(),
12991
- isAdmin: boolean().default(false),
12992
- allowedProviders: AllowedProviderSchema,
12993
- allowedDevices: AllowedDevicesSchema,
12994
- tokenHash: string(),
12995
- tokenPrefix: string(),
12996
- createdAt: number(),
12997
- lastUsedAt: number().optional()
12998
- });
12999
12989
  object({
13000
12990
  id: string(),
13001
12991
  userId: string(),
@@ -17026,16 +17016,36 @@ var RecordKindStateSchema = _enum([
17026
17016
  var DeclareKindResultSchema = object({
17027
17017
  kindId: number().int(),
17028
17018
  state: RecordKindStateSchema,
17029
- createdIndexes: array(string()),
17030
- /**
17031
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17032
- * it stays on the wire, null, because an addon built before the removal reads
17033
- * an ABSENT field as "adoption pending" and refuses to start.
17034
- */
17035
- adoptionPending: _null()
17019
+ createdIndexes: array(string())
17036
17020
  });
17037
17021
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17038
17022
  var SecretRefsList = array(string());
17023
+ /**
17024
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17025
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17026
+ */
17027
+ var RecordTransactOpSchema = discriminatedUnion("op", [
17028
+ object({
17029
+ op: literal("put"),
17030
+ kind: RecordKindNameSchema,
17031
+ record: RecordInputSchema,
17032
+ ifRev: number().int().min(0).optional()
17033
+ }),
17034
+ object({
17035
+ op: literal("patch"),
17036
+ kind: RecordKindNameSchema,
17037
+ id: RecordIdSchema,
17038
+ data: RecordBodySchema,
17039
+ at: number().int().nullable().optional(),
17040
+ expiresAt: number().int().nullable().optional(),
17041
+ ifRev: number().int().min(1).optional()
17042
+ }),
17043
+ object({
17044
+ op: literal("delete"),
17045
+ kind: RecordKindNameSchema,
17046
+ id: RecordIdSchema
17047
+ })
17048
+ ]);
17039
17049
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17040
17050
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17041
17051
  kind: "mutation",
@@ -17142,6 +17152,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17142
17152
  }), {
17143
17153
  kind: "mutation",
17144
17154
  auth: "admin"
17155
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17156
+ results: array(object({
17157
+ rev: number().int().nullable(),
17158
+ deleted: boolean()
17159
+ })),
17160
+ releasedRefs: SecretRefsList,
17161
+ secretRefs: SecretRefsList
17162
+ }), {
17163
+ kind: "mutation",
17164
+ auth: "admin"
17145
17165
  }), method(object({
17146
17166
  deviceId: number().int(),
17147
17167
  kinds: array(RecordKindNameSchema).optional()
@@ -42866,9 +42886,13 @@ var NcSystemEventKindSchema = _enum([
42866
42886
  "node-updating",
42867
42887
  "node-inference-unavailable",
42868
42888
  "detection-blind",
42889
+ "motion-noisy",
42890
+ "motion-calm",
42869
42891
  "recording-stalled",
42870
42892
  "recording-healthy",
42871
42893
  "recording-degraded",
42894
+ "device-attention-required",
42895
+ "device-attention-resolved",
42872
42896
  "storage-location-low",
42873
42897
  "storage-location-critical",
42874
42898
  "storage-location-ok",
@@ -56192,6 +56216,16 @@ var DishwasherStatusSchema = object({
56192
56216
  powerState: string().nullable(),
56193
56217
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56194
56218
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56219
+ /**
56220
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56221
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56222
+ * when none is reported. A cleared reminder is not an unknown one.
56223
+ */
56224
+ filterCleaningDue: boolean().nullable(),
56225
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56226
+ machineCareDue: boolean().nullable(),
56227
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56228
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56195
56229
  /** Option states: null when the appliance does not expose the option or has not said. */
56196
56230
  halfLoad: boolean().nullable(),
56197
56231
  hygienePlus: boolean().nullable(),
@@ -64842,16 +64876,6 @@ var UpdateUserInputSchema = object({
64842
64876
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64843
64877
  scopes: array(TokenScopeSchema).optional()
64844
64878
  });
64845
- var ApiKeySummarySchema = object({
64846
- id: string(),
64847
- label: string(),
64848
- isAdmin: boolean().default(false),
64849
- allowedProviders: union([array(string()), literal("*")]).optional(),
64850
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64851
- tokenPrefix: string(),
64852
- createdAt: number(),
64853
- lastUsedAt: number().optional()
64854
- });
64855
64879
  var OauthSessionSummarySchema = object({
64856
64880
  id: string(),
64857
64881
  userId: string(),
@@ -64873,8 +64897,7 @@ var TotpStatusSchema = object({
64873
64897
  confirmedAt: number().nullable()
64874
64898
  });
64875
64899
  /**
64876
- * user-management — singleton capability for user accounts and the
64877
- * legacy API-key rows.
64900
+ * user-management — singleton capability for user accounts.
64878
64901
  *
64879
64902
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64880
64903
  * — the subset check on `setUserScopes` is moot
@@ -64930,10 +64953,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64930
64953
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64931
64954
  kind: "mutation",
64932
64955
  access: "view"
64933
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64934
- kind: "mutation",
64935
- auth: "admin",
64936
- access: "delete"
64937
64956
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64938
64957
  kind: "mutation",
64939
64958
  auth: "admin",
@@ -74389,6 +74408,12 @@ Object.freeze({
74389
74408
  addonId: null,
74390
74409
  access: "view"
74391
74410
  },
74411
+ "records.transact": {
74412
+ capName: "records",
74413
+ capScope: "system",
74414
+ addonId: null,
74415
+ access: "create"
74416
+ },
74392
74417
  "sceneMonitor.captureReference": {
74393
74418
  capName: "scene-monitor",
74394
74419
  capScope: "device",
@@ -75721,12 +75746,6 @@ Object.freeze({
75721
75746
  addonId: null,
75722
75747
  access: "view"
75723
75748
  },
75724
- "userManagement.listApiKeys": {
75725
- capName: "user-management",
75726
- capScope: "system",
75727
- addonId: null,
75728
- access: "view"
75729
- },
75730
75749
  "userManagement.listExternalIdentities": {
75731
75750
  capName: "user-management",
75732
75751
  capScope: "system",
@@ -75781,12 +75800,6 @@ Object.freeze({
75781
75800
  addonId: null,
75782
75801
  access: "create"
75783
75802
  },
75784
- "userManagement.revokeApiKey": {
75785
- capName: "user-management",
75786
- capScope: "system",
75787
- addonId: null,
75788
- access: "delete"
75789
- },
75790
75803
  "userManagement.revokeOauthSession": {
75791
75804
  capName: "user-management",
75792
75805
  capScope: "system",
@@ -79151,9 +79164,13 @@ new Map(Object.entries({
79151
79164
  "stream-online": "device-events",
79152
79165
  "stream-offline": "device-events",
79153
79166
  "detection-blind": "device-events",
79167
+ "motion-noisy": "device-events",
79168
+ "motion-calm": "device-events",
79154
79169
  "recording-stalled": "device-events",
79155
79170
  "recording-healthy": "device-events",
79156
79171
  "recording-degraded": "device-events",
79172
+ "device-attention-required": "device-events",
79173
+ "device-attention-resolved": "device-events",
79157
79174
  "node-online": "system",
79158
79175
  "node-offline": "system",
79159
79176
  "node-restarting": "system",
@@ -79236,6 +79253,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79236
79253
  label: "Detecting nothing",
79237
79254
  kinds: ["detection-blind"]
79238
79255
  },
79256
+ {
79257
+ id: "motion-noise",
79258
+ family: "device-events",
79259
+ label: "Motion without a subject",
79260
+ kinds: ["motion-noisy", "motion-calm"]
79261
+ },
79239
79262
  {
79240
79263
  id: "recording",
79241
79264
  family: "device-events",
@@ -79246,6 +79269,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79246
79269
  "recording-degraded"
79247
79270
  ]
79248
79271
  },
79272
+ {
79273
+ id: "device-attention",
79274
+ family: "device-events",
79275
+ label: "Needs attention",
79276
+ kinds: ["device-attention-required", "device-attention-resolved"]
79277
+ },
79249
79278
  {
79250
79279
  id: "nodes",
79251
79280
  family: "system",
@@ -79385,6 +79414,7 @@ var ALERT_EPISODE = [
79385
79414
  "alert-error",
79386
79415
  "alert-critical-resolved"
79387
79416
  ];
79417
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79388
79418
  var UPDATES = [
79389
79419
  "addon-update-available",
79390
79420
  "server-update-available",
@@ -79414,9 +79444,12 @@ var DEVICE_EVENTS = [
79414
79444
  "stream-online",
79415
79445
  "stream-offline",
79416
79446
  "detection-blind",
79447
+ "motion-noisy",
79448
+ "motion-calm",
79417
79449
  "recording-stalled",
79418
79450
  "recording-healthy",
79419
79451
  "recording-degraded",
79452
+ ...DEVICE_ATTENTION,
79420
79453
  ...ALARM
79421
79454
  ];
79422
79455
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79584,7 +79617,9 @@ var STATE_SUMMARY_VARS = [
79584
79617
  [...RULE_TEXT],
79585
79618
  [...RULE_TEXT],
79586
79619
  [...RULE_TEXT],
79587
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79620
+ [...RULE_TEXT],
79621
+ [...RULE_TEXT],
79622
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79588
79623
  [...RULE_TEXT],
79589
79624
  [...RULE_TEXT],
79590
79625
  [...RULE_TEXT],
@@ -79606,11 +79641,11 @@ var STATE_SUMMARY_VARS = [
79606
79641
  [...RULE_TEXT],
79607
79642
  [...RULE_TEXT],
79608
79643
  [...RULE_TEXT],
79644
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79609
79645
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79646
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79610
79647
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79611
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79612
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79613
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79648
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79614
79649
  [...RULE_TEXT],
79615
79650
  [...RULE_TEXT],
79616
79651
  [...RULE_TEXT],
@@ -79686,6 +79721,15 @@ new Map([
79686
79721
  snapshotLabel: "Tanks low or full now",
79687
79722
  snapshotSection: "tanks"
79688
79723
  },
79724
+ {
79725
+ id: "motion-noise",
79726
+ family: "device-events",
79727
+ label: "Motion without a subject (constant / calm again)",
79728
+ bad: ["motion-noisy"],
79729
+ recovery: ["motion-calm"],
79730
+ snapshotLabel: "Cameras with constant motion now",
79731
+ snapshotSection: null
79732
+ },
79689
79733
  {
79690
79734
  id: "recording-health",
79691
79735
  family: "device-events",
@@ -79695,6 +79739,15 @@ new Map([
79695
79739
  snapshotLabel: "Recordings stalled now",
79696
79740
  snapshotSection: null
79697
79741
  },
79742
+ {
79743
+ id: "device-attention",
79744
+ family: "device-events",
79745
+ label: "Device needs attention (raised / resolved)",
79746
+ bad: ["device-attention-required"],
79747
+ recovery: ["device-attention-resolved"],
79748
+ snapshotLabel: "Devices needing attention now",
79749
+ snapshotSection: null
79750
+ },
79698
79751
  {
79699
79752
  id: "node-connectivity",
79700
79753
  family: "system",
@@ -80459,8 +80512,6 @@ function buildConnectionFormSchema() {
80459
80512
  id: "connection",
80460
80513
  title: "CCU connection",
80461
80514
  titleKey: "provider-homematic:connection.s_connection.title",
80462
- description: "Connect to a Homematic CCU3 or RaspberryMatic hub on your network.",
80463
- descriptionKey: "provider-homematic:connection.s_connection.description",
80464
80515
  columns: 1,
80465
80516
  fields: [{
80466
80517
  type: "text",
@@ -80475,7 +80526,7 @@ function buildConnectionFormSchema() {
80475
80526
  id: "interfaces",
80476
80527
  title: "Interfaces",
80477
80528
  titleKey: "provider-homematic:connection.s_interfaces.title",
80478
- description: "Select which CCU XML-RPC interfaces to bind. Only the four interfaces natively supported by the backend are listed — CCU-Jack and CUxD are not supported.",
80529
+ description: "CCU-Jack and CUxD are not supported.",
80479
80530
  descriptionKey: "provider-homematic:connection.s_interfaces.description",
80480
80531
  columns: 1,
80481
80532
  fields: [
@@ -80513,7 +80564,7 @@ function buildConnectionFormSchema() {
80513
80564
  id: "callback",
80514
80565
  title: "Event callback",
80515
80566
  titleKey: "provider-homematic:connection.s_callback.title",
80516
- description: "The CCU pushes value changes back to this address. Optional — when left blank the hub auto-infers its LAN IPv4 on the same subnet as the CCU. Must be reachable FROM the CCU (not 127.0.0.1).",
80567
+ description: "Optional; must be reachable from the CCU (not 127.0.0.1). Blank auto-infers the hub LAN address.",
80517
80568
  descriptionKey: "provider-homematic:connection.s_callback.description",
80518
80569
  columns: 2,
80519
80570
  fields: [{
@@ -80536,7 +80587,7 @@ function buildConnectionFormSchema() {
80536
80587
  id: "credentials",
80537
80588
  title: "WebUI credentials",
80538
80589
  titleKey: "provider-homematic:connection.s_credentials.title",
80539
- description: "Optional. Unlocks friendly names, rooms, system variables and programs via the CCU JSON-RPC API.",
80590
+ description: "Optional. Unlocks friendly names, rooms, system variables and programs.",
80540
80591
  descriptionKey: "provider-homematic:connection.s_credentials.description",
80541
80592
  columns: 2,
80542
80593
  fields: [{
@@ -106762,15 +106813,13 @@ var HomematicProviderAddon = class extends BaseDeviceProvider {
106762
106813
  id: "hm-broker",
106763
106814
  title: "Homematic broker",
106764
106815
  titleKey: "provider-homematic:globalSettings.s_hm-broker.title",
106765
- description: "Homematic CCU brokers are managed in the External systems → Brokers tab.",
106766
- descriptionKey: "provider-homematic:globalSettings.s_hm-broker.description",
106767
106816
  columns: 1,
106768
106817
  fields: [{
106769
106818
  type: "info",
106770
106819
  key: "brokerHelp",
106771
106820
  label: "Brokers are managed separately",
106772
106821
  labelKey: "provider-homematic:globalSettings.s_hm-broker.brokerHelp.label",
106773
- content: "This integration links to a Homematic CCU broker. Add, edit, or remove brokers from External systems → Brokers. The integration only stores a reference to its broker — credentials live on the broker."
106822
+ content: "This integration links to a Homematic CCU broker managed under External systems → Brokers."
106774
106823
  }]
106775
106824
  }] });
106776
106825
  }
package/dist/addon.mjs CHANGED
@@ -9,7 +9,7 @@ import { join } from "path";
9
9
  var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
10
10
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
11
11
  //#endregion
12
- //#region ../types/dist/event-category-7pZEBmVg.mjs
12
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
13
13
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
14
14
  EventCategory["SystemBoot"] = "system.boot";
15
15
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -326,6 +326,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
326
326
  */
327
327
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
328
328
  /**
329
+ * A camera's motion source has fired constantly with no subject for an hour
330
+ * (motion duty or session count over the bar, zero detections) — it is not
331
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
332
+ * {@link PipelineMotionCalm}.
333
+ */
334
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
335
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
336
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
337
+ /**
329
338
  * Per-camera pipeline config was mutated by the orchestrator
330
339
  * (3-level settings change via `setAgentAddonDefaults` /
331
340
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -5565,7 +5574,7 @@ var ZodIssueCode = {
5565
5574
  var ZodFirstPartyTypeKind;
5566
5575
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5567
5576
  //#endregion
5568
- //#region ../types/dist/sleep-CueztlR1.mjs
5577
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5569
5578
  /**
5570
5579
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5571
5580
  * window to float samples (D455).
@@ -8164,7 +8173,7 @@ var EntryDescriptorSchema = object({
8164
8173
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8165
8174
  fields: record(string(), unknown())
8166
8175
  }).strict();
8167
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8176
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8168
8177
  var RecordKindDeclarationSchema = object({
8169
8178
  database: _enum(RECORD_DATABASES).default("settings"),
8170
8179
  class: _enum(RECORD_CLASSES),
@@ -8183,14 +8192,6 @@ var RecordKindDeclarationSchema = object({
8183
8192
  secretPaths: array(string().min(1)).default([]),
8184
8193
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8185
8194
  secretArrayKeys: record(string(), string()).default({}),
8186
- /**
8187
- * RETIRED (D900): the legacy table a kind adopted from during the records
8188
- * migration. Nothing declares it any more and nothing reads it; the schema
8189
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8190
- * (an orphaned kind is never redeclared) and an addon built before the
8191
- * removal still sends it. Never set it.
8192
- */
8193
- adoptsFrom: string().min(1).optional(),
8194
8195
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8195
8196
  transactFamily: string().min(1).optional(),
8196
8197
  entry: EntryDescriptorSchema.optional()
@@ -12986,17 +12987,6 @@ object({
12986
12987
  createdAt: number(),
12987
12988
  updatedAt: number()
12988
12989
  });
12989
- object({
12990
- id: string(),
12991
- label: string(),
12992
- isAdmin: boolean().default(false),
12993
- allowedProviders: AllowedProviderSchema,
12994
- allowedDevices: AllowedDevicesSchema,
12995
- tokenHash: string(),
12996
- tokenPrefix: string(),
12997
- createdAt: number(),
12998
- lastUsedAt: number().optional()
12999
- });
13000
12990
  object({
13001
12991
  id: string(),
13002
12992
  userId: string(),
@@ -17027,16 +17017,36 @@ var RecordKindStateSchema = _enum([
17027
17017
  var DeclareKindResultSchema = object({
17028
17018
  kindId: number().int(),
17029
17019
  state: RecordKindStateSchema,
17030
- createdIndexes: array(string()),
17031
- /**
17032
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17033
- * it stays on the wire, null, because an addon built before the removal reads
17034
- * an ABSENT field as "adoption pending" and refuses to start.
17035
- */
17036
- adoptionPending: _null()
17020
+ createdIndexes: array(string())
17037
17021
  });
17038
17022
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17039
17023
  var SecretRefsList = array(string());
17024
+ /**
17025
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17026
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17027
+ */
17028
+ var RecordTransactOpSchema = discriminatedUnion("op", [
17029
+ object({
17030
+ op: literal("put"),
17031
+ kind: RecordKindNameSchema,
17032
+ record: RecordInputSchema,
17033
+ ifRev: number().int().min(0).optional()
17034
+ }),
17035
+ object({
17036
+ op: literal("patch"),
17037
+ kind: RecordKindNameSchema,
17038
+ id: RecordIdSchema,
17039
+ data: RecordBodySchema,
17040
+ at: number().int().nullable().optional(),
17041
+ expiresAt: number().int().nullable().optional(),
17042
+ ifRev: number().int().min(1).optional()
17043
+ }),
17044
+ object({
17045
+ op: literal("delete"),
17046
+ kind: RecordKindNameSchema,
17047
+ id: RecordIdSchema
17048
+ })
17049
+ ]);
17040
17050
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17041
17051
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17042
17052
  kind: "mutation",
@@ -17143,6 +17153,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17143
17153
  }), {
17144
17154
  kind: "mutation",
17145
17155
  auth: "admin"
17156
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17157
+ results: array(object({
17158
+ rev: number().int().nullable(),
17159
+ deleted: boolean()
17160
+ })),
17161
+ releasedRefs: SecretRefsList,
17162
+ secretRefs: SecretRefsList
17163
+ }), {
17164
+ kind: "mutation",
17165
+ auth: "admin"
17146
17166
  }), method(object({
17147
17167
  deviceId: number().int(),
17148
17168
  kinds: array(RecordKindNameSchema).optional()
@@ -42867,9 +42887,13 @@ var NcSystemEventKindSchema = _enum([
42867
42887
  "node-updating",
42868
42888
  "node-inference-unavailable",
42869
42889
  "detection-blind",
42890
+ "motion-noisy",
42891
+ "motion-calm",
42870
42892
  "recording-stalled",
42871
42893
  "recording-healthy",
42872
42894
  "recording-degraded",
42895
+ "device-attention-required",
42896
+ "device-attention-resolved",
42873
42897
  "storage-location-low",
42874
42898
  "storage-location-critical",
42875
42899
  "storage-location-ok",
@@ -56193,6 +56217,16 @@ var DishwasherStatusSchema = object({
56193
56217
  powerState: string().nullable(),
56194
56218
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56195
56219
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56220
+ /**
56221
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56222
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56223
+ * when none is reported. A cleared reminder is not an unknown one.
56224
+ */
56225
+ filterCleaningDue: boolean().nullable(),
56226
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56227
+ machineCareDue: boolean().nullable(),
56228
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56229
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56196
56230
  /** Option states: null when the appliance does not expose the option or has not said. */
56197
56231
  halfLoad: boolean().nullable(),
56198
56232
  hygienePlus: boolean().nullable(),
@@ -64843,16 +64877,6 @@ var UpdateUserInputSchema = object({
64843
64877
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64844
64878
  scopes: array(TokenScopeSchema).optional()
64845
64879
  });
64846
- var ApiKeySummarySchema = object({
64847
- id: string(),
64848
- label: string(),
64849
- isAdmin: boolean().default(false),
64850
- allowedProviders: union([array(string()), literal("*")]).optional(),
64851
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64852
- tokenPrefix: string(),
64853
- createdAt: number(),
64854
- lastUsedAt: number().optional()
64855
- });
64856
64880
  var OauthSessionSummarySchema = object({
64857
64881
  id: string(),
64858
64882
  userId: string(),
@@ -64874,8 +64898,7 @@ var TotpStatusSchema = object({
64874
64898
  confirmedAt: number().nullable()
64875
64899
  });
64876
64900
  /**
64877
- * user-management — singleton capability for user accounts and the
64878
- * legacy API-key rows.
64901
+ * user-management — singleton capability for user accounts.
64879
64902
  *
64880
64903
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64881
64904
  * — the subset check on `setUserScopes` is moot
@@ -64931,10 +64954,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64931
64954
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64932
64955
  kind: "mutation",
64933
64956
  access: "view"
64934
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64935
- kind: "mutation",
64936
- auth: "admin",
64937
- access: "delete"
64938
64957
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64939
64958
  kind: "mutation",
64940
64959
  auth: "admin",
@@ -74390,6 +74409,12 @@ Object.freeze({
74390
74409
  addonId: null,
74391
74410
  access: "view"
74392
74411
  },
74412
+ "records.transact": {
74413
+ capName: "records",
74414
+ capScope: "system",
74415
+ addonId: null,
74416
+ access: "create"
74417
+ },
74393
74418
  "sceneMonitor.captureReference": {
74394
74419
  capName: "scene-monitor",
74395
74420
  capScope: "device",
@@ -75722,12 +75747,6 @@ Object.freeze({
75722
75747
  addonId: null,
75723
75748
  access: "view"
75724
75749
  },
75725
- "userManagement.listApiKeys": {
75726
- capName: "user-management",
75727
- capScope: "system",
75728
- addonId: null,
75729
- access: "view"
75730
- },
75731
75750
  "userManagement.listExternalIdentities": {
75732
75751
  capName: "user-management",
75733
75752
  capScope: "system",
@@ -75782,12 +75801,6 @@ Object.freeze({
75782
75801
  addonId: null,
75783
75802
  access: "create"
75784
75803
  },
75785
- "userManagement.revokeApiKey": {
75786
- capName: "user-management",
75787
- capScope: "system",
75788
- addonId: null,
75789
- access: "delete"
75790
- },
75791
75804
  "userManagement.revokeOauthSession": {
75792
75805
  capName: "user-management",
75793
75806
  capScope: "system",
@@ -79152,9 +79165,13 @@ new Map(Object.entries({
79152
79165
  "stream-online": "device-events",
79153
79166
  "stream-offline": "device-events",
79154
79167
  "detection-blind": "device-events",
79168
+ "motion-noisy": "device-events",
79169
+ "motion-calm": "device-events",
79155
79170
  "recording-stalled": "device-events",
79156
79171
  "recording-healthy": "device-events",
79157
79172
  "recording-degraded": "device-events",
79173
+ "device-attention-required": "device-events",
79174
+ "device-attention-resolved": "device-events",
79158
79175
  "node-online": "system",
79159
79176
  "node-offline": "system",
79160
79177
  "node-restarting": "system",
@@ -79237,6 +79254,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79237
79254
  label: "Detecting nothing",
79238
79255
  kinds: ["detection-blind"]
79239
79256
  },
79257
+ {
79258
+ id: "motion-noise",
79259
+ family: "device-events",
79260
+ label: "Motion without a subject",
79261
+ kinds: ["motion-noisy", "motion-calm"]
79262
+ },
79240
79263
  {
79241
79264
  id: "recording",
79242
79265
  family: "device-events",
@@ -79247,6 +79270,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79247
79270
  "recording-degraded"
79248
79271
  ]
79249
79272
  },
79273
+ {
79274
+ id: "device-attention",
79275
+ family: "device-events",
79276
+ label: "Needs attention",
79277
+ kinds: ["device-attention-required", "device-attention-resolved"]
79278
+ },
79250
79279
  {
79251
79280
  id: "nodes",
79252
79281
  family: "system",
@@ -79386,6 +79415,7 @@ var ALERT_EPISODE = [
79386
79415
  "alert-error",
79387
79416
  "alert-critical-resolved"
79388
79417
  ];
79418
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79389
79419
  var UPDATES = [
79390
79420
  "addon-update-available",
79391
79421
  "server-update-available",
@@ -79415,9 +79445,12 @@ var DEVICE_EVENTS = [
79415
79445
  "stream-online",
79416
79446
  "stream-offline",
79417
79447
  "detection-blind",
79448
+ "motion-noisy",
79449
+ "motion-calm",
79418
79450
  "recording-stalled",
79419
79451
  "recording-healthy",
79420
79452
  "recording-degraded",
79453
+ ...DEVICE_ATTENTION,
79421
79454
  ...ALARM
79422
79455
  ];
79423
79456
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79585,7 +79618,9 @@ var STATE_SUMMARY_VARS = [
79585
79618
  [...RULE_TEXT],
79586
79619
  [...RULE_TEXT],
79587
79620
  [...RULE_TEXT],
79588
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79621
+ [...RULE_TEXT],
79622
+ [...RULE_TEXT],
79623
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79589
79624
  [...RULE_TEXT],
79590
79625
  [...RULE_TEXT],
79591
79626
  [...RULE_TEXT],
@@ -79607,11 +79642,11 @@ var STATE_SUMMARY_VARS = [
79607
79642
  [...RULE_TEXT],
79608
79643
  [...RULE_TEXT],
79609
79644
  [...RULE_TEXT],
79645
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79610
79646
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79647
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79611
79648
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79612
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79613
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79614
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79649
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79615
79650
  [...RULE_TEXT],
79616
79651
  [...RULE_TEXT],
79617
79652
  [...RULE_TEXT],
@@ -79687,6 +79722,15 @@ new Map([
79687
79722
  snapshotLabel: "Tanks low or full now",
79688
79723
  snapshotSection: "tanks"
79689
79724
  },
79725
+ {
79726
+ id: "motion-noise",
79727
+ family: "device-events",
79728
+ label: "Motion without a subject (constant / calm again)",
79729
+ bad: ["motion-noisy"],
79730
+ recovery: ["motion-calm"],
79731
+ snapshotLabel: "Cameras with constant motion now",
79732
+ snapshotSection: null
79733
+ },
79690
79734
  {
79691
79735
  id: "recording-health",
79692
79736
  family: "device-events",
@@ -79696,6 +79740,15 @@ new Map([
79696
79740
  snapshotLabel: "Recordings stalled now",
79697
79741
  snapshotSection: null
79698
79742
  },
79743
+ {
79744
+ id: "device-attention",
79745
+ family: "device-events",
79746
+ label: "Device needs attention (raised / resolved)",
79747
+ bad: ["device-attention-required"],
79748
+ recovery: ["device-attention-resolved"],
79749
+ snapshotLabel: "Devices needing attention now",
79750
+ snapshotSection: null
79751
+ },
79699
79752
  {
79700
79753
  id: "node-connectivity",
79701
79754
  family: "system",
@@ -80460,8 +80513,6 @@ function buildConnectionFormSchema() {
80460
80513
  id: "connection",
80461
80514
  title: "CCU connection",
80462
80515
  titleKey: "provider-homematic:connection.s_connection.title",
80463
- description: "Connect to a Homematic CCU3 or RaspberryMatic hub on your network.",
80464
- descriptionKey: "provider-homematic:connection.s_connection.description",
80465
80516
  columns: 1,
80466
80517
  fields: [{
80467
80518
  type: "text",
@@ -80476,7 +80527,7 @@ function buildConnectionFormSchema() {
80476
80527
  id: "interfaces",
80477
80528
  title: "Interfaces",
80478
80529
  titleKey: "provider-homematic:connection.s_interfaces.title",
80479
- description: "Select which CCU XML-RPC interfaces to bind. Only the four interfaces natively supported by the backend are listed — CCU-Jack and CUxD are not supported.",
80530
+ description: "CCU-Jack and CUxD are not supported.",
80480
80531
  descriptionKey: "provider-homematic:connection.s_interfaces.description",
80481
80532
  columns: 1,
80482
80533
  fields: [
@@ -80514,7 +80565,7 @@ function buildConnectionFormSchema() {
80514
80565
  id: "callback",
80515
80566
  title: "Event callback",
80516
80567
  titleKey: "provider-homematic:connection.s_callback.title",
80517
- description: "The CCU pushes value changes back to this address. Optional — when left blank the hub auto-infers its LAN IPv4 on the same subnet as the CCU. Must be reachable FROM the CCU (not 127.0.0.1).",
80568
+ description: "Optional; must be reachable from the CCU (not 127.0.0.1). Blank auto-infers the hub LAN address.",
80518
80569
  descriptionKey: "provider-homematic:connection.s_callback.description",
80519
80570
  columns: 2,
80520
80571
  fields: [{
@@ -80537,7 +80588,7 @@ function buildConnectionFormSchema() {
80537
80588
  id: "credentials",
80538
80589
  title: "WebUI credentials",
80539
80590
  titleKey: "provider-homematic:connection.s_credentials.title",
80540
- description: "Optional. Unlocks friendly names, rooms, system variables and programs via the CCU JSON-RPC API.",
80591
+ description: "Optional. Unlocks friendly names, rooms, system variables and programs.",
80541
80592
  descriptionKey: "provider-homematic:connection.s_credentials.description",
80542
80593
  columns: 2,
80543
80594
  fields: [{
@@ -106763,15 +106814,13 @@ var HomematicProviderAddon = class extends BaseDeviceProvider {
106763
106814
  id: "hm-broker",
106764
106815
  title: "Homematic broker",
106765
106816
  titleKey: "provider-homematic:globalSettings.s_hm-broker.title",
106766
- description: "Homematic CCU brokers are managed in the External systems → Brokers tab.",
106767
- descriptionKey: "provider-homematic:globalSettings.s_hm-broker.description",
106768
106817
  columns: 1,
106769
106818
  fields: [{
106770
106819
  type: "info",
106771
106820
  key: "brokerHelp",
106772
106821
  label: "Brokers are managed separately",
106773
106822
  labelKey: "provider-homematic:globalSettings.s_hm-broker.brokerHelp.label",
106774
- content: "This integration links to a Homematic CCU broker. Add, edit, or remove brokers from External systems → Brokers. The integration only stores a reference to its broker — credentials live on the broker."
106823
+ content: "This integration links to a Homematic CCU broker managed under External systems → Brokers."
106775
106824
  }]
106776
106825
  }] });
106777
106826
  }
package/i18n/en.json CHANGED
@@ -1,22 +1,20 @@
1
1
  {
2
2
  "globalSettings.s_hm-broker.title": "Homematic broker",
3
- "globalSettings.s_hm-broker.description": "Homematic CCU brokers are managed in the External systems → Brokers tab.",
4
3
  "globalSettings.s_hm-broker.brokerHelp.label": "Brokers are managed separately",
5
4
  "connection.s_connection.title": "CCU connection",
6
- "connection.s_connection.description": "Connect to a Homematic CCU3 or RaspberryMatic hub on your network.",
7
5
  "connection.s_connection.host.label": "Host / IP",
8
6
  "connection.s_interfaces.title": "Interfaces",
9
- "connection.s_interfaces.description": "Select which CCU XML-RPC interfaces to bind. Only the four interfaces natively supported by the backend are listed — CCU-Jack and CUxD are not supported.",
7
+ "connection.s_interfaces.description": "CCU-Jack and CUxD are not supported.",
10
8
  "connection.s_interfaces.enableHmipRf.label": "Enable Homematic IP",
11
9
  "connection.s_interfaces.enableBidcosRf.label": "Enable Homematic (BidCos-RF)",
12
10
  "connection.s_interfaces.enableGroups.label": "Enable groups (heating groups)",
13
11
  "connection.s_interfaces.enableBidcosWired.label": "Enable BidCos-Wired (HM-Wired)",
14
12
  "connection.s_callback.title": "Event callback",
15
- "connection.s_callback.description": "The CCU pushes value changes back to this address. Optional — when left blank the hub auto-infers its LAN IPv4 on the same subnet as the CCU. Must be reachable FROM the CCU (not 127.0.0.1).",
13
+ "connection.s_callback.description": "Optional; must be reachable from the CCU (not 127.0.0.1). Blank auto-infers the hub LAN address.",
16
14
  "connection.s_callback.callbackHost.label": "Callback host (optional — auto-inferred when blank)",
17
15
  "connection.s_callback.callbackPort.label": "Callback port",
18
16
  "connection.s_credentials.title": "WebUI credentials",
19
- "connection.s_credentials.description": "Optional. Unlocks friendly names, rooms, system variables and programs via the CCU JSON-RPC API.",
17
+ "connection.s_credentials.description": "Optional. Unlocks friendly names, rooms, system variables and programs.",
20
18
  "connection.s_credentials.username.label": "Username",
21
19
  "connection.s_credentials.password.label": "Password",
22
20
  "connection.s_advanced.title": "Advanced",
package/i18n/it.json CHANGED
@@ -1,22 +1,20 @@
1
1
  {
2
2
  "globalSettings.s_hm-broker.title": "Broker Homematic",
3
- "globalSettings.s_hm-broker.description": "I broker della CCU Homematic si gestiscono nella scheda Sistemi esterni → Broker.",
4
3
  "globalSettings.s_hm-broker.brokerHelp.label": "I broker si gestiscono separatamente",
5
4
  "connection.s_connection.title": "Connessione alla CCU",
6
- "connection.s_connection.description": "Collegati a un hub Homematic CCU3 o RaspberryMatic presente in rete.",
7
5
  "connection.s_connection.host.label": "Host / IP",
8
6
  "connection.s_interfaces.title": "Interfacce",
9
- "connection.s_interfaces.description": "Seleziona quali interfacce XML-RPC della CCU collegare. Sono elencate solo le quattro interfacce supportate nativamente dal backend: CCU-Jack e CUxD non sono supportati.",
7
+ "connection.s_interfaces.description": "CCU-Jack e CUxD non sono supportati.",
10
8
  "connection.s_interfaces.enableHmipRf.label": "Attiva Homematic IP",
11
9
  "connection.s_interfaces.enableBidcosRf.label": "Attiva Homematic (BidCos-RF)",
12
10
  "connection.s_interfaces.enableGroups.label": "Attiva i gruppi (gruppi di riscaldamento)",
13
11
  "connection.s_interfaces.enableBidcosWired.label": "Attiva BidCos-Wired (HM-Wired)",
14
12
  "connection.s_callback.title": "Callback eventi",
15
- "connection.s_callback.description": "La CCU invia a questo indirizzo le variazioni dei valori. Facoltativo: se lasciato vuoto, l'hub rileva da solo il suo IPv4 di rete sulla stessa sottorete della CCU. Deve essere raggiungibile DALLA CCU (non 127.0.0.1).",
13
+ "connection.s_callback.description": "Facoltativo; deve essere raggiungibile dalla CCU (non 127.0.0.1). Se vuoto ricava l'indirizzo LAN dell'hub.",
16
14
  "connection.s_callback.callbackHost.label": "Host di callback (facoltativo: rilevato automaticamente se vuoto)",
17
15
  "connection.s_callback.callbackPort.label": "Porta di callback",
18
16
  "connection.s_credentials.title": "Credenziali dell'interfaccia web",
19
- "connection.s_credentials.description": "Facoltativo. Sblocca nomi, stanze, variabili di sistema e programmi tramite l'API JSON-RPC della CCU.",
17
+ "connection.s_credentials.description": "Facoltativo. Abilita nomi, stanze, variabili di sistema e programmi.",
20
18
  "connection.s_credentials.username.label": "Nome utente",
21
19
  "connection.s_credentials.password.label": "Password",
22
20
  "connection.s_advanced.title": "Avanzate",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homematic",
3
- "version": "1.2.151",
3
+ "version": "1.2.152",
4
4
  "description": "Homematic / HomematicIP (CCU3 / RaspberryMatic) device-provider addon for CamStack — wraps the nodehomematic library",
5
5
  "keywords": [
6
6
  "camstack",