@camstack/addon-provider-mqtt-ha 0.1.6 → 0.1.7

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.
Files changed (3) hide show
  1. package/dist/addon.js +264 -44
  2. package/dist/addon.mjs +264 -44
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -33,7 +33,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
33
33
  }) : target, mod));
34
34
  var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
35
  //#endregion
36
- //#region ../types/dist/event-category-BvOFi6PY.mjs
36
+ //#region ../types/dist/event-category-DOl51-Ij.mjs
37
37
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
38
38
  EventCategory["SystemBoot"] = "system.boot";
39
39
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -112,9 +112,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
112
112
  /**
113
113
  * The node's one-shot runner boot check (D877): planned runners against the
114
114
  * process service, `degraded` when any is failed, refused or missing. The
115
- * alert centre turns it into one alert and a direct critical push.
115
+ * alert centre turns it into one critical alert.
116
116
  */
117
117
  EventCategory["SystemRunnerCheck"] = "system.runner-check";
118
+ /**
119
+ * An alert EPISODE opened or closed, emitted by the alert centre for alerts
120
+ * of severity `critical` or `error` (`AlertEpisodePayload`). The alert
121
+ * centre sends no notification of its own: Notification Center turns this
122
+ * into the `alert-critical` / `alert-error` / `alert-critical-resolved`
123
+ * system-event kinds, and reconciles from the alerts store because a bus
124
+ * event may be dropped (D8, D11).
125
+ */
126
+ EventCategory["AlertEpisode"] = "alert.episode";
118
127
  EventCategory["AddonError"] = "addon.error";
119
128
  EventCategory["AddonPageReady"] = "addon.page-ready";
120
129
  EventCategory["AddonWidgetReady"] = "addon.widget-ready";
@@ -5439,7 +5448,7 @@ var ZodIssueCode = {
5439
5448
  var ZodFirstPartyTypeKind;
5440
5449
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5441
5450
  //#endregion
5442
- //#region ../types/dist/sleep-BegKjwUu.mjs
5451
+ //#region ../types/dist/sleep-BxjU_fJM.mjs
5443
5452
  /**
5444
5453
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5445
5454
  * window to float samples (D455).
@@ -13202,7 +13211,14 @@ var AlertSeveritySchema = _enum([
13202
13211
  ]);
13203
13212
  var AlertActionSchema = object({
13204
13213
  label: string(),
13205
- href: string().optional()
13214
+ href: string().optional(),
13215
+ /**
13216
+ * How `href` is followed. Absent / `app`: an admin-ui route (client-side).
13217
+ * `server`: a route the HUB serves (an addon HTTP route such as an OAuth
13218
+ * start) — the browser must leave the SPA with a full navigation, because
13219
+ * the SPA has no such route and would bounce to the home page.
13220
+ */
13221
+ navigation: _enum(["app", "server"]).optional()
13206
13222
  });
13207
13223
  var AlertStatusSchema = _enum([
13208
13224
  "active",
@@ -41935,6 +41951,9 @@ var NcSystemEventKindSchema = _enum([
41935
41951
  "server-updated",
41936
41952
  "export-completed",
41937
41953
  "backup-completed",
41954
+ "alert-critical",
41955
+ "alert-error",
41956
+ "alert-critical-resolved",
41938
41957
  "camera-online",
41939
41958
  "camera-offline",
41940
41959
  "camera-disabled",
@@ -51011,7 +51030,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
51011
51030
  }), method(object({ jobId: string().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
51012
51031
  kind: "mutation",
51013
51032
  auth: "admin"
51014
- }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51033
+ }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({ locationIds: array(string()).readonly() }), object({
51034
+ clear: boolean(),
51035
+ repointLocationId: string().optional()
51036
+ }), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51015
51037
  kind: "mutation",
51016
51038
  auth: "admin"
51017
51039
  }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
@@ -55267,6 +55289,11 @@ onStatusChanged: { data: object({
55267
55289
  *
55268
55290
  * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
55269
55291
  * provider refreshes the slice on an interval and eagerly after commands.
55292
+ *
55293
+ * UNKNOWN IS NOT OFF. Every field the appliance reports separately is
55294
+ * nullable: `null` means "not known right now" (the appliance has not said,
55295
+ * the link is down, or the description does not carry it) and is never
55296
+ * rendered or exported as `false` / `0`. `availability` says why.
55270
55297
  */
55271
55298
  var DishwasherStateSchema = _enum([
55272
55299
  "idle",
@@ -55276,43 +55303,155 @@ var DishwasherStateSchema = _enum([
55276
55303
  "error",
55277
55304
  "unavailable"
55278
55305
  ]);
55306
+ /**
55307
+ * The appliance's own operation state, uncollapsed. `state` above is the coarse
55308
+ * view for compact surfaces; this is what the appliance said.
55309
+ */
55310
+ var DishwasherOperationStateSchema = _enum([
55311
+ "Inactive",
55312
+ "Ready",
55313
+ "DelayedStart",
55314
+ "Run",
55315
+ "Pause",
55316
+ "ActionRequired",
55317
+ "Finished",
55318
+ "Error",
55319
+ "Aborting"
55320
+ ]);
55321
+ /**
55322
+ * Why fields may be `null`:
55323
+ * - `available` — the link is up and the description is loaded;
55324
+ * - `offline` — the local link is down (values are unknown, not last-known);
55325
+ * - `description-missing` — the link is up but the appliance's description could not
55326
+ * be loaded, so its values cannot be decoded.
55327
+ */
55328
+ var DishwasherAvailabilitySchema = _enum([
55329
+ "available",
55330
+ "offline",
55331
+ "description-missing"
55332
+ ]);
55279
55333
  var DishwasherConsumableLevelSchema = _enum([
55280
55334
  "ok",
55281
55335
  "low",
55282
55336
  "empty"
55283
55337
  ]);
55284
55338
  var DishwasherStatusSchema = object({
55339
+ availability: DishwasherAvailabilitySchema,
55340
+ /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
55285
55341
  state: DishwasherStateSchema,
55286
- /** Active program id/name, or null when none selected / unknown. */
55342
+ /** The appliance's operation state as reported; null when not known. */
55343
+ operationState: DishwasherOperationStateSchema.nullable(),
55344
+ /** Feature key of the ACTIVE (running) program, or null when none runs / not known. */
55287
55345
  program: string().nullable(),
55288
- /** Program tokens the hardware accepts — drives the UI selector. */
55346
+ /** Feature key of the SELECTED program (what Start would run), or null when none / not known. */
55347
+ selectedProgram: string().nullable(),
55348
+ /** Feature keys of the programs the appliance currently offers — drives the UI selector. */
55289
55349
  availablePrograms: array(string()),
55290
- /** Minutes remaining on the active cycle, or null when not running. */
55291
- remainingMinutes: number().int().nonnegative().nullable(),
55350
+ /** Seconds remaining on the active cycle, or null when not running / not known. */
55351
+ remainingSeconds: number().int().nonnegative().nullable(),
55352
+ /** Seconds the delayed start is set to (time until the cycle starts), or null. */
55353
+ delayedStartSeconds: number().int().nonnegative().nullable(),
55292
55354
  /** Cycle completion 0..100, or null when not applicable. */
55293
55355
  progressPercent: number().min(0).max(100).nullable(),
55294
- /** True when the door is reported open. */
55295
- doorOpen: boolean(),
55296
- /** True when remote start is allowed (door closed, power on, etc.). */
55297
- remoteStartAllowed: boolean(),
55298
- /** Main power / switched-on state. */
55299
- powerOn: boolean(),
55356
+ /** True when the door is reported open; null when the door state is not known. */
55357
+ doorOpen: boolean().nullable(),
55358
+ /** True when the door is latched (locked) during a cycle; null when not reported. */
55359
+ doorLocked: boolean().nullable(),
55360
+ /** True when remote start is allowed (door closed, power on, etc.); null when not known. */
55361
+ remoteStartAllowed: boolean().nullable(),
55362
+ /** True when the appliance accepts remote control now; null when not known. */
55363
+ remoteControlActive: boolean().nullable(),
55364
+ /** True while somebody operates the appliance at its panel; null when not reported. */
55365
+ localControlActive: boolean().nullable(),
55366
+ /** Main power / switched-on state; null when not known. */
55367
+ powerOn: boolean().nullable(),
55368
+ /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55369
+ powerState: string().nullable(),
55300
55370
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55301
55371
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55302
- halfLoad: boolean(),
55303
- hygienePlus: boolean(),
55372
+ /** Option states: null when the appliance does not expose the option or has not said. */
55373
+ halfLoad: boolean().nullable(),
55374
+ hygienePlus: boolean().nullable(),
55304
55375
  /** Extra dry option when the appliance exposes it. */
55305
- extraDry: boolean(),
55376
+ extraDry: boolean().nullable(),
55306
55377
  /** Intensive zone (lower basket) when the appliance exposes it. */
55307
- intensiveZone: boolean(),
55378
+ intensiveZone: boolean().nullable(),
55308
55379
  /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
55309
- varioSpeedPlus: boolean(),
55310
- /** Child lock (controls disabled on the appliance). */
55311
- childLock: boolean(),
55380
+ varioSpeedPlus: boolean().nullable(),
55381
+ /** Child lock (controls disabled on the appliance); null when not known. */
55382
+ childLock: boolean().nullable(),
55383
+ /** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
55384
+ activeEvents: array(string()),
55385
+ /** Numeric error code when the appliance reports one; null otherwise. */
55312
55386
  errorCode: number().nullable(),
55387
+ /** Name of the raised alert-level event while the appliance is in error; null otherwise. */
55313
55388
  errorLabel: string().nullable(),
55389
+ /** Ms epoch of the last value received from the appliance; 0 = never. */
55314
55390
  lastFetchedAt: number()
55315
55391
  });
55392
+ var DeviceIdSchema = number().int().nonnegative();
55393
+ /** A value a program option or setting can take. */
55394
+ var DishwasherValueSchema = union([
55395
+ boolean(),
55396
+ string(),
55397
+ number()
55398
+ ]);
55399
+ var DishwasherAccessSchema = _enum([
55400
+ "none",
55401
+ "read",
55402
+ "readWrite",
55403
+ "writeOnly",
55404
+ "readStatic"
55405
+ ]);
55406
+ /**
55407
+ * One option or setting the appliance declares, with the constraints its description
55408
+ * gives. A `readWrite` descriptor that is `available` is what `setOption` accepts.
55409
+ */
55410
+ var DishwasherOptionDescriptorSchema = object({
55411
+ /** Feature key (`Dishcare.Dishwasher.Option.ExtraDry`). */
55412
+ key: string(),
55413
+ /** Last segment of the key, for display. */
55414
+ name: string(),
55415
+ type: _enum([
55416
+ "boolean",
55417
+ "number",
55418
+ "enum",
55419
+ "string"
55420
+ ]),
55421
+ access: DishwasherAccessSchema,
55422
+ /** The appliance reports this entity as currently available. */
55423
+ available: boolean(),
55424
+ /** Unit the description declares for a number; null when it declares none. */
55425
+ unit: string().nullable(),
55426
+ min: number().nullable(),
55427
+ max: number().nullable(),
55428
+ step: number().nullable(),
55429
+ /** Allowed members of an enum; null for other types. */
55430
+ enumValues: array(string()).nullable(),
55431
+ defaultValue: DishwasherValueSchema.nullable()
55432
+ });
55433
+ var DishwasherProgramSchema = object({
55434
+ /** Feature key (`Dishcare.Dishwasher.Program.Eco50`) — what `setProgram` / `start` take. */
55435
+ key: string(),
55436
+ name: string(),
55437
+ /** The appliance currently offers this program. */
55438
+ available: boolean(),
55439
+ /** The options this program lists, with the program-level access / availability / default. */
55440
+ options: array(DishwasherOptionDescriptorSchema)
55441
+ });
55442
+ var DishwasherOptionsSchema = object({
55443
+ availability: DishwasherAvailabilitySchema,
55444
+ /** What the appliance can be told to do, from the commands its description declares. */
55445
+ supportsStart: boolean(),
55446
+ supportsPause: boolean(),
55447
+ supportsResume: boolean(),
55448
+ supportsStop: boolean(),
55449
+ supportsPower: boolean(),
55450
+ /** Every program the description lists, with its options. */
55451
+ programs: array(DishwasherProgramSchema),
55452
+ /** Every option and setting entity the description lists (programs reference these by key). */
55453
+ options: array(DishwasherOptionDescriptorSchema)
55454
+ });
55316
55455
  var dishwasherCapability = {
55317
55456
  name: "dishwasher",
55318
55457
  scope: "device",
@@ -55320,86 +55459,102 @@ var dishwasherCapability = {
55320
55459
  mode: "singleton",
55321
55460
  deviceTypes: [DeviceType.Dishwasher],
55322
55461
  methods: {
55323
- start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55462
+ /**
55463
+ * Start a program. Without `program` the selected one starts. `options` are
55464
+ * option feature keys; each is checked against the program's constraints.
55465
+ */
55466
+ start: method(object({
55467
+ deviceId: DeviceIdSchema,
55468
+ program: string().min(1).optional(),
55469
+ options: record(string(), DishwasherValueSchema).optional()
55470
+ }), _void(), {
55324
55471
  kind: "mutation",
55325
55472
  auth: "protected"
55326
55473
  }),
55327
- pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55474
+ pause: method(object({ deviceId: DeviceIdSchema }), _void(), {
55328
55475
  kind: "mutation",
55329
55476
  auth: "protected"
55330
55477
  }),
55331
- stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55478
+ resume: method(object({ deviceId: DeviceIdSchema }), _void(), {
55479
+ kind: "mutation",
55480
+ auth: "protected"
55481
+ }),
55482
+ stop: method(object({ deviceId: DeviceIdSchema }), _void(), {
55332
55483
  kind: "mutation",
55333
55484
  auth: "protected"
55334
55485
  }),
55486
+ /** Select (not start) a program; refused when the appliance does not offer it. */
55335
55487
  setProgram: method(object({
55336
- deviceId: number().int().nonnegative(),
55488
+ deviceId: DeviceIdSchema,
55337
55489
  program: string().min(1)
55338
55490
  }), _void(), {
55339
55491
  kind: "mutation",
55340
55492
  auth: "protected"
55341
55493
  }),
55342
55494
  setPower: method(object({
55343
- deviceId: number().int().nonnegative(),
55495
+ deviceId: DeviceIdSchema,
55344
55496
  on: boolean()
55345
55497
  }), _void(), {
55346
55498
  kind: "mutation",
55347
55499
  auth: "protected"
55348
55500
  }),
55349
55501
  setHalfLoad: method(object({
55350
- deviceId: number().int().nonnegative(),
55502
+ deviceId: DeviceIdSchema,
55351
55503
  on: boolean()
55352
55504
  }), _void(), {
55353
55505
  kind: "mutation",
55354
55506
  auth: "protected"
55355
55507
  }),
55356
55508
  setHygienePlus: method(object({
55357
- deviceId: number().int().nonnegative(),
55509
+ deviceId: DeviceIdSchema,
55358
55510
  on: boolean()
55359
55511
  }), _void(), {
55360
55512
  kind: "mutation",
55361
55513
  auth: "protected"
55362
55514
  }),
55363
55515
  setExtraDry: method(object({
55364
- deviceId: number().int().nonnegative(),
55516
+ deviceId: DeviceIdSchema,
55365
55517
  on: boolean()
55366
55518
  }), _void(), {
55367
55519
  kind: "mutation",
55368
55520
  auth: "protected"
55369
55521
  }),
55370
55522
  setIntensiveZone: method(object({
55371
- deviceId: number().int().nonnegative(),
55523
+ deviceId: DeviceIdSchema,
55372
55524
  on: boolean()
55373
55525
  }), _void(), {
55374
55526
  kind: "mutation",
55375
55527
  auth: "protected"
55376
55528
  }),
55377
55529
  setVarioSpeedPlus: method(object({
55378
- deviceId: number().int().nonnegative(),
55530
+ deviceId: DeviceIdSchema,
55379
55531
  on: boolean()
55380
55532
  }), _void(), {
55381
55533
  kind: "mutation",
55382
55534
  auth: "protected"
55383
55535
  }),
55384
55536
  setChildLock: method(object({
55385
- deviceId: number().int().nonnegative(),
55537
+ deviceId: DeviceIdSchema,
55386
55538
  on: boolean()
55387
55539
  }), _void(), {
55388
55540
  kind: "mutation",
55389
55541
  auth: "protected"
55390
55542
  }),
55543
+ /**
55544
+ * Write any option or setting by feature key. Refused when the description does
55545
+ * not list it, it is not writable or not available now, or the value is outside
55546
+ * its declared range / members.
55547
+ */
55391
55548
  setOption: method(object({
55392
- deviceId: number().int().nonnegative(),
55549
+ deviceId: DeviceIdSchema,
55393
55550
  key: string().min(1),
55394
- value: union([
55395
- boolean(),
55396
- string(),
55397
- number()
55398
- ])
55551
+ value: DishwasherValueSchema
55399
55552
  }), _void(), {
55400
55553
  kind: "mutation",
55401
55554
  auth: "protected"
55402
- })
55555
+ }),
55556
+ /** What this appliance can do, from its own description — the UI is derived from it. */
55557
+ getOptions: method(object({ deviceId: DeviceIdSchema }), DishwasherOptionsSchema, { auth: "protected" })
55403
55558
  },
55404
55559
  status: {
55405
55560
  schema: DishwasherStatusSchema,
@@ -69348,6 +69503,12 @@ Object.freeze({
69348
69503
  addonId: null,
69349
69504
  access: "view"
69350
69505
  },
69506
+ "dishwasher.getOptions": {
69507
+ capName: "dishwasher",
69508
+ capScope: "device",
69509
+ addonId: null,
69510
+ access: "view"
69511
+ },
69351
69512
  "dishwasher.getStatus": {
69352
69513
  capName: "dishwasher",
69353
69514
  capScope: "device",
@@ -69360,6 +69521,12 @@ Object.freeze({
69360
69521
  addonId: null,
69361
69522
  access: "create"
69362
69523
  },
69524
+ "dishwasher.resume": {
69525
+ capName: "dishwasher",
69526
+ capScope: "device",
69527
+ addonId: null,
69528
+ access: "create"
69529
+ },
69363
69530
  "dishwasher.setChildLock": {
69364
69531
  capName: "dishwasher",
69365
69532
  capScope: "device",
@@ -73860,6 +74027,12 @@ Object.freeze({
73860
74027
  addonId: null,
73861
74028
  access: "view"
73862
74029
  },
74030
+ "storageMigration.moverClearance": {
74031
+ capName: "storage-migration",
74032
+ capScope: "system",
74033
+ addonId: null,
74034
+ access: "view"
74035
+ },
73863
74036
  "storageMigration.movers": {
73864
74037
  capName: "storage-migration",
73865
74038
  capScope: "system",
@@ -76053,6 +76226,11 @@ Object.freeze({
76053
76226
  form: "single",
76054
76227
  optional: false
76055
76228
  }],
76229
+ "dishwasher.getOptions": [{
76230
+ name: "deviceId",
76231
+ form: "single",
76232
+ optional: false
76233
+ }],
76056
76234
  "dishwasher.getStatus": [{
76057
76235
  name: "deviceId",
76058
76236
  form: "single",
@@ -76063,6 +76241,11 @@ Object.freeze({
76063
76241
  form: "single",
76064
76242
  optional: false
76065
76243
  }],
76244
+ "dishwasher.resume": [{
76245
+ name: "deviceId",
76246
+ form: "single",
76247
+ optional: false
76248
+ }],
76066
76249
  "dishwasher.setChildLock": [{
76067
76250
  name: "deviceId",
76068
76251
  form: "single",
@@ -78149,6 +78332,9 @@ new Map(Object.entries({
78149
78332
  "wrapper-update-available": "system",
78150
78333
  "backup-completed": "system",
78151
78334
  "export-completed": "system",
78335
+ "alert-critical": "system",
78336
+ "alert-error": "system",
78337
+ "alert-critical-resolved": "system",
78152
78338
  "storage-location-low": "system",
78153
78339
  "storage-location-critical": "system",
78154
78340
  "storage-location-ok": "system",
@@ -78273,6 +78459,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78273
78459
  "storage-location-ok"
78274
78460
  ]
78275
78461
  },
78462
+ {
78463
+ id: "alerts",
78464
+ family: "system",
78465
+ label: "Alerts",
78466
+ kinds: [
78467
+ "alert-critical",
78468
+ "alert-error",
78469
+ "alert-critical-resolved"
78470
+ ]
78471
+ },
78276
78472
  {
78277
78473
  id: "alarm",
78278
78474
  family: "alarm",
@@ -78317,6 +78513,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
78317
78513
  return [[descriptor.kind, field]];
78318
78514
  })));
78319
78515
  Object.freeze(Object.keys(NC_SENSOR_RAISED_FIELD_BY_KIND));
78516
+ object({
78517
+ phase: _enum(["raised", "resolved"]),
78518
+ episodeId: string().min(1),
78519
+ alertId: string().min(1),
78520
+ severity: AlertSeveritySchema,
78521
+ category: string(),
78522
+ title: string(),
78523
+ message: string(),
78524
+ sourceType: string().optional(),
78525
+ sourceId: string().optional(),
78526
+ nodeId: string().optional(),
78527
+ /** The alert's own action link (where the operator acts on it), when it has one. */
78528
+ actionUrl: string().optional(),
78529
+ at: number()
78530
+ });
78320
78531
  var RULE_BODY_ONLY = ["body"];
78321
78532
  var RULE_TEXT = ["title", "body"];
78322
78533
  var BATTERY = ["device-battery-low", "device-battery-normal"];
@@ -78326,6 +78537,11 @@ var TANK = [
78326
78537
  "device-tank-full",
78327
78538
  "device-tank-normal"
78328
78539
  ];
78540
+ var ALERT_EPISODE = [
78541
+ "alert-critical",
78542
+ "alert-error",
78543
+ "alert-critical-resolved"
78544
+ ];
78329
78545
  var UPDATES = [
78330
78546
  "addon-update-available",
78331
78547
  "server-update-available",
@@ -78518,14 +78734,14 @@ var STATE_SUMMARY_VARS = [
78518
78734
  ([...RULE_TEXT], [...CONSUMABLE]),
78519
78735
  ([...RULE_TEXT], [...TANK]),
78520
78736
  [...RULE_TEXT],
78521
- ([...RULE_TEXT], [...UPDATES]),
78522
- ([...RULE_TEXT], [...UPDATES]),
78523
- [...RULE_TEXT],
78737
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
78738
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
78524
78739
  [...RULE_TEXT],
78525
78740
  [...RULE_TEXT],
78526
78741
  [...RULE_TEXT],
78527
78742
  [...RULE_TEXT],
78528
78743
  [...RULE_TEXT],
78744
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78529
78745
  [...RULE_TEXT],
78530
78746
  [...RULE_TEXT],
78531
78747
  [...RULE_TEXT],
@@ -78543,7 +78759,11 @@ var STATE_SUMMARY_VARS = [
78543
78759
  [...RULE_TEXT],
78544
78760
  [...RULE_TEXT],
78545
78761
  [...RULE_TEXT],
78546
- [...RULE_TEXT],
78762
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78763
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78764
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78765
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78766
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78547
78767
  [...RULE_TEXT],
78548
78768
  [...RULE_TEXT],
78549
78769
  [...RULE_TEXT],
package/dist/addon.mjs CHANGED
@@ -34,7 +34,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
34
34
  var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
35
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
36
36
  //#endregion
37
- //#region ../types/dist/event-category-BvOFi6PY.mjs
37
+ //#region ../types/dist/event-category-DOl51-Ij.mjs
38
38
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
39
39
  EventCategory["SystemBoot"] = "system.boot";
40
40
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -113,9 +113,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
113
113
  /**
114
114
  * The node's one-shot runner boot check (D877): planned runners against the
115
115
  * process service, `degraded` when any is failed, refused or missing. The
116
- * alert centre turns it into one alert and a direct critical push.
116
+ * alert centre turns it into one critical alert.
117
117
  */
118
118
  EventCategory["SystemRunnerCheck"] = "system.runner-check";
119
+ /**
120
+ * An alert EPISODE opened or closed, emitted by the alert centre for alerts
121
+ * of severity `critical` or `error` (`AlertEpisodePayload`). The alert
122
+ * centre sends no notification of its own: Notification Center turns this
123
+ * into the `alert-critical` / `alert-error` / `alert-critical-resolved`
124
+ * system-event kinds, and reconciles from the alerts store because a bus
125
+ * event may be dropped (D8, D11).
126
+ */
127
+ EventCategory["AlertEpisode"] = "alert.episode";
119
128
  EventCategory["AddonError"] = "addon.error";
120
129
  EventCategory["AddonPageReady"] = "addon.page-ready";
121
130
  EventCategory["AddonWidgetReady"] = "addon.widget-ready";
@@ -5440,7 +5449,7 @@ var ZodIssueCode = {
5440
5449
  var ZodFirstPartyTypeKind;
5441
5450
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5442
5451
  //#endregion
5443
- //#region ../types/dist/sleep-BegKjwUu.mjs
5452
+ //#region ../types/dist/sleep-BxjU_fJM.mjs
5444
5453
  /**
5445
5454
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5446
5455
  * window to float samples (D455).
@@ -13203,7 +13212,14 @@ var AlertSeveritySchema = _enum([
13203
13212
  ]);
13204
13213
  var AlertActionSchema = object({
13205
13214
  label: string(),
13206
- href: string().optional()
13215
+ href: string().optional(),
13216
+ /**
13217
+ * How `href` is followed. Absent / `app`: an admin-ui route (client-side).
13218
+ * `server`: a route the HUB serves (an addon HTTP route such as an OAuth
13219
+ * start) — the browser must leave the SPA with a full navigation, because
13220
+ * the SPA has no such route and would bounce to the home page.
13221
+ */
13222
+ navigation: _enum(["app", "server"]).optional()
13207
13223
  });
13208
13224
  var AlertStatusSchema = _enum([
13209
13225
  "active",
@@ -41936,6 +41952,9 @@ var NcSystemEventKindSchema = _enum([
41936
41952
  "server-updated",
41937
41953
  "export-completed",
41938
41954
  "backup-completed",
41955
+ "alert-critical",
41956
+ "alert-error",
41957
+ "alert-critical-resolved",
41939
41958
  "camera-online",
41940
41959
  "camera-offline",
41941
41960
  "camera-disabled",
@@ -51012,7 +51031,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
51012
51031
  }), method(object({ jobId: string().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
51013
51032
  kind: "mutation",
51014
51033
  auth: "admin"
51015
- }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51034
+ }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({ locationIds: array(string()).readonly() }), object({
51035
+ clear: boolean(),
51036
+ repointLocationId: string().optional()
51037
+ }), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51016
51038
  kind: "mutation",
51017
51039
  auth: "admin"
51018
51040
  }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
@@ -55268,6 +55290,11 @@ onStatusChanged: { data: object({
55268
55290
  *
55269
55291
  * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
55270
55292
  * provider refreshes the slice on an interval and eagerly after commands.
55293
+ *
55294
+ * UNKNOWN IS NOT OFF. Every field the appliance reports separately is
55295
+ * nullable: `null` means "not known right now" (the appliance has not said,
55296
+ * the link is down, or the description does not carry it) and is never
55297
+ * rendered or exported as `false` / `0`. `availability` says why.
55271
55298
  */
55272
55299
  var DishwasherStateSchema = _enum([
55273
55300
  "idle",
@@ -55277,43 +55304,155 @@ var DishwasherStateSchema = _enum([
55277
55304
  "error",
55278
55305
  "unavailable"
55279
55306
  ]);
55307
+ /**
55308
+ * The appliance's own operation state, uncollapsed. `state` above is the coarse
55309
+ * view for compact surfaces; this is what the appliance said.
55310
+ */
55311
+ var DishwasherOperationStateSchema = _enum([
55312
+ "Inactive",
55313
+ "Ready",
55314
+ "DelayedStart",
55315
+ "Run",
55316
+ "Pause",
55317
+ "ActionRequired",
55318
+ "Finished",
55319
+ "Error",
55320
+ "Aborting"
55321
+ ]);
55322
+ /**
55323
+ * Why fields may be `null`:
55324
+ * - `available` — the link is up and the description is loaded;
55325
+ * - `offline` — the local link is down (values are unknown, not last-known);
55326
+ * - `description-missing` — the link is up but the appliance's description could not
55327
+ * be loaded, so its values cannot be decoded.
55328
+ */
55329
+ var DishwasherAvailabilitySchema = _enum([
55330
+ "available",
55331
+ "offline",
55332
+ "description-missing"
55333
+ ]);
55280
55334
  var DishwasherConsumableLevelSchema = _enum([
55281
55335
  "ok",
55282
55336
  "low",
55283
55337
  "empty"
55284
55338
  ]);
55285
55339
  var DishwasherStatusSchema = object({
55340
+ availability: DishwasherAvailabilitySchema,
55341
+ /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
55286
55342
  state: DishwasherStateSchema,
55287
- /** Active program id/name, or null when none selected / unknown. */
55343
+ /** The appliance's operation state as reported; null when not known. */
55344
+ operationState: DishwasherOperationStateSchema.nullable(),
55345
+ /** Feature key of the ACTIVE (running) program, or null when none runs / not known. */
55288
55346
  program: string().nullable(),
55289
- /** Program tokens the hardware accepts — drives the UI selector. */
55347
+ /** Feature key of the SELECTED program (what Start would run), or null when none / not known. */
55348
+ selectedProgram: string().nullable(),
55349
+ /** Feature keys of the programs the appliance currently offers — drives the UI selector. */
55290
55350
  availablePrograms: array(string()),
55291
- /** Minutes remaining on the active cycle, or null when not running. */
55292
- remainingMinutes: number().int().nonnegative().nullable(),
55351
+ /** Seconds remaining on the active cycle, or null when not running / not known. */
55352
+ remainingSeconds: number().int().nonnegative().nullable(),
55353
+ /** Seconds the delayed start is set to (time until the cycle starts), or null. */
55354
+ delayedStartSeconds: number().int().nonnegative().nullable(),
55293
55355
  /** Cycle completion 0..100, or null when not applicable. */
55294
55356
  progressPercent: number().min(0).max(100).nullable(),
55295
- /** True when the door is reported open. */
55296
- doorOpen: boolean(),
55297
- /** True when remote start is allowed (door closed, power on, etc.). */
55298
- remoteStartAllowed: boolean(),
55299
- /** Main power / switched-on state. */
55300
- powerOn: boolean(),
55357
+ /** True when the door is reported open; null when the door state is not known. */
55358
+ doorOpen: boolean().nullable(),
55359
+ /** True when the door is latched (locked) during a cycle; null when not reported. */
55360
+ doorLocked: boolean().nullable(),
55361
+ /** True when remote start is allowed (door closed, power on, etc.); null when not known. */
55362
+ remoteStartAllowed: boolean().nullable(),
55363
+ /** True when the appliance accepts remote control now; null when not known. */
55364
+ remoteControlActive: boolean().nullable(),
55365
+ /** True while somebody operates the appliance at its panel; null when not reported. */
55366
+ localControlActive: boolean().nullable(),
55367
+ /** Main power / switched-on state; null when not known. */
55368
+ powerOn: boolean().nullable(),
55369
+ /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55370
+ powerState: string().nullable(),
55301
55371
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55302
55372
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55303
- halfLoad: boolean(),
55304
- hygienePlus: boolean(),
55373
+ /** Option states: null when the appliance does not expose the option or has not said. */
55374
+ halfLoad: boolean().nullable(),
55375
+ hygienePlus: boolean().nullable(),
55305
55376
  /** Extra dry option when the appliance exposes it. */
55306
- extraDry: boolean(),
55377
+ extraDry: boolean().nullable(),
55307
55378
  /** Intensive zone (lower basket) when the appliance exposes it. */
55308
- intensiveZone: boolean(),
55379
+ intensiveZone: boolean().nullable(),
55309
55380
  /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
55310
- varioSpeedPlus: boolean(),
55311
- /** Child lock (controls disabled on the appliance). */
55312
- childLock: boolean(),
55381
+ varioSpeedPlus: boolean().nullable(),
55382
+ /** Child lock (controls disabled on the appliance); null when not known. */
55383
+ childLock: boolean().nullable(),
55384
+ /** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
55385
+ activeEvents: array(string()),
55386
+ /** Numeric error code when the appliance reports one; null otherwise. */
55313
55387
  errorCode: number().nullable(),
55388
+ /** Name of the raised alert-level event while the appliance is in error; null otherwise. */
55314
55389
  errorLabel: string().nullable(),
55390
+ /** Ms epoch of the last value received from the appliance; 0 = never. */
55315
55391
  lastFetchedAt: number()
55316
55392
  });
55393
+ var DeviceIdSchema = number().int().nonnegative();
55394
+ /** A value a program option or setting can take. */
55395
+ var DishwasherValueSchema = union([
55396
+ boolean(),
55397
+ string(),
55398
+ number()
55399
+ ]);
55400
+ var DishwasherAccessSchema = _enum([
55401
+ "none",
55402
+ "read",
55403
+ "readWrite",
55404
+ "writeOnly",
55405
+ "readStatic"
55406
+ ]);
55407
+ /**
55408
+ * One option or setting the appliance declares, with the constraints its description
55409
+ * gives. A `readWrite` descriptor that is `available` is what `setOption` accepts.
55410
+ */
55411
+ var DishwasherOptionDescriptorSchema = object({
55412
+ /** Feature key (`Dishcare.Dishwasher.Option.ExtraDry`). */
55413
+ key: string(),
55414
+ /** Last segment of the key, for display. */
55415
+ name: string(),
55416
+ type: _enum([
55417
+ "boolean",
55418
+ "number",
55419
+ "enum",
55420
+ "string"
55421
+ ]),
55422
+ access: DishwasherAccessSchema,
55423
+ /** The appliance reports this entity as currently available. */
55424
+ available: boolean(),
55425
+ /** Unit the description declares for a number; null when it declares none. */
55426
+ unit: string().nullable(),
55427
+ min: number().nullable(),
55428
+ max: number().nullable(),
55429
+ step: number().nullable(),
55430
+ /** Allowed members of an enum; null for other types. */
55431
+ enumValues: array(string()).nullable(),
55432
+ defaultValue: DishwasherValueSchema.nullable()
55433
+ });
55434
+ var DishwasherProgramSchema = object({
55435
+ /** Feature key (`Dishcare.Dishwasher.Program.Eco50`) — what `setProgram` / `start` take. */
55436
+ key: string(),
55437
+ name: string(),
55438
+ /** The appliance currently offers this program. */
55439
+ available: boolean(),
55440
+ /** The options this program lists, with the program-level access / availability / default. */
55441
+ options: array(DishwasherOptionDescriptorSchema)
55442
+ });
55443
+ var DishwasherOptionsSchema = object({
55444
+ availability: DishwasherAvailabilitySchema,
55445
+ /** What the appliance can be told to do, from the commands its description declares. */
55446
+ supportsStart: boolean(),
55447
+ supportsPause: boolean(),
55448
+ supportsResume: boolean(),
55449
+ supportsStop: boolean(),
55450
+ supportsPower: boolean(),
55451
+ /** Every program the description lists, with its options. */
55452
+ programs: array(DishwasherProgramSchema),
55453
+ /** Every option and setting entity the description lists (programs reference these by key). */
55454
+ options: array(DishwasherOptionDescriptorSchema)
55455
+ });
55317
55456
  var dishwasherCapability = {
55318
55457
  name: "dishwasher",
55319
55458
  scope: "device",
@@ -55321,86 +55460,102 @@ var dishwasherCapability = {
55321
55460
  mode: "singleton",
55322
55461
  deviceTypes: [DeviceType.Dishwasher],
55323
55462
  methods: {
55324
- start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55463
+ /**
55464
+ * Start a program. Without `program` the selected one starts. `options` are
55465
+ * option feature keys; each is checked against the program's constraints.
55466
+ */
55467
+ start: method(object({
55468
+ deviceId: DeviceIdSchema,
55469
+ program: string().min(1).optional(),
55470
+ options: record(string(), DishwasherValueSchema).optional()
55471
+ }), _void(), {
55325
55472
  kind: "mutation",
55326
55473
  auth: "protected"
55327
55474
  }),
55328
- pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55475
+ pause: method(object({ deviceId: DeviceIdSchema }), _void(), {
55329
55476
  kind: "mutation",
55330
55477
  auth: "protected"
55331
55478
  }),
55332
- stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55479
+ resume: method(object({ deviceId: DeviceIdSchema }), _void(), {
55480
+ kind: "mutation",
55481
+ auth: "protected"
55482
+ }),
55483
+ stop: method(object({ deviceId: DeviceIdSchema }), _void(), {
55333
55484
  kind: "mutation",
55334
55485
  auth: "protected"
55335
55486
  }),
55487
+ /** Select (not start) a program; refused when the appliance does not offer it. */
55336
55488
  setProgram: method(object({
55337
- deviceId: number().int().nonnegative(),
55489
+ deviceId: DeviceIdSchema,
55338
55490
  program: string().min(1)
55339
55491
  }), _void(), {
55340
55492
  kind: "mutation",
55341
55493
  auth: "protected"
55342
55494
  }),
55343
55495
  setPower: method(object({
55344
- deviceId: number().int().nonnegative(),
55496
+ deviceId: DeviceIdSchema,
55345
55497
  on: boolean()
55346
55498
  }), _void(), {
55347
55499
  kind: "mutation",
55348
55500
  auth: "protected"
55349
55501
  }),
55350
55502
  setHalfLoad: method(object({
55351
- deviceId: number().int().nonnegative(),
55503
+ deviceId: DeviceIdSchema,
55352
55504
  on: boolean()
55353
55505
  }), _void(), {
55354
55506
  kind: "mutation",
55355
55507
  auth: "protected"
55356
55508
  }),
55357
55509
  setHygienePlus: method(object({
55358
- deviceId: number().int().nonnegative(),
55510
+ deviceId: DeviceIdSchema,
55359
55511
  on: boolean()
55360
55512
  }), _void(), {
55361
55513
  kind: "mutation",
55362
55514
  auth: "protected"
55363
55515
  }),
55364
55516
  setExtraDry: method(object({
55365
- deviceId: number().int().nonnegative(),
55517
+ deviceId: DeviceIdSchema,
55366
55518
  on: boolean()
55367
55519
  }), _void(), {
55368
55520
  kind: "mutation",
55369
55521
  auth: "protected"
55370
55522
  }),
55371
55523
  setIntensiveZone: method(object({
55372
- deviceId: number().int().nonnegative(),
55524
+ deviceId: DeviceIdSchema,
55373
55525
  on: boolean()
55374
55526
  }), _void(), {
55375
55527
  kind: "mutation",
55376
55528
  auth: "protected"
55377
55529
  }),
55378
55530
  setVarioSpeedPlus: method(object({
55379
- deviceId: number().int().nonnegative(),
55531
+ deviceId: DeviceIdSchema,
55380
55532
  on: boolean()
55381
55533
  }), _void(), {
55382
55534
  kind: "mutation",
55383
55535
  auth: "protected"
55384
55536
  }),
55385
55537
  setChildLock: method(object({
55386
- deviceId: number().int().nonnegative(),
55538
+ deviceId: DeviceIdSchema,
55387
55539
  on: boolean()
55388
55540
  }), _void(), {
55389
55541
  kind: "mutation",
55390
55542
  auth: "protected"
55391
55543
  }),
55544
+ /**
55545
+ * Write any option or setting by feature key. Refused when the description does
55546
+ * not list it, it is not writable or not available now, or the value is outside
55547
+ * its declared range / members.
55548
+ */
55392
55549
  setOption: method(object({
55393
- deviceId: number().int().nonnegative(),
55550
+ deviceId: DeviceIdSchema,
55394
55551
  key: string().min(1),
55395
- value: union([
55396
- boolean(),
55397
- string(),
55398
- number()
55399
- ])
55552
+ value: DishwasherValueSchema
55400
55553
  }), _void(), {
55401
55554
  kind: "mutation",
55402
55555
  auth: "protected"
55403
- })
55556
+ }),
55557
+ /** What this appliance can do, from its own description — the UI is derived from it. */
55558
+ getOptions: method(object({ deviceId: DeviceIdSchema }), DishwasherOptionsSchema, { auth: "protected" })
55404
55559
  },
55405
55560
  status: {
55406
55561
  schema: DishwasherStatusSchema,
@@ -69349,6 +69504,12 @@ Object.freeze({
69349
69504
  addonId: null,
69350
69505
  access: "view"
69351
69506
  },
69507
+ "dishwasher.getOptions": {
69508
+ capName: "dishwasher",
69509
+ capScope: "device",
69510
+ addonId: null,
69511
+ access: "view"
69512
+ },
69352
69513
  "dishwasher.getStatus": {
69353
69514
  capName: "dishwasher",
69354
69515
  capScope: "device",
@@ -69361,6 +69522,12 @@ Object.freeze({
69361
69522
  addonId: null,
69362
69523
  access: "create"
69363
69524
  },
69525
+ "dishwasher.resume": {
69526
+ capName: "dishwasher",
69527
+ capScope: "device",
69528
+ addonId: null,
69529
+ access: "create"
69530
+ },
69364
69531
  "dishwasher.setChildLock": {
69365
69532
  capName: "dishwasher",
69366
69533
  capScope: "device",
@@ -73861,6 +74028,12 @@ Object.freeze({
73861
74028
  addonId: null,
73862
74029
  access: "view"
73863
74030
  },
74031
+ "storageMigration.moverClearance": {
74032
+ capName: "storage-migration",
74033
+ capScope: "system",
74034
+ addonId: null,
74035
+ access: "view"
74036
+ },
73864
74037
  "storageMigration.movers": {
73865
74038
  capName: "storage-migration",
73866
74039
  capScope: "system",
@@ -76054,6 +76227,11 @@ Object.freeze({
76054
76227
  form: "single",
76055
76228
  optional: false
76056
76229
  }],
76230
+ "dishwasher.getOptions": [{
76231
+ name: "deviceId",
76232
+ form: "single",
76233
+ optional: false
76234
+ }],
76057
76235
  "dishwasher.getStatus": [{
76058
76236
  name: "deviceId",
76059
76237
  form: "single",
@@ -76064,6 +76242,11 @@ Object.freeze({
76064
76242
  form: "single",
76065
76243
  optional: false
76066
76244
  }],
76245
+ "dishwasher.resume": [{
76246
+ name: "deviceId",
76247
+ form: "single",
76248
+ optional: false
76249
+ }],
76067
76250
  "dishwasher.setChildLock": [{
76068
76251
  name: "deviceId",
76069
76252
  form: "single",
@@ -78150,6 +78333,9 @@ new Map(Object.entries({
78150
78333
  "wrapper-update-available": "system",
78151
78334
  "backup-completed": "system",
78152
78335
  "export-completed": "system",
78336
+ "alert-critical": "system",
78337
+ "alert-error": "system",
78338
+ "alert-critical-resolved": "system",
78153
78339
  "storage-location-low": "system",
78154
78340
  "storage-location-critical": "system",
78155
78341
  "storage-location-ok": "system",
@@ -78274,6 +78460,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78274
78460
  "storage-location-ok"
78275
78461
  ]
78276
78462
  },
78463
+ {
78464
+ id: "alerts",
78465
+ family: "system",
78466
+ label: "Alerts",
78467
+ kinds: [
78468
+ "alert-critical",
78469
+ "alert-error",
78470
+ "alert-critical-resolved"
78471
+ ]
78472
+ },
78277
78473
  {
78278
78474
  id: "alarm",
78279
78475
  family: "alarm",
@@ -78318,6 +78514,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
78318
78514
  return [[descriptor.kind, field]];
78319
78515
  })));
78320
78516
  Object.freeze(Object.keys(NC_SENSOR_RAISED_FIELD_BY_KIND));
78517
+ object({
78518
+ phase: _enum(["raised", "resolved"]),
78519
+ episodeId: string().min(1),
78520
+ alertId: string().min(1),
78521
+ severity: AlertSeveritySchema,
78522
+ category: string(),
78523
+ title: string(),
78524
+ message: string(),
78525
+ sourceType: string().optional(),
78526
+ sourceId: string().optional(),
78527
+ nodeId: string().optional(),
78528
+ /** The alert's own action link (where the operator acts on it), when it has one. */
78529
+ actionUrl: string().optional(),
78530
+ at: number()
78531
+ });
78321
78532
  var RULE_BODY_ONLY = ["body"];
78322
78533
  var RULE_TEXT = ["title", "body"];
78323
78534
  var BATTERY = ["device-battery-low", "device-battery-normal"];
@@ -78327,6 +78538,11 @@ var TANK = [
78327
78538
  "device-tank-full",
78328
78539
  "device-tank-normal"
78329
78540
  ];
78541
+ var ALERT_EPISODE = [
78542
+ "alert-critical",
78543
+ "alert-error",
78544
+ "alert-critical-resolved"
78545
+ ];
78330
78546
  var UPDATES = [
78331
78547
  "addon-update-available",
78332
78548
  "server-update-available",
@@ -78519,14 +78735,14 @@ var STATE_SUMMARY_VARS = [
78519
78735
  ([...RULE_TEXT], [...CONSUMABLE]),
78520
78736
  ([...RULE_TEXT], [...TANK]),
78521
78737
  [...RULE_TEXT],
78522
- ([...RULE_TEXT], [...UPDATES]),
78523
- ([...RULE_TEXT], [...UPDATES]),
78524
- [...RULE_TEXT],
78738
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
78739
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
78525
78740
  [...RULE_TEXT],
78526
78741
  [...RULE_TEXT],
78527
78742
  [...RULE_TEXT],
78528
78743
  [...RULE_TEXT],
78529
78744
  [...RULE_TEXT],
78745
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78530
78746
  [...RULE_TEXT],
78531
78747
  [...RULE_TEXT],
78532
78748
  [...RULE_TEXT],
@@ -78544,7 +78760,11 @@ var STATE_SUMMARY_VARS = [
78544
78760
  [...RULE_TEXT],
78545
78761
  [...RULE_TEXT],
78546
78762
  [...RULE_TEXT],
78547
- [...RULE_TEXT],
78763
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78764
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78765
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78766
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78767
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78548
78768
  [...RULE_TEXT],
78549
78769
  [...RULE_TEXT],
78550
78770
  [...RULE_TEXT],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-mqtt-ha",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Home Assistant MQTT discovery import provider for CamStack — adopts entities published on homeassistant/+/+/config",
5
5
  "keywords": [
6
6
  "camstack",