@camstack/addon-provider-homeassistant 1.2.628 → 1.2.629

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/addon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("./dist-CAyJy-Ek.js");
2
+ const require_dist = require("./dist-sQp4D2Eo.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_zlib = require("node:zlib");
5
5
  //#region src/ha-admin-link.ts
@@ -6487,6 +6487,8 @@ var PARENT_TYPE_PRIORITY = [
6487
6487
  require_dist.DeviceType.Fan,
6488
6488
  require_dist.DeviceType.Vacuum,
6489
6489
  require_dist.DeviceType.LawnMower,
6490
+ require_dist.DeviceType.Washer,
6491
+ require_dist.DeviceType.Dryer,
6490
6492
  require_dist.DeviceType.Dishwasher,
6491
6493
  require_dist.DeviceType.Light,
6492
6494
  require_dist.DeviceType.Switch,
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as lockControlCapability, $t as unknown, A as calendarSourceCapability, At as DeviceFeature, B as deviceAdminLinkCapability, Bt as entryBody, C as bestLocationMatch, Ct as tryConvertUnit, D as buildAddonRouteProvider, Dt as vibrationCapability, E as brokerCapability, Et as valveCapability, Ft as RecordSecretUnavailableError, G as fanControlCapability, Gt as boolean, It as baseUnitOf, J as humidifierCapability, Jt as number, K as floodCapability, Kt as discriminatedUnion, L as contactCapability, Lt as createEvent, M as climateControlCapability, Mt as DeviceType, N as colorCapability, Nt as errMsg, O as buildDeviceAdminUrl, Ot as waterHeaterCapability, P as connectivityCapability, Q as lawnMowerControlCapability, Qt as union, R as controlCapability, Rt as defineEntryKind, S as batteryCapability, St as tryConvertDelta, T as brightnessCapability, Tt as vacuumControlCapability, U as enumSensorCapability, Ut as _enum, V as deviceAdoptionCapability, W as eventEmitterCapability, Wt as array, X as imageCapability, Xt as record, Y as humiditySensorCapability, Yt as object, Z as ingestReading, Zt as string, _ as addonRoutesCapability, _t as scriptRunnerCapability, at as numericSensorCapability, b as ambientLightSensorCapability, bt as tamperCapability, ct as powerMeterCapability, dt as pressureSensorCapability, en as url, et as mediaPlayerCapability, ft as quantityFromUnit, g as accessoriesCapability, gt as runningStateCapability, h as TargetSchema, ht as runningFromVacuumState, it as notifierCapability, j as carbonMonoxideCapability, jt as DeviceRole, k as buttonCapability, kt as weatherCapability, lt as prepareNotification, m as RUNNING_STATE_COLD, mt as runningFromMediaPlayer, n as BaseDevice, nt as normalizeUnit, pt as runningFromLawnMower, q as gasCapability, qt as literal, r as BaseDeviceProvider, rt as notificationOutputCapability, st as parseAdminBase, tn as EventCategory, tt as motionCapability, u as EnumSensorDateTimeFormatSchema, ut as presenceCapability, v as airQualitySensorCapability, vt as smokeCapability, w as binaryCapability, wt as updateCapability, x as automationControlCapability, xt as temperatureSensorCapability, y as alarmPanelCapability, yt as switchCapability, z as coverCapability, zt as defineRecordKinds } from "./dist-BNRaAIW1.mjs";
1
+ import { $ as lawnMowerControlCapability, $t as union, A as buttonCapability, At as weatherCapability, B as coverCapability, Bt as defineRecordKinds, C as batteryCapability, Ct as tryConvertDelta, D as brokerCapability, Dt as valveCapability, E as brightnessCapability, Et as vacuumControlCapability, F as connectivityCapability, G as eventEmitterCapability, Gt as array, H as deviceAdoptionCapability, It as RecordSecretUnavailableError, J as gasCapability, Jt as literal, K as fanControlCapability, Kt as boolean, Lt as baseUnitOf, M as carbonMonoxideCapability, Mt as DeviceRole, N as climateControlCapability, Nt as DeviceType, O as buildAddonRouteProvider, Ot as vibrationCapability, P as colorCapability, Pt as errMsg, Q as ingestReading, Qt as string, R as contactCapability, Rt as createEvent, S as automationControlCapability, St as temperatureSensorCapability, T as binaryCapability, Tt as updateCapability, V as deviceAdminLinkCapability, Vt as entryBody, W as enumSensorCapability, Wt as _enum, X as humiditySensorCapability, Xt as object, Y as humidifierCapability, Yt as number, Z as imageCapability, Zt as record, _ as accessoriesCapability, _t as runningStateCapability, at as notifierCapability, b as alarmPanelCapability, bt as switchCapability, ct as parseAdminBase, dt as presenceCapability, en as unknown, et as lockControlCapability, ft as pressureSensorCapability, g as TargetSchema, gt as runningFromVacuumState, h as RUNNING_STATE_COLD, ht as runningFromMediaPlayer, it as notificationOutputCapability, j as calendarSourceCapability, jt as DeviceFeature, k as buildDeviceAdminUrl, kt as waterHeaterCapability, lt as powerMeterCapability, mt as runningFromLawnMower, n as BaseDevice, nn as EventCategory, nt as motionCapability, ot as numericSensorCapability, pt as quantityFromUnit, q as floodCapability, qt as discriminatedUnion, r as BaseDeviceProvider, rt as normalizeUnit, tn as url, tt as mediaPlayerCapability, u as EnumSensorDateTimeFormatSchema, ut as prepareNotification, v as addonRoutesCapability, vt as scriptRunnerCapability, w as bestLocationMatch, wt as tryConvertUnit, x as ambientLightSensorCapability, xt as tamperCapability, y as airQualitySensorCapability, yt as smokeCapability, z as controlCapability, zt as defineEntryKind } from "./dist-DWMNvtWN.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { brotliCompressSync, deflateSync, gzipSync } from "node:zlib";
4
4
  //#region src/ha-admin-link.ts
@@ -6486,6 +6486,8 @@ var PARENT_TYPE_PRIORITY = [
6486
6486
  DeviceType.Fan,
6487
6487
  DeviceType.Vacuum,
6488
6488
  DeviceType.LawnMower,
6489
+ DeviceType.Washer,
6490
+ DeviceType.Dryer,
6489
6491
  DeviceType.Dishwasher,
6490
6492
  DeviceType.Light,
6491
6493
  DeviceType.Switch,
@@ -10839,7 +10839,7 @@ object({
10839
10839
  params: record(string(), union([string(), number()])).optional()
10840
10840
  });
10841
10841
  //#endregion
10842
- //#region ../types/dist/err-msg-BXKzRBwg.mjs
10842
+ //#region ../types/dist/err-msg-DIorGYeC.mjs
10843
10843
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
10844
10844
  DeviceType["Camera"] = "camera";
10845
10845
  DeviceType["Hub"] = "hub";
@@ -10933,8 +10933,14 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
10933
10933
  DeviceType["PetFeeder"] = "pet-feeder";
10934
10934
  /** Built-in dishwasher — program lifecycle, door / remote-start gates,
10935
10935
  * salt and rinse-aid levels. Installed with the `dishwasher` cap.
10936
- * Sources: native Bosch Home Connect, reusable by similar integrations. */
10936
+ * Sources: native Bosch Home Connect, reusable by similar integrations.
10937
+ * A plug-built dishwasher carries running-state and power instead. */
10937
10938
  DeviceType["Dishwasher"] = "dishwasher";
10939
+ /** Washing machine. A plug-built one is running while its power stays
10940
+ * above a threshold. No program cap — that surface is the dishwasher's. */
10941
+ DeviceType["Washer"] = "washer";
10942
+ /** Tumble dryer. Same plug-built running surface as {@link Washer}. */
10943
+ DeviceType["Dryer"] = "dryer";
10938
10944
  return DeviceType;
10939
10945
  }({});
10940
10946
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -11192,7 +11198,7 @@ function errMsg(err) {
11192
11198
  return String(err);
11193
11199
  }
11194
11200
  //#endregion
11195
- //#region ../types/dist/composition-OhpuespA.mjs
11201
+ //#region ../types/dist/composition-B2rw5L29.mjs
11196
11202
  /**
11197
11203
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11198
11204
  *
@@ -11948,6 +11954,26 @@ function validateExpressionSource(src) {
11948
11954
  return null;
11949
11955
  }
11950
11956
  /**
11957
+ * One power reading becomes a washer, dryer or dishwasher (D944 helper).
11958
+ *
11959
+ * Standby of the control board is under 5 W; a motor or a heater is far
11960
+ * above that, so 5 W is the line. A door lock or a short pump spike is not
11961
+ * a cycle, so running starts only after 30 s above the line.
11962
+ *
11963
+ * A wash, dry or dishwasher pause (soak, heat-wait, heater off between
11964
+ * bursts) lasts several minutes. Ending the cycle on the first dip would
11965
+ * report "finished" in the middle of the program, so the stop dwell is
11966
+ * 10 minutes on every type. The number is stored per type so one machine
11967
+ * can move later without moving the others.
11968
+ */
11969
+ var APPLIANCE_TEMPLATE_ID = "appliance";
11970
+ var APPLIANCE_KINDS = [
11971
+ "washer",
11972
+ "dryer",
11973
+ "dishwasher"
11974
+ ];
11975
+ DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
11976
+ /**
11951
11977
  * A composition source identity: `(addonId, stableId)`, never a numeric device
11952
11978
  * id. Split out so helper schemas can name it without a cycle through
11953
11979
  * `composition.ts` (D659).
@@ -12010,6 +12036,14 @@ var HelperSpecSchema = discriminatedUnion("kind", [object({
12010
12036
  members: array(HelperMemberSchema).min(1).max(64),
12011
12037
  /** Actuator groups only. Readings leave this unset. */
12012
12038
  active: ActiveCriterionSchema.optional()
12039
+ }), object({
12040
+ kind: literal("appliance"),
12041
+ templateId: literal(APPLIANCE_TEMPLATE_ID),
12042
+ appliance: _enum(APPLIANCE_KINDS),
12043
+ thresholdWatts: number().positive(),
12044
+ startDwellMs: number().int().nonnegative(),
12045
+ stopDwellMs: number().int().nonnegative(),
12046
+ member: HelperMemberSchema
12013
12047
  })]);
12014
12048
  /** A composed device's stableId is this prefix plus the block id. */
12015
12049
  var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
@@ -64846,7 +64880,12 @@ var powerMeterCapability = {
64846
64880
  scope: "device",
64847
64881
  deviceNative: true,
64848
64882
  mode: "singleton",
64849
- deviceTypes: [DeviceType.Sensor],
64883
+ deviceTypes: [
64884
+ DeviceType.Sensor,
64885
+ DeviceType.Washer,
64886
+ DeviceType.Dryer,
64887
+ DeviceType.Dishwasher
64888
+ ],
64850
64889
  methods: {},
64851
64890
  status: {
64852
64891
  schema: PowerMeterStatusSchema,
@@ -65592,6 +65631,8 @@ var runningCustomize = {
65592
65631
  stateField: "running"
65593
65632
  },
65594
65633
  deviceTypes: [
65634
+ DeviceType.Washer,
65635
+ DeviceType.Dryer,
65595
65636
  DeviceType.Dishwasher,
65596
65637
  DeviceType.Vacuum,
65597
65638
  DeviceType.LawnMower,
@@ -70730,7 +70771,7 @@ function tryConvertDelta(value, from, to) {
70730
70771
  return shifted - origin;
70731
70772
  }
70732
70773
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
70733
- DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, 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, DeviceType.Camera, DeviceType.Camera, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
70774
+ DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, 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, DeviceType.Washer, DeviceType.Dryer, DeviceType.Camera, DeviceType.Camera, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
70734
70775
  String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
70735
70776
  DeviceRole.BinarySensor, DeviceRole.MotionSensor;
70736
70777
  new Set(CAP_NAMES);
@@ -72329,7 +72370,7 @@ var BaseDeviceProvider = class extends BaseAddon {
72329
72370
  return toDeviceSummary(device, this.addonId);
72330
72371
  }
72331
72372
  };
72332
- 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;
72373
+ 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, DeviceType.Washer, DeviceType.Dryer;
72333
72374
  new Set(Object.values(DeviceType));
72334
72375
  Object.freeze({
72335
72376
  "accessories.getStatus": {
@@ -84616,7 +84657,39 @@ var APPLIANCE_CAP_VOCABULARY = {
84616
84657
  phrase: t("When {device} finishes", "Quando {device} finisce"),
84617
84658
  icon: "square"
84618
84659
  }
84619
- }
84660
+ },
84661
+ overrides: { byType: {
84662
+ [DeviceType.Washer]: {
84663
+ state: { running: {
84664
+ whenTrue: t("When the washing machine starts", "Quando la lavatrice inizia"),
84665
+ whenFalse: t("When the washing machine has finished", "Quando la lavatrice ha finito")
84666
+ } },
84667
+ events: {
84668
+ onStarted: { phrase: t("When the washing machine starts", "Quando la lavatrice inizia") },
84669
+ onFinished: { phrase: t("When the washing machine has finished", "Quando la lavatrice ha finito") }
84670
+ }
84671
+ },
84672
+ [DeviceType.Dryer]: {
84673
+ state: { running: {
84674
+ whenTrue: t("When the dryer starts", "Quando l'asciugatrice inizia"),
84675
+ whenFalse: t("When the dryer has finished", "Quando l'asciugatrice ha finito")
84676
+ } },
84677
+ events: {
84678
+ onStarted: { phrase: t("When the dryer starts", "Quando l'asciugatrice inizia") },
84679
+ onFinished: { phrase: t("When the dryer has finished", "Quando l'asciugatrice ha finito") }
84680
+ }
84681
+ },
84682
+ [DeviceType.Dishwasher]: {
84683
+ state: { running: {
84684
+ whenTrue: t("When the dishwasher starts", "Quando la lavastoviglie inizia"),
84685
+ whenFalse: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito")
84686
+ } },
84687
+ events: {
84688
+ onStarted: { phrase: t("When the dishwasher starts", "Quando la lavastoviglie inizia") },
84689
+ onFinished: { phrase: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito") }
84690
+ }
84691
+ }
84692
+ } }
84620
84693
  },
84621
84694
  update: {
84622
84695
  scope: "device",
@@ -85916,8 +85989,58 @@ function projectAction(cap, action) {
85916
85989
  };
85917
85990
  }
85918
85991
  Object.entries(CAP_VOCABULARY_BY_NAME).flatMap(([cap, entry]) => entry.scope === "device" ? (entry.actions ?? []).map((a) => projectAction(cap, a)) : []);
85919
- 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;
85992
+ 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, DeviceType.Washer, DeviceType.Dryer;
85920
85993
  DeviceFeature.BatteryOperated;
85994
+ /**
85995
+ * How a washer, dryer or dishwasher leaves CamStack.
85996
+ *
85997
+ * Home Assistant has no laundry domain: the device is offered, and what
85998
+ * travels is its power reading. The others have a laundry type that this
85999
+ * export cannot honour yet, so they are named and withheld.
86000
+ */
86001
+ var PLUG_APPLIANCE_TYPES = [
86002
+ DeviceType.Washer,
86003
+ DeviceType.Dryer,
86004
+ DeviceType.Dishwasher
86005
+ ];
86006
+ var HA_AS = "a power sensor (device_class power). Home Assistant has no laundry domain. running-state stays unexported until a null reading can be published as unavailable.";
86007
+ var HOMEKIT_REASON = "HomeKit has no laundry-appliance service. The export tab would pair an accessory with nothing on it: running-state is withheld until a null reading can be unavailable, and power is not a HomeKit service this export honours.";
86008
+ var ALEXA_REASON = "Alexa has no laundry category in this export, and neither power nor running has an Alexa interface.";
86009
+ var GOOGLE_REASON = "Google WASHER, DRYER and DISHWASHER require RunCycle. A power threshold is not that trait, and this export does not publish RunCycle.";
86010
+ var MATTER_REASON = "No Matter export is built. The closest device types are Laundry Washer (0x0073) and Laundry Dryer (0x0074); a power threshold is not the Laundry Washer Mode cluster.";
86011
+ function withheld(reason) {
86012
+ return {
86013
+ [DeviceType.Washer]: {
86014
+ exported: false,
86015
+ reason
86016
+ },
86017
+ [DeviceType.Dryer]: {
86018
+ exported: false,
86019
+ reason
86020
+ },
86021
+ [DeviceType.Dishwasher]: {
86022
+ exported: false,
86023
+ reason
86024
+ }
86025
+ };
86026
+ }
86027
+ function offered(received) {
86028
+ return {
86029
+ [DeviceType.Washer]: {
86030
+ exported: true,
86031
+ as: received
86032
+ },
86033
+ [DeviceType.Dryer]: {
86034
+ exported: true,
86035
+ as: received
86036
+ },
86037
+ [DeviceType.Dishwasher]: {
86038
+ exported: true,
86039
+ as: received
86040
+ }
86041
+ };
86042
+ }
86043
+ offered(HA_AS), withheld(HOMEKIT_REASON), withheld(ALEXA_REASON), withheld(GOOGLE_REASON), withheld(MATTER_REASON);
85921
86044
  Object.freeze({
85922
86045
  "accessories.getStatus": [{
85923
86046
  name: "deviceId",
@@ -90357,4 +90480,4 @@ function bestLocationMatch(externalName, existing, threshold = .8) {
90357
90480
  var MB = 1024 * 1024;
90358
90481
  1024 * MB, 3072 * MB;
90359
90482
  //#endregion
90360
- export { lockControlCapability as $, unknown as $t, calendarSourceCapability as A, DeviceFeature as At, deviceAdminLinkCapability as B, entryBody as Bt, bestLocationMatch as C, tryConvertUnit as Ct, buildAddonRouteProvider as D, vibrationCapability as Dt, brokerCapability as E, valveCapability as Et, consumableFormOf as F, RecordSecretUnavailableError as Ft, fanControlCapability as G, boolean as Gt, deviceExportCapability as H, nodePin as Ht, consumableKindOf as I, baseUnitOf as It, humidifierCapability as J, number as Jt, floodCapability as K, discriminatedUnion as Kt, contactCapability as L, createEvent as Lt, climateControlCapability as M, DeviceType as Mt, colorCapability as N, errMsg as Nt, buildDeviceAdminUrl as O, waterHeaterCapability as Ot, connectivityCapability as P, BaseAddon as Pt, lawnMowerControlCapability as Q, union as Qt, controlCapability as R, defineEntryKind as Rt, batteryCapability as S, tryConvertDelta as St, brightnessCapability as T, vacuumControlCapability as Tt, enumSensorCapability as U, _enum as Ut, deviceAdoptionCapability as V, isReadingQuantity as Vt, eventEmitterCapability as W, array as Wt, imageCapability as X, record as Xt, humiditySensorCapability as Y, object as Yt, ingestReading as Z, string as Zt, addonRoutesCapability as _, scriptRunnerCapability as _t, COCO_TO_MACRO as a, numericSensorCapability as at, ambientLightSensorCapability as b, tamperCapability as bt, ConsumableItemSchema as c, powerMeterCapability as ct, FanDirectionSchema as d, pressureSensorCapability as dt, url as en, mediaPlayerCapability as et, HvacModeSchema as f, quantityFromUnit as ft, accessoriesCapability as g, runningStateCapability as gt, TargetSchema as h, runningFromVacuumState as ht, CAMERA_SWITCH_ORDER as i, notifierCapability as it, carbonMonoxideCapability as j, DeviceRole as jt, buttonCapability as k, weatherCapability as kt, ConsumableStatusSchema as l, prepareNotification as lt, RUNNING_STATE_COLD as m, runningFromMediaPlayer as mt, BaseDevice as n, normalizeUnit as nt, CameraSwitchIdSchema as o, oauthIntegrationCapability as ot, MediaPlayerRepeatSchema as p, runningFromLawnMower as pt, gasCapability as q, literal as qt, BaseDeviceProvider as r, notificationOutputCapability as rt, ConsumableFormSchema as s, parseAdminBase as st, AlarmArmModeSchema as t, EventCategory as tn, motionCapability as tt, EnumSensorDateTimeFormatSchema as u, presenceCapability as ut, airQualitySensorCapability as v, smokeCapability as vt, binaryCapability as w, updateCapability as wt, automationControlCapability as x, temperatureSensorCapability as xt, alarmPanelCapability as y, switchCapability as yt, coverCapability as z, defineRecordKinds as zt };
90483
+ export { lawnMowerControlCapability as $, union as $t, buttonCapability as A, weatherCapability as At, coverCapability as B, defineRecordKinds as Bt, batteryCapability as C, tryConvertDelta as Ct, brokerCapability as D, valveCapability as Dt, brightnessCapability as E, vacuumControlCapability as Et, connectivityCapability as F, BaseAddon as Ft, eventEmitterCapability as G, array as Gt, deviceAdoptionCapability as H, isReadingQuantity as Ht, consumableFormOf as I, RecordSecretUnavailableError as It, gasCapability as J, literal as Jt, fanControlCapability as K, boolean as Kt, consumableKindOf as L, baseUnitOf as Lt, carbonMonoxideCapability as M, DeviceRole as Mt, climateControlCapability as N, DeviceType as Nt, buildAddonRouteProvider as O, vibrationCapability as Ot, colorCapability as P, errMsg as Pt, ingestReading as Q, string as Qt, contactCapability as R, createEvent as Rt, automationControlCapability as S, temperatureSensorCapability as St, binaryCapability as T, updateCapability as Tt, deviceExportCapability as U, nodePin as Ut, deviceAdminLinkCapability as V, entryBody as Vt, enumSensorCapability as W, _enum as Wt, humiditySensorCapability as X, object as Xt, humidifierCapability as Y, number as Yt, imageCapability as Z, record as Zt, accessoriesCapability as _, runningStateCapability as _t, COCO_TO_MACRO as a, notifierCapability as at, alarmPanelCapability as b, switchCapability as bt, ConsumableItemSchema as c, parseAdminBase as ct, FanDirectionSchema as d, presenceCapability as dt, unknown as en, lockControlCapability as et, HvacModeSchema as f, pressureSensorCapability as ft, TargetSchema as g, runningFromVacuumState as gt, RUNNING_STATE_COLD as h, runningFromMediaPlayer as ht, CAMERA_SWITCH_ORDER as i, notificationOutputCapability as it, calendarSourceCapability as j, DeviceFeature as jt, buildDeviceAdminUrl as k, waterHeaterCapability as kt, ConsumableStatusSchema as l, powerMeterCapability as lt, PLUG_APPLIANCE_TYPES as m, runningFromLawnMower as mt, BaseDevice as n, EventCategory as nn, motionCapability as nt, CameraSwitchIdSchema as o, numericSensorCapability as ot, MediaPlayerRepeatSchema as p, quantityFromUnit as pt, floodCapability as q, discriminatedUnion as qt, BaseDeviceProvider as r, normalizeUnit as rt, ConsumableFormSchema as s, oauthIntegrationCapability as st, AlarmArmModeSchema as t, url as tn, mediaPlayerCapability as tt, EnumSensorDateTimeFormatSchema as u, prepareNotification as ut, addonRoutesCapability as v, scriptRunnerCapability as vt, bestLocationMatch as w, tryConvertUnit as wt, ambientLightSensorCapability as x, tamperCapability as xt, airQualitySensorCapability as y, smokeCapability as yt, controlCapability as z, defineEntryKind as zt };
@@ -10840,7 +10840,7 @@ object({
10840
10840
  params: record(string(), union([string(), number()])).optional()
10841
10841
  });
10842
10842
  //#endregion
10843
- //#region ../types/dist/err-msg-BXKzRBwg.mjs
10843
+ //#region ../types/dist/err-msg-DIorGYeC.mjs
10844
10844
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
10845
10845
  DeviceType["Camera"] = "camera";
10846
10846
  DeviceType["Hub"] = "hub";
@@ -10934,8 +10934,14 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
10934
10934
  DeviceType["PetFeeder"] = "pet-feeder";
10935
10935
  /** Built-in dishwasher — program lifecycle, door / remote-start gates,
10936
10936
  * salt and rinse-aid levels. Installed with the `dishwasher` cap.
10937
- * Sources: native Bosch Home Connect, reusable by similar integrations. */
10937
+ * Sources: native Bosch Home Connect, reusable by similar integrations.
10938
+ * A plug-built dishwasher carries running-state and power instead. */
10938
10939
  DeviceType["Dishwasher"] = "dishwasher";
10940
+ /** Washing machine. A plug-built one is running while its power stays
10941
+ * above a threshold. No program cap — that surface is the dishwasher's. */
10942
+ DeviceType["Washer"] = "washer";
10943
+ /** Tumble dryer. Same plug-built running surface as {@link Washer}. */
10944
+ DeviceType["Dryer"] = "dryer";
10939
10945
  return DeviceType;
10940
10946
  }({});
10941
10947
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -11193,7 +11199,7 @@ function errMsg(err) {
11193
11199
  return String(err);
11194
11200
  }
11195
11201
  //#endregion
11196
- //#region ../types/dist/composition-OhpuespA.mjs
11202
+ //#region ../types/dist/composition-B2rw5L29.mjs
11197
11203
  /**
11198
11204
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11199
11205
  *
@@ -11949,6 +11955,26 @@ function validateExpressionSource(src) {
11949
11955
  return null;
11950
11956
  }
11951
11957
  /**
11958
+ * One power reading becomes a washer, dryer or dishwasher (D944 helper).
11959
+ *
11960
+ * Standby of the control board is under 5 W; a motor or a heater is far
11961
+ * above that, so 5 W is the line. A door lock or a short pump spike is not
11962
+ * a cycle, so running starts only after 30 s above the line.
11963
+ *
11964
+ * A wash, dry or dishwasher pause (soak, heat-wait, heater off between
11965
+ * bursts) lasts several minutes. Ending the cycle on the first dip would
11966
+ * report "finished" in the middle of the program, so the stop dwell is
11967
+ * 10 minutes on every type. The number is stored per type so one machine
11968
+ * can move later without moving the others.
11969
+ */
11970
+ var APPLIANCE_TEMPLATE_ID = "appliance";
11971
+ var APPLIANCE_KINDS = [
11972
+ "washer",
11973
+ "dryer",
11974
+ "dishwasher"
11975
+ ];
11976
+ DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
11977
+ /**
11952
11978
  * A composition source identity: `(addonId, stableId)`, never a numeric device
11953
11979
  * id. Split out so helper schemas can name it without a cycle through
11954
11980
  * `composition.ts` (D659).
@@ -12011,6 +12037,14 @@ var HelperSpecSchema = discriminatedUnion("kind", [object({
12011
12037
  members: array(HelperMemberSchema).min(1).max(64),
12012
12038
  /** Actuator groups only. Readings leave this unset. */
12013
12039
  active: ActiveCriterionSchema.optional()
12040
+ }), object({
12041
+ kind: literal("appliance"),
12042
+ templateId: literal(APPLIANCE_TEMPLATE_ID),
12043
+ appliance: _enum(APPLIANCE_KINDS),
12044
+ thresholdWatts: number().positive(),
12045
+ startDwellMs: number().int().nonnegative(),
12046
+ stopDwellMs: number().int().nonnegative(),
12047
+ member: HelperMemberSchema
12014
12048
  })]);
12015
12049
  /** A composed device's stableId is this prefix plus the block id. */
12016
12050
  var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
@@ -64847,7 +64881,12 @@ var powerMeterCapability = {
64847
64881
  scope: "device",
64848
64882
  deviceNative: true,
64849
64883
  mode: "singleton",
64850
- deviceTypes: [DeviceType.Sensor],
64884
+ deviceTypes: [
64885
+ DeviceType.Sensor,
64886
+ DeviceType.Washer,
64887
+ DeviceType.Dryer,
64888
+ DeviceType.Dishwasher
64889
+ ],
64851
64890
  methods: {},
64852
64891
  status: {
64853
64892
  schema: PowerMeterStatusSchema,
@@ -65593,6 +65632,8 @@ var runningCustomize = {
65593
65632
  stateField: "running"
65594
65633
  },
65595
65634
  deviceTypes: [
65635
+ DeviceType.Washer,
65636
+ DeviceType.Dryer,
65596
65637
  DeviceType.Dishwasher,
65597
65638
  DeviceType.Vacuum,
65598
65639
  DeviceType.LawnMower,
@@ -70731,7 +70772,7 @@ function tryConvertDelta(value, from, to) {
70731
70772
  return shifted - origin;
70732
70773
  }
70733
70774
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
70734
- DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, 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, DeviceType.Camera, DeviceType.Camera, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
70775
+ DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, 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, DeviceType.Washer, DeviceType.Dryer, DeviceType.Camera, DeviceType.Camera, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
70735
70776
  String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
70736
70777
  DeviceRole.BinarySensor, DeviceRole.MotionSensor;
70737
70778
  new Set(CAP_NAMES);
@@ -72330,7 +72371,7 @@ var BaseDeviceProvider = class extends BaseAddon {
72330
72371
  return toDeviceSummary(device, this.addonId);
72331
72372
  }
72332
72373
  };
72333
- 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;
72374
+ 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, DeviceType.Washer, DeviceType.Dryer;
72334
72375
  new Set(Object.values(DeviceType));
72335
72376
  Object.freeze({
72336
72377
  "accessories.getStatus": {
@@ -84617,7 +84658,39 @@ var APPLIANCE_CAP_VOCABULARY = {
84617
84658
  phrase: t("When {device} finishes", "Quando {device} finisce"),
84618
84659
  icon: "square"
84619
84660
  }
84620
- }
84661
+ },
84662
+ overrides: { byType: {
84663
+ [DeviceType.Washer]: {
84664
+ state: { running: {
84665
+ whenTrue: t("When the washing machine starts", "Quando la lavatrice inizia"),
84666
+ whenFalse: t("When the washing machine has finished", "Quando la lavatrice ha finito")
84667
+ } },
84668
+ events: {
84669
+ onStarted: { phrase: t("When the washing machine starts", "Quando la lavatrice inizia") },
84670
+ onFinished: { phrase: t("When the washing machine has finished", "Quando la lavatrice ha finito") }
84671
+ }
84672
+ },
84673
+ [DeviceType.Dryer]: {
84674
+ state: { running: {
84675
+ whenTrue: t("When the dryer starts", "Quando l'asciugatrice inizia"),
84676
+ whenFalse: t("When the dryer has finished", "Quando l'asciugatrice ha finito")
84677
+ } },
84678
+ events: {
84679
+ onStarted: { phrase: t("When the dryer starts", "Quando l'asciugatrice inizia") },
84680
+ onFinished: { phrase: t("When the dryer has finished", "Quando l'asciugatrice ha finito") }
84681
+ }
84682
+ },
84683
+ [DeviceType.Dishwasher]: {
84684
+ state: { running: {
84685
+ whenTrue: t("When the dishwasher starts", "Quando la lavastoviglie inizia"),
84686
+ whenFalse: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito")
84687
+ } },
84688
+ events: {
84689
+ onStarted: { phrase: t("When the dishwasher starts", "Quando la lavastoviglie inizia") },
84690
+ onFinished: { phrase: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito") }
84691
+ }
84692
+ }
84693
+ } }
84621
84694
  },
84622
84695
  update: {
84623
84696
  scope: "device",
@@ -85917,8 +85990,58 @@ function projectAction(cap, action) {
85917
85990
  };
85918
85991
  }
85919
85992
  Object.entries(CAP_VOCABULARY_BY_NAME).flatMap(([cap, entry]) => entry.scope === "device" ? (entry.actions ?? []).map((a) => projectAction(cap, a)) : []);
85920
- 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;
85993
+ 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, DeviceType.Washer, DeviceType.Dryer;
85921
85994
  DeviceFeature.BatteryOperated;
85995
+ /**
85996
+ * How a washer, dryer or dishwasher leaves CamStack.
85997
+ *
85998
+ * Home Assistant has no laundry domain: the device is offered, and what
85999
+ * travels is its power reading. The others have a laundry type that this
86000
+ * export cannot honour yet, so they are named and withheld.
86001
+ */
86002
+ var PLUG_APPLIANCE_TYPES = [
86003
+ DeviceType.Washer,
86004
+ DeviceType.Dryer,
86005
+ DeviceType.Dishwasher
86006
+ ];
86007
+ var HA_AS = "a power sensor (device_class power). Home Assistant has no laundry domain. running-state stays unexported until a null reading can be published as unavailable.";
86008
+ var HOMEKIT_REASON = "HomeKit has no laundry-appliance service. The export tab would pair an accessory with nothing on it: running-state is withheld until a null reading can be unavailable, and power is not a HomeKit service this export honours.";
86009
+ var ALEXA_REASON = "Alexa has no laundry category in this export, and neither power nor running has an Alexa interface.";
86010
+ var GOOGLE_REASON = "Google WASHER, DRYER and DISHWASHER require RunCycle. A power threshold is not that trait, and this export does not publish RunCycle.";
86011
+ var MATTER_REASON = "No Matter export is built. The closest device types are Laundry Washer (0x0073) and Laundry Dryer (0x0074); a power threshold is not the Laundry Washer Mode cluster.";
86012
+ function withheld(reason) {
86013
+ return {
86014
+ [DeviceType.Washer]: {
86015
+ exported: false,
86016
+ reason
86017
+ },
86018
+ [DeviceType.Dryer]: {
86019
+ exported: false,
86020
+ reason
86021
+ },
86022
+ [DeviceType.Dishwasher]: {
86023
+ exported: false,
86024
+ reason
86025
+ }
86026
+ };
86027
+ }
86028
+ function offered(received) {
86029
+ return {
86030
+ [DeviceType.Washer]: {
86031
+ exported: true,
86032
+ as: received
86033
+ },
86034
+ [DeviceType.Dryer]: {
86035
+ exported: true,
86036
+ as: received
86037
+ },
86038
+ [DeviceType.Dishwasher]: {
86039
+ exported: true,
86040
+ as: received
86041
+ }
86042
+ };
86043
+ }
86044
+ offered(HA_AS), withheld(HOMEKIT_REASON), withheld(ALEXA_REASON), withheld(GOOGLE_REASON), withheld(MATTER_REASON);
85922
86045
  Object.freeze({
85923
86046
  "accessories.getStatus": [{
85924
86047
  name: "deviceId",
@@ -90466,6 +90589,12 @@ Object.defineProperty(exports, "MediaPlayerRepeatSchema", {
90466
90589
  return MediaPlayerRepeatSchema;
90467
90590
  }
90468
90591
  });
90592
+ Object.defineProperty(exports, "PLUG_APPLIANCE_TYPES", {
90593
+ enumerable: true,
90594
+ get: function() {
90595
+ return PLUG_APPLIANCE_TYPES;
90596
+ }
90597
+ });
90469
90598
  Object.defineProperty(exports, "RUNNING_STATE_COLD", {
90470
90599
  enumerable: true,
90471
90600
  get: function() {
@@ -24,7 +24,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  enumerable: true
25
25
  }) : target, mod));
26
26
  //#endregion
27
- const require_dist = require("../dist-CAyJy-Ek.js");
27
+ const require_dist = require("../dist-sQp4D2Eo.js");
28
28
  let node_crypto = require("node:crypto");
29
29
  require("node:zlib");
30
30
  let node_fs = require("node:fs");
@@ -6658,6 +6658,46 @@ function projectSynthetic(input, nowMs) {
6658
6658
  return values;
6659
6659
  }
6660
6660
  //#endregion
6661
+ //#region src/ha-export/supported-device-kinds.ts
6662
+ /**
6663
+ * Device types the Home Assistant export picker offers.
6664
+ *
6665
+ * A UI filter. What actually travels is still the entity catalog: a washer,
6666
+ * dryer or dishwasher is offered because its power reading exports as a
6667
+ * sensor. running-state stays unmapped.
6668
+ */
6669
+ var SUPPORTED_DEVICE_KINDS = [
6670
+ "camera",
6671
+ "light",
6672
+ "siren",
6673
+ "switch",
6674
+ "sensor",
6675
+ "thermostat",
6676
+ "climate",
6677
+ "button",
6678
+ "event-emitter",
6679
+ "update",
6680
+ "generic",
6681
+ "lock",
6682
+ "cover",
6683
+ "valve",
6684
+ "humidifier",
6685
+ "water-heater",
6686
+ "fan",
6687
+ "media-player",
6688
+ "alarm-panel",
6689
+ "control",
6690
+ "presence",
6691
+ "weather",
6692
+ "vacuum",
6693
+ "lawn-mower",
6694
+ "container",
6695
+ "image",
6696
+ "pet-feeder",
6697
+ "hub",
6698
+ ...require_dist.PLUG_APPLIANCE_TYPES
6699
+ ];
6700
+ //#endregion
6661
6701
  //#region src/ha-export/ha-export.addon.ts
6662
6702
  /**
6663
6703
  * Native Home Assistant export — a custom component fed by HTTP push.
@@ -9050,36 +9090,6 @@ var HaExportAddon = class extends require_dist.BaseAddon {
9050
9090
  * CAPABILITIES, not its type, and restricting the picker by type is what
9051
9091
  * confined the previous exporter to cameras.
9052
9092
  */
9053
- var SUPPORTED_DEVICE_KINDS = [
9054
- "camera",
9055
- "light",
9056
- "siren",
9057
- "switch",
9058
- "sensor",
9059
- "thermostat",
9060
- "climate",
9061
- "button",
9062
- "event-emitter",
9063
- "update",
9064
- "generic",
9065
- "lock",
9066
- "cover",
9067
- "valve",
9068
- "humidifier",
9069
- "water-heater",
9070
- "fan",
9071
- "media-player",
9072
- "alarm-panel",
9073
- "control",
9074
- "presence",
9075
- "weather",
9076
- "vacuum",
9077
- "lawn-mower",
9078
- "container",
9079
- "image",
9080
- "pet-feeder",
9081
- "hub"
9082
- ];
9083
9093
  /**
9084
9094
  * POST one message to Home Assistant's push view.
9085
9095
  *
@@ -1,4 +1,4 @@
1
- import { $t as unknown, D as buildAddonRouteProvider, F as consumableFormOf, H as deviceExportCapability, Ht as nodePin, I as consumableKindOf, It as baseUnitOf, Pt as BaseAddon, Vt as isReadingQuantity, Wt as array, Yt as object, Zt as string, _ as addonRoutesCapability, a as COCO_TO_MACRO, c as ConsumableItemSchema, d as FanDirectionSchema, f as HvacModeSchema, i as CAMERA_SWITCH_ORDER, l as ConsumableStatusSchema, o as CameraSwitchIdSchema, ot as oauthIntegrationCapability, p as MediaPlayerRepeatSchema, s as ConsumableFormSchema, t as AlarmArmModeSchema, tn as EventCategory } from "../dist-BNRaAIW1.mjs";
1
+ import { Ft as BaseAddon, Gt as array, Ht as isReadingQuantity, I as consumableFormOf, L as consumableKindOf, Lt as baseUnitOf, O as buildAddonRouteProvider, Qt as string, U as deviceExportCapability, Ut as nodePin, Xt as object, a as COCO_TO_MACRO, c as ConsumableItemSchema, d as FanDirectionSchema, en as unknown, f as HvacModeSchema, i as CAMERA_SWITCH_ORDER, l as ConsumableStatusSchema, m as PLUG_APPLIANCE_TYPES, nn as EventCategory, o as CameraSwitchIdSchema, p as MediaPlayerRepeatSchema, s as ConsumableFormSchema, st as oauthIntegrationCapability, t as AlarmArmModeSchema, v as addonRoutesCapability } from "../dist-DWMNvtWN.mjs";
2
2
  import { createHmac, timingSafeEqual } from "node:crypto";
3
3
  import "node:zlib";
4
4
  import "node:fs";
@@ -6623,6 +6623,46 @@ function projectSynthetic(input, nowMs) {
6623
6623
  return values;
6624
6624
  }
6625
6625
  //#endregion
6626
+ //#region src/ha-export/supported-device-kinds.ts
6627
+ /**
6628
+ * Device types the Home Assistant export picker offers.
6629
+ *
6630
+ * A UI filter. What actually travels is still the entity catalog: a washer,
6631
+ * dryer or dishwasher is offered because its power reading exports as a
6632
+ * sensor. running-state stays unmapped.
6633
+ */
6634
+ var SUPPORTED_DEVICE_KINDS = [
6635
+ "camera",
6636
+ "light",
6637
+ "siren",
6638
+ "switch",
6639
+ "sensor",
6640
+ "thermostat",
6641
+ "climate",
6642
+ "button",
6643
+ "event-emitter",
6644
+ "update",
6645
+ "generic",
6646
+ "lock",
6647
+ "cover",
6648
+ "valve",
6649
+ "humidifier",
6650
+ "water-heater",
6651
+ "fan",
6652
+ "media-player",
6653
+ "alarm-panel",
6654
+ "control",
6655
+ "presence",
6656
+ "weather",
6657
+ "vacuum",
6658
+ "lawn-mower",
6659
+ "container",
6660
+ "image",
6661
+ "pet-feeder",
6662
+ "hub",
6663
+ ...PLUG_APPLIANCE_TYPES
6664
+ ];
6665
+ //#endregion
6626
6666
  //#region src/ha-export/ha-export.addon.ts
6627
6667
  /**
6628
6668
  * Native Home Assistant export — a custom component fed by HTTP push.
@@ -9015,36 +9055,6 @@ var HaExportAddon = class extends BaseAddon {
9015
9055
  * CAPABILITIES, not its type, and restricting the picker by type is what
9016
9056
  * confined the previous exporter to cameras.
9017
9057
  */
9018
- var SUPPORTED_DEVICE_KINDS = [
9019
- "camera",
9020
- "light",
9021
- "siren",
9022
- "switch",
9023
- "sensor",
9024
- "thermostat",
9025
- "climate",
9026
- "button",
9027
- "event-emitter",
9028
- "update",
9029
- "generic",
9030
- "lock",
9031
- "cover",
9032
- "valve",
9033
- "humidifier",
9034
- "water-heater",
9035
- "fan",
9036
- "media-player",
9037
- "alarm-panel",
9038
- "control",
9039
- "presence",
9040
- "weather",
9041
- "vacuum",
9042
- "lawn-mower",
9043
- "container",
9044
- "image",
9045
- "pet-feeder",
9046
- "hub"
9047
- ];
9048
9058
  /**
9049
9059
  * POST one message to Home Assistant's push view.
9050
9060
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homeassistant",
3
- "version": "1.2.628",
3
+ "version": "1.2.629",
4
4
  "description": "Home Assistant device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",