@camstack/addon-provider-homematic 1.2.136 → 1.2.137

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
@@ -5547,7 +5547,7 @@ var ZodIssueCode = {
5547
5547
  var ZodFirstPartyTypeKind;
5548
5548
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5549
5549
  //#endregion
5550
- //#region ../types/dist/sleep-bZIhUvjd.mjs
5550
+ //#region ../types/dist/sleep-BOjuyoPC.mjs
5551
5551
  /**
5552
5552
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5553
5553
  * window to float samples (D455).
@@ -8766,7 +8766,7 @@ object({
8766
8766
  params: record(string(), union([string(), number()])).optional()
8767
8767
  });
8768
8768
  //#endregion
8769
- //#region ../types/dist/err-msg--2RrYiLO.mjs
8769
+ //#region ../types/dist/err-msg-BXKzRBwg.mjs
8770
8770
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8771
8771
  DeviceType["Camera"] = "camera";
8772
8772
  DeviceType["Hub"] = "hub";
@@ -8858,6 +8858,10 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
8858
8858
  * native PetKit (`nodepetkit` `FeederDevice`), reusable by other feeder
8859
8859
  * integrations sharing the same food/desiccant/hopper surface. */
8860
8860
  DeviceType["PetFeeder"] = "pet-feeder";
8861
+ /** Built-in dishwasher — program lifecycle, door / remote-start gates,
8862
+ * salt and rinse-aid levels. Installed with the `dishwasher` cap.
8863
+ * Sources: native Bosch Home Connect, reusable by similar integrations. */
8864
+ DeviceType["Dishwasher"] = "dishwasher";
8861
8865
  return DeviceType;
8862
8866
  }({});
8863
8867
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -9115,7 +9119,7 @@ function errMsg(err) {
9115
9119
  return String(err);
9116
9120
  }
9117
9121
  //#endregion
9118
- //#region ../types/dist/composition-DOwQB_Ua.mjs
9122
+ //#region ../types/dist/composition-CB6PMT9p.mjs
9119
9123
  /**
9120
9124
  * The ffmpeg build every CamStack node downloads, per platform and arch.
9121
9125
  *
@@ -13501,8 +13505,13 @@ var AlertSeveritySchema = _enum([
13501
13505
  "info",
13502
13506
  "success",
13503
13507
  "warning",
13504
- "error"
13508
+ "error",
13509
+ "critical"
13505
13510
  ]);
13511
+ var AlertActionSchema = object({
13512
+ label: string(),
13513
+ href: string().optional()
13514
+ });
13506
13515
  var AlertStatusSchema = _enum([
13507
13516
  "active",
13508
13517
  "in-progress",
@@ -13520,6 +13529,7 @@ var AlertSchema = object({
13520
13529
  severity: AlertSeveritySchema,
13521
13530
  title: string(),
13522
13531
  message: string(),
13532
+ action: AlertActionSchema.optional(),
13523
13533
  status: AlertStatusSchema,
13524
13534
  progress: number().optional(),
13525
13535
  read: boolean(),
@@ -54240,7 +54250,8 @@ var batteryCapability = {
54240
54250
  DeviceType.Button,
54241
54251
  DeviceType.Switch,
54242
54252
  DeviceType.PetFeeder,
54243
- DeviceType.Container
54253
+ DeviceType.Container,
54254
+ DeviceType.Thermostat
54244
54255
  ],
54245
54256
  methods: {
54246
54257
  /**
@@ -55713,6 +55724,125 @@ onStatusChanged: { data: object({
55713
55724
  * whether persisting is worth a SQLite commit. */
55714
55725
  volatileStateFields: ["lastChangedAt"]
55715
55726
  };
55727
+ /**
55728
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55729
+ * consumable levels (salt, rinse aid) and common program options.
55730
+ *
55731
+ * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55732
+ * by any integration that exposes the same program / option surface.
55733
+ *
55734
+ * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
55735
+ * provider refreshes the slice on an interval and eagerly after commands.
55736
+ */
55737
+ var DishwasherStateSchema = _enum([
55738
+ "idle",
55739
+ "running",
55740
+ "paused",
55741
+ "finished",
55742
+ "error",
55743
+ "unavailable"
55744
+ ]);
55745
+ var DishwasherConsumableLevelSchema = _enum([
55746
+ "ok",
55747
+ "low",
55748
+ "empty"
55749
+ ]);
55750
+ var DishwasherStatusSchema = object({
55751
+ state: DishwasherStateSchema,
55752
+ /** Active program id/name, or null when none selected / unknown. */
55753
+ program: string().nullable(),
55754
+ /** Program tokens the hardware accepts — drives the UI selector. */
55755
+ availablePrograms: array(string()),
55756
+ /** Minutes remaining on the active cycle, or null when not running. */
55757
+ remainingMinutes: number().int().nonnegative().nullable(),
55758
+ /** Cycle completion 0..100, or null when not applicable. */
55759
+ progressPercent: number().min(0).max(100).nullable(),
55760
+ /** True when the door is reported open. */
55761
+ doorOpen: boolean(),
55762
+ /** True when remote start is allowed (door closed, power on, etc.). */
55763
+ remoteStartAllowed: boolean(),
55764
+ /** Main power / switched-on state. */
55765
+ powerOn: boolean(),
55766
+ saltLevel: DishwasherConsumableLevelSchema.nullable(),
55767
+ rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55768
+ halfLoad: boolean(),
55769
+ hygienePlus: boolean(),
55770
+ errorCode: number().nullable(),
55771
+ errorLabel: string().nullable(),
55772
+ lastFetchedAt: number()
55773
+ });
55774
+ var dishwasherCapability = {
55775
+ name: "dishwasher",
55776
+ scope: "device",
55777
+ deviceNative: true,
55778
+ mode: "singleton",
55779
+ deviceTypes: [DeviceType.Dishwasher],
55780
+ methods: {
55781
+ start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55782
+ kind: "mutation",
55783
+ auth: "protected"
55784
+ }),
55785
+ pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55786
+ kind: "mutation",
55787
+ auth: "protected"
55788
+ }),
55789
+ stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55790
+ kind: "mutation",
55791
+ auth: "protected"
55792
+ }),
55793
+ setProgram: method(object({
55794
+ deviceId: number().int().nonnegative(),
55795
+ program: string().min(1)
55796
+ }), _void(), {
55797
+ kind: "mutation",
55798
+ auth: "protected"
55799
+ }),
55800
+ setPower: method(object({
55801
+ deviceId: number().int().nonnegative(),
55802
+ on: boolean()
55803
+ }), _void(), {
55804
+ kind: "mutation",
55805
+ auth: "protected"
55806
+ }),
55807
+ setHalfLoad: method(object({
55808
+ deviceId: number().int().nonnegative(),
55809
+ on: boolean()
55810
+ }), _void(), {
55811
+ kind: "mutation",
55812
+ auth: "protected"
55813
+ }),
55814
+ setHygienePlus: method(object({
55815
+ deviceId: number().int().nonnegative(),
55816
+ on: boolean()
55817
+ }), _void(), {
55818
+ kind: "mutation",
55819
+ auth: "protected"
55820
+ }),
55821
+ setOption: method(object({
55822
+ deviceId: number().int().nonnegative(),
55823
+ key: string().min(1),
55824
+ value: union([
55825
+ boolean(),
55826
+ string(),
55827
+ number()
55828
+ ])
55829
+ }), _void(), {
55830
+ kind: "mutation",
55831
+ auth: "protected"
55832
+ })
55833
+ },
55834
+ status: {
55835
+ schema: DishwasherStatusSchema,
55836
+ kind: "poll"
55837
+ },
55838
+ runtimeState: DishwasherStatusSchema,
55839
+ durability: "session",
55840
+ history: { fields: { progressPercent: {
55841
+ kind: "gauge",
55842
+ unit: "%",
55843
+ deadband: 2
55844
+ } } }
55845
+ };
55716
55846
  var DoorbellStatusSchema = object({
55717
55847
  /** Ms epoch of the last press. null = never observed since this provider started. */
55718
55848
  lastPressedAt: number().nullable(),
@@ -56515,6 +56645,32 @@ var gasCapability = {
56515
56645
  * whether persisting is worth a SQLite commit. */
56516
56646
  volatileStateFields: ["lastChangedAt"]
56517
56647
  };
56648
+ var HeatingValveStatusSchema = object({
56649
+ /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
56650
+ position: number().min(0).max(100).nullable(),
56651
+ /** Ms epoch when the slice was last updated (push or poll). */
56652
+ lastFetchedAt: number()
56653
+ });
56654
+ var heatingValveCapability = {
56655
+ name: "heating-valve",
56656
+ scope: "device",
56657
+ deviceNative: true,
56658
+ mode: "singleton",
56659
+ deviceTypes: [DeviceType.Thermostat],
56660
+ methods: {},
56661
+ status: {
56662
+ schema: HeatingValveStatusSchema,
56663
+ kind: "push"
56664
+ },
56665
+ runtimeState: HeatingValveStatusSchema,
56666
+ durability: "session",
56667
+ history: { fields: { position: {
56668
+ kind: "gauge",
56669
+ unit: "%",
56670
+ deadband: 1
56671
+ } } },
56672
+ volatileStateFields: ["lastFetchedAt"]
56673
+ };
56518
56674
  /**
56519
56675
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
56520
56676
  * an on/off actuator with an optional target-humidity setpoint and an
@@ -65935,6 +66091,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
65935
66091
  dayNight: dayNightCapability,
65936
66092
  deviceDiscovery: deviceDiscoveryCapability,
65937
66093
  deviceStatus: deviceStatusCapability,
66094
+ dishwasher: dishwasherCapability,
65938
66095
  doorbell: doorbellCapability,
65939
66096
  enumSensor: enumSensorCapability,
65940
66097
  eventEmitter: eventEmitterCapability,
@@ -65942,6 +66099,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
65942
66099
  featureProbe: featureProbeCapability,
65943
66100
  flood: floodCapability,
65944
66101
  gas: gasCapability,
66102
+ heatingValve: heatingValveCapability,
65945
66103
  humidifier: humidifierCapability,
65946
66104
  humiditySensor: humiditySensorCapability,
65947
66105
  image: imageCapability,
@@ -66667,6 +66825,12 @@ var BaseDeviceProvider = class extends BaseAddon {
66667
66825
  provider: this
66668
66826
  }];
66669
66827
  }
66828
+ /** Flatten `super.onInitialize()` whether it returned an array or an envelope. */
66829
+ providerRegistrationsFromSuper(result) {
66830
+ if (Array.isArray(result)) return result;
66831
+ if (result !== void 0 && result.providers !== void 0) return [...result.providers];
66832
+ return [];
66833
+ }
66670
66834
  async onShutdown() {
66671
66835
  this._restoreShuttingDown = true;
66672
66836
  this.cancelRestoreRetries();
@@ -67193,7 +67357,7 @@ var BaseDeviceProvider = class extends BaseAddon {
67193
67357
  return toDeviceSummary(device, this.addonId);
67194
67358
  }
67195
67359
  };
67196
- 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;
67360
+ 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;
67197
67361
  new Set(Object.values(DeviceType));
67198
67362
  Object.freeze({
67199
67363
  "accessories.getStatus": {
@@ -69614,6 +69778,60 @@ Object.freeze({
69614
69778
  addonId: null,
69615
69779
  access: "view"
69616
69780
  },
69781
+ "dishwasher.getStatus": {
69782
+ capName: "dishwasher",
69783
+ capScope: "device",
69784
+ addonId: null,
69785
+ access: "view"
69786
+ },
69787
+ "dishwasher.pause": {
69788
+ capName: "dishwasher",
69789
+ capScope: "device",
69790
+ addonId: null,
69791
+ access: "create"
69792
+ },
69793
+ "dishwasher.setHalfLoad": {
69794
+ capName: "dishwasher",
69795
+ capScope: "device",
69796
+ addonId: null,
69797
+ access: "create"
69798
+ },
69799
+ "dishwasher.setHygienePlus": {
69800
+ capName: "dishwasher",
69801
+ capScope: "device",
69802
+ addonId: null,
69803
+ access: "create"
69804
+ },
69805
+ "dishwasher.setOption": {
69806
+ capName: "dishwasher",
69807
+ capScope: "device",
69808
+ addonId: null,
69809
+ access: "create"
69810
+ },
69811
+ "dishwasher.setPower": {
69812
+ capName: "dishwasher",
69813
+ capScope: "device",
69814
+ addonId: null,
69815
+ access: "create"
69816
+ },
69817
+ "dishwasher.setProgram": {
69818
+ capName: "dishwasher",
69819
+ capScope: "device",
69820
+ addonId: null,
69821
+ access: "create"
69822
+ },
69823
+ "dishwasher.start": {
69824
+ capName: "dishwasher",
69825
+ capScope: "device",
69826
+ addonId: null,
69827
+ access: "create"
69828
+ },
69829
+ "dishwasher.stop": {
69830
+ capName: "dishwasher",
69831
+ capScope: "device",
69832
+ addonId: null,
69833
+ access: "create"
69834
+ },
69617
69835
  "doorbell.getStatus": {
69618
69836
  capName: "doorbell",
69619
69837
  capScope: "device",
@@ -69824,6 +70042,12 @@ Object.freeze({
69824
70042
  addonId: null,
69825
70043
  access: "view"
69826
70044
  },
70045
+ "heatingValve.getStatus": {
70046
+ capName: "heating-valve",
70047
+ capScope: "device",
70048
+ addonId: null,
70049
+ access: "view"
70050
+ },
69827
70051
  "humidifier.getStatus": {
69828
70052
  capName: "humidifier",
69829
70053
  capScope: "device",
@@ -75411,7 +75635,7 @@ Object.freeze({
75411
75635
  access: "create"
75412
75636
  }
75413
75637
  });
75414
- 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;
75638
+ 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;
75415
75639
  DeviceFeature.BatteryOperated;
75416
75640
  Object.freeze({
75417
75641
  "accessories.getStatus": [{
@@ -76235,6 +76459,51 @@ Object.freeze({
76235
76459
  form: "single",
76236
76460
  optional: false
76237
76461
  }],
76462
+ "dishwasher.getStatus": [{
76463
+ name: "deviceId",
76464
+ form: "single",
76465
+ optional: false
76466
+ }],
76467
+ "dishwasher.pause": [{
76468
+ name: "deviceId",
76469
+ form: "single",
76470
+ optional: false
76471
+ }],
76472
+ "dishwasher.setHalfLoad": [{
76473
+ name: "deviceId",
76474
+ form: "single",
76475
+ optional: false
76476
+ }],
76477
+ "dishwasher.setHygienePlus": [{
76478
+ name: "deviceId",
76479
+ form: "single",
76480
+ optional: false
76481
+ }],
76482
+ "dishwasher.setOption": [{
76483
+ name: "deviceId",
76484
+ form: "single",
76485
+ optional: false
76486
+ }],
76487
+ "dishwasher.setPower": [{
76488
+ name: "deviceId",
76489
+ form: "single",
76490
+ optional: false
76491
+ }],
76492
+ "dishwasher.setProgram": [{
76493
+ name: "deviceId",
76494
+ form: "single",
76495
+ optional: false
76496
+ }],
76497
+ "dishwasher.start": [{
76498
+ name: "deviceId",
76499
+ form: "single",
76500
+ optional: false
76501
+ }],
76502
+ "dishwasher.stop": [{
76503
+ name: "deviceId",
76504
+ form: "single",
76505
+ optional: false
76506
+ }],
76238
76507
  "doorbell.getStatus": [{
76239
76508
  name: "deviceId",
76240
76509
  form: "single",
@@ -76304,6 +76573,11 @@ Object.freeze({
76304
76573
  form: "single",
76305
76574
  optional: false
76306
76575
  }],
76576
+ "heatingValve.getStatus": [{
76577
+ name: "deviceId",
76578
+ form: "single",
76579
+ optional: false
76580
+ }],
76307
76581
  "humidifier.getStatus": [{
76308
76582
  name: "deviceId",
76309
76583
  form: "single",
@@ -105315,7 +105589,7 @@ var HomematicProviderAddon = class extends BaseDeviceProvider {
105315
105589
  super({ ...DEFAULTS });
105316
105590
  }
105317
105591
  async onInitialize() {
105318
- const regs = await super.onInitialize();
105592
+ const regs = this.providerRegistrationsFromSuper(await super.onInitialize());
105319
105593
  const migrated = migrateLegacyConfig(await this.resolveGlobalStore());
105320
105594
  if (this.brokersDiffer(migrated.brokers, this.config.brokers)) await this.updateGlobalSettings({ brokers: migrated.brokers });
105321
105595
  const records = this.ctx.records;
package/dist/addon.mjs CHANGED
@@ -5548,7 +5548,7 @@ var ZodIssueCode = {
5548
5548
  var ZodFirstPartyTypeKind;
5549
5549
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5550
5550
  //#endregion
5551
- //#region ../types/dist/sleep-bZIhUvjd.mjs
5551
+ //#region ../types/dist/sleep-BOjuyoPC.mjs
5552
5552
  /**
5553
5553
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5554
5554
  * window to float samples (D455).
@@ -8767,7 +8767,7 @@ object({
8767
8767
  params: record(string(), union([string(), number()])).optional()
8768
8768
  });
8769
8769
  //#endregion
8770
- //#region ../types/dist/err-msg--2RrYiLO.mjs
8770
+ //#region ../types/dist/err-msg-BXKzRBwg.mjs
8771
8771
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8772
8772
  DeviceType["Camera"] = "camera";
8773
8773
  DeviceType["Hub"] = "hub";
@@ -8859,6 +8859,10 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
8859
8859
  * native PetKit (`nodepetkit` `FeederDevice`), reusable by other feeder
8860
8860
  * integrations sharing the same food/desiccant/hopper surface. */
8861
8861
  DeviceType["PetFeeder"] = "pet-feeder";
8862
+ /** Built-in dishwasher — program lifecycle, door / remote-start gates,
8863
+ * salt and rinse-aid levels. Installed with the `dishwasher` cap.
8864
+ * Sources: native Bosch Home Connect, reusable by similar integrations. */
8865
+ DeviceType["Dishwasher"] = "dishwasher";
8862
8866
  return DeviceType;
8863
8867
  }({});
8864
8868
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -9116,7 +9120,7 @@ function errMsg(err) {
9116
9120
  return String(err);
9117
9121
  }
9118
9122
  //#endregion
9119
- //#region ../types/dist/composition-DOwQB_Ua.mjs
9123
+ //#region ../types/dist/composition-CB6PMT9p.mjs
9120
9124
  /**
9121
9125
  * The ffmpeg build every CamStack node downloads, per platform and arch.
9122
9126
  *
@@ -13502,8 +13506,13 @@ var AlertSeveritySchema = _enum([
13502
13506
  "info",
13503
13507
  "success",
13504
13508
  "warning",
13505
- "error"
13509
+ "error",
13510
+ "critical"
13506
13511
  ]);
13512
+ var AlertActionSchema = object({
13513
+ label: string(),
13514
+ href: string().optional()
13515
+ });
13507
13516
  var AlertStatusSchema = _enum([
13508
13517
  "active",
13509
13518
  "in-progress",
@@ -13521,6 +13530,7 @@ var AlertSchema = object({
13521
13530
  severity: AlertSeveritySchema,
13522
13531
  title: string(),
13523
13532
  message: string(),
13533
+ action: AlertActionSchema.optional(),
13524
13534
  status: AlertStatusSchema,
13525
13535
  progress: number().optional(),
13526
13536
  read: boolean(),
@@ -54241,7 +54251,8 @@ var batteryCapability = {
54241
54251
  DeviceType.Button,
54242
54252
  DeviceType.Switch,
54243
54253
  DeviceType.PetFeeder,
54244
- DeviceType.Container
54254
+ DeviceType.Container,
54255
+ DeviceType.Thermostat
54245
54256
  ],
54246
54257
  methods: {
54247
54258
  /**
@@ -55714,6 +55725,125 @@ onStatusChanged: { data: object({
55714
55725
  * whether persisting is worth a SQLite commit. */
55715
55726
  volatileStateFields: ["lastChangedAt"]
55716
55727
  };
55728
+ /**
55729
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55730
+ * consumable levels (salt, rinse aid) and common program options.
55731
+ *
55732
+ * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55733
+ * by any integration that exposes the same program / option surface.
55734
+ *
55735
+ * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
55736
+ * provider refreshes the slice on an interval and eagerly after commands.
55737
+ */
55738
+ var DishwasherStateSchema = _enum([
55739
+ "idle",
55740
+ "running",
55741
+ "paused",
55742
+ "finished",
55743
+ "error",
55744
+ "unavailable"
55745
+ ]);
55746
+ var DishwasherConsumableLevelSchema = _enum([
55747
+ "ok",
55748
+ "low",
55749
+ "empty"
55750
+ ]);
55751
+ var DishwasherStatusSchema = object({
55752
+ state: DishwasherStateSchema,
55753
+ /** Active program id/name, or null when none selected / unknown. */
55754
+ program: string().nullable(),
55755
+ /** Program tokens the hardware accepts — drives the UI selector. */
55756
+ availablePrograms: array(string()),
55757
+ /** Minutes remaining on the active cycle, or null when not running. */
55758
+ remainingMinutes: number().int().nonnegative().nullable(),
55759
+ /** Cycle completion 0..100, or null when not applicable. */
55760
+ progressPercent: number().min(0).max(100).nullable(),
55761
+ /** True when the door is reported open. */
55762
+ doorOpen: boolean(),
55763
+ /** True when remote start is allowed (door closed, power on, etc.). */
55764
+ remoteStartAllowed: boolean(),
55765
+ /** Main power / switched-on state. */
55766
+ powerOn: boolean(),
55767
+ saltLevel: DishwasherConsumableLevelSchema.nullable(),
55768
+ rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55769
+ halfLoad: boolean(),
55770
+ hygienePlus: boolean(),
55771
+ errorCode: number().nullable(),
55772
+ errorLabel: string().nullable(),
55773
+ lastFetchedAt: number()
55774
+ });
55775
+ var dishwasherCapability = {
55776
+ name: "dishwasher",
55777
+ scope: "device",
55778
+ deviceNative: true,
55779
+ mode: "singleton",
55780
+ deviceTypes: [DeviceType.Dishwasher],
55781
+ methods: {
55782
+ start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55783
+ kind: "mutation",
55784
+ auth: "protected"
55785
+ }),
55786
+ pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55787
+ kind: "mutation",
55788
+ auth: "protected"
55789
+ }),
55790
+ stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55791
+ kind: "mutation",
55792
+ auth: "protected"
55793
+ }),
55794
+ setProgram: method(object({
55795
+ deviceId: number().int().nonnegative(),
55796
+ program: string().min(1)
55797
+ }), _void(), {
55798
+ kind: "mutation",
55799
+ auth: "protected"
55800
+ }),
55801
+ setPower: method(object({
55802
+ deviceId: number().int().nonnegative(),
55803
+ on: boolean()
55804
+ }), _void(), {
55805
+ kind: "mutation",
55806
+ auth: "protected"
55807
+ }),
55808
+ setHalfLoad: method(object({
55809
+ deviceId: number().int().nonnegative(),
55810
+ on: boolean()
55811
+ }), _void(), {
55812
+ kind: "mutation",
55813
+ auth: "protected"
55814
+ }),
55815
+ setHygienePlus: method(object({
55816
+ deviceId: number().int().nonnegative(),
55817
+ on: boolean()
55818
+ }), _void(), {
55819
+ kind: "mutation",
55820
+ auth: "protected"
55821
+ }),
55822
+ setOption: method(object({
55823
+ deviceId: number().int().nonnegative(),
55824
+ key: string().min(1),
55825
+ value: union([
55826
+ boolean(),
55827
+ string(),
55828
+ number()
55829
+ ])
55830
+ }), _void(), {
55831
+ kind: "mutation",
55832
+ auth: "protected"
55833
+ })
55834
+ },
55835
+ status: {
55836
+ schema: DishwasherStatusSchema,
55837
+ kind: "poll"
55838
+ },
55839
+ runtimeState: DishwasherStatusSchema,
55840
+ durability: "session",
55841
+ history: { fields: { progressPercent: {
55842
+ kind: "gauge",
55843
+ unit: "%",
55844
+ deadband: 2
55845
+ } } }
55846
+ };
55717
55847
  var DoorbellStatusSchema = object({
55718
55848
  /** Ms epoch of the last press. null = never observed since this provider started. */
55719
55849
  lastPressedAt: number().nullable(),
@@ -56516,6 +56646,32 @@ var gasCapability = {
56516
56646
  * whether persisting is worth a SQLite commit. */
56517
56647
  volatileStateFields: ["lastChangedAt"]
56518
56648
  };
56649
+ var HeatingValveStatusSchema = object({
56650
+ /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
56651
+ position: number().min(0).max(100).nullable(),
56652
+ /** Ms epoch when the slice was last updated (push or poll). */
56653
+ lastFetchedAt: number()
56654
+ });
56655
+ var heatingValveCapability = {
56656
+ name: "heating-valve",
56657
+ scope: "device",
56658
+ deviceNative: true,
56659
+ mode: "singleton",
56660
+ deviceTypes: [DeviceType.Thermostat],
56661
+ methods: {},
56662
+ status: {
56663
+ schema: HeatingValveStatusSchema,
56664
+ kind: "push"
56665
+ },
56666
+ runtimeState: HeatingValveStatusSchema,
56667
+ durability: "session",
56668
+ history: { fields: { position: {
56669
+ kind: "gauge",
56670
+ unit: "%",
56671
+ deadband: 1
56672
+ } } },
56673
+ volatileStateFields: ["lastFetchedAt"]
56674
+ };
56519
56675
  /**
56520
56676
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
56521
56677
  * an on/off actuator with an optional target-humidity setpoint and an
@@ -65936,6 +66092,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
65936
66092
  dayNight: dayNightCapability,
65937
66093
  deviceDiscovery: deviceDiscoveryCapability,
65938
66094
  deviceStatus: deviceStatusCapability,
66095
+ dishwasher: dishwasherCapability,
65939
66096
  doorbell: doorbellCapability,
65940
66097
  enumSensor: enumSensorCapability,
65941
66098
  eventEmitter: eventEmitterCapability,
@@ -65943,6 +66100,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
65943
66100
  featureProbe: featureProbeCapability,
65944
66101
  flood: floodCapability,
65945
66102
  gas: gasCapability,
66103
+ heatingValve: heatingValveCapability,
65946
66104
  humidifier: humidifierCapability,
65947
66105
  humiditySensor: humiditySensorCapability,
65948
66106
  image: imageCapability,
@@ -66668,6 +66826,12 @@ var BaseDeviceProvider = class extends BaseAddon {
66668
66826
  provider: this
66669
66827
  }];
66670
66828
  }
66829
+ /** Flatten `super.onInitialize()` whether it returned an array or an envelope. */
66830
+ providerRegistrationsFromSuper(result) {
66831
+ if (Array.isArray(result)) return result;
66832
+ if (result !== void 0 && result.providers !== void 0) return [...result.providers];
66833
+ return [];
66834
+ }
66671
66835
  async onShutdown() {
66672
66836
  this._restoreShuttingDown = true;
66673
66837
  this.cancelRestoreRetries();
@@ -67194,7 +67358,7 @@ var BaseDeviceProvider = class extends BaseAddon {
67194
67358
  return toDeviceSummary(device, this.addonId);
67195
67359
  }
67196
67360
  };
67197
- 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;
67361
+ 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;
67198
67362
  new Set(Object.values(DeviceType));
67199
67363
  Object.freeze({
67200
67364
  "accessories.getStatus": {
@@ -69615,6 +69779,60 @@ Object.freeze({
69615
69779
  addonId: null,
69616
69780
  access: "view"
69617
69781
  },
69782
+ "dishwasher.getStatus": {
69783
+ capName: "dishwasher",
69784
+ capScope: "device",
69785
+ addonId: null,
69786
+ access: "view"
69787
+ },
69788
+ "dishwasher.pause": {
69789
+ capName: "dishwasher",
69790
+ capScope: "device",
69791
+ addonId: null,
69792
+ access: "create"
69793
+ },
69794
+ "dishwasher.setHalfLoad": {
69795
+ capName: "dishwasher",
69796
+ capScope: "device",
69797
+ addonId: null,
69798
+ access: "create"
69799
+ },
69800
+ "dishwasher.setHygienePlus": {
69801
+ capName: "dishwasher",
69802
+ capScope: "device",
69803
+ addonId: null,
69804
+ access: "create"
69805
+ },
69806
+ "dishwasher.setOption": {
69807
+ capName: "dishwasher",
69808
+ capScope: "device",
69809
+ addonId: null,
69810
+ access: "create"
69811
+ },
69812
+ "dishwasher.setPower": {
69813
+ capName: "dishwasher",
69814
+ capScope: "device",
69815
+ addonId: null,
69816
+ access: "create"
69817
+ },
69818
+ "dishwasher.setProgram": {
69819
+ capName: "dishwasher",
69820
+ capScope: "device",
69821
+ addonId: null,
69822
+ access: "create"
69823
+ },
69824
+ "dishwasher.start": {
69825
+ capName: "dishwasher",
69826
+ capScope: "device",
69827
+ addonId: null,
69828
+ access: "create"
69829
+ },
69830
+ "dishwasher.stop": {
69831
+ capName: "dishwasher",
69832
+ capScope: "device",
69833
+ addonId: null,
69834
+ access: "create"
69835
+ },
69618
69836
  "doorbell.getStatus": {
69619
69837
  capName: "doorbell",
69620
69838
  capScope: "device",
@@ -69825,6 +70043,12 @@ Object.freeze({
69825
70043
  addonId: null,
69826
70044
  access: "view"
69827
70045
  },
70046
+ "heatingValve.getStatus": {
70047
+ capName: "heating-valve",
70048
+ capScope: "device",
70049
+ addonId: null,
70050
+ access: "view"
70051
+ },
69828
70052
  "humidifier.getStatus": {
69829
70053
  capName: "humidifier",
69830
70054
  capScope: "device",
@@ -75412,7 +75636,7 @@ Object.freeze({
75412
75636
  access: "create"
75413
75637
  }
75414
75638
  });
75415
- 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;
75639
+ 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;
75416
75640
  DeviceFeature.BatteryOperated;
75417
75641
  Object.freeze({
75418
75642
  "accessories.getStatus": [{
@@ -76236,6 +76460,51 @@ Object.freeze({
76236
76460
  form: "single",
76237
76461
  optional: false
76238
76462
  }],
76463
+ "dishwasher.getStatus": [{
76464
+ name: "deviceId",
76465
+ form: "single",
76466
+ optional: false
76467
+ }],
76468
+ "dishwasher.pause": [{
76469
+ name: "deviceId",
76470
+ form: "single",
76471
+ optional: false
76472
+ }],
76473
+ "dishwasher.setHalfLoad": [{
76474
+ name: "deviceId",
76475
+ form: "single",
76476
+ optional: false
76477
+ }],
76478
+ "dishwasher.setHygienePlus": [{
76479
+ name: "deviceId",
76480
+ form: "single",
76481
+ optional: false
76482
+ }],
76483
+ "dishwasher.setOption": [{
76484
+ name: "deviceId",
76485
+ form: "single",
76486
+ optional: false
76487
+ }],
76488
+ "dishwasher.setPower": [{
76489
+ name: "deviceId",
76490
+ form: "single",
76491
+ optional: false
76492
+ }],
76493
+ "dishwasher.setProgram": [{
76494
+ name: "deviceId",
76495
+ form: "single",
76496
+ optional: false
76497
+ }],
76498
+ "dishwasher.start": [{
76499
+ name: "deviceId",
76500
+ form: "single",
76501
+ optional: false
76502
+ }],
76503
+ "dishwasher.stop": [{
76504
+ name: "deviceId",
76505
+ form: "single",
76506
+ optional: false
76507
+ }],
76239
76508
  "doorbell.getStatus": [{
76240
76509
  name: "deviceId",
76241
76510
  form: "single",
@@ -76305,6 +76574,11 @@ Object.freeze({
76305
76574
  form: "single",
76306
76575
  optional: false
76307
76576
  }],
76577
+ "heatingValve.getStatus": [{
76578
+ name: "deviceId",
76579
+ form: "single",
76580
+ optional: false
76581
+ }],
76308
76582
  "humidifier.getStatus": [{
76309
76583
  name: "deviceId",
76310
76584
  form: "single",
@@ -105316,7 +105590,7 @@ var HomematicProviderAddon = class extends BaseDeviceProvider {
105316
105590
  super({ ...DEFAULTS });
105317
105591
  }
105318
105592
  async onInitialize() {
105319
- const regs = await super.onInitialize();
105593
+ const regs = this.providerRegistrationsFromSuper(await super.onInitialize());
105320
105594
  const migrated = migrateLegacyConfig(await this.resolveGlobalStore());
105321
105595
  if (this.brokersDiffer(migrated.brokers, this.config.brokers)) await this.updateGlobalSettings({ brokers: migrated.brokers });
105322
105596
  const records = this.ctx.records;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homematic",
3
- "version": "1.2.136",
3
+ "version": "1.2.137",
4
4
  "description": "Homematic / HomematicIP (CCU3 / RaspberryMatic) device-provider addon for CamStack — wraps the nodehomematic library",
5
5
  "keywords": [
6
6
  "camstack",