@camstack/addon-provider-homeassistant 1.2.634 → 1.2.635

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 CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.2.635] - 2026-10-28
11
+
12
+ ### Changed
13
+
14
+ - Recorded that the ir-transmitter capability is not exported to Home Assistant.
15
+
10
16
  ## [1.2.634] - 2026-10-28
11
17
 
12
18
  ### Changed
package/dist/addon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("./dist-DSRitvmZ.js");
2
+ const require_dist = require("./dist-C_PMvyYa.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
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
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-6sCUdAUD.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-CYl0u8cF.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
@@ -5579,7 +5579,7 @@ var ZodIssueCode = {
5579
5579
  var ZodFirstPartyTypeKind;
5580
5580
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5581
5581
  //#endregion
5582
- //#region ../types/dist/sleep-Crlmu_tO.mjs
5582
+ //#region ../types/dist/sleep-BAvUCi_2.mjs
5583
5583
  /**
5584
5584
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5585
5585
  * window to float samples (D455).
@@ -9034,6 +9034,7 @@ var CAP_NAMES = Object.freeze([
9034
9034
  "image-settings",
9035
9035
  "integrations",
9036
9036
  "intercom",
9037
+ "ir-transmitter",
9037
9038
  "keychain",
9038
9039
  "keychain-admin",
9039
9040
  "lawn-mower-control",
@@ -10281,6 +10282,11 @@ Object.freeze({
10281
10282
  "path": "batteryPower",
10282
10283
  "valueType": "number"
10283
10284
  },
10285
+ {
10286
+ "path": "powerSource",
10287
+ "valueType": "enum",
10288
+ "enumValues": ["mains", "battery"]
10289
+ },
10284
10290
  {
10285
10291
  "path": "desiccantLeftDays",
10286
10292
  "valueType": "number"
@@ -10864,7 +10870,7 @@ object({
10864
10870
  params: record(string(), union([string(), number()])).optional()
10865
10871
  });
10866
10872
  //#endregion
10867
- //#region ../types/dist/err-msg-DIorGYeC.mjs
10873
+ //#region ../types/dist/err-msg-BCdlR2Li.mjs
10868
10874
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
10869
10875
  DeviceType["Camera"] = "camera";
10870
10876
  DeviceType["Hub"] = "hub";
@@ -11210,6 +11216,9 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
11210
11216
  /** Fallback when the notifier service name doesn't match a known
11211
11217
  * pattern. */
11212
11218
  DeviceRole["GenericNotifier"] = "generic-notifier";
11219
+ /** Emits a pulse train (infrared or RF) on request — the `ir-transmitter`
11220
+ * cap. A `DeviceType.Generic` device. */
11221
+ DeviceRole["IrTransmitter"] = "ir-transmitter";
11213
11222
  return DeviceRole;
11214
11223
  }({});
11215
11224
  /**
@@ -11223,7 +11232,7 @@ function errMsg(err) {
11223
11232
  return String(err);
11224
11233
  }
11225
11234
  //#endregion
11226
- //#region ../types/dist/composition-CZImLpOI.mjs
11235
+ //#region ../types/dist/composition-DpFv_J6D.mjs
11227
11236
  /**
11228
11237
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11229
11238
  *
@@ -19453,12 +19462,13 @@ var CHANGED = {
19453
19462
  expr: "now"
19454
19463
  };
19455
19464
  function numeric(input) {
19465
+ const { alsoFrom, ...base } = input;
19456
19466
  return {
19457
- ...input,
19467
+ ...base,
19458
19468
  family: "numeric",
19459
19469
  deviceType: DeviceType.Sensor,
19460
19470
  memberDeviceType: DeviceType.Sensor,
19461
- memberDeviceTypes: [DeviceType.Sensor],
19471
+ memberDeviceTypes: [DeviceType.Sensor, ...alsoFrom?.deviceTypes ?? []],
19462
19472
  activeWhen: void 0,
19463
19473
  commandCaps: [],
19464
19474
  baseUnit: baseUnitOf(input.quantity),
@@ -19466,9 +19476,10 @@ function numeric(input) {
19466
19476
  accept: [{
19467
19477
  cap: input.outputCap,
19468
19478
  fieldPath: input.outputField
19469
- }]
19479
+ }, ...alsoFrom === void 0 ? [] : [alsoFrom.accept]]
19470
19480
  };
19471
19481
  }
19482
+ var CLIMATE_DEVICES = [DeviceType.Thermostat, DeviceType.Climate];
19472
19483
  function binary(input) {
19473
19484
  return {
19474
19485
  ...input,
@@ -19494,7 +19505,14 @@ var GROUP_TEMPLATES = [
19494
19505
  quantity: "temperature",
19495
19506
  defaultAggregate: "mean",
19496
19507
  empty: "null",
19497
- companions: [NOW$2]
19508
+ companions: [NOW$2],
19509
+ alsoFrom: {
19510
+ deviceTypes: CLIMATE_DEVICES,
19511
+ accept: {
19512
+ cap: "climate-control",
19513
+ fieldPath: "currentTemp"
19514
+ }
19515
+ }
19498
19516
  }),
19499
19517
  numeric({
19500
19518
  id: "humidity",
@@ -19505,7 +19523,14 @@ var GROUP_TEMPLATES = [
19505
19523
  quantity: "humidity",
19506
19524
  defaultAggregate: "mean",
19507
19525
  empty: "null",
19508
- companions: [NOW$2]
19526
+ companions: [NOW$2],
19527
+ alsoFrom: {
19528
+ deviceTypes: CLIMATE_DEVICES,
19529
+ accept: {
19530
+ cap: "climate-control",
19531
+ fieldPath: "currentHumidity"
19532
+ }
19533
+ }
19509
19534
  }),
19510
19535
  numeric({
19511
19536
  id: "pressure",
@@ -44178,6 +44203,17 @@ var LlmProfileSchema = object({
44178
44203
  * field in its editor only when its descriptor lists it in `profileFields`. */
44179
44204
  topK: number().int().positive().optional(),
44180
44205
  maxTokens: number().int().positive().optional(),
44206
+ /** How hard the model "thinks" before it answers. Omitted = the model's own
44207
+ * default. `off` matters for structured output: a thinking model can spend
44208
+ * the whole completion on reasoning and return an empty `content`. Carried
44209
+ * only by the wires that have it — a kind offers the field in its editor
44210
+ * only when its descriptor lists it in `profileFields`. */
44211
+ reasoningEffort: _enum([
44212
+ "off",
44213
+ "low",
44214
+ "medium",
44215
+ "high"
44216
+ ]).optional(),
44181
44217
  /** Prompt context window. Advisory for cloud kinds (they enforce their own). */
44182
44218
  contextLength: number().int().positive().optional(),
44183
44219
  /** Default system prompt. A caller's `system` REPLACES it (never appends —
@@ -44216,6 +44252,7 @@ var LlmProfileFieldSchema = _enum([
44216
44252
  "topP",
44217
44253
  "topK",
44218
44254
  "maxTokens",
44255
+ "reasoningEffort",
44219
44256
  "contextLength",
44220
44257
  "systemPrompt",
44221
44258
  "timeoutMs",
@@ -45466,6 +45503,43 @@ var NotificationActionSchema = object({
45466
45503
  */
45467
45504
  mode: _enum(["navigate", "background"]).optional()
45468
45505
  });
45506
+ /** A delivery parameter value: what a notifier declared it takes. */
45507
+ var DeliveryParamValueSchema = union([
45508
+ string(),
45509
+ number(),
45510
+ boolean()
45511
+ ]);
45512
+ /**
45513
+ * One extra delivery parameter a notifier KIND declares (D938). A rule that
45514
+ * addresses a target of that kind may set it; a kind that declares nothing is
45515
+ * never handed one. The admin UI derives its control from this descriptor —
45516
+ * no editor knows a service by name.
45517
+ *
45518
+ * Optional fields are `.optional()`, never `.default()` (a Zod default does not
45519
+ * run on the addon cap path).
45520
+ */
45521
+ var DeliveryParamSchema = object({
45522
+ key: string().min(1),
45523
+ label: string(),
45524
+ /** i18n key of the label, resolved by the declaring addon's namespace. */
45525
+ labelKey: string().optional(),
45526
+ type: _enum([
45527
+ "enum",
45528
+ "number",
45529
+ "boolean",
45530
+ "string"
45531
+ ]),
45532
+ /** `enum` only: the closed set of accepted values. */
45533
+ options: array(object({
45534
+ value: string(),
45535
+ label: string()
45536
+ })).optional(),
45537
+ /** `number` only. */
45538
+ min: number().optional(),
45539
+ max: number().optional(),
45540
+ /** What the notifier does when the rule sets nothing; shown as the placeholder. */
45541
+ default: DeliveryParamValueSchema.optional()
45542
+ });
45469
45543
  /**
45470
45544
  * The canonical notification. `body` is the only hard field (Apprise model).
45471
45545
  * `priority` is a 5-level ORDINAL (1=lowest … 3=normal(default) … 5=urgent),
@@ -45488,7 +45562,13 @@ var NotificationSchema = object({
45488
45562
  tag: string().optional(),
45489
45563
  deviceId: number().optional(),
45490
45564
  eventId: string().optional(),
45491
- metadata: record(string(), unknown()).optional()
45565
+ metadata: record(string(), unknown()).optional(),
45566
+ /**
45567
+ * Values for the parameters the target's kind DECLARES in
45568
+ * {@link TargetKindSchema} `deliveryParams`. Already validated against the
45569
+ * declaration by the sender; a notifier reads only the keys it declared.
45570
+ */
45571
+ delivery: record(string(), DeliveryParamValueSchema).optional()
45492
45572
  });
45493
45573
  /** One declared native severity/priority level for a kind. */
45494
45574
  var TargetKindLevelSchema = object({
@@ -45594,6 +45674,11 @@ var TargetKindSchema = object({
45594
45674
  */
45595
45675
  destinationKeys: array(string()).optional(),
45596
45676
  supportsDiscovery: boolean(),
45677
+ /**
45678
+ * Extra delivery parameters a rule may set for a target of this kind (D938).
45679
+ * Absent = none; the rule editor then offers nothing.
45680
+ */
45681
+ deliveryParams: array(DeliveryParamSchema).optional(),
45597
45682
  caps: TargetKindCapsSchema
45598
45683
  });
45599
45684
  /**
@@ -57995,7 +58080,9 @@ var ManifestShapeSchema = object({
57995
58080
  icon: string().optional()
57996
58081
  }).optional(),
57997
58082
  protected: boolean().optional(),
57998
- removable: boolean().optional()
58083
+ removable: boolean().optional(),
58084
+ /** Declared Integrations-page block (mirror of `AddonDeclaration.integrationSection`). */
58085
+ integrationSection: _enum(["system", "providers"]).optional()
57999
58086
  });
58000
58087
  var AddonProcessSchema = object({
58001
58088
  pid: number().optional(),
@@ -59146,6 +59233,56 @@ var buttonCapability = {
59146
59233
  }) }
59147
59234
  };
59148
59235
  /**
59236
+ * A pulse train in signed microseconds: mark (+) first, then space (-), strictly
59237
+ * alternating, no zeros, 2..1024 entries.
59238
+ */
59239
+ var IrTimingsSchema = array(number().int()).min(2).max(1024).superRefine((timings, ctx) => {
59240
+ timings.forEach((value, index) => {
59241
+ const expectMark = index % 2 === 0;
59242
+ if (value === 0 || value > 0 !== expectMark) ctx.addIssue({
59243
+ code: "custom",
59244
+ message: `timing ${index} must be a non-zero ${expectMark ? "mark (positive)" : "space (negative)"}`,
59245
+ path: [index]
59246
+ });
59247
+ });
59248
+ });
59249
+ /** Per-command transmit options. Every key is optional; a transmitter applies what it can. */
59250
+ var TransmitSettingsSchema = object({
59251
+ carrierHz: number().int().positive().optional(),
59252
+ dutyCyclePercent: number().int().min(1).max(100).optional(),
59253
+ repeat: number().int().min(0).max(20).optional(),
59254
+ repeatDelayMs: number().int().min(0).optional()
59255
+ });
59256
+ /** The setting keys a transmitter may declare as settable (`getInfo.settable`). */
59257
+ var TransmitSettingKeySchema = _enum([
59258
+ "carrierHz",
59259
+ "dutyCyclePercent",
59260
+ "repeat",
59261
+ "repeatDelayMs"
59262
+ ]);
59263
+ var IrMediumSchema = _enum(["ir", "rf"]);
59264
+ var IrSendResultSchema = object({
59265
+ ok: literal(true),
59266
+ /** Settings the transmitter could not apply; the train was still sent. */
59267
+ ignoredSettings: array(string())
59268
+ });
59269
+ var IrTransmitterInfoSchema = object({
59270
+ media: array(IrMediumSchema),
59271
+ settable: array(TransmitSettingKeySchema),
59272
+ maxTimings: number().int().positive()
59273
+ });
59274
+ DeviceType.Generic, method(object({
59275
+ deviceId: number().int().nonnegative(),
59276
+ timings: IrTimingsSchema,
59277
+ settings: TransmitSettingsSchema.optional()
59278
+ }), IrSendResultSchema, {
59279
+ kind: "mutation",
59280
+ auth: "protected"
59281
+ }), method(object({ deviceId: number().int().nonnegative() }), IrTransmitterInfoSchema, {
59282
+ kind: "query",
59283
+ auth: "protected"
59284
+ });
59285
+ /**
59149
59286
  * `calendar-source` — collection cap exposing per-provider calendars and
59150
59287
  * their events. Every addon that contributes calendars (Home Assistant,
59151
59288
  * a future Google Calendar addon, …) registers a provider here. The hub
@@ -65206,9 +65343,14 @@ var PetFeederStatusSchema = object({
65206
65343
  * (`device_class: problem`, on = low). True when the tank reports empty,
65207
65344
  * or, on a dual-hopper model, when EITHER hopper is empty. */
65208
65345
  lowFood: boolean(),
65209
- /** Battery charge 0..100 (%). Null on mains-powered models or when the
65210
- * device has no battery reading. */
65346
+ /** Battery charge 0..100 (%). On a feeder running on `mains` this is the
65347
+ * BACKUP battery's charge, not the power source. Null when the device has
65348
+ * no battery reading. */
65211
65349
  batteryPower: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
65350
+ /** What the feeder is powered from right now: `mains` (plugged in, the
65351
+ * battery is only a backup) or `battery`. Null when the device does not
65352
+ * report it. */
65353
+ powerSource: _enum(["mains", "battery"]).nullable(),
65212
65354
  /**
65213
65355
  * Desiccant life remaining, stored in seconds (duration base, D944).
65214
65356
  * Providers convert from the days the feeder reports. Null when the
@@ -76871,6 +77013,20 @@ Object.freeze({
76871
77013
  access: "create",
76872
77014
  role: "viewer"
76873
77015
  },
77016
+ "irTransmitter.getInfo": {
77017
+ capName: "ir-transmitter",
77018
+ capScope: "device",
77019
+ addonId: null,
77020
+ access: "view",
77021
+ role: "viewer"
77022
+ },
77023
+ "irTransmitter.send": {
77024
+ capName: "ir-transmitter",
77025
+ capScope: "device",
77026
+ addonId: null,
77027
+ access: "create",
77028
+ role: "viewer"
77029
+ },
76874
77030
  "keychain.delete": {
76875
77031
  capName: "keychain",
76876
77032
  capScope: "system",
@@ -84494,6 +84650,11 @@ var ACTUATOR_CAP_VOCABULARY = {
84494
84650
  icon: "circle-dot"
84495
84651
  }]
84496
84652
  },
84653
+ "ir-transmitter": {
84654
+ scope: "device",
84655
+ noun: t("IR / RF transmitter", "Trasmettitore IR / RF"),
84656
+ notOperatorFacing: { send: "a raw pulse train is not something an operator composes in an automation; the remote that owns the command table sends it" }
84657
+ },
84497
84658
  control: {
84498
84659
  scope: "device",
84499
84660
  noun: t("Control", "Controllo"),
@@ -88224,6 +88385,16 @@ Object.freeze({
88224
88385
  form: "single",
88225
88386
  optional: false
88226
88387
  }],
88388
+ "irTransmitter.getInfo": [{
88389
+ name: "deviceId",
88390
+ form: "single",
88391
+ optional: false
88392
+ }],
88393
+ "irTransmitter.send": [{
88394
+ name: "deviceId",
88395
+ form: "single",
88396
+ optional: false
88397
+ }],
88227
88398
  "keychain.deleteDeviceScope": [{
88228
88399
  name: "deviceId",
88229
88400
  form: "single",
@@ -91606,5 +91777,21 @@ function bestLocationMatch(externalName, existing, threshold = .8) {
91606
91777
  String.raw`(?<=^|["'(\s>,\[{])`;
91607
91778
  var MB = 1024 * 1024;
91608
91779
  1024 * MB, 3072 * MB;
91780
+ discriminatedUnion("kind", [object({
91781
+ kind: literal("raw"),
91782
+ timings: array(number().int()),
91783
+ settings: TransmitSettingsSchema.optional()
91784
+ }), object({
91785
+ kind: literal("pronto"),
91786
+ code: string()
91787
+ })]);
91788
+ object({
91789
+ manufacturer: string().optional(),
91790
+ supportedModels: array(string()).optional(),
91791
+ supportedController: string().optional(),
91792
+ commandsEncoding: string(),
91793
+ delay: number().nonnegative().optional(),
91794
+ commands: record(string(), unknown())
91795
+ });
91609
91796
  //#endregion
91610
91797
  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 };
@@ -5580,7 +5580,7 @@ var ZodIssueCode = {
5580
5580
  var ZodFirstPartyTypeKind;
5581
5581
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5582
5582
  //#endregion
5583
- //#region ../types/dist/sleep-Crlmu_tO.mjs
5583
+ //#region ../types/dist/sleep-BAvUCi_2.mjs
5584
5584
  /**
5585
5585
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5586
5586
  * window to float samples (D455).
@@ -9035,6 +9035,7 @@ var CAP_NAMES = Object.freeze([
9035
9035
  "image-settings",
9036
9036
  "integrations",
9037
9037
  "intercom",
9038
+ "ir-transmitter",
9038
9039
  "keychain",
9039
9040
  "keychain-admin",
9040
9041
  "lawn-mower-control",
@@ -10282,6 +10283,11 @@ Object.freeze({
10282
10283
  "path": "batteryPower",
10283
10284
  "valueType": "number"
10284
10285
  },
10286
+ {
10287
+ "path": "powerSource",
10288
+ "valueType": "enum",
10289
+ "enumValues": ["mains", "battery"]
10290
+ },
10285
10291
  {
10286
10292
  "path": "desiccantLeftDays",
10287
10293
  "valueType": "number"
@@ -10865,7 +10871,7 @@ object({
10865
10871
  params: record(string(), union([string(), number()])).optional()
10866
10872
  });
10867
10873
  //#endregion
10868
- //#region ../types/dist/err-msg-DIorGYeC.mjs
10874
+ //#region ../types/dist/err-msg-BCdlR2Li.mjs
10869
10875
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
10870
10876
  DeviceType["Camera"] = "camera";
10871
10877
  DeviceType["Hub"] = "hub";
@@ -11211,6 +11217,9 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
11211
11217
  /** Fallback when the notifier service name doesn't match a known
11212
11218
  * pattern. */
11213
11219
  DeviceRole["GenericNotifier"] = "generic-notifier";
11220
+ /** Emits a pulse train (infrared or RF) on request — the `ir-transmitter`
11221
+ * cap. A `DeviceType.Generic` device. */
11222
+ DeviceRole["IrTransmitter"] = "ir-transmitter";
11214
11223
  return DeviceRole;
11215
11224
  }({});
11216
11225
  /**
@@ -11224,7 +11233,7 @@ function errMsg(err) {
11224
11233
  return String(err);
11225
11234
  }
11226
11235
  //#endregion
11227
- //#region ../types/dist/composition-CZImLpOI.mjs
11236
+ //#region ../types/dist/composition-DpFv_J6D.mjs
11228
11237
  /**
11229
11238
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11230
11239
  *
@@ -19454,12 +19463,13 @@ var CHANGED = {
19454
19463
  expr: "now"
19455
19464
  };
19456
19465
  function numeric(input) {
19466
+ const { alsoFrom, ...base } = input;
19457
19467
  return {
19458
- ...input,
19468
+ ...base,
19459
19469
  family: "numeric",
19460
19470
  deviceType: DeviceType.Sensor,
19461
19471
  memberDeviceType: DeviceType.Sensor,
19462
- memberDeviceTypes: [DeviceType.Sensor],
19472
+ memberDeviceTypes: [DeviceType.Sensor, ...alsoFrom?.deviceTypes ?? []],
19463
19473
  activeWhen: void 0,
19464
19474
  commandCaps: [],
19465
19475
  baseUnit: baseUnitOf(input.quantity),
@@ -19467,9 +19477,10 @@ function numeric(input) {
19467
19477
  accept: [{
19468
19478
  cap: input.outputCap,
19469
19479
  fieldPath: input.outputField
19470
- }]
19480
+ }, ...alsoFrom === void 0 ? [] : [alsoFrom.accept]]
19471
19481
  };
19472
19482
  }
19483
+ var CLIMATE_DEVICES = [DeviceType.Thermostat, DeviceType.Climate];
19473
19484
  function binary(input) {
19474
19485
  return {
19475
19486
  ...input,
@@ -19495,7 +19506,14 @@ var GROUP_TEMPLATES = [
19495
19506
  quantity: "temperature",
19496
19507
  defaultAggregate: "mean",
19497
19508
  empty: "null",
19498
- companions: [NOW$2]
19509
+ companions: [NOW$2],
19510
+ alsoFrom: {
19511
+ deviceTypes: CLIMATE_DEVICES,
19512
+ accept: {
19513
+ cap: "climate-control",
19514
+ fieldPath: "currentTemp"
19515
+ }
19516
+ }
19499
19517
  }),
19500
19518
  numeric({
19501
19519
  id: "humidity",
@@ -19506,7 +19524,14 @@ var GROUP_TEMPLATES = [
19506
19524
  quantity: "humidity",
19507
19525
  defaultAggregate: "mean",
19508
19526
  empty: "null",
19509
- companions: [NOW$2]
19527
+ companions: [NOW$2],
19528
+ alsoFrom: {
19529
+ deviceTypes: CLIMATE_DEVICES,
19530
+ accept: {
19531
+ cap: "climate-control",
19532
+ fieldPath: "currentHumidity"
19533
+ }
19534
+ }
19510
19535
  }),
19511
19536
  numeric({
19512
19537
  id: "pressure",
@@ -44179,6 +44204,17 @@ var LlmProfileSchema = object({
44179
44204
  * field in its editor only when its descriptor lists it in `profileFields`. */
44180
44205
  topK: number().int().positive().optional(),
44181
44206
  maxTokens: number().int().positive().optional(),
44207
+ /** How hard the model "thinks" before it answers. Omitted = the model's own
44208
+ * default. `off` matters for structured output: a thinking model can spend
44209
+ * the whole completion on reasoning and return an empty `content`. Carried
44210
+ * only by the wires that have it — a kind offers the field in its editor
44211
+ * only when its descriptor lists it in `profileFields`. */
44212
+ reasoningEffort: _enum([
44213
+ "off",
44214
+ "low",
44215
+ "medium",
44216
+ "high"
44217
+ ]).optional(),
44182
44218
  /** Prompt context window. Advisory for cloud kinds (they enforce their own). */
44183
44219
  contextLength: number().int().positive().optional(),
44184
44220
  /** Default system prompt. A caller's `system` REPLACES it (never appends —
@@ -44217,6 +44253,7 @@ var LlmProfileFieldSchema = _enum([
44217
44253
  "topP",
44218
44254
  "topK",
44219
44255
  "maxTokens",
44256
+ "reasoningEffort",
44220
44257
  "contextLength",
44221
44258
  "systemPrompt",
44222
44259
  "timeoutMs",
@@ -45467,6 +45504,43 @@ var NotificationActionSchema = object({
45467
45504
  */
45468
45505
  mode: _enum(["navigate", "background"]).optional()
45469
45506
  });
45507
+ /** A delivery parameter value: what a notifier declared it takes. */
45508
+ var DeliveryParamValueSchema = union([
45509
+ string(),
45510
+ number(),
45511
+ boolean()
45512
+ ]);
45513
+ /**
45514
+ * One extra delivery parameter a notifier KIND declares (D938). A rule that
45515
+ * addresses a target of that kind may set it; a kind that declares nothing is
45516
+ * never handed one. The admin UI derives its control from this descriptor —
45517
+ * no editor knows a service by name.
45518
+ *
45519
+ * Optional fields are `.optional()`, never `.default()` (a Zod default does not
45520
+ * run on the addon cap path).
45521
+ */
45522
+ var DeliveryParamSchema = object({
45523
+ key: string().min(1),
45524
+ label: string(),
45525
+ /** i18n key of the label, resolved by the declaring addon's namespace. */
45526
+ labelKey: string().optional(),
45527
+ type: _enum([
45528
+ "enum",
45529
+ "number",
45530
+ "boolean",
45531
+ "string"
45532
+ ]),
45533
+ /** `enum` only: the closed set of accepted values. */
45534
+ options: array(object({
45535
+ value: string(),
45536
+ label: string()
45537
+ })).optional(),
45538
+ /** `number` only. */
45539
+ min: number().optional(),
45540
+ max: number().optional(),
45541
+ /** What the notifier does when the rule sets nothing; shown as the placeholder. */
45542
+ default: DeliveryParamValueSchema.optional()
45543
+ });
45470
45544
  /**
45471
45545
  * The canonical notification. `body` is the only hard field (Apprise model).
45472
45546
  * `priority` is a 5-level ORDINAL (1=lowest … 3=normal(default) … 5=urgent),
@@ -45489,7 +45563,13 @@ var NotificationSchema = object({
45489
45563
  tag: string().optional(),
45490
45564
  deviceId: number().optional(),
45491
45565
  eventId: string().optional(),
45492
- metadata: record(string(), unknown()).optional()
45566
+ metadata: record(string(), unknown()).optional(),
45567
+ /**
45568
+ * Values for the parameters the target's kind DECLARES in
45569
+ * {@link TargetKindSchema} `deliveryParams`. Already validated against the
45570
+ * declaration by the sender; a notifier reads only the keys it declared.
45571
+ */
45572
+ delivery: record(string(), DeliveryParamValueSchema).optional()
45493
45573
  });
45494
45574
  /** One declared native severity/priority level for a kind. */
45495
45575
  var TargetKindLevelSchema = object({
@@ -45595,6 +45675,11 @@ var TargetKindSchema = object({
45595
45675
  */
45596
45676
  destinationKeys: array(string()).optional(),
45597
45677
  supportsDiscovery: boolean(),
45678
+ /**
45679
+ * Extra delivery parameters a rule may set for a target of this kind (D938).
45680
+ * Absent = none; the rule editor then offers nothing.
45681
+ */
45682
+ deliveryParams: array(DeliveryParamSchema).optional(),
45598
45683
  caps: TargetKindCapsSchema
45599
45684
  });
45600
45685
  /**
@@ -57996,7 +58081,9 @@ var ManifestShapeSchema = object({
57996
58081
  icon: string().optional()
57997
58082
  }).optional(),
57998
58083
  protected: boolean().optional(),
57999
- removable: boolean().optional()
58084
+ removable: boolean().optional(),
58085
+ /** Declared Integrations-page block (mirror of `AddonDeclaration.integrationSection`). */
58086
+ integrationSection: _enum(["system", "providers"]).optional()
58000
58087
  });
58001
58088
  var AddonProcessSchema = object({
58002
58089
  pid: number().optional(),
@@ -59147,6 +59234,56 @@ var buttonCapability = {
59147
59234
  }) }
59148
59235
  };
59149
59236
  /**
59237
+ * A pulse train in signed microseconds: mark (+) first, then space (-), strictly
59238
+ * alternating, no zeros, 2..1024 entries.
59239
+ */
59240
+ var IrTimingsSchema = array(number().int()).min(2).max(1024).superRefine((timings, ctx) => {
59241
+ timings.forEach((value, index) => {
59242
+ const expectMark = index % 2 === 0;
59243
+ if (value === 0 || value > 0 !== expectMark) ctx.addIssue({
59244
+ code: "custom",
59245
+ message: `timing ${index} must be a non-zero ${expectMark ? "mark (positive)" : "space (negative)"}`,
59246
+ path: [index]
59247
+ });
59248
+ });
59249
+ });
59250
+ /** Per-command transmit options. Every key is optional; a transmitter applies what it can. */
59251
+ var TransmitSettingsSchema = object({
59252
+ carrierHz: number().int().positive().optional(),
59253
+ dutyCyclePercent: number().int().min(1).max(100).optional(),
59254
+ repeat: number().int().min(0).max(20).optional(),
59255
+ repeatDelayMs: number().int().min(0).optional()
59256
+ });
59257
+ /** The setting keys a transmitter may declare as settable (`getInfo.settable`). */
59258
+ var TransmitSettingKeySchema = _enum([
59259
+ "carrierHz",
59260
+ "dutyCyclePercent",
59261
+ "repeat",
59262
+ "repeatDelayMs"
59263
+ ]);
59264
+ var IrMediumSchema = _enum(["ir", "rf"]);
59265
+ var IrSendResultSchema = object({
59266
+ ok: literal(true),
59267
+ /** Settings the transmitter could not apply; the train was still sent. */
59268
+ ignoredSettings: array(string())
59269
+ });
59270
+ var IrTransmitterInfoSchema = object({
59271
+ media: array(IrMediumSchema),
59272
+ settable: array(TransmitSettingKeySchema),
59273
+ maxTimings: number().int().positive()
59274
+ });
59275
+ DeviceType.Generic, method(object({
59276
+ deviceId: number().int().nonnegative(),
59277
+ timings: IrTimingsSchema,
59278
+ settings: TransmitSettingsSchema.optional()
59279
+ }), IrSendResultSchema, {
59280
+ kind: "mutation",
59281
+ auth: "protected"
59282
+ }), method(object({ deviceId: number().int().nonnegative() }), IrTransmitterInfoSchema, {
59283
+ kind: "query",
59284
+ auth: "protected"
59285
+ });
59286
+ /**
59150
59287
  * `calendar-source` — collection cap exposing per-provider calendars and
59151
59288
  * their events. Every addon that contributes calendars (Home Assistant,
59152
59289
  * a future Google Calendar addon, …) registers a provider here. The hub
@@ -65207,9 +65344,14 @@ var PetFeederStatusSchema = object({
65207
65344
  * (`device_class: problem`, on = low). True when the tank reports empty,
65208
65345
  * or, on a dual-hopper model, when EITHER hopper is empty. */
65209
65346
  lowFood: boolean(),
65210
- /** Battery charge 0..100 (%). Null on mains-powered models or when the
65211
- * device has no battery reading. */
65347
+ /** Battery charge 0..100 (%). On a feeder running on `mains` this is the
65348
+ * BACKUP battery's charge, not the power source. Null when the device has
65349
+ * no battery reading. */
65212
65350
  batteryPower: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
65351
+ /** What the feeder is powered from right now: `mains` (plugged in, the
65352
+ * battery is only a backup) or `battery`. Null when the device does not
65353
+ * report it. */
65354
+ powerSource: _enum(["mains", "battery"]).nullable(),
65213
65355
  /**
65214
65356
  * Desiccant life remaining, stored in seconds (duration base, D944).
65215
65357
  * Providers convert from the days the feeder reports. Null when the
@@ -76872,6 +77014,20 @@ Object.freeze({
76872
77014
  access: "create",
76873
77015
  role: "viewer"
76874
77016
  },
77017
+ "irTransmitter.getInfo": {
77018
+ capName: "ir-transmitter",
77019
+ capScope: "device",
77020
+ addonId: null,
77021
+ access: "view",
77022
+ role: "viewer"
77023
+ },
77024
+ "irTransmitter.send": {
77025
+ capName: "ir-transmitter",
77026
+ capScope: "device",
77027
+ addonId: null,
77028
+ access: "create",
77029
+ role: "viewer"
77030
+ },
76875
77031
  "keychain.delete": {
76876
77032
  capName: "keychain",
76877
77033
  capScope: "system",
@@ -84495,6 +84651,11 @@ var ACTUATOR_CAP_VOCABULARY = {
84495
84651
  icon: "circle-dot"
84496
84652
  }]
84497
84653
  },
84654
+ "ir-transmitter": {
84655
+ scope: "device",
84656
+ noun: t("IR / RF transmitter", "Trasmettitore IR / RF"),
84657
+ notOperatorFacing: { send: "a raw pulse train is not something an operator composes in an automation; the remote that owns the command table sends it" }
84658
+ },
84498
84659
  control: {
84499
84660
  scope: "device",
84500
84661
  noun: t("Control", "Controllo"),
@@ -88225,6 +88386,16 @@ Object.freeze({
88225
88386
  form: "single",
88226
88387
  optional: false
88227
88388
  }],
88389
+ "irTransmitter.getInfo": [{
88390
+ name: "deviceId",
88391
+ form: "single",
88392
+ optional: false
88393
+ }],
88394
+ "irTransmitter.send": [{
88395
+ name: "deviceId",
88396
+ form: "single",
88397
+ optional: false
88398
+ }],
88228
88399
  "keychain.deleteDeviceScope": [{
88229
88400
  name: "deviceId",
88230
88401
  form: "single",
@@ -91607,6 +91778,22 @@ function bestLocationMatch(externalName, existing, threshold = .8) {
91607
91778
  String.raw`(?<=^|["'(\s>,\[{])`;
91608
91779
  var MB = 1024 * 1024;
91609
91780
  1024 * MB, 3072 * MB;
91781
+ discriminatedUnion("kind", [object({
91782
+ kind: literal("raw"),
91783
+ timings: array(number().int()),
91784
+ settings: TransmitSettingsSchema.optional()
91785
+ }), object({
91786
+ kind: literal("pronto"),
91787
+ code: string()
91788
+ })]);
91789
+ object({
91790
+ manufacturer: string().optional(),
91791
+ supportedModels: array(string()).optional(),
91792
+ supportedController: string().optional(),
91793
+ commandsEncoding: string(),
91794
+ delay: number().nonnegative().optional(),
91795
+ commands: record(string(), unknown())
91796
+ });
91610
91797
  //#endregion
91611
91798
  Object.defineProperty(exports, "AlarmArmModeSchema", {
91612
91799
  enumerable: true,
@@ -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-DSRitvmZ.js");
27
+ const require_dist = require("../dist-C_PMvyYa.js");
28
28
  let node_crypto = require("node:crypto");
29
29
  require("node:zlib");
30
30
  let node_fs = require("node:fs");
@@ -3488,6 +3488,10 @@ function controlEntitySpecs(slice, quantity) {
3488
3488
  }, kindExtra];
3489
3489
  }
3490
3490
  var CAPS_NOT_EXPORTED = [
3491
+ {
3492
+ cap: "ir-transmitter",
3493
+ reason: "A pulse-train emitter with no state: it is driven by the remote that owns a command table, and a raw send has no meaningful single entity."
3494
+ },
3491
3495
  {
3492
3496
  cap: "group-status",
3493
3497
  reason: "Bookkeeping for a helper group (D944): how many members were included, excluded, or named. The value an operator automates on is the output capability (the temperature, the motion, the watts). These counts are session-only, have no history, and would publish a second entity that never means the reading."
@@ -1,4 +1,4 @@
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-6sCUdAUD.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-CYl0u8cF.mjs";
2
2
  import { createHmac, timingSafeEqual } from "node:crypto";
3
3
  import "node:zlib";
4
4
  import "node:fs";
@@ -3453,6 +3453,10 @@ function controlEntitySpecs(slice, quantity) {
3453
3453
  }, kindExtra];
3454
3454
  }
3455
3455
  var CAPS_NOT_EXPORTED = [
3456
+ {
3457
+ cap: "ir-transmitter",
3458
+ reason: "A pulse-train emitter with no state: it is driven by the remote that owns a command table, and a raw send has no meaningful single entity."
3459
+ },
3456
3460
  {
3457
3461
  cap: "group-status",
3458
3462
  reason: "Bookkeeping for a helper group (D944): how many members were included, excluded, or named. The value an operator automates on is the output capability (the temperature, the motion, the watts). These counts are session-only, have no history, and would publish a second entity that never means the reading."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homeassistant",
3
- "version": "1.2.634",
3
+ "version": "1.2.635",
4
4
  "description": "Home Assistant device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",