@camstack/addon-provider-tuya 0.2.126 → 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 +341 -37
  2. package/dist/addon.mjs +341 -37
  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-BOjuyoPC.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",
@@ -18369,7 +18385,11 @@ var deviceDiscoveryCapability = {
18369
18385
  };
18370
18386
  /**
18371
18387
  * `device-adoption` — generic discovery + adoption surface,
18372
- * system-scoped singleton. The de-HA-ified successor to `ha-discovery`:
18388
+ * system-scoped collection (one provider per integration addon), routed
18389
+ * by explicit `{ addonId }` on direct `deviceAdoption.*` calls — the same
18390
+ * pin model as `connection-test`. The admin UI keeps using
18391
+ * `deviceManager.adoption*` (which already threads `addonId`). The de-HA-ified
18392
+ * successor to `ha-discovery`:
18373
18393
  * keyed by `integrationId` (the addon resolves integrationId → broker
18374
18394
  * internally) rather than a connection-specific `brokerId`, and it
18375
18395
  * REUSES the shared `DiscoveredChildDevice` candidate type from
@@ -18534,7 +18554,7 @@ var ResyncResultSchema = object({
18534
18554
  var deviceAdoptionCapability = {
18535
18555
  name: "device-adoption",
18536
18556
  scope: "system",
18537
- mode: "singleton",
18557
+ mode: "collection",
18538
18558
  status: {
18539
18559
  schema: AdoptionStatusSchema,
18540
18560
  kind: "poll"
@@ -42717,6 +42737,9 @@ var NcSystemEventKindSchema = _enum([
42717
42737
  "server-updated",
42718
42738
  "export-completed",
42719
42739
  "backup-completed",
42740
+ "alert-critical",
42741
+ "alert-error",
42742
+ "alert-critical-resolved",
42720
42743
  "camera-online",
42721
42744
  "camera-offline",
42722
42745
  "camera-disabled",
@@ -51793,7 +51816,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
51793
51816
  }), method(object({ jobId: string().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
51794
51817
  kind: "mutation",
51795
51818
  auth: "admin"
51796
- }), 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() }), {
51797
51823
  kind: "mutation",
51798
51824
  auth: "admin"
51799
51825
  }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
@@ -56057,6 +56083,11 @@ onStatusChanged: { data: object({
56057
56083
  *
56058
56084
  * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
56059
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.
56060
56091
  */
56061
56092
  var DishwasherStateSchema = _enum([
56062
56093
  "idle",
@@ -56066,35 +56097,155 @@ var DishwasherStateSchema = _enum([
56066
56097
  "error",
56067
56098
  "unavailable"
56068
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
+ ]);
56069
56127
  var DishwasherConsumableLevelSchema = _enum([
56070
56128
  "ok",
56071
56129
  "low",
56072
56130
  "empty"
56073
56131
  ]);
56074
56132
  var DishwasherStatusSchema = object({
56133
+ availability: DishwasherAvailabilitySchema,
56134
+ /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
56075
56135
  state: DishwasherStateSchema,
56076
- /** 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. */
56077
56139
  program: string().nullable(),
56078
- /** 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. */
56079
56143
  availablePrograms: array(string()),
56080
- /** Minutes remaining on the active cycle, or null when not running. */
56081
- 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(),
56082
56148
  /** Cycle completion 0..100, or null when not applicable. */
56083
56149
  progressPercent: number().min(0).max(100).nullable(),
56084
- /** True when the door is reported open. */
56085
- doorOpen: boolean(),
56086
- /** True when remote start is allowed (door closed, power on, etc.). */
56087
- remoteStartAllowed: boolean(),
56088
- /** Main power / switched-on state. */
56089
- 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(),
56090
56164
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56091
56165
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56092
- halfLoad: boolean(),
56093
- 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(),
56169
+ /** Extra dry option when the appliance exposes it. */
56170
+ extraDry: boolean().nullable(),
56171
+ /** Intensive zone (lower basket) when the appliance exposes it. */
56172
+ intensiveZone: boolean().nullable(),
56173
+ /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
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. */
56094
56180
  errorCode: number().nullable(),
56181
+ /** Name of the raised alert-level event while the appliance is in error; null otherwise. */
56095
56182
  errorLabel: string().nullable(),
56183
+ /** Ms epoch of the last value received from the appliance; 0 = never. */
56096
56184
  lastFetchedAt: number()
56097
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
+ });
56098
56249
  var dishwasherCapability = {
56099
56250
  name: "dishwasher",
56100
56251
  scope: "device",
@@ -56102,58 +56253,102 @@ var dishwasherCapability = {
56102
56253
  mode: "singleton",
56103
56254
  deviceTypes: [DeviceType.Dishwasher],
56104
56255
  methods: {
56105
- 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(), {
56106
56265
  kind: "mutation",
56107
56266
  auth: "protected"
56108
56267
  }),
56109
- pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56268
+ pause: method(object({ deviceId: DeviceIdSchema }), _void(), {
56110
56269
  kind: "mutation",
56111
56270
  auth: "protected"
56112
56271
  }),
56113
- stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56272
+ resume: method(object({ deviceId: DeviceIdSchema }), _void(), {
56114
56273
  kind: "mutation",
56115
56274
  auth: "protected"
56116
56275
  }),
56276
+ stop: method(object({ deviceId: DeviceIdSchema }), _void(), {
56277
+ kind: "mutation",
56278
+ auth: "protected"
56279
+ }),
56280
+ /** Select (not start) a program; refused when the appliance does not offer it. */
56117
56281
  setProgram: method(object({
56118
- deviceId: number().int().nonnegative(),
56282
+ deviceId: DeviceIdSchema,
56119
56283
  program: string().min(1)
56120
56284
  }), _void(), {
56121
56285
  kind: "mutation",
56122
56286
  auth: "protected"
56123
56287
  }),
56124
56288
  setPower: method(object({
56125
- deviceId: number().int().nonnegative(),
56289
+ deviceId: DeviceIdSchema,
56126
56290
  on: boolean()
56127
56291
  }), _void(), {
56128
56292
  kind: "mutation",
56129
56293
  auth: "protected"
56130
56294
  }),
56131
56295
  setHalfLoad: method(object({
56132
- deviceId: number().int().nonnegative(),
56296
+ deviceId: DeviceIdSchema,
56133
56297
  on: boolean()
56134
56298
  }), _void(), {
56135
56299
  kind: "mutation",
56136
56300
  auth: "protected"
56137
56301
  }),
56138
56302
  setHygienePlus: method(object({
56139
- deviceId: number().int().nonnegative(),
56303
+ deviceId: DeviceIdSchema,
56140
56304
  on: boolean()
56141
56305
  }), _void(), {
56142
56306
  kind: "mutation",
56143
56307
  auth: "protected"
56144
56308
  }),
56309
+ setExtraDry: method(object({
56310
+ deviceId: DeviceIdSchema,
56311
+ on: boolean()
56312
+ }), _void(), {
56313
+ kind: "mutation",
56314
+ auth: "protected"
56315
+ }),
56316
+ setIntensiveZone: method(object({
56317
+ deviceId: DeviceIdSchema,
56318
+ on: boolean()
56319
+ }), _void(), {
56320
+ kind: "mutation",
56321
+ auth: "protected"
56322
+ }),
56323
+ setVarioSpeedPlus: method(object({
56324
+ deviceId: DeviceIdSchema,
56325
+ on: boolean()
56326
+ }), _void(), {
56327
+ kind: "mutation",
56328
+ auth: "protected"
56329
+ }),
56330
+ setChildLock: method(object({
56331
+ deviceId: DeviceIdSchema,
56332
+ on: boolean()
56333
+ }), _void(), {
56334
+ kind: "mutation",
56335
+ auth: "protected"
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
+ */
56145
56342
  setOption: method(object({
56146
- deviceId: number().int().nonnegative(),
56343
+ deviceId: DeviceIdSchema,
56147
56344
  key: string().min(1),
56148
- value: union([
56149
- boolean(),
56150
- string(),
56151
- number()
56152
- ])
56345
+ value: DishwasherValueSchema
56153
56346
  }), _void(), {
56154
56347
  kind: "mutation",
56155
56348
  auth: "protected"
56156
- })
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" })
56157
56352
  },
56158
56353
  status: {
56159
56354
  schema: DishwasherStatusSchema,
@@ -70102,6 +70297,12 @@ Object.freeze({
70102
70297
  addonId: null,
70103
70298
  access: "view"
70104
70299
  },
70300
+ "dishwasher.getOptions": {
70301
+ capName: "dishwasher",
70302
+ capScope: "device",
70303
+ addonId: null,
70304
+ access: "view"
70305
+ },
70105
70306
  "dishwasher.getStatus": {
70106
70307
  capName: "dishwasher",
70107
70308
  capScope: "device",
@@ -70114,6 +70315,24 @@ Object.freeze({
70114
70315
  addonId: null,
70115
70316
  access: "create"
70116
70317
  },
70318
+ "dishwasher.resume": {
70319
+ capName: "dishwasher",
70320
+ capScope: "device",
70321
+ addonId: null,
70322
+ access: "create"
70323
+ },
70324
+ "dishwasher.setChildLock": {
70325
+ capName: "dishwasher",
70326
+ capScope: "device",
70327
+ addonId: null,
70328
+ access: "create"
70329
+ },
70330
+ "dishwasher.setExtraDry": {
70331
+ capName: "dishwasher",
70332
+ capScope: "device",
70333
+ addonId: null,
70334
+ access: "create"
70335
+ },
70117
70336
  "dishwasher.setHalfLoad": {
70118
70337
  capName: "dishwasher",
70119
70338
  capScope: "device",
@@ -70126,6 +70345,12 @@ Object.freeze({
70126
70345
  addonId: null,
70127
70346
  access: "create"
70128
70347
  },
70348
+ "dishwasher.setIntensiveZone": {
70349
+ capName: "dishwasher",
70350
+ capScope: "device",
70351
+ addonId: null,
70352
+ access: "create"
70353
+ },
70129
70354
  "dishwasher.setOption": {
70130
70355
  capName: "dishwasher",
70131
70356
  capScope: "device",
@@ -70144,6 +70369,12 @@ Object.freeze({
70144
70369
  addonId: null,
70145
70370
  access: "create"
70146
70371
  },
70372
+ "dishwasher.setVarioSpeedPlus": {
70373
+ capName: "dishwasher",
70374
+ capScope: "device",
70375
+ addonId: null,
70376
+ access: "create"
70377
+ },
70147
70378
  "dishwasher.start": {
70148
70379
  capName: "dishwasher",
70149
70380
  capScope: "device",
@@ -74590,6 +74821,12 @@ Object.freeze({
74590
74821
  addonId: null,
74591
74822
  access: "view"
74592
74823
  },
74824
+ "storageMigration.moverClearance": {
74825
+ capName: "storage-migration",
74826
+ capScope: "system",
74827
+ addonId: null,
74828
+ access: "view"
74829
+ },
74593
74830
  "storageMigration.movers": {
74594
74831
  capName: "storage-migration",
74595
74832
  capScope: "system",
@@ -76783,6 +77020,11 @@ Object.freeze({
76783
77020
  form: "single",
76784
77021
  optional: false
76785
77022
  }],
77023
+ "dishwasher.getOptions": [{
77024
+ name: "deviceId",
77025
+ form: "single",
77026
+ optional: false
77027
+ }],
76786
77028
  "dishwasher.getStatus": [{
76787
77029
  name: "deviceId",
76788
77030
  form: "single",
@@ -76793,6 +77035,21 @@ Object.freeze({
76793
77035
  form: "single",
76794
77036
  optional: false
76795
77037
  }],
77038
+ "dishwasher.resume": [{
77039
+ name: "deviceId",
77040
+ form: "single",
77041
+ optional: false
77042
+ }],
77043
+ "dishwasher.setChildLock": [{
77044
+ name: "deviceId",
77045
+ form: "single",
77046
+ optional: false
77047
+ }],
77048
+ "dishwasher.setExtraDry": [{
77049
+ name: "deviceId",
77050
+ form: "single",
77051
+ optional: false
77052
+ }],
76796
77053
  "dishwasher.setHalfLoad": [{
76797
77054
  name: "deviceId",
76798
77055
  form: "single",
@@ -76803,6 +77060,11 @@ Object.freeze({
76803
77060
  form: "single",
76804
77061
  optional: false
76805
77062
  }],
77063
+ "dishwasher.setIntensiveZone": [{
77064
+ name: "deviceId",
77065
+ form: "single",
77066
+ optional: false
77067
+ }],
76806
77068
  "dishwasher.setOption": [{
76807
77069
  name: "deviceId",
76808
77070
  form: "single",
@@ -76818,6 +77080,11 @@ Object.freeze({
76818
77080
  form: "single",
76819
77081
  optional: false
76820
77082
  }],
77083
+ "dishwasher.setVarioSpeedPlus": [{
77084
+ name: "deviceId",
77085
+ form: "single",
77086
+ optional: false
77087
+ }],
76821
77088
  "dishwasher.start": [{
76822
77089
  name: "deviceId",
76823
77090
  form: "single",
@@ -78859,6 +79126,9 @@ new Map(Object.entries({
78859
79126
  "wrapper-update-available": "system",
78860
79127
  "backup-completed": "system",
78861
79128
  "export-completed": "system",
79129
+ "alert-critical": "system",
79130
+ "alert-error": "system",
79131
+ "alert-critical-resolved": "system",
78862
79132
  "storage-location-low": "system",
78863
79133
  "storage-location-critical": "system",
78864
79134
  "storage-location-ok": "system",
@@ -78983,6 +79253,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78983
79253
  "storage-location-ok"
78984
79254
  ]
78985
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
+ },
78986
79266
  {
78987
79267
  id: "alarm",
78988
79268
  family: "alarm",
@@ -79027,6 +79307,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
79027
79307
  return [[descriptor.kind, field]];
79028
79308
  })));
79029
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
+ });
79030
79325
  var RULE_BODY_ONLY = ["body"];
79031
79326
  var RULE_TEXT = ["title", "body"];
79032
79327
  var BATTERY = ["device-battery-low", "device-battery-normal"];
@@ -79036,6 +79331,11 @@ var TANK = [
79036
79331
  "device-tank-full",
79037
79332
  "device-tank-normal"
79038
79333
  ];
79334
+ var ALERT_EPISODE = [
79335
+ "alert-critical",
79336
+ "alert-error",
79337
+ "alert-critical-resolved"
79338
+ ];
79039
79339
  var UPDATES = [
79040
79340
  "addon-update-available",
79041
79341
  "server-update-available",
@@ -79228,14 +79528,14 @@ var STATE_SUMMARY_VARS = [
79228
79528
  ([...RULE_TEXT], [...CONSUMABLE]),
79229
79529
  ([...RULE_TEXT], [...TANK]),
79230
79530
  [...RULE_TEXT],
79231
- ([...RULE_TEXT], [...UPDATES]),
79232
- ([...RULE_TEXT], [...UPDATES]),
79233
- [...RULE_TEXT],
79531
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
79532
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
79234
79533
  [...RULE_TEXT],
79235
79534
  [...RULE_TEXT],
79236
79535
  [...RULE_TEXT],
79237
79536
  [...RULE_TEXT],
79238
79537
  [...RULE_TEXT],
79538
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79239
79539
  [...RULE_TEXT],
79240
79540
  [...RULE_TEXT],
79241
79541
  [...RULE_TEXT],
@@ -79253,7 +79553,11 @@ var STATE_SUMMARY_VARS = [
79253
79553
  [...RULE_TEXT],
79254
79554
  [...RULE_TEXT],
79255
79555
  [...RULE_TEXT],
79256
- [...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]),
79257
79561
  [...RULE_TEXT],
79258
79562
  [...RULE_TEXT],
79259
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-BOjuyoPC.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",
@@ -18368,7 +18384,11 @@ var deviceDiscoveryCapability = {
18368
18384
  };
18369
18385
  /**
18370
18386
  * `device-adoption` — generic discovery + adoption surface,
18371
- * system-scoped singleton. The de-HA-ified successor to `ha-discovery`:
18387
+ * system-scoped collection (one provider per integration addon), routed
18388
+ * by explicit `{ addonId }` on direct `deviceAdoption.*` calls — the same
18389
+ * pin model as `connection-test`. The admin UI keeps using
18390
+ * `deviceManager.adoption*` (which already threads `addonId`). The de-HA-ified
18391
+ * successor to `ha-discovery`:
18372
18392
  * keyed by `integrationId` (the addon resolves integrationId → broker
18373
18393
  * internally) rather than a connection-specific `brokerId`, and it
18374
18394
  * REUSES the shared `DiscoveredChildDevice` candidate type from
@@ -18533,7 +18553,7 @@ var ResyncResultSchema = object({
18533
18553
  var deviceAdoptionCapability = {
18534
18554
  name: "device-adoption",
18535
18555
  scope: "system",
18536
- mode: "singleton",
18556
+ mode: "collection",
18537
18557
  status: {
18538
18558
  schema: AdoptionStatusSchema,
18539
18559
  kind: "poll"
@@ -42716,6 +42736,9 @@ var NcSystemEventKindSchema = _enum([
42716
42736
  "server-updated",
42717
42737
  "export-completed",
42718
42738
  "backup-completed",
42739
+ "alert-critical",
42740
+ "alert-error",
42741
+ "alert-critical-resolved",
42719
42742
  "camera-online",
42720
42743
  "camera-offline",
42721
42744
  "camera-disabled",
@@ -51792,7 +51815,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
51792
51815
  }), method(object({ jobId: string().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
51793
51816
  kind: "mutation",
51794
51817
  auth: "admin"
51795
- }), 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() }), {
51796
51822
  kind: "mutation",
51797
51823
  auth: "admin"
51798
51824
  }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
@@ -56056,6 +56082,11 @@ onStatusChanged: { data: object({
56056
56082
  *
56057
56083
  * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
56058
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.
56059
56090
  */
56060
56091
  var DishwasherStateSchema = _enum([
56061
56092
  "idle",
@@ -56065,35 +56096,155 @@ var DishwasherStateSchema = _enum([
56065
56096
  "error",
56066
56097
  "unavailable"
56067
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
+ ]);
56068
56126
  var DishwasherConsumableLevelSchema = _enum([
56069
56127
  "ok",
56070
56128
  "low",
56071
56129
  "empty"
56072
56130
  ]);
56073
56131
  var DishwasherStatusSchema = object({
56132
+ availability: DishwasherAvailabilitySchema,
56133
+ /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
56074
56134
  state: DishwasherStateSchema,
56075
- /** 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. */
56076
56138
  program: string().nullable(),
56077
- /** 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. */
56078
56142
  availablePrograms: array(string()),
56079
- /** Minutes remaining on the active cycle, or null when not running. */
56080
- 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(),
56081
56147
  /** Cycle completion 0..100, or null when not applicable. */
56082
56148
  progressPercent: number().min(0).max(100).nullable(),
56083
- /** True when the door is reported open. */
56084
- doorOpen: boolean(),
56085
- /** True when remote start is allowed (door closed, power on, etc.). */
56086
- remoteStartAllowed: boolean(),
56087
- /** Main power / switched-on state. */
56088
- 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(),
56089
56163
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56090
56164
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56091
- halfLoad: boolean(),
56092
- 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(),
56168
+ /** Extra dry option when the appliance exposes it. */
56169
+ extraDry: boolean().nullable(),
56170
+ /** Intensive zone (lower basket) when the appliance exposes it. */
56171
+ intensiveZone: boolean().nullable(),
56172
+ /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
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. */
56093
56179
  errorCode: number().nullable(),
56180
+ /** Name of the raised alert-level event while the appliance is in error; null otherwise. */
56094
56181
  errorLabel: string().nullable(),
56182
+ /** Ms epoch of the last value received from the appliance; 0 = never. */
56095
56183
  lastFetchedAt: number()
56096
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
+ });
56097
56248
  var dishwasherCapability = {
56098
56249
  name: "dishwasher",
56099
56250
  scope: "device",
@@ -56101,58 +56252,102 @@ var dishwasherCapability = {
56101
56252
  mode: "singleton",
56102
56253
  deviceTypes: [DeviceType.Dishwasher],
56103
56254
  methods: {
56104
- 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(), {
56105
56264
  kind: "mutation",
56106
56265
  auth: "protected"
56107
56266
  }),
56108
- pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56267
+ pause: method(object({ deviceId: DeviceIdSchema }), _void(), {
56109
56268
  kind: "mutation",
56110
56269
  auth: "protected"
56111
56270
  }),
56112
- stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56271
+ resume: method(object({ deviceId: DeviceIdSchema }), _void(), {
56113
56272
  kind: "mutation",
56114
56273
  auth: "protected"
56115
56274
  }),
56275
+ stop: method(object({ deviceId: DeviceIdSchema }), _void(), {
56276
+ kind: "mutation",
56277
+ auth: "protected"
56278
+ }),
56279
+ /** Select (not start) a program; refused when the appliance does not offer it. */
56116
56280
  setProgram: method(object({
56117
- deviceId: number().int().nonnegative(),
56281
+ deviceId: DeviceIdSchema,
56118
56282
  program: string().min(1)
56119
56283
  }), _void(), {
56120
56284
  kind: "mutation",
56121
56285
  auth: "protected"
56122
56286
  }),
56123
56287
  setPower: method(object({
56124
- deviceId: number().int().nonnegative(),
56288
+ deviceId: DeviceIdSchema,
56125
56289
  on: boolean()
56126
56290
  }), _void(), {
56127
56291
  kind: "mutation",
56128
56292
  auth: "protected"
56129
56293
  }),
56130
56294
  setHalfLoad: method(object({
56131
- deviceId: number().int().nonnegative(),
56295
+ deviceId: DeviceIdSchema,
56132
56296
  on: boolean()
56133
56297
  }), _void(), {
56134
56298
  kind: "mutation",
56135
56299
  auth: "protected"
56136
56300
  }),
56137
56301
  setHygienePlus: method(object({
56138
- deviceId: number().int().nonnegative(),
56302
+ deviceId: DeviceIdSchema,
56139
56303
  on: boolean()
56140
56304
  }), _void(), {
56141
56305
  kind: "mutation",
56142
56306
  auth: "protected"
56143
56307
  }),
56308
+ setExtraDry: method(object({
56309
+ deviceId: DeviceIdSchema,
56310
+ on: boolean()
56311
+ }), _void(), {
56312
+ kind: "mutation",
56313
+ auth: "protected"
56314
+ }),
56315
+ setIntensiveZone: method(object({
56316
+ deviceId: DeviceIdSchema,
56317
+ on: boolean()
56318
+ }), _void(), {
56319
+ kind: "mutation",
56320
+ auth: "protected"
56321
+ }),
56322
+ setVarioSpeedPlus: method(object({
56323
+ deviceId: DeviceIdSchema,
56324
+ on: boolean()
56325
+ }), _void(), {
56326
+ kind: "mutation",
56327
+ auth: "protected"
56328
+ }),
56329
+ setChildLock: method(object({
56330
+ deviceId: DeviceIdSchema,
56331
+ on: boolean()
56332
+ }), _void(), {
56333
+ kind: "mutation",
56334
+ auth: "protected"
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
+ */
56144
56341
  setOption: method(object({
56145
- deviceId: number().int().nonnegative(),
56342
+ deviceId: DeviceIdSchema,
56146
56343
  key: string().min(1),
56147
- value: union([
56148
- boolean(),
56149
- string(),
56150
- number()
56151
- ])
56344
+ value: DishwasherValueSchema
56152
56345
  }), _void(), {
56153
56346
  kind: "mutation",
56154
56347
  auth: "protected"
56155
- })
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" })
56156
56351
  },
56157
56352
  status: {
56158
56353
  schema: DishwasherStatusSchema,
@@ -70101,6 +70296,12 @@ Object.freeze({
70101
70296
  addonId: null,
70102
70297
  access: "view"
70103
70298
  },
70299
+ "dishwasher.getOptions": {
70300
+ capName: "dishwasher",
70301
+ capScope: "device",
70302
+ addonId: null,
70303
+ access: "view"
70304
+ },
70104
70305
  "dishwasher.getStatus": {
70105
70306
  capName: "dishwasher",
70106
70307
  capScope: "device",
@@ -70113,6 +70314,24 @@ Object.freeze({
70113
70314
  addonId: null,
70114
70315
  access: "create"
70115
70316
  },
70317
+ "dishwasher.resume": {
70318
+ capName: "dishwasher",
70319
+ capScope: "device",
70320
+ addonId: null,
70321
+ access: "create"
70322
+ },
70323
+ "dishwasher.setChildLock": {
70324
+ capName: "dishwasher",
70325
+ capScope: "device",
70326
+ addonId: null,
70327
+ access: "create"
70328
+ },
70329
+ "dishwasher.setExtraDry": {
70330
+ capName: "dishwasher",
70331
+ capScope: "device",
70332
+ addonId: null,
70333
+ access: "create"
70334
+ },
70116
70335
  "dishwasher.setHalfLoad": {
70117
70336
  capName: "dishwasher",
70118
70337
  capScope: "device",
@@ -70125,6 +70344,12 @@ Object.freeze({
70125
70344
  addonId: null,
70126
70345
  access: "create"
70127
70346
  },
70347
+ "dishwasher.setIntensiveZone": {
70348
+ capName: "dishwasher",
70349
+ capScope: "device",
70350
+ addonId: null,
70351
+ access: "create"
70352
+ },
70128
70353
  "dishwasher.setOption": {
70129
70354
  capName: "dishwasher",
70130
70355
  capScope: "device",
@@ -70143,6 +70368,12 @@ Object.freeze({
70143
70368
  addonId: null,
70144
70369
  access: "create"
70145
70370
  },
70371
+ "dishwasher.setVarioSpeedPlus": {
70372
+ capName: "dishwasher",
70373
+ capScope: "device",
70374
+ addonId: null,
70375
+ access: "create"
70376
+ },
70146
70377
  "dishwasher.start": {
70147
70378
  capName: "dishwasher",
70148
70379
  capScope: "device",
@@ -74589,6 +74820,12 @@ Object.freeze({
74589
74820
  addonId: null,
74590
74821
  access: "view"
74591
74822
  },
74823
+ "storageMigration.moverClearance": {
74824
+ capName: "storage-migration",
74825
+ capScope: "system",
74826
+ addonId: null,
74827
+ access: "view"
74828
+ },
74592
74829
  "storageMigration.movers": {
74593
74830
  capName: "storage-migration",
74594
74831
  capScope: "system",
@@ -76782,6 +77019,11 @@ Object.freeze({
76782
77019
  form: "single",
76783
77020
  optional: false
76784
77021
  }],
77022
+ "dishwasher.getOptions": [{
77023
+ name: "deviceId",
77024
+ form: "single",
77025
+ optional: false
77026
+ }],
76785
77027
  "dishwasher.getStatus": [{
76786
77028
  name: "deviceId",
76787
77029
  form: "single",
@@ -76792,6 +77034,21 @@ Object.freeze({
76792
77034
  form: "single",
76793
77035
  optional: false
76794
77036
  }],
77037
+ "dishwasher.resume": [{
77038
+ name: "deviceId",
77039
+ form: "single",
77040
+ optional: false
77041
+ }],
77042
+ "dishwasher.setChildLock": [{
77043
+ name: "deviceId",
77044
+ form: "single",
77045
+ optional: false
77046
+ }],
77047
+ "dishwasher.setExtraDry": [{
77048
+ name: "deviceId",
77049
+ form: "single",
77050
+ optional: false
77051
+ }],
76795
77052
  "dishwasher.setHalfLoad": [{
76796
77053
  name: "deviceId",
76797
77054
  form: "single",
@@ -76802,6 +77059,11 @@ Object.freeze({
76802
77059
  form: "single",
76803
77060
  optional: false
76804
77061
  }],
77062
+ "dishwasher.setIntensiveZone": [{
77063
+ name: "deviceId",
77064
+ form: "single",
77065
+ optional: false
77066
+ }],
76805
77067
  "dishwasher.setOption": [{
76806
77068
  name: "deviceId",
76807
77069
  form: "single",
@@ -76817,6 +77079,11 @@ Object.freeze({
76817
77079
  form: "single",
76818
77080
  optional: false
76819
77081
  }],
77082
+ "dishwasher.setVarioSpeedPlus": [{
77083
+ name: "deviceId",
77084
+ form: "single",
77085
+ optional: false
77086
+ }],
76820
77087
  "dishwasher.start": [{
76821
77088
  name: "deviceId",
76822
77089
  form: "single",
@@ -78858,6 +79125,9 @@ new Map(Object.entries({
78858
79125
  "wrapper-update-available": "system",
78859
79126
  "backup-completed": "system",
78860
79127
  "export-completed": "system",
79128
+ "alert-critical": "system",
79129
+ "alert-error": "system",
79130
+ "alert-critical-resolved": "system",
78861
79131
  "storage-location-low": "system",
78862
79132
  "storage-location-critical": "system",
78863
79133
  "storage-location-ok": "system",
@@ -78982,6 +79252,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78982
79252
  "storage-location-ok"
78983
79253
  ]
78984
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
+ },
78985
79265
  {
78986
79266
  id: "alarm",
78987
79267
  family: "alarm",
@@ -79026,6 +79306,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
79026
79306
  return [[descriptor.kind, field]];
79027
79307
  })));
79028
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
+ });
79029
79324
  var RULE_BODY_ONLY = ["body"];
79030
79325
  var RULE_TEXT = ["title", "body"];
79031
79326
  var BATTERY = ["device-battery-low", "device-battery-normal"];
@@ -79035,6 +79330,11 @@ var TANK = [
79035
79330
  "device-tank-full",
79036
79331
  "device-tank-normal"
79037
79332
  ];
79333
+ var ALERT_EPISODE = [
79334
+ "alert-critical",
79335
+ "alert-error",
79336
+ "alert-critical-resolved"
79337
+ ];
79038
79338
  var UPDATES = [
79039
79339
  "addon-update-available",
79040
79340
  "server-update-available",
@@ -79227,14 +79527,14 @@ var STATE_SUMMARY_VARS = [
79227
79527
  ([...RULE_TEXT], [...CONSUMABLE]),
79228
79528
  ([...RULE_TEXT], [...TANK]),
79229
79529
  [...RULE_TEXT],
79230
- ([...RULE_TEXT], [...UPDATES]),
79231
- ([...RULE_TEXT], [...UPDATES]),
79232
- [...RULE_TEXT],
79530
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
79531
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
79233
79532
  [...RULE_TEXT],
79234
79533
  [...RULE_TEXT],
79235
79534
  [...RULE_TEXT],
79236
79535
  [...RULE_TEXT],
79237
79536
  [...RULE_TEXT],
79537
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
79238
79538
  [...RULE_TEXT],
79239
79539
  [...RULE_TEXT],
79240
79540
  [...RULE_TEXT],
@@ -79252,7 +79552,11 @@ var STATE_SUMMARY_VARS = [
79252
79552
  [...RULE_TEXT],
79253
79553
  [...RULE_TEXT],
79254
79554
  [...RULE_TEXT],
79255
- [...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]),
79256
79560
  [...RULE_TEXT],
79257
79561
  [...RULE_TEXT],
79258
79562
  [...RULE_TEXT],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-tuya",
3
- "version": "0.2.126",
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",