@camstack/addon-provider-homeassistant 1.2.601 → 1.2.602

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/addon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("./dist-BXMUyWXo.js");
2
+ const require_dist = require("./dist-xuu2eG_W.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_zlib = require("node:zlib");
5
5
  //#region src/ha-admin-link.ts
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { A as connectivityCapability, At as boolean, B as floodCapability, Bt as EventCategory, C as buildAddonRouteProvider, Ct as defineEntryKind, D as carbonMonoxideCapability, Dt as settingsBrokersAdoptsFrom, E as calendarSourceCapability, F as deviceAdoptionCapability, Ft as record, G as lawnMowerControlCapability, H as humidifierCapability, It as string, J as motionCapability, K as lockControlCapability, L as enumSensorCapability, Lt as union, M as controlCapability, Mt as literal, N as coverCapability, Nt as number, O as climateControlCapability, Ot as _enum, P as deviceAdminLinkCapability, Pt as object, Q as numericSensorCapability, R as eventEmitterCapability, Rt as unknown, S as brokerCapability, St as createEvent, T as buttonCapability, Tt as entryBody, U as humiditySensorCapability, V as gasCapability, W as imageCapability, X as notificationOutputCapability, Y as normalizeUnit, Z as notifierCapability, _ as automationControlCapability, _t as DeviceRole, at as scriptRunnerCapability, b as binaryCapability, ct as tamperCapability, d as TargetSchema, dt as vacuumControlCapability, et as parseAdminBase, f as accessoriesCapability, ft as valveCapability, g as ambientLightSensorCapability, gt as DeviceFeature, h as alarmPanelCapability, ht as weatherCapability, it as pressureSensorCapability, j as contactCapability, jt as discriminatedUnion, k as colorCapability, kt as array, lt as temperatureSensorCapability, m as airQualitySensorCapability, mt as waterHeaterCapability, n as BaseDevice, nt as prepareNotification, ot as smokeCapability, p as addonRoutesCapability, pt as vibrationCapability, q as mediaPlayerCapability, r as BaseDeviceProvider, rt as presenceCapability, s as EnumSensorDateTimeFormatSchema, st as switchCapability, tt as powerMeterCapability, ut as updateCapability, v as batteryCapability, vt as DeviceType, w as buildDeviceAdminUrl, wt as defineRecordKinds, x as brightnessCapability, xt as RecordSecretUnavailableError, y as bestLocationMatch, yt as errMsg, z as fanControlCapability, zt as url } from "./dist-BQLjEZxA.mjs";
1
+ import { A as connectivityCapability, At as boolean, B as floodCapability, Bt as EventCategory, C as buildAddonRouteProvider, Ct as defineEntryKind, D as carbonMonoxideCapability, Dt as settingsBrokersAdoptsFrom, E as calendarSourceCapability, F as deviceAdoptionCapability, Ft as record, G as lawnMowerControlCapability, H as humidifierCapability, It as string, J as motionCapability, K as lockControlCapability, L as enumSensorCapability, Lt as union, M as controlCapability, Mt as literal, N as coverCapability, Nt as number, O as climateControlCapability, Ot as _enum, P as deviceAdminLinkCapability, Pt as object, Q as numericSensorCapability, R as eventEmitterCapability, Rt as unknown, S as brokerCapability, St as createEvent, T as buttonCapability, Tt as entryBody, U as humiditySensorCapability, V as gasCapability, W as imageCapability, X as notificationOutputCapability, Y as normalizeUnit, Z as notifierCapability, _ as automationControlCapability, _t as DeviceRole, at as scriptRunnerCapability, b as binaryCapability, ct as tamperCapability, d as TargetSchema, dt as vacuumControlCapability, et as parseAdminBase, f as accessoriesCapability, ft as valveCapability, g as ambientLightSensorCapability, gt as DeviceFeature, h as alarmPanelCapability, ht as weatherCapability, it as pressureSensorCapability, j as contactCapability, jt as discriminatedUnion, k as colorCapability, kt as array, lt as temperatureSensorCapability, m as airQualitySensorCapability, mt as waterHeaterCapability, n as BaseDevice, nt as prepareNotification, ot as smokeCapability, p as addonRoutesCapability, pt as vibrationCapability, q as mediaPlayerCapability, r as BaseDeviceProvider, rt as presenceCapability, s as EnumSensorDateTimeFormatSchema, st as switchCapability, tt as powerMeterCapability, ut as updateCapability, v as batteryCapability, vt as DeviceType, w as buildDeviceAdminUrl, wt as defineRecordKinds, x as brightnessCapability, xt as RecordSecretUnavailableError, y as bestLocationMatch, yt as errMsg, z as fanControlCapability, zt as url } from "./dist-Dcum8auE.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { brotliCompressSync, deflateSync, gzipSync } from "node:zlib";
4
4
  //#region src/ha-admin-link.ts
@@ -5537,7 +5537,7 @@ var ZodIssueCode = {
5537
5537
  var ZodFirstPartyTypeKind;
5538
5538
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5539
5539
  //#endregion
5540
- //#region ../types/dist/sleep-bZIhUvjd.mjs
5540
+ //#region ../types/dist/sleep-BOjuyoPC.mjs
5541
5541
  /**
5542
5542
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5543
5543
  * window to float samples (D455).
@@ -8815,7 +8815,7 @@ object({
8815
8815
  params: record(string(), union([string(), number()])).optional()
8816
8816
  });
8817
8817
  //#endregion
8818
- //#region ../types/dist/err-msg--2RrYiLO.mjs
8818
+ //#region ../types/dist/err-msg-BXKzRBwg.mjs
8819
8819
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8820
8820
  DeviceType["Camera"] = "camera";
8821
8821
  DeviceType["Hub"] = "hub";
@@ -8907,6 +8907,10 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
8907
8907
  * native PetKit (`nodepetkit` `FeederDevice`), reusable by other feeder
8908
8908
  * integrations sharing the same food/desiccant/hopper surface. */
8909
8909
  DeviceType["PetFeeder"] = "pet-feeder";
8910
+ /** Built-in dishwasher — program lifecycle, door / remote-start gates,
8911
+ * salt and rinse-aid levels. Installed with the `dishwasher` cap.
8912
+ * Sources: native Bosch Home Connect, reusable by similar integrations. */
8913
+ DeviceType["Dishwasher"] = "dishwasher";
8910
8914
  return DeviceType;
8911
8915
  }({});
8912
8916
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -9164,7 +9168,7 @@ function errMsg(err) {
9164
9168
  return String(err);
9165
9169
  }
9166
9170
  //#endregion
9167
- //#region ../types/dist/composition-DOwQB_Ua.mjs
9171
+ //#region ../types/dist/composition-CB6PMT9p.mjs
9168
9172
  /**
9169
9173
  * The ffmpeg build every CamStack node downloads, per platform and arch.
9170
9174
  *
@@ -13713,8 +13717,13 @@ var AlertSeveritySchema = _enum([
13713
13717
  "info",
13714
13718
  "success",
13715
13719
  "warning",
13716
- "error"
13720
+ "error",
13721
+ "critical"
13717
13722
  ]);
13723
+ var AlertActionSchema = object({
13724
+ label: string(),
13725
+ href: string().optional()
13726
+ });
13718
13727
  var AlertStatusSchema = _enum([
13719
13728
  "active",
13720
13729
  "in-progress",
@@ -13732,6 +13741,7 @@ var AlertSchema = object({
13732
13741
  severity: AlertSeveritySchema,
13733
13742
  title: string(),
13734
13743
  message: string(),
13744
+ action: AlertActionSchema.optional(),
13735
13745
  status: AlertStatusSchema,
13736
13746
  progress: number().optional(),
13737
13747
  read: boolean(),
@@ -54666,7 +54676,8 @@ var batteryCapability = {
54666
54676
  DeviceType.Button,
54667
54677
  DeviceType.Switch,
54668
54678
  DeviceType.PetFeeder,
54669
- DeviceType.Container
54679
+ DeviceType.Container,
54680
+ DeviceType.Thermostat
54670
54681
  ],
54671
54682
  methods: {
54672
54683
  /**
@@ -56166,6 +56177,125 @@ onStatusChanged: { data: object({
56166
56177
  * whether persisting is worth a SQLite commit. */
56167
56178
  volatileStateFields: ["lastChangedAt"]
56168
56179
  };
56180
+ /**
56181
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56182
+ * consumable levels (salt, rinse aid) and common program options.
56183
+ *
56184
+ * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56185
+ * by any integration that exposes the same program / option surface.
56186
+ *
56187
+ * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
56188
+ * provider refreshes the slice on an interval and eagerly after commands.
56189
+ */
56190
+ var DishwasherStateSchema = _enum([
56191
+ "idle",
56192
+ "running",
56193
+ "paused",
56194
+ "finished",
56195
+ "error",
56196
+ "unavailable"
56197
+ ]);
56198
+ var DishwasherConsumableLevelSchema = _enum([
56199
+ "ok",
56200
+ "low",
56201
+ "empty"
56202
+ ]);
56203
+ var DishwasherStatusSchema = object({
56204
+ state: DishwasherStateSchema,
56205
+ /** Active program id/name, or null when none selected / unknown. */
56206
+ program: string().nullable(),
56207
+ /** Program tokens the hardware accepts — drives the UI selector. */
56208
+ availablePrograms: array(string()),
56209
+ /** Minutes remaining on the active cycle, or null when not running. */
56210
+ remainingMinutes: number().int().nonnegative().nullable(),
56211
+ /** Cycle completion 0..100, or null when not applicable. */
56212
+ progressPercent: number().min(0).max(100).nullable(),
56213
+ /** True when the door is reported open. */
56214
+ doorOpen: boolean(),
56215
+ /** True when remote start is allowed (door closed, power on, etc.). */
56216
+ remoteStartAllowed: boolean(),
56217
+ /** Main power / switched-on state. */
56218
+ powerOn: boolean(),
56219
+ saltLevel: DishwasherConsumableLevelSchema.nullable(),
56220
+ rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56221
+ halfLoad: boolean(),
56222
+ hygienePlus: boolean(),
56223
+ errorCode: number().nullable(),
56224
+ errorLabel: string().nullable(),
56225
+ lastFetchedAt: number()
56226
+ });
56227
+ var dishwasherCapability = {
56228
+ name: "dishwasher",
56229
+ scope: "device",
56230
+ deviceNative: true,
56231
+ mode: "singleton",
56232
+ deviceTypes: [DeviceType.Dishwasher],
56233
+ methods: {
56234
+ start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56235
+ kind: "mutation",
56236
+ auth: "protected"
56237
+ }),
56238
+ pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56239
+ kind: "mutation",
56240
+ auth: "protected"
56241
+ }),
56242
+ stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56243
+ kind: "mutation",
56244
+ auth: "protected"
56245
+ }),
56246
+ setProgram: method(object({
56247
+ deviceId: number().int().nonnegative(),
56248
+ program: string().min(1)
56249
+ }), _void(), {
56250
+ kind: "mutation",
56251
+ auth: "protected"
56252
+ }),
56253
+ setPower: method(object({
56254
+ deviceId: number().int().nonnegative(),
56255
+ on: boolean()
56256
+ }), _void(), {
56257
+ kind: "mutation",
56258
+ auth: "protected"
56259
+ }),
56260
+ setHalfLoad: method(object({
56261
+ deviceId: number().int().nonnegative(),
56262
+ on: boolean()
56263
+ }), _void(), {
56264
+ kind: "mutation",
56265
+ auth: "protected"
56266
+ }),
56267
+ setHygienePlus: method(object({
56268
+ deviceId: number().int().nonnegative(),
56269
+ on: boolean()
56270
+ }), _void(), {
56271
+ kind: "mutation",
56272
+ auth: "protected"
56273
+ }),
56274
+ setOption: method(object({
56275
+ deviceId: number().int().nonnegative(),
56276
+ key: string().min(1),
56277
+ value: union([
56278
+ boolean(),
56279
+ string(),
56280
+ number()
56281
+ ])
56282
+ }), _void(), {
56283
+ kind: "mutation",
56284
+ auth: "protected"
56285
+ })
56286
+ },
56287
+ status: {
56288
+ schema: DishwasherStatusSchema,
56289
+ kind: "poll"
56290
+ },
56291
+ runtimeState: DishwasherStatusSchema,
56292
+ durability: "session",
56293
+ history: { fields: { progressPercent: {
56294
+ kind: "gauge",
56295
+ unit: "%",
56296
+ deadband: 2
56297
+ } } }
56298
+ };
56169
56299
  var DoorbellStatusSchema = object({
56170
56300
  /** Ms epoch of the last press. null = never observed since this provider started. */
56171
56301
  lastPressedAt: number().nullable(),
@@ -56968,6 +57098,32 @@ var gasCapability = {
56968
57098
  * whether persisting is worth a SQLite commit. */
56969
57099
  volatileStateFields: ["lastChangedAt"]
56970
57100
  };
57101
+ var HeatingValveStatusSchema = object({
57102
+ /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
57103
+ position: number().min(0).max(100).nullable(),
57104
+ /** Ms epoch when the slice was last updated (push or poll). */
57105
+ lastFetchedAt: number()
57106
+ });
57107
+ var heatingValveCapability = {
57108
+ name: "heating-valve",
57109
+ scope: "device",
57110
+ deviceNative: true,
57111
+ mode: "singleton",
57112
+ deviceTypes: [DeviceType.Thermostat],
57113
+ methods: {},
57114
+ status: {
57115
+ schema: HeatingValveStatusSchema,
57116
+ kind: "push"
57117
+ },
57118
+ runtimeState: HeatingValveStatusSchema,
57119
+ durability: "session",
57120
+ history: { fields: { position: {
57121
+ kind: "gauge",
57122
+ unit: "%",
57123
+ deadband: 1
57124
+ } } },
57125
+ volatileStateFields: ["lastFetchedAt"]
57126
+ };
56971
57127
  /**
56972
57128
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
56973
57129
  * an on/off actuator with an optional target-humidity setpoint and an
@@ -66388,6 +66544,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
66388
66544
  dayNight: dayNightCapability,
66389
66545
  deviceDiscovery: deviceDiscoveryCapability,
66390
66546
  deviceStatus: deviceStatusCapability,
66547
+ dishwasher: dishwasherCapability,
66391
66548
  doorbell: doorbellCapability,
66392
66549
  enumSensor: enumSensorCapability,
66393
66550
  eventEmitter: eventEmitterCapability,
@@ -66395,6 +66552,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
66395
66552
  featureProbe: featureProbeCapability,
66396
66553
  flood: floodCapability,
66397
66554
  gas: gasCapability,
66555
+ heatingValve: heatingValveCapability,
66398
66556
  humidifier: humidifierCapability,
66399
66557
  humiditySensor: humiditySensorCapability,
66400
66558
  image: imageCapability,
@@ -67120,6 +67278,12 @@ var BaseDeviceProvider = class extends BaseAddon {
67120
67278
  provider: this
67121
67279
  }];
67122
67280
  }
67281
+ /** Flatten `super.onInitialize()` whether it returned an array or an envelope. */
67282
+ providerRegistrationsFromSuper(result) {
67283
+ if (Array.isArray(result)) return result;
67284
+ if (result !== void 0 && result.providers !== void 0) return [...result.providers];
67285
+ return [];
67286
+ }
67123
67287
  async onShutdown() {
67124
67288
  this._restoreShuttingDown = true;
67125
67289
  this.cancelRestoreRetries();
@@ -67646,7 +67810,7 @@ var BaseDeviceProvider = class extends BaseAddon {
67646
67810
  return toDeviceSummary(device, this.addonId);
67647
67811
  }
67648
67812
  };
67649
- DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
67813
+ DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher;
67650
67814
  new Set(Object.values(DeviceType));
67651
67815
  Object.freeze({
67652
67816
  "accessories.getStatus": {
@@ -70067,6 +70231,60 @@ Object.freeze({
70067
70231
  addonId: null,
70068
70232
  access: "view"
70069
70233
  },
70234
+ "dishwasher.getStatus": {
70235
+ capName: "dishwasher",
70236
+ capScope: "device",
70237
+ addonId: null,
70238
+ access: "view"
70239
+ },
70240
+ "dishwasher.pause": {
70241
+ capName: "dishwasher",
70242
+ capScope: "device",
70243
+ addonId: null,
70244
+ access: "create"
70245
+ },
70246
+ "dishwasher.setHalfLoad": {
70247
+ capName: "dishwasher",
70248
+ capScope: "device",
70249
+ addonId: null,
70250
+ access: "create"
70251
+ },
70252
+ "dishwasher.setHygienePlus": {
70253
+ capName: "dishwasher",
70254
+ capScope: "device",
70255
+ addonId: null,
70256
+ access: "create"
70257
+ },
70258
+ "dishwasher.setOption": {
70259
+ capName: "dishwasher",
70260
+ capScope: "device",
70261
+ addonId: null,
70262
+ access: "create"
70263
+ },
70264
+ "dishwasher.setPower": {
70265
+ capName: "dishwasher",
70266
+ capScope: "device",
70267
+ addonId: null,
70268
+ access: "create"
70269
+ },
70270
+ "dishwasher.setProgram": {
70271
+ capName: "dishwasher",
70272
+ capScope: "device",
70273
+ addonId: null,
70274
+ access: "create"
70275
+ },
70276
+ "dishwasher.start": {
70277
+ capName: "dishwasher",
70278
+ capScope: "device",
70279
+ addonId: null,
70280
+ access: "create"
70281
+ },
70282
+ "dishwasher.stop": {
70283
+ capName: "dishwasher",
70284
+ capScope: "device",
70285
+ addonId: null,
70286
+ access: "create"
70287
+ },
70070
70288
  "doorbell.getStatus": {
70071
70289
  capName: "doorbell",
70072
70290
  capScope: "device",
@@ -70277,6 +70495,12 @@ Object.freeze({
70277
70495
  addonId: null,
70278
70496
  access: "view"
70279
70497
  },
70498
+ "heatingValve.getStatus": {
70499
+ capName: "heating-valve",
70500
+ capScope: "device",
70501
+ addonId: null,
70502
+ access: "view"
70503
+ },
70280
70504
  "humidifier.getStatus": {
70281
70505
  capName: "humidifier",
70282
70506
  capScope: "device",
@@ -75864,7 +76088,7 @@ Object.freeze({
75864
76088
  access: "create"
75865
76089
  }
75866
76090
  });
75867
- DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
76091
+ DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher;
75868
76092
  DeviceFeature.BatteryOperated;
75869
76093
  Object.freeze({
75870
76094
  "accessories.getStatus": [{
@@ -76688,6 +76912,51 @@ Object.freeze({
76688
76912
  form: "single",
76689
76913
  optional: false
76690
76914
  }],
76915
+ "dishwasher.getStatus": [{
76916
+ name: "deviceId",
76917
+ form: "single",
76918
+ optional: false
76919
+ }],
76920
+ "dishwasher.pause": [{
76921
+ name: "deviceId",
76922
+ form: "single",
76923
+ optional: false
76924
+ }],
76925
+ "dishwasher.setHalfLoad": [{
76926
+ name: "deviceId",
76927
+ form: "single",
76928
+ optional: false
76929
+ }],
76930
+ "dishwasher.setHygienePlus": [{
76931
+ name: "deviceId",
76932
+ form: "single",
76933
+ optional: false
76934
+ }],
76935
+ "dishwasher.setOption": [{
76936
+ name: "deviceId",
76937
+ form: "single",
76938
+ optional: false
76939
+ }],
76940
+ "dishwasher.setPower": [{
76941
+ name: "deviceId",
76942
+ form: "single",
76943
+ optional: false
76944
+ }],
76945
+ "dishwasher.setProgram": [{
76946
+ name: "deviceId",
76947
+ form: "single",
76948
+ optional: false
76949
+ }],
76950
+ "dishwasher.start": [{
76951
+ name: "deviceId",
76952
+ form: "single",
76953
+ optional: false
76954
+ }],
76955
+ "dishwasher.stop": [{
76956
+ name: "deviceId",
76957
+ form: "single",
76958
+ optional: false
76959
+ }],
76691
76960
  "doorbell.getStatus": [{
76692
76961
  name: "deviceId",
76693
76962
  form: "single",
@@ -76757,6 +77026,11 @@ Object.freeze({
76757
77026
  form: "single",
76758
77027
  optional: false
76759
77028
  }],
77029
+ "heatingValve.getStatus": [{
77030
+ name: "deviceId",
77031
+ form: "single",
77032
+ optional: false
77033
+ }],
76760
77034
  "humidifier.getStatus": [{
76761
77035
  name: "deviceId",
76762
77036
  form: "single",
@@ -5538,7 +5538,7 @@ var ZodIssueCode = {
5538
5538
  var ZodFirstPartyTypeKind;
5539
5539
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5540
5540
  //#endregion
5541
- //#region ../types/dist/sleep-bZIhUvjd.mjs
5541
+ //#region ../types/dist/sleep-BOjuyoPC.mjs
5542
5542
  /**
5543
5543
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5544
5544
  * window to float samples (D455).
@@ -8816,7 +8816,7 @@ object({
8816
8816
  params: record(string(), union([string(), number()])).optional()
8817
8817
  });
8818
8818
  //#endregion
8819
- //#region ../types/dist/err-msg--2RrYiLO.mjs
8819
+ //#region ../types/dist/err-msg-BXKzRBwg.mjs
8820
8820
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8821
8821
  DeviceType["Camera"] = "camera";
8822
8822
  DeviceType["Hub"] = "hub";
@@ -8908,6 +8908,10 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
8908
8908
  * native PetKit (`nodepetkit` `FeederDevice`), reusable by other feeder
8909
8909
  * integrations sharing the same food/desiccant/hopper surface. */
8910
8910
  DeviceType["PetFeeder"] = "pet-feeder";
8911
+ /** Built-in dishwasher — program lifecycle, door / remote-start gates,
8912
+ * salt and rinse-aid levels. Installed with the `dishwasher` cap.
8913
+ * Sources: native Bosch Home Connect, reusable by similar integrations. */
8914
+ DeviceType["Dishwasher"] = "dishwasher";
8911
8915
  return DeviceType;
8912
8916
  }({});
8913
8917
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -9165,7 +9169,7 @@ function errMsg(err) {
9165
9169
  return String(err);
9166
9170
  }
9167
9171
  //#endregion
9168
- //#region ../types/dist/composition-DOwQB_Ua.mjs
9172
+ //#region ../types/dist/composition-CB6PMT9p.mjs
9169
9173
  /**
9170
9174
  * The ffmpeg build every CamStack node downloads, per platform and arch.
9171
9175
  *
@@ -13714,8 +13718,13 @@ var AlertSeveritySchema = _enum([
13714
13718
  "info",
13715
13719
  "success",
13716
13720
  "warning",
13717
- "error"
13721
+ "error",
13722
+ "critical"
13718
13723
  ]);
13724
+ var AlertActionSchema = object({
13725
+ label: string(),
13726
+ href: string().optional()
13727
+ });
13719
13728
  var AlertStatusSchema = _enum([
13720
13729
  "active",
13721
13730
  "in-progress",
@@ -13733,6 +13742,7 @@ var AlertSchema = object({
13733
13742
  severity: AlertSeveritySchema,
13734
13743
  title: string(),
13735
13744
  message: string(),
13745
+ action: AlertActionSchema.optional(),
13736
13746
  status: AlertStatusSchema,
13737
13747
  progress: number().optional(),
13738
13748
  read: boolean(),
@@ -54667,7 +54677,8 @@ var batteryCapability = {
54667
54677
  DeviceType.Button,
54668
54678
  DeviceType.Switch,
54669
54679
  DeviceType.PetFeeder,
54670
- DeviceType.Container
54680
+ DeviceType.Container,
54681
+ DeviceType.Thermostat
54671
54682
  ],
54672
54683
  methods: {
54673
54684
  /**
@@ -56167,6 +56178,125 @@ onStatusChanged: { data: object({
56167
56178
  * whether persisting is worth a SQLite commit. */
56168
56179
  volatileStateFields: ["lastChangedAt"]
56169
56180
  };
56181
+ /**
56182
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56183
+ * consumable levels (salt, rinse aid) and common program options.
56184
+ *
56185
+ * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56186
+ * by any integration that exposes the same program / option surface.
56187
+ *
56188
+ * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
56189
+ * provider refreshes the slice on an interval and eagerly after commands.
56190
+ */
56191
+ var DishwasherStateSchema = _enum([
56192
+ "idle",
56193
+ "running",
56194
+ "paused",
56195
+ "finished",
56196
+ "error",
56197
+ "unavailable"
56198
+ ]);
56199
+ var DishwasherConsumableLevelSchema = _enum([
56200
+ "ok",
56201
+ "low",
56202
+ "empty"
56203
+ ]);
56204
+ var DishwasherStatusSchema = object({
56205
+ state: DishwasherStateSchema,
56206
+ /** Active program id/name, or null when none selected / unknown. */
56207
+ program: string().nullable(),
56208
+ /** Program tokens the hardware accepts — drives the UI selector. */
56209
+ availablePrograms: array(string()),
56210
+ /** Minutes remaining on the active cycle, or null when not running. */
56211
+ remainingMinutes: number().int().nonnegative().nullable(),
56212
+ /** Cycle completion 0..100, or null when not applicable. */
56213
+ progressPercent: number().min(0).max(100).nullable(),
56214
+ /** True when the door is reported open. */
56215
+ doorOpen: boolean(),
56216
+ /** True when remote start is allowed (door closed, power on, etc.). */
56217
+ remoteStartAllowed: boolean(),
56218
+ /** Main power / switched-on state. */
56219
+ powerOn: boolean(),
56220
+ saltLevel: DishwasherConsumableLevelSchema.nullable(),
56221
+ rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56222
+ halfLoad: boolean(),
56223
+ hygienePlus: boolean(),
56224
+ errorCode: number().nullable(),
56225
+ errorLabel: string().nullable(),
56226
+ lastFetchedAt: number()
56227
+ });
56228
+ var dishwasherCapability = {
56229
+ name: "dishwasher",
56230
+ scope: "device",
56231
+ deviceNative: true,
56232
+ mode: "singleton",
56233
+ deviceTypes: [DeviceType.Dishwasher],
56234
+ methods: {
56235
+ start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56236
+ kind: "mutation",
56237
+ auth: "protected"
56238
+ }),
56239
+ pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56240
+ kind: "mutation",
56241
+ auth: "protected"
56242
+ }),
56243
+ stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56244
+ kind: "mutation",
56245
+ auth: "protected"
56246
+ }),
56247
+ setProgram: method(object({
56248
+ deviceId: number().int().nonnegative(),
56249
+ program: string().min(1)
56250
+ }), _void(), {
56251
+ kind: "mutation",
56252
+ auth: "protected"
56253
+ }),
56254
+ setPower: method(object({
56255
+ deviceId: number().int().nonnegative(),
56256
+ on: boolean()
56257
+ }), _void(), {
56258
+ kind: "mutation",
56259
+ auth: "protected"
56260
+ }),
56261
+ setHalfLoad: method(object({
56262
+ deviceId: number().int().nonnegative(),
56263
+ on: boolean()
56264
+ }), _void(), {
56265
+ kind: "mutation",
56266
+ auth: "protected"
56267
+ }),
56268
+ setHygienePlus: method(object({
56269
+ deviceId: number().int().nonnegative(),
56270
+ on: boolean()
56271
+ }), _void(), {
56272
+ kind: "mutation",
56273
+ auth: "protected"
56274
+ }),
56275
+ setOption: method(object({
56276
+ deviceId: number().int().nonnegative(),
56277
+ key: string().min(1),
56278
+ value: union([
56279
+ boolean(),
56280
+ string(),
56281
+ number()
56282
+ ])
56283
+ }), _void(), {
56284
+ kind: "mutation",
56285
+ auth: "protected"
56286
+ })
56287
+ },
56288
+ status: {
56289
+ schema: DishwasherStatusSchema,
56290
+ kind: "poll"
56291
+ },
56292
+ runtimeState: DishwasherStatusSchema,
56293
+ durability: "session",
56294
+ history: { fields: { progressPercent: {
56295
+ kind: "gauge",
56296
+ unit: "%",
56297
+ deadband: 2
56298
+ } } }
56299
+ };
56170
56300
  var DoorbellStatusSchema = object({
56171
56301
  /** Ms epoch of the last press. null = never observed since this provider started. */
56172
56302
  lastPressedAt: number().nullable(),
@@ -56969,6 +57099,32 @@ var gasCapability = {
56969
57099
  * whether persisting is worth a SQLite commit. */
56970
57100
  volatileStateFields: ["lastChangedAt"]
56971
57101
  };
57102
+ var HeatingValveStatusSchema = object({
57103
+ /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
57104
+ position: number().min(0).max(100).nullable(),
57105
+ /** Ms epoch when the slice was last updated (push or poll). */
57106
+ lastFetchedAt: number()
57107
+ });
57108
+ var heatingValveCapability = {
57109
+ name: "heating-valve",
57110
+ scope: "device",
57111
+ deviceNative: true,
57112
+ mode: "singleton",
57113
+ deviceTypes: [DeviceType.Thermostat],
57114
+ methods: {},
57115
+ status: {
57116
+ schema: HeatingValveStatusSchema,
57117
+ kind: "push"
57118
+ },
57119
+ runtimeState: HeatingValveStatusSchema,
57120
+ durability: "session",
57121
+ history: { fields: { position: {
57122
+ kind: "gauge",
57123
+ unit: "%",
57124
+ deadband: 1
57125
+ } } },
57126
+ volatileStateFields: ["lastFetchedAt"]
57127
+ };
56972
57128
  /**
56973
57129
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
56974
57130
  * an on/off actuator with an optional target-humidity setpoint and an
@@ -66389,6 +66545,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
66389
66545
  dayNight: dayNightCapability,
66390
66546
  deviceDiscovery: deviceDiscoveryCapability,
66391
66547
  deviceStatus: deviceStatusCapability,
66548
+ dishwasher: dishwasherCapability,
66392
66549
  doorbell: doorbellCapability,
66393
66550
  enumSensor: enumSensorCapability,
66394
66551
  eventEmitter: eventEmitterCapability,
@@ -66396,6 +66553,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
66396
66553
  featureProbe: featureProbeCapability,
66397
66554
  flood: floodCapability,
66398
66555
  gas: gasCapability,
66556
+ heatingValve: heatingValveCapability,
66399
66557
  humidifier: humidifierCapability,
66400
66558
  humiditySensor: humiditySensorCapability,
66401
66559
  image: imageCapability,
@@ -67121,6 +67279,12 @@ var BaseDeviceProvider = class extends BaseAddon {
67121
67279
  provider: this
67122
67280
  }];
67123
67281
  }
67282
+ /** Flatten `super.onInitialize()` whether it returned an array or an envelope. */
67283
+ providerRegistrationsFromSuper(result) {
67284
+ if (Array.isArray(result)) return result;
67285
+ if (result !== void 0 && result.providers !== void 0) return [...result.providers];
67286
+ return [];
67287
+ }
67124
67288
  async onShutdown() {
67125
67289
  this._restoreShuttingDown = true;
67126
67290
  this.cancelRestoreRetries();
@@ -67647,7 +67811,7 @@ var BaseDeviceProvider = class extends BaseAddon {
67647
67811
  return toDeviceSummary(device, this.addonId);
67648
67812
  }
67649
67813
  };
67650
- DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
67814
+ DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher;
67651
67815
  new Set(Object.values(DeviceType));
67652
67816
  Object.freeze({
67653
67817
  "accessories.getStatus": {
@@ -70068,6 +70232,60 @@ Object.freeze({
70068
70232
  addonId: null,
70069
70233
  access: "view"
70070
70234
  },
70235
+ "dishwasher.getStatus": {
70236
+ capName: "dishwasher",
70237
+ capScope: "device",
70238
+ addonId: null,
70239
+ access: "view"
70240
+ },
70241
+ "dishwasher.pause": {
70242
+ capName: "dishwasher",
70243
+ capScope: "device",
70244
+ addonId: null,
70245
+ access: "create"
70246
+ },
70247
+ "dishwasher.setHalfLoad": {
70248
+ capName: "dishwasher",
70249
+ capScope: "device",
70250
+ addonId: null,
70251
+ access: "create"
70252
+ },
70253
+ "dishwasher.setHygienePlus": {
70254
+ capName: "dishwasher",
70255
+ capScope: "device",
70256
+ addonId: null,
70257
+ access: "create"
70258
+ },
70259
+ "dishwasher.setOption": {
70260
+ capName: "dishwasher",
70261
+ capScope: "device",
70262
+ addonId: null,
70263
+ access: "create"
70264
+ },
70265
+ "dishwasher.setPower": {
70266
+ capName: "dishwasher",
70267
+ capScope: "device",
70268
+ addonId: null,
70269
+ access: "create"
70270
+ },
70271
+ "dishwasher.setProgram": {
70272
+ capName: "dishwasher",
70273
+ capScope: "device",
70274
+ addonId: null,
70275
+ access: "create"
70276
+ },
70277
+ "dishwasher.start": {
70278
+ capName: "dishwasher",
70279
+ capScope: "device",
70280
+ addonId: null,
70281
+ access: "create"
70282
+ },
70283
+ "dishwasher.stop": {
70284
+ capName: "dishwasher",
70285
+ capScope: "device",
70286
+ addonId: null,
70287
+ access: "create"
70288
+ },
70071
70289
  "doorbell.getStatus": {
70072
70290
  capName: "doorbell",
70073
70291
  capScope: "device",
@@ -70278,6 +70496,12 @@ Object.freeze({
70278
70496
  addonId: null,
70279
70497
  access: "view"
70280
70498
  },
70499
+ "heatingValve.getStatus": {
70500
+ capName: "heating-valve",
70501
+ capScope: "device",
70502
+ addonId: null,
70503
+ access: "view"
70504
+ },
70281
70505
  "humidifier.getStatus": {
70282
70506
  capName: "humidifier",
70283
70507
  capScope: "device",
@@ -75865,7 +76089,7 @@ Object.freeze({
75865
76089
  access: "create"
75866
76090
  }
75867
76091
  });
75868
- DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
76092
+ DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher;
75869
76093
  DeviceFeature.BatteryOperated;
75870
76094
  Object.freeze({
75871
76095
  "accessories.getStatus": [{
@@ -76689,6 +76913,51 @@ Object.freeze({
76689
76913
  form: "single",
76690
76914
  optional: false
76691
76915
  }],
76916
+ "dishwasher.getStatus": [{
76917
+ name: "deviceId",
76918
+ form: "single",
76919
+ optional: false
76920
+ }],
76921
+ "dishwasher.pause": [{
76922
+ name: "deviceId",
76923
+ form: "single",
76924
+ optional: false
76925
+ }],
76926
+ "dishwasher.setHalfLoad": [{
76927
+ name: "deviceId",
76928
+ form: "single",
76929
+ optional: false
76930
+ }],
76931
+ "dishwasher.setHygienePlus": [{
76932
+ name: "deviceId",
76933
+ form: "single",
76934
+ optional: false
76935
+ }],
76936
+ "dishwasher.setOption": [{
76937
+ name: "deviceId",
76938
+ form: "single",
76939
+ optional: false
76940
+ }],
76941
+ "dishwasher.setPower": [{
76942
+ name: "deviceId",
76943
+ form: "single",
76944
+ optional: false
76945
+ }],
76946
+ "dishwasher.setProgram": [{
76947
+ name: "deviceId",
76948
+ form: "single",
76949
+ optional: false
76950
+ }],
76951
+ "dishwasher.start": [{
76952
+ name: "deviceId",
76953
+ form: "single",
76954
+ optional: false
76955
+ }],
76956
+ "dishwasher.stop": [{
76957
+ name: "deviceId",
76958
+ form: "single",
76959
+ optional: false
76960
+ }],
76692
76961
  "doorbell.getStatus": [{
76693
76962
  name: "deviceId",
76694
76963
  form: "single",
@@ -76758,6 +77027,11 @@ Object.freeze({
76758
77027
  form: "single",
76759
77028
  optional: false
76760
77029
  }],
77030
+ "heatingValve.getStatus": [{
77031
+ name: "deviceId",
77032
+ form: "single",
77033
+ optional: false
77034
+ }],
76761
77035
  "humidifier.getStatus": [{
76762
77036
  name: "deviceId",
76763
77037
  form: "single",
@@ -24,7 +24,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  enumerable: true
25
25
  }) : target, mod));
26
26
  //#endregion
27
- const require_dist = require("../dist-BXMUyWXo.js");
27
+ const require_dist = require("../dist-xuu2eG_W.js");
28
28
  let node_crypto = require("node:crypto");
29
29
  require("node:zlib");
30
30
  let node_fs = require("node:fs");
@@ -3223,6 +3223,10 @@ var CAPS_NOT_EXPORTED = [
3223
3223
  {
3224
3224
  cap: "zone-rules",
3225
3225
  reason: "Per-stage zone rules — configuration the pipeline consumes, with no value an automation reads."
3226
+ },
3227
+ {
3228
+ cap: "heating-valve",
3229
+ reason: "Radiator valve position telemetry (0–100 %). Shown on the CamStack thermostat row; no Home Assistant / voice-assistant entity mapping is defined yet — export would mint a sensor with no agreed device_class or control surface."
3226
3230
  }
3227
3231
  ];
3228
3232
  var UNNEGOTIATED_PLAN_OPTIONS = { platforms: UNNEGOTIATED_SUPPORT };
@@ -1,4 +1,4 @@
1
- import { $ as oauthIntegrationCapability, Bt as EventCategory, C as buildAddonRouteProvider, Et as nodePin, I as deviceExportCapability, It as string, a as COCO_TO_MACRO, bt as BaseAddon, c as FanDirectionSchema, i as CAMERA_SWITCH_ORDER, l as HvacModeSchema, o as CameraSwitchIdSchema, p as addonRoutesCapability, t as AlarmArmModeSchema, u as MediaPlayerRepeatSchema } from "../dist-BQLjEZxA.mjs";
1
+ import { $ as oauthIntegrationCapability, Bt as EventCategory, C as buildAddonRouteProvider, Et as nodePin, I as deviceExportCapability, It as string, a as COCO_TO_MACRO, bt as BaseAddon, c as FanDirectionSchema, i as CAMERA_SWITCH_ORDER, l as HvacModeSchema, o as CameraSwitchIdSchema, p as addonRoutesCapability, t as AlarmArmModeSchema, u as MediaPlayerRepeatSchema } from "../dist-Dcum8auE.mjs";
2
2
  import { createHmac, timingSafeEqual } from "node:crypto";
3
3
  import "node:zlib";
4
4
  import "node:fs";
@@ -3195,6 +3195,10 @@ var CAPS_NOT_EXPORTED = [
3195
3195
  {
3196
3196
  cap: "zone-rules",
3197
3197
  reason: "Per-stage zone rules — configuration the pipeline consumes, with no value an automation reads."
3198
+ },
3199
+ {
3200
+ cap: "heating-valve",
3201
+ reason: "Radiator valve position telemetry (0–100 %). Shown on the CamStack thermostat row; no Home Assistant / voice-assistant entity mapping is defined yet — export would mint a sensor with no agreed device_class or control surface."
3198
3202
  }
3199
3203
  ];
3200
3204
  var UNNEGOTIATED_PLAN_OPTIONS = { platforms: UNNEGOTIATED_SUPPORT };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homeassistant",
3
- "version": "1.2.601",
3
+ "version": "1.2.602",
4
4
  "description": "Home Assistant device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",