@camstack/types 1.2.425 → 1.2.427

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/index.js CHANGED
@@ -62808,7 +62808,8 @@ var BATTERY_DEVICE_TYPES = [
62808
62808
  require_err_msg.DeviceType.Switch,
62809
62809
  require_err_msg.DeviceType.PetFeeder,
62810
62810
  require_err_msg.DeviceType.Container,
62811
- require_err_msg.DeviceType.Thermostat
62811
+ require_err_msg.DeviceType.Thermostat,
62812
+ require_err_msg.DeviceType.EventEmitter
62812
62813
  ];
62813
62814
  /** Generic Customize target for the percentage reading (D936). */
62814
62815
  var batteryCustomize = {
@@ -71593,9 +71594,9 @@ var PowerMeterStatusSchema = zod.z.object({
71593
71594
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
71594
71595
  kwhTotal: zod.z.number().optional().meta(require_sleep.readingMeta("energy", { label: "Energy" })),
71595
71596
  /** Voltage in volts. */
71596
- volts: zod.z.number().optional().meta(require_sleep.readingMeta("voltage")),
71597
+ volts: zod.z.number().optional().meta(require_sleep.readingMeta("voltage", { label: "Voltage" })),
71597
71598
  /** Current in amperes. */
71598
- amps: zod.z.number().optional().meta(require_sleep.readingMeta("current")),
71599
+ amps: zod.z.number().optional().meta(require_sleep.readingMeta("current", { label: "Current" })),
71599
71600
  /** Apparent power in volt-amperes. */
71600
71601
  va: zod.z.number().optional().meta(require_sleep.readingMeta("apparent-power")),
71601
71602
  /** Power factor (0..1) if reported. */
@@ -71603,17 +71604,74 @@ var PowerMeterStatusSchema = zod.z.object({
71603
71604
  /** Ms epoch when the slice was last updated. */
71604
71605
  lastFetchedAt: zod.z.number()
71605
71606
  });
71607
+ /**
71608
+ * Loads that draw metered mains power (D951). The reading is a feature of the
71609
+ * device itself — a plug, a lamp, a fan, an air conditioner, a boiler, a
71610
+ * vacuum dock — not a separate sensor beside it. A `Sensor` stays: a clamp
71611
+ * meter or a standalone energy monitor IS the device. Cover, lock, valve,
71612
+ * camera and the like are left out: their draw is not what anyone meters.
71613
+ */
71614
+ var POWER_METER_DEVICE_TYPES = [
71615
+ require_err_msg.DeviceType.Sensor,
71616
+ require_err_msg.DeviceType.Switch,
71617
+ require_err_msg.DeviceType.Light,
71618
+ require_err_msg.DeviceType.Fan,
71619
+ require_err_msg.DeviceType.Climate,
71620
+ require_err_msg.DeviceType.Thermostat,
71621
+ require_err_msg.DeviceType.Humidifier,
71622
+ require_err_msg.DeviceType.WaterHeater,
71623
+ require_err_msg.DeviceType.MediaPlayer,
71624
+ require_err_msg.DeviceType.Washer,
71625
+ require_err_msg.DeviceType.Dryer,
71626
+ require_err_msg.DeviceType.Dishwasher,
71627
+ require_err_msg.DeviceType.Vacuum,
71628
+ require_err_msg.DeviceType.LawnMower,
71629
+ require_err_msg.DeviceType.PetFeeder
71630
+ ];
71631
+ /** Everything but a bare `Sensor`: a sensor that takes its reading from another sensor adds nothing. */
71632
+ var POWER_METER_CUSTOMIZE_DEVICE_TYPES = POWER_METER_DEVICE_TYPES.filter((type) => type !== require_err_msg.DeviceType.Sensor);
71633
+ /** One scalar target per reading; each is sourced from a device of its own (D951). */
71634
+ function powerTarget(id, unit) {
71635
+ return {
71636
+ id,
71637
+ cardinality: "scalar",
71638
+ vocabulary: {
71639
+ cap: "power-meter",
71640
+ stateField: id
71641
+ },
71642
+ deviceTypes: POWER_METER_CUSTOMIZE_DEVICE_TYPES,
71643
+ apply: "add",
71644
+ path: id,
71645
+ sources: [{
71646
+ kind: "numeric",
71647
+ requiredUnit: unit,
71648
+ transforms: [{ kind: "identity" }]
71649
+ }],
71650
+ companions: [{
71651
+ kind: "clock",
71652
+ path: "lastFetchedAt",
71653
+ when: "always"
71654
+ }],
71655
+ sourceReport: { status: "assignment-status" },
71656
+ advancedExpression: true
71657
+ };
71658
+ }
71659
+ /** "Power and energy" extension: watts, energy, voltage and current from other devices (D951). */
71660
+ var powerMeterCustomize = {
71661
+ version: 1,
71662
+ targets: [
71663
+ powerTarget("watts", "W"),
71664
+ powerTarget("kwhTotal", "kWh"),
71665
+ powerTarget("volts", "V"),
71666
+ powerTarget("amps", "A")
71667
+ ]
71668
+ };
71606
71669
  var powerMeterCapability = {
71607
71670
  name: "power-meter",
71608
71671
  scope: "device",
71609
71672
  deviceNative: true,
71610
71673
  mode: "singleton",
71611
- deviceTypes: [
71612
- require_err_msg.DeviceType.Sensor,
71613
- require_err_msg.DeviceType.Washer,
71614
- require_err_msg.DeviceType.Dryer,
71615
- require_err_msg.DeviceType.Dishwasher
71616
- ],
71674
+ deviceTypes: POWER_METER_DEVICE_TYPES,
71617
71675
  methods: {},
71618
71676
  status: {
71619
71677
  schema: PowerMeterStatusSchema,
@@ -71670,7 +71728,8 @@ var powerMeterCapability = {
71670
71728
  } },
71671
71729
  /** Clock fields: written, but excluded from the compare that decides
71672
71730
  * whether persisting is worth a SQLite commit. */
71673
- volatileStateFields: ["lastFetchedAt"]
71731
+ volatileStateFields: ["lastFetchedAt"],
71732
+ customize: powerMeterCustomize
71674
71733
  };
71675
71734
  //#endregion
71676
71735
  //#region src/capabilities/presence.cap.ts
@@ -80443,7 +80502,7 @@ function convertUnitTargets(from) {
80443
80502
  //#region src/generated/customize-catalog.ts
80444
80503
  /**
80445
80504
  * Customize catalog, projected from every `*.cap.ts` `customize` block.
80446
- * 5 caps. Field keys are `runtimeState` paths. No Zod.
80505
+ * 6 caps. Field keys are `runtimeState` paths. No Zod.
80447
80506
  */
80448
80507
  var CAP_CUSTOMIZE_CATALOG = {
80449
80508
  "battery": {
@@ -80458,7 +80517,8 @@ var CAP_CUSTOMIZE_CATALOG = {
80458
80517
  require_err_msg.DeviceType.Switch,
80459
80518
  require_err_msg.DeviceType.PetFeeder,
80460
80519
  require_err_msg.DeviceType.Container,
80461
- require_err_msg.DeviceType.Thermostat
80520
+ require_err_msg.DeviceType.Thermostat,
80521
+ require_err_msg.DeviceType.EventEmitter
80462
80522
  ],
80463
80523
  apply: "add",
80464
80524
  vocabularyCap: "battery",
@@ -80708,6 +80768,167 @@ var CAP_CUSTOMIZE_CATALOG = {
80708
80768
  ]
80709
80769
  }]
80710
80770
  },
80771
+ "power-meter": {
80772
+ version: 1,
80773
+ targets: [
80774
+ {
80775
+ id: "watts",
80776
+ cardinality: "scalar",
80777
+ deviceTypes: [
80778
+ require_err_msg.DeviceType.Switch,
80779
+ require_err_msg.DeviceType.Light,
80780
+ require_err_msg.DeviceType.Fan,
80781
+ require_err_msg.DeviceType.Climate,
80782
+ require_err_msg.DeviceType.Thermostat,
80783
+ require_err_msg.DeviceType.Humidifier,
80784
+ require_err_msg.DeviceType.WaterHeater,
80785
+ require_err_msg.DeviceType.MediaPlayer,
80786
+ require_err_msg.DeviceType.Washer,
80787
+ require_err_msg.DeviceType.Dryer,
80788
+ require_err_msg.DeviceType.Dishwasher,
80789
+ require_err_msg.DeviceType.Vacuum,
80790
+ require_err_msg.DeviceType.LawnMower,
80791
+ require_err_msg.DeviceType.PetFeeder
80792
+ ],
80793
+ apply: "add",
80794
+ vocabularyCap: "power-meter",
80795
+ vocabularyStateField: "watts",
80796
+ sources: [{
80797
+ kind: "numeric",
80798
+ requiredUnit: "W",
80799
+ transformKinds: ["identity"],
80800
+ transforms: [{ kind: "identity" }]
80801
+ }],
80802
+ sourceReport: { status: "assignment-status" },
80803
+ advancedExpression: true,
80804
+ path: "watts",
80805
+ valueKind: "number",
80806
+ nullable: false,
80807
+ companions: [{
80808
+ kind: "clock",
80809
+ path: "lastFetchedAt",
80810
+ when: "always"
80811
+ }]
80812
+ },
80813
+ {
80814
+ id: "kwhTotal",
80815
+ cardinality: "scalar",
80816
+ deviceTypes: [
80817
+ require_err_msg.DeviceType.Switch,
80818
+ require_err_msg.DeviceType.Light,
80819
+ require_err_msg.DeviceType.Fan,
80820
+ require_err_msg.DeviceType.Climate,
80821
+ require_err_msg.DeviceType.Thermostat,
80822
+ require_err_msg.DeviceType.Humidifier,
80823
+ require_err_msg.DeviceType.WaterHeater,
80824
+ require_err_msg.DeviceType.MediaPlayer,
80825
+ require_err_msg.DeviceType.Washer,
80826
+ require_err_msg.DeviceType.Dryer,
80827
+ require_err_msg.DeviceType.Dishwasher,
80828
+ require_err_msg.DeviceType.Vacuum,
80829
+ require_err_msg.DeviceType.LawnMower,
80830
+ require_err_msg.DeviceType.PetFeeder
80831
+ ],
80832
+ apply: "add",
80833
+ vocabularyCap: "power-meter",
80834
+ vocabularyStateField: "kwhTotal",
80835
+ sources: [{
80836
+ kind: "numeric",
80837
+ requiredUnit: "kWh",
80838
+ transformKinds: ["identity"],
80839
+ transforms: [{ kind: "identity" }]
80840
+ }],
80841
+ sourceReport: { status: "assignment-status" },
80842
+ advancedExpression: true,
80843
+ path: "kwhTotal",
80844
+ valueKind: "number",
80845
+ nullable: false,
80846
+ companions: [{
80847
+ kind: "clock",
80848
+ path: "lastFetchedAt",
80849
+ when: "always"
80850
+ }]
80851
+ },
80852
+ {
80853
+ id: "volts",
80854
+ cardinality: "scalar",
80855
+ deviceTypes: [
80856
+ require_err_msg.DeviceType.Switch,
80857
+ require_err_msg.DeviceType.Light,
80858
+ require_err_msg.DeviceType.Fan,
80859
+ require_err_msg.DeviceType.Climate,
80860
+ require_err_msg.DeviceType.Thermostat,
80861
+ require_err_msg.DeviceType.Humidifier,
80862
+ require_err_msg.DeviceType.WaterHeater,
80863
+ require_err_msg.DeviceType.MediaPlayer,
80864
+ require_err_msg.DeviceType.Washer,
80865
+ require_err_msg.DeviceType.Dryer,
80866
+ require_err_msg.DeviceType.Dishwasher,
80867
+ require_err_msg.DeviceType.Vacuum,
80868
+ require_err_msg.DeviceType.LawnMower,
80869
+ require_err_msg.DeviceType.PetFeeder
80870
+ ],
80871
+ apply: "add",
80872
+ vocabularyCap: "power-meter",
80873
+ vocabularyStateField: "volts",
80874
+ sources: [{
80875
+ kind: "numeric",
80876
+ requiredUnit: "V",
80877
+ transformKinds: ["identity"],
80878
+ transforms: [{ kind: "identity" }]
80879
+ }],
80880
+ sourceReport: { status: "assignment-status" },
80881
+ advancedExpression: true,
80882
+ path: "volts",
80883
+ valueKind: "number",
80884
+ nullable: false,
80885
+ companions: [{
80886
+ kind: "clock",
80887
+ path: "lastFetchedAt",
80888
+ when: "always"
80889
+ }]
80890
+ },
80891
+ {
80892
+ id: "amps",
80893
+ cardinality: "scalar",
80894
+ deviceTypes: [
80895
+ require_err_msg.DeviceType.Switch,
80896
+ require_err_msg.DeviceType.Light,
80897
+ require_err_msg.DeviceType.Fan,
80898
+ require_err_msg.DeviceType.Climate,
80899
+ require_err_msg.DeviceType.Thermostat,
80900
+ require_err_msg.DeviceType.Humidifier,
80901
+ require_err_msg.DeviceType.WaterHeater,
80902
+ require_err_msg.DeviceType.MediaPlayer,
80903
+ require_err_msg.DeviceType.Washer,
80904
+ require_err_msg.DeviceType.Dryer,
80905
+ require_err_msg.DeviceType.Dishwasher,
80906
+ require_err_msg.DeviceType.Vacuum,
80907
+ require_err_msg.DeviceType.LawnMower,
80908
+ require_err_msg.DeviceType.PetFeeder
80909
+ ],
80910
+ apply: "add",
80911
+ vocabularyCap: "power-meter",
80912
+ vocabularyStateField: "amps",
80913
+ sources: [{
80914
+ kind: "numeric",
80915
+ requiredUnit: "A",
80916
+ transformKinds: ["identity"],
80917
+ transforms: [{ kind: "identity" }]
80918
+ }],
80919
+ sourceReport: { status: "assignment-status" },
80920
+ advancedExpression: true,
80921
+ path: "amps",
80922
+ valueKind: "number",
80923
+ nullable: false,
80924
+ companions: [{
80925
+ kind: "clock",
80926
+ path: "lastFetchedAt",
80927
+ when: "always"
80928
+ }]
80929
+ }
80930
+ ]
80931
+ },
80711
80932
  "running-state": {
80712
80933
  version: 1,
80713
80934
  targets: [{
@@ -80806,7 +81027,9 @@ var CAP_RUNTIME_FIELD_UNITS = {
80806
81027
  "humidity-sensor": { percent: "%" },
80807
81028
  "power-meter": {
80808
81029
  watts: "W",
80809
- kwhTotal: "kWh"
81030
+ kwhTotal: "kWh",
81031
+ volts: "V",
81032
+ amps: "A"
80810
81033
  },
80811
81034
  "temperature-sensor": { celsius: "°C" }
80812
81035
  };
@@ -80835,7 +81058,7 @@ function isLiteral(source, expr) {
80835
81058
  }
80836
81059
  //#endregion
80837
81060
  //#region src/composition/customize/event-compile.ts
80838
- var catalog$4 = CAP_CUSTOMIZE_CATALOG;
81061
+ var catalog$5 = CAP_CUSTOMIZE_CATALOG;
80839
81062
  function compilePulseOverride(input) {
80840
81063
  const target = catalogTarget$4(input.draft.cap, input.draft.targetId);
80841
81064
  if (target === null || target.shape !== "pulse") return fail$2("target");
@@ -80967,7 +81190,7 @@ function sensorEntries(sources, device, modes) {
80967
81190
  };
80968
81191
  }
80969
81192
  function catalogTarget$4(cap, targetId) {
80970
- const entry = catalog$4[cap];
81193
+ const entry = catalog$5[cap];
80971
81194
  if (entry === void 0) return null;
80972
81195
  return entry.targets.find((target) => target.id === targetId) ?? null;
80973
81196
  }
@@ -81092,7 +81315,7 @@ function wrap$2(feature) {
81092
81315
  }
81093
81316
  //#endregion
81094
81317
  //#region src/composition/customize/scalar-compile.ts
81095
- var catalog$3 = CAP_CUSTOMIZE_CATALOG;
81318
+ var catalog$4 = CAP_CUSTOMIZE_CATALOG;
81096
81319
  function compileScalarOverride(input) {
81097
81320
  const target = catalogTarget$3(input.draft.cap, input.draft.targetId);
81098
81321
  if (target === null || target.cardinality !== "scalar" || target.path === void 0) return fail$1("target");
@@ -81122,7 +81345,7 @@ function fail$1(reason) {
81122
81345
  };
81123
81346
  }
81124
81347
  function catalogTarget$3(cap, targetId) {
81125
- const entry = catalog$3[cap];
81348
+ const entry = catalog$4[cap];
81126
81349
  if (entry === void 0) return null;
81127
81350
  return entry.targets.find((target) => target.id === targetId) ?? null;
81128
81351
  }
@@ -81259,6 +81482,83 @@ function refOf$1(draft) {
81259
81482
  };
81260
81483
  }
81261
81484
  //#endregion
81485
+ //#region src/composition/customize/scalar-merge.ts
81486
+ var catalog$3 = CAP_CUSTOMIZE_CATALOG;
81487
+ function scalarTargets(cap) {
81488
+ return (catalog$3[cap]?.targets ?? []).filter((target) => target.cardinality === "scalar" && target.path !== void 0);
81489
+ }
81490
+ /** How many scalar targets the cap declares: above one, the cap's feature is shared. */
81491
+ function scalarTargetCount(cap) {
81492
+ return scalarTargets(cap).length;
81493
+ }
81494
+ function valuePath(target) {
81495
+ return target.path ?? target.id;
81496
+ }
81497
+ function ownedPaths(target) {
81498
+ return [valuePath(target), ...(target.companions ?? []).map((companion) => companion.path)];
81499
+ }
81500
+ function find(cap, targetId) {
81501
+ return scalarTargets(cap).find((target) => target.id === targetId) ?? null;
81502
+ }
81503
+ function without(fields, paths) {
81504
+ return Object.fromEntries(Object.entries(fields).filter(([path]) => !paths.has(path)));
81505
+ }
81506
+ /**
81507
+ * The cap's feature with `compiled` (one target's own feature) merged in. A cap
81508
+ * with one scalar target is replaced whole, as before.
81509
+ */
81510
+ function mergeScalarTarget(current, compiled, cap, targetId) {
81511
+ const target = find(cap, targetId);
81512
+ if (current === null || target === null || scalarTargetCount(cap) < 2) return compiled;
81513
+ const kept = without(current.fields, new Set(ownedPaths(target)));
81514
+ return {
81515
+ ...current,
81516
+ ...compiled,
81517
+ fields: {
81518
+ ...kept,
81519
+ ...compiled.fields
81520
+ }
81521
+ };
81522
+ }
81523
+ /** The cap's feature without `targetId`'s paths; null when no target value is left. */
81524
+ function removeScalarTarget(current, cap, targetId) {
81525
+ if (current === null) return null;
81526
+ const target = find(cap, targetId);
81527
+ if (target === null || scalarTargetCount(cap) < 2) return null;
81528
+ const stillAssigned = scalarTargets(cap).filter((row) => row.id !== targetId).filter((row) => current.fields[valuePath(row)] !== void 0);
81529
+ if (stillAssigned.length === 0) return null;
81530
+ const needed = new Set(stillAssigned.flatMap((row) => ownedPaths(row)));
81531
+ const drop = new Set(ownedPaths(target).filter((path) => !needed.has(path)));
81532
+ return {
81533
+ ...current,
81534
+ fields: without(current.fields, drop)
81535
+ };
81536
+ }
81537
+ /**
81538
+ * The part of a stored feature one target owns — what a decode compares with
81539
+ * its recompiled feature. A cap with one target compares the whole feature.
81540
+ */
81541
+ function ownedSlice(stored, cap, targetId) {
81542
+ const target = find(cap, targetId);
81543
+ if (target === null || scalarTargetCount(cap) < 2) return stored;
81544
+ const owned = new Set(ownedPaths(target));
81545
+ return {
81546
+ ...stored,
81547
+ fields: Object.fromEntries(Object.entries(stored.fields).filter(([path]) => owned.has(path)))
81548
+ };
81549
+ }
81550
+ /**
81551
+ * The stored feature as ONE target sees it: null when the cap's feature holds
81552
+ * only its neighbours' readings (no assignment of this target), else the whole
81553
+ * feature. A cap with one target sees what is stored.
81554
+ */
81555
+ function targetFeature(stored, cap, targetId) {
81556
+ if (stored === null) return null;
81557
+ const target = find(cap, targetId);
81558
+ if (target === null || scalarTargetCount(cap) < 2) return stored;
81559
+ return stored.fields[valuePath(target)] === void 0 ? null : stored;
81560
+ }
81561
+ //#endregion
81262
81562
  //#region src/composition/customize/scalar-decode.ts
81263
81563
  var catalog$2 = CAP_CUSTOMIZE_CATALOG;
81264
81564
  function decodeScalarOverride(input) {
@@ -81369,7 +81669,7 @@ function reproduces$1(decoded, device, stored) {
81369
81669
  sourceUnit: decoded.sourceUnit
81370
81670
  });
81371
81671
  if (!compiled.ok) return false;
81372
- return sameFeature$1(compiled.value, stored);
81672
+ return sameFeature$1(compiled.value, ownedSlice(stored, decoded.draft.cap, decoded.draft.targetId));
81373
81673
  }
81374
81674
  function sameFeature$1(compiled, stored) {
81375
81675
  return sameStored(wrap$1(withoutEnabled(compiled)), wrap$1(withoutEnabled(stored)));
@@ -119179,6 +119479,7 @@ exports.memoizePinnedFfmpeg = memoizePinnedFfmpeg;
119179
119479
  exports.mergeClipLabels = mergeClipLabels;
119180
119480
  exports.mergeKeyedArrayItem = mergeKeyedArrayItem;
119181
119481
  exports.mergeOverrides = mergeOverrides;
119482
+ exports.mergeScalarTarget = mergeScalarTarget;
119182
119483
  exports.mergeSecretStatePaths = require_sleep.mergeSecretStatePaths;
119183
119484
  exports.mergeSettingsBags = mergeSettingsBags;
119184
119485
  exports.mergeSourceInfo = mergeSourceInfo;
@@ -119245,6 +119546,7 @@ exports.optionalMethod = require_sleep.optionalMethod;
119245
119546
  exports.osdCapability = osdCapability;
119246
119547
  exports.osdManagerCapability = osdManagerCapability;
119247
119548
  exports.overlayClusterStepSettings = overlayClusterStepSettings;
119549
+ exports.ownedSlice = ownedSlice;
119248
119550
  exports.packagePickerItems = packagePickerItems;
119249
119551
  exports.paintHex = paintHex;
119250
119552
  exports.paletteEntryLabel = paletteEntryLabel;
@@ -119375,6 +119677,7 @@ exports.reducePoints = reducePoints;
119375
119677
  exports.reducerForActive = reducerForActive;
119376
119678
  exports.registerKnownSecret = require_sleep.registerKnownSecret;
119377
119679
  exports.remapCropDetections = remapCropDetections;
119680
+ exports.removeScalarTarget = removeScalarTarget;
119378
119681
  exports.renameAlarmProfile = renameAlarmProfile;
119379
119682
  exports.renderVocabPhrase = renderVocabPhrase;
119380
119683
  exports.replacedFieldKeys = replacedFieldKeys;
@@ -119463,6 +119766,7 @@ exports.runtimeStatePolicyFor = runtimeStatePolicyFor;
119463
119766
  exports.sameDoFamily = sameDoFamily;
119464
119767
  exports.sameHelperBody = sameHelperBody;
119465
119768
  exports.sameRead = sameRead;
119769
+ exports.scalarTargetCount = scalarTargetCount;
119466
119770
  exports.sceneMonitorCapability = sceneMonitorCapability;
119467
119771
  exports.scheduleForSendTimes = scheduleForSendTimes;
119468
119772
  exports.schemaDeclaresAnyField = require_sleep.schemaDeclaresAnyField;
@@ -119578,6 +119882,7 @@ exports.systemEventSummarySplitOf = systemEventSummarySplitOf;
119578
119882
  exports.systemFamilyOfKind = systemFamilyOfKind;
119579
119883
  exports.systemRuleKindOf = systemRuleKindOf;
119580
119884
  exports.tamperCapability = tamperCapability;
119885
+ exports.targetFeature = targetFeature;
119581
119886
  exports.taskLogEntrySchema = taskLogEntrySchema;
119582
119887
  exports.taskPhaseSchema = taskPhaseSchema;
119583
119888
  exports.taskTargetSchema = taskTargetSchema;