@camstack/addon-provider-reolink 1.2.187 → 1.2.188

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
@@ -5442,7 +5442,7 @@ var ZodIssueCode = {
5442
5442
  var ZodFirstPartyTypeKind;
5443
5443
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5444
5444
  //#endregion
5445
- //#region ../types/dist/sleep-bZIhUvjd.mjs
5445
+ //#region ../types/dist/sleep-BOjuyoPC.mjs
5446
5446
  /**
5447
5447
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5448
5448
  * window to float samples (D455).
@@ -8537,7 +8537,7 @@ function sleep$2(ms) {
8537
8537
  return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
8538
8538
  }
8539
8539
  //#endregion
8540
- //#region ../types/dist/err-msg--2RrYiLO.mjs
8540
+ //#region ../types/dist/err-msg-BXKzRBwg.mjs
8541
8541
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8542
8542
  DeviceType["Camera"] = "camera";
8543
8543
  DeviceType["Hub"] = "hub";
@@ -8629,6 +8629,10 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
8629
8629
  * native PetKit (`nodepetkit` `FeederDevice`), reusable by other feeder
8630
8630
  * integrations sharing the same food/desiccant/hopper surface. */
8631
8631
  DeviceType["PetFeeder"] = "pet-feeder";
8632
+ /** Built-in dishwasher — program lifecycle, door / remote-start gates,
8633
+ * salt and rinse-aid levels. Installed with the `dishwasher` cap.
8634
+ * Sources: native Bosch Home Connect, reusable by similar integrations. */
8635
+ DeviceType["Dishwasher"] = "dishwasher";
8632
8636
  return DeviceType;
8633
8637
  }({});
8634
8638
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -8876,7 +8880,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8876
8880
  return DeviceRole;
8877
8881
  }({});
8878
8882
  //#endregion
8879
- //#region ../types/dist/composition-DOwQB_Ua.mjs
8883
+ //#region ../types/dist/composition-CB6PMT9p.mjs
8880
8884
  /**
8881
8885
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8882
8886
  *
@@ -13814,8 +13818,13 @@ var AlertSeveritySchema = _enum([
13814
13818
  "info",
13815
13819
  "success",
13816
13820
  "warning",
13817
- "error"
13821
+ "error",
13822
+ "critical"
13818
13823
  ]);
13824
+ var AlertActionSchema = object({
13825
+ label: string(),
13826
+ href: string().optional()
13827
+ });
13819
13828
  var AlertStatusSchema = _enum([
13820
13829
  "active",
13821
13830
  "in-progress",
@@ -13833,6 +13842,7 @@ var AlertSchema = object({
13833
13842
  severity: AlertSeveritySchema,
13834
13843
  title: string(),
13835
13844
  message: string(),
13845
+ action: AlertActionSchema.optional(),
13836
13846
  status: AlertStatusSchema,
13837
13847
  progress: number().optional(),
13838
13848
  read: boolean(),
@@ -55049,7 +55059,8 @@ var batteryCapability = {
55049
55059
  DeviceType.Button,
55050
55060
  DeviceType.Switch,
55051
55061
  DeviceType.PetFeeder,
55052
- DeviceType.Container
55062
+ DeviceType.Container,
55063
+ DeviceType.Thermostat
55053
55064
  ],
55054
55065
  methods: {
55055
55066
  /**
@@ -56522,6 +56533,125 @@ onStatusChanged: { data: object({
56522
56533
  * whether persisting is worth a SQLite commit. */
56523
56534
  volatileStateFields: ["lastChangedAt"]
56524
56535
  };
56536
+ /**
56537
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56538
+ * consumable levels (salt, rinse aid) and common program options.
56539
+ *
56540
+ * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56541
+ * by any integration that exposes the same program / option surface.
56542
+ *
56543
+ * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
56544
+ * provider refreshes the slice on an interval and eagerly after commands.
56545
+ */
56546
+ var DishwasherStateSchema = _enum([
56547
+ "idle",
56548
+ "running",
56549
+ "paused",
56550
+ "finished",
56551
+ "error",
56552
+ "unavailable"
56553
+ ]);
56554
+ var DishwasherConsumableLevelSchema = _enum([
56555
+ "ok",
56556
+ "low",
56557
+ "empty"
56558
+ ]);
56559
+ var DishwasherStatusSchema = object({
56560
+ state: DishwasherStateSchema,
56561
+ /** Active program id/name, or null when none selected / unknown. */
56562
+ program: string().nullable(),
56563
+ /** Program tokens the hardware accepts — drives the UI selector. */
56564
+ availablePrograms: array(string()),
56565
+ /** Minutes remaining on the active cycle, or null when not running. */
56566
+ remainingMinutes: number().int().nonnegative().nullable(),
56567
+ /** Cycle completion 0..100, or null when not applicable. */
56568
+ progressPercent: number().min(0).max(100).nullable(),
56569
+ /** True when the door is reported open. */
56570
+ doorOpen: boolean(),
56571
+ /** True when remote start is allowed (door closed, power on, etc.). */
56572
+ remoteStartAllowed: boolean(),
56573
+ /** Main power / switched-on state. */
56574
+ powerOn: boolean(),
56575
+ saltLevel: DishwasherConsumableLevelSchema.nullable(),
56576
+ rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56577
+ halfLoad: boolean(),
56578
+ hygienePlus: boolean(),
56579
+ errorCode: number().nullable(),
56580
+ errorLabel: string().nullable(),
56581
+ lastFetchedAt: number()
56582
+ });
56583
+ var dishwasherCapability = {
56584
+ name: "dishwasher",
56585
+ scope: "device",
56586
+ deviceNative: true,
56587
+ mode: "singleton",
56588
+ deviceTypes: [DeviceType.Dishwasher],
56589
+ methods: {
56590
+ start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56591
+ kind: "mutation",
56592
+ auth: "protected"
56593
+ }),
56594
+ pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56595
+ kind: "mutation",
56596
+ auth: "protected"
56597
+ }),
56598
+ stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56599
+ kind: "mutation",
56600
+ auth: "protected"
56601
+ }),
56602
+ setProgram: method(object({
56603
+ deviceId: number().int().nonnegative(),
56604
+ program: string().min(1)
56605
+ }), _void(), {
56606
+ kind: "mutation",
56607
+ auth: "protected"
56608
+ }),
56609
+ setPower: method(object({
56610
+ deviceId: number().int().nonnegative(),
56611
+ on: boolean()
56612
+ }), _void(), {
56613
+ kind: "mutation",
56614
+ auth: "protected"
56615
+ }),
56616
+ setHalfLoad: method(object({
56617
+ deviceId: number().int().nonnegative(),
56618
+ on: boolean()
56619
+ }), _void(), {
56620
+ kind: "mutation",
56621
+ auth: "protected"
56622
+ }),
56623
+ setHygienePlus: method(object({
56624
+ deviceId: number().int().nonnegative(),
56625
+ on: boolean()
56626
+ }), _void(), {
56627
+ kind: "mutation",
56628
+ auth: "protected"
56629
+ }),
56630
+ setOption: method(object({
56631
+ deviceId: number().int().nonnegative(),
56632
+ key: string().min(1),
56633
+ value: union([
56634
+ boolean(),
56635
+ string(),
56636
+ number()
56637
+ ])
56638
+ }), _void(), {
56639
+ kind: "mutation",
56640
+ auth: "protected"
56641
+ })
56642
+ },
56643
+ status: {
56644
+ schema: DishwasherStatusSchema,
56645
+ kind: "poll"
56646
+ },
56647
+ runtimeState: DishwasherStatusSchema,
56648
+ durability: "session",
56649
+ history: { fields: { progressPercent: {
56650
+ kind: "gauge",
56651
+ unit: "%",
56652
+ deadband: 2
56653
+ } } }
56654
+ };
56525
56655
  var DoorbellStatusSchema = object({
56526
56656
  /** Ms epoch of the last press. null = never observed since this provider started. */
56527
56657
  lastPressedAt: number().nullable(),
@@ -57324,6 +57454,32 @@ var gasCapability = {
57324
57454
  * whether persisting is worth a SQLite commit. */
57325
57455
  volatileStateFields: ["lastChangedAt"]
57326
57456
  };
57457
+ var HeatingValveStatusSchema = object({
57458
+ /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
57459
+ position: number().min(0).max(100).nullable(),
57460
+ /** Ms epoch when the slice was last updated (push or poll). */
57461
+ lastFetchedAt: number()
57462
+ });
57463
+ var heatingValveCapability = {
57464
+ name: "heating-valve",
57465
+ scope: "device",
57466
+ deviceNative: true,
57467
+ mode: "singleton",
57468
+ deviceTypes: [DeviceType.Thermostat],
57469
+ methods: {},
57470
+ status: {
57471
+ schema: HeatingValveStatusSchema,
57472
+ kind: "push"
57473
+ },
57474
+ runtimeState: HeatingValveStatusSchema,
57475
+ durability: "session",
57476
+ history: { fields: { position: {
57477
+ kind: "gauge",
57478
+ unit: "%",
57479
+ deadband: 1
57480
+ } } },
57481
+ volatileStateFields: ["lastFetchedAt"]
57482
+ };
57327
57483
  /**
57328
57484
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
57329
57485
  * an on/off actuator with an optional target-humidity setpoint and an
@@ -67329,6 +67485,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
67329
67485
  dayNight: dayNightCapability,
67330
67486
  deviceDiscovery: deviceDiscoveryCapability,
67331
67487
  deviceStatus: deviceStatusCapability,
67488
+ dishwasher: dishwasherCapability,
67332
67489
  doorbell: doorbellCapability,
67333
67490
  enumSensor: enumSensorCapability,
67334
67491
  eventEmitter: eventEmitterCapability,
@@ -67336,6 +67493,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
67336
67493
  featureProbe: featureProbeCapability,
67337
67494
  flood: floodCapability,
67338
67495
  gas: gasCapability,
67496
+ heatingValve: heatingValveCapability,
67339
67497
  humidifier: humidifierCapability,
67340
67498
  humiditySensor: humiditySensorCapability,
67341
67499
  image: imageCapability,
@@ -68061,6 +68219,12 @@ var BaseDeviceProvider = class extends BaseAddon {
68061
68219
  provider: this
68062
68220
  }];
68063
68221
  }
68222
+ /** Flatten `super.onInitialize()` whether it returned an array or an envelope. */
68223
+ providerRegistrationsFromSuper(result) {
68224
+ if (Array.isArray(result)) return result;
68225
+ if (result !== void 0 && result.providers !== void 0) return [...result.providers];
68226
+ return [];
68227
+ }
68064
68228
  async onShutdown() {
68065
68229
  this._restoreShuttingDown = true;
68066
68230
  this.cancelRestoreRetries();
@@ -68587,7 +68751,7 @@ var BaseDeviceProvider = class extends BaseAddon {
68587
68751
  return toDeviceSummary(device, this.addonId);
68588
68752
  }
68589
68753
  };
68590
- 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;
68754
+ 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;
68591
68755
  new Set(Object.values(DeviceType));
68592
68756
  Object.freeze({
68593
68757
  "accessories.getStatus": {
@@ -71008,6 +71172,60 @@ Object.freeze({
71008
71172
  addonId: null,
71009
71173
  access: "view"
71010
71174
  },
71175
+ "dishwasher.getStatus": {
71176
+ capName: "dishwasher",
71177
+ capScope: "device",
71178
+ addonId: null,
71179
+ access: "view"
71180
+ },
71181
+ "dishwasher.pause": {
71182
+ capName: "dishwasher",
71183
+ capScope: "device",
71184
+ addonId: null,
71185
+ access: "create"
71186
+ },
71187
+ "dishwasher.setHalfLoad": {
71188
+ capName: "dishwasher",
71189
+ capScope: "device",
71190
+ addonId: null,
71191
+ access: "create"
71192
+ },
71193
+ "dishwasher.setHygienePlus": {
71194
+ capName: "dishwasher",
71195
+ capScope: "device",
71196
+ addonId: null,
71197
+ access: "create"
71198
+ },
71199
+ "dishwasher.setOption": {
71200
+ capName: "dishwasher",
71201
+ capScope: "device",
71202
+ addonId: null,
71203
+ access: "create"
71204
+ },
71205
+ "dishwasher.setPower": {
71206
+ capName: "dishwasher",
71207
+ capScope: "device",
71208
+ addonId: null,
71209
+ access: "create"
71210
+ },
71211
+ "dishwasher.setProgram": {
71212
+ capName: "dishwasher",
71213
+ capScope: "device",
71214
+ addonId: null,
71215
+ access: "create"
71216
+ },
71217
+ "dishwasher.start": {
71218
+ capName: "dishwasher",
71219
+ capScope: "device",
71220
+ addonId: null,
71221
+ access: "create"
71222
+ },
71223
+ "dishwasher.stop": {
71224
+ capName: "dishwasher",
71225
+ capScope: "device",
71226
+ addonId: null,
71227
+ access: "create"
71228
+ },
71011
71229
  "doorbell.getStatus": {
71012
71230
  capName: "doorbell",
71013
71231
  capScope: "device",
@@ -71218,6 +71436,12 @@ Object.freeze({
71218
71436
  addonId: null,
71219
71437
  access: "view"
71220
71438
  },
71439
+ "heatingValve.getStatus": {
71440
+ capName: "heating-valve",
71441
+ capScope: "device",
71442
+ addonId: null,
71443
+ access: "view"
71444
+ },
71221
71445
  "humidifier.getStatus": {
71222
71446
  capName: "humidifier",
71223
71447
  capScope: "device",
@@ -76805,7 +77029,7 @@ Object.freeze({
76805
77029
  access: "create"
76806
77030
  }
76807
77031
  });
76808
- 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;
77032
+ 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;
76809
77033
  DeviceFeature.BatteryOperated;
76810
77034
  var LAST_FETCHED_FIELD = "lastFetchedAt";
76811
77035
  /**
@@ -77781,6 +78005,51 @@ Object.freeze({
77781
78005
  form: "single",
77782
78006
  optional: false
77783
78007
  }],
78008
+ "dishwasher.getStatus": [{
78009
+ name: "deviceId",
78010
+ form: "single",
78011
+ optional: false
78012
+ }],
78013
+ "dishwasher.pause": [{
78014
+ name: "deviceId",
78015
+ form: "single",
78016
+ optional: false
78017
+ }],
78018
+ "dishwasher.setHalfLoad": [{
78019
+ name: "deviceId",
78020
+ form: "single",
78021
+ optional: false
78022
+ }],
78023
+ "dishwasher.setHygienePlus": [{
78024
+ name: "deviceId",
78025
+ form: "single",
78026
+ optional: false
78027
+ }],
78028
+ "dishwasher.setOption": [{
78029
+ name: "deviceId",
78030
+ form: "single",
78031
+ optional: false
78032
+ }],
78033
+ "dishwasher.setPower": [{
78034
+ name: "deviceId",
78035
+ form: "single",
78036
+ optional: false
78037
+ }],
78038
+ "dishwasher.setProgram": [{
78039
+ name: "deviceId",
78040
+ form: "single",
78041
+ optional: false
78042
+ }],
78043
+ "dishwasher.start": [{
78044
+ name: "deviceId",
78045
+ form: "single",
78046
+ optional: false
78047
+ }],
78048
+ "dishwasher.stop": [{
78049
+ name: "deviceId",
78050
+ form: "single",
78051
+ optional: false
78052
+ }],
77784
78053
  "doorbell.getStatus": [{
77785
78054
  name: "deviceId",
77786
78055
  form: "single",
@@ -77850,6 +78119,11 @@ Object.freeze({
77850
78119
  form: "single",
77851
78120
  optional: false
77852
78121
  }],
78122
+ "heatingValve.getStatus": [{
78123
+ name: "deviceId",
78124
+ form: "single",
78125
+ optional: false
78126
+ }],
77853
78127
  "humidifier.getStatus": [{
77854
78128
  name: "deviceId",
77855
78129
  form: "single",
@@ -203170,7 +203444,7 @@ var ReolinkProviderAddon = class extends BaseDeviceProvider {
203170
203444
  return [...EMAIL_PUSH_SECTION_IDS, ...BAICHUAN_WEBHOOK_SECTION_IDS];
203171
203445
  }
203172
203446
  async onInitialize() {
203173
- const regs = await super.onInitialize();
203447
+ const regs = this.providerRegistrationsFromSuper(await super.onInitialize());
203174
203448
  this.logChannels = createLogChannelsProvider(this.ctx.logger.child("log-channels"));
203175
203449
  regs.push({
203176
203450
  capability: logChannelsCapability,
package/dist/addon.mjs CHANGED
@@ -5434,7 +5434,7 @@ var ZodIssueCode = {
5434
5434
  var ZodFirstPartyTypeKind;
5435
5435
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5436
5436
  //#endregion
5437
- //#region ../types/dist/sleep-bZIhUvjd.mjs
5437
+ //#region ../types/dist/sleep-BOjuyoPC.mjs
5438
5438
  /**
5439
5439
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5440
5440
  * window to float samples (D455).
@@ -8529,7 +8529,7 @@ function sleep$2(ms) {
8529
8529
  return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
8530
8530
  }
8531
8531
  //#endregion
8532
- //#region ../types/dist/err-msg--2RrYiLO.mjs
8532
+ //#region ../types/dist/err-msg-BXKzRBwg.mjs
8533
8533
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8534
8534
  DeviceType["Camera"] = "camera";
8535
8535
  DeviceType["Hub"] = "hub";
@@ -8621,6 +8621,10 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
8621
8621
  * native PetKit (`nodepetkit` `FeederDevice`), reusable by other feeder
8622
8622
  * integrations sharing the same food/desiccant/hopper surface. */
8623
8623
  DeviceType["PetFeeder"] = "pet-feeder";
8624
+ /** Built-in dishwasher — program lifecycle, door / remote-start gates,
8625
+ * salt and rinse-aid levels. Installed with the `dishwasher` cap.
8626
+ * Sources: native Bosch Home Connect, reusable by similar integrations. */
8627
+ DeviceType["Dishwasher"] = "dishwasher";
8624
8628
  return DeviceType;
8625
8629
  }({});
8626
8630
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -8868,7 +8872,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8868
8872
  return DeviceRole;
8869
8873
  }({});
8870
8874
  //#endregion
8871
- //#region ../types/dist/composition-DOwQB_Ua.mjs
8875
+ //#region ../types/dist/composition-CB6PMT9p.mjs
8872
8876
  /**
8873
8877
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8874
8878
  *
@@ -13806,8 +13810,13 @@ var AlertSeveritySchema = _enum([
13806
13810
  "info",
13807
13811
  "success",
13808
13812
  "warning",
13809
- "error"
13813
+ "error",
13814
+ "critical"
13810
13815
  ]);
13816
+ var AlertActionSchema = object({
13817
+ label: string(),
13818
+ href: string().optional()
13819
+ });
13811
13820
  var AlertStatusSchema = _enum([
13812
13821
  "active",
13813
13822
  "in-progress",
@@ -13825,6 +13834,7 @@ var AlertSchema = object({
13825
13834
  severity: AlertSeveritySchema,
13826
13835
  title: string(),
13827
13836
  message: string(),
13837
+ action: AlertActionSchema.optional(),
13828
13838
  status: AlertStatusSchema,
13829
13839
  progress: number().optional(),
13830
13840
  read: boolean(),
@@ -55041,7 +55051,8 @@ var batteryCapability = {
55041
55051
  DeviceType.Button,
55042
55052
  DeviceType.Switch,
55043
55053
  DeviceType.PetFeeder,
55044
- DeviceType.Container
55054
+ DeviceType.Container,
55055
+ DeviceType.Thermostat
55045
55056
  ],
55046
55057
  methods: {
55047
55058
  /**
@@ -56514,6 +56525,125 @@ onStatusChanged: { data: object({
56514
56525
  * whether persisting is worth a SQLite commit. */
56515
56526
  volatileStateFields: ["lastChangedAt"]
56516
56527
  };
56528
+ /**
56529
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56530
+ * consumable levels (salt, rinse aid) and common program options.
56531
+ *
56532
+ * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56533
+ * by any integration that exposes the same program / option surface.
56534
+ *
56535
+ * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
56536
+ * provider refreshes the slice on an interval and eagerly after commands.
56537
+ */
56538
+ var DishwasherStateSchema = _enum([
56539
+ "idle",
56540
+ "running",
56541
+ "paused",
56542
+ "finished",
56543
+ "error",
56544
+ "unavailable"
56545
+ ]);
56546
+ var DishwasherConsumableLevelSchema = _enum([
56547
+ "ok",
56548
+ "low",
56549
+ "empty"
56550
+ ]);
56551
+ var DishwasherStatusSchema = object({
56552
+ state: DishwasherStateSchema,
56553
+ /** Active program id/name, or null when none selected / unknown. */
56554
+ program: string().nullable(),
56555
+ /** Program tokens the hardware accepts — drives the UI selector. */
56556
+ availablePrograms: array(string()),
56557
+ /** Minutes remaining on the active cycle, or null when not running. */
56558
+ remainingMinutes: number().int().nonnegative().nullable(),
56559
+ /** Cycle completion 0..100, or null when not applicable. */
56560
+ progressPercent: number().min(0).max(100).nullable(),
56561
+ /** True when the door is reported open. */
56562
+ doorOpen: boolean(),
56563
+ /** True when remote start is allowed (door closed, power on, etc.). */
56564
+ remoteStartAllowed: boolean(),
56565
+ /** Main power / switched-on state. */
56566
+ powerOn: boolean(),
56567
+ saltLevel: DishwasherConsumableLevelSchema.nullable(),
56568
+ rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56569
+ halfLoad: boolean(),
56570
+ hygienePlus: boolean(),
56571
+ errorCode: number().nullable(),
56572
+ errorLabel: string().nullable(),
56573
+ lastFetchedAt: number()
56574
+ });
56575
+ var dishwasherCapability = {
56576
+ name: "dishwasher",
56577
+ scope: "device",
56578
+ deviceNative: true,
56579
+ mode: "singleton",
56580
+ deviceTypes: [DeviceType.Dishwasher],
56581
+ methods: {
56582
+ start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56583
+ kind: "mutation",
56584
+ auth: "protected"
56585
+ }),
56586
+ pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56587
+ kind: "mutation",
56588
+ auth: "protected"
56589
+ }),
56590
+ stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
56591
+ kind: "mutation",
56592
+ auth: "protected"
56593
+ }),
56594
+ setProgram: method(object({
56595
+ deviceId: number().int().nonnegative(),
56596
+ program: string().min(1)
56597
+ }), _void(), {
56598
+ kind: "mutation",
56599
+ auth: "protected"
56600
+ }),
56601
+ setPower: method(object({
56602
+ deviceId: number().int().nonnegative(),
56603
+ on: boolean()
56604
+ }), _void(), {
56605
+ kind: "mutation",
56606
+ auth: "protected"
56607
+ }),
56608
+ setHalfLoad: method(object({
56609
+ deviceId: number().int().nonnegative(),
56610
+ on: boolean()
56611
+ }), _void(), {
56612
+ kind: "mutation",
56613
+ auth: "protected"
56614
+ }),
56615
+ setHygienePlus: method(object({
56616
+ deviceId: number().int().nonnegative(),
56617
+ on: boolean()
56618
+ }), _void(), {
56619
+ kind: "mutation",
56620
+ auth: "protected"
56621
+ }),
56622
+ setOption: method(object({
56623
+ deviceId: number().int().nonnegative(),
56624
+ key: string().min(1),
56625
+ value: union([
56626
+ boolean(),
56627
+ string(),
56628
+ number()
56629
+ ])
56630
+ }), _void(), {
56631
+ kind: "mutation",
56632
+ auth: "protected"
56633
+ })
56634
+ },
56635
+ status: {
56636
+ schema: DishwasherStatusSchema,
56637
+ kind: "poll"
56638
+ },
56639
+ runtimeState: DishwasherStatusSchema,
56640
+ durability: "session",
56641
+ history: { fields: { progressPercent: {
56642
+ kind: "gauge",
56643
+ unit: "%",
56644
+ deadband: 2
56645
+ } } }
56646
+ };
56517
56647
  var DoorbellStatusSchema = object({
56518
56648
  /** Ms epoch of the last press. null = never observed since this provider started. */
56519
56649
  lastPressedAt: number().nullable(),
@@ -57316,6 +57446,32 @@ var gasCapability = {
57316
57446
  * whether persisting is worth a SQLite commit. */
57317
57447
  volatileStateFields: ["lastChangedAt"]
57318
57448
  };
57449
+ var HeatingValveStatusSchema = object({
57450
+ /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
57451
+ position: number().min(0).max(100).nullable(),
57452
+ /** Ms epoch when the slice was last updated (push or poll). */
57453
+ lastFetchedAt: number()
57454
+ });
57455
+ var heatingValveCapability = {
57456
+ name: "heating-valve",
57457
+ scope: "device",
57458
+ deviceNative: true,
57459
+ mode: "singleton",
57460
+ deviceTypes: [DeviceType.Thermostat],
57461
+ methods: {},
57462
+ status: {
57463
+ schema: HeatingValveStatusSchema,
57464
+ kind: "push"
57465
+ },
57466
+ runtimeState: HeatingValveStatusSchema,
57467
+ durability: "session",
57468
+ history: { fields: { position: {
57469
+ kind: "gauge",
57470
+ unit: "%",
57471
+ deadband: 1
57472
+ } } },
57473
+ volatileStateFields: ["lastFetchedAt"]
57474
+ };
57319
57475
  /**
57320
57476
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
57321
57477
  * an on/off actuator with an optional target-humidity setpoint and an
@@ -67321,6 +67477,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
67321
67477
  dayNight: dayNightCapability,
67322
67478
  deviceDiscovery: deviceDiscoveryCapability,
67323
67479
  deviceStatus: deviceStatusCapability,
67480
+ dishwasher: dishwasherCapability,
67324
67481
  doorbell: doorbellCapability,
67325
67482
  enumSensor: enumSensorCapability,
67326
67483
  eventEmitter: eventEmitterCapability,
@@ -67328,6 +67485,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
67328
67485
  featureProbe: featureProbeCapability,
67329
67486
  flood: floodCapability,
67330
67487
  gas: gasCapability,
67488
+ heatingValve: heatingValveCapability,
67331
67489
  humidifier: humidifierCapability,
67332
67490
  humiditySensor: humiditySensorCapability,
67333
67491
  image: imageCapability,
@@ -68053,6 +68211,12 @@ var BaseDeviceProvider = class extends BaseAddon {
68053
68211
  provider: this
68054
68212
  }];
68055
68213
  }
68214
+ /** Flatten `super.onInitialize()` whether it returned an array or an envelope. */
68215
+ providerRegistrationsFromSuper(result) {
68216
+ if (Array.isArray(result)) return result;
68217
+ if (result !== void 0 && result.providers !== void 0) return [...result.providers];
68218
+ return [];
68219
+ }
68056
68220
  async onShutdown() {
68057
68221
  this._restoreShuttingDown = true;
68058
68222
  this.cancelRestoreRetries();
@@ -68579,7 +68743,7 @@ var BaseDeviceProvider = class extends BaseAddon {
68579
68743
  return toDeviceSummary(device, this.addonId);
68580
68744
  }
68581
68745
  };
68582
- 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;
68746
+ 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;
68583
68747
  new Set(Object.values(DeviceType));
68584
68748
  Object.freeze({
68585
68749
  "accessories.getStatus": {
@@ -71000,6 +71164,60 @@ Object.freeze({
71000
71164
  addonId: null,
71001
71165
  access: "view"
71002
71166
  },
71167
+ "dishwasher.getStatus": {
71168
+ capName: "dishwasher",
71169
+ capScope: "device",
71170
+ addonId: null,
71171
+ access: "view"
71172
+ },
71173
+ "dishwasher.pause": {
71174
+ capName: "dishwasher",
71175
+ capScope: "device",
71176
+ addonId: null,
71177
+ access: "create"
71178
+ },
71179
+ "dishwasher.setHalfLoad": {
71180
+ capName: "dishwasher",
71181
+ capScope: "device",
71182
+ addonId: null,
71183
+ access: "create"
71184
+ },
71185
+ "dishwasher.setHygienePlus": {
71186
+ capName: "dishwasher",
71187
+ capScope: "device",
71188
+ addonId: null,
71189
+ access: "create"
71190
+ },
71191
+ "dishwasher.setOption": {
71192
+ capName: "dishwasher",
71193
+ capScope: "device",
71194
+ addonId: null,
71195
+ access: "create"
71196
+ },
71197
+ "dishwasher.setPower": {
71198
+ capName: "dishwasher",
71199
+ capScope: "device",
71200
+ addonId: null,
71201
+ access: "create"
71202
+ },
71203
+ "dishwasher.setProgram": {
71204
+ capName: "dishwasher",
71205
+ capScope: "device",
71206
+ addonId: null,
71207
+ access: "create"
71208
+ },
71209
+ "dishwasher.start": {
71210
+ capName: "dishwasher",
71211
+ capScope: "device",
71212
+ addonId: null,
71213
+ access: "create"
71214
+ },
71215
+ "dishwasher.stop": {
71216
+ capName: "dishwasher",
71217
+ capScope: "device",
71218
+ addonId: null,
71219
+ access: "create"
71220
+ },
71003
71221
  "doorbell.getStatus": {
71004
71222
  capName: "doorbell",
71005
71223
  capScope: "device",
@@ -71210,6 +71428,12 @@ Object.freeze({
71210
71428
  addonId: null,
71211
71429
  access: "view"
71212
71430
  },
71431
+ "heatingValve.getStatus": {
71432
+ capName: "heating-valve",
71433
+ capScope: "device",
71434
+ addonId: null,
71435
+ access: "view"
71436
+ },
71213
71437
  "humidifier.getStatus": {
71214
71438
  capName: "humidifier",
71215
71439
  capScope: "device",
@@ -76797,7 +77021,7 @@ Object.freeze({
76797
77021
  access: "create"
76798
77022
  }
76799
77023
  });
76800
- 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;
77024
+ 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;
76801
77025
  DeviceFeature.BatteryOperated;
76802
77026
  var LAST_FETCHED_FIELD = "lastFetchedAt";
76803
77027
  /**
@@ -77773,6 +77997,51 @@ Object.freeze({
77773
77997
  form: "single",
77774
77998
  optional: false
77775
77999
  }],
78000
+ "dishwasher.getStatus": [{
78001
+ name: "deviceId",
78002
+ form: "single",
78003
+ optional: false
78004
+ }],
78005
+ "dishwasher.pause": [{
78006
+ name: "deviceId",
78007
+ form: "single",
78008
+ optional: false
78009
+ }],
78010
+ "dishwasher.setHalfLoad": [{
78011
+ name: "deviceId",
78012
+ form: "single",
78013
+ optional: false
78014
+ }],
78015
+ "dishwasher.setHygienePlus": [{
78016
+ name: "deviceId",
78017
+ form: "single",
78018
+ optional: false
78019
+ }],
78020
+ "dishwasher.setOption": [{
78021
+ name: "deviceId",
78022
+ form: "single",
78023
+ optional: false
78024
+ }],
78025
+ "dishwasher.setPower": [{
78026
+ name: "deviceId",
78027
+ form: "single",
78028
+ optional: false
78029
+ }],
78030
+ "dishwasher.setProgram": [{
78031
+ name: "deviceId",
78032
+ form: "single",
78033
+ optional: false
78034
+ }],
78035
+ "dishwasher.start": [{
78036
+ name: "deviceId",
78037
+ form: "single",
78038
+ optional: false
78039
+ }],
78040
+ "dishwasher.stop": [{
78041
+ name: "deviceId",
78042
+ form: "single",
78043
+ optional: false
78044
+ }],
77776
78045
  "doorbell.getStatus": [{
77777
78046
  name: "deviceId",
77778
78047
  form: "single",
@@ -77842,6 +78111,11 @@ Object.freeze({
77842
78111
  form: "single",
77843
78112
  optional: false
77844
78113
  }],
78114
+ "heatingValve.getStatus": [{
78115
+ name: "deviceId",
78116
+ form: "single",
78117
+ optional: false
78118
+ }],
77845
78119
  "humidifier.getStatus": [{
77846
78120
  name: "deviceId",
77847
78121
  form: "single",
@@ -203162,7 +203436,7 @@ var ReolinkProviderAddon = class extends BaseDeviceProvider {
203162
203436
  return [...EMAIL_PUSH_SECTION_IDS, ...BAICHUAN_WEBHOOK_SECTION_IDS];
203163
203437
  }
203164
203438
  async onInitialize() {
203165
- const regs = await super.onInitialize();
203439
+ const regs = this.providerRegistrationsFromSuper(await super.onInitialize());
203166
203440
  this.logChannels = createLogChannelsProvider(this.ctx.logger.child("log-channels"));
203167
203441
  regs.push({
203168
203442
  capability: logChannelsCapability,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.2.187",
3
+ "version": "1.2.188",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",