@camstack/addon-provider-homeassistant 1.2.615 → 1.2.617

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
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("./dist-i6ntIgzS.js");
2
+ const require_dist = require("./dist-CfZUXrNa.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_zlib = require("node:zlib");
5
5
  //#region src/ha-admin-link.ts
@@ -6874,14 +6874,14 @@ function haConfigSchema() {
6874
6874
  labelKey: "provider-homeassistant:haConfig.s_connection.service.label",
6875
6875
  required: true,
6876
6876
  placeholder: "mobile_app_pixel_7",
6877
- description: "The Home Assistant notify service to call — the part after `notify.` (e.g. `mobile_app_pixel_7`). Use Discover to list available services.",
6877
+ description: "The part after `notify.` (e.g. `mobile_app_pixel_7`); use Discover to list them.",
6878
6878
  descriptionKey: "provider-homeassistant:haConfig.s_connection.service.description"
6879
6879
  }, {
6880
6880
  type: "text",
6881
6881
  key: "brokerId",
6882
6882
  label: "Broker",
6883
6883
  labelKey: "provider-homeassistant:haConfig.s_connection.brokerId.label",
6884
- description: "Optional — the Home Assistant broker id to route through. Leave blank to use the only configured broker.",
6884
+ description: "Optional; blank uses the only configured broker.",
6885
6885
  descriptionKey: "provider-homeassistant:haConfig.s_connection.brokerId.description"
6886
6886
  }]
6887
6887
  }] };
@@ -8173,8 +8173,6 @@ var HaProviderAddon = class HaProviderAddon extends require_dist.BaseDeviceProvi
8173
8173
  id: "ha-calendars-import",
8174
8174
  title: "Calendars to import",
8175
8175
  titleKey: "provider-homeassistant:globalSettings.s_ha-calendars-import.title",
8176
- description: "Pick which Home Assistant calendar entities feed System → Calendars. Nothing selected = no calendars imported.",
8177
- descriptionKey: "provider-homeassistant:globalSettings.s_ha-calendars-import.description",
8178
8176
  columns: 1,
8179
8177
  fields: [{
8180
8178
  type: "multiselect",
@@ -8191,15 +8189,13 @@ var HaProviderAddon = class HaProviderAddon extends require_dist.BaseDeviceProvi
8191
8189
  id: "ha-broker",
8192
8190
  title: "Home Assistant broker",
8193
8191
  titleKey: "provider-homeassistant:globalSettings.s_ha-broker.title",
8194
- description: "Home Assistant brokers are managed in Connectivity → Brokers.",
8195
- descriptionKey: "provider-homeassistant:globalSettings.s_ha-broker.description",
8196
8192
  columns: 1,
8197
8193
  fields: [{
8198
8194
  type: "info",
8199
8195
  key: "brokerHelp",
8200
8196
  label: "Brokers are managed separately",
8201
8197
  labelKey: "provider-homeassistant:globalSettings.s_ha-broker.brokerHelp.label",
8202
- content: "This integration links to a Home Assistant broker. Add, edit, or remove brokers from Connectivity → Brokers. The integration only stores a reference to its broker — no credentials are kept here."
8198
+ content: "This integration links to a Home Assistant broker managed under Connectivity → Brokers."
8203
8199
  }]
8204
8200
  }] });
8205
8201
  }
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { A as connectivityCapability, At as discriminatedUnion, B as floodCapability, C as buildAddonRouteProvider, Ct as defineEntryKind, D as carbonMonoxideCapability, Dt as _enum, E as calendarSourceCapability, F as deviceAdoptionCapability, Ft as string, G as lawnMowerControlCapability, H as humidifierCapability, It as union, J as motionCapability, K as lockControlCapability, L as enumSensorCapability, Lt as unknown, M as controlCapability, Mt as number, N as coverCapability, Nt as object, O as climateControlCapability, Ot as array, P as deviceAdminLinkCapability, Pt as record, Q as numericSensorCapability, R as eventEmitterCapability, Rt as url, S as brokerCapability, St as createEvent, T as buttonCapability, Tt as entryBody, U as humiditySensorCapability, V as gasCapability, W as imageCapability, X as notificationOutputCapability, Y as normalizeUnit, Z as notifierCapability, _ as automationControlCapability, _t as DeviceRole, at as scriptRunnerCapability, b as binaryCapability, ct as tamperCapability, d as TargetSchema, dt as vacuumControlCapability, et as parseAdminBase, f as accessoriesCapability, ft as valveCapability, g as ambientLightSensorCapability, gt as DeviceFeature, h as alarmPanelCapability, ht as weatherCapability, it as pressureSensorCapability, j as contactCapability, jt as literal, k as colorCapability, kt as boolean, lt as temperatureSensorCapability, m as airQualitySensorCapability, mt as waterHeaterCapability, n as BaseDevice, nt as prepareNotification, ot as smokeCapability, p as addonRoutesCapability, pt as vibrationCapability, q as mediaPlayerCapability, r as BaseDeviceProvider, rt as presenceCapability, s as EnumSensorDateTimeFormatSchema, st as switchCapability, tt as powerMeterCapability, ut as updateCapability, v as batteryCapability, vt as DeviceType, w as buildDeviceAdminUrl, wt as defineRecordKinds, x as brightnessCapability, xt as RecordSecretUnavailableError, y as bestLocationMatch, yt as errMsg, z as fanControlCapability, zt as EventCategory } from "./dist-DULXoGnO.mjs";
1
+ import { A as connectivityCapability, At as discriminatedUnion, B as floodCapability, C as buildAddonRouteProvider, Ct as defineEntryKind, D as carbonMonoxideCapability, Dt as _enum, E as calendarSourceCapability, F as deviceAdoptionCapability, Ft as string, G as lawnMowerControlCapability, H as humidifierCapability, It as union, J as motionCapability, K as lockControlCapability, L as enumSensorCapability, Lt as unknown, M as controlCapability, Mt as number, N as coverCapability, Nt as object, O as climateControlCapability, Ot as array, P as deviceAdminLinkCapability, Pt as record, Q as numericSensorCapability, R as eventEmitterCapability, Rt as url, S as brokerCapability, St as createEvent, T as buttonCapability, Tt as entryBody, U as humiditySensorCapability, V as gasCapability, W as imageCapability, X as notificationOutputCapability, Y as normalizeUnit, Z as notifierCapability, _ as automationControlCapability, _t as DeviceRole, at as scriptRunnerCapability, b as binaryCapability, ct as tamperCapability, d as TargetSchema, dt as vacuumControlCapability, et as parseAdminBase, f as accessoriesCapability, ft as valveCapability, g as ambientLightSensorCapability, gt as DeviceFeature, h as alarmPanelCapability, ht as weatherCapability, it as pressureSensorCapability, j as contactCapability, jt as literal, k as colorCapability, kt as boolean, lt as temperatureSensorCapability, m as airQualitySensorCapability, mt as waterHeaterCapability, n as BaseDevice, nt as prepareNotification, ot as smokeCapability, p as addonRoutesCapability, pt as vibrationCapability, q as mediaPlayerCapability, r as BaseDeviceProvider, rt as presenceCapability, s as EnumSensorDateTimeFormatSchema, st as switchCapability, tt as powerMeterCapability, ut as updateCapability, v as batteryCapability, vt as DeviceType, w as buildDeviceAdminUrl, wt as defineRecordKinds, x as brightnessCapability, xt as RecordSecretUnavailableError, y as bestLocationMatch, yt as errMsg, z as fanControlCapability, zt as EventCategory } from "./dist-D6huwmAr.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { brotliCompressSync, deflateSync, gzipSync } from "node:zlib";
4
4
  //#region src/ha-admin-link.ts
@@ -6856,14 +6856,14 @@ function haConfigSchema() {
6856
6856
  labelKey: "provider-homeassistant:haConfig.s_connection.service.label",
6857
6857
  required: true,
6858
6858
  placeholder: "mobile_app_pixel_7",
6859
- description: "The Home Assistant notify service to call — the part after `notify.` (e.g. `mobile_app_pixel_7`). Use Discover to list available services.",
6859
+ description: "The part after `notify.` (e.g. `mobile_app_pixel_7`); use Discover to list them.",
6860
6860
  descriptionKey: "provider-homeassistant:haConfig.s_connection.service.description"
6861
6861
  }, {
6862
6862
  type: "text",
6863
6863
  key: "brokerId",
6864
6864
  label: "Broker",
6865
6865
  labelKey: "provider-homeassistant:haConfig.s_connection.brokerId.label",
6866
- description: "Optional — the Home Assistant broker id to route through. Leave blank to use the only configured broker.",
6866
+ description: "Optional; blank uses the only configured broker.",
6867
6867
  descriptionKey: "provider-homeassistant:haConfig.s_connection.brokerId.description"
6868
6868
  }]
6869
6869
  }] };
@@ -8155,8 +8155,6 @@ var HaProviderAddon = class HaProviderAddon extends BaseDeviceProvider {
8155
8155
  id: "ha-calendars-import",
8156
8156
  title: "Calendars to import",
8157
8157
  titleKey: "provider-homeassistant:globalSettings.s_ha-calendars-import.title",
8158
- description: "Pick which Home Assistant calendar entities feed System → Calendars. Nothing selected = no calendars imported.",
8159
- descriptionKey: "provider-homeassistant:globalSettings.s_ha-calendars-import.description",
8160
8158
  columns: 1,
8161
8159
  fields: [{
8162
8160
  type: "multiselect",
@@ -8173,15 +8171,13 @@ var HaProviderAddon = class HaProviderAddon extends BaseDeviceProvider {
8173
8171
  id: "ha-broker",
8174
8172
  title: "Home Assistant broker",
8175
8173
  titleKey: "provider-homeassistant:globalSettings.s_ha-broker.title",
8176
- description: "Home Assistant brokers are managed in Connectivity → Brokers.",
8177
- descriptionKey: "provider-homeassistant:globalSettings.s_ha-broker.description",
8178
8174
  columns: 1,
8179
8175
  fields: [{
8180
8176
  type: "info",
8181
8177
  key: "brokerHelp",
8182
8178
  label: "Brokers are managed separately",
8183
8179
  labelKey: "provider-homeassistant:globalSettings.s_ha-broker.brokerHelp.label",
8184
- content: "This integration links to a Home Assistant broker. Add, edit, or remove brokers from Connectivity → Brokers. The integration only stores a reference to its broker — no credentials are kept here."
8180
+ content: "This integration links to a Home Assistant broker managed under Connectivity → Brokers."
8185
8181
  }]
8186
8182
  }] });
8187
8183
  }
@@ -1,5 +1,5 @@
1
1
  require("node:crypto");
2
- //#region ../types/dist/event-category-DOl51-Ij.mjs
2
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -316,6 +316,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
316
316
  */
317
317
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
318
318
  /**
319
+ * A camera's motion source has fired constantly with no subject for an hour
320
+ * (motion duty or session count over the bar, zero detections) — it is not
321
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
322
+ * {@link PipelineMotionCalm}.
323
+ */
324
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
325
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
326
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
327
+ /**
319
328
  * Per-camera pipeline config was mutated by the orchestrator
320
329
  * (3-level settings change via `setAgentAddonDefaults` /
321
330
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -687,6 +696,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
687
696
  EventCategory["BackupRestored"] = "backup.restored";
688
697
  EventCategory["NotificationDispatched"] = "notification.dispatched";
689
698
  EventCategory["NotificationFailed"] = "notification.failed";
699
+ /**
700
+ * A notification rule that cannot work (D905): its stored row does not load,
701
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
702
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
703
+ */
704
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
705
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
706
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
690
707
  EventCategory["DeviceUpdated"] = "device.updated";
691
708
  /**
692
709
  * Transport-level connectivity. Emitted by the device driver when
@@ -5547,7 +5564,7 @@ var ZodIssueCode = {
5547
5564
  var ZodFirstPartyTypeKind;
5548
5565
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5549
5566
  //#endregion
5550
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5567
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5551
5568
  /**
5552
5569
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5553
5570
  * window to float samples (D455).
@@ -8146,7 +8163,7 @@ var EntryDescriptorSchema = object({
8146
8163
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8147
8164
  fields: record(string(), unknown())
8148
8165
  }).strict();
8149
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8166
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8150
8167
  var RecordKindDeclarationSchema = object({
8151
8168
  database: _enum(RECORD_DATABASES).default("settings"),
8152
8169
  class: _enum(RECORD_CLASSES),
@@ -8165,14 +8182,6 @@ var RecordKindDeclarationSchema = object({
8165
8182
  secretPaths: array(string().min(1)).default([]),
8166
8183
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8167
8184
  secretArrayKeys: record(string(), string()).default({}),
8168
- /**
8169
- * RETIRED (D900): the legacy table a kind adopted from during the records
8170
- * migration. Nothing declares it any more and nothing reads it; the schema
8171
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8172
- * (an orphaned kind is never redeclared) and an addon built before the
8173
- * removal still sends it. Never set it.
8174
- */
8175
- adoptsFrom: string().min(1).optional(),
8176
8185
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8177
8186
  transactFamily: string().min(1).optional(),
8178
8187
  entry: EntryDescriptorSchema.optional()
@@ -13171,17 +13180,6 @@ object({
13171
13180
  createdAt: number(),
13172
13181
  updatedAt: number()
13173
13182
  });
13174
- object({
13175
- id: string(),
13176
- label: string(),
13177
- isAdmin: boolean().default(false),
13178
- allowedProviders: AllowedProviderSchema,
13179
- allowedDevices: AllowedDevicesSchema,
13180
- tokenHash: string(),
13181
- tokenPrefix: string(),
13182
- createdAt: number(),
13183
- lastUsedAt: number().optional()
13184
- });
13185
13183
  object({
13186
13184
  id: string(),
13187
13185
  userId: string(),
@@ -17231,16 +17229,36 @@ var RecordKindStateSchema = _enum([
17231
17229
  var DeclareKindResultSchema = object({
17232
17230
  kindId: number().int(),
17233
17231
  state: RecordKindStateSchema,
17234
- createdIndexes: array(string()),
17235
- /**
17236
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17237
- * it stays on the wire, null, because an addon built before the removal reads
17238
- * an ABSENT field as "adoption pending" and refuses to start.
17239
- */
17240
- adoptionPending: _null()
17232
+ createdIndexes: array(string())
17241
17233
  });
17242
17234
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17243
17235
  var SecretRefsList = array(string());
17236
+ /**
17237
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17238
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17239
+ */
17240
+ var RecordTransactOpSchema = discriminatedUnion("op", [
17241
+ object({
17242
+ op: literal("put"),
17243
+ kind: RecordKindNameSchema,
17244
+ record: RecordInputSchema,
17245
+ ifRev: number().int().min(0).optional()
17246
+ }),
17247
+ object({
17248
+ op: literal("patch"),
17249
+ kind: RecordKindNameSchema,
17250
+ id: RecordIdSchema,
17251
+ data: RecordBodySchema,
17252
+ at: number().int().nullable().optional(),
17253
+ expiresAt: number().int().nullable().optional(),
17254
+ ifRev: number().int().min(1).optional()
17255
+ }),
17256
+ object({
17257
+ op: literal("delete"),
17258
+ kind: RecordKindNameSchema,
17259
+ id: RecordIdSchema
17260
+ })
17261
+ ]);
17244
17262
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17245
17263
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17246
17264
  kind: "mutation",
@@ -17347,6 +17365,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17347
17365
  }), {
17348
17366
  kind: "mutation",
17349
17367
  auth: "admin"
17368
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17369
+ results: array(object({
17370
+ rev: number().int().nullable(),
17371
+ deleted: boolean()
17372
+ })),
17373
+ releasedRefs: SecretRefsList,
17374
+ secretRefs: SecretRefsList
17375
+ }), {
17376
+ kind: "mutation",
17377
+ auth: "admin"
17350
17378
  }), method(object({
17351
17379
  deviceId: number().int(),
17352
17380
  kinds: array(RecordKindNameSchema).optional()
@@ -43197,9 +43225,13 @@ var NcSystemEventKindSchema = _enum([
43197
43225
  "node-updating",
43198
43226
  "node-inference-unavailable",
43199
43227
  "detection-blind",
43228
+ "motion-noisy",
43229
+ "motion-calm",
43200
43230
  "recording-stalled",
43201
43231
  "recording-healthy",
43202
43232
  "recording-degraded",
43233
+ "device-attention-required",
43234
+ "device-attention-resolved",
43203
43235
  "storage-location-low",
43204
43236
  "storage-location-critical",
43205
43237
  "storage-location-ok",
@@ -43223,6 +43255,8 @@ var NcSystemEventKindSchema = _enum([
43223
43255
  "alert-critical",
43224
43256
  "alert-error",
43225
43257
  "alert-critical-resolved",
43258
+ "rule-broken",
43259
+ "rule-repaired",
43226
43260
  "camera-online",
43227
43261
  "camera-offline",
43228
43262
  "camera-disabled",
@@ -56636,6 +56670,16 @@ var DishwasherStatusSchema = object({
56636
56670
  powerState: string().nullable(),
56637
56671
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56638
56672
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56673
+ /**
56674
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56675
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56676
+ * when none is reported. A cleared reminder is not an unknown one.
56677
+ */
56678
+ filterCleaningDue: boolean().nullable(),
56679
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56680
+ machineCareDue: boolean().nullable(),
56681
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56682
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56639
56683
  /** Option states: null when the appliance does not expose the option or has not said. */
56640
56684
  halfLoad: boolean().nullable(),
56641
56685
  hygienePlus: boolean().nullable(),
@@ -65286,16 +65330,6 @@ var UpdateUserInputSchema = object({
65286
65330
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65287
65331
  scopes: array(TokenScopeSchema).optional()
65288
65332
  });
65289
- var ApiKeySummarySchema = object({
65290
- id: string(),
65291
- label: string(),
65292
- isAdmin: boolean().default(false),
65293
- allowedProviders: union([array(string()), literal("*")]).optional(),
65294
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65295
- tokenPrefix: string(),
65296
- createdAt: number(),
65297
- lastUsedAt: number().optional()
65298
- });
65299
65333
  var OauthSessionSummarySchema = object({
65300
65334
  id: string(),
65301
65335
  userId: string(),
@@ -65317,8 +65351,7 @@ var TotpStatusSchema = object({
65317
65351
  confirmedAt: number().nullable()
65318
65352
  });
65319
65353
  /**
65320
- * user-management — singleton capability for user accounts and the
65321
- * legacy API-key rows.
65354
+ * user-management — singleton capability for user accounts.
65322
65355
  *
65323
65356
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65324
65357
  * — the subset check on `setUserScopes` is moot
@@ -65374,10 +65407,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65374
65407
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65375
65408
  kind: "mutation",
65376
65409
  access: "view"
65377
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
65378
- kind: "mutation",
65379
- auth: "admin",
65380
- access: "delete"
65381
65410
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65382
65411
  kind: "mutation",
65383
65412
  auth: "admin",
@@ -74833,6 +74862,12 @@ Object.freeze({
74833
74862
  addonId: null,
74834
74863
  access: "view"
74835
74864
  },
74865
+ "records.transact": {
74866
+ capName: "records",
74867
+ capScope: "system",
74868
+ addonId: null,
74869
+ access: "create"
74870
+ },
74836
74871
  "sceneMonitor.captureReference": {
74837
74872
  capName: "scene-monitor",
74838
74873
  capScope: "device",
@@ -76165,12 +76200,6 @@ Object.freeze({
76165
76200
  addonId: null,
76166
76201
  access: "view"
76167
76202
  },
76168
- "userManagement.listApiKeys": {
76169
- capName: "user-management",
76170
- capScope: "system",
76171
- addonId: null,
76172
- access: "view"
76173
- },
76174
76203
  "userManagement.listExternalIdentities": {
76175
76204
  capName: "user-management",
76176
76205
  capScope: "system",
@@ -76225,12 +76254,6 @@ Object.freeze({
76225
76254
  addonId: null,
76226
76255
  access: "create"
76227
76256
  },
76228
- "userManagement.revokeApiKey": {
76229
- capName: "user-management",
76230
- capScope: "system",
76231
- addonId: null,
76232
- access: "delete"
76233
- },
76234
76257
  "userManagement.revokeOauthSession": {
76235
76258
  capName: "user-management",
76236
76259
  capScope: "system",
@@ -79802,9 +79825,13 @@ new Map(Object.entries({
79802
79825
  "stream-online": "device-events",
79803
79826
  "stream-offline": "device-events",
79804
79827
  "detection-blind": "device-events",
79828
+ "motion-noisy": "device-events",
79829
+ "motion-calm": "device-events",
79805
79830
  "recording-stalled": "device-events",
79806
79831
  "recording-healthy": "device-events",
79807
79832
  "recording-degraded": "device-events",
79833
+ "device-attention-required": "device-events",
79834
+ "device-attention-resolved": "device-events",
79808
79835
  "node-online": "system",
79809
79836
  "node-offline": "system",
79810
79837
  "node-restarting": "system",
@@ -79821,6 +79848,8 @@ new Map(Object.entries({
79821
79848
  "alert-critical": "system",
79822
79849
  "alert-error": "system",
79823
79850
  "alert-critical-resolved": "system",
79851
+ "rule-broken": "system",
79852
+ "rule-repaired": "system",
79824
79853
  "storage-location-low": "system",
79825
79854
  "storage-location-critical": "system",
79826
79855
  "storage-location-ok": "system",
@@ -79885,6 +79914,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79885
79914
  label: "Detecting nothing",
79886
79915
  kinds: ["detection-blind"]
79887
79916
  },
79917
+ {
79918
+ id: "motion-noise",
79919
+ family: "device-events",
79920
+ label: "Motion without a subject",
79921
+ kinds: ["motion-noisy", "motion-calm"]
79922
+ },
79888
79923
  {
79889
79924
  id: "recording",
79890
79925
  family: "device-events",
@@ -79895,6 +79930,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79895
79930
  "recording-degraded"
79896
79931
  ]
79897
79932
  },
79933
+ {
79934
+ id: "device-attention",
79935
+ family: "device-events",
79936
+ label: "Needs attention",
79937
+ kinds: ["device-attention-required", "device-attention-resolved"]
79938
+ },
79898
79939
  {
79899
79940
  id: "nodes",
79900
79941
  family: "system",
@@ -79955,6 +79996,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79955
79996
  "alert-critical-resolved"
79956
79997
  ]
79957
79998
  },
79999
+ {
80000
+ id: "rule-health",
80001
+ family: "system",
80002
+ label: "Notification rules",
80003
+ kinds: ["rule-broken", "rule-repaired"]
80004
+ },
79958
80005
  {
79959
80006
  id: "alarm",
79960
80007
  family: "alarm",
@@ -80028,6 +80075,7 @@ var ALERT_EPISODE = [
80028
80075
  "alert-error",
80029
80076
  "alert-critical-resolved"
80030
80077
  ];
80078
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
80031
80079
  var UPDATES = [
80032
80080
  "addon-update-available",
80033
80081
  "server-update-available",
@@ -80057,9 +80105,12 @@ var DEVICE_EVENTS = [
80057
80105
  "stream-online",
80058
80106
  "stream-offline",
80059
80107
  "detection-blind",
80108
+ "motion-noisy",
80109
+ "motion-calm",
80060
80110
  "recording-stalled",
80061
80111
  "recording-healthy",
80062
80112
  "recording-degraded",
80113
+ ...DEVICE_ATTENTION,
80063
80114
  ...ALARM
80064
80115
  ];
80065
80116
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80227,7 +80278,13 @@ var STATE_SUMMARY_VARS = [
80227
80278
  [...RULE_TEXT],
80228
80279
  [...RULE_TEXT],
80229
80280
  [...RULE_TEXT],
80230
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80281
+ [...RULE_TEXT],
80282
+ [...RULE_TEXT],
80283
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80284
+ [...RULE_TEXT],
80285
+ [...RULE_TEXT],
80286
+ [...RULE_TEXT],
80287
+ [...RULE_TEXT],
80231
80288
  [...RULE_TEXT],
80232
80289
  [...RULE_TEXT],
80233
80290
  [...RULE_TEXT],
@@ -80245,11 +80302,11 @@ var STATE_SUMMARY_VARS = [
80245
80302
  [...RULE_TEXT],
80246
80303
  [...RULE_TEXT],
80247
80304
  [...RULE_TEXT],
80305
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80248
80306
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80307
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80249
80308
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80250
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80251
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80252
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80309
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80253
80310
  [...RULE_TEXT],
80254
80311
  [...RULE_TEXT],
80255
80312
  [...RULE_TEXT],
@@ -80270,6 +80327,125 @@ var STATE_SUMMARY_VARS = [
80270
80327
  [...RULE_TEXT],
80271
80328
  ...STATE_SUMMARY_VARS
80272
80329
  ];
80330
+ new Map([
80331
+ {
80332
+ id: "device-connectivity",
80333
+ family: "device-events",
80334
+ label: "Device connectivity (offline / back online)",
80335
+ bad: ["device-offline"],
80336
+ recovery: ["device-online"],
80337
+ snapshotLabel: "Devices offline now",
80338
+ snapshotSection: "device-state"
80339
+ },
80340
+ {
80341
+ id: "device-switch",
80342
+ family: "device-events",
80343
+ label: "Device switched off / back on",
80344
+ bad: ["device-disabled"],
80345
+ recovery: ["device-enabled"],
80346
+ snapshotLabel: "Devices switched off now",
80347
+ snapshotSection: "device-state"
80348
+ },
80349
+ {
80350
+ id: "stream-connectivity",
80351
+ family: "device-events",
80352
+ label: "Stream connectivity (offline / back online)",
80353
+ bad: ["stream-offline"],
80354
+ recovery: ["stream-online"],
80355
+ snapshotLabel: "Streams offline now",
80356
+ snapshotSection: "streams"
80357
+ },
80358
+ {
80359
+ id: "battery",
80360
+ family: "device-events",
80361
+ label: "Battery (low / back to normal)",
80362
+ bad: ["device-battery-low"],
80363
+ recovery: ["device-battery-normal"],
80364
+ snapshotLabel: "Batteries low now",
80365
+ snapshotSection: "battery"
80366
+ },
80367
+ {
80368
+ id: "consumables",
80369
+ family: "device-events",
80370
+ label: "Consumables (low / replaced)",
80371
+ bad: ["device-consumable-low"],
80372
+ recovery: ["device-consumable-normal"],
80373
+ snapshotLabel: "Consumables low now",
80374
+ snapshotSection: "consumables"
80375
+ },
80376
+ {
80377
+ id: "tanks",
80378
+ family: "device-events",
80379
+ label: "Tanks (low or full / back to normal)",
80380
+ bad: ["device-tank-low", "device-tank-full"],
80381
+ recovery: ["device-tank-normal"],
80382
+ snapshotLabel: "Tanks low or full now",
80383
+ snapshotSection: "tanks"
80384
+ },
80385
+ {
80386
+ id: "motion-noise",
80387
+ family: "device-events",
80388
+ label: "Motion without a subject (constant / calm again)",
80389
+ bad: ["motion-noisy"],
80390
+ recovery: ["motion-calm"],
80391
+ snapshotLabel: "Cameras with constant motion now",
80392
+ snapshotSection: null
80393
+ },
80394
+ {
80395
+ id: "recording-health",
80396
+ family: "device-events",
80397
+ label: "Recording health (stalled or degraded / recording again)",
80398
+ bad: ["recording-stalled", "recording-degraded"],
80399
+ recovery: ["recording-healthy"],
80400
+ snapshotLabel: "Recordings stalled now",
80401
+ snapshotSection: null
80402
+ },
80403
+ {
80404
+ id: "device-attention",
80405
+ family: "device-events",
80406
+ label: "Device needs attention (raised / resolved)",
80407
+ bad: ["device-attention-required"],
80408
+ recovery: ["device-attention-resolved"],
80409
+ snapshotLabel: "Devices needing attention now",
80410
+ snapshotSection: null
80411
+ },
80412
+ {
80413
+ id: "node-connectivity",
80414
+ family: "system",
80415
+ label: "Node connectivity (offline / back online)",
80416
+ bad: ["node-offline"],
80417
+ recovery: ["node-online"],
80418
+ snapshotLabel: "Nodes offline now",
80419
+ snapshotSection: "nodes"
80420
+ },
80421
+ {
80422
+ id: "storage-space",
80423
+ family: "system",
80424
+ label: "Storage space (low or critical / ok again)",
80425
+ bad: ["storage-location-low", "storage-location-critical"],
80426
+ recovery: ["storage-location-ok"],
80427
+ snapshotLabel: "Storage locations low now",
80428
+ snapshotSection: null
80429
+ },
80430
+ {
80431
+ id: "critical-alerts",
80432
+ family: "system",
80433
+ label: "Critical alerts (raised / resolved)",
80434
+ bad: ["alert-critical"],
80435
+ recovery: ["alert-critical-resolved"],
80436
+ snapshotLabel: "Critical alerts open now",
80437
+ snapshotSection: null
80438
+ },
80439
+ {
80440
+ id: "rule-health",
80441
+ family: "system",
80442
+ label: "Rule health (broken / repaired)",
80443
+ bad: ["rule-broken"],
80444
+ recovery: ["rule-repaired"],
80445
+ snapshotLabel: "Notification rules broken now",
80446
+ snapshotSection: null
80447
+ }
80448
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
80273
80449
  new Set([
80274
80450
  "disarmed",
80275
80451
  "armed_home",
@@ -1,4 +1,4 @@
1
- //#region ../types/dist/event-category-DOl51-Ij.mjs
1
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
2
2
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
3
3
  EventCategory["SystemBoot"] = "system.boot";
4
4
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -315,6 +315,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
315
315
  */
316
316
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
317
317
  /**
318
+ * A camera's motion source has fired constantly with no subject for an hour
319
+ * (motion duty or session count over the bar, zero detections) — it is not
320
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
321
+ * {@link PipelineMotionCalm}.
322
+ */
323
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
324
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
325
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
326
+ /**
318
327
  * Per-camera pipeline config was mutated by the orchestrator
319
328
  * (3-level settings change via `setAgentAddonDefaults` /
320
329
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -686,6 +695,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
686
695
  EventCategory["BackupRestored"] = "backup.restored";
687
696
  EventCategory["NotificationDispatched"] = "notification.dispatched";
688
697
  EventCategory["NotificationFailed"] = "notification.failed";
698
+ /**
699
+ * A notification rule that cannot work (D905): its stored row does not load,
700
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
701
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
702
+ */
703
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
704
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
705
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
689
706
  EventCategory["DeviceUpdated"] = "device.updated";
690
707
  /**
691
708
  * Transport-level connectivity. Emitted by the device driver when
@@ -5546,7 +5563,7 @@ var ZodIssueCode = {
5546
5563
  var ZodFirstPartyTypeKind;
5547
5564
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5548
5565
  //#endregion
5549
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5566
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5550
5567
  /**
5551
5568
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5552
5569
  * window to float samples (D455).
@@ -8145,7 +8162,7 @@ var EntryDescriptorSchema = object({
8145
8162
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8146
8163
  fields: record(string(), unknown())
8147
8164
  }).strict();
8148
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8165
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8149
8166
  var RecordKindDeclarationSchema = object({
8150
8167
  database: _enum(RECORD_DATABASES).default("settings"),
8151
8168
  class: _enum(RECORD_CLASSES),
@@ -8164,14 +8181,6 @@ var RecordKindDeclarationSchema = object({
8164
8181
  secretPaths: array(string().min(1)).default([]),
8165
8182
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8166
8183
  secretArrayKeys: record(string(), string()).default({}),
8167
- /**
8168
- * RETIRED (D900): the legacy table a kind adopted from during the records
8169
- * migration. Nothing declares it any more and nothing reads it; the schema
8170
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8171
- * (an orphaned kind is never redeclared) and an addon built before the
8172
- * removal still sends it. Never set it.
8173
- */
8174
- adoptsFrom: string().min(1).optional(),
8175
8184
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8176
8185
  transactFamily: string().min(1).optional(),
8177
8186
  entry: EntryDescriptorSchema.optional()
@@ -13170,17 +13179,6 @@ object({
13170
13179
  createdAt: number(),
13171
13180
  updatedAt: number()
13172
13181
  });
13173
- object({
13174
- id: string(),
13175
- label: string(),
13176
- isAdmin: boolean().default(false),
13177
- allowedProviders: AllowedProviderSchema,
13178
- allowedDevices: AllowedDevicesSchema,
13179
- tokenHash: string(),
13180
- tokenPrefix: string(),
13181
- createdAt: number(),
13182
- lastUsedAt: number().optional()
13183
- });
13184
13182
  object({
13185
13183
  id: string(),
13186
13184
  userId: string(),
@@ -17230,16 +17228,36 @@ var RecordKindStateSchema = _enum([
17230
17228
  var DeclareKindResultSchema = object({
17231
17229
  kindId: number().int(),
17232
17230
  state: RecordKindStateSchema,
17233
- createdIndexes: array(string()),
17234
- /**
17235
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17236
- * it stays on the wire, null, because an addon built before the removal reads
17237
- * an ABSENT field as "adoption pending" and refuses to start.
17238
- */
17239
- adoptionPending: _null()
17231
+ createdIndexes: array(string())
17240
17232
  });
17241
17233
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17242
17234
  var SecretRefsList = array(string());
17235
+ /**
17236
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17237
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17238
+ */
17239
+ var RecordTransactOpSchema = discriminatedUnion("op", [
17240
+ object({
17241
+ op: literal("put"),
17242
+ kind: RecordKindNameSchema,
17243
+ record: RecordInputSchema,
17244
+ ifRev: number().int().min(0).optional()
17245
+ }),
17246
+ object({
17247
+ op: literal("patch"),
17248
+ kind: RecordKindNameSchema,
17249
+ id: RecordIdSchema,
17250
+ data: RecordBodySchema,
17251
+ at: number().int().nullable().optional(),
17252
+ expiresAt: number().int().nullable().optional(),
17253
+ ifRev: number().int().min(1).optional()
17254
+ }),
17255
+ object({
17256
+ op: literal("delete"),
17257
+ kind: RecordKindNameSchema,
17258
+ id: RecordIdSchema
17259
+ })
17260
+ ]);
17243
17261
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17244
17262
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17245
17263
  kind: "mutation",
@@ -17346,6 +17364,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17346
17364
  }), {
17347
17365
  kind: "mutation",
17348
17366
  auth: "admin"
17367
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17368
+ results: array(object({
17369
+ rev: number().int().nullable(),
17370
+ deleted: boolean()
17371
+ })),
17372
+ releasedRefs: SecretRefsList,
17373
+ secretRefs: SecretRefsList
17374
+ }), {
17375
+ kind: "mutation",
17376
+ auth: "admin"
17349
17377
  }), method(object({
17350
17378
  deviceId: number().int(),
17351
17379
  kinds: array(RecordKindNameSchema).optional()
@@ -43196,9 +43224,13 @@ var NcSystemEventKindSchema = _enum([
43196
43224
  "node-updating",
43197
43225
  "node-inference-unavailable",
43198
43226
  "detection-blind",
43227
+ "motion-noisy",
43228
+ "motion-calm",
43199
43229
  "recording-stalled",
43200
43230
  "recording-healthy",
43201
43231
  "recording-degraded",
43232
+ "device-attention-required",
43233
+ "device-attention-resolved",
43202
43234
  "storage-location-low",
43203
43235
  "storage-location-critical",
43204
43236
  "storage-location-ok",
@@ -43222,6 +43254,8 @@ var NcSystemEventKindSchema = _enum([
43222
43254
  "alert-critical",
43223
43255
  "alert-error",
43224
43256
  "alert-critical-resolved",
43257
+ "rule-broken",
43258
+ "rule-repaired",
43225
43259
  "camera-online",
43226
43260
  "camera-offline",
43227
43261
  "camera-disabled",
@@ -56635,6 +56669,16 @@ var DishwasherStatusSchema = object({
56635
56669
  powerState: string().nullable(),
56636
56670
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56637
56671
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56672
+ /**
56673
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56674
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56675
+ * when none is reported. A cleared reminder is not an unknown one.
56676
+ */
56677
+ filterCleaningDue: boolean().nullable(),
56678
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56679
+ machineCareDue: boolean().nullable(),
56680
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56681
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56638
56682
  /** Option states: null when the appliance does not expose the option or has not said. */
56639
56683
  halfLoad: boolean().nullable(),
56640
56684
  hygienePlus: boolean().nullable(),
@@ -65285,16 +65329,6 @@ var UpdateUserInputSchema = object({
65285
65329
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65286
65330
  scopes: array(TokenScopeSchema).optional()
65287
65331
  });
65288
- var ApiKeySummarySchema = object({
65289
- id: string(),
65290
- label: string(),
65291
- isAdmin: boolean().default(false),
65292
- allowedProviders: union([array(string()), literal("*")]).optional(),
65293
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65294
- tokenPrefix: string(),
65295
- createdAt: number(),
65296
- lastUsedAt: number().optional()
65297
- });
65298
65332
  var OauthSessionSummarySchema = object({
65299
65333
  id: string(),
65300
65334
  userId: string(),
@@ -65316,8 +65350,7 @@ var TotpStatusSchema = object({
65316
65350
  confirmedAt: number().nullable()
65317
65351
  });
65318
65352
  /**
65319
- * user-management — singleton capability for user accounts and the
65320
- * legacy API-key rows.
65353
+ * user-management — singleton capability for user accounts.
65321
65354
  *
65322
65355
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65323
65356
  * — the subset check on `setUserScopes` is moot
@@ -65373,10 +65406,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65373
65406
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65374
65407
  kind: "mutation",
65375
65408
  access: "view"
65376
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
65377
- kind: "mutation",
65378
- auth: "admin",
65379
- access: "delete"
65380
65409
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65381
65410
  kind: "mutation",
65382
65411
  auth: "admin",
@@ -74832,6 +74861,12 @@ Object.freeze({
74832
74861
  addonId: null,
74833
74862
  access: "view"
74834
74863
  },
74864
+ "records.transact": {
74865
+ capName: "records",
74866
+ capScope: "system",
74867
+ addonId: null,
74868
+ access: "create"
74869
+ },
74835
74870
  "sceneMonitor.captureReference": {
74836
74871
  capName: "scene-monitor",
74837
74872
  capScope: "device",
@@ -76164,12 +76199,6 @@ Object.freeze({
76164
76199
  addonId: null,
76165
76200
  access: "view"
76166
76201
  },
76167
- "userManagement.listApiKeys": {
76168
- capName: "user-management",
76169
- capScope: "system",
76170
- addonId: null,
76171
- access: "view"
76172
- },
76173
76202
  "userManagement.listExternalIdentities": {
76174
76203
  capName: "user-management",
76175
76204
  capScope: "system",
@@ -76224,12 +76253,6 @@ Object.freeze({
76224
76253
  addonId: null,
76225
76254
  access: "create"
76226
76255
  },
76227
- "userManagement.revokeApiKey": {
76228
- capName: "user-management",
76229
- capScope: "system",
76230
- addonId: null,
76231
- access: "delete"
76232
- },
76233
76256
  "userManagement.revokeOauthSession": {
76234
76257
  capName: "user-management",
76235
76258
  capScope: "system",
@@ -79801,9 +79824,13 @@ new Map(Object.entries({
79801
79824
  "stream-online": "device-events",
79802
79825
  "stream-offline": "device-events",
79803
79826
  "detection-blind": "device-events",
79827
+ "motion-noisy": "device-events",
79828
+ "motion-calm": "device-events",
79804
79829
  "recording-stalled": "device-events",
79805
79830
  "recording-healthy": "device-events",
79806
79831
  "recording-degraded": "device-events",
79832
+ "device-attention-required": "device-events",
79833
+ "device-attention-resolved": "device-events",
79807
79834
  "node-online": "system",
79808
79835
  "node-offline": "system",
79809
79836
  "node-restarting": "system",
@@ -79820,6 +79847,8 @@ new Map(Object.entries({
79820
79847
  "alert-critical": "system",
79821
79848
  "alert-error": "system",
79822
79849
  "alert-critical-resolved": "system",
79850
+ "rule-broken": "system",
79851
+ "rule-repaired": "system",
79823
79852
  "storage-location-low": "system",
79824
79853
  "storage-location-critical": "system",
79825
79854
  "storage-location-ok": "system",
@@ -79884,6 +79913,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79884
79913
  label: "Detecting nothing",
79885
79914
  kinds: ["detection-blind"]
79886
79915
  },
79916
+ {
79917
+ id: "motion-noise",
79918
+ family: "device-events",
79919
+ label: "Motion without a subject",
79920
+ kinds: ["motion-noisy", "motion-calm"]
79921
+ },
79887
79922
  {
79888
79923
  id: "recording",
79889
79924
  family: "device-events",
@@ -79894,6 +79929,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79894
79929
  "recording-degraded"
79895
79930
  ]
79896
79931
  },
79932
+ {
79933
+ id: "device-attention",
79934
+ family: "device-events",
79935
+ label: "Needs attention",
79936
+ kinds: ["device-attention-required", "device-attention-resolved"]
79937
+ },
79897
79938
  {
79898
79939
  id: "nodes",
79899
79940
  family: "system",
@@ -79954,6 +79995,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79954
79995
  "alert-critical-resolved"
79955
79996
  ]
79956
79997
  },
79998
+ {
79999
+ id: "rule-health",
80000
+ family: "system",
80001
+ label: "Notification rules",
80002
+ kinds: ["rule-broken", "rule-repaired"]
80003
+ },
79957
80004
  {
79958
80005
  id: "alarm",
79959
80006
  family: "alarm",
@@ -80027,6 +80074,7 @@ var ALERT_EPISODE = [
80027
80074
  "alert-error",
80028
80075
  "alert-critical-resolved"
80029
80076
  ];
80077
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
80030
80078
  var UPDATES = [
80031
80079
  "addon-update-available",
80032
80080
  "server-update-available",
@@ -80056,9 +80104,12 @@ var DEVICE_EVENTS = [
80056
80104
  "stream-online",
80057
80105
  "stream-offline",
80058
80106
  "detection-blind",
80107
+ "motion-noisy",
80108
+ "motion-calm",
80059
80109
  "recording-stalled",
80060
80110
  "recording-healthy",
80061
80111
  "recording-degraded",
80112
+ ...DEVICE_ATTENTION,
80062
80113
  ...ALARM
80063
80114
  ];
80064
80115
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80226,7 +80277,13 @@ var STATE_SUMMARY_VARS = [
80226
80277
  [...RULE_TEXT],
80227
80278
  [...RULE_TEXT],
80228
80279
  [...RULE_TEXT],
80229
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80280
+ [...RULE_TEXT],
80281
+ [...RULE_TEXT],
80282
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80283
+ [...RULE_TEXT],
80284
+ [...RULE_TEXT],
80285
+ [...RULE_TEXT],
80286
+ [...RULE_TEXT],
80230
80287
  [...RULE_TEXT],
80231
80288
  [...RULE_TEXT],
80232
80289
  [...RULE_TEXT],
@@ -80244,11 +80301,11 @@ var STATE_SUMMARY_VARS = [
80244
80301
  [...RULE_TEXT],
80245
80302
  [...RULE_TEXT],
80246
80303
  [...RULE_TEXT],
80304
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80247
80305
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80306
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80248
80307
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80249
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80250
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80251
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80308
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80252
80309
  [...RULE_TEXT],
80253
80310
  [...RULE_TEXT],
80254
80311
  [...RULE_TEXT],
@@ -80269,6 +80326,125 @@ var STATE_SUMMARY_VARS = [
80269
80326
  [...RULE_TEXT],
80270
80327
  ...STATE_SUMMARY_VARS
80271
80328
  ];
80329
+ new Map([
80330
+ {
80331
+ id: "device-connectivity",
80332
+ family: "device-events",
80333
+ label: "Device connectivity (offline / back online)",
80334
+ bad: ["device-offline"],
80335
+ recovery: ["device-online"],
80336
+ snapshotLabel: "Devices offline now",
80337
+ snapshotSection: "device-state"
80338
+ },
80339
+ {
80340
+ id: "device-switch",
80341
+ family: "device-events",
80342
+ label: "Device switched off / back on",
80343
+ bad: ["device-disabled"],
80344
+ recovery: ["device-enabled"],
80345
+ snapshotLabel: "Devices switched off now",
80346
+ snapshotSection: "device-state"
80347
+ },
80348
+ {
80349
+ id: "stream-connectivity",
80350
+ family: "device-events",
80351
+ label: "Stream connectivity (offline / back online)",
80352
+ bad: ["stream-offline"],
80353
+ recovery: ["stream-online"],
80354
+ snapshotLabel: "Streams offline now",
80355
+ snapshotSection: "streams"
80356
+ },
80357
+ {
80358
+ id: "battery",
80359
+ family: "device-events",
80360
+ label: "Battery (low / back to normal)",
80361
+ bad: ["device-battery-low"],
80362
+ recovery: ["device-battery-normal"],
80363
+ snapshotLabel: "Batteries low now",
80364
+ snapshotSection: "battery"
80365
+ },
80366
+ {
80367
+ id: "consumables",
80368
+ family: "device-events",
80369
+ label: "Consumables (low / replaced)",
80370
+ bad: ["device-consumable-low"],
80371
+ recovery: ["device-consumable-normal"],
80372
+ snapshotLabel: "Consumables low now",
80373
+ snapshotSection: "consumables"
80374
+ },
80375
+ {
80376
+ id: "tanks",
80377
+ family: "device-events",
80378
+ label: "Tanks (low or full / back to normal)",
80379
+ bad: ["device-tank-low", "device-tank-full"],
80380
+ recovery: ["device-tank-normal"],
80381
+ snapshotLabel: "Tanks low or full now",
80382
+ snapshotSection: "tanks"
80383
+ },
80384
+ {
80385
+ id: "motion-noise",
80386
+ family: "device-events",
80387
+ label: "Motion without a subject (constant / calm again)",
80388
+ bad: ["motion-noisy"],
80389
+ recovery: ["motion-calm"],
80390
+ snapshotLabel: "Cameras with constant motion now",
80391
+ snapshotSection: null
80392
+ },
80393
+ {
80394
+ id: "recording-health",
80395
+ family: "device-events",
80396
+ label: "Recording health (stalled or degraded / recording again)",
80397
+ bad: ["recording-stalled", "recording-degraded"],
80398
+ recovery: ["recording-healthy"],
80399
+ snapshotLabel: "Recordings stalled now",
80400
+ snapshotSection: null
80401
+ },
80402
+ {
80403
+ id: "device-attention",
80404
+ family: "device-events",
80405
+ label: "Device needs attention (raised / resolved)",
80406
+ bad: ["device-attention-required"],
80407
+ recovery: ["device-attention-resolved"],
80408
+ snapshotLabel: "Devices needing attention now",
80409
+ snapshotSection: null
80410
+ },
80411
+ {
80412
+ id: "node-connectivity",
80413
+ family: "system",
80414
+ label: "Node connectivity (offline / back online)",
80415
+ bad: ["node-offline"],
80416
+ recovery: ["node-online"],
80417
+ snapshotLabel: "Nodes offline now",
80418
+ snapshotSection: "nodes"
80419
+ },
80420
+ {
80421
+ id: "storage-space",
80422
+ family: "system",
80423
+ label: "Storage space (low or critical / ok again)",
80424
+ bad: ["storage-location-low", "storage-location-critical"],
80425
+ recovery: ["storage-location-ok"],
80426
+ snapshotLabel: "Storage locations low now",
80427
+ snapshotSection: null
80428
+ },
80429
+ {
80430
+ id: "critical-alerts",
80431
+ family: "system",
80432
+ label: "Critical alerts (raised / resolved)",
80433
+ bad: ["alert-critical"],
80434
+ recovery: ["alert-critical-resolved"],
80435
+ snapshotLabel: "Critical alerts open now",
80436
+ snapshotSection: null
80437
+ },
80438
+ {
80439
+ id: "rule-health",
80440
+ family: "system",
80441
+ label: "Rule health (broken / repaired)",
80442
+ bad: ["rule-broken"],
80443
+ recovery: ["rule-repaired"],
80444
+ snapshotLabel: "Notification rules broken now",
80445
+ snapshotSection: null
80446
+ }
80447
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
80272
80448
  new Set([
80273
80449
  "disarmed",
80274
80450
  "armed_home",
@@ -24,7 +24,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  enumerable: true
25
25
  }) : target, mod));
26
26
  //#endregion
27
- const require_dist = require("../dist-i6ntIgzS.js");
27
+ const require_dist = require("../dist-CfZUXrNa.js");
28
28
  let node_crypto = require("node:crypto");
29
29
  require("node:zlib");
30
30
  let node_fs = require("node:fs");
@@ -8455,7 +8455,6 @@ var HaExportAddon = class extends require_dist.BaseAddon {
8455
8455
  type: "boolean",
8456
8456
  key: `exportTo:${broker.id}`,
8457
8457
  label: broker.name,
8458
- description: `Push entities to this Home Assistant instance (${broker.id}).`,
8459
8458
  style: "switch",
8460
8459
  default: false
8461
8460
  }));
@@ -8464,7 +8463,7 @@ var HaExportAddon = class extends require_dist.BaseAddon {
8464
8463
  id: "ha-export-brokers",
8465
8464
  title: "Home Assistant instances",
8466
8465
  titleKey: "provider-homeassistant:globalSettings.s_ha-export-brokers.title",
8467
- description: brokerFields.length > 0 ? "One switch per Home Assistant broker. An instance that is off receives nothing; the devices exported to it are remembered and resume when it is turned back on." : "No Home Assistant broker is registered yet. Add one under External systems → Brokers and it will appear here.",
8466
+ description: brokerFields.length > 0 ? "An instance that is off receives nothing; its exported devices resume when it is turned back on." : "No Home Assistant broker is registered yet.",
8468
8467
  columns: 1,
8469
8468
  fields: brokerFields.length > 0 ? brokerFields : [{
8470
8469
  type: "info",
@@ -8485,7 +8484,7 @@ var HaExportAddon = class extends require_dist.BaseAddon {
8485
8484
  key: "publicBaseUrl",
8486
8485
  label: "Hub URL Home Assistant can reach",
8487
8486
  labelKey: "provider-homeassistant:globalSettings.s_ha-export-transport.publicBaseUrl.label",
8488
- description: "Used to build the signed image links Home Assistant fetches. Leave empty to derive one from the network capabilities; a link that cannot be built is never sent.",
8487
+ description: "Used for the signed image links Home Assistant fetches; leave empty to derive one automatically.",
8489
8488
  descriptionKey: "provider-homeassistant:globalSettings.s_ha-export-transport.publicBaseUrl.description",
8490
8489
  default: ""
8491
8490
  }]
@@ -8502,7 +8501,7 @@ var HaExportAddon = class extends require_dist.BaseAddon {
8502
8501
  key: "reconcileIntervalSec",
8503
8502
  label: "Reconcile interval (s)",
8504
8503
  labelKey: "provider-homeassistant:globalSettings.s_ha-export-advanced.reconcileIntervalSec.label",
8505
- description: "Full re-announce and re-push cadence. Bus events are telemetry and may be dropped; this is the contract.",
8504
+ description: "Full re-announce and re-push cadence.",
8506
8505
  descriptionKey: "provider-homeassistant:globalSettings.s_ha-export-advanced.reconcileIntervalSec.description",
8507
8506
  default: DEFAULT_CONFIG.reconcileIntervalSec
8508
8507
  }]
@@ -8526,7 +8525,6 @@ var HaExportAddon = class extends require_dist.BaseAddon {
8526
8525
  type: "boolean",
8527
8526
  key: `haExport:${deviceId}:${brokerId}`,
8528
8527
  label: `Export to ${this.brokerName(brokerId)}`,
8529
- description: "Entities for this device are pushed to that Home Assistant instance.",
8530
8528
  style: "switch",
8531
8529
  value: isExposed(this.config.membership, brokerId, idStr),
8532
8530
  immediate: true
@@ -8542,7 +8540,7 @@ var HaExportAddon = class extends require_dist.BaseAddon {
8542
8540
  id: "ha-export",
8543
8541
  title: "Home Assistant",
8544
8542
  titleKey: "provider-homeassistant:contribution.s_ha-export.title",
8545
- description: enabled.length > 0 ? "Each Home Assistant instance receives only the devices switched on for it." : "No Home Assistant instance is enabled for export. Turn one on in the Home Assistant Export addon settings.",
8543
+ description: enabled.length > 0 ? "Each instance receives only the devices switched on for it." : "No Home Assistant instance is enabled for export.",
8546
8544
  tab: "export",
8547
8545
  columns: 1,
8548
8546
  order: 30,
@@ -1,4 +1,4 @@
1
- import { $ as oauthIntegrationCapability, C as buildAddonRouteProvider, Et as nodePin, Ft as string, I as deviceExportCapability, a as COCO_TO_MACRO, bt as BaseAddon, c as FanDirectionSchema, i as CAMERA_SWITCH_ORDER, l as HvacModeSchema, o as CameraSwitchIdSchema, p as addonRoutesCapability, t as AlarmArmModeSchema, u as MediaPlayerRepeatSchema, zt as EventCategory } from "../dist-DULXoGnO.mjs";
1
+ import { $ as oauthIntegrationCapability, C as buildAddonRouteProvider, Et as nodePin, Ft as string, I as deviceExportCapability, a as COCO_TO_MACRO, bt as BaseAddon, c as FanDirectionSchema, i as CAMERA_SWITCH_ORDER, l as HvacModeSchema, o as CameraSwitchIdSchema, p as addonRoutesCapability, t as AlarmArmModeSchema, u as MediaPlayerRepeatSchema, zt as EventCategory } from "../dist-D6huwmAr.mjs";
2
2
  import { createHmac, timingSafeEqual } from "node:crypto";
3
3
  import "node:zlib";
4
4
  import "node:fs";
@@ -8427,7 +8427,6 @@ var HaExportAddon = class extends BaseAddon {
8427
8427
  type: "boolean",
8428
8428
  key: `exportTo:${broker.id}`,
8429
8429
  label: broker.name,
8430
- description: `Push entities to this Home Assistant instance (${broker.id}).`,
8431
8430
  style: "switch",
8432
8431
  default: false
8433
8432
  }));
@@ -8436,7 +8435,7 @@ var HaExportAddon = class extends BaseAddon {
8436
8435
  id: "ha-export-brokers",
8437
8436
  title: "Home Assistant instances",
8438
8437
  titleKey: "provider-homeassistant:globalSettings.s_ha-export-brokers.title",
8439
- description: brokerFields.length > 0 ? "One switch per Home Assistant broker. An instance that is off receives nothing; the devices exported to it are remembered and resume when it is turned back on." : "No Home Assistant broker is registered yet. Add one under External systems → Brokers and it will appear here.",
8438
+ description: brokerFields.length > 0 ? "An instance that is off receives nothing; its exported devices resume when it is turned back on." : "No Home Assistant broker is registered yet.",
8440
8439
  columns: 1,
8441
8440
  fields: brokerFields.length > 0 ? brokerFields : [{
8442
8441
  type: "info",
@@ -8457,7 +8456,7 @@ var HaExportAddon = class extends BaseAddon {
8457
8456
  key: "publicBaseUrl",
8458
8457
  label: "Hub URL Home Assistant can reach",
8459
8458
  labelKey: "provider-homeassistant:globalSettings.s_ha-export-transport.publicBaseUrl.label",
8460
- description: "Used to build the signed image links Home Assistant fetches. Leave empty to derive one from the network capabilities; a link that cannot be built is never sent.",
8459
+ description: "Used for the signed image links Home Assistant fetches; leave empty to derive one automatically.",
8461
8460
  descriptionKey: "provider-homeassistant:globalSettings.s_ha-export-transport.publicBaseUrl.description",
8462
8461
  default: ""
8463
8462
  }]
@@ -8474,7 +8473,7 @@ var HaExportAddon = class extends BaseAddon {
8474
8473
  key: "reconcileIntervalSec",
8475
8474
  label: "Reconcile interval (s)",
8476
8475
  labelKey: "provider-homeassistant:globalSettings.s_ha-export-advanced.reconcileIntervalSec.label",
8477
- description: "Full re-announce and re-push cadence. Bus events are telemetry and may be dropped; this is the contract.",
8476
+ description: "Full re-announce and re-push cadence.",
8478
8477
  descriptionKey: "provider-homeassistant:globalSettings.s_ha-export-advanced.reconcileIntervalSec.description",
8479
8478
  default: DEFAULT_CONFIG.reconcileIntervalSec
8480
8479
  }]
@@ -8498,7 +8497,6 @@ var HaExportAddon = class extends BaseAddon {
8498
8497
  type: "boolean",
8499
8498
  key: `haExport:${deviceId}:${brokerId}`,
8500
8499
  label: `Export to ${this.brokerName(brokerId)}`,
8501
- description: "Entities for this device are pushed to that Home Assistant instance.",
8502
8500
  style: "switch",
8503
8501
  value: isExposed(this.config.membership, brokerId, idStr),
8504
8502
  immediate: true
@@ -8514,7 +8512,7 @@ var HaExportAddon = class extends BaseAddon {
8514
8512
  id: "ha-export",
8515
8513
  title: "Home Assistant",
8516
8514
  titleKey: "provider-homeassistant:contribution.s_ha-export.title",
8517
- description: enabled.length > 0 ? "Each Home Assistant instance receives only the devices switched on for it." : "No Home Assistant instance is enabled for export. Turn one on in the Home Assistant Export addon settings.",
8515
+ description: enabled.length > 0 ? "Each instance receives only the devices switched on for it." : "No Home Assistant instance is enabled for export.",
8518
8516
  tab: "export",
8519
8517
  columns: 1,
8520
8518
  order: 30,
package/i18n/en.json CHANGED
@@ -1,10 +1,8 @@
1
1
  {
2
2
  "globalSettings.s_ha-calendars-import.title": "Calendars to import",
3
- "globalSettings.s_ha-calendars-import.description": "Pick which Home Assistant calendar entities feed System → Calendars. Nothing selected = no calendars imported.",
4
3
  "globalSettings.s_ha-calendars-import.calendarIds.label": "Calendars",
5
4
  "globalSettings.s_ha-calendars-import.calendarIds.description": "Discovered from connected HA brokers. Select at least one to import; leave empty to import none.",
6
5
  "globalSettings.s_ha-broker.title": "Home Assistant broker",
7
- "globalSettings.s_ha-broker.description": "Home Assistant brokers are managed in Connectivity → Brokers.",
8
6
  "globalSettings.s_ha-broker.brokerHelp.label": "Brokers are managed separately",
9
7
  "haBrokerSettings.s_ha-broker-credentials.title": "Home Assistant connection",
10
8
  "haBrokerSettings.s_ha-broker-credentials.authKind.label": "Auth mode",
@@ -17,14 +15,14 @@
17
15
  "globalSettings.s_ha-export-brokers.ha-export___no-brokers.label": "No brokers",
18
16
  "globalSettings.s_ha-export-transport.title": "Connection",
19
17
  "globalSettings.s_ha-export-transport.publicBaseUrl.label": "Hub URL Home Assistant can reach",
20
- "globalSettings.s_ha-export-transport.publicBaseUrl.description": "Used to build the signed image links Home Assistant fetches. Leave empty to derive one from the network capabilities; a link that cannot be built is never sent.",
18
+ "globalSettings.s_ha-export-transport.publicBaseUrl.description": "Used for the signed image links Home Assistant fetches; leave empty to derive one automatically.",
21
19
  "globalSettings.s_ha-export-advanced.title": "Advanced",
22
20
  "globalSettings.s_ha-export-advanced.reconcileIntervalSec.label": "Reconcile interval (s)",
23
- "globalSettings.s_ha-export-advanced.reconcileIntervalSec.description": "Full re-announce and re-push cadence. Bus events are telemetry and may be dropped; this is the contract.",
21
+ "globalSettings.s_ha-export-advanced.reconcileIntervalSec.description": "Full re-announce and re-push cadence.",
24
22
  "contribution.s_ha-export.title": "Home Assistant",
25
23
  "haConfig.s_connection.title": "Home Assistant notify",
26
24
  "haConfig.s_connection.service.label": "Notify service",
27
- "haConfig.s_connection.service.description": "The Home Assistant notify service to call — the part after `notify.` (e.g. `mobile_app_pixel_7`). Use Discover to list available services.",
25
+ "haConfig.s_connection.service.description": "The part after `notify.` (e.g. `mobile_app_pixel_7`); use Discover to list them.",
28
26
  "haConfig.s_connection.brokerId.label": "Broker",
29
- "haConfig.s_connection.brokerId.description": "Optional — the Home Assistant broker id to route through. Leave blank to use the only configured broker."
27
+ "haConfig.s_connection.brokerId.description": "Optional; blank uses the only configured broker."
30
28
  }
package/i18n/it.json CHANGED
@@ -1,10 +1,8 @@
1
1
  {
2
2
  "globalSettings.s_ha-calendars-import.title": "Calendari da importare",
3
- "globalSettings.s_ha-calendars-import.description": "Scegli quali entità calendario di Home Assistant alimentano Sistema → Calendari. Nessuna selezione = nessun calendario importato.",
4
3
  "globalSettings.s_ha-calendars-import.calendarIds.label": "Calendari",
5
4
  "globalSettings.s_ha-calendars-import.calendarIds.description": "Rilevati dai broker HA collegati. Seleziona almeno un calendario da importare; lascia vuoto per non importarne nessuno.",
6
5
  "globalSettings.s_ha-broker.title": "Broker Home Assistant",
7
- "globalSettings.s_ha-broker.description": "I broker Home Assistant si gestiscono in Connettività → Broker.",
8
6
  "globalSettings.s_ha-broker.brokerHelp.label": "I broker si gestiscono separatamente",
9
7
  "haBrokerSettings.s_ha-broker-credentials.title": "Connessione a Home Assistant",
10
8
  "haBrokerSettings.s_ha-broker-credentials.authKind.label": "Modalità di autenticazione",
@@ -17,14 +15,14 @@
17
15
  "globalSettings.s_ha-export-brokers.ha-export___no-brokers.label": "Nessun broker",
18
16
  "globalSettings.s_ha-export-transport.title": "Connessione",
19
17
  "globalSettings.s_ha-export-transport.publicBaseUrl.label": "URL dell'hub raggiungibile da Home Assistant",
20
- "globalSettings.s_ha-export-transport.publicBaseUrl.description": "Serve a costruire i link firmati alle immagini che Home Assistant scarica. Lascia vuoto per ricavarlo dalle capacità di rete; un link che non si può costruire non viene mai inviato.",
18
+ "globalSettings.s_ha-export-transport.publicBaseUrl.description": "Usato per i link firmati delle immagini che Home Assistant scarica; lascia vuoto per ricavarlo automaticamente.",
21
19
  "globalSettings.s_ha-export-advanced.title": "Avanzate",
22
20
  "globalSettings.s_ha-export-advanced.reconcileIntervalSec.label": "Intervallo di riconciliazione (s)",
23
- "globalSettings.s_ha-export-advanced.reconcileIntervalSec.description": "Frequenza di ripubblicazione completa e di nuovo invio. Gli eventi del bus sono telemetria e possono andare persi: questo è il contratto.",
21
+ "globalSettings.s_ha-export-advanced.reconcileIntervalSec.description": "Cadenza di ri-annuncio e ri-invio completo.",
24
22
  "contribution.s_ha-export.title": "Home Assistant",
25
23
  "haConfig.s_connection.title": "Notifica Home Assistant",
26
24
  "haConfig.s_connection.service.label": "Servizio di notifica",
27
- "haConfig.s_connection.service.description": "Il servizio di notifica di Home Assistant da chiamare: la parte dopo `notify.` (ad es. `mobile_app_pixel_7`). Usa Rileva per elencare i servizi disponibili.",
25
+ "haConfig.s_connection.service.description": "La parte dopo `notify.` (es. `mobile_app_pixel_7`); usa Discover per elencarli.",
28
26
  "haConfig.s_connection.brokerId.label": "Broker",
29
- "haConfig.s_connection.brokerId.description": "Facoltativo: l'id del broker Home Assistant da cui passare. Lascia vuoto per usare l'unico broker configurato."
27
+ "haConfig.s_connection.brokerId.description": "Facoltativo; se vuoto usa l'unico broker configurato."
30
28
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homeassistant",
3
- "version": "1.2.615",
3
+ "version": "1.2.617",
4
4
  "description": "Home Assistant device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",