@camstack/addon-provider-homeassistant 1.2.627 → 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/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ # Changelog
2
+
3
+ All notable changes to this package are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Added
11
+
12
+ - Package README and changelog, included in the published files list.
package/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # @camstack/addon-provider-homeassistant
2
+
3
+ Home Assistant device provider addon for CamStack
4
+
5
+ ## What it does
6
+
7
+ - **Home Assistant Provider** (`provider-homeassistant`): Adopt Home Assistant devices into CamStack via WebSocket
8
+ - Node placement: `hub-only`.
9
+ - Capabilities: `broker`, `device-adoption`, `vacuum-control`, `lawn-mower-control`, `running-state`, `valve`, `humidifier`, `water-heater`, `weather`, `image`, `update`, `notification-output`, `addon-routes`, `calendar-source`.
10
+ - **Home Assistant Export** (`homeassistant-export`): Pushes CamStack entities to the CamStack Home Assistant custom component over HTTP. Chooses which devices reach which Home Assistant instance; Home Assistant never polls the hub for a value.
11
+ - Node placement: `hub-only`.
12
+ - Capabilities: `device-export`, `addon-routes`, `oauth-integration`.
13
+
14
+ ## Settings
15
+
16
+ Settings this addon exposes are edited from System → Addons → this addon → Settings when they apply to the whole cluster, and from the device page when they belong to one device. A password field is stored in the keychain.
17
+
18
+ ## Requirements
19
+
20
+ - Peer packages already on the node: `@camstack/types`.
21
+ - A CamStack hub. An agent is used only when the placement above allows it.
22
+
package/dist/addon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("./dist-CRwUHjY7.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-BFnk4bwH.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,
@@ -1,4 +1,4 @@
1
- //#region ../types/dist/event-category-DHXxB8t9.mjs
1
+ //#region ../types/dist/event-category-CT-hz5Rb.mjs
2
2
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
3
3
  EventCategory["SystemBoot"] = "system.boot";
4
4
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -324,6 +324,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
324
324
  /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
325
325
  EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
326
326
  /**
327
+ * A camera's package LLM confirm has failed closed three times in a row
328
+ * (D931, 2026-10-26). One edge per camera until
329
+ * {@link PipelinePackageLlmAnswered}.
330
+ */
331
+ EventCategory["PipelinePackageLlmSilent"] = "pipeline.package-llm-silent";
332
+ /** The recovery edge of {@link PipelinePackageLlmSilent}: a confirm returned yes or no. */
333
+ EventCategory["PipelinePackageLlmAnswered"] = "pipeline.package-llm-answered";
334
+ /**
327
335
  * Per-camera pipeline config was mutated by the orchestrator
328
336
  * (a settings change via `setAgentInferenceDevices` /
329
337
  * `setCameraStepToggle` / `setCameraStepSettings`). Orchestrator
@@ -5566,7 +5574,7 @@ var ZodIssueCode = {
5566
5574
  var ZodFirstPartyTypeKind;
5567
5575
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5568
5576
  //#endregion
5569
- //#region ../types/dist/sleep-B81gwQuR.mjs
5577
+ //#region ../types/dist/sleep-bykKrTgu.mjs
5570
5578
  /**
5571
5579
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5572
5580
  * window to float samples (D455).
@@ -9009,6 +9017,7 @@ var CAP_NAMES = Object.freeze([
9009
9017
  "filesystem-browse",
9010
9018
  "flood",
9011
9019
  "gas",
9020
+ "group-commands",
9012
9021
  "group-status",
9013
9022
  "heating-valve",
9014
9023
  "humidifier",
@@ -10830,7 +10839,7 @@ object({
10830
10839
  params: record(string(), union([string(), number()])).optional()
10831
10840
  });
10832
10841
  //#endregion
10833
- //#region ../types/dist/err-msg-BXKzRBwg.mjs
10842
+ //#region ../types/dist/err-msg-DIorGYeC.mjs
10834
10843
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
10835
10844
  DeviceType["Camera"] = "camera";
10836
10845
  DeviceType["Hub"] = "hub";
@@ -10924,8 +10933,14 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
10924
10933
  DeviceType["PetFeeder"] = "pet-feeder";
10925
10934
  /** Built-in dishwasher — program lifecycle, door / remote-start gates,
10926
10935
  * salt and rinse-aid levels. Installed with the `dishwasher` cap.
10927
- * 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. */
10928
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";
10929
10944
  return DeviceType;
10930
10945
  }({});
10931
10946
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -11183,7 +11198,7 @@ function errMsg(err) {
11183
11198
  return String(err);
11184
11199
  }
11185
11200
  //#endregion
11186
- //#region ../types/dist/composition-B85l9j1M.mjs
11201
+ //#region ../types/dist/composition-B2rw5L29.mjs
11187
11202
  /**
11188
11203
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11189
11204
  *
@@ -11939,6 +11954,26 @@ function validateExpressionSource(src) {
11939
11954
  return null;
11940
11955
  }
11941
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
+ /**
11942
11977
  * A composition source identity: `(addonId, stableId)`, never a numeric device
11943
11978
  * id. Split out so helper schemas can name it without a cycle through
11944
11979
  * `composition.ts` (D659).
@@ -11962,7 +11997,9 @@ var GROUP_TEMPLATE_IDS = [
11962
11997
  "leak",
11963
11998
  "smoke",
11964
11999
  "occupancy",
11965
- "binary"
12000
+ "binary",
12001
+ "switch",
12002
+ "light"
11966
12003
  ];
11967
12004
  var NUMERIC_AGGREGATES = [
11968
12005
  "mean",
@@ -11972,6 +12009,8 @@ var NUMERIC_AGGREGATES = [
11972
12009
  "sum"
11973
12010
  ];
11974
12011
  var BINARY_AGGREGATES = ["any", "all"];
12012
+ /** How an actuator group decides it is on. Unknown members never count as off. */
12013
+ var ACTIVE_CRITERIA = ["at-least-one", "all"];
11975
12014
  var AGGREGATE_REDUCERS = [
11976
12015
  "mean",
11977
12016
  "median",
@@ -11983,6 +12022,7 @@ var AGGREGATE_REDUCERS = [
11983
12022
  ];
11984
12023
  var GroupTemplateIdSchema = _enum(GROUP_TEMPLATE_IDS);
11985
12024
  var AggregateReducerSchema = _enum(AGGREGATE_REDUCERS);
12025
+ var ActiveCriterionSchema = _enum(ACTIVE_CRITERIA);
11986
12026
  /** One member. The field is stored so occupancy can name motion or binary. */
11987
12027
  var HelperMemberSchema = object({
11988
12028
  source: CompositionSourceRefSchema,
@@ -11993,7 +12033,17 @@ var HelperSpecSchema = discriminatedUnion("kind", [object({
11993
12033
  kind: literal("group"),
11994
12034
  templateId: GroupTemplateIdSchema,
11995
12035
  aggregate: AggregateReducerSchema,
11996
- members: array(HelperMemberSchema).min(1).max(64)
12036
+ members: array(HelperMemberSchema).min(1).max(64),
12037
+ /** Actuator groups only. Readings leave this unset. */
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
11997
12047
  })]);
11998
12048
  /** A composed device's stableId is this prefix plus the block id. */
11999
12049
  var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
@@ -18798,6 +18848,7 @@ function numeric(input) {
18798
18848
  family: "numeric",
18799
18849
  deviceType: DeviceType.Sensor,
18800
18850
  memberDeviceType: DeviceType.Sensor,
18851
+ commandCaps: [],
18801
18852
  baseUnit: baseUnitOf(input.quantity),
18802
18853
  aggregates: NUMERIC_AGGREGATES,
18803
18854
  accept: [{
@@ -18812,6 +18863,7 @@ function binary(input) {
18812
18863
  family: "binary",
18813
18864
  deviceType: DeviceType.Sensor,
18814
18865
  memberDeviceType: DeviceType.Sensor,
18866
+ commandCaps: [],
18815
18867
  quantity: "none",
18816
18868
  baseUnit: void 0,
18817
18869
  aggregates: BINARY_AGGREGATES,
@@ -19006,9 +19058,47 @@ var GROUP_TEMPLATES = [
19006
19058
  fieldPath: "on"
19007
19059
  }],
19008
19060
  companions: [CHANGED]
19061
+ }),
19062
+ actuator({
19063
+ id: "switch",
19064
+ summary: "On when at least one switch is on, or when all of them are. Offline and unknown members are left out of that decision, never read as off, and still receive the command.",
19065
+ deviceType: DeviceType.Switch,
19066
+ outputCap: "switch",
19067
+ commandCaps: ["switch"]
19068
+ }),
19069
+ actuator({
19070
+ id: "light",
19071
+ summary: "On when at least one light is on, or when all of them are. Brightness and colour are offered only when every member has them. A command is not sent to a member that lacks it.",
19072
+ deviceType: DeviceType.Light,
19073
+ outputCap: "switch",
19074
+ commandCaps: [
19075
+ "switch",
19076
+ "brightness",
19077
+ "color"
19078
+ ]
19009
19079
  })
19010
19080
  ];
19081
+ function actuator(input) {
19082
+ return {
19083
+ ...input,
19084
+ family: "actuator",
19085
+ role: void 0,
19086
+ memberDeviceType: input.deviceType,
19087
+ outputField: "on",
19088
+ quantity: "none",
19089
+ baseUnit: void 0,
19090
+ aggregates: BINARY_AGGREGATES,
19091
+ defaultAggregate: "any",
19092
+ empty: "offline",
19093
+ accept: [{
19094
+ cap: "switch",
19095
+ fieldPath: "on"
19096
+ }],
19097
+ companions: [CHANGED]
19098
+ };
19099
+ }
19011
19100
  new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
19101
+ DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
19012
19102
  `${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
19013
19103
  /**
19014
19104
  * What a composition may BUILD on a device type (G2, D676): the caps a new
@@ -46096,6 +46186,8 @@ var NcSystemEventKindSchema = _enum([
46096
46186
  "detection-blind",
46097
46187
  "motion-noisy",
46098
46188
  "motion-calm",
46189
+ "package-llm-silent",
46190
+ "package-llm-answered",
46099
46191
  "recording-stalled",
46100
46192
  "recording-healthy",
46101
46193
  "recording-degraded",
@@ -57275,6 +57367,28 @@ var PackageVersionInfoSchema = object({
57275
57367
  deprecated: string().optional(),
57276
57368
  distTags: array(string()).readonly()
57277
57369
  });
57370
+ /**
57371
+ * One published document. `ok` is markdown from the registry. `missing` means
57372
+ * the registry answered and the file was not there. `error` is a registry or
57373
+ * tarball failure — never an empty string standing in for either.
57374
+ */
57375
+ var PackageDocBodySchema = discriminatedUnion("status", [
57376
+ object({
57377
+ status: literal("ok"),
57378
+ markdown: string()
57379
+ }),
57380
+ object({ status: literal("missing") }),
57381
+ object({
57382
+ status: literal("error"),
57383
+ message: string()
57384
+ })
57385
+ ]);
57386
+ var PackageDocsSchema = object({
57387
+ name: string(),
57388
+ version: string(),
57389
+ readme: PackageDocBodySchema,
57390
+ changelog: PackageDocBodySchema
57391
+ });
57278
57392
  var SearchResultSchema = object({
57279
57393
  name: string(),
57280
57394
  version: string(),
@@ -57493,7 +57607,10 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
57493
57607
  }), object({ success: literal(true) }), {
57494
57608
  kind: "mutation",
57495
57609
  auth: "admin"
57496
- }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
57610
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({
57611
+ name: string().min(1),
57612
+ version: string().min(1).optional()
57613
+ }), PackageDocsSchema, { auth: "admin" }), method(object({ addonId: string() }), RestartAddonResultSchema, {
57497
57614
  kind: "mutation",
57498
57615
  auth: "admin"
57499
57616
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -60863,6 +60980,39 @@ var gasCapability = {
60863
60980
  * whether persisting is worth a SQLite commit. */
60864
60981
  volatileStateFields: ["lastChangedAt"]
60865
60982
  };
60983
+ var GroupCommandsSchema = object({
60984
+ /** One row per member that has been commanded. A later command replaces that member's row. */
60985
+ results: array(object({
60986
+ deviceId: number().int().nonnegative(),
60987
+ cap: string().min(1),
60988
+ method: string().min(1),
60989
+ ok: boolean(),
60990
+ error: string().optional(),
60991
+ /** Ms epoch of the attempt. */
60992
+ at: number()
60993
+ })) });
60994
+ var groupCommandsCapability = {
60995
+ name: "group-commands",
60996
+ scope: "device",
60997
+ deviceNative: true,
60998
+ mode: "singleton",
60999
+ deviceTypes: [DeviceType.Switch, DeviceType.Light],
61000
+ methods: {},
61001
+ status: {
61002
+ schema: GroupCommandsSchema,
61003
+ kind: "push"
61004
+ },
61005
+ runtimeState: GroupCommandsSchema,
61006
+ /**
61007
+ * Runtime-state durability: **session** — the last attempt. A restored
61008
+ * failure would outlive the command that caused it.
61009
+ *
61010
+ * See `RuntimeStateDurability`. Enforced by
61011
+ * `scripts/check-runtime-state-durability.ts`.
61012
+ */
61013
+ durability: "session",
61014
+ history: "none"
61015
+ };
60866
61016
  /**
60867
61017
  * How many members of a helper group answered (D944). Counts are integers,
60868
61018
  * not measurements: zero included is a real count, never a stand-in reading.
@@ -60891,7 +61041,11 @@ var groupStatusCapability = {
60891
61041
  scope: "device",
60892
61042
  deviceNative: true,
60893
61043
  mode: "singleton",
60894
- deviceTypes: [DeviceType.Sensor],
61044
+ deviceTypes: [
61045
+ DeviceType.Sensor,
61046
+ DeviceType.Switch,
61047
+ DeviceType.Light
61048
+ ],
60895
61049
  methods: {},
60896
61050
  status: {
60897
61051
  schema: GroupStatusSchema,
@@ -64726,7 +64880,12 @@ var powerMeterCapability = {
64726
64880
  scope: "device",
64727
64881
  deviceNative: true,
64728
64882
  mode: "singleton",
64729
- deviceTypes: [DeviceType.Sensor],
64883
+ deviceTypes: [
64884
+ DeviceType.Sensor,
64885
+ DeviceType.Washer,
64886
+ DeviceType.Dryer,
64887
+ DeviceType.Dishwasher
64888
+ ],
64730
64889
  methods: {},
64731
64890
  status: {
64732
64891
  schema: PowerMeterStatusSchema,
@@ -65472,6 +65631,8 @@ var runningCustomize = {
65472
65631
  stateField: "running"
65473
65632
  },
65474
65633
  deviceTypes: [
65634
+ DeviceType.Washer,
65635
+ DeviceType.Dryer,
65475
65636
  DeviceType.Dishwasher,
65476
65637
  DeviceType.Vacuum,
65477
65638
  DeviceType.LawnMower,
@@ -70610,7 +70771,7 @@ function tryConvertDelta(value, from, to) {
70610
70771
  return shifted - origin;
70611
70772
  }
70612
70773
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
70613
- 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;
70614
70775
  String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
70615
70776
  DeviceRole.BinarySensor, DeviceRole.MotionSensor;
70616
70777
  new Set(CAP_NAMES);
@@ -70939,6 +71100,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
70939
71100
  featureProbe: featureProbeCapability,
70940
71101
  flood: floodCapability,
70941
71102
  gas: gasCapability,
71103
+ groupCommands: groupCommandsCapability,
70942
71104
  groupStatus: groupStatusCapability,
70943
71105
  heatingValve: heatingValveCapability,
70944
71106
  humidifier: humidifierCapability,
@@ -72208,7 +72370,7 @@ var BaseDeviceProvider = class extends BaseAddon {
72208
72370
  return toDeviceSummary(device, this.addonId);
72209
72371
  }
72210
72372
  };
72211
- 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;
72212
72374
  new Set(Object.values(DeviceType));
72213
72375
  Object.freeze({
72214
72376
  "accessories.getStatus": {
@@ -72316,6 +72478,13 @@ Object.freeze({
72316
72478
  access: "view",
72317
72479
  role: "admin"
72318
72480
  },
72481
+ "addons.getPackageDocs": {
72482
+ capName: "addons",
72483
+ capScope: "system",
72484
+ addonId: null,
72485
+ access: "view",
72486
+ role: "admin"
72487
+ },
72319
72488
  "addons.getVersions": {
72320
72489
  capName: "addons",
72321
72490
  capScope: "system",
@@ -75424,6 +75593,13 @@ Object.freeze({
75424
75593
  access: "view",
75425
75594
  role: "viewer"
75426
75595
  },
75596
+ "groupCommands.getStatus": {
75597
+ capName: "group-commands",
75598
+ capScope: "device",
75599
+ addonId: null,
75600
+ access: "view",
75601
+ role: "viewer"
75602
+ },
75427
75603
  "groupStatus.getStatus": {
75428
75604
  capName: "group-status",
75429
75605
  capScope: "device",
@@ -84481,7 +84657,39 @@ var APPLIANCE_CAP_VOCABULARY = {
84481
84657
  phrase: t("When {device} finishes", "Quando {device} finisce"),
84482
84658
  icon: "square"
84483
84659
  }
84484
- }
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
+ } }
84485
84693
  },
84486
84694
  update: {
84487
84695
  scope: "device",
@@ -85253,6 +85461,10 @@ var SENSOR_CAP_VOCABULARY = {
85253
85461
  icon: "flame"
85254
85462
  }]
85255
85463
  },
85464
+ "group-commands": {
85465
+ scope: "device",
85466
+ noun: t("Group command", "Comando di gruppo")
85467
+ },
85256
85468
  "group-status": {
85257
85469
  scope: "device",
85258
85470
  noun: t("Group", "Gruppo"),
@@ -85777,8 +85989,58 @@ function projectAction(cap, action) {
85777
85989
  };
85778
85990
  }
85779
85991
  Object.entries(CAP_VOCABULARY_BY_NAME).flatMap(([cap, entry]) => entry.scope === "device" ? (entry.actions ?? []).map((a) => projectAction(cap, a)) : []);
85780
- 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;
85781
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);
85782
86044
  Object.freeze({
85783
86045
  "accessories.getStatus": [{
85784
86046
  name: "deviceId",
@@ -86745,6 +87007,11 @@ Object.freeze({
86745
87007
  form: "single",
86746
87008
  optional: false
86747
87009
  }],
87010
+ "groupCommands.getStatus": [{
87011
+ name: "deviceId",
87012
+ form: "single",
87013
+ optional: false
87014
+ }],
86748
87015
  "groupStatus.getStatus": [{
86749
87016
  name: "deviceId",
86750
87017
  form: "single",
@@ -88941,6 +89208,8 @@ new Map(Object.entries({
88941
89208
  "detection-blind": "device-events",
88942
89209
  "motion-noisy": "device-events",
88943
89210
  "motion-calm": "device-events",
89211
+ "package-llm-silent": "device-events",
89212
+ "package-llm-answered": "device-events",
88944
89213
  "recording-stalled": "device-events",
88945
89214
  "recording-healthy": "device-events",
88946
89215
  "recording-degraded": "device-events",
@@ -89024,6 +89293,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
89024
89293
  label: "Motion without a subject",
89025
89294
  kinds: ["motion-noisy", "motion-calm"]
89026
89295
  },
89296
+ {
89297
+ id: "package-llm",
89298
+ family: "device-events",
89299
+ label: "Package confirm",
89300
+ kinds: ["package-llm-silent", "package-llm-answered"]
89301
+ },
89027
89302
  {
89028
89303
  id: "recording",
89029
89304
  family: "device-events",
@@ -89205,6 +89480,8 @@ var DEVICE_EVENTS = [
89205
89480
  "detection-blind",
89206
89481
  "motion-noisy",
89207
89482
  "motion-calm",
89483
+ "package-llm-silent",
89484
+ "package-llm-answered",
89208
89485
  "recording-stalled",
89209
89486
  "recording-healthy",
89210
89487
  "recording-degraded",
@@ -89473,6 +89750,15 @@ new Map([
89473
89750
  snapshotLabel: "Cameras with constant motion now",
89474
89751
  snapshotSection: null
89475
89752
  },
89753
+ {
89754
+ id: "package-llm-confirm",
89755
+ family: "device-events",
89756
+ label: "Package confirm (not answering / answering again)",
89757
+ bad: ["package-llm-silent"],
89758
+ recovery: ["package-llm-answered"],
89759
+ snapshotLabel: "Cameras whose package confirm is not answering",
89760
+ snapshotSection: null
89761
+ },
89476
89762
  {
89477
89763
  id: "recording-health",
89478
89764
  family: "device-events",
@@ -90194,4 +90480,4 @@ function bestLocationMatch(externalName, existing, threshold = .8) {
90194
90480
  var MB = 1024 * 1024;
90195
90481
  1024 * MB, 3072 * MB;
90196
90482
  //#endregion
90197
- 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 };