@camstack/addon-provider-ecowitt 0.2.128 → 0.2.129

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
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  let http = require("http");
3
3
  let events = require("events");
4
4
  let dgram = require("dgram");
5
- //#region ../types/dist/event-category-BvOFi6PY.mjs
5
+ //#region ../types/dist/event-category-DOl51-Ij.mjs
6
6
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
7
7
  EventCategory["SystemBoot"] = "system.boot";
8
8
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -81,9 +81,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
81
81
  /**
82
82
  * The node's one-shot runner boot check (D877): planned runners against the
83
83
  * process service, `degraded` when any is failed, refused or missing. The
84
- * alert centre turns it into one alert and a direct critical push.
84
+ * alert centre turns it into one critical alert.
85
85
  */
86
86
  EventCategory["SystemRunnerCheck"] = "system.runner-check";
87
+ /**
88
+ * An alert EPISODE opened or closed, emitted by the alert centre for alerts
89
+ * of severity `critical` or `error` (`AlertEpisodePayload`). The alert
90
+ * centre sends no notification of its own: Notification Center turns this
91
+ * into the `alert-critical` / `alert-error` / `alert-critical-resolved`
92
+ * system-event kinds, and reconciles from the alerts store because a bus
93
+ * event may be dropped (D8, D11).
94
+ */
95
+ EventCategory["AlertEpisode"] = "alert.episode";
87
96
  EventCategory["AddonError"] = "addon.error";
88
97
  EventCategory["AddonPageReady"] = "addon.page-ready";
89
98
  EventCategory["AddonWidgetReady"] = "addon.widget-ready";
@@ -5408,7 +5417,7 @@ var ZodIssueCode$1 = {
5408
5417
  var ZodFirstPartyTypeKind$1;
5409
5418
  ZodFirstPartyTypeKind$1 || (ZodFirstPartyTypeKind$1 = {});
5410
5419
  //#endregion
5411
- //#region ../types/dist/sleep-BegKjwUu.mjs
5420
+ //#region ../types/dist/sleep-BxjU_fJM.mjs
5412
5421
  /**
5413
5422
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5414
5423
  * window to float samples (D455).
@@ -13185,7 +13194,14 @@ var AlertSeveritySchema = _enum([
13185
13194
  ]);
13186
13195
  var AlertActionSchema = object({
13187
13196
  label: string(),
13188
- href: string().optional()
13197
+ href: string().optional(),
13198
+ /**
13199
+ * How `href` is followed. Absent / `app`: an admin-ui route (client-side).
13200
+ * `server`: a route the HUB serves (an addon HTTP route such as an OAuth
13201
+ * start) — the browser must leave the SPA with a full navigation, because
13202
+ * the SPA has no such route and would bounce to the home page.
13203
+ */
13204
+ navigation: _enum(["app", "server"]).optional()
13189
13205
  });
13190
13206
  var AlertStatusSchema = _enum([
13191
13207
  "active",
@@ -42014,6 +42030,9 @@ var NcSystemEventKindSchema = _enum([
42014
42030
  "server-updated",
42015
42031
  "export-completed",
42016
42032
  "backup-completed",
42033
+ "alert-critical",
42034
+ "alert-error",
42035
+ "alert-critical-resolved",
42017
42036
  "camera-online",
42018
42037
  "camera-offline",
42019
42038
  "camera-disabled",
@@ -51090,7 +51109,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
51090
51109
  }), method(object({ jobId: string().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
51091
51110
  kind: "mutation",
51092
51111
  auth: "admin"
51093
- }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51112
+ }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({ locationIds: array(string()).readonly() }), object({
51113
+ clear: boolean(),
51114
+ repointLocationId: string().optional()
51115
+ }), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51094
51116
  kind: "mutation",
51095
51117
  auth: "admin"
51096
51118
  }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
@@ -55346,6 +55368,11 @@ onStatusChanged: { data: object({
55346
55368
  *
55347
55369
  * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
55348
55370
  * provider refreshes the slice on an interval and eagerly after commands.
55371
+ *
55372
+ * UNKNOWN IS NOT OFF. Every field the appliance reports separately is
55373
+ * nullable: `null` means "not known right now" (the appliance has not said,
55374
+ * the link is down, or the description does not carry it) and is never
55375
+ * rendered or exported as `false` / `0`. `availability` says why.
55349
55376
  */
55350
55377
  var DishwasherStateSchema = _enum([
55351
55378
  "idle",
@@ -55355,43 +55382,155 @@ var DishwasherStateSchema = _enum([
55355
55382
  "error",
55356
55383
  "unavailable"
55357
55384
  ]);
55385
+ /**
55386
+ * The appliance's own operation state, uncollapsed. `state` above is the coarse
55387
+ * view for compact surfaces; this is what the appliance said.
55388
+ */
55389
+ var DishwasherOperationStateSchema = _enum([
55390
+ "Inactive",
55391
+ "Ready",
55392
+ "DelayedStart",
55393
+ "Run",
55394
+ "Pause",
55395
+ "ActionRequired",
55396
+ "Finished",
55397
+ "Error",
55398
+ "Aborting"
55399
+ ]);
55400
+ /**
55401
+ * Why fields may be `null`:
55402
+ * - `available` — the link is up and the description is loaded;
55403
+ * - `offline` — the local link is down (values are unknown, not last-known);
55404
+ * - `description-missing` — the link is up but the appliance's description could not
55405
+ * be loaded, so its values cannot be decoded.
55406
+ */
55407
+ var DishwasherAvailabilitySchema = _enum([
55408
+ "available",
55409
+ "offline",
55410
+ "description-missing"
55411
+ ]);
55358
55412
  var DishwasherConsumableLevelSchema = _enum([
55359
55413
  "ok",
55360
55414
  "low",
55361
55415
  "empty"
55362
55416
  ]);
55363
55417
  var DishwasherStatusSchema = object({
55418
+ availability: DishwasherAvailabilitySchema,
55419
+ /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
55364
55420
  state: DishwasherStateSchema,
55365
- /** Active program id/name, or null when none selected / unknown. */
55421
+ /** The appliance's operation state as reported; null when not known. */
55422
+ operationState: DishwasherOperationStateSchema.nullable(),
55423
+ /** Feature key of the ACTIVE (running) program, or null when none runs / not known. */
55366
55424
  program: string().nullable(),
55367
- /** Program tokens the hardware accepts — drives the UI selector. */
55425
+ /** Feature key of the SELECTED program (what Start would run), or null when none / not known. */
55426
+ selectedProgram: string().nullable(),
55427
+ /** Feature keys of the programs the appliance currently offers — drives the UI selector. */
55368
55428
  availablePrograms: array(string()),
55369
- /** Minutes remaining on the active cycle, or null when not running. */
55370
- remainingMinutes: number().int().nonnegative().nullable(),
55429
+ /** Seconds remaining on the active cycle, or null when not running / not known. */
55430
+ remainingSeconds: number().int().nonnegative().nullable(),
55431
+ /** Seconds the delayed start is set to (time until the cycle starts), or null. */
55432
+ delayedStartSeconds: number().int().nonnegative().nullable(),
55371
55433
  /** Cycle completion 0..100, or null when not applicable. */
55372
55434
  progressPercent: number().min(0).max(100).nullable(),
55373
- /** True when the door is reported open. */
55374
- doorOpen: boolean(),
55375
- /** True when remote start is allowed (door closed, power on, etc.). */
55376
- remoteStartAllowed: boolean(),
55377
- /** Main power / switched-on state. */
55378
- powerOn: boolean(),
55435
+ /** True when the door is reported open; null when the door state is not known. */
55436
+ doorOpen: boolean().nullable(),
55437
+ /** True when the door is latched (locked) during a cycle; null when not reported. */
55438
+ doorLocked: boolean().nullable(),
55439
+ /** True when remote start is allowed (door closed, power on, etc.); null when not known. */
55440
+ remoteStartAllowed: boolean().nullable(),
55441
+ /** True when the appliance accepts remote control now; null when not known. */
55442
+ remoteControlActive: boolean().nullable(),
55443
+ /** True while somebody operates the appliance at its panel; null when not reported. */
55444
+ localControlActive: boolean().nullable(),
55445
+ /** Main power / switched-on state; null when not known. */
55446
+ powerOn: boolean().nullable(),
55447
+ /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55448
+ powerState: string().nullable(),
55379
55449
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55380
55450
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55381
- halfLoad: boolean(),
55382
- hygienePlus: boolean(),
55451
+ /** Option states: null when the appliance does not expose the option or has not said. */
55452
+ halfLoad: boolean().nullable(),
55453
+ hygienePlus: boolean().nullable(),
55383
55454
  /** Extra dry option when the appliance exposes it. */
55384
- extraDry: boolean(),
55455
+ extraDry: boolean().nullable(),
55385
55456
  /** Intensive zone (lower basket) when the appliance exposes it. */
55386
- intensiveZone: boolean(),
55457
+ intensiveZone: boolean().nullable(),
55387
55458
  /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
55388
- varioSpeedPlus: boolean(),
55389
- /** Child lock (controls disabled on the appliance). */
55390
- childLock: boolean(),
55459
+ varioSpeedPlus: boolean().nullable(),
55460
+ /** Child lock (controls disabled on the appliance); null when not known. */
55461
+ childLock: boolean().nullable(),
55462
+ /** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
55463
+ activeEvents: array(string()),
55464
+ /** Numeric error code when the appliance reports one; null otherwise. */
55391
55465
  errorCode: number().nullable(),
55466
+ /** Name of the raised alert-level event while the appliance is in error; null otherwise. */
55392
55467
  errorLabel: string().nullable(),
55468
+ /** Ms epoch of the last value received from the appliance; 0 = never. */
55393
55469
  lastFetchedAt: number()
55394
55470
  });
55471
+ var DeviceIdSchema = number().int().nonnegative();
55472
+ /** A value a program option or setting can take. */
55473
+ var DishwasherValueSchema = union([
55474
+ boolean(),
55475
+ string(),
55476
+ number()
55477
+ ]);
55478
+ var DishwasherAccessSchema = _enum([
55479
+ "none",
55480
+ "read",
55481
+ "readWrite",
55482
+ "writeOnly",
55483
+ "readStatic"
55484
+ ]);
55485
+ /**
55486
+ * One option or setting the appliance declares, with the constraints its description
55487
+ * gives. A `readWrite` descriptor that is `available` is what `setOption` accepts.
55488
+ */
55489
+ var DishwasherOptionDescriptorSchema = object({
55490
+ /** Feature key (`Dishcare.Dishwasher.Option.ExtraDry`). */
55491
+ key: string(),
55492
+ /** Last segment of the key, for display. */
55493
+ name: string(),
55494
+ type: _enum([
55495
+ "boolean",
55496
+ "number",
55497
+ "enum",
55498
+ "string"
55499
+ ]),
55500
+ access: DishwasherAccessSchema,
55501
+ /** The appliance reports this entity as currently available. */
55502
+ available: boolean(),
55503
+ /** Unit the description declares for a number; null when it declares none. */
55504
+ unit: string().nullable(),
55505
+ min: number().nullable(),
55506
+ max: number().nullable(),
55507
+ step: number().nullable(),
55508
+ /** Allowed members of an enum; null for other types. */
55509
+ enumValues: array(string()).nullable(),
55510
+ defaultValue: DishwasherValueSchema.nullable()
55511
+ });
55512
+ var DishwasherProgramSchema = object({
55513
+ /** Feature key (`Dishcare.Dishwasher.Program.Eco50`) — what `setProgram` / `start` take. */
55514
+ key: string(),
55515
+ name: string(),
55516
+ /** The appliance currently offers this program. */
55517
+ available: boolean(),
55518
+ /** The options this program lists, with the program-level access / availability / default. */
55519
+ options: array(DishwasherOptionDescriptorSchema)
55520
+ });
55521
+ var DishwasherOptionsSchema = object({
55522
+ availability: DishwasherAvailabilitySchema,
55523
+ /** What the appliance can be told to do, from the commands its description declares. */
55524
+ supportsStart: boolean(),
55525
+ supportsPause: boolean(),
55526
+ supportsResume: boolean(),
55527
+ supportsStop: boolean(),
55528
+ supportsPower: boolean(),
55529
+ /** Every program the description lists, with its options. */
55530
+ programs: array(DishwasherProgramSchema),
55531
+ /** Every option and setting entity the description lists (programs reference these by key). */
55532
+ options: array(DishwasherOptionDescriptorSchema)
55533
+ });
55395
55534
  var dishwasherCapability = {
55396
55535
  name: "dishwasher",
55397
55536
  scope: "device",
@@ -55399,86 +55538,102 @@ var dishwasherCapability = {
55399
55538
  mode: "singleton",
55400
55539
  deviceTypes: [DeviceType.Dishwasher],
55401
55540
  methods: {
55402
- start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55541
+ /**
55542
+ * Start a program. Without `program` the selected one starts. `options` are
55543
+ * option feature keys; each is checked against the program's constraints.
55544
+ */
55545
+ start: method(object({
55546
+ deviceId: DeviceIdSchema,
55547
+ program: string().min(1).optional(),
55548
+ options: record(string(), DishwasherValueSchema).optional()
55549
+ }), _void(), {
55403
55550
  kind: "mutation",
55404
55551
  auth: "protected"
55405
55552
  }),
55406
- pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55553
+ pause: method(object({ deviceId: DeviceIdSchema }), _void(), {
55407
55554
  kind: "mutation",
55408
55555
  auth: "protected"
55409
55556
  }),
55410
- stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55557
+ resume: method(object({ deviceId: DeviceIdSchema }), _void(), {
55558
+ kind: "mutation",
55559
+ auth: "protected"
55560
+ }),
55561
+ stop: method(object({ deviceId: DeviceIdSchema }), _void(), {
55411
55562
  kind: "mutation",
55412
55563
  auth: "protected"
55413
55564
  }),
55565
+ /** Select (not start) a program; refused when the appliance does not offer it. */
55414
55566
  setProgram: method(object({
55415
- deviceId: number().int().nonnegative(),
55567
+ deviceId: DeviceIdSchema,
55416
55568
  program: string().min(1)
55417
55569
  }), _void(), {
55418
55570
  kind: "mutation",
55419
55571
  auth: "protected"
55420
55572
  }),
55421
55573
  setPower: method(object({
55422
- deviceId: number().int().nonnegative(),
55574
+ deviceId: DeviceIdSchema,
55423
55575
  on: boolean()
55424
55576
  }), _void(), {
55425
55577
  kind: "mutation",
55426
55578
  auth: "protected"
55427
55579
  }),
55428
55580
  setHalfLoad: method(object({
55429
- deviceId: number().int().nonnegative(),
55581
+ deviceId: DeviceIdSchema,
55430
55582
  on: boolean()
55431
55583
  }), _void(), {
55432
55584
  kind: "mutation",
55433
55585
  auth: "protected"
55434
55586
  }),
55435
55587
  setHygienePlus: method(object({
55436
- deviceId: number().int().nonnegative(),
55588
+ deviceId: DeviceIdSchema,
55437
55589
  on: boolean()
55438
55590
  }), _void(), {
55439
55591
  kind: "mutation",
55440
55592
  auth: "protected"
55441
55593
  }),
55442
55594
  setExtraDry: method(object({
55443
- deviceId: number().int().nonnegative(),
55595
+ deviceId: DeviceIdSchema,
55444
55596
  on: boolean()
55445
55597
  }), _void(), {
55446
55598
  kind: "mutation",
55447
55599
  auth: "protected"
55448
55600
  }),
55449
55601
  setIntensiveZone: method(object({
55450
- deviceId: number().int().nonnegative(),
55602
+ deviceId: DeviceIdSchema,
55451
55603
  on: boolean()
55452
55604
  }), _void(), {
55453
55605
  kind: "mutation",
55454
55606
  auth: "protected"
55455
55607
  }),
55456
55608
  setVarioSpeedPlus: method(object({
55457
- deviceId: number().int().nonnegative(),
55609
+ deviceId: DeviceIdSchema,
55458
55610
  on: boolean()
55459
55611
  }), _void(), {
55460
55612
  kind: "mutation",
55461
55613
  auth: "protected"
55462
55614
  }),
55463
55615
  setChildLock: method(object({
55464
- deviceId: number().int().nonnegative(),
55616
+ deviceId: DeviceIdSchema,
55465
55617
  on: boolean()
55466
55618
  }), _void(), {
55467
55619
  kind: "mutation",
55468
55620
  auth: "protected"
55469
55621
  }),
55622
+ /**
55623
+ * Write any option or setting by feature key. Refused when the description does
55624
+ * not list it, it is not writable or not available now, or the value is outside
55625
+ * its declared range / members.
55626
+ */
55470
55627
  setOption: method(object({
55471
- deviceId: number().int().nonnegative(),
55628
+ deviceId: DeviceIdSchema,
55472
55629
  key: string().min(1),
55473
- value: union([
55474
- boolean(),
55475
- string(),
55476
- number()
55477
- ])
55630
+ value: DishwasherValueSchema
55478
55631
  }), _void(), {
55479
55632
  kind: "mutation",
55480
55633
  auth: "protected"
55481
- })
55634
+ }),
55635
+ /** What this appliance can do, from its own description — the UI is derived from it. */
55636
+ getOptions: method(object({ deviceId: DeviceIdSchema }), DishwasherOptionsSchema, { auth: "protected" })
55482
55637
  },
55483
55638
  status: {
55484
55639
  schema: DishwasherStatusSchema,
@@ -69427,6 +69582,12 @@ Object.freeze({
69427
69582
  addonId: null,
69428
69583
  access: "view"
69429
69584
  },
69585
+ "dishwasher.getOptions": {
69586
+ capName: "dishwasher",
69587
+ capScope: "device",
69588
+ addonId: null,
69589
+ access: "view"
69590
+ },
69430
69591
  "dishwasher.getStatus": {
69431
69592
  capName: "dishwasher",
69432
69593
  capScope: "device",
@@ -69439,6 +69600,12 @@ Object.freeze({
69439
69600
  addonId: null,
69440
69601
  access: "create"
69441
69602
  },
69603
+ "dishwasher.resume": {
69604
+ capName: "dishwasher",
69605
+ capScope: "device",
69606
+ addonId: null,
69607
+ access: "create"
69608
+ },
69442
69609
  "dishwasher.setChildLock": {
69443
69610
  capName: "dishwasher",
69444
69611
  capScope: "device",
@@ -73939,6 +74106,12 @@ Object.freeze({
73939
74106
  addonId: null,
73940
74107
  access: "view"
73941
74108
  },
74109
+ "storageMigration.moverClearance": {
74110
+ capName: "storage-migration",
74111
+ capScope: "system",
74112
+ addonId: null,
74113
+ access: "view"
74114
+ },
73942
74115
  "storageMigration.movers": {
73943
74116
  capName: "storage-migration",
73944
74117
  capScope: "system",
@@ -76132,6 +76305,11 @@ Object.freeze({
76132
76305
  form: "single",
76133
76306
  optional: false
76134
76307
  }],
76308
+ "dishwasher.getOptions": [{
76309
+ name: "deviceId",
76310
+ form: "single",
76311
+ optional: false
76312
+ }],
76135
76313
  "dishwasher.getStatus": [{
76136
76314
  name: "deviceId",
76137
76315
  form: "single",
@@ -76142,6 +76320,11 @@ Object.freeze({
76142
76320
  form: "single",
76143
76321
  optional: false
76144
76322
  }],
76323
+ "dishwasher.resume": [{
76324
+ name: "deviceId",
76325
+ form: "single",
76326
+ optional: false
76327
+ }],
76145
76328
  "dishwasher.setChildLock": [{
76146
76329
  name: "deviceId",
76147
76330
  form: "single",
@@ -78228,6 +78411,9 @@ new Map(Object.entries({
78228
78411
  "wrapper-update-available": "system",
78229
78412
  "backup-completed": "system",
78230
78413
  "export-completed": "system",
78414
+ "alert-critical": "system",
78415
+ "alert-error": "system",
78416
+ "alert-critical-resolved": "system",
78231
78417
  "storage-location-low": "system",
78232
78418
  "storage-location-critical": "system",
78233
78419
  "storage-location-ok": "system",
@@ -78352,6 +78538,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78352
78538
  "storage-location-ok"
78353
78539
  ]
78354
78540
  },
78541
+ {
78542
+ id: "alerts",
78543
+ family: "system",
78544
+ label: "Alerts",
78545
+ kinds: [
78546
+ "alert-critical",
78547
+ "alert-error",
78548
+ "alert-critical-resolved"
78549
+ ]
78550
+ },
78355
78551
  {
78356
78552
  id: "alarm",
78357
78553
  family: "alarm",
@@ -78396,6 +78592,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
78396
78592
  return [[descriptor.kind, field]];
78397
78593
  })));
78398
78594
  Object.freeze(Object.keys(NC_SENSOR_RAISED_FIELD_BY_KIND));
78595
+ object({
78596
+ phase: _enum(["raised", "resolved"]),
78597
+ episodeId: string().min(1),
78598
+ alertId: string().min(1),
78599
+ severity: AlertSeveritySchema,
78600
+ category: string(),
78601
+ title: string(),
78602
+ message: string(),
78603
+ sourceType: string().optional(),
78604
+ sourceId: string().optional(),
78605
+ nodeId: string().optional(),
78606
+ /** The alert's own action link (where the operator acts on it), when it has one. */
78607
+ actionUrl: string().optional(),
78608
+ at: number()
78609
+ });
78399
78610
  var RULE_BODY_ONLY = ["body"];
78400
78611
  var RULE_TEXT = ["title", "body"];
78401
78612
  var BATTERY = ["device-battery-low", "device-battery-normal"];
@@ -78405,6 +78616,11 @@ var TANK = [
78405
78616
  "device-tank-full",
78406
78617
  "device-tank-normal"
78407
78618
  ];
78619
+ var ALERT_EPISODE = [
78620
+ "alert-critical",
78621
+ "alert-error",
78622
+ "alert-critical-resolved"
78623
+ ];
78408
78624
  var UPDATES = [
78409
78625
  "addon-update-available",
78410
78626
  "server-update-available",
@@ -78597,14 +78813,14 @@ var STATE_SUMMARY_VARS = [
78597
78813
  ([...RULE_TEXT], [...CONSUMABLE]),
78598
78814
  ([...RULE_TEXT], [...TANK]),
78599
78815
  [...RULE_TEXT],
78600
- ([...RULE_TEXT], [...UPDATES]),
78601
- ([...RULE_TEXT], [...UPDATES]),
78602
- [...RULE_TEXT],
78816
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
78817
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
78603
78818
  [...RULE_TEXT],
78604
78819
  [...RULE_TEXT],
78605
78820
  [...RULE_TEXT],
78606
78821
  [...RULE_TEXT],
78607
78822
  [...RULE_TEXT],
78823
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78608
78824
  [...RULE_TEXT],
78609
78825
  [...RULE_TEXT],
78610
78826
  [...RULE_TEXT],
@@ -78622,7 +78838,11 @@ var STATE_SUMMARY_VARS = [
78622
78838
  [...RULE_TEXT],
78623
78839
  [...RULE_TEXT],
78624
78840
  [...RULE_TEXT],
78625
- [...RULE_TEXT],
78841
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78842
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78843
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78844
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78845
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78626
78846
  [...RULE_TEXT],
78627
78847
  [...RULE_TEXT],
78628
78848
  [...RULE_TEXT],
package/dist/addon.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { createServer } from "http";
2
2
  import { EventEmitter } from "events";
3
3
  import { createSocket } from "dgram";
4
- //#region ../types/dist/event-category-BvOFi6PY.mjs
4
+ //#region ../types/dist/event-category-DOl51-Ij.mjs
5
5
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
6
6
  EventCategory["SystemBoot"] = "system.boot";
7
7
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -80,9 +80,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
80
80
  /**
81
81
  * The node's one-shot runner boot check (D877): planned runners against the
82
82
  * process service, `degraded` when any is failed, refused or missing. The
83
- * alert centre turns it into one alert and a direct critical push.
83
+ * alert centre turns it into one critical alert.
84
84
  */
85
85
  EventCategory["SystemRunnerCheck"] = "system.runner-check";
86
+ /**
87
+ * An alert EPISODE opened or closed, emitted by the alert centre for alerts
88
+ * of severity `critical` or `error` (`AlertEpisodePayload`). The alert
89
+ * centre sends no notification of its own: Notification Center turns this
90
+ * into the `alert-critical` / `alert-error` / `alert-critical-resolved`
91
+ * system-event kinds, and reconciles from the alerts store because a bus
92
+ * event may be dropped (D8, D11).
93
+ */
94
+ EventCategory["AlertEpisode"] = "alert.episode";
86
95
  EventCategory["AddonError"] = "addon.error";
87
96
  EventCategory["AddonPageReady"] = "addon.page-ready";
88
97
  EventCategory["AddonWidgetReady"] = "addon.widget-ready";
@@ -5407,7 +5416,7 @@ var ZodIssueCode$1 = {
5407
5416
  var ZodFirstPartyTypeKind$1;
5408
5417
  ZodFirstPartyTypeKind$1 || (ZodFirstPartyTypeKind$1 = {});
5409
5418
  //#endregion
5410
- //#region ../types/dist/sleep-BegKjwUu.mjs
5419
+ //#region ../types/dist/sleep-BxjU_fJM.mjs
5411
5420
  /**
5412
5421
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5413
5422
  * window to float samples (D455).
@@ -13184,7 +13193,14 @@ var AlertSeveritySchema = _enum([
13184
13193
  ]);
13185
13194
  var AlertActionSchema = object({
13186
13195
  label: string(),
13187
- href: string().optional()
13196
+ href: string().optional(),
13197
+ /**
13198
+ * How `href` is followed. Absent / `app`: an admin-ui route (client-side).
13199
+ * `server`: a route the HUB serves (an addon HTTP route such as an OAuth
13200
+ * start) — the browser must leave the SPA with a full navigation, because
13201
+ * the SPA has no such route and would bounce to the home page.
13202
+ */
13203
+ navigation: _enum(["app", "server"]).optional()
13188
13204
  });
13189
13205
  var AlertStatusSchema = _enum([
13190
13206
  "active",
@@ -42013,6 +42029,9 @@ var NcSystemEventKindSchema = _enum([
42013
42029
  "server-updated",
42014
42030
  "export-completed",
42015
42031
  "backup-completed",
42032
+ "alert-critical",
42033
+ "alert-error",
42034
+ "alert-critical-resolved",
42016
42035
  "camera-online",
42017
42036
  "camera-offline",
42018
42037
  "camera-disabled",
@@ -51089,7 +51108,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
51089
51108
  }), method(object({ jobId: string().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
51090
51109
  kind: "mutation",
51091
51110
  auth: "admin"
51092
- }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51111
+ }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({ locationIds: array(string()).readonly() }), object({
51112
+ clear: boolean(),
51113
+ repointLocationId: string().optional()
51114
+ }), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51093
51115
  kind: "mutation",
51094
51116
  auth: "admin"
51095
51117
  }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
@@ -55345,6 +55367,11 @@ onStatusChanged: { data: object({
55345
55367
  *
55346
55368
  * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
55347
55369
  * provider refreshes the slice on an interval and eagerly after commands.
55370
+ *
55371
+ * UNKNOWN IS NOT OFF. Every field the appliance reports separately is
55372
+ * nullable: `null` means "not known right now" (the appliance has not said,
55373
+ * the link is down, or the description does not carry it) and is never
55374
+ * rendered or exported as `false` / `0`. `availability` says why.
55348
55375
  */
55349
55376
  var DishwasherStateSchema = _enum([
55350
55377
  "idle",
@@ -55354,43 +55381,155 @@ var DishwasherStateSchema = _enum([
55354
55381
  "error",
55355
55382
  "unavailable"
55356
55383
  ]);
55384
+ /**
55385
+ * The appliance's own operation state, uncollapsed. `state` above is the coarse
55386
+ * view for compact surfaces; this is what the appliance said.
55387
+ */
55388
+ var DishwasherOperationStateSchema = _enum([
55389
+ "Inactive",
55390
+ "Ready",
55391
+ "DelayedStart",
55392
+ "Run",
55393
+ "Pause",
55394
+ "ActionRequired",
55395
+ "Finished",
55396
+ "Error",
55397
+ "Aborting"
55398
+ ]);
55399
+ /**
55400
+ * Why fields may be `null`:
55401
+ * - `available` — the link is up and the description is loaded;
55402
+ * - `offline` — the local link is down (values are unknown, not last-known);
55403
+ * - `description-missing` — the link is up but the appliance's description could not
55404
+ * be loaded, so its values cannot be decoded.
55405
+ */
55406
+ var DishwasherAvailabilitySchema = _enum([
55407
+ "available",
55408
+ "offline",
55409
+ "description-missing"
55410
+ ]);
55357
55411
  var DishwasherConsumableLevelSchema = _enum([
55358
55412
  "ok",
55359
55413
  "low",
55360
55414
  "empty"
55361
55415
  ]);
55362
55416
  var DishwasherStatusSchema = object({
55417
+ availability: DishwasherAvailabilitySchema,
55418
+ /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
55363
55419
  state: DishwasherStateSchema,
55364
- /** Active program id/name, or null when none selected / unknown. */
55420
+ /** The appliance's operation state as reported; null when not known. */
55421
+ operationState: DishwasherOperationStateSchema.nullable(),
55422
+ /** Feature key of the ACTIVE (running) program, or null when none runs / not known. */
55365
55423
  program: string().nullable(),
55366
- /** Program tokens the hardware accepts — drives the UI selector. */
55424
+ /** Feature key of the SELECTED program (what Start would run), or null when none / not known. */
55425
+ selectedProgram: string().nullable(),
55426
+ /** Feature keys of the programs the appliance currently offers — drives the UI selector. */
55367
55427
  availablePrograms: array(string()),
55368
- /** Minutes remaining on the active cycle, or null when not running. */
55369
- remainingMinutes: number().int().nonnegative().nullable(),
55428
+ /** Seconds remaining on the active cycle, or null when not running / not known. */
55429
+ remainingSeconds: number().int().nonnegative().nullable(),
55430
+ /** Seconds the delayed start is set to (time until the cycle starts), or null. */
55431
+ delayedStartSeconds: number().int().nonnegative().nullable(),
55370
55432
  /** Cycle completion 0..100, or null when not applicable. */
55371
55433
  progressPercent: number().min(0).max(100).nullable(),
55372
- /** True when the door is reported open. */
55373
- doorOpen: boolean(),
55374
- /** True when remote start is allowed (door closed, power on, etc.). */
55375
- remoteStartAllowed: boolean(),
55376
- /** Main power / switched-on state. */
55377
- powerOn: boolean(),
55434
+ /** True when the door is reported open; null when the door state is not known. */
55435
+ doorOpen: boolean().nullable(),
55436
+ /** True when the door is latched (locked) during a cycle; null when not reported. */
55437
+ doorLocked: boolean().nullable(),
55438
+ /** True when remote start is allowed (door closed, power on, etc.); null when not known. */
55439
+ remoteStartAllowed: boolean().nullable(),
55440
+ /** True when the appliance accepts remote control now; null when not known. */
55441
+ remoteControlActive: boolean().nullable(),
55442
+ /** True while somebody operates the appliance at its panel; null when not reported. */
55443
+ localControlActive: boolean().nullable(),
55444
+ /** Main power / switched-on state; null when not known. */
55445
+ powerOn: boolean().nullable(),
55446
+ /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55447
+ powerState: string().nullable(),
55378
55448
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55379
55449
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55380
- halfLoad: boolean(),
55381
- hygienePlus: boolean(),
55450
+ /** Option states: null when the appliance does not expose the option or has not said. */
55451
+ halfLoad: boolean().nullable(),
55452
+ hygienePlus: boolean().nullable(),
55382
55453
  /** Extra dry option when the appliance exposes it. */
55383
- extraDry: boolean(),
55454
+ extraDry: boolean().nullable(),
55384
55455
  /** Intensive zone (lower basket) when the appliance exposes it. */
55385
- intensiveZone: boolean(),
55456
+ intensiveZone: boolean().nullable(),
55386
55457
  /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
55387
- varioSpeedPlus: boolean(),
55388
- /** Child lock (controls disabled on the appliance). */
55389
- childLock: boolean(),
55458
+ varioSpeedPlus: boolean().nullable(),
55459
+ /** Child lock (controls disabled on the appliance); null when not known. */
55460
+ childLock: boolean().nullable(),
55461
+ /** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
55462
+ activeEvents: array(string()),
55463
+ /** Numeric error code when the appliance reports one; null otherwise. */
55390
55464
  errorCode: number().nullable(),
55465
+ /** Name of the raised alert-level event while the appliance is in error; null otherwise. */
55391
55466
  errorLabel: string().nullable(),
55467
+ /** Ms epoch of the last value received from the appliance; 0 = never. */
55392
55468
  lastFetchedAt: number()
55393
55469
  });
55470
+ var DeviceIdSchema = number().int().nonnegative();
55471
+ /** A value a program option or setting can take. */
55472
+ var DishwasherValueSchema = union([
55473
+ boolean(),
55474
+ string(),
55475
+ number()
55476
+ ]);
55477
+ var DishwasherAccessSchema = _enum([
55478
+ "none",
55479
+ "read",
55480
+ "readWrite",
55481
+ "writeOnly",
55482
+ "readStatic"
55483
+ ]);
55484
+ /**
55485
+ * One option or setting the appliance declares, with the constraints its description
55486
+ * gives. A `readWrite` descriptor that is `available` is what `setOption` accepts.
55487
+ */
55488
+ var DishwasherOptionDescriptorSchema = object({
55489
+ /** Feature key (`Dishcare.Dishwasher.Option.ExtraDry`). */
55490
+ key: string(),
55491
+ /** Last segment of the key, for display. */
55492
+ name: string(),
55493
+ type: _enum([
55494
+ "boolean",
55495
+ "number",
55496
+ "enum",
55497
+ "string"
55498
+ ]),
55499
+ access: DishwasherAccessSchema,
55500
+ /** The appliance reports this entity as currently available. */
55501
+ available: boolean(),
55502
+ /** Unit the description declares for a number; null when it declares none. */
55503
+ unit: string().nullable(),
55504
+ min: number().nullable(),
55505
+ max: number().nullable(),
55506
+ step: number().nullable(),
55507
+ /** Allowed members of an enum; null for other types. */
55508
+ enumValues: array(string()).nullable(),
55509
+ defaultValue: DishwasherValueSchema.nullable()
55510
+ });
55511
+ var DishwasherProgramSchema = object({
55512
+ /** Feature key (`Dishcare.Dishwasher.Program.Eco50`) — what `setProgram` / `start` take. */
55513
+ key: string(),
55514
+ name: string(),
55515
+ /** The appliance currently offers this program. */
55516
+ available: boolean(),
55517
+ /** The options this program lists, with the program-level access / availability / default. */
55518
+ options: array(DishwasherOptionDescriptorSchema)
55519
+ });
55520
+ var DishwasherOptionsSchema = object({
55521
+ availability: DishwasherAvailabilitySchema,
55522
+ /** What the appliance can be told to do, from the commands its description declares. */
55523
+ supportsStart: boolean(),
55524
+ supportsPause: boolean(),
55525
+ supportsResume: boolean(),
55526
+ supportsStop: boolean(),
55527
+ supportsPower: boolean(),
55528
+ /** Every program the description lists, with its options. */
55529
+ programs: array(DishwasherProgramSchema),
55530
+ /** Every option and setting entity the description lists (programs reference these by key). */
55531
+ options: array(DishwasherOptionDescriptorSchema)
55532
+ });
55394
55533
  var dishwasherCapability = {
55395
55534
  name: "dishwasher",
55396
55535
  scope: "device",
@@ -55398,86 +55537,102 @@ var dishwasherCapability = {
55398
55537
  mode: "singleton",
55399
55538
  deviceTypes: [DeviceType.Dishwasher],
55400
55539
  methods: {
55401
- start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55540
+ /**
55541
+ * Start a program. Without `program` the selected one starts. `options` are
55542
+ * option feature keys; each is checked against the program's constraints.
55543
+ */
55544
+ start: method(object({
55545
+ deviceId: DeviceIdSchema,
55546
+ program: string().min(1).optional(),
55547
+ options: record(string(), DishwasherValueSchema).optional()
55548
+ }), _void(), {
55402
55549
  kind: "mutation",
55403
55550
  auth: "protected"
55404
55551
  }),
55405
- pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55552
+ pause: method(object({ deviceId: DeviceIdSchema }), _void(), {
55406
55553
  kind: "mutation",
55407
55554
  auth: "protected"
55408
55555
  }),
55409
- stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55556
+ resume: method(object({ deviceId: DeviceIdSchema }), _void(), {
55557
+ kind: "mutation",
55558
+ auth: "protected"
55559
+ }),
55560
+ stop: method(object({ deviceId: DeviceIdSchema }), _void(), {
55410
55561
  kind: "mutation",
55411
55562
  auth: "protected"
55412
55563
  }),
55564
+ /** Select (not start) a program; refused when the appliance does not offer it. */
55413
55565
  setProgram: method(object({
55414
- deviceId: number().int().nonnegative(),
55566
+ deviceId: DeviceIdSchema,
55415
55567
  program: string().min(1)
55416
55568
  }), _void(), {
55417
55569
  kind: "mutation",
55418
55570
  auth: "protected"
55419
55571
  }),
55420
55572
  setPower: method(object({
55421
- deviceId: number().int().nonnegative(),
55573
+ deviceId: DeviceIdSchema,
55422
55574
  on: boolean()
55423
55575
  }), _void(), {
55424
55576
  kind: "mutation",
55425
55577
  auth: "protected"
55426
55578
  }),
55427
55579
  setHalfLoad: method(object({
55428
- deviceId: number().int().nonnegative(),
55580
+ deviceId: DeviceIdSchema,
55429
55581
  on: boolean()
55430
55582
  }), _void(), {
55431
55583
  kind: "mutation",
55432
55584
  auth: "protected"
55433
55585
  }),
55434
55586
  setHygienePlus: method(object({
55435
- deviceId: number().int().nonnegative(),
55587
+ deviceId: DeviceIdSchema,
55436
55588
  on: boolean()
55437
55589
  }), _void(), {
55438
55590
  kind: "mutation",
55439
55591
  auth: "protected"
55440
55592
  }),
55441
55593
  setExtraDry: method(object({
55442
- deviceId: number().int().nonnegative(),
55594
+ deviceId: DeviceIdSchema,
55443
55595
  on: boolean()
55444
55596
  }), _void(), {
55445
55597
  kind: "mutation",
55446
55598
  auth: "protected"
55447
55599
  }),
55448
55600
  setIntensiveZone: method(object({
55449
- deviceId: number().int().nonnegative(),
55601
+ deviceId: DeviceIdSchema,
55450
55602
  on: boolean()
55451
55603
  }), _void(), {
55452
55604
  kind: "mutation",
55453
55605
  auth: "protected"
55454
55606
  }),
55455
55607
  setVarioSpeedPlus: method(object({
55456
- deviceId: number().int().nonnegative(),
55608
+ deviceId: DeviceIdSchema,
55457
55609
  on: boolean()
55458
55610
  }), _void(), {
55459
55611
  kind: "mutation",
55460
55612
  auth: "protected"
55461
55613
  }),
55462
55614
  setChildLock: method(object({
55463
- deviceId: number().int().nonnegative(),
55615
+ deviceId: DeviceIdSchema,
55464
55616
  on: boolean()
55465
55617
  }), _void(), {
55466
55618
  kind: "mutation",
55467
55619
  auth: "protected"
55468
55620
  }),
55621
+ /**
55622
+ * Write any option or setting by feature key. Refused when the description does
55623
+ * not list it, it is not writable or not available now, or the value is outside
55624
+ * its declared range / members.
55625
+ */
55469
55626
  setOption: method(object({
55470
- deviceId: number().int().nonnegative(),
55627
+ deviceId: DeviceIdSchema,
55471
55628
  key: string().min(1),
55472
- value: union([
55473
- boolean(),
55474
- string(),
55475
- number()
55476
- ])
55629
+ value: DishwasherValueSchema
55477
55630
  }), _void(), {
55478
55631
  kind: "mutation",
55479
55632
  auth: "protected"
55480
- })
55633
+ }),
55634
+ /** What this appliance can do, from its own description — the UI is derived from it. */
55635
+ getOptions: method(object({ deviceId: DeviceIdSchema }), DishwasherOptionsSchema, { auth: "protected" })
55481
55636
  },
55482
55637
  status: {
55483
55638
  schema: DishwasherStatusSchema,
@@ -69426,6 +69581,12 @@ Object.freeze({
69426
69581
  addonId: null,
69427
69582
  access: "view"
69428
69583
  },
69584
+ "dishwasher.getOptions": {
69585
+ capName: "dishwasher",
69586
+ capScope: "device",
69587
+ addonId: null,
69588
+ access: "view"
69589
+ },
69429
69590
  "dishwasher.getStatus": {
69430
69591
  capName: "dishwasher",
69431
69592
  capScope: "device",
@@ -69438,6 +69599,12 @@ Object.freeze({
69438
69599
  addonId: null,
69439
69600
  access: "create"
69440
69601
  },
69602
+ "dishwasher.resume": {
69603
+ capName: "dishwasher",
69604
+ capScope: "device",
69605
+ addonId: null,
69606
+ access: "create"
69607
+ },
69441
69608
  "dishwasher.setChildLock": {
69442
69609
  capName: "dishwasher",
69443
69610
  capScope: "device",
@@ -73938,6 +74105,12 @@ Object.freeze({
73938
74105
  addonId: null,
73939
74106
  access: "view"
73940
74107
  },
74108
+ "storageMigration.moverClearance": {
74109
+ capName: "storage-migration",
74110
+ capScope: "system",
74111
+ addonId: null,
74112
+ access: "view"
74113
+ },
73941
74114
  "storageMigration.movers": {
73942
74115
  capName: "storage-migration",
73943
74116
  capScope: "system",
@@ -76131,6 +76304,11 @@ Object.freeze({
76131
76304
  form: "single",
76132
76305
  optional: false
76133
76306
  }],
76307
+ "dishwasher.getOptions": [{
76308
+ name: "deviceId",
76309
+ form: "single",
76310
+ optional: false
76311
+ }],
76134
76312
  "dishwasher.getStatus": [{
76135
76313
  name: "deviceId",
76136
76314
  form: "single",
@@ -76141,6 +76319,11 @@ Object.freeze({
76141
76319
  form: "single",
76142
76320
  optional: false
76143
76321
  }],
76322
+ "dishwasher.resume": [{
76323
+ name: "deviceId",
76324
+ form: "single",
76325
+ optional: false
76326
+ }],
76144
76327
  "dishwasher.setChildLock": [{
76145
76328
  name: "deviceId",
76146
76329
  form: "single",
@@ -78227,6 +78410,9 @@ new Map(Object.entries({
78227
78410
  "wrapper-update-available": "system",
78228
78411
  "backup-completed": "system",
78229
78412
  "export-completed": "system",
78413
+ "alert-critical": "system",
78414
+ "alert-error": "system",
78415
+ "alert-critical-resolved": "system",
78230
78416
  "storage-location-low": "system",
78231
78417
  "storage-location-critical": "system",
78232
78418
  "storage-location-ok": "system",
@@ -78351,6 +78537,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78351
78537
  "storage-location-ok"
78352
78538
  ]
78353
78539
  },
78540
+ {
78541
+ id: "alerts",
78542
+ family: "system",
78543
+ label: "Alerts",
78544
+ kinds: [
78545
+ "alert-critical",
78546
+ "alert-error",
78547
+ "alert-critical-resolved"
78548
+ ]
78549
+ },
78354
78550
  {
78355
78551
  id: "alarm",
78356
78552
  family: "alarm",
@@ -78395,6 +78591,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
78395
78591
  return [[descriptor.kind, field]];
78396
78592
  })));
78397
78593
  Object.freeze(Object.keys(NC_SENSOR_RAISED_FIELD_BY_KIND));
78594
+ object({
78595
+ phase: _enum(["raised", "resolved"]),
78596
+ episodeId: string().min(1),
78597
+ alertId: string().min(1),
78598
+ severity: AlertSeveritySchema,
78599
+ category: string(),
78600
+ title: string(),
78601
+ message: string(),
78602
+ sourceType: string().optional(),
78603
+ sourceId: string().optional(),
78604
+ nodeId: string().optional(),
78605
+ /** The alert's own action link (where the operator acts on it), when it has one. */
78606
+ actionUrl: string().optional(),
78607
+ at: number()
78608
+ });
78398
78609
  var RULE_BODY_ONLY = ["body"];
78399
78610
  var RULE_TEXT = ["title", "body"];
78400
78611
  var BATTERY = ["device-battery-low", "device-battery-normal"];
@@ -78404,6 +78615,11 @@ var TANK = [
78404
78615
  "device-tank-full",
78405
78616
  "device-tank-normal"
78406
78617
  ];
78618
+ var ALERT_EPISODE = [
78619
+ "alert-critical",
78620
+ "alert-error",
78621
+ "alert-critical-resolved"
78622
+ ];
78407
78623
  var UPDATES = [
78408
78624
  "addon-update-available",
78409
78625
  "server-update-available",
@@ -78596,14 +78812,14 @@ var STATE_SUMMARY_VARS = [
78596
78812
  ([...RULE_TEXT], [...CONSUMABLE]),
78597
78813
  ([...RULE_TEXT], [...TANK]),
78598
78814
  [...RULE_TEXT],
78599
- ([...RULE_TEXT], [...UPDATES]),
78600
- ([...RULE_TEXT], [...UPDATES]),
78601
- [...RULE_TEXT],
78815
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
78816
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
78602
78817
  [...RULE_TEXT],
78603
78818
  [...RULE_TEXT],
78604
78819
  [...RULE_TEXT],
78605
78820
  [...RULE_TEXT],
78606
78821
  [...RULE_TEXT],
78822
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78607
78823
  [...RULE_TEXT],
78608
78824
  [...RULE_TEXT],
78609
78825
  [...RULE_TEXT],
@@ -78621,7 +78837,11 @@ var STATE_SUMMARY_VARS = [
78621
78837
  [...RULE_TEXT],
78622
78838
  [...RULE_TEXT],
78623
78839
  [...RULE_TEXT],
78624
- [...RULE_TEXT],
78840
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78841
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78842
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78843
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78844
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78625
78845
  [...RULE_TEXT],
78626
78846
  [...RULE_TEXT],
78627
78847
  [...RULE_TEXT],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-ecowitt",
3
- "version": "0.2.128",
3
+ "version": "0.2.129",
4
4
  "description": "Ecowitt weather-station device-provider addon for CamStack — wraps the @apocaliss92/nodewitt local-poll / push client",
5
5
  "keywords": [
6
6
  "camstack",