@camstack/addon-provider-tuya 0.2.127 → 0.2.128

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
@@ -819,7 +819,7 @@ async function discoverDevices(options = {}, binder = createDgramBinder()) {
819
819
  return [...byId.values()];
820
820
  }
821
821
  //#endregion
822
- //#region ../types/dist/event-category-BvOFi6PY.mjs
822
+ //#region ../types/dist/event-category-DOl51-Ij.mjs
823
823
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
824
824
  EventCategory["SystemBoot"] = "system.boot";
825
825
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -898,9 +898,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
898
898
  /**
899
899
  * The node's one-shot runner boot check (D877): planned runners against the
900
900
  * process service, `degraded` when any is failed, refused or missing. The
901
- * alert centre turns it into one alert and a direct critical push.
901
+ * alert centre turns it into one critical alert.
902
902
  */
903
903
  EventCategory["SystemRunnerCheck"] = "system.runner-check";
904
+ /**
905
+ * An alert EPISODE opened or closed, emitted by the alert centre for alerts
906
+ * of severity `critical` or `error` (`AlertEpisodePayload`). The alert
907
+ * centre sends no notification of its own: Notification Center turns this
908
+ * into the `alert-critical` / `alert-error` / `alert-critical-resolved`
909
+ * system-event kinds, and reconciles from the alerts store because a bus
910
+ * event may be dropped (D8, D11).
911
+ */
912
+ EventCategory["AlertEpisode"] = "alert.episode";
904
913
  EventCategory["AddonError"] = "addon.error";
905
914
  EventCategory["AddonPageReady"] = "addon.page-ready";
906
915
  EventCategory["AddonWidgetReady"] = "addon.widget-ready";
@@ -6225,7 +6234,7 @@ var ZodIssueCode = {
6225
6234
  var ZodFirstPartyTypeKind;
6226
6235
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6227
6236
  //#endregion
6228
- //#region ../types/dist/sleep-BegKjwUu.mjs
6237
+ //#region ../types/dist/sleep-BxjU_fJM.mjs
6229
6238
  /**
6230
6239
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6231
6240
  * window to float samples (D455).
@@ -13988,7 +13997,14 @@ var AlertSeveritySchema = _enum([
13988
13997
  ]);
13989
13998
  var AlertActionSchema = object({
13990
13999
  label: string(),
13991
- href: string().optional()
14000
+ href: string().optional(),
14001
+ /**
14002
+ * How `href` is followed. Absent / `app`: an admin-ui route (client-side).
14003
+ * `server`: a route the HUB serves (an addon HTTP route such as an OAuth
14004
+ * start) — the browser must leave the SPA with a full navigation, because
14005
+ * the SPA has no such route and would bounce to the home page.
14006
+ */
14007
+ navigation: _enum(["app", "server"]).optional()
13992
14008
  });
13993
14009
  var AlertStatusSchema = _enum([
13994
14010
  "active",
@@ -42721,6 +42737,9 @@ var NcSystemEventKindSchema = _enum([
42721
42737
  "server-updated",
42722
42738
  "export-completed",
42723
42739
  "backup-completed",
42740
+ "alert-critical",
42741
+ "alert-error",
42742
+ "alert-critical-resolved",
42724
42743
  "camera-online",
42725
42744
  "camera-offline",
42726
42745
  "camera-disabled",
@@ -51797,7 +51816,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
51797
51816
  }), method(object({ jobId: string().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
51798
51817
  kind: "mutation",
51799
51818
  auth: "admin"
51800
- }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51819
+ }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({ locationIds: array(string()).readonly() }), object({
51820
+ clear: boolean(),
51821
+ repointLocationId: string().optional()
51822
+ }), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51801
51823
  kind: "mutation",
51802
51824
  auth: "admin"
51803
51825
  }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
@@ -56061,6 +56083,11 @@ onStatusChanged: { data: object({
56061
56083
  *
56062
56084
  * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
56063
56085
  * provider refreshes the slice on an interval and eagerly after commands.
56086
+ *
56087
+ * UNKNOWN IS NOT OFF. Every field the appliance reports separately is
56088
+ * nullable: `null` means "not known right now" (the appliance has not said,
56089
+ * the link is down, or the description does not carry it) and is never
56090
+ * rendered or exported as `false` / `0`. `availability` says why.
56064
56091
  */
56065
56092
  var DishwasherStateSchema = _enum([
56066
56093
  "idle",
@@ -56070,43 +56097,155 @@ var DishwasherStateSchema = _enum([
56070
56097
  "error",
56071
56098
  "unavailable"
56072
56099
  ]);
56100
+ /**
56101
+ * The appliance's own operation state, uncollapsed. `state` above is the coarse
56102
+ * view for compact surfaces; this is what the appliance said.
56103
+ */
56104
+ var DishwasherOperationStateSchema = _enum([
56105
+ "Inactive",
56106
+ "Ready",
56107
+ "DelayedStart",
56108
+ "Run",
56109
+ "Pause",
56110
+ "ActionRequired",
56111
+ "Finished",
56112
+ "Error",
56113
+ "Aborting"
56114
+ ]);
56115
+ /**
56116
+ * Why fields may be `null`:
56117
+ * - `available` — the link is up and the description is loaded;
56118
+ * - `offline` — the local link is down (values are unknown, not last-known);
56119
+ * - `description-missing` — the link is up but the appliance's description could not
56120
+ * be loaded, so its values cannot be decoded.
56121
+ */
56122
+ var DishwasherAvailabilitySchema = _enum([
56123
+ "available",
56124
+ "offline",
56125
+ "description-missing"
56126
+ ]);
56073
56127
  var DishwasherConsumableLevelSchema = _enum([
56074
56128
  "ok",
56075
56129
  "low",
56076
56130
  "empty"
56077
56131
  ]);
56078
56132
  var DishwasherStatusSchema = object({
56133
+ availability: DishwasherAvailabilitySchema,
56134
+ /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
56079
56135
  state: DishwasherStateSchema,
56080
- /** Active program id/name, or null when none selected / unknown. */
56136
+ /** The appliance's operation state as reported; null when not known. */
56137
+ operationState: DishwasherOperationStateSchema.nullable(),
56138
+ /** Feature key of the ACTIVE (running) program, or null when none runs / not known. */
56081
56139
  program: string().nullable(),
56082
- /** Program tokens the hardware accepts — drives the UI selector. */
56140
+ /** Feature key of the SELECTED program (what Start would run), or null when none / not known. */
56141
+ selectedProgram: string().nullable(),
56142
+ /** Feature keys of the programs the appliance currently offers — drives the UI selector. */
56083
56143
  availablePrograms: array(string()),
56084
- /** Minutes remaining on the active cycle, or null when not running. */
56085
- remainingMinutes: number().int().nonnegative().nullable(),
56144
+ /** Seconds remaining on the active cycle, or null when not running / not known. */
56145
+ remainingSeconds: number().int().nonnegative().nullable(),
56146
+ /** Seconds the delayed start is set to (time until the cycle starts), or null. */
56147
+ delayedStartSeconds: number().int().nonnegative().nullable(),
56086
56148
  /** Cycle completion 0..100, or null when not applicable. */
56087
56149
  progressPercent: number().min(0).max(100).nullable(),
56088
- /** True when the door is reported open. */
56089
- doorOpen: boolean(),
56090
- /** True when remote start is allowed (door closed, power on, etc.). */
56091
- remoteStartAllowed: boolean(),
56092
- /** Main power / switched-on state. */
56093
- powerOn: boolean(),
56150
+ /** True when the door is reported open; null when the door state is not known. */
56151
+ doorOpen: boolean().nullable(),
56152
+ /** True when the door is latched (locked) during a cycle; null when not reported. */
56153
+ doorLocked: boolean().nullable(),
56154
+ /** True when remote start is allowed (door closed, power on, etc.); null when not known. */
56155
+ remoteStartAllowed: boolean().nullable(),
56156
+ /** True when the appliance accepts remote control now; null when not known. */
56157
+ remoteControlActive: boolean().nullable(),
56158
+ /** True while somebody operates the appliance at its panel; null when not reported. */
56159
+ localControlActive: boolean().nullable(),
56160
+ /** Main power / switched-on state; null when not known. */
56161
+ powerOn: boolean().nullable(),
56162
+ /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
56163
+ powerState: string().nullable(),
56094
56164
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56095
56165
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56096
- halfLoad: boolean(),
56097
- hygienePlus: boolean(),
56166
+ /** Option states: null when the appliance does not expose the option or has not said. */
56167
+ halfLoad: boolean().nullable(),
56168
+ hygienePlus: boolean().nullable(),
56098
56169
  /** Extra dry option when the appliance exposes it. */
56099
- extraDry: boolean(),
56170
+ extraDry: boolean().nullable(),
56100
56171
  /** Intensive zone (lower basket) when the appliance exposes it. */
56101
- intensiveZone: boolean(),
56172
+ intensiveZone: boolean().nullable(),
56102
56173
  /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
56103
- varioSpeedPlus: boolean(),
56104
- /** Child lock (controls disabled on the appliance). */
56105
- childLock: boolean(),
56174
+ varioSpeedPlus: boolean().nullable(),
56175
+ /** Child lock (controls disabled on the appliance); null when not known. */
56176
+ childLock: boolean().nullable(),
56177
+ /** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
56178
+ activeEvents: array(string()),
56179
+ /** Numeric error code when the appliance reports one; null otherwise. */
56106
56180
  errorCode: number().nullable(),
56181
+ /** Name of the raised alert-level event while the appliance is in error; null otherwise. */
56107
56182
  errorLabel: string().nullable(),
56183
+ /** Ms epoch of the last value received from the appliance; 0 = never. */
56108
56184
  lastFetchedAt: number()
56109
56185
  });
56186
+ var DeviceIdSchema = number().int().nonnegative();
56187
+ /** A value a program option or setting can take. */
56188
+ var DishwasherValueSchema = union([
56189
+ boolean(),
56190
+ string(),
56191
+ number()
56192
+ ]);
56193
+ var DishwasherAccessSchema = _enum([
56194
+ "none",
56195
+ "read",
56196
+ "readWrite",
56197
+ "writeOnly",
56198
+ "readStatic"
56199
+ ]);
56200
+ /**
56201
+ * One option or setting the appliance declares, with the constraints its description
56202
+ * gives. A `readWrite` descriptor that is `available` is what `setOption` accepts.
56203
+ */
56204
+ var DishwasherOptionDescriptorSchema = object({
56205
+ /** Feature key (`Dishcare.Dishwasher.Option.ExtraDry`). */
56206
+ key: string(),
56207
+ /** Last segment of the key, for display. */
56208
+ name: string(),
56209
+ type: _enum([
56210
+ "boolean",
56211
+ "number",
56212
+ "enum",
56213
+ "string"
56214
+ ]),
56215
+ access: DishwasherAccessSchema,
56216
+ /** The appliance reports this entity as currently available. */
56217
+ available: boolean(),
56218
+ /** Unit the description declares for a number; null when it declares none. */
56219
+ unit: string().nullable(),
56220
+ min: number().nullable(),
56221
+ max: number().nullable(),
56222
+ step: number().nullable(),
56223
+ /** Allowed members of an enum; null for other types. */
56224
+ enumValues: array(string()).nullable(),
56225
+ defaultValue: DishwasherValueSchema.nullable()
56226
+ });
56227
+ var DishwasherProgramSchema = object({
56228
+ /** Feature key (`Dishcare.Dishwasher.Program.Eco50`) — what `setProgram` / `start` take. */
56229
+ key: string(),
56230
+ name: string(),
56231
+ /** The appliance currently offers this program. */
56232
+ available: boolean(),
56233
+ /** The options this program lists, with the program-level access / availability / default. */
56234
+ options: array(DishwasherOptionDescriptorSchema)
56235
+ });
56236
+ var DishwasherOptionsSchema = object({
56237
+ availability: DishwasherAvailabilitySchema,
56238
+ /** What the appliance can be told to do, from the commands its description declares. */
56239
+ supportsStart: boolean(),
56240
+ supportsPause: boolean(),
56241
+ supportsResume: boolean(),
56242
+ supportsStop: boolean(),
56243
+ supportsPower: boolean(),
56244
+ /** Every program the description lists, with its options. */
56245
+ programs: array(DishwasherProgramSchema),
56246
+ /** Every option and setting entity the description lists (programs reference these by key). */
56247
+ options: array(DishwasherOptionDescriptorSchema)
56248
+ });
56110
56249
  var dishwasherCapability = {
56111
56250
  name: "dishwasher",
56112
56251
  scope: "device",
@@ -56114,86 +56253,102 @@ var dishwasherCapability = {
56114
56253
  mode: "singleton",
56115
56254
  deviceTypes: [DeviceType.Dishwasher],
56116
56255
  methods: {
56117
- start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56256
+ /**
56257
+ * Start a program. Without `program` the selected one starts. `options` are
56258
+ * option feature keys; each is checked against the program's constraints.
56259
+ */
56260
+ start: method(object({
56261
+ deviceId: DeviceIdSchema,
56262
+ program: string().min(1).optional(),
56263
+ options: record(string(), DishwasherValueSchema).optional()
56264
+ }), _void(), {
56118
56265
  kind: "mutation",
56119
56266
  auth: "protected"
56120
56267
  }),
56121
- pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56268
+ pause: method(object({ deviceId: DeviceIdSchema }), _void(), {
56122
56269
  kind: "mutation",
56123
56270
  auth: "protected"
56124
56271
  }),
56125
- stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56272
+ resume: method(object({ deviceId: DeviceIdSchema }), _void(), {
56273
+ kind: "mutation",
56274
+ auth: "protected"
56275
+ }),
56276
+ stop: method(object({ deviceId: DeviceIdSchema }), _void(), {
56126
56277
  kind: "mutation",
56127
56278
  auth: "protected"
56128
56279
  }),
56280
+ /** Select (not start) a program; refused when the appliance does not offer it. */
56129
56281
  setProgram: method(object({
56130
- deviceId: number().int().nonnegative(),
56282
+ deviceId: DeviceIdSchema,
56131
56283
  program: string().min(1)
56132
56284
  }), _void(), {
56133
56285
  kind: "mutation",
56134
56286
  auth: "protected"
56135
56287
  }),
56136
56288
  setPower: method(object({
56137
- deviceId: number().int().nonnegative(),
56289
+ deviceId: DeviceIdSchema,
56138
56290
  on: boolean()
56139
56291
  }), _void(), {
56140
56292
  kind: "mutation",
56141
56293
  auth: "protected"
56142
56294
  }),
56143
56295
  setHalfLoad: method(object({
56144
- deviceId: number().int().nonnegative(),
56296
+ deviceId: DeviceIdSchema,
56145
56297
  on: boolean()
56146
56298
  }), _void(), {
56147
56299
  kind: "mutation",
56148
56300
  auth: "protected"
56149
56301
  }),
56150
56302
  setHygienePlus: method(object({
56151
- deviceId: number().int().nonnegative(),
56303
+ deviceId: DeviceIdSchema,
56152
56304
  on: boolean()
56153
56305
  }), _void(), {
56154
56306
  kind: "mutation",
56155
56307
  auth: "protected"
56156
56308
  }),
56157
56309
  setExtraDry: method(object({
56158
- deviceId: number().int().nonnegative(),
56310
+ deviceId: DeviceIdSchema,
56159
56311
  on: boolean()
56160
56312
  }), _void(), {
56161
56313
  kind: "mutation",
56162
56314
  auth: "protected"
56163
56315
  }),
56164
56316
  setIntensiveZone: method(object({
56165
- deviceId: number().int().nonnegative(),
56317
+ deviceId: DeviceIdSchema,
56166
56318
  on: boolean()
56167
56319
  }), _void(), {
56168
56320
  kind: "mutation",
56169
56321
  auth: "protected"
56170
56322
  }),
56171
56323
  setVarioSpeedPlus: method(object({
56172
- deviceId: number().int().nonnegative(),
56324
+ deviceId: DeviceIdSchema,
56173
56325
  on: boolean()
56174
56326
  }), _void(), {
56175
56327
  kind: "mutation",
56176
56328
  auth: "protected"
56177
56329
  }),
56178
56330
  setChildLock: method(object({
56179
- deviceId: number().int().nonnegative(),
56331
+ deviceId: DeviceIdSchema,
56180
56332
  on: boolean()
56181
56333
  }), _void(), {
56182
56334
  kind: "mutation",
56183
56335
  auth: "protected"
56184
56336
  }),
56337
+ /**
56338
+ * Write any option or setting by feature key. Refused when the description does
56339
+ * not list it, it is not writable or not available now, or the value is outside
56340
+ * its declared range / members.
56341
+ */
56185
56342
  setOption: method(object({
56186
- deviceId: number().int().nonnegative(),
56343
+ deviceId: DeviceIdSchema,
56187
56344
  key: string().min(1),
56188
- value: union([
56189
- boolean(),
56190
- string(),
56191
- number()
56192
- ])
56345
+ value: DishwasherValueSchema
56193
56346
  }), _void(), {
56194
56347
  kind: "mutation",
56195
56348
  auth: "protected"
56196
- })
56349
+ }),
56350
+ /** What this appliance can do, from its own description — the UI is derived from it. */
56351
+ getOptions: method(object({ deviceId: DeviceIdSchema }), DishwasherOptionsSchema, { auth: "protected" })
56197
56352
  },
56198
56353
  status: {
56199
56354
  schema: DishwasherStatusSchema,
@@ -70142,6 +70297,12 @@ Object.freeze({
70142
70297
  addonId: null,
70143
70298
  access: "view"
70144
70299
  },
70300
+ "dishwasher.getOptions": {
70301
+ capName: "dishwasher",
70302
+ capScope: "device",
70303
+ addonId: null,
70304
+ access: "view"
70305
+ },
70145
70306
  "dishwasher.getStatus": {
70146
70307
  capName: "dishwasher",
70147
70308
  capScope: "device",
@@ -70154,6 +70315,12 @@ Object.freeze({
70154
70315
  addonId: null,
70155
70316
  access: "create"
70156
70317
  },
70318
+ "dishwasher.resume": {
70319
+ capName: "dishwasher",
70320
+ capScope: "device",
70321
+ addonId: null,
70322
+ access: "create"
70323
+ },
70157
70324
  "dishwasher.setChildLock": {
70158
70325
  capName: "dishwasher",
70159
70326
  capScope: "device",
@@ -74654,6 +74821,12 @@ Object.freeze({
74654
74821
  addonId: null,
74655
74822
  access: "view"
74656
74823
  },
74824
+ "storageMigration.moverClearance": {
74825
+ capName: "storage-migration",
74826
+ capScope: "system",
74827
+ addonId: null,
74828
+ access: "view"
74829
+ },
74657
74830
  "storageMigration.movers": {
74658
74831
  capName: "storage-migration",
74659
74832
  capScope: "system",
@@ -76847,6 +77020,11 @@ Object.freeze({
76847
77020
  form: "single",
76848
77021
  optional: false
76849
77022
  }],
77023
+ "dishwasher.getOptions": [{
77024
+ name: "deviceId",
77025
+ form: "single",
77026
+ optional: false
77027
+ }],
76850
77028
  "dishwasher.getStatus": [{
76851
77029
  name: "deviceId",
76852
77030
  form: "single",
@@ -76857,6 +77035,11 @@ Object.freeze({
76857
77035
  form: "single",
76858
77036
  optional: false
76859
77037
  }],
77038
+ "dishwasher.resume": [{
77039
+ name: "deviceId",
77040
+ form: "single",
77041
+ optional: false
77042
+ }],
76860
77043
  "dishwasher.setChildLock": [{
76861
77044
  name: "deviceId",
76862
77045
  form: "single",
@@ -78943,6 +79126,9 @@ new Map(Object.entries({
78943
79126
  "wrapper-update-available": "system",
78944
79127
  "backup-completed": "system",
78945
79128
  "export-completed": "system",
79129
+ "alert-critical": "system",
79130
+ "alert-error": "system",
79131
+ "alert-critical-resolved": "system",
78946
79132
  "storage-location-low": "system",
78947
79133
  "storage-location-critical": "system",
78948
79134
  "storage-location-ok": "system",
@@ -79067,6 +79253,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79067
79253
  "storage-location-ok"
79068
79254
  ]
79069
79255
  },
79256
+ {
79257
+ id: "alerts",
79258
+ family: "system",
79259
+ label: "Alerts",
79260
+ kinds: [
79261
+ "alert-critical",
79262
+ "alert-error",
79263
+ "alert-critical-resolved"
79264
+ ]
79265
+ },
79070
79266
  {
79071
79267
  id: "alarm",
79072
79268
  family: "alarm",
@@ -79111,6 +79307,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
79111
79307
  return [[descriptor.kind, field]];
79112
79308
  })));
79113
79309
  Object.freeze(Object.keys(NC_SENSOR_RAISED_FIELD_BY_KIND));
79310
+ object({
79311
+ phase: _enum(["raised", "resolved"]),
79312
+ episodeId: string().min(1),
79313
+ alertId: string().min(1),
79314
+ severity: AlertSeveritySchema,
79315
+ category: string(),
79316
+ title: string(),
79317
+ message: string(),
79318
+ sourceType: string().optional(),
79319
+ sourceId: string().optional(),
79320
+ nodeId: string().optional(),
79321
+ /** The alert's own action link (where the operator acts on it), when it has one. */
79322
+ actionUrl: string().optional(),
79323
+ at: number()
79324
+ });
79114
79325
  var RULE_BODY_ONLY = ["body"];
79115
79326
  var RULE_TEXT = ["title", "body"];
79116
79327
  var BATTERY = ["device-battery-low", "device-battery-normal"];
@@ -79120,6 +79331,11 @@ var TANK = [
79120
79331
  "device-tank-full",
79121
79332
  "device-tank-normal"
79122
79333
  ];
79334
+ var ALERT_EPISODE = [
79335
+ "alert-critical",
79336
+ "alert-error",
79337
+ "alert-critical-resolved"
79338
+ ];
79123
79339
  var UPDATES = [
79124
79340
  "addon-update-available",
79125
79341
  "server-update-available",
@@ -79312,14 +79528,14 @@ var STATE_SUMMARY_VARS = [
79312
79528
  ([...RULE_TEXT], [...CONSUMABLE]),
79313
79529
  ([...RULE_TEXT], [...TANK]),
79314
79530
  [...RULE_TEXT],
79315
- ([...RULE_TEXT], [...UPDATES]),
79316
- ([...RULE_TEXT], [...UPDATES]),
79317
- [...RULE_TEXT],
79531
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
79532
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
79318
79533
  [...RULE_TEXT],
79319
79534
  [...RULE_TEXT],
79320
79535
  [...RULE_TEXT],
79321
79536
  [...RULE_TEXT],
79322
79537
  [...RULE_TEXT],
79538
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79323
79539
  [...RULE_TEXT],
79324
79540
  [...RULE_TEXT],
79325
79541
  [...RULE_TEXT],
@@ -79337,7 +79553,11 @@ var STATE_SUMMARY_VARS = [
79337
79553
  [...RULE_TEXT],
79338
79554
  [...RULE_TEXT],
79339
79555
  [...RULE_TEXT],
79340
- [...RULE_TEXT],
79556
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79557
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79558
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79559
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79560
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79341
79561
  [...RULE_TEXT],
79342
79562
  [...RULE_TEXT],
79343
79563
  [...RULE_TEXT],
package/dist/addon.mjs CHANGED
@@ -818,7 +818,7 @@ async function discoverDevices(options = {}, binder = createDgramBinder()) {
818
818
  return [...byId.values()];
819
819
  }
820
820
  //#endregion
821
- //#region ../types/dist/event-category-BvOFi6PY.mjs
821
+ //#region ../types/dist/event-category-DOl51-Ij.mjs
822
822
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
823
823
  EventCategory["SystemBoot"] = "system.boot";
824
824
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -897,9 +897,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
897
897
  /**
898
898
  * The node's one-shot runner boot check (D877): planned runners against the
899
899
  * process service, `degraded` when any is failed, refused or missing. The
900
- * alert centre turns it into one alert and a direct critical push.
900
+ * alert centre turns it into one critical alert.
901
901
  */
902
902
  EventCategory["SystemRunnerCheck"] = "system.runner-check";
903
+ /**
904
+ * An alert EPISODE opened or closed, emitted by the alert centre for alerts
905
+ * of severity `critical` or `error` (`AlertEpisodePayload`). The alert
906
+ * centre sends no notification of its own: Notification Center turns this
907
+ * into the `alert-critical` / `alert-error` / `alert-critical-resolved`
908
+ * system-event kinds, and reconciles from the alerts store because a bus
909
+ * event may be dropped (D8, D11).
910
+ */
911
+ EventCategory["AlertEpisode"] = "alert.episode";
903
912
  EventCategory["AddonError"] = "addon.error";
904
913
  EventCategory["AddonPageReady"] = "addon.page-ready";
905
914
  EventCategory["AddonWidgetReady"] = "addon.widget-ready";
@@ -6224,7 +6233,7 @@ var ZodIssueCode = {
6224
6233
  var ZodFirstPartyTypeKind;
6225
6234
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6226
6235
  //#endregion
6227
- //#region ../types/dist/sleep-BegKjwUu.mjs
6236
+ //#region ../types/dist/sleep-BxjU_fJM.mjs
6228
6237
  /**
6229
6238
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6230
6239
  * window to float samples (D455).
@@ -13987,7 +13996,14 @@ var AlertSeveritySchema = _enum([
13987
13996
  ]);
13988
13997
  var AlertActionSchema = object({
13989
13998
  label: string(),
13990
- href: string().optional()
13999
+ href: string().optional(),
14000
+ /**
14001
+ * How `href` is followed. Absent / `app`: an admin-ui route (client-side).
14002
+ * `server`: a route the HUB serves (an addon HTTP route such as an OAuth
14003
+ * start) — the browser must leave the SPA with a full navigation, because
14004
+ * the SPA has no such route and would bounce to the home page.
14005
+ */
14006
+ navigation: _enum(["app", "server"]).optional()
13991
14007
  });
13992
14008
  var AlertStatusSchema = _enum([
13993
14009
  "active",
@@ -42720,6 +42736,9 @@ var NcSystemEventKindSchema = _enum([
42720
42736
  "server-updated",
42721
42737
  "export-completed",
42722
42738
  "backup-completed",
42739
+ "alert-critical",
42740
+ "alert-error",
42741
+ "alert-critical-resolved",
42723
42742
  "camera-online",
42724
42743
  "camera-offline",
42725
42744
  "camera-disabled",
@@ -51796,7 +51815,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
51796
51815
  }), method(object({ jobId: string().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
51797
51816
  kind: "mutation",
51798
51817
  auth: "admin"
51799
- }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51818
+ }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({ locationIds: array(string()).readonly() }), object({
51819
+ clear: boolean(),
51820
+ repointLocationId: string().optional()
51821
+ }), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51800
51822
  kind: "mutation",
51801
51823
  auth: "admin"
51802
51824
  }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
@@ -56060,6 +56082,11 @@ onStatusChanged: { data: object({
56060
56082
  *
56061
56083
  * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
56062
56084
  * provider refreshes the slice on an interval and eagerly after commands.
56085
+ *
56086
+ * UNKNOWN IS NOT OFF. Every field the appliance reports separately is
56087
+ * nullable: `null` means "not known right now" (the appliance has not said,
56088
+ * the link is down, or the description does not carry it) and is never
56089
+ * rendered or exported as `false` / `0`. `availability` says why.
56063
56090
  */
56064
56091
  var DishwasherStateSchema = _enum([
56065
56092
  "idle",
@@ -56069,43 +56096,155 @@ var DishwasherStateSchema = _enum([
56069
56096
  "error",
56070
56097
  "unavailable"
56071
56098
  ]);
56099
+ /**
56100
+ * The appliance's own operation state, uncollapsed. `state` above is the coarse
56101
+ * view for compact surfaces; this is what the appliance said.
56102
+ */
56103
+ var DishwasherOperationStateSchema = _enum([
56104
+ "Inactive",
56105
+ "Ready",
56106
+ "DelayedStart",
56107
+ "Run",
56108
+ "Pause",
56109
+ "ActionRequired",
56110
+ "Finished",
56111
+ "Error",
56112
+ "Aborting"
56113
+ ]);
56114
+ /**
56115
+ * Why fields may be `null`:
56116
+ * - `available` — the link is up and the description is loaded;
56117
+ * - `offline` — the local link is down (values are unknown, not last-known);
56118
+ * - `description-missing` — the link is up but the appliance's description could not
56119
+ * be loaded, so its values cannot be decoded.
56120
+ */
56121
+ var DishwasherAvailabilitySchema = _enum([
56122
+ "available",
56123
+ "offline",
56124
+ "description-missing"
56125
+ ]);
56072
56126
  var DishwasherConsumableLevelSchema = _enum([
56073
56127
  "ok",
56074
56128
  "low",
56075
56129
  "empty"
56076
56130
  ]);
56077
56131
  var DishwasherStatusSchema = object({
56132
+ availability: DishwasherAvailabilitySchema,
56133
+ /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
56078
56134
  state: DishwasherStateSchema,
56079
- /** Active program id/name, or null when none selected / unknown. */
56135
+ /** The appliance's operation state as reported; null when not known. */
56136
+ operationState: DishwasherOperationStateSchema.nullable(),
56137
+ /** Feature key of the ACTIVE (running) program, or null when none runs / not known. */
56080
56138
  program: string().nullable(),
56081
- /** Program tokens the hardware accepts — drives the UI selector. */
56139
+ /** Feature key of the SELECTED program (what Start would run), or null when none / not known. */
56140
+ selectedProgram: string().nullable(),
56141
+ /** Feature keys of the programs the appliance currently offers — drives the UI selector. */
56082
56142
  availablePrograms: array(string()),
56083
- /** Minutes remaining on the active cycle, or null when not running. */
56084
- remainingMinutes: number().int().nonnegative().nullable(),
56143
+ /** Seconds remaining on the active cycle, or null when not running / not known. */
56144
+ remainingSeconds: number().int().nonnegative().nullable(),
56145
+ /** Seconds the delayed start is set to (time until the cycle starts), or null. */
56146
+ delayedStartSeconds: number().int().nonnegative().nullable(),
56085
56147
  /** Cycle completion 0..100, or null when not applicable. */
56086
56148
  progressPercent: number().min(0).max(100).nullable(),
56087
- /** True when the door is reported open. */
56088
- doorOpen: boolean(),
56089
- /** True when remote start is allowed (door closed, power on, etc.). */
56090
- remoteStartAllowed: boolean(),
56091
- /** Main power / switched-on state. */
56092
- powerOn: boolean(),
56149
+ /** True when the door is reported open; null when the door state is not known. */
56150
+ doorOpen: boolean().nullable(),
56151
+ /** True when the door is latched (locked) during a cycle; null when not reported. */
56152
+ doorLocked: boolean().nullable(),
56153
+ /** True when remote start is allowed (door closed, power on, etc.); null when not known. */
56154
+ remoteStartAllowed: boolean().nullable(),
56155
+ /** True when the appliance accepts remote control now; null when not known. */
56156
+ remoteControlActive: boolean().nullable(),
56157
+ /** True while somebody operates the appliance at its panel; null when not reported. */
56158
+ localControlActive: boolean().nullable(),
56159
+ /** Main power / switched-on state; null when not known. */
56160
+ powerOn: boolean().nullable(),
56161
+ /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
56162
+ powerState: string().nullable(),
56093
56163
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56094
56164
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56095
- halfLoad: boolean(),
56096
- hygienePlus: boolean(),
56165
+ /** Option states: null when the appliance does not expose the option or has not said. */
56166
+ halfLoad: boolean().nullable(),
56167
+ hygienePlus: boolean().nullable(),
56097
56168
  /** Extra dry option when the appliance exposes it. */
56098
- extraDry: boolean(),
56169
+ extraDry: boolean().nullable(),
56099
56170
  /** Intensive zone (lower basket) when the appliance exposes it. */
56100
- intensiveZone: boolean(),
56171
+ intensiveZone: boolean().nullable(),
56101
56172
  /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
56102
- varioSpeedPlus: boolean(),
56103
- /** Child lock (controls disabled on the appliance). */
56104
- childLock: boolean(),
56173
+ varioSpeedPlus: boolean().nullable(),
56174
+ /** Child lock (controls disabled on the appliance); null when not known. */
56175
+ childLock: boolean().nullable(),
56176
+ /** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
56177
+ activeEvents: array(string()),
56178
+ /** Numeric error code when the appliance reports one; null otherwise. */
56105
56179
  errorCode: number().nullable(),
56180
+ /** Name of the raised alert-level event while the appliance is in error; null otherwise. */
56106
56181
  errorLabel: string().nullable(),
56182
+ /** Ms epoch of the last value received from the appliance; 0 = never. */
56107
56183
  lastFetchedAt: number()
56108
56184
  });
56185
+ var DeviceIdSchema = number().int().nonnegative();
56186
+ /** A value a program option or setting can take. */
56187
+ var DishwasherValueSchema = union([
56188
+ boolean(),
56189
+ string(),
56190
+ number()
56191
+ ]);
56192
+ var DishwasherAccessSchema = _enum([
56193
+ "none",
56194
+ "read",
56195
+ "readWrite",
56196
+ "writeOnly",
56197
+ "readStatic"
56198
+ ]);
56199
+ /**
56200
+ * One option or setting the appliance declares, with the constraints its description
56201
+ * gives. A `readWrite` descriptor that is `available` is what `setOption` accepts.
56202
+ */
56203
+ var DishwasherOptionDescriptorSchema = object({
56204
+ /** Feature key (`Dishcare.Dishwasher.Option.ExtraDry`). */
56205
+ key: string(),
56206
+ /** Last segment of the key, for display. */
56207
+ name: string(),
56208
+ type: _enum([
56209
+ "boolean",
56210
+ "number",
56211
+ "enum",
56212
+ "string"
56213
+ ]),
56214
+ access: DishwasherAccessSchema,
56215
+ /** The appliance reports this entity as currently available. */
56216
+ available: boolean(),
56217
+ /** Unit the description declares for a number; null when it declares none. */
56218
+ unit: string().nullable(),
56219
+ min: number().nullable(),
56220
+ max: number().nullable(),
56221
+ step: number().nullable(),
56222
+ /** Allowed members of an enum; null for other types. */
56223
+ enumValues: array(string()).nullable(),
56224
+ defaultValue: DishwasherValueSchema.nullable()
56225
+ });
56226
+ var DishwasherProgramSchema = object({
56227
+ /** Feature key (`Dishcare.Dishwasher.Program.Eco50`) — what `setProgram` / `start` take. */
56228
+ key: string(),
56229
+ name: string(),
56230
+ /** The appliance currently offers this program. */
56231
+ available: boolean(),
56232
+ /** The options this program lists, with the program-level access / availability / default. */
56233
+ options: array(DishwasherOptionDescriptorSchema)
56234
+ });
56235
+ var DishwasherOptionsSchema = object({
56236
+ availability: DishwasherAvailabilitySchema,
56237
+ /** What the appliance can be told to do, from the commands its description declares. */
56238
+ supportsStart: boolean(),
56239
+ supportsPause: boolean(),
56240
+ supportsResume: boolean(),
56241
+ supportsStop: boolean(),
56242
+ supportsPower: boolean(),
56243
+ /** Every program the description lists, with its options. */
56244
+ programs: array(DishwasherProgramSchema),
56245
+ /** Every option and setting entity the description lists (programs reference these by key). */
56246
+ options: array(DishwasherOptionDescriptorSchema)
56247
+ });
56109
56248
  var dishwasherCapability = {
56110
56249
  name: "dishwasher",
56111
56250
  scope: "device",
@@ -56113,86 +56252,102 @@ var dishwasherCapability = {
56113
56252
  mode: "singleton",
56114
56253
  deviceTypes: [DeviceType.Dishwasher],
56115
56254
  methods: {
56116
- start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56255
+ /**
56256
+ * Start a program. Without `program` the selected one starts. `options` are
56257
+ * option feature keys; each is checked against the program's constraints.
56258
+ */
56259
+ start: method(object({
56260
+ deviceId: DeviceIdSchema,
56261
+ program: string().min(1).optional(),
56262
+ options: record(string(), DishwasherValueSchema).optional()
56263
+ }), _void(), {
56117
56264
  kind: "mutation",
56118
56265
  auth: "protected"
56119
56266
  }),
56120
- pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56267
+ pause: method(object({ deviceId: DeviceIdSchema }), _void(), {
56121
56268
  kind: "mutation",
56122
56269
  auth: "protected"
56123
56270
  }),
56124
- stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56271
+ resume: method(object({ deviceId: DeviceIdSchema }), _void(), {
56272
+ kind: "mutation",
56273
+ auth: "protected"
56274
+ }),
56275
+ stop: method(object({ deviceId: DeviceIdSchema }), _void(), {
56125
56276
  kind: "mutation",
56126
56277
  auth: "protected"
56127
56278
  }),
56279
+ /** Select (not start) a program; refused when the appliance does not offer it. */
56128
56280
  setProgram: method(object({
56129
- deviceId: number().int().nonnegative(),
56281
+ deviceId: DeviceIdSchema,
56130
56282
  program: string().min(1)
56131
56283
  }), _void(), {
56132
56284
  kind: "mutation",
56133
56285
  auth: "protected"
56134
56286
  }),
56135
56287
  setPower: method(object({
56136
- deviceId: number().int().nonnegative(),
56288
+ deviceId: DeviceIdSchema,
56137
56289
  on: boolean()
56138
56290
  }), _void(), {
56139
56291
  kind: "mutation",
56140
56292
  auth: "protected"
56141
56293
  }),
56142
56294
  setHalfLoad: method(object({
56143
- deviceId: number().int().nonnegative(),
56295
+ deviceId: DeviceIdSchema,
56144
56296
  on: boolean()
56145
56297
  }), _void(), {
56146
56298
  kind: "mutation",
56147
56299
  auth: "protected"
56148
56300
  }),
56149
56301
  setHygienePlus: method(object({
56150
- deviceId: number().int().nonnegative(),
56302
+ deviceId: DeviceIdSchema,
56151
56303
  on: boolean()
56152
56304
  }), _void(), {
56153
56305
  kind: "mutation",
56154
56306
  auth: "protected"
56155
56307
  }),
56156
56308
  setExtraDry: method(object({
56157
- deviceId: number().int().nonnegative(),
56309
+ deviceId: DeviceIdSchema,
56158
56310
  on: boolean()
56159
56311
  }), _void(), {
56160
56312
  kind: "mutation",
56161
56313
  auth: "protected"
56162
56314
  }),
56163
56315
  setIntensiveZone: method(object({
56164
- deviceId: number().int().nonnegative(),
56316
+ deviceId: DeviceIdSchema,
56165
56317
  on: boolean()
56166
56318
  }), _void(), {
56167
56319
  kind: "mutation",
56168
56320
  auth: "protected"
56169
56321
  }),
56170
56322
  setVarioSpeedPlus: method(object({
56171
- deviceId: number().int().nonnegative(),
56323
+ deviceId: DeviceIdSchema,
56172
56324
  on: boolean()
56173
56325
  }), _void(), {
56174
56326
  kind: "mutation",
56175
56327
  auth: "protected"
56176
56328
  }),
56177
56329
  setChildLock: method(object({
56178
- deviceId: number().int().nonnegative(),
56330
+ deviceId: DeviceIdSchema,
56179
56331
  on: boolean()
56180
56332
  }), _void(), {
56181
56333
  kind: "mutation",
56182
56334
  auth: "protected"
56183
56335
  }),
56336
+ /**
56337
+ * Write any option or setting by feature key. Refused when the description does
56338
+ * not list it, it is not writable or not available now, or the value is outside
56339
+ * its declared range / members.
56340
+ */
56184
56341
  setOption: method(object({
56185
- deviceId: number().int().nonnegative(),
56342
+ deviceId: DeviceIdSchema,
56186
56343
  key: string().min(1),
56187
- value: union([
56188
- boolean(),
56189
- string(),
56190
- number()
56191
- ])
56344
+ value: DishwasherValueSchema
56192
56345
  }), _void(), {
56193
56346
  kind: "mutation",
56194
56347
  auth: "protected"
56195
- })
56348
+ }),
56349
+ /** What this appliance can do, from its own description — the UI is derived from it. */
56350
+ getOptions: method(object({ deviceId: DeviceIdSchema }), DishwasherOptionsSchema, { auth: "protected" })
56196
56351
  },
56197
56352
  status: {
56198
56353
  schema: DishwasherStatusSchema,
@@ -70141,6 +70296,12 @@ Object.freeze({
70141
70296
  addonId: null,
70142
70297
  access: "view"
70143
70298
  },
70299
+ "dishwasher.getOptions": {
70300
+ capName: "dishwasher",
70301
+ capScope: "device",
70302
+ addonId: null,
70303
+ access: "view"
70304
+ },
70144
70305
  "dishwasher.getStatus": {
70145
70306
  capName: "dishwasher",
70146
70307
  capScope: "device",
@@ -70153,6 +70314,12 @@ Object.freeze({
70153
70314
  addonId: null,
70154
70315
  access: "create"
70155
70316
  },
70317
+ "dishwasher.resume": {
70318
+ capName: "dishwasher",
70319
+ capScope: "device",
70320
+ addonId: null,
70321
+ access: "create"
70322
+ },
70156
70323
  "dishwasher.setChildLock": {
70157
70324
  capName: "dishwasher",
70158
70325
  capScope: "device",
@@ -74653,6 +74820,12 @@ Object.freeze({
74653
74820
  addonId: null,
74654
74821
  access: "view"
74655
74822
  },
74823
+ "storageMigration.moverClearance": {
74824
+ capName: "storage-migration",
74825
+ capScope: "system",
74826
+ addonId: null,
74827
+ access: "view"
74828
+ },
74656
74829
  "storageMigration.movers": {
74657
74830
  capName: "storage-migration",
74658
74831
  capScope: "system",
@@ -76846,6 +77019,11 @@ Object.freeze({
76846
77019
  form: "single",
76847
77020
  optional: false
76848
77021
  }],
77022
+ "dishwasher.getOptions": [{
77023
+ name: "deviceId",
77024
+ form: "single",
77025
+ optional: false
77026
+ }],
76849
77027
  "dishwasher.getStatus": [{
76850
77028
  name: "deviceId",
76851
77029
  form: "single",
@@ -76856,6 +77034,11 @@ Object.freeze({
76856
77034
  form: "single",
76857
77035
  optional: false
76858
77036
  }],
77037
+ "dishwasher.resume": [{
77038
+ name: "deviceId",
77039
+ form: "single",
77040
+ optional: false
77041
+ }],
76859
77042
  "dishwasher.setChildLock": [{
76860
77043
  name: "deviceId",
76861
77044
  form: "single",
@@ -78942,6 +79125,9 @@ new Map(Object.entries({
78942
79125
  "wrapper-update-available": "system",
78943
79126
  "backup-completed": "system",
78944
79127
  "export-completed": "system",
79128
+ "alert-critical": "system",
79129
+ "alert-error": "system",
79130
+ "alert-critical-resolved": "system",
78945
79131
  "storage-location-low": "system",
78946
79132
  "storage-location-critical": "system",
78947
79133
  "storage-location-ok": "system",
@@ -79066,6 +79252,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79066
79252
  "storage-location-ok"
79067
79253
  ]
79068
79254
  },
79255
+ {
79256
+ id: "alerts",
79257
+ family: "system",
79258
+ label: "Alerts",
79259
+ kinds: [
79260
+ "alert-critical",
79261
+ "alert-error",
79262
+ "alert-critical-resolved"
79263
+ ]
79264
+ },
79069
79265
  {
79070
79266
  id: "alarm",
79071
79267
  family: "alarm",
@@ -79110,6 +79306,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
79110
79306
  return [[descriptor.kind, field]];
79111
79307
  })));
79112
79308
  Object.freeze(Object.keys(NC_SENSOR_RAISED_FIELD_BY_KIND));
79309
+ object({
79310
+ phase: _enum(["raised", "resolved"]),
79311
+ episodeId: string().min(1),
79312
+ alertId: string().min(1),
79313
+ severity: AlertSeveritySchema,
79314
+ category: string(),
79315
+ title: string(),
79316
+ message: string(),
79317
+ sourceType: string().optional(),
79318
+ sourceId: string().optional(),
79319
+ nodeId: string().optional(),
79320
+ /** The alert's own action link (where the operator acts on it), when it has one. */
79321
+ actionUrl: string().optional(),
79322
+ at: number()
79323
+ });
79113
79324
  var RULE_BODY_ONLY = ["body"];
79114
79325
  var RULE_TEXT = ["title", "body"];
79115
79326
  var BATTERY = ["device-battery-low", "device-battery-normal"];
@@ -79119,6 +79330,11 @@ var TANK = [
79119
79330
  "device-tank-full",
79120
79331
  "device-tank-normal"
79121
79332
  ];
79333
+ var ALERT_EPISODE = [
79334
+ "alert-critical",
79335
+ "alert-error",
79336
+ "alert-critical-resolved"
79337
+ ];
79122
79338
  var UPDATES = [
79123
79339
  "addon-update-available",
79124
79340
  "server-update-available",
@@ -79311,14 +79527,14 @@ var STATE_SUMMARY_VARS = [
79311
79527
  ([...RULE_TEXT], [...CONSUMABLE]),
79312
79528
  ([...RULE_TEXT], [...TANK]),
79313
79529
  [...RULE_TEXT],
79314
- ([...RULE_TEXT], [...UPDATES]),
79315
- ([...RULE_TEXT], [...UPDATES]),
79316
- [...RULE_TEXT],
79530
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
79531
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
79317
79532
  [...RULE_TEXT],
79318
79533
  [...RULE_TEXT],
79319
79534
  [...RULE_TEXT],
79320
79535
  [...RULE_TEXT],
79321
79536
  [...RULE_TEXT],
79537
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79322
79538
  [...RULE_TEXT],
79323
79539
  [...RULE_TEXT],
79324
79540
  [...RULE_TEXT],
@@ -79336,7 +79552,11 @@ var STATE_SUMMARY_VARS = [
79336
79552
  [...RULE_TEXT],
79337
79553
  [...RULE_TEXT],
79338
79554
  [...RULE_TEXT],
79339
- [...RULE_TEXT],
79555
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79556
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79557
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79558
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79559
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79340
79560
  [...RULE_TEXT],
79341
79561
  [...RULE_TEXT],
79342
79562
  [...RULE_TEXT],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-tuya",
3
- "version": "0.2.127",
3
+ "version": "0.2.128",
4
4
  "description": "Tuya / Smart Life device-provider addon for CamStack — account-onboarded (Tuya IoT cloud fetch of device localKeys) + LOCAL DP control via the @apocaliss92/nodetuya encrypted-LAN client, exposing switch / water-heater-family kettle entities",
5
5
  "keywords": [
6
6
  "camstack",