@camstack/addon-provider-homematic 1.2.150 → 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-DOl51-Ij.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
@@ -696,6 +705,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
696
705
  EventCategory["BackupRestored"] = "backup.restored";
697
706
  EventCategory["NotificationDispatched"] = "notification.dispatched";
698
707
  EventCategory["NotificationFailed"] = "notification.failed";
708
+ /**
709
+ * A notification rule that cannot work (D905): its stored row does not load,
710
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
711
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
712
+ */
713
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
714
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
715
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
699
716
  EventCategory["DeviceUpdated"] = "device.updated";
700
717
  /**
701
718
  * Transport-level connectivity. Emitted by the device driver when
@@ -5556,7 +5573,7 @@ var ZodIssueCode = {
5556
5573
  var ZodFirstPartyTypeKind;
5557
5574
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5558
5575
  //#endregion
5559
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5576
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5560
5577
  /**
5561
5578
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5562
5579
  * window to float samples (D455).
@@ -8155,7 +8172,7 @@ var EntryDescriptorSchema = object({
8155
8172
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8156
8173
  fields: record(string(), unknown())
8157
8174
  }).strict();
8158
- /** 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. */
8159
8176
  var RecordKindDeclarationSchema = object({
8160
8177
  database: _enum(RECORD_DATABASES).default("settings"),
8161
8178
  class: _enum(RECORD_CLASSES),
@@ -8174,14 +8191,6 @@ var RecordKindDeclarationSchema = object({
8174
8191
  secretPaths: array(string().min(1)).default([]),
8175
8192
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8176
8193
  secretArrayKeys: record(string(), string()).default({}),
8177
- /**
8178
- * RETIRED (D900): the legacy table a kind adopted from during the records
8179
- * migration. Nothing declares it any more and nothing reads it; the schema
8180
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8181
- * (an orphaned kind is never redeclared) and an addon built before the
8182
- * removal still sends it. Never set it.
8183
- */
8184
- adoptsFrom: string().min(1).optional(),
8185
8194
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8186
8195
  transactFamily: string().min(1).optional(),
8187
8196
  entry: EntryDescriptorSchema.optional()
@@ -12977,17 +12986,6 @@ object({
12977
12986
  createdAt: number(),
12978
12987
  updatedAt: number()
12979
12988
  });
12980
- object({
12981
- id: string(),
12982
- label: string(),
12983
- isAdmin: boolean().default(false),
12984
- allowedProviders: AllowedProviderSchema,
12985
- allowedDevices: AllowedDevicesSchema,
12986
- tokenHash: string(),
12987
- tokenPrefix: string(),
12988
- createdAt: number(),
12989
- lastUsedAt: number().optional()
12990
- });
12991
12989
  object({
12992
12990
  id: string(),
12993
12991
  userId: string(),
@@ -17018,16 +17016,36 @@ var RecordKindStateSchema = _enum([
17018
17016
  var DeclareKindResultSchema = object({
17019
17017
  kindId: number().int(),
17020
17018
  state: RecordKindStateSchema,
17021
- createdIndexes: array(string()),
17022
- /**
17023
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17024
- * it stays on the wire, null, because an addon built before the removal reads
17025
- * an ABSENT field as "adoption pending" and refuses to start.
17026
- */
17027
- adoptionPending: _null()
17019
+ createdIndexes: array(string())
17028
17020
  });
17029
17021
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17030
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
+ ]);
17031
17049
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17032
17050
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17033
17051
  kind: "mutation",
@@ -17134,6 +17152,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17134
17152
  }), {
17135
17153
  kind: "mutation",
17136
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"
17137
17165
  }), method(object({
17138
17166
  deviceId: number().int(),
17139
17167
  kinds: array(RecordKindNameSchema).optional()
@@ -42858,9 +42886,13 @@ var NcSystemEventKindSchema = _enum([
42858
42886
  "node-updating",
42859
42887
  "node-inference-unavailable",
42860
42888
  "detection-blind",
42889
+ "motion-noisy",
42890
+ "motion-calm",
42861
42891
  "recording-stalled",
42862
42892
  "recording-healthy",
42863
42893
  "recording-degraded",
42894
+ "device-attention-required",
42895
+ "device-attention-resolved",
42864
42896
  "storage-location-low",
42865
42897
  "storage-location-critical",
42866
42898
  "storage-location-ok",
@@ -42884,6 +42916,8 @@ var NcSystemEventKindSchema = _enum([
42884
42916
  "alert-critical",
42885
42917
  "alert-error",
42886
42918
  "alert-critical-resolved",
42919
+ "rule-broken",
42920
+ "rule-repaired",
42887
42921
  "camera-online",
42888
42922
  "camera-offline",
42889
42923
  "camera-disabled",
@@ -56182,6 +56216,16 @@ var DishwasherStatusSchema = object({
56182
56216
  powerState: string().nullable(),
56183
56217
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56184
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(),
56185
56229
  /** Option states: null when the appliance does not expose the option or has not said. */
56186
56230
  halfLoad: boolean().nullable(),
56187
56231
  hygienePlus: boolean().nullable(),
@@ -64832,16 +64876,6 @@ var UpdateUserInputSchema = object({
64832
64876
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64833
64877
  scopes: array(TokenScopeSchema).optional()
64834
64878
  });
64835
- var ApiKeySummarySchema = object({
64836
- id: string(),
64837
- label: string(),
64838
- isAdmin: boolean().default(false),
64839
- allowedProviders: union([array(string()), literal("*")]).optional(),
64840
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64841
- tokenPrefix: string(),
64842
- createdAt: number(),
64843
- lastUsedAt: number().optional()
64844
- });
64845
64879
  var OauthSessionSummarySchema = object({
64846
64880
  id: string(),
64847
64881
  userId: string(),
@@ -64863,8 +64897,7 @@ var TotpStatusSchema = object({
64863
64897
  confirmedAt: number().nullable()
64864
64898
  });
64865
64899
  /**
64866
- * user-management — singleton capability for user accounts and the
64867
- * legacy API-key rows.
64900
+ * user-management — singleton capability for user accounts.
64868
64901
  *
64869
64902
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64870
64903
  * — the subset check on `setUserScopes` is moot
@@ -64920,10 +64953,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64920
64953
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64921
64954
  kind: "mutation",
64922
64955
  access: "view"
64923
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64924
- kind: "mutation",
64925
- auth: "admin",
64926
- access: "delete"
64927
64956
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64928
64957
  kind: "mutation",
64929
64958
  auth: "admin",
@@ -74379,6 +74408,12 @@ Object.freeze({
74379
74408
  addonId: null,
74380
74409
  access: "view"
74381
74410
  },
74411
+ "records.transact": {
74412
+ capName: "records",
74413
+ capScope: "system",
74414
+ addonId: null,
74415
+ access: "create"
74416
+ },
74382
74417
  "sceneMonitor.captureReference": {
74383
74418
  capName: "scene-monitor",
74384
74419
  capScope: "device",
@@ -75711,12 +75746,6 @@ Object.freeze({
75711
75746
  addonId: null,
75712
75747
  access: "view"
75713
75748
  },
75714
- "userManagement.listApiKeys": {
75715
- capName: "user-management",
75716
- capScope: "system",
75717
- addonId: null,
75718
- access: "view"
75719
- },
75720
75749
  "userManagement.listExternalIdentities": {
75721
75750
  capName: "user-management",
75722
75751
  capScope: "system",
@@ -75771,12 +75800,6 @@ Object.freeze({
75771
75800
  addonId: null,
75772
75801
  access: "create"
75773
75802
  },
75774
- "userManagement.revokeApiKey": {
75775
- capName: "user-management",
75776
- capScope: "system",
75777
- addonId: null,
75778
- access: "delete"
75779
- },
75780
75803
  "userManagement.revokeOauthSession": {
75781
75804
  capName: "user-management",
75782
75805
  capScope: "system",
@@ -79141,9 +79164,13 @@ new Map(Object.entries({
79141
79164
  "stream-online": "device-events",
79142
79165
  "stream-offline": "device-events",
79143
79166
  "detection-blind": "device-events",
79167
+ "motion-noisy": "device-events",
79168
+ "motion-calm": "device-events",
79144
79169
  "recording-stalled": "device-events",
79145
79170
  "recording-healthy": "device-events",
79146
79171
  "recording-degraded": "device-events",
79172
+ "device-attention-required": "device-events",
79173
+ "device-attention-resolved": "device-events",
79147
79174
  "node-online": "system",
79148
79175
  "node-offline": "system",
79149
79176
  "node-restarting": "system",
@@ -79160,6 +79187,8 @@ new Map(Object.entries({
79160
79187
  "alert-critical": "system",
79161
79188
  "alert-error": "system",
79162
79189
  "alert-critical-resolved": "system",
79190
+ "rule-broken": "system",
79191
+ "rule-repaired": "system",
79163
79192
  "storage-location-low": "system",
79164
79193
  "storage-location-critical": "system",
79165
79194
  "storage-location-ok": "system",
@@ -79224,6 +79253,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79224
79253
  label: "Detecting nothing",
79225
79254
  kinds: ["detection-blind"]
79226
79255
  },
79256
+ {
79257
+ id: "motion-noise",
79258
+ family: "device-events",
79259
+ label: "Motion without a subject",
79260
+ kinds: ["motion-noisy", "motion-calm"]
79261
+ },
79227
79262
  {
79228
79263
  id: "recording",
79229
79264
  family: "device-events",
@@ -79234,6 +79269,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79234
79269
  "recording-degraded"
79235
79270
  ]
79236
79271
  },
79272
+ {
79273
+ id: "device-attention",
79274
+ family: "device-events",
79275
+ label: "Needs attention",
79276
+ kinds: ["device-attention-required", "device-attention-resolved"]
79277
+ },
79237
79278
  {
79238
79279
  id: "nodes",
79239
79280
  family: "system",
@@ -79294,6 +79335,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79294
79335
  "alert-critical-resolved"
79295
79336
  ]
79296
79337
  },
79338
+ {
79339
+ id: "rule-health",
79340
+ family: "system",
79341
+ label: "Notification rules",
79342
+ kinds: ["rule-broken", "rule-repaired"]
79343
+ },
79297
79344
  {
79298
79345
  id: "alarm",
79299
79346
  family: "alarm",
@@ -79367,6 +79414,7 @@ var ALERT_EPISODE = [
79367
79414
  "alert-error",
79368
79415
  "alert-critical-resolved"
79369
79416
  ];
79417
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79370
79418
  var UPDATES = [
79371
79419
  "addon-update-available",
79372
79420
  "server-update-available",
@@ -79396,9 +79444,12 @@ var DEVICE_EVENTS = [
79396
79444
  "stream-online",
79397
79445
  "stream-offline",
79398
79446
  "detection-blind",
79447
+ "motion-noisy",
79448
+ "motion-calm",
79399
79449
  "recording-stalled",
79400
79450
  "recording-healthy",
79401
79451
  "recording-degraded",
79452
+ ...DEVICE_ATTENTION,
79402
79453
  ...ALARM
79403
79454
  ];
79404
79455
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79566,7 +79617,13 @@ var STATE_SUMMARY_VARS = [
79566
79617
  [...RULE_TEXT],
79567
79618
  [...RULE_TEXT],
79568
79619
  [...RULE_TEXT],
79569
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79620
+ [...RULE_TEXT],
79621
+ [...RULE_TEXT],
79622
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79623
+ [...RULE_TEXT],
79624
+ [...RULE_TEXT],
79625
+ [...RULE_TEXT],
79626
+ [...RULE_TEXT],
79570
79627
  [...RULE_TEXT],
79571
79628
  [...RULE_TEXT],
79572
79629
  [...RULE_TEXT],
@@ -79584,11 +79641,11 @@ var STATE_SUMMARY_VARS = [
79584
79641
  [...RULE_TEXT],
79585
79642
  [...RULE_TEXT],
79586
79643
  [...RULE_TEXT],
79644
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79587
79645
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79646
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79588
79647
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79589
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79590
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79591
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79648
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79592
79649
  [...RULE_TEXT],
79593
79650
  [...RULE_TEXT],
79594
79651
  [...RULE_TEXT],
@@ -79609,6 +79666,125 @@ var STATE_SUMMARY_VARS = [
79609
79666
  [...RULE_TEXT],
79610
79667
  ...STATE_SUMMARY_VARS
79611
79668
  ];
79669
+ new Map([
79670
+ {
79671
+ id: "device-connectivity",
79672
+ family: "device-events",
79673
+ label: "Device connectivity (offline / back online)",
79674
+ bad: ["device-offline"],
79675
+ recovery: ["device-online"],
79676
+ snapshotLabel: "Devices offline now",
79677
+ snapshotSection: "device-state"
79678
+ },
79679
+ {
79680
+ id: "device-switch",
79681
+ family: "device-events",
79682
+ label: "Device switched off / back on",
79683
+ bad: ["device-disabled"],
79684
+ recovery: ["device-enabled"],
79685
+ snapshotLabel: "Devices switched off now",
79686
+ snapshotSection: "device-state"
79687
+ },
79688
+ {
79689
+ id: "stream-connectivity",
79690
+ family: "device-events",
79691
+ label: "Stream connectivity (offline / back online)",
79692
+ bad: ["stream-offline"],
79693
+ recovery: ["stream-online"],
79694
+ snapshotLabel: "Streams offline now",
79695
+ snapshotSection: "streams"
79696
+ },
79697
+ {
79698
+ id: "battery",
79699
+ family: "device-events",
79700
+ label: "Battery (low / back to normal)",
79701
+ bad: ["device-battery-low"],
79702
+ recovery: ["device-battery-normal"],
79703
+ snapshotLabel: "Batteries low now",
79704
+ snapshotSection: "battery"
79705
+ },
79706
+ {
79707
+ id: "consumables",
79708
+ family: "device-events",
79709
+ label: "Consumables (low / replaced)",
79710
+ bad: ["device-consumable-low"],
79711
+ recovery: ["device-consumable-normal"],
79712
+ snapshotLabel: "Consumables low now",
79713
+ snapshotSection: "consumables"
79714
+ },
79715
+ {
79716
+ id: "tanks",
79717
+ family: "device-events",
79718
+ label: "Tanks (low or full / back to normal)",
79719
+ bad: ["device-tank-low", "device-tank-full"],
79720
+ recovery: ["device-tank-normal"],
79721
+ snapshotLabel: "Tanks low or full now",
79722
+ snapshotSection: "tanks"
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
+ },
79733
+ {
79734
+ id: "recording-health",
79735
+ family: "device-events",
79736
+ label: "Recording health (stalled or degraded / recording again)",
79737
+ bad: ["recording-stalled", "recording-degraded"],
79738
+ recovery: ["recording-healthy"],
79739
+ snapshotLabel: "Recordings stalled now",
79740
+ snapshotSection: null
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
+ },
79751
+ {
79752
+ id: "node-connectivity",
79753
+ family: "system",
79754
+ label: "Node connectivity (offline / back online)",
79755
+ bad: ["node-offline"],
79756
+ recovery: ["node-online"],
79757
+ snapshotLabel: "Nodes offline now",
79758
+ snapshotSection: "nodes"
79759
+ },
79760
+ {
79761
+ id: "storage-space",
79762
+ family: "system",
79763
+ label: "Storage space (low or critical / ok again)",
79764
+ bad: ["storage-location-low", "storage-location-critical"],
79765
+ recovery: ["storage-location-ok"],
79766
+ snapshotLabel: "Storage locations low now",
79767
+ snapshotSection: null
79768
+ },
79769
+ {
79770
+ id: "critical-alerts",
79771
+ family: "system",
79772
+ label: "Critical alerts (raised / resolved)",
79773
+ bad: ["alert-critical"],
79774
+ recovery: ["alert-critical-resolved"],
79775
+ snapshotLabel: "Critical alerts open now",
79776
+ snapshotSection: null
79777
+ },
79778
+ {
79779
+ id: "rule-health",
79780
+ family: "system",
79781
+ label: "Rule health (broken / repaired)",
79782
+ bad: ["rule-broken"],
79783
+ recovery: ["rule-repaired"],
79784
+ snapshotLabel: "Notification rules broken now",
79785
+ snapshotSection: null
79786
+ }
79787
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
79612
79788
  new Set([
79613
79789
  "disarmed",
79614
79790
  "armed_home",
@@ -80336,8 +80512,6 @@ function buildConnectionFormSchema() {
80336
80512
  id: "connection",
80337
80513
  title: "CCU connection",
80338
80514
  titleKey: "provider-homematic:connection.s_connection.title",
80339
- description: "Connect to a Homematic CCU3 or RaspberryMatic hub on your network.",
80340
- descriptionKey: "provider-homematic:connection.s_connection.description",
80341
80515
  columns: 1,
80342
80516
  fields: [{
80343
80517
  type: "text",
@@ -80352,7 +80526,7 @@ function buildConnectionFormSchema() {
80352
80526
  id: "interfaces",
80353
80527
  title: "Interfaces",
80354
80528
  titleKey: "provider-homematic:connection.s_interfaces.title",
80355
- 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.",
80356
80530
  descriptionKey: "provider-homematic:connection.s_interfaces.description",
80357
80531
  columns: 1,
80358
80532
  fields: [
@@ -80390,7 +80564,7 @@ function buildConnectionFormSchema() {
80390
80564
  id: "callback",
80391
80565
  title: "Event callback",
80392
80566
  titleKey: "provider-homematic:connection.s_callback.title",
80393
- 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.",
80394
80568
  descriptionKey: "provider-homematic:connection.s_callback.description",
80395
80569
  columns: 2,
80396
80570
  fields: [{
@@ -80413,7 +80587,7 @@ function buildConnectionFormSchema() {
80413
80587
  id: "credentials",
80414
80588
  title: "WebUI credentials",
80415
80589
  titleKey: "provider-homematic:connection.s_credentials.title",
80416
- 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.",
80417
80591
  descriptionKey: "provider-homematic:connection.s_credentials.description",
80418
80592
  columns: 2,
80419
80593
  fields: [{
@@ -106639,15 +106813,13 @@ var HomematicProviderAddon = class extends BaseDeviceProvider {
106639
106813
  id: "hm-broker",
106640
106814
  title: "Homematic broker",
106641
106815
  titleKey: "provider-homematic:globalSettings.s_hm-broker.title",
106642
- description: "Homematic CCU brokers are managed in the External systems → Brokers tab.",
106643
- descriptionKey: "provider-homematic:globalSettings.s_hm-broker.description",
106644
106816
  columns: 1,
106645
106817
  fields: [{
106646
106818
  type: "info",
106647
106819
  key: "brokerHelp",
106648
106820
  label: "Brokers are managed separately",
106649
106821
  labelKey: "provider-homematic:globalSettings.s_hm-broker.brokerHelp.label",
106650
- 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."
106651
106823
  }]
106652
106824
  }] });
106653
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-DOl51-Ij.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
@@ -697,6 +706,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
697
706
  EventCategory["BackupRestored"] = "backup.restored";
698
707
  EventCategory["NotificationDispatched"] = "notification.dispatched";
699
708
  EventCategory["NotificationFailed"] = "notification.failed";
709
+ /**
710
+ * A notification rule that cannot work (D905): its stored row does not load,
711
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
712
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
713
+ */
714
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
715
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
716
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
700
717
  EventCategory["DeviceUpdated"] = "device.updated";
701
718
  /**
702
719
  * Transport-level connectivity. Emitted by the device driver when
@@ -5557,7 +5574,7 @@ var ZodIssueCode = {
5557
5574
  var ZodFirstPartyTypeKind;
5558
5575
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5559
5576
  //#endregion
5560
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5577
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5561
5578
  /**
5562
5579
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5563
5580
  * window to float samples (D455).
@@ -8156,7 +8173,7 @@ var EntryDescriptorSchema = object({
8156
8173
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8157
8174
  fields: record(string(), unknown())
8158
8175
  }).strict();
8159
- /** 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. */
8160
8177
  var RecordKindDeclarationSchema = object({
8161
8178
  database: _enum(RECORD_DATABASES).default("settings"),
8162
8179
  class: _enum(RECORD_CLASSES),
@@ -8175,14 +8192,6 @@ var RecordKindDeclarationSchema = object({
8175
8192
  secretPaths: array(string().min(1)).default([]),
8176
8193
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8177
8194
  secretArrayKeys: record(string(), string()).default({}),
8178
- /**
8179
- * RETIRED (D900): the legacy table a kind adopted from during the records
8180
- * migration. Nothing declares it any more and nothing reads it; the schema
8181
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8182
- * (an orphaned kind is never redeclared) and an addon built before the
8183
- * removal still sends it. Never set it.
8184
- */
8185
- adoptsFrom: string().min(1).optional(),
8186
8195
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8187
8196
  transactFamily: string().min(1).optional(),
8188
8197
  entry: EntryDescriptorSchema.optional()
@@ -12978,17 +12987,6 @@ object({
12978
12987
  createdAt: number(),
12979
12988
  updatedAt: number()
12980
12989
  });
12981
- object({
12982
- id: string(),
12983
- label: string(),
12984
- isAdmin: boolean().default(false),
12985
- allowedProviders: AllowedProviderSchema,
12986
- allowedDevices: AllowedDevicesSchema,
12987
- tokenHash: string(),
12988
- tokenPrefix: string(),
12989
- createdAt: number(),
12990
- lastUsedAt: number().optional()
12991
- });
12992
12990
  object({
12993
12991
  id: string(),
12994
12992
  userId: string(),
@@ -17019,16 +17017,36 @@ var RecordKindStateSchema = _enum([
17019
17017
  var DeclareKindResultSchema = object({
17020
17018
  kindId: number().int(),
17021
17019
  state: RecordKindStateSchema,
17022
- createdIndexes: array(string()),
17023
- /**
17024
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17025
- * it stays on the wire, null, because an addon built before the removal reads
17026
- * an ABSENT field as "adoption pending" and refuses to start.
17027
- */
17028
- adoptionPending: _null()
17020
+ createdIndexes: array(string())
17029
17021
  });
17030
17022
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17031
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
+ ]);
17032
17050
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17033
17051
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17034
17052
  kind: "mutation",
@@ -17135,6 +17153,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17135
17153
  }), {
17136
17154
  kind: "mutation",
17137
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"
17138
17166
  }), method(object({
17139
17167
  deviceId: number().int(),
17140
17168
  kinds: array(RecordKindNameSchema).optional()
@@ -42859,9 +42887,13 @@ var NcSystemEventKindSchema = _enum([
42859
42887
  "node-updating",
42860
42888
  "node-inference-unavailable",
42861
42889
  "detection-blind",
42890
+ "motion-noisy",
42891
+ "motion-calm",
42862
42892
  "recording-stalled",
42863
42893
  "recording-healthy",
42864
42894
  "recording-degraded",
42895
+ "device-attention-required",
42896
+ "device-attention-resolved",
42865
42897
  "storage-location-low",
42866
42898
  "storage-location-critical",
42867
42899
  "storage-location-ok",
@@ -42885,6 +42917,8 @@ var NcSystemEventKindSchema = _enum([
42885
42917
  "alert-critical",
42886
42918
  "alert-error",
42887
42919
  "alert-critical-resolved",
42920
+ "rule-broken",
42921
+ "rule-repaired",
42888
42922
  "camera-online",
42889
42923
  "camera-offline",
42890
42924
  "camera-disabled",
@@ -56183,6 +56217,16 @@ var DishwasherStatusSchema = object({
56183
56217
  powerState: string().nullable(),
56184
56218
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56185
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(),
56186
56230
  /** Option states: null when the appliance does not expose the option or has not said. */
56187
56231
  halfLoad: boolean().nullable(),
56188
56232
  hygienePlus: boolean().nullable(),
@@ -64833,16 +64877,6 @@ var UpdateUserInputSchema = object({
64833
64877
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64834
64878
  scopes: array(TokenScopeSchema).optional()
64835
64879
  });
64836
- var ApiKeySummarySchema = object({
64837
- id: string(),
64838
- label: string(),
64839
- isAdmin: boolean().default(false),
64840
- allowedProviders: union([array(string()), literal("*")]).optional(),
64841
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64842
- tokenPrefix: string(),
64843
- createdAt: number(),
64844
- lastUsedAt: number().optional()
64845
- });
64846
64880
  var OauthSessionSummarySchema = object({
64847
64881
  id: string(),
64848
64882
  userId: string(),
@@ -64864,8 +64898,7 @@ var TotpStatusSchema = object({
64864
64898
  confirmedAt: number().nullable()
64865
64899
  });
64866
64900
  /**
64867
- * user-management — singleton capability for user accounts and the
64868
- * legacy API-key rows.
64901
+ * user-management — singleton capability for user accounts.
64869
64902
  *
64870
64903
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64871
64904
  * — the subset check on `setUserScopes` is moot
@@ -64921,10 +64954,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64921
64954
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64922
64955
  kind: "mutation",
64923
64956
  access: "view"
64924
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64925
- kind: "mutation",
64926
- auth: "admin",
64927
- access: "delete"
64928
64957
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64929
64958
  kind: "mutation",
64930
64959
  auth: "admin",
@@ -74380,6 +74409,12 @@ Object.freeze({
74380
74409
  addonId: null,
74381
74410
  access: "view"
74382
74411
  },
74412
+ "records.transact": {
74413
+ capName: "records",
74414
+ capScope: "system",
74415
+ addonId: null,
74416
+ access: "create"
74417
+ },
74383
74418
  "sceneMonitor.captureReference": {
74384
74419
  capName: "scene-monitor",
74385
74420
  capScope: "device",
@@ -75712,12 +75747,6 @@ Object.freeze({
75712
75747
  addonId: null,
75713
75748
  access: "view"
75714
75749
  },
75715
- "userManagement.listApiKeys": {
75716
- capName: "user-management",
75717
- capScope: "system",
75718
- addonId: null,
75719
- access: "view"
75720
- },
75721
75750
  "userManagement.listExternalIdentities": {
75722
75751
  capName: "user-management",
75723
75752
  capScope: "system",
@@ -75772,12 +75801,6 @@ Object.freeze({
75772
75801
  addonId: null,
75773
75802
  access: "create"
75774
75803
  },
75775
- "userManagement.revokeApiKey": {
75776
- capName: "user-management",
75777
- capScope: "system",
75778
- addonId: null,
75779
- access: "delete"
75780
- },
75781
75804
  "userManagement.revokeOauthSession": {
75782
75805
  capName: "user-management",
75783
75806
  capScope: "system",
@@ -79142,9 +79165,13 @@ new Map(Object.entries({
79142
79165
  "stream-online": "device-events",
79143
79166
  "stream-offline": "device-events",
79144
79167
  "detection-blind": "device-events",
79168
+ "motion-noisy": "device-events",
79169
+ "motion-calm": "device-events",
79145
79170
  "recording-stalled": "device-events",
79146
79171
  "recording-healthy": "device-events",
79147
79172
  "recording-degraded": "device-events",
79173
+ "device-attention-required": "device-events",
79174
+ "device-attention-resolved": "device-events",
79148
79175
  "node-online": "system",
79149
79176
  "node-offline": "system",
79150
79177
  "node-restarting": "system",
@@ -79161,6 +79188,8 @@ new Map(Object.entries({
79161
79188
  "alert-critical": "system",
79162
79189
  "alert-error": "system",
79163
79190
  "alert-critical-resolved": "system",
79191
+ "rule-broken": "system",
79192
+ "rule-repaired": "system",
79164
79193
  "storage-location-low": "system",
79165
79194
  "storage-location-critical": "system",
79166
79195
  "storage-location-ok": "system",
@@ -79225,6 +79254,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79225
79254
  label: "Detecting nothing",
79226
79255
  kinds: ["detection-blind"]
79227
79256
  },
79257
+ {
79258
+ id: "motion-noise",
79259
+ family: "device-events",
79260
+ label: "Motion without a subject",
79261
+ kinds: ["motion-noisy", "motion-calm"]
79262
+ },
79228
79263
  {
79229
79264
  id: "recording",
79230
79265
  family: "device-events",
@@ -79235,6 +79270,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79235
79270
  "recording-degraded"
79236
79271
  ]
79237
79272
  },
79273
+ {
79274
+ id: "device-attention",
79275
+ family: "device-events",
79276
+ label: "Needs attention",
79277
+ kinds: ["device-attention-required", "device-attention-resolved"]
79278
+ },
79238
79279
  {
79239
79280
  id: "nodes",
79240
79281
  family: "system",
@@ -79295,6 +79336,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79295
79336
  "alert-critical-resolved"
79296
79337
  ]
79297
79338
  },
79339
+ {
79340
+ id: "rule-health",
79341
+ family: "system",
79342
+ label: "Notification rules",
79343
+ kinds: ["rule-broken", "rule-repaired"]
79344
+ },
79298
79345
  {
79299
79346
  id: "alarm",
79300
79347
  family: "alarm",
@@ -79368,6 +79415,7 @@ var ALERT_EPISODE = [
79368
79415
  "alert-error",
79369
79416
  "alert-critical-resolved"
79370
79417
  ];
79418
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79371
79419
  var UPDATES = [
79372
79420
  "addon-update-available",
79373
79421
  "server-update-available",
@@ -79397,9 +79445,12 @@ var DEVICE_EVENTS = [
79397
79445
  "stream-online",
79398
79446
  "stream-offline",
79399
79447
  "detection-blind",
79448
+ "motion-noisy",
79449
+ "motion-calm",
79400
79450
  "recording-stalled",
79401
79451
  "recording-healthy",
79402
79452
  "recording-degraded",
79453
+ ...DEVICE_ATTENTION,
79403
79454
  ...ALARM
79404
79455
  ];
79405
79456
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79567,7 +79618,13 @@ var STATE_SUMMARY_VARS = [
79567
79618
  [...RULE_TEXT],
79568
79619
  [...RULE_TEXT],
79569
79620
  [...RULE_TEXT],
79570
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79621
+ [...RULE_TEXT],
79622
+ [...RULE_TEXT],
79623
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79624
+ [...RULE_TEXT],
79625
+ [...RULE_TEXT],
79626
+ [...RULE_TEXT],
79627
+ [...RULE_TEXT],
79571
79628
  [...RULE_TEXT],
79572
79629
  [...RULE_TEXT],
79573
79630
  [...RULE_TEXT],
@@ -79585,11 +79642,11 @@ var STATE_SUMMARY_VARS = [
79585
79642
  [...RULE_TEXT],
79586
79643
  [...RULE_TEXT],
79587
79644
  [...RULE_TEXT],
79645
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79588
79646
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79647
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79589
79648
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79590
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79591
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79592
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79649
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79593
79650
  [...RULE_TEXT],
79594
79651
  [...RULE_TEXT],
79595
79652
  [...RULE_TEXT],
@@ -79610,6 +79667,125 @@ var STATE_SUMMARY_VARS = [
79610
79667
  [...RULE_TEXT],
79611
79668
  ...STATE_SUMMARY_VARS
79612
79669
  ];
79670
+ new Map([
79671
+ {
79672
+ id: "device-connectivity",
79673
+ family: "device-events",
79674
+ label: "Device connectivity (offline / back online)",
79675
+ bad: ["device-offline"],
79676
+ recovery: ["device-online"],
79677
+ snapshotLabel: "Devices offline now",
79678
+ snapshotSection: "device-state"
79679
+ },
79680
+ {
79681
+ id: "device-switch",
79682
+ family: "device-events",
79683
+ label: "Device switched off / back on",
79684
+ bad: ["device-disabled"],
79685
+ recovery: ["device-enabled"],
79686
+ snapshotLabel: "Devices switched off now",
79687
+ snapshotSection: "device-state"
79688
+ },
79689
+ {
79690
+ id: "stream-connectivity",
79691
+ family: "device-events",
79692
+ label: "Stream connectivity (offline / back online)",
79693
+ bad: ["stream-offline"],
79694
+ recovery: ["stream-online"],
79695
+ snapshotLabel: "Streams offline now",
79696
+ snapshotSection: "streams"
79697
+ },
79698
+ {
79699
+ id: "battery",
79700
+ family: "device-events",
79701
+ label: "Battery (low / back to normal)",
79702
+ bad: ["device-battery-low"],
79703
+ recovery: ["device-battery-normal"],
79704
+ snapshotLabel: "Batteries low now",
79705
+ snapshotSection: "battery"
79706
+ },
79707
+ {
79708
+ id: "consumables",
79709
+ family: "device-events",
79710
+ label: "Consumables (low / replaced)",
79711
+ bad: ["device-consumable-low"],
79712
+ recovery: ["device-consumable-normal"],
79713
+ snapshotLabel: "Consumables low now",
79714
+ snapshotSection: "consumables"
79715
+ },
79716
+ {
79717
+ id: "tanks",
79718
+ family: "device-events",
79719
+ label: "Tanks (low or full / back to normal)",
79720
+ bad: ["device-tank-low", "device-tank-full"],
79721
+ recovery: ["device-tank-normal"],
79722
+ snapshotLabel: "Tanks low or full now",
79723
+ snapshotSection: "tanks"
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
+ },
79734
+ {
79735
+ id: "recording-health",
79736
+ family: "device-events",
79737
+ label: "Recording health (stalled or degraded / recording again)",
79738
+ bad: ["recording-stalled", "recording-degraded"],
79739
+ recovery: ["recording-healthy"],
79740
+ snapshotLabel: "Recordings stalled now",
79741
+ snapshotSection: null
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
+ },
79752
+ {
79753
+ id: "node-connectivity",
79754
+ family: "system",
79755
+ label: "Node connectivity (offline / back online)",
79756
+ bad: ["node-offline"],
79757
+ recovery: ["node-online"],
79758
+ snapshotLabel: "Nodes offline now",
79759
+ snapshotSection: "nodes"
79760
+ },
79761
+ {
79762
+ id: "storage-space",
79763
+ family: "system",
79764
+ label: "Storage space (low or critical / ok again)",
79765
+ bad: ["storage-location-low", "storage-location-critical"],
79766
+ recovery: ["storage-location-ok"],
79767
+ snapshotLabel: "Storage locations low now",
79768
+ snapshotSection: null
79769
+ },
79770
+ {
79771
+ id: "critical-alerts",
79772
+ family: "system",
79773
+ label: "Critical alerts (raised / resolved)",
79774
+ bad: ["alert-critical"],
79775
+ recovery: ["alert-critical-resolved"],
79776
+ snapshotLabel: "Critical alerts open now",
79777
+ snapshotSection: null
79778
+ },
79779
+ {
79780
+ id: "rule-health",
79781
+ family: "system",
79782
+ label: "Rule health (broken / repaired)",
79783
+ bad: ["rule-broken"],
79784
+ recovery: ["rule-repaired"],
79785
+ snapshotLabel: "Notification rules broken now",
79786
+ snapshotSection: null
79787
+ }
79788
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
79613
79789
  new Set([
79614
79790
  "disarmed",
79615
79791
  "armed_home",
@@ -80337,8 +80513,6 @@ function buildConnectionFormSchema() {
80337
80513
  id: "connection",
80338
80514
  title: "CCU connection",
80339
80515
  titleKey: "provider-homematic:connection.s_connection.title",
80340
- description: "Connect to a Homematic CCU3 or RaspberryMatic hub on your network.",
80341
- descriptionKey: "provider-homematic:connection.s_connection.description",
80342
80516
  columns: 1,
80343
80517
  fields: [{
80344
80518
  type: "text",
@@ -80353,7 +80527,7 @@ function buildConnectionFormSchema() {
80353
80527
  id: "interfaces",
80354
80528
  title: "Interfaces",
80355
80529
  titleKey: "provider-homematic:connection.s_interfaces.title",
80356
- 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.",
80357
80531
  descriptionKey: "provider-homematic:connection.s_interfaces.description",
80358
80532
  columns: 1,
80359
80533
  fields: [
@@ -80391,7 +80565,7 @@ function buildConnectionFormSchema() {
80391
80565
  id: "callback",
80392
80566
  title: "Event callback",
80393
80567
  titleKey: "provider-homematic:connection.s_callback.title",
80394
- 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.",
80395
80569
  descriptionKey: "provider-homematic:connection.s_callback.description",
80396
80570
  columns: 2,
80397
80571
  fields: [{
@@ -80414,7 +80588,7 @@ function buildConnectionFormSchema() {
80414
80588
  id: "credentials",
80415
80589
  title: "WebUI credentials",
80416
80590
  titleKey: "provider-homematic:connection.s_credentials.title",
80417
- 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.",
80418
80592
  descriptionKey: "provider-homematic:connection.s_credentials.description",
80419
80593
  columns: 2,
80420
80594
  fields: [{
@@ -106640,15 +106814,13 @@ var HomematicProviderAddon = class extends BaseDeviceProvider {
106640
106814
  id: "hm-broker",
106641
106815
  title: "Homematic broker",
106642
106816
  titleKey: "provider-homematic:globalSettings.s_hm-broker.title",
106643
- description: "Homematic CCU brokers are managed in the External systems → Brokers tab.",
106644
- descriptionKey: "provider-homematic:globalSettings.s_hm-broker.description",
106645
106817
  columns: 1,
106646
106818
  fields: [{
106647
106819
  type: "info",
106648
106820
  key: "brokerHelp",
106649
106821
  label: "Brokers are managed separately",
106650
106822
  labelKey: "provider-homematic:globalSettings.s_hm-broker.brokerHelp.label",
106651
- 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."
106652
106824
  }]
106653
106825
  }] });
106654
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.150",
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",