@camstack/addon-provider-amcrest 0.2.137 → 0.2.138

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
@@ -5441,7 +5441,7 @@ var ZodIssueCode = {
5441
5441
  var ZodFirstPartyTypeKind;
5442
5442
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5443
5443
  //#endregion
5444
- //#region ../types/dist/sleep-bZIhUvjd.mjs
5444
+ //#region ../types/dist/sleep-BOjuyoPC.mjs
5445
5445
  /**
5446
5446
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5447
5447
  * window to float samples (D455).
@@ -8474,7 +8474,7 @@ function userError(code, params, englishFallback) {
8474
8474
  return new CamstackError(code, params, englishFallback);
8475
8475
  }
8476
8476
  //#endregion
8477
- //#region ../types/dist/err-msg--2RrYiLO.mjs
8477
+ //#region ../types/dist/err-msg-BXKzRBwg.mjs
8478
8478
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8479
8479
  DeviceType["Camera"] = "camera";
8480
8480
  DeviceType["Hub"] = "hub";
@@ -8566,6 +8566,10 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
8566
8566
  * native PetKit (`nodepetkit` `FeederDevice`), reusable by other feeder
8567
8567
  * integrations sharing the same food/desiccant/hopper surface. */
8568
8568
  DeviceType["PetFeeder"] = "pet-feeder";
8569
+ /** Built-in dishwasher — program lifecycle, door / remote-start gates,
8570
+ * salt and rinse-aid levels. Installed with the `dishwasher` cap.
8571
+ * Sources: native Bosch Home Connect, reusable by similar integrations. */
8572
+ DeviceType["Dishwasher"] = "dishwasher";
8569
8573
  return DeviceType;
8570
8574
  }({});
8571
8575
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -8813,7 +8817,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8813
8817
  return DeviceRole;
8814
8818
  }({});
8815
8819
  //#endregion
8816
- //#region ../types/dist/composition-DOwQB_Ua.mjs
8820
+ //#region ../types/dist/composition-CB6PMT9p.mjs
8817
8821
  /**
8818
8822
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8819
8823
  *
@@ -13219,8 +13223,13 @@ var AlertSeveritySchema = _enum([
13219
13223
  "info",
13220
13224
  "success",
13221
13225
  "warning",
13222
- "error"
13226
+ "error",
13227
+ "critical"
13223
13228
  ]);
13229
+ var AlertActionSchema = object({
13230
+ label: string(),
13231
+ href: string().optional()
13232
+ });
13224
13233
  var AlertStatusSchema = _enum([
13225
13234
  "active",
13226
13235
  "in-progress",
@@ -13238,6 +13247,7 @@ var AlertSchema = object({
13238
13247
  severity: AlertSeveritySchema,
13239
13248
  title: string(),
13240
13249
  message: string(),
13250
+ action: AlertActionSchema.optional(),
13241
13251
  status: AlertStatusSchema,
13242
13252
  progress: number().optional(),
13243
13253
  read: boolean(),
@@ -54405,7 +54415,8 @@ var batteryCapability = {
54405
54415
  DeviceType.Button,
54406
54416
  DeviceType.Switch,
54407
54417
  DeviceType.PetFeeder,
54408
- DeviceType.Container
54418
+ DeviceType.Container,
54419
+ DeviceType.Thermostat
54409
54420
  ],
54410
54421
  methods: {
54411
54422
  /**
@@ -55878,6 +55889,125 @@ onStatusChanged: { data: object({
55878
55889
  * whether persisting is worth a SQLite commit. */
55879
55890
  volatileStateFields: ["lastChangedAt"]
55880
55891
  };
55892
+ /**
55893
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55894
+ * consumable levels (salt, rinse aid) and common program options.
55895
+ *
55896
+ * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55897
+ * by any integration that exposes the same program / option surface.
55898
+ *
55899
+ * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
55900
+ * provider refreshes the slice on an interval and eagerly after commands.
55901
+ */
55902
+ var DishwasherStateSchema = _enum([
55903
+ "idle",
55904
+ "running",
55905
+ "paused",
55906
+ "finished",
55907
+ "error",
55908
+ "unavailable"
55909
+ ]);
55910
+ var DishwasherConsumableLevelSchema = _enum([
55911
+ "ok",
55912
+ "low",
55913
+ "empty"
55914
+ ]);
55915
+ var DishwasherStatusSchema = object({
55916
+ state: DishwasherStateSchema,
55917
+ /** Active program id/name, or null when none selected / unknown. */
55918
+ program: string().nullable(),
55919
+ /** Program tokens the hardware accepts — drives the UI selector. */
55920
+ availablePrograms: array(string()),
55921
+ /** Minutes remaining on the active cycle, or null when not running. */
55922
+ remainingMinutes: number().int().nonnegative().nullable(),
55923
+ /** Cycle completion 0..100, or null when not applicable. */
55924
+ progressPercent: number().min(0).max(100).nullable(),
55925
+ /** True when the door is reported open. */
55926
+ doorOpen: boolean(),
55927
+ /** True when remote start is allowed (door closed, power on, etc.). */
55928
+ remoteStartAllowed: boolean(),
55929
+ /** Main power / switched-on state. */
55930
+ powerOn: boolean(),
55931
+ saltLevel: DishwasherConsumableLevelSchema.nullable(),
55932
+ rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55933
+ halfLoad: boolean(),
55934
+ hygienePlus: boolean(),
55935
+ errorCode: number().nullable(),
55936
+ errorLabel: string().nullable(),
55937
+ lastFetchedAt: number()
55938
+ });
55939
+ var dishwasherCapability = {
55940
+ name: "dishwasher",
55941
+ scope: "device",
55942
+ deviceNative: true,
55943
+ mode: "singleton",
55944
+ deviceTypes: [DeviceType.Dishwasher],
55945
+ methods: {
55946
+ start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55947
+ kind: "mutation",
55948
+ auth: "protected"
55949
+ }),
55950
+ pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55951
+ kind: "mutation",
55952
+ auth: "protected"
55953
+ }),
55954
+ stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55955
+ kind: "mutation",
55956
+ auth: "protected"
55957
+ }),
55958
+ setProgram: method(object({
55959
+ deviceId: number().int().nonnegative(),
55960
+ program: string().min(1)
55961
+ }), _void(), {
55962
+ kind: "mutation",
55963
+ auth: "protected"
55964
+ }),
55965
+ setPower: method(object({
55966
+ deviceId: number().int().nonnegative(),
55967
+ on: boolean()
55968
+ }), _void(), {
55969
+ kind: "mutation",
55970
+ auth: "protected"
55971
+ }),
55972
+ setHalfLoad: method(object({
55973
+ deviceId: number().int().nonnegative(),
55974
+ on: boolean()
55975
+ }), _void(), {
55976
+ kind: "mutation",
55977
+ auth: "protected"
55978
+ }),
55979
+ setHygienePlus: method(object({
55980
+ deviceId: number().int().nonnegative(),
55981
+ on: boolean()
55982
+ }), _void(), {
55983
+ kind: "mutation",
55984
+ auth: "protected"
55985
+ }),
55986
+ setOption: method(object({
55987
+ deviceId: number().int().nonnegative(),
55988
+ key: string().min(1),
55989
+ value: union([
55990
+ boolean(),
55991
+ string(),
55992
+ number()
55993
+ ])
55994
+ }), _void(), {
55995
+ kind: "mutation",
55996
+ auth: "protected"
55997
+ })
55998
+ },
55999
+ status: {
56000
+ schema: DishwasherStatusSchema,
56001
+ kind: "poll"
56002
+ },
56003
+ runtimeState: DishwasherStatusSchema,
56004
+ durability: "session",
56005
+ history: { fields: { progressPercent: {
56006
+ kind: "gauge",
56007
+ unit: "%",
56008
+ deadband: 2
56009
+ } } }
56010
+ };
55881
56011
  var DoorbellStatusSchema = object({
55882
56012
  /** Ms epoch of the last press. null = never observed since this provider started. */
55883
56013
  lastPressedAt: number().nullable(),
@@ -56680,6 +56810,32 @@ var gasCapability = {
56680
56810
  * whether persisting is worth a SQLite commit. */
56681
56811
  volatileStateFields: ["lastChangedAt"]
56682
56812
  };
56813
+ var HeatingValveStatusSchema = object({
56814
+ /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
56815
+ position: number().min(0).max(100).nullable(),
56816
+ /** Ms epoch when the slice was last updated (push or poll). */
56817
+ lastFetchedAt: number()
56818
+ });
56819
+ var heatingValveCapability = {
56820
+ name: "heating-valve",
56821
+ scope: "device",
56822
+ deviceNative: true,
56823
+ mode: "singleton",
56824
+ deviceTypes: [DeviceType.Thermostat],
56825
+ methods: {},
56826
+ status: {
56827
+ schema: HeatingValveStatusSchema,
56828
+ kind: "push"
56829
+ },
56830
+ runtimeState: HeatingValveStatusSchema,
56831
+ durability: "session",
56832
+ history: { fields: { position: {
56833
+ kind: "gauge",
56834
+ unit: "%",
56835
+ deadband: 1
56836
+ } } },
56837
+ volatileStateFields: ["lastFetchedAt"]
56838
+ };
56683
56839
  /**
56684
56840
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
56685
56841
  * an on/off actuator with an optional target-humidity setpoint and an
@@ -66562,6 +66718,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
66562
66718
  dayNight: dayNightCapability,
66563
66719
  deviceDiscovery: deviceDiscoveryCapability,
66564
66720
  deviceStatus: deviceStatusCapability,
66721
+ dishwasher: dishwasherCapability,
66565
66722
  doorbell: doorbellCapability,
66566
66723
  enumSensor: enumSensorCapability,
66567
66724
  eventEmitter: eventEmitterCapability,
@@ -66569,6 +66726,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
66569
66726
  featureProbe: featureProbeCapability,
66570
66727
  flood: floodCapability,
66571
66728
  gas: gasCapability,
66729
+ heatingValve: heatingValveCapability,
66572
66730
  humidifier: humidifierCapability,
66573
66731
  humiditySensor: humiditySensorCapability,
66574
66732
  image: imageCapability,
@@ -67294,6 +67452,12 @@ var BaseDeviceProvider = class extends BaseAddon {
67294
67452
  provider: this
67295
67453
  }];
67296
67454
  }
67455
+ /** Flatten `super.onInitialize()` whether it returned an array or an envelope. */
67456
+ providerRegistrationsFromSuper(result) {
67457
+ if (Array.isArray(result)) return result;
67458
+ if (result !== void 0 && result.providers !== void 0) return [...result.providers];
67459
+ return [];
67460
+ }
67297
67461
  async onShutdown() {
67298
67462
  this._restoreShuttingDown = true;
67299
67463
  this.cancelRestoreRetries();
@@ -67824,7 +67988,7 @@ var BaseDeviceProvider = class extends BaseAddon {
67824
67988
  function widenDeviceConstructor(ctor) {
67825
67989
  return ctor;
67826
67990
  }
67827
- 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;
67991
+ 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;
67828
67992
  new Set(Object.values(DeviceType));
67829
67993
  Object.freeze({
67830
67994
  "accessories.getStatus": {
@@ -70245,6 +70409,60 @@ Object.freeze({
70245
70409
  addonId: null,
70246
70410
  access: "view"
70247
70411
  },
70412
+ "dishwasher.getStatus": {
70413
+ capName: "dishwasher",
70414
+ capScope: "device",
70415
+ addonId: null,
70416
+ access: "view"
70417
+ },
70418
+ "dishwasher.pause": {
70419
+ capName: "dishwasher",
70420
+ capScope: "device",
70421
+ addonId: null,
70422
+ access: "create"
70423
+ },
70424
+ "dishwasher.setHalfLoad": {
70425
+ capName: "dishwasher",
70426
+ capScope: "device",
70427
+ addonId: null,
70428
+ access: "create"
70429
+ },
70430
+ "dishwasher.setHygienePlus": {
70431
+ capName: "dishwasher",
70432
+ capScope: "device",
70433
+ addonId: null,
70434
+ access: "create"
70435
+ },
70436
+ "dishwasher.setOption": {
70437
+ capName: "dishwasher",
70438
+ capScope: "device",
70439
+ addonId: null,
70440
+ access: "create"
70441
+ },
70442
+ "dishwasher.setPower": {
70443
+ capName: "dishwasher",
70444
+ capScope: "device",
70445
+ addonId: null,
70446
+ access: "create"
70447
+ },
70448
+ "dishwasher.setProgram": {
70449
+ capName: "dishwasher",
70450
+ capScope: "device",
70451
+ addonId: null,
70452
+ access: "create"
70453
+ },
70454
+ "dishwasher.start": {
70455
+ capName: "dishwasher",
70456
+ capScope: "device",
70457
+ addonId: null,
70458
+ access: "create"
70459
+ },
70460
+ "dishwasher.stop": {
70461
+ capName: "dishwasher",
70462
+ capScope: "device",
70463
+ addonId: null,
70464
+ access: "create"
70465
+ },
70248
70466
  "doorbell.getStatus": {
70249
70467
  capName: "doorbell",
70250
70468
  capScope: "device",
@@ -70455,6 +70673,12 @@ Object.freeze({
70455
70673
  addonId: null,
70456
70674
  access: "view"
70457
70675
  },
70676
+ "heatingValve.getStatus": {
70677
+ capName: "heating-valve",
70678
+ capScope: "device",
70679
+ addonId: null,
70680
+ access: "view"
70681
+ },
70458
70682
  "humidifier.getStatus": {
70459
70683
  capName: "humidifier",
70460
70684
  capScope: "device",
@@ -76042,7 +76266,7 @@ Object.freeze({
76042
76266
  access: "create"
76043
76267
  }
76044
76268
  });
76045
- 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;
76269
+ 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;
76046
76270
  DeviceFeature.BatteryOperated;
76047
76271
  /** Reject after `ms`; always clears its own timer. */
76048
76272
  async function withTimeout$1(promise, ms, label) {
@@ -77072,6 +77296,51 @@ Object.freeze({
77072
77296
  form: "single",
77073
77297
  optional: false
77074
77298
  }],
77299
+ "dishwasher.getStatus": [{
77300
+ name: "deviceId",
77301
+ form: "single",
77302
+ optional: false
77303
+ }],
77304
+ "dishwasher.pause": [{
77305
+ name: "deviceId",
77306
+ form: "single",
77307
+ optional: false
77308
+ }],
77309
+ "dishwasher.setHalfLoad": [{
77310
+ name: "deviceId",
77311
+ form: "single",
77312
+ optional: false
77313
+ }],
77314
+ "dishwasher.setHygienePlus": [{
77315
+ name: "deviceId",
77316
+ form: "single",
77317
+ optional: false
77318
+ }],
77319
+ "dishwasher.setOption": [{
77320
+ name: "deviceId",
77321
+ form: "single",
77322
+ optional: false
77323
+ }],
77324
+ "dishwasher.setPower": [{
77325
+ name: "deviceId",
77326
+ form: "single",
77327
+ optional: false
77328
+ }],
77329
+ "dishwasher.setProgram": [{
77330
+ name: "deviceId",
77331
+ form: "single",
77332
+ optional: false
77333
+ }],
77334
+ "dishwasher.start": [{
77335
+ name: "deviceId",
77336
+ form: "single",
77337
+ optional: false
77338
+ }],
77339
+ "dishwasher.stop": [{
77340
+ name: "deviceId",
77341
+ form: "single",
77342
+ optional: false
77343
+ }],
77075
77344
  "doorbell.getStatus": [{
77076
77345
  name: "deviceId",
77077
77346
  form: "single",
@@ -77141,6 +77410,11 @@ Object.freeze({
77141
77410
  form: "single",
77142
77411
  optional: false
77143
77412
  }],
77413
+ "heatingValve.getStatus": [{
77414
+ name: "deviceId",
77415
+ form: "single",
77416
+ optional: false
77417
+ }],
77144
77418
  "humidifier.getStatus": [{
77145
77419
  name: "deviceId",
77146
77420
  form: "single",
@@ -96944,7 +97218,7 @@ var AmcrestProviderAddon = class extends BaseDeviceProvider {
96944
97218
  throw new Error(`Amcrest: probe on ${host || "(unknown host)"} resolved neither mac nor host address — cannot persist a stable row key. Verify network reachability + credentials, then retry.`);
96945
97219
  }
96946
97220
  async onInitialize() {
96947
- const regs = await super.onInitialize();
97221
+ const regs = this.providerRegistrationsFromSuper(await super.onInitialize());
96948
97222
  this.clipService = createClipService({
96949
97223
  dataDir: this.ctx.dataDir,
96950
97224
  logger: this.ctx.logger,
package/dist/addon.mjs CHANGED
@@ -5420,7 +5420,7 @@ var ZodIssueCode = {
5420
5420
  var ZodFirstPartyTypeKind;
5421
5421
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5422
5422
  //#endregion
5423
- //#region ../types/dist/sleep-bZIhUvjd.mjs
5423
+ //#region ../types/dist/sleep-BOjuyoPC.mjs
5424
5424
  /**
5425
5425
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5426
5426
  * window to float samples (D455).
@@ -8453,7 +8453,7 @@ function userError(code, params, englishFallback) {
8453
8453
  return new CamstackError(code, params, englishFallback);
8454
8454
  }
8455
8455
  //#endregion
8456
- //#region ../types/dist/err-msg--2RrYiLO.mjs
8456
+ //#region ../types/dist/err-msg-BXKzRBwg.mjs
8457
8457
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8458
8458
  DeviceType["Camera"] = "camera";
8459
8459
  DeviceType["Hub"] = "hub";
@@ -8545,6 +8545,10 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
8545
8545
  * native PetKit (`nodepetkit` `FeederDevice`), reusable by other feeder
8546
8546
  * integrations sharing the same food/desiccant/hopper surface. */
8547
8547
  DeviceType["PetFeeder"] = "pet-feeder";
8548
+ /** Built-in dishwasher — program lifecycle, door / remote-start gates,
8549
+ * salt and rinse-aid levels. Installed with the `dishwasher` cap.
8550
+ * Sources: native Bosch Home Connect, reusable by similar integrations. */
8551
+ DeviceType["Dishwasher"] = "dishwasher";
8548
8552
  return DeviceType;
8549
8553
  }({});
8550
8554
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -8792,7 +8796,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8792
8796
  return DeviceRole;
8793
8797
  }({});
8794
8798
  //#endregion
8795
- //#region ../types/dist/composition-DOwQB_Ua.mjs
8799
+ //#region ../types/dist/composition-CB6PMT9p.mjs
8796
8800
  /**
8797
8801
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8798
8802
  *
@@ -13198,8 +13202,13 @@ var AlertSeveritySchema = _enum([
13198
13202
  "info",
13199
13203
  "success",
13200
13204
  "warning",
13201
- "error"
13205
+ "error",
13206
+ "critical"
13202
13207
  ]);
13208
+ var AlertActionSchema = object({
13209
+ label: string(),
13210
+ href: string().optional()
13211
+ });
13203
13212
  var AlertStatusSchema = _enum([
13204
13213
  "active",
13205
13214
  "in-progress",
@@ -13217,6 +13226,7 @@ var AlertSchema = object({
13217
13226
  severity: AlertSeveritySchema,
13218
13227
  title: string(),
13219
13228
  message: string(),
13229
+ action: AlertActionSchema.optional(),
13220
13230
  status: AlertStatusSchema,
13221
13231
  progress: number().optional(),
13222
13232
  read: boolean(),
@@ -54384,7 +54394,8 @@ var batteryCapability = {
54384
54394
  DeviceType.Button,
54385
54395
  DeviceType.Switch,
54386
54396
  DeviceType.PetFeeder,
54387
- DeviceType.Container
54397
+ DeviceType.Container,
54398
+ DeviceType.Thermostat
54388
54399
  ],
54389
54400
  methods: {
54390
54401
  /**
@@ -55857,6 +55868,125 @@ onStatusChanged: { data: object({
55857
55868
  * whether persisting is worth a SQLite commit. */
55858
55869
  volatileStateFields: ["lastChangedAt"]
55859
55870
  };
55871
+ /**
55872
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55873
+ * consumable levels (salt, rinse aid) and common program options.
55874
+ *
55875
+ * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55876
+ * by any integration that exposes the same program / option surface.
55877
+ *
55878
+ * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
55879
+ * provider refreshes the slice on an interval and eagerly after commands.
55880
+ */
55881
+ var DishwasherStateSchema = _enum([
55882
+ "idle",
55883
+ "running",
55884
+ "paused",
55885
+ "finished",
55886
+ "error",
55887
+ "unavailable"
55888
+ ]);
55889
+ var DishwasherConsumableLevelSchema = _enum([
55890
+ "ok",
55891
+ "low",
55892
+ "empty"
55893
+ ]);
55894
+ var DishwasherStatusSchema = object({
55895
+ state: DishwasherStateSchema,
55896
+ /** Active program id/name, or null when none selected / unknown. */
55897
+ program: string().nullable(),
55898
+ /** Program tokens the hardware accepts — drives the UI selector. */
55899
+ availablePrograms: array(string()),
55900
+ /** Minutes remaining on the active cycle, or null when not running. */
55901
+ remainingMinutes: number().int().nonnegative().nullable(),
55902
+ /** Cycle completion 0..100, or null when not applicable. */
55903
+ progressPercent: number().min(0).max(100).nullable(),
55904
+ /** True when the door is reported open. */
55905
+ doorOpen: boolean(),
55906
+ /** True when remote start is allowed (door closed, power on, etc.). */
55907
+ remoteStartAllowed: boolean(),
55908
+ /** Main power / switched-on state. */
55909
+ powerOn: boolean(),
55910
+ saltLevel: DishwasherConsumableLevelSchema.nullable(),
55911
+ rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55912
+ halfLoad: boolean(),
55913
+ hygienePlus: boolean(),
55914
+ errorCode: number().nullable(),
55915
+ errorLabel: string().nullable(),
55916
+ lastFetchedAt: number()
55917
+ });
55918
+ var dishwasherCapability = {
55919
+ name: "dishwasher",
55920
+ scope: "device",
55921
+ deviceNative: true,
55922
+ mode: "singleton",
55923
+ deviceTypes: [DeviceType.Dishwasher],
55924
+ methods: {
55925
+ start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55926
+ kind: "mutation",
55927
+ auth: "protected"
55928
+ }),
55929
+ pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55930
+ kind: "mutation",
55931
+ auth: "protected"
55932
+ }),
55933
+ stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55934
+ kind: "mutation",
55935
+ auth: "protected"
55936
+ }),
55937
+ setProgram: method(object({
55938
+ deviceId: number().int().nonnegative(),
55939
+ program: string().min(1)
55940
+ }), _void(), {
55941
+ kind: "mutation",
55942
+ auth: "protected"
55943
+ }),
55944
+ setPower: method(object({
55945
+ deviceId: number().int().nonnegative(),
55946
+ on: boolean()
55947
+ }), _void(), {
55948
+ kind: "mutation",
55949
+ auth: "protected"
55950
+ }),
55951
+ setHalfLoad: method(object({
55952
+ deviceId: number().int().nonnegative(),
55953
+ on: boolean()
55954
+ }), _void(), {
55955
+ kind: "mutation",
55956
+ auth: "protected"
55957
+ }),
55958
+ setHygienePlus: method(object({
55959
+ deviceId: number().int().nonnegative(),
55960
+ on: boolean()
55961
+ }), _void(), {
55962
+ kind: "mutation",
55963
+ auth: "protected"
55964
+ }),
55965
+ setOption: method(object({
55966
+ deviceId: number().int().nonnegative(),
55967
+ key: string().min(1),
55968
+ value: union([
55969
+ boolean(),
55970
+ string(),
55971
+ number()
55972
+ ])
55973
+ }), _void(), {
55974
+ kind: "mutation",
55975
+ auth: "protected"
55976
+ })
55977
+ },
55978
+ status: {
55979
+ schema: DishwasherStatusSchema,
55980
+ kind: "poll"
55981
+ },
55982
+ runtimeState: DishwasherStatusSchema,
55983
+ durability: "session",
55984
+ history: { fields: { progressPercent: {
55985
+ kind: "gauge",
55986
+ unit: "%",
55987
+ deadband: 2
55988
+ } } }
55989
+ };
55860
55990
  var DoorbellStatusSchema = object({
55861
55991
  /** Ms epoch of the last press. null = never observed since this provider started. */
55862
55992
  lastPressedAt: number().nullable(),
@@ -56659,6 +56789,32 @@ var gasCapability = {
56659
56789
  * whether persisting is worth a SQLite commit. */
56660
56790
  volatileStateFields: ["lastChangedAt"]
56661
56791
  };
56792
+ var HeatingValveStatusSchema = object({
56793
+ /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
56794
+ position: number().min(0).max(100).nullable(),
56795
+ /** Ms epoch when the slice was last updated (push or poll). */
56796
+ lastFetchedAt: number()
56797
+ });
56798
+ var heatingValveCapability = {
56799
+ name: "heating-valve",
56800
+ scope: "device",
56801
+ deviceNative: true,
56802
+ mode: "singleton",
56803
+ deviceTypes: [DeviceType.Thermostat],
56804
+ methods: {},
56805
+ status: {
56806
+ schema: HeatingValveStatusSchema,
56807
+ kind: "push"
56808
+ },
56809
+ runtimeState: HeatingValveStatusSchema,
56810
+ durability: "session",
56811
+ history: { fields: { position: {
56812
+ kind: "gauge",
56813
+ unit: "%",
56814
+ deadband: 1
56815
+ } } },
56816
+ volatileStateFields: ["lastFetchedAt"]
56817
+ };
56662
56818
  /**
56663
56819
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
56664
56820
  * an on/off actuator with an optional target-humidity setpoint and an
@@ -66541,6 +66697,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
66541
66697
  dayNight: dayNightCapability,
66542
66698
  deviceDiscovery: deviceDiscoveryCapability,
66543
66699
  deviceStatus: deviceStatusCapability,
66700
+ dishwasher: dishwasherCapability,
66544
66701
  doorbell: doorbellCapability,
66545
66702
  enumSensor: enumSensorCapability,
66546
66703
  eventEmitter: eventEmitterCapability,
@@ -66548,6 +66705,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
66548
66705
  featureProbe: featureProbeCapability,
66549
66706
  flood: floodCapability,
66550
66707
  gas: gasCapability,
66708
+ heatingValve: heatingValveCapability,
66551
66709
  humidifier: humidifierCapability,
66552
66710
  humiditySensor: humiditySensorCapability,
66553
66711
  image: imageCapability,
@@ -67273,6 +67431,12 @@ var BaseDeviceProvider = class extends BaseAddon {
67273
67431
  provider: this
67274
67432
  }];
67275
67433
  }
67434
+ /** Flatten `super.onInitialize()` whether it returned an array or an envelope. */
67435
+ providerRegistrationsFromSuper(result) {
67436
+ if (Array.isArray(result)) return result;
67437
+ if (result !== void 0 && result.providers !== void 0) return [...result.providers];
67438
+ return [];
67439
+ }
67276
67440
  async onShutdown() {
67277
67441
  this._restoreShuttingDown = true;
67278
67442
  this.cancelRestoreRetries();
@@ -67803,7 +67967,7 @@ var BaseDeviceProvider = class extends BaseAddon {
67803
67967
  function widenDeviceConstructor(ctor) {
67804
67968
  return ctor;
67805
67969
  }
67806
- 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;
67970
+ 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;
67807
67971
  new Set(Object.values(DeviceType));
67808
67972
  Object.freeze({
67809
67973
  "accessories.getStatus": {
@@ -70224,6 +70388,60 @@ Object.freeze({
70224
70388
  addonId: null,
70225
70389
  access: "view"
70226
70390
  },
70391
+ "dishwasher.getStatus": {
70392
+ capName: "dishwasher",
70393
+ capScope: "device",
70394
+ addonId: null,
70395
+ access: "view"
70396
+ },
70397
+ "dishwasher.pause": {
70398
+ capName: "dishwasher",
70399
+ capScope: "device",
70400
+ addonId: null,
70401
+ access: "create"
70402
+ },
70403
+ "dishwasher.setHalfLoad": {
70404
+ capName: "dishwasher",
70405
+ capScope: "device",
70406
+ addonId: null,
70407
+ access: "create"
70408
+ },
70409
+ "dishwasher.setHygienePlus": {
70410
+ capName: "dishwasher",
70411
+ capScope: "device",
70412
+ addonId: null,
70413
+ access: "create"
70414
+ },
70415
+ "dishwasher.setOption": {
70416
+ capName: "dishwasher",
70417
+ capScope: "device",
70418
+ addonId: null,
70419
+ access: "create"
70420
+ },
70421
+ "dishwasher.setPower": {
70422
+ capName: "dishwasher",
70423
+ capScope: "device",
70424
+ addonId: null,
70425
+ access: "create"
70426
+ },
70427
+ "dishwasher.setProgram": {
70428
+ capName: "dishwasher",
70429
+ capScope: "device",
70430
+ addonId: null,
70431
+ access: "create"
70432
+ },
70433
+ "dishwasher.start": {
70434
+ capName: "dishwasher",
70435
+ capScope: "device",
70436
+ addonId: null,
70437
+ access: "create"
70438
+ },
70439
+ "dishwasher.stop": {
70440
+ capName: "dishwasher",
70441
+ capScope: "device",
70442
+ addonId: null,
70443
+ access: "create"
70444
+ },
70227
70445
  "doorbell.getStatus": {
70228
70446
  capName: "doorbell",
70229
70447
  capScope: "device",
@@ -70434,6 +70652,12 @@ Object.freeze({
70434
70652
  addonId: null,
70435
70653
  access: "view"
70436
70654
  },
70655
+ "heatingValve.getStatus": {
70656
+ capName: "heating-valve",
70657
+ capScope: "device",
70658
+ addonId: null,
70659
+ access: "view"
70660
+ },
70437
70661
  "humidifier.getStatus": {
70438
70662
  capName: "humidifier",
70439
70663
  capScope: "device",
@@ -76021,7 +76245,7 @@ Object.freeze({
76021
76245
  access: "create"
76022
76246
  }
76023
76247
  });
76024
- 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;
76248
+ 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;
76025
76249
  DeviceFeature.BatteryOperated;
76026
76250
  /** Reject after `ms`; always clears its own timer. */
76027
76251
  async function withTimeout$1(promise, ms, label) {
@@ -77051,6 +77275,51 @@ Object.freeze({
77051
77275
  form: "single",
77052
77276
  optional: false
77053
77277
  }],
77278
+ "dishwasher.getStatus": [{
77279
+ name: "deviceId",
77280
+ form: "single",
77281
+ optional: false
77282
+ }],
77283
+ "dishwasher.pause": [{
77284
+ name: "deviceId",
77285
+ form: "single",
77286
+ optional: false
77287
+ }],
77288
+ "dishwasher.setHalfLoad": [{
77289
+ name: "deviceId",
77290
+ form: "single",
77291
+ optional: false
77292
+ }],
77293
+ "dishwasher.setHygienePlus": [{
77294
+ name: "deviceId",
77295
+ form: "single",
77296
+ optional: false
77297
+ }],
77298
+ "dishwasher.setOption": [{
77299
+ name: "deviceId",
77300
+ form: "single",
77301
+ optional: false
77302
+ }],
77303
+ "dishwasher.setPower": [{
77304
+ name: "deviceId",
77305
+ form: "single",
77306
+ optional: false
77307
+ }],
77308
+ "dishwasher.setProgram": [{
77309
+ name: "deviceId",
77310
+ form: "single",
77311
+ optional: false
77312
+ }],
77313
+ "dishwasher.start": [{
77314
+ name: "deviceId",
77315
+ form: "single",
77316
+ optional: false
77317
+ }],
77318
+ "dishwasher.stop": [{
77319
+ name: "deviceId",
77320
+ form: "single",
77321
+ optional: false
77322
+ }],
77054
77323
  "doorbell.getStatus": [{
77055
77324
  name: "deviceId",
77056
77325
  form: "single",
@@ -77120,6 +77389,11 @@ Object.freeze({
77120
77389
  form: "single",
77121
77390
  optional: false
77122
77391
  }],
77392
+ "heatingValve.getStatus": [{
77393
+ name: "deviceId",
77394
+ form: "single",
77395
+ optional: false
77396
+ }],
77123
77397
  "humidifier.getStatus": [{
77124
77398
  name: "deviceId",
77125
77399
  form: "single",
@@ -96923,7 +97197,7 @@ var AmcrestProviderAddon = class extends BaseDeviceProvider {
96923
97197
  throw new Error(`Amcrest: probe on ${host || "(unknown host)"} resolved neither mac nor host address — cannot persist a stable row key. Verify network reachability + credentials, then retry.`);
96924
97198
  }
96925
97199
  async onInitialize() {
96926
- const regs = await super.onInitialize();
97200
+ const regs = this.providerRegistrationsFromSuper(await super.onInitialize());
96927
97201
  this.clipService = createClipService({
96928
97202
  dataDir: this.ctx.dataDir,
96929
97203
  logger: this.ctx.logger,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-amcrest",
3
- "version": "0.2.137",
3
+ "version": "0.2.138",
4
4
  "description": "Amcrest/Dahua camera device provider addon for CamStack — Dahua CGI over HTTP(S) with digest auth (snapshot, RTSP catalog, PTZ, image/day-night config)",
5
5
  "keywords": [
6
6
  "camstack",