@camstack/types 1.2.420 → 1.2.422

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.
Files changed (50) hide show
  1. package/dist/addon.js +2 -2
  2. package/dist/addon.mjs +2 -2
  3. package/dist/capabilities/composer.cap.d.ts +129 -21
  4. package/dist/capabilities/core-blocks.cap.d.ts +929 -151
  5. package/dist/capabilities/index.d.ts +3 -1
  6. package/dist/capabilities/meter.cap.d.ts +53 -0
  7. package/dist/capabilities/power-meter.cap.d.ts +1 -1
  8. package/dist/capabilities/running-state.cap.d.ts +1 -1
  9. package/dist/client.js +12 -1
  10. package/dist/client.mjs +12 -1
  11. package/dist/composition/composition-report.d.ts +45 -0
  12. package/dist/composition/composition.d.ts +196 -7
  13. package/dist/composition/helpers/appliance.d.ts +28 -0
  14. package/dist/composition/helpers/compile-history.d.ts +13 -0
  15. package/dist/composition/helpers/compile.d.ts +3 -2
  16. package/dist/composition/helpers/energy.d.ts +8 -0
  17. package/dist/composition/helpers/history-math.d.ts +39 -0
  18. package/dist/composition/helpers/history-window.d.ts +71 -0
  19. package/dist/composition/helpers/index.d.ts +7 -2
  20. package/dist/composition/helpers/save.d.ts +1 -1
  21. package/dist/composition/helpers/source-pick.d.ts +2 -0
  22. package/dist/composition/helpers/spec.d.ts +39 -6
  23. package/dist/{composition-re1aezX9.js → composition-CPRAP41h.js} +924 -7
  24. package/dist/{composition-OhpuespA.mjs → composition-CpETZ4HL.mjs} +679 -8
  25. package/dist/device/appliance-export.d.ts +25 -0
  26. package/dist/device/cap-vocabulary/entries/sensors.d.ts +1 -1
  27. package/dist/device/cap-vocabulary/types.d.ts +10 -0
  28. package/dist/device/device-type.d.ts +8 -2
  29. package/dist/{err-msg-BXKzRBwg.mjs → err-msg-DIorGYeC.mjs} +7 -1
  30. package/dist/{err-msg-BhVbr0NX.js → err-msg-U7lLUMNz.js} +7 -1
  31. package/dist/generated/addon-api.d.ts +14 -0
  32. package/dist/generated/addon-cap-facts.d.ts +1 -1
  33. package/dist/generated/cap-status-types.d.ts +3 -1
  34. package/dist/generated/capability-router-map.d.ts +5 -2
  35. package/dist/generated/customize-catalog.d.ts +2 -2
  36. package/dist/generated/device-local-state.d.ts +3 -0
  37. package/dist/generated/device-proxy.d.ts +3 -0
  38. package/dist/generated/device-scoped-caps.d.ts +1 -1
  39. package/dist/generated/history-catalog.d.ts +1 -1
  40. package/dist/generated/method-access-map.d.ts +1 -1
  41. package/dist/generated/method-device-selectors.d.ts +1 -1
  42. package/dist/generated/runtime-state-durability.d.ts +1 -1
  43. package/dist/index.d.ts +1 -0
  44. package/dist/index.js +1063 -562
  45. package/dist/index.mjs +1013 -563
  46. package/dist/node.js +2 -2
  47. package/dist/node.mjs +2 -2
  48. package/dist/{sleep-bykKrTgu.mjs → sleep-0sD_LHLI.mjs} +10 -1
  49. package/dist/{sleep-YJ6FVsUu.js → sleep-CEKGW7A5.js} +10 -1
  50. package/package.json +1 -1
@@ -198,6 +198,7 @@ export { type DeviceCodeSeverity, DeviceCodeSeveritySchema, type ILawnMowerContr
198
198
  export { type AdvertisedLocalPort, type ConnectionEndpoint, type HubAddressBook, type HubAddresses, HubAddressRoleSchema, type HubAddressRow, type HubAddressSnapshot, type ILocalNetworkProvider, type LocalInterface, localNetworkCapability, type NotificationEndpoint, } from './local-network.cap.js';
199
199
  export { type ILockControlProvider, type LockControlStatus, LockControlStatusSchema, type LockState, LockStateSchema, lockControlCapability, } from './lock-control.cap.js';
200
200
  export { type MaskGridDims, MaskGridDimsSchema, type MaskGridShape, MaskGridShapeSchema, type MaskLineShape, MaskLineShapeSchema, type MaskPoint, MaskPointSchema, type MaskPolygonShape, MaskPolygonShapeSchema, type MaskPolygonVertices, MaskPolygonVerticesSchema, type MaskRectShape, MaskRectShapeSchema, type MaskShape, type MaskShapeKind, MaskShapeKindSchema, MaskShapeSchema, } from './mask-shape.js';
201
+ export { type MeterStatus, MeterStatusSchema, meterCapability, type IMeterProvider, } from './meter.cap.js';
201
202
  export { type IMediaPlayerProvider, type MediaInfo, type MediaPlayerRepeat, MediaPlayerRepeatSchema, type MediaPlayerState, MediaPlayerStateSchema, type MediaPlayerStatus, MediaPlayerStatusSchema, mediaPlayerCapability, } from './media-player.cap.js';
202
203
  export { type IMeshNetworkProvider, type MeshEndpoint, type MeshPeer, MeshPeerSchema, type MeshStatus, MeshStatusSchema, meshNetworkCapability, } from './mesh-network.cap.js';
203
204
  export { type IMotionProvider, MOTION_CLOSE_AFTER_MS, MOTION_SPAN_TIMEOUT_MS, type MotionOnMotionChangedData, MotionOnMotionChangedDataSchema, type MotionStatus, MotionStatusSchema, motionCapability, } from './motion.cap.js';
@@ -357,6 +358,7 @@ import type { logChannelsCapability } from './log-channels.cap.js';
357
358
  import type { logDestinationCapability } from './log-destination.cap.js';
358
359
  import type { loginMethodCapability } from './login-method.cap.js';
359
360
  import type { mediaPlayerCapability } from './media-player.cap.js';
361
+ import type { meterCapability } from './meter.cap.js';
360
362
  import type { meshNetworkCapability } from './mesh-network.cap.js';
361
363
  import type { metricsProviderCapability } from './metrics-provider.cap.js';
362
364
  import type { modelConvertCapability } from './model-convert.cap.js';
@@ -441,6 +443,6 @@ import type { trainingProviderCapability } from './training-provider.cap.js';
441
443
  import type { zoneAnalyticsCapability } from './zone-analytics.cap.js';
442
444
  import type { zoneRulesCapability } from './zone-rules.cap.js';
443
445
  import type { zonesCapability } from './zones.cap.js';
444
- type AnyCapability = typeof streamSignalsCapability | typeof addonSettingsCapability | typeof alertsCapability | typeof storageCapability | typeof storageMigrationCapability | typeof storageProviderCapability | typeof storageEvictableCapability | typeof storageOccupancyCapability | typeof filesystemBrowseCapability | typeof backupCapability | typeof terminalSessionCapability | typeof settingsStoreCapability | typeof dataStoreProviderCapability | typeof databaseSnapshotCapability | typeof storageAdminCapability | typeof recordsCapability | typeof recordEntriesCapability | typeof deviceHistoryCapability | typeof keychainCapability | typeof keychainAdminCapability | typeof deviceCredentialsCapability | typeof nodeCertificatesCapability | typeof logChannelsCapability | typeof logDestinationCapability | typeof loadContributionCapability | typeof failureContributionCapability | typeof deviceRemovalHookCapability | typeof adminUiCapability | typeof viewerUiCapability | typeof ssoBridgeCapability | typeof userPasskeysCapability | typeof smtpProviderCapability | typeof mqttBrokerCapability | typeof brokerCapability | typeof deviceAdoptionCapability | typeof deviceAdminLinkCapability | typeof deviceExportCapability | typeof addonPagesCapability | typeof addonPagesSourceCapability | typeof addonWidgetsCapability | typeof addonWidgetsSourceCapability | typeof customModelRegistryCapability | typeof modelDistributorCapability | typeof modelConvertCapability | typeof addonRoutesCapability | typeof streamBrokerCapability | typeof decoderCapability | typeof webrtcSessionCapability | typeof cameraStreamsCapability | typeof calendarSourceCapability | typeof calendarsCapability | typeof motionDetectionCapability | typeof pipelineExecutorCapability | typeof detectionPipelineCapability | typeof cameraPipelineConfigCapability | typeof pipelineRunnerCapability | typeof pipelineOrchestratorCapability | typeof audioAnalyzerCapability | typeof audioAnalysisCapability | typeof audioCodecCapability | typeof embeddingEncoderCapability | typeof vectorStoreCapability | typeof deviceProviderCapability | typeof deviceManagerCapability | typeof deviceStateCapability | typeof authProviderCapability | typeof loginMethodCapability | typeof networkAccessCapability | typeof turnProviderCapability | typeof snapshotCapability | typeof llmCapability | typeof llmRuntimeCapability | typeof notificationOutputCapability | typeof composerCapability | typeof coreBlocksCapability | typeof notificationRulesCapability | typeof pipelineAnalyticsCapability | typeof metricsProviderCapability | typeof ptzCapability | typeof ptzAutotrackCapability | typeof navigationCapability | typeof consumablesCapability | typeof connectionTestCapability | typeof runningStateCapability | typeof rebootCapability | typeof deviceDiscoveryCapability | typeof brightnessCapability | typeof colorCapability | typeof climateControlCapability | typeof coverCapability | typeof valveCapability | typeof humidifierCapability | typeof waterHeaterCapability | typeof weatherCapability | typeof imageCapability | typeof lockControlCapability | typeof vacuumControlCapability | typeof petFeederCapability | typeof lawnMowerControlCapability | typeof fanControlCapability | typeof controlCapability | typeof notifierCapability | typeof mediaPlayerCapability | typeof alarmPanelCapability | typeof presenceCapability | typeof scriptRunnerCapability | typeof automationControlCapability | typeof motionTriggerCapability | typeof zonesCapability | typeof zoneRulesCapability | typeof trainingCapability | typeof trainingProviderCapability | typeof zoneAnalyticsCapability | typeof audioMetricsCapability | typeof motionCapability | typeof contactCapability | typeof floodCapability | typeof smokeCapability | typeof carbonMonoxideCapability | typeof gasCapability | typeof groupCommandsCapability | typeof groupStatusCapability | typeof tamperCapability | typeof vibrationCapability | typeof connectivityCapability | typeof binaryCapability | typeof temperatureSensorCapability | typeof heatingValveCapability | typeof humiditySensorCapability | typeof ambientLightSensorCapability | typeof pressureSensorCapability | typeof powerMeterCapability | typeof airQualitySensorCapability | typeof numericSensorCapability | typeof enumSensorCapability | typeof recordingCapability | typeof recordingArchiveCapability | typeof recordingExportCapability | typeof recordingSignalCapability | typeof deviceOpsCapability | typeof displayPaletteCapability | typeof platformProbeCapability | typeof localNetworkCapability | typeof meshNetworkCapability | typeof userManagementCapability | typeof systemCapability | typeof networkQualityCapability | typeof toastCapability | typeof nodesCapability | typeof serverManagementCapability | typeof integrationsCapability | typeof addonsCapability | typeof oauthIntegrationCapability | typeof oidcConnectionsCapability | typeof streamParamsCapability | typeof streamCatalogCapability | typeof motionZonesCapability | typeof cameraGridLayoutCapability | typeof sceneMonitorCapability | typeof privacyMaskCapability | typeof dayNightCapability | typeof recordingOnboardCapability | typeof imageSettingsCapability | typeof osdCapability | typeof osdManagerCapability | typeof accessoriesCapability | typeof batteryCapability | typeof networkLinkCapability | typeof buttonCapability | typeof cameraCredentialsCapability | typeof deviceStatusCapability | typeof doorbellCapability | typeof eventEmitterCapability | typeof faceGalleryCapability | typeof featureProbeCapability | typeof intercomCapability | typeof nativeObjectDetectionCapability | typeof plateGalleryCapability | typeof switchCapability | typeof updateCapability | typeof videoclipsCapability | typeof deviceExtensionCapability | typeof dishwasherCapability;
446
+ type AnyCapability = typeof streamSignalsCapability | typeof addonSettingsCapability | typeof alertsCapability | typeof storageCapability | typeof storageMigrationCapability | typeof storageProviderCapability | typeof storageEvictableCapability | typeof storageOccupancyCapability | typeof filesystemBrowseCapability | typeof backupCapability | typeof terminalSessionCapability | typeof settingsStoreCapability | typeof dataStoreProviderCapability | typeof databaseSnapshotCapability | typeof storageAdminCapability | typeof recordsCapability | typeof recordEntriesCapability | typeof deviceHistoryCapability | typeof keychainCapability | typeof keychainAdminCapability | typeof deviceCredentialsCapability | typeof nodeCertificatesCapability | typeof logChannelsCapability | typeof logDestinationCapability | typeof loadContributionCapability | typeof failureContributionCapability | typeof deviceRemovalHookCapability | typeof adminUiCapability | typeof viewerUiCapability | typeof ssoBridgeCapability | typeof userPasskeysCapability | typeof smtpProviderCapability | typeof mqttBrokerCapability | typeof brokerCapability | typeof deviceAdoptionCapability | typeof deviceAdminLinkCapability | typeof deviceExportCapability | typeof addonPagesCapability | typeof addonPagesSourceCapability | typeof addonWidgetsCapability | typeof addonWidgetsSourceCapability | typeof customModelRegistryCapability | typeof modelDistributorCapability | typeof modelConvertCapability | typeof addonRoutesCapability | typeof streamBrokerCapability | typeof decoderCapability | typeof webrtcSessionCapability | typeof cameraStreamsCapability | typeof calendarSourceCapability | typeof calendarsCapability | typeof motionDetectionCapability | typeof pipelineExecutorCapability | typeof detectionPipelineCapability | typeof cameraPipelineConfigCapability | typeof pipelineRunnerCapability | typeof pipelineOrchestratorCapability | typeof audioAnalyzerCapability | typeof audioAnalysisCapability | typeof audioCodecCapability | typeof embeddingEncoderCapability | typeof vectorStoreCapability | typeof deviceProviderCapability | typeof deviceManagerCapability | typeof deviceStateCapability | typeof authProviderCapability | typeof loginMethodCapability | typeof networkAccessCapability | typeof turnProviderCapability | typeof snapshotCapability | typeof llmCapability | typeof llmRuntimeCapability | typeof notificationOutputCapability | typeof composerCapability | typeof coreBlocksCapability | typeof notificationRulesCapability | typeof pipelineAnalyticsCapability | typeof metricsProviderCapability | typeof ptzCapability | typeof ptzAutotrackCapability | typeof navigationCapability | typeof consumablesCapability | typeof connectionTestCapability | typeof runningStateCapability | typeof rebootCapability | typeof deviceDiscoveryCapability | typeof brightnessCapability | typeof colorCapability | typeof climateControlCapability | typeof coverCapability | typeof valveCapability | typeof humidifierCapability | typeof waterHeaterCapability | typeof weatherCapability | typeof imageCapability | typeof lockControlCapability | typeof vacuumControlCapability | typeof petFeederCapability | typeof lawnMowerControlCapability | typeof fanControlCapability | typeof controlCapability | typeof notifierCapability | typeof mediaPlayerCapability | typeof meterCapability | typeof alarmPanelCapability | typeof presenceCapability | typeof scriptRunnerCapability | typeof automationControlCapability | typeof motionTriggerCapability | typeof zonesCapability | typeof zoneRulesCapability | typeof trainingCapability | typeof trainingProviderCapability | typeof zoneAnalyticsCapability | typeof audioMetricsCapability | typeof motionCapability | typeof contactCapability | typeof floodCapability | typeof smokeCapability | typeof carbonMonoxideCapability | typeof gasCapability | typeof groupCommandsCapability | typeof groupStatusCapability | typeof tamperCapability | typeof vibrationCapability | typeof connectivityCapability | typeof binaryCapability | typeof temperatureSensorCapability | typeof heatingValveCapability | typeof humiditySensorCapability | typeof ambientLightSensorCapability | typeof pressureSensorCapability | typeof powerMeterCapability | typeof airQualitySensorCapability | typeof numericSensorCapability | typeof enumSensorCapability | typeof recordingCapability | typeof recordingArchiveCapability | typeof recordingExportCapability | typeof recordingSignalCapability | typeof deviceOpsCapability | typeof displayPaletteCapability | typeof platformProbeCapability | typeof localNetworkCapability | typeof meshNetworkCapability | typeof userManagementCapability | typeof systemCapability | typeof networkQualityCapability | typeof toastCapability | typeof nodesCapability | typeof serverManagementCapability | typeof integrationsCapability | typeof addonsCapability | typeof oauthIntegrationCapability | typeof oidcConnectionsCapability | typeof streamParamsCapability | typeof streamCatalogCapability | typeof motionZonesCapability | typeof cameraGridLayoutCapability | typeof sceneMonitorCapability | typeof privacyMaskCapability | typeof dayNightCapability | typeof recordingOnboardCapability | typeof imageSettingsCapability | typeof osdCapability | typeof osdManagerCapability | typeof accessoriesCapability | typeof batteryCapability | typeof networkLinkCapability | typeof buttonCapability | typeof cameraCredentialsCapability | typeof deviceStatusCapability | typeof doorbellCapability | typeof eventEmitterCapability | typeof faceGalleryCapability | typeof featureProbeCapability | typeof intercomCapability | typeof nativeObjectDetectionCapability | typeof plateGalleryCapability | typeof switchCapability | typeof updateCapability | typeof videoclipsCapability | typeof deviceExtensionCapability | typeof dishwasherCapability;
445
447
  export type CapabilityName = AnyCapability['name'];
446
448
  export type ITypedReadinessRegistry = IReadinessRegistry<CapabilityName>;
@@ -0,0 +1,53 @@
1
+ import { z } from 'zod';
2
+ import { type InferProvider } from './capability-definition.js';
3
+ import { DeviceType } from '../device/device-type.js';
4
+ /**
5
+ * A monotonic total between resets (D944). Energy uses `power-meter.kwhTotal`
6
+ * so dashboards keep one series; every other instantaneous reading lands here.
7
+ * `value` is the time integral in the source quantity's accumulated base
8
+ * (base-unit seconds, or kWh on the power meter). `null` is a gap, never zero.
9
+ */
10
+ export declare const MeterStatusSchema: z.ZodObject<{
11
+ value: z.ZodNullable<z.ZodNumber>;
12
+ lastFetchedAt: z.ZodNumber;
13
+ }, z.core.$strip>;
14
+ export type MeterStatus = z.infer<typeof MeterStatusSchema>;
15
+ export declare const meterCapability: {
16
+ readonly name: 'meter';
17
+ readonly scope: 'device';
18
+ readonly deviceNative: true;
19
+ readonly mode: 'singleton';
20
+ readonly deviceTypes: readonly [DeviceType.Sensor];
21
+ readonly methods: {};
22
+ readonly status: {
23
+ readonly schema: z.ZodObject<{
24
+ value: z.ZodNullable<z.ZodNumber>;
25
+ lastFetchedAt: z.ZodNumber;
26
+ }, z.core.$strip>;
27
+ readonly kind: 'push';
28
+ };
29
+ readonly runtimeState: z.ZodObject<{
30
+ value: z.ZodNullable<z.ZodNumber>;
31
+ lastFetchedAt: z.ZodNumber;
32
+ }, z.core.$strip>;
33
+ /**
34
+ * Runtime-state durability: **restored** — the total is a cache of the
35
+ * history integral. A restart shows it only until the history pass
36
+ * recomputes the open period; it is not an in-memory buffer.
37
+ *
38
+ * See `RuntimeStateDurability`. Enforced by
39
+ * `scripts/check-runtime-state-durability.ts`.
40
+ */
41
+ readonly durability: 'restored';
42
+ readonly history: {
43
+ readonly fields: {
44
+ readonly value: {
45
+ readonly kind: 'counter';
46
+ readonly deadband: 0.001;
47
+ readonly minIntervalMs: 60000;
48
+ };
49
+ };
50
+ };
51
+ readonly volatileStateFields: readonly ["lastFetchedAt"];
52
+ };
53
+ export type IMeterProvider = InferProvider<typeof meterCapability>;
@@ -31,7 +31,7 @@ export declare const powerMeterCapability: {
31
31
  readonly scope: 'device';
32
32
  readonly deviceNative: true;
33
33
  readonly mode: 'singleton';
34
- readonly deviceTypes: readonly [DeviceType.Sensor];
34
+ readonly deviceTypes: readonly [DeviceType.Sensor, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher];
35
35
  readonly methods: {};
36
36
  readonly status: {
37
37
  readonly schema: z.ZodObject<{
@@ -81,7 +81,7 @@ export declare const runningStateCapability: {
81
81
  readonly cap: 'running-state';
82
82
  readonly stateField: 'running';
83
83
  };
84
- readonly deviceTypes: readonly [DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder];
84
+ readonly deviceTypes: readonly [DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder];
85
85
  readonly apply: 'add';
86
86
  readonly path: 'running';
87
87
  readonly sources: readonly [{
package/dist/client.js CHANGED
@@ -699,8 +699,14 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
699
699
  DeviceType["PetFeeder"] = "pet-feeder";
700
700
  /** Built-in dishwasher — program lifecycle, door / remote-start gates,
701
701
  * salt and rinse-aid levels. Installed with the `dishwasher` cap.
702
- * Sources: native Bosch Home Connect, reusable by similar integrations. */
702
+ * Sources: native Bosch Home Connect, reusable by similar integrations.
703
+ * A plug-built dishwasher carries running-state and power instead. */
703
704
  DeviceType["Dishwasher"] = "dishwasher";
705
+ /** Washing machine. A plug-built one is running while its power stays
706
+ * above a threshold. No program cap — that surface is the dishwasher's. */
707
+ DeviceType["Washer"] = "washer";
708
+ /** Tumble dryer. Same plug-built running surface as {@link Washer}. */
709
+ DeviceType["Dryer"] = "dryer";
704
710
  return DeviceType;
705
711
  }({});
706
712
  zod.z.enum(["new-session", "step-up"]);
@@ -26291,6 +26297,8 @@ var CONTAINER_CHILD_PRIORITY = [
26291
26297
  "fan",
26292
26298
  "vacuum",
26293
26299
  "lawn-mower",
26300
+ "washer",
26301
+ "dryer",
26294
26302
  "dishwasher",
26295
26303
  "light",
26296
26304
  "switch",
@@ -26878,6 +26886,7 @@ function createDeviceProxy(api, binding, opts) {
26878
26886
  playMedia: (input) => dispatch("media-player", "mediaPlayer", "playMedia", "mutation", input),
26879
26887
  getStatus: (input) => dispatch("media-player", "mediaPlayer", "getStatus", "query", input)
26880
26888
  };
26889
+ const meterInterface = { getStatus: (input) => dispatch("meter", "meter", "getStatus", "query", input) };
26881
26890
  const motionInterface = {
26882
26891
  isDetected: (input) => dispatch("motion", "motion", "isDetected", "query", input),
26883
26892
  getStatus: (input) => dispatch("motion", "motion", "getStatus", "query", input)
@@ -27393,6 +27402,7 @@ function createDeviceProxy(api, binding, opts) {
27393
27402
  lawnMowerControl: createSliceHandle(stateSource, binding.deviceId, "lawn-mower-control"),
27394
27403
  lockControl: createSliceHandle(stateSource, binding.deviceId, "lock-control"),
27395
27404
  mediaPlayer: createSliceHandle(stateSource, binding.deviceId, "media-player"),
27405
+ meter: createSliceHandle(stateSource, binding.deviceId, "meter"),
27396
27406
  motion: createSliceHandle(stateSource, binding.deviceId, "motion"),
27397
27407
  motionTrigger: createSliceHandle(stateSource, binding.deviceId, "motion-trigger"),
27398
27408
  motionZones: createSliceHandle(stateSource, binding.deviceId, "motion-zones"),
@@ -27478,6 +27488,7 @@ function createDeviceProxy(api, binding, opts) {
27478
27488
  ...bound("lawn-mower-control") ? { lawnMowerControl: lawnMowerControlInterface } : {},
27479
27489
  ...bound("lock-control") ? { lockControl: lockControlInterface } : {},
27480
27490
  ...bound("media-player") ? { mediaPlayer: mediaPlayerInterface } : {},
27491
+ ...bound("meter") ? { meter: meterInterface } : {},
27481
27492
  ...bound("motion") ? { motion: motionInterface } : {},
27482
27493
  ...bound("motion-detection") ? { motionDetection: motionDetectionInterface } : {},
27483
27494
  ...bound("motion-trigger") ? { motionTrigger: motionTriggerInterface } : {},
package/dist/client.mjs CHANGED
@@ -698,8 +698,14 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
698
698
  DeviceType["PetFeeder"] = "pet-feeder";
699
699
  /** Built-in dishwasher — program lifecycle, door / remote-start gates,
700
700
  * salt and rinse-aid levels. Installed with the `dishwasher` cap.
701
- * Sources: native Bosch Home Connect, reusable by similar integrations. */
701
+ * Sources: native Bosch Home Connect, reusable by similar integrations.
702
+ * A plug-built dishwasher carries running-state and power instead. */
702
703
  DeviceType["Dishwasher"] = "dishwasher";
704
+ /** Washing machine. A plug-built one is running while its power stays
705
+ * above a threshold. No program cap — that surface is the dishwasher's. */
706
+ DeviceType["Washer"] = "washer";
707
+ /** Tumble dryer. Same plug-built running surface as {@link Washer}. */
708
+ DeviceType["Dryer"] = "dryer";
703
709
  return DeviceType;
704
710
  }({});
705
711
  z.enum(["new-session", "step-up"]);
@@ -26290,6 +26296,8 @@ var CONTAINER_CHILD_PRIORITY = [
26290
26296
  "fan",
26291
26297
  "vacuum",
26292
26298
  "lawn-mower",
26299
+ "washer",
26300
+ "dryer",
26293
26301
  "dishwasher",
26294
26302
  "light",
26295
26303
  "switch",
@@ -26877,6 +26885,7 @@ function createDeviceProxy(api, binding, opts) {
26877
26885
  playMedia: (input) => dispatch("media-player", "mediaPlayer", "playMedia", "mutation", input),
26878
26886
  getStatus: (input) => dispatch("media-player", "mediaPlayer", "getStatus", "query", input)
26879
26887
  };
26888
+ const meterInterface = { getStatus: (input) => dispatch("meter", "meter", "getStatus", "query", input) };
26880
26889
  const motionInterface = {
26881
26890
  isDetected: (input) => dispatch("motion", "motion", "isDetected", "query", input),
26882
26891
  getStatus: (input) => dispatch("motion", "motion", "getStatus", "query", input)
@@ -27392,6 +27401,7 @@ function createDeviceProxy(api, binding, opts) {
27392
27401
  lawnMowerControl: createSliceHandle(stateSource, binding.deviceId, "lawn-mower-control"),
27393
27402
  lockControl: createSliceHandle(stateSource, binding.deviceId, "lock-control"),
27394
27403
  mediaPlayer: createSliceHandle(stateSource, binding.deviceId, "media-player"),
27404
+ meter: createSliceHandle(stateSource, binding.deviceId, "meter"),
27395
27405
  motion: createSliceHandle(stateSource, binding.deviceId, "motion"),
27396
27406
  motionTrigger: createSliceHandle(stateSource, binding.deviceId, "motion-trigger"),
27397
27407
  motionZones: createSliceHandle(stateSource, binding.deviceId, "motion-zones"),
@@ -27477,6 +27487,7 @@ function createDeviceProxy(api, binding, opts) {
27477
27487
  ...bound("lawn-mower-control") ? { lawnMowerControl: lawnMowerControlInterface } : {},
27478
27488
  ...bound("lock-control") ? { lockControl: lockControlInterface } : {},
27479
27489
  ...bound("media-player") ? { mediaPlayer: mediaPlayerInterface } : {},
27490
+ ...bound("meter") ? { meter: meterInterface } : {},
27480
27491
  ...bound("motion") ? { motion: motionInterface } : {},
27481
27492
  ...bound("motion-detection") ? { motionDetection: motionDetectionInterface } : {},
27482
27493
  ...bound("motion-trigger") ? { motionTrigger: motionTriggerInterface } : {},
@@ -21,6 +21,7 @@ export declare const CompositionProblemCodeSchema: z.ZodEnum<{
21
21
  "not-item-array": "not-item-array";
22
22
  "not-replaceable": "not-replaceable";
23
23
  "reserved-variant": "reserved-variant";
24
+ retention: "retention";
24
25
  "source-capability-missing": "source-capability-missing";
25
26
  "source-field-unknown": "source-field-unknown";
26
27
  "source-missing": "source-missing";
@@ -52,6 +53,7 @@ export declare const CompositionProblemSchema: z.ZodObject<{
52
53
  "not-item-array": "not-item-array";
53
54
  "not-replaceable": "not-replaceable";
54
55
  "reserved-variant": "reserved-variant";
56
+ retention: "retention";
55
57
  "source-capability-missing": "source-capability-missing";
56
58
  "source-field-unknown": "source-field-unknown";
57
59
  "source-missing": "source-missing";
@@ -192,6 +194,27 @@ export declare const CompositionFieldPlanSchema: z.ZodObject<{
192
194
  offline: "offline";
193
195
  omit: "omit";
194
196
  }>;
197
+ }, z.core.$strip>, z.ZodObject<{
198
+ kind: z.ZodLiteral<"series">;
199
+ read: z.ZodObject<{
200
+ source: z.ZodObject<{
201
+ addonId: z.ZodString;
202
+ stableId: z.ZodString;
203
+ }, z.core.$strip>;
204
+ cap: z.ZodString;
205
+ fieldPath: z.ZodString;
206
+ }, z.core.$strip>;
207
+ publish: z.ZodEnum<{
208
+ excluded: "excluded";
209
+ included: "included";
210
+ total: "total";
211
+ value: "value";
212
+ }>;
213
+ empty: z.ZodEnum<{
214
+ null: "null";
215
+ offline: "offline";
216
+ omit: "omit";
217
+ }>;
195
218
  }, z.core.$strip>], "kind">;
196
219
  reads: z.ZodArray<z.ZodObject<{
197
220
  source: z.ZodObject<{
@@ -249,6 +272,7 @@ export declare const CompositionValidationSchema: z.ZodObject<{
249
272
  "not-item-array": "not-item-array";
250
273
  "not-replaceable": "not-replaceable";
251
274
  "reserved-variant": "reserved-variant";
275
+ retention: "retention";
252
276
  "source-capability-missing": "source-capability-missing";
253
277
  "source-field-unknown": "source-field-unknown";
254
278
  "source-missing": "source-missing";
@@ -348,6 +372,27 @@ export declare const CompositionValidationSchema: z.ZodObject<{
348
372
  offline: "offline";
349
373
  omit: "omit";
350
374
  }>;
375
+ }, z.core.$strip>, z.ZodObject<{
376
+ kind: z.ZodLiteral<"series">;
377
+ read: z.ZodObject<{
378
+ source: z.ZodObject<{
379
+ addonId: z.ZodString;
380
+ stableId: z.ZodString;
381
+ }, z.core.$strip>;
382
+ cap: z.ZodString;
383
+ fieldPath: z.ZodString;
384
+ }, z.core.$strip>;
385
+ publish: z.ZodEnum<{
386
+ excluded: "excluded";
387
+ included: "included";
388
+ total: "total";
389
+ value: "value";
390
+ }>;
391
+ empty: z.ZodEnum<{
392
+ null: "null";
393
+ offline: "offline";
394
+ omit: "omit";
395
+ }>;
351
396
  }, z.core.$strip>], "kind">;
352
397
  reads: z.ZodArray<z.ZodObject<{
353
398
  source: z.ZodObject<{
@@ -141,6 +141,33 @@ export declare const CompositionAggregateSourceSchema: z.ZodObject<{
141
141
  }>;
142
142
  }, z.core.$strip>;
143
143
  export type CompositionAggregateSource = z.infer<typeof CompositionAggregateSourceSchema>;
144
+ /**
145
+ * `series`: a statistics or integral field. The composer writes it from a
146
+ * history query. The live pass does not recompute it (D944).
147
+ */
148
+ export declare const CompositionSeriesSourceSchema: z.ZodObject<{
149
+ kind: z.ZodLiteral<"series">;
150
+ read: z.ZodObject<{
151
+ source: z.ZodObject<{
152
+ addonId: z.ZodString;
153
+ stableId: z.ZodString;
154
+ }, z.core.$strip>;
155
+ cap: z.ZodString;
156
+ fieldPath: z.ZodString;
157
+ }, z.core.$strip>;
158
+ publish: z.ZodEnum<{
159
+ excluded: "excluded";
160
+ included: "included";
161
+ total: "total";
162
+ value: "value";
163
+ }>;
164
+ empty: z.ZodEnum<{
165
+ null: "null";
166
+ offline: "offline";
167
+ omit: "omit";
168
+ }>;
169
+ }, z.core.$strip>;
170
+ export type CompositionSeriesSource = z.infer<typeof CompositionSeriesSourceSchema>;
144
171
  export declare const CompositionFieldSourceSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
145
172
  source: z.ZodObject<{
146
173
  addonId: z.ZodString;
@@ -197,6 +224,27 @@ export declare const CompositionFieldSourceSchema: z.ZodDiscriminatedUnion<[z.Zo
197
224
  offline: "offline";
198
225
  omit: "omit";
199
226
  }>;
227
+ }, z.core.$strip>, z.ZodObject<{
228
+ kind: z.ZodLiteral<"series">;
229
+ read: z.ZodObject<{
230
+ source: z.ZodObject<{
231
+ addonId: z.ZodString;
232
+ stableId: z.ZodString;
233
+ }, z.core.$strip>;
234
+ cap: z.ZodString;
235
+ fieldPath: z.ZodString;
236
+ }, z.core.$strip>;
237
+ publish: z.ZodEnum<{
238
+ excluded: "excluded";
239
+ included: "included";
240
+ total: "total";
241
+ value: "value";
242
+ }>;
243
+ empty: z.ZodEnum<{
244
+ null: "null";
245
+ offline: "offline";
246
+ omit: "omit";
247
+ }>;
200
248
  }, z.core.$strip>], "kind">;
201
249
  export type CompositionFieldSource = z.infer<typeof CompositionFieldSourceSchema>;
202
250
  /** `forward`: RESERVED for slice 3. Argument mapping arrives there as an additive optional `args`. */
@@ -291,6 +339,27 @@ export declare const CompositionItemEntrySchema: z.ZodObject<{
291
339
  offline: "offline";
292
340
  omit: "omit";
293
341
  }>;
342
+ }, z.core.$strip>, z.ZodObject<{
343
+ kind: z.ZodLiteral<"series">;
344
+ read: z.ZodObject<{
345
+ source: z.ZodObject<{
346
+ addonId: z.ZodString;
347
+ stableId: z.ZodString;
348
+ }, z.core.$strip>;
349
+ cap: z.ZodString;
350
+ fieldPath: z.ZodString;
351
+ }, z.core.$strip>;
352
+ publish: z.ZodEnum<{
353
+ excluded: "excluded";
354
+ included: "included";
355
+ total: "total";
356
+ value: "value";
357
+ }>;
358
+ empty: z.ZodEnum<{
359
+ null: "null";
360
+ offline: "offline";
361
+ omit: "omit";
362
+ }>;
294
363
  }, z.core.$strip>], "kind">>;
295
364
  }, z.core.$strip>;
296
365
  export type CompositionItemEntry = z.infer<typeof CompositionItemEntrySchema>;
@@ -354,6 +423,27 @@ export declare const CompositionFieldsFeatureSchema: z.ZodObject<{
354
423
  offline: "offline";
355
424
  omit: "omit";
356
425
  }>;
426
+ }, z.core.$strip>, z.ZodObject<{
427
+ kind: z.ZodLiteral<"series">;
428
+ read: z.ZodObject<{
429
+ source: z.ZodObject<{
430
+ addonId: z.ZodString;
431
+ stableId: z.ZodString;
432
+ }, z.core.$strip>;
433
+ cap: z.ZodString;
434
+ fieldPath: z.ZodString;
435
+ }, z.core.$strip>;
436
+ publish: z.ZodEnum<{
437
+ excluded: "excluded";
438
+ included: "included";
439
+ total: "total";
440
+ value: "value";
441
+ }>;
442
+ empty: z.ZodEnum<{
443
+ null: "null";
444
+ offline: "offline";
445
+ omit: "omit";
446
+ }>;
357
447
  }, z.core.$strip>], "kind">>;
358
448
  items: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
359
449
  label: z.ZodString;
@@ -413,6 +503,27 @@ export declare const CompositionFieldsFeatureSchema: z.ZodObject<{
413
503
  offline: "offline";
414
504
  omit: "omit";
415
505
  }>;
506
+ }, z.core.$strip>, z.ZodObject<{
507
+ kind: z.ZodLiteral<"series">;
508
+ read: z.ZodObject<{
509
+ source: z.ZodObject<{
510
+ addonId: z.ZodString;
511
+ stableId: z.ZodString;
512
+ }, z.core.$strip>;
513
+ cap: z.ZodString;
514
+ fieldPath: z.ZodString;
515
+ }, z.core.$strip>;
516
+ publish: z.ZodEnum<{
517
+ excluded: "excluded";
518
+ included: "included";
519
+ total: "total";
520
+ value: "value";
521
+ }>;
522
+ empty: z.ZodEnum<{
523
+ null: "null";
524
+ offline: "offline";
525
+ omit: "omit";
526
+ }>;
416
527
  }, z.core.$strip>], "kind">>;
417
528
  }, z.core.$strip>>>;
418
529
  commands: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -500,6 +611,27 @@ export declare const CompositionFeatureSchema: z.ZodDiscriminatedUnion<[z.ZodObj
500
611
  offline: "offline";
501
612
  omit: "omit";
502
613
  }>;
614
+ }, z.core.$strip>, z.ZodObject<{
615
+ kind: z.ZodLiteral<"series">;
616
+ read: z.ZodObject<{
617
+ source: z.ZodObject<{
618
+ addonId: z.ZodString;
619
+ stableId: z.ZodString;
620
+ }, z.core.$strip>;
621
+ cap: z.ZodString;
622
+ fieldPath: z.ZodString;
623
+ }, z.core.$strip>;
624
+ publish: z.ZodEnum<{
625
+ excluded: "excluded";
626
+ included: "included";
627
+ total: "total";
628
+ value: "value";
629
+ }>;
630
+ empty: z.ZodEnum<{
631
+ null: "null";
632
+ offline: "offline";
633
+ omit: "omit";
634
+ }>;
503
635
  }, z.core.$strip>], "kind">>;
504
636
  items: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
505
637
  label: z.ZodString;
@@ -559,6 +691,27 @@ export declare const CompositionFeatureSchema: z.ZodDiscriminatedUnion<[z.ZodObj
559
691
  offline: "offline";
560
692
  omit: "omit";
561
693
  }>;
694
+ }, z.core.$strip>, z.ZodObject<{
695
+ kind: z.ZodLiteral<"series">;
696
+ read: z.ZodObject<{
697
+ source: z.ZodObject<{
698
+ addonId: z.ZodString;
699
+ stableId: z.ZodString;
700
+ }, z.core.$strip>;
701
+ cap: z.ZodString;
702
+ fieldPath: z.ZodString;
703
+ }, z.core.$strip>;
704
+ publish: z.ZodEnum<{
705
+ excluded: "excluded";
706
+ included: "included";
707
+ total: "total";
708
+ value: "value";
709
+ }>;
710
+ empty: z.ZodEnum<{
711
+ null: "null";
712
+ offline: "offline";
713
+ omit: "omit";
714
+ }>;
562
715
  }, z.core.$strip>], "kind">>;
563
716
  }, z.core.$strip>>>;
564
717
  commands: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -688,6 +841,27 @@ export declare const CompositionSchema: z.ZodObject<{
688
841
  offline: "offline";
689
842
  omit: "omit";
690
843
  }>;
844
+ }, z.core.$strip>, z.ZodObject<{
845
+ kind: z.ZodLiteral<"series">;
846
+ read: z.ZodObject<{
847
+ source: z.ZodObject<{
848
+ addonId: z.ZodString;
849
+ stableId: z.ZodString;
850
+ }, z.core.$strip>;
851
+ cap: z.ZodString;
852
+ fieldPath: z.ZodString;
853
+ }, z.core.$strip>;
854
+ publish: z.ZodEnum<{
855
+ excluded: "excluded";
856
+ included: "included";
857
+ total: "total";
858
+ value: "value";
859
+ }>;
860
+ empty: z.ZodEnum<{
861
+ null: "null";
862
+ offline: "offline";
863
+ omit: "omit";
864
+ }>;
691
865
  }, z.core.$strip>], "kind">>;
692
866
  items: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
693
867
  label: z.ZodString;
@@ -747,6 +921,27 @@ export declare const CompositionSchema: z.ZodObject<{
747
921
  offline: "offline";
748
922
  omit: "omit";
749
923
  }>;
924
+ }, z.core.$strip>, z.ZodObject<{
925
+ kind: z.ZodLiteral<"series">;
926
+ read: z.ZodObject<{
927
+ source: z.ZodObject<{
928
+ addonId: z.ZodString;
929
+ stableId: z.ZodString;
930
+ }, z.core.$strip>;
931
+ cap: z.ZodString;
932
+ fieldPath: z.ZodString;
933
+ }, z.core.$strip>;
934
+ publish: z.ZodEnum<{
935
+ excluded: "excluded";
936
+ included: "included";
937
+ total: "total";
938
+ value: "value";
939
+ }>;
940
+ empty: z.ZodEnum<{
941
+ null: "null";
942
+ offline: "offline";
943
+ omit: "omit";
944
+ }>;
750
945
  }, z.core.$strip>], "kind">>;
751
946
  }, z.core.$strip>>>;
752
947
  commands: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -770,13 +965,7 @@ export declare const CompositionSchema: z.ZodObject<{
770
965
  stableId: z.ZodString;
771
966
  }, z.core.$strip>;
772
967
  }, z.core.$strip>], "kind">>;
773
- helper: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
774
- kind: z.ZodLiteral<'group'>;
775
- templateId: typeof import("./index.js").GroupTemplateIdSchema;
776
- aggregate: typeof import("./index.js").AggregateReducerSchema;
777
- members: z.ZodArray<typeof import("./index.js").HelperMemberSchema>;
778
- active: z.ZodOptional<typeof import("./index.js").ActiveCriterionSchema>;
779
- }, z.core.$strip>], "kind">>;
968
+ helper: z.ZodOptional<z.ZodType<import("./index.js").HelperSpec, unknown, z.core.$ZodTypeInternals<import("./index.js").HelperSpec, unknown>>>;
780
969
  }, z.core.$strip>;
781
970
  export type Composition = z.infer<typeof CompositionSchema>;
782
971
  export declare function compositionSourceKey(ref: CompositionSourceRef): string;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * One power reading becomes a washer, dryer or dishwasher (D944 helper).
3
+ *
4
+ * Standby of the control board is under 5 W; a motor or a heater is far
5
+ * above that, so 5 W is the line. A door lock or a short pump spike is not
6
+ * a cycle, so running starts only after 30 s above the line.
7
+ *
8
+ * A wash, dry or dishwasher pause (soak, heat-wait, heater off between
9
+ * bursts) lasts several minutes. Ending the cycle on the first dip would
10
+ * report "finished" in the middle of the program, so the stop dwell is
11
+ * 10 minutes on every type. The number is stored per type so one machine
12
+ * can move later without moving the others.
13
+ */
14
+ import { DeviceType } from '../../device/device-type.js';
15
+ import type { SourcePickRequest } from './source-pick.js';
16
+ export declare const APPLIANCE_TEMPLATE_ID: 'appliance';
17
+ export declare const APPLIANCE_KINDS: readonly ['washer', 'dryer', 'dishwasher'];
18
+ export type ApplianceKind = (typeof APPLIANCE_KINDS)[number];
19
+ export interface ApplianceDefaults {
20
+ readonly thresholdWatts: number;
21
+ readonly startDwellMs: number;
22
+ readonly stopDwellMs: number;
23
+ }
24
+ export declare const APPLIANCE_DEFAULTS: Readonly<Record<ApplianceKind, ApplianceDefaults>>;
25
+ export declare function applianceDeviceType(kind: ApplianceKind): DeviceType;
26
+ export declare function isApplianceKind(value: string): value is ApplianceKind;
27
+ /** The member step: one watts reading, from a sensor or from the plug itself. */
28
+ export declare function sourcePickForAppliance(): SourcePickRequest;
@@ -0,0 +1,13 @@
1
+ import type { CompositionProblem } from '../composition-report.js';
2
+ import type { SeriesKind } from './history-math.js';
3
+ import { type HistoryRetention } from './history-window.js';
4
+ import type { HelperMember, IntegralHelperSpec, StatisticHelperSpec } from './spec.js';
5
+ export declare function declaredSeriesKind(member: HelperMember): SeriesKind | 'enum' | null;
6
+ export declare function statisticDraft(spec: StatisticHelperSpec, retention?: HistoryRetention): {
7
+ readonly draft: unknown;
8
+ readonly problems: readonly CompositionProblem[];
9
+ };
10
+ export declare function integralDraft(spec: IntegralHelperSpec, retention?: HistoryRetention): {
11
+ readonly draft: unknown;
12
+ readonly problems: readonly CompositionProblem[];
13
+ };
@@ -5,6 +5,7 @@
5
5
  import { DeviceType } from '../../device/device-type.js';
6
6
  import { type Composition } from '../composition.js';
7
7
  import type { CompositionProblem } from '../composition-report.js';
8
+ import { type HistoryRetention } from './history-window.js';
8
9
  import { type HelperSpec } from './spec.js';
9
10
  export interface HelperCompiled {
10
11
  readonly ok: true;
@@ -15,8 +16,8 @@ export interface HelperRefused {
15
16
  readonly problems: readonly CompositionProblem[];
16
17
  }
17
18
  export type HelperCompileResult = HelperCompiled | HelperRefused;
18
- /** Compile a group template to a new-device composition. Refusals are named. */
19
- export declare function compileHelper(spec: HelperSpec): HelperCompileResult;
19
+ /** Compile a helper template to a new-device composition. Refusals are named. */
20
+ export declare function compileHelper(spec: HelperSpec, retention?: HistoryRetention): HelperCompileResult;
20
21
  /** The built body, ignoring `helper`, so a save can demand one writer. */
21
22
  export declare function sameHelperBody(stored: Composition, compiled: Composition): boolean;
22
23
  export declare function templateDeviceType(spec: HelperSpec): DeviceType | null;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Watts integrated over time, in kWh (D944).
3
+ *
4
+ * 1 kWh = 1 000 W × 3 600 000 ms. The history energy series uses the same
5
+ * factor (`tw_sum / 3.6e9`), so a chart and an integral helper cannot diverge.
6
+ */
7
+ export declare const KWH_PER_WATT_MS: number;
8
+ export declare function wattMillisecondsToKwh(wattMilliseconds: number): number;