@camstack/addon-post-analysis 1.2.643 → 1.2.644

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 (16) hide show
  1. package/CHANGELOG.md +10 -1
  2. package/README.md +20 -12
  3. package/dist/{clip-model-registry-lKeBMKlT.js → clip-model-registry-Bu2ZxGpm.js} +87 -13
  4. package/dist/{clip-model-registry-DdgT3gdf.mjs → clip-model-registry-CnFDRU_E.mjs} +87 -13
  5. package/dist/embedding-encoder/index.js +1 -1
  6. package/dist/embedding-encoder/index.mjs +1 -1
  7. package/dist/pipeline-analytics/_stub.js +2 -2
  8. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-B6X8TAQP.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-CN1G5ocH.mjs} +3 -3
  9. package/dist/pipeline-analytics/{_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BIjXlrFH.mjs → _virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B8Q_nFhl.mjs} +1 -1
  10. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CVItuOhm.mjs +26 -0
  11. package/dist/pipeline-analytics/{hostInit-CDPfOUWf.mjs → hostInit-OkB37BMo.mjs} +3 -3
  12. package/dist/pipeline-analytics/index.js +1 -1
  13. package/dist/pipeline-analytics/index.mjs +1 -1
  14. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  15. package/package.json +1 -1
  16. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js--XkysBjS.mjs +0 -26
package/CHANGELOG.md CHANGED
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.2.644] - 2026-10-27
11
+
12
+ ### Changed
13
+
14
+ - Rebuilt against updated dependencies.
15
+
16
+ ## [1.2.643] - 2026-10-27
17
+
10
18
  ### Added
11
19
 
12
- - Package README and changelog, included in the published files list.
20
+ - Post-Analysis: Post-Analysis bundle — enrichment, embedding-encoder, pipeline-analytics. Multi-entry npm package shipping addons that consume pipeline output.
21
+ - Provides the addons Embedding Encoder, Pipeline Analytics.
package/README.md CHANGED
@@ -1,22 +1,30 @@
1
- # @camstack/addon-post-analysis
1
+ # Post-Analysis
2
2
 
3
- Post-Analysis bundle — enrichment, embedding-encoder, pipeline-analytics. Multi-entry npm package shipping addons that consume pipeline output.
3
+ Post-Analysis bundle — enrichment, embedding-encoder, pipeline-analytics. Multi-entry npm package shipping addons that consume pipeline output. Enrichment, embedding encoder, and pipeline analytics — consumers of pipeline output.
4
4
 
5
- ## What it does
5
+ <!-- readme:generated:start (derived from the manifest; edit outside this block) -->
6
6
 
7
- - **Embedding Encoder** (`embedding-encoder`): ONNX-Runtime image-embedding encoder. Produces semantic vectors from detection crops for similarity search + scene-state tracking.
8
- - Node placement: `any-node`.
7
+ Package `@camstack/addon-post-analysis` on npm.
8
+
9
+ ## What it provides
10
+
11
+ - **Embedding Encoder** (`embedding-encoder`): ONNX-Runtime image-embedding encoder. Produces semantic vectors from detection crops for similarity search + scene-state tracking. Category: analytics.
9
12
  - Capabilities: `embedding-encoder`.
10
- - **Pipeline Analytics** (`pipeline-analytics`): Zone analytics + audio metrics aggregator. Consumes pipeline events to surface per-camera zone counters and audio-level histograms.
11
- - Node placement: `any-node`.
13
+ - **Pipeline Analytics** (`pipeline-analytics`): Zone analytics + audio metrics aggregator. Consumes pipeline events to surface per-camera zone counters and audio-level histograms. Category: analytics.
12
14
  - Capabilities: `device-removal-hook`, `pipeline-analytics`, `notification-rules`, `zone-analytics`, `audio-metrics`, `addon-widgets-source`, `face-gallery`, `plate-gallery`, `scene-monitor`, `failure-contribution`, `storage-occupancy`.
13
15
 
14
- ## Settings
16
+ ## Requirements
15
17
 
16
- Settings this addon exposes are edited from System → Addons → this addon → Settings when they apply to the whole cluster, and from the device page when they belong to one device. A password field is stored in the keychain.
18
+ - Placement: any-node.
19
+ - A CamStack hub. An agent is used only where the placement above allows it.
17
20
 
18
- ## Requirements
21
+ ## Documentation
22
+
23
+ - [docs/architecture/notifications.md](https://github.com/camstack/server/blob/main/docs/architecture/notifications.md)
24
+ - [docs/architecture/post-analysis.md](https://github.com/camstack/server/blob/main/docs/architecture/post-analysis.md)
25
+ - [docs/architecture/cloud-training.md](https://github.com/camstack/server/blob/main/docs/architecture/cloud-training.md)
26
+ - [docs/architecture/osd-manager.md](https://github.com/camstack/server/blob/main/docs/architecture/osd-manager.md)
19
27
 
20
- - Peer packages already on the node: `@camstack/types`, `react`, `react-dom`.
21
- - A CamStack hub. An agent is used only when the placement above allows it.
28
+ See [CHANGELOG.md](./CHANGELOG.md) for what changed in each version.
22
29
 
30
+ <!-- readme:generated:end -->
@@ -18609,7 +18609,22 @@ var BrokerProviderInfoSchema = object({
18609
18609
  */
18610
18610
  interactiveConnectPath: string().min(1).optional(),
18611
18611
  /** Relative hub path to disconnect the linked account (same popup pattern). */
18612
- interactiveDisconnectPath: string().min(1).optional()
18612
+ interactiveDisconnectPath: string().min(1).optional(),
18613
+ /**
18614
+ * The kind signs in through a server-held interactive session instead of
18615
+ * (or before) typed credentials. `basePath` is a hub-relative route set
18616
+ * served by the owning addon (`/addon/<id>/...`) speaking the sign-in
18617
+ * contract: `POST {basePath}/start` (body: the form's settings) answers
18618
+ * `{ sessionId, loginUrl }`; `GET {basePath}/status?sessionId=` answers
18619
+ * `{ phase: 'starting' | 'awaiting-login' | 'captured' | 'error' |
18620
+ * 'cancelled', loginUrl, error }`; `POST {basePath}/commit`
18621
+ * (`{ sessionId, name, brokerId? }`) stores the credentials on a new or
18622
+ * existing broker and answers `{ brokerId }`; `POST {basePath}/cancel`
18623
+ * (`{ sessionId }`) drops the session. The dialog that edits a broker
18624
+ * offers it as the default path; the fields the session fills are
18625
+ * marked `filledBySignIn` in the kind's settings schema.
18626
+ */
18627
+ signIn: object({ basePath: string().min(1) }).optional()
18613
18628
  }))
18614
18629
  });
18615
18630
  var ListInputSchema = object({
@@ -45668,7 +45683,7 @@ var NetworkAccessStatusSchema = object({
45668
45683
  });
45669
45684
  /**
45670
45685
  * Optional, richer endpoint shape returned by providers that expose
45671
- * MORE than one ingress concurrently (Tailscale Ingress with mixed
45686
+ * MORE than one ingress concurrently (Tailscale Funnel with mixed
45672
45687
  * serve+funnel rules, future ngrok multi-tunnel, …). Each entry carries
45673
45688
  * the originating provider config (mode + sourcePort) so the
45674
45689
  * orchestrator UI can label rows distinctly. Providers that expose only
@@ -60972,7 +60987,8 @@ var BATTERY_DEVICE_TYPES = [
60972
60987
  DeviceType.Switch,
60973
60988
  DeviceType.PetFeeder,
60974
60989
  DeviceType.Container,
60975
- DeviceType.Thermostat
60990
+ DeviceType.Thermostat,
60991
+ DeviceType.EventEmitter
60976
60992
  ];
60977
60993
  /** Generic Customize target for the percentage reading (D936). */
60978
60994
  var batteryCustomize = {
@@ -67990,9 +68006,9 @@ var PowerMeterStatusSchema = object({
67990
68006
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
67991
68007
  kwhTotal: number().optional().meta(readingMeta("energy", { label: "Energy" })),
67992
68008
  /** Voltage in volts. */
67993
- volts: number().optional().meta(readingMeta("voltage")),
68009
+ volts: number().optional().meta(readingMeta("voltage", { label: "Voltage" })),
67994
68010
  /** Current in amperes. */
67995
- amps: number().optional().meta(readingMeta("current")),
68011
+ amps: number().optional().meta(readingMeta("current", { label: "Current" })),
67996
68012
  /** Apparent power in volt-amperes. */
67997
68013
  va: number().optional().meta(readingMeta("apparent-power")),
67998
68014
  /** Power factor (0..1) if reported. */
@@ -68000,17 +68016,74 @@ var PowerMeterStatusSchema = object({
68000
68016
  /** Ms epoch when the slice was last updated. */
68001
68017
  lastFetchedAt: number()
68002
68018
  });
68019
+ /**
68020
+ * Loads that draw metered mains power (D951). The reading is a feature of the
68021
+ * device itself — a plug, a lamp, a fan, an air conditioner, a boiler, a
68022
+ * vacuum dock — not a separate sensor beside it. A `Sensor` stays: a clamp
68023
+ * meter or a standalone energy monitor IS the device. Cover, lock, valve,
68024
+ * camera and the like are left out: their draw is not what anyone meters.
68025
+ */
68026
+ var POWER_METER_DEVICE_TYPES = [
68027
+ DeviceType.Sensor,
68028
+ DeviceType.Switch,
68029
+ DeviceType.Light,
68030
+ DeviceType.Fan,
68031
+ DeviceType.Climate,
68032
+ DeviceType.Thermostat,
68033
+ DeviceType.Humidifier,
68034
+ DeviceType.WaterHeater,
68035
+ DeviceType.MediaPlayer,
68036
+ DeviceType.Washer,
68037
+ DeviceType.Dryer,
68038
+ DeviceType.Dishwasher,
68039
+ DeviceType.Vacuum,
68040
+ DeviceType.LawnMower,
68041
+ DeviceType.PetFeeder
68042
+ ];
68043
+ /** Everything but a bare `Sensor`: a sensor that takes its reading from another sensor adds nothing. */
68044
+ var POWER_METER_CUSTOMIZE_DEVICE_TYPES = POWER_METER_DEVICE_TYPES.filter((type) => type !== DeviceType.Sensor);
68045
+ /** One scalar target per reading; each is sourced from a device of its own (D951). */
68046
+ function powerTarget(id, unit) {
68047
+ return {
68048
+ id,
68049
+ cardinality: "scalar",
68050
+ vocabulary: {
68051
+ cap: "power-meter",
68052
+ stateField: id
68053
+ },
68054
+ deviceTypes: POWER_METER_CUSTOMIZE_DEVICE_TYPES,
68055
+ apply: "add",
68056
+ path: id,
68057
+ sources: [{
68058
+ kind: "numeric",
68059
+ requiredUnit: unit,
68060
+ transforms: [{ kind: "identity" }]
68061
+ }],
68062
+ companions: [{
68063
+ kind: "clock",
68064
+ path: "lastFetchedAt",
68065
+ when: "always"
68066
+ }],
68067
+ sourceReport: { status: "assignment-status" },
68068
+ advancedExpression: true
68069
+ };
68070
+ }
68071
+ /** "Power and energy" extension: watts, energy, voltage and current from other devices (D951). */
68072
+ var powerMeterCustomize = {
68073
+ version: 1,
68074
+ targets: [
68075
+ powerTarget("watts", "W"),
68076
+ powerTarget("kwhTotal", "kWh"),
68077
+ powerTarget("volts", "V"),
68078
+ powerTarget("amps", "A")
68079
+ ]
68080
+ };
68003
68081
  var powerMeterCapability = {
68004
68082
  name: "power-meter",
68005
68083
  scope: "device",
68006
68084
  deviceNative: true,
68007
68085
  mode: "singleton",
68008
- deviceTypes: [
68009
- DeviceType.Sensor,
68010
- DeviceType.Washer,
68011
- DeviceType.Dryer,
68012
- DeviceType.Dishwasher
68013
- ],
68086
+ deviceTypes: POWER_METER_DEVICE_TYPES,
68014
68087
  methods: {},
68015
68088
  status: {
68016
68089
  schema: PowerMeterStatusSchema,
@@ -68067,7 +68140,8 @@ var powerMeterCapability = {
68067
68140
  } },
68068
68141
  /** Clock fields: written, but excluded from the compare that decides
68069
68142
  * whether persisting is worth a SQLite commit. */
68070
- volatileStateFields: ["lastFetchedAt"]
68143
+ volatileStateFields: ["lastFetchedAt"],
68144
+ customize: powerMeterCustomize
68071
68145
  };
68072
68146
  /**
68073
68147
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
@@ -73505,7 +73579,7 @@ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" })
73505
73579
  });
73506
73580
  DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
73507
73581
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
73508
- DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer, DeviceType.Camera, DeviceType.Camera, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
73582
+ DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer, DeviceType.Camera, DeviceType.Camera, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
73509
73583
  String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
73510
73584
  DeviceRole.BinarySensor, DeviceRole.MotionSensor;
73511
73585
  new Set(CAP_NAMES);
@@ -18578,7 +18578,22 @@ var BrokerProviderInfoSchema = object({
18578
18578
  */
18579
18579
  interactiveConnectPath: string().min(1).optional(),
18580
18580
  /** Relative hub path to disconnect the linked account (same popup pattern). */
18581
- interactiveDisconnectPath: string().min(1).optional()
18581
+ interactiveDisconnectPath: string().min(1).optional(),
18582
+ /**
18583
+ * The kind signs in through a server-held interactive session instead of
18584
+ * (or before) typed credentials. `basePath` is a hub-relative route set
18585
+ * served by the owning addon (`/addon/<id>/...`) speaking the sign-in
18586
+ * contract: `POST {basePath}/start` (body: the form's settings) answers
18587
+ * `{ sessionId, loginUrl }`; `GET {basePath}/status?sessionId=` answers
18588
+ * `{ phase: 'starting' | 'awaiting-login' | 'captured' | 'error' |
18589
+ * 'cancelled', loginUrl, error }`; `POST {basePath}/commit`
18590
+ * (`{ sessionId, name, brokerId? }`) stores the credentials on a new or
18591
+ * existing broker and answers `{ brokerId }`; `POST {basePath}/cancel`
18592
+ * (`{ sessionId }`) drops the session. The dialog that edits a broker
18593
+ * offers it as the default path; the fields the session fills are
18594
+ * marked `filledBySignIn` in the kind's settings schema.
18595
+ */
18596
+ signIn: object({ basePath: string().min(1) }).optional()
18582
18597
  }))
18583
18598
  });
18584
18599
  var ListInputSchema = object({
@@ -45637,7 +45652,7 @@ var NetworkAccessStatusSchema = object({
45637
45652
  });
45638
45653
  /**
45639
45654
  * Optional, richer endpoint shape returned by providers that expose
45640
- * MORE than one ingress concurrently (Tailscale Ingress with mixed
45655
+ * MORE than one ingress concurrently (Tailscale Funnel with mixed
45641
45656
  * serve+funnel rules, future ngrok multi-tunnel, …). Each entry carries
45642
45657
  * the originating provider config (mode + sourcePort) so the
45643
45658
  * orchestrator UI can label rows distinctly. Providers that expose only
@@ -60941,7 +60956,8 @@ var BATTERY_DEVICE_TYPES = [
60941
60956
  DeviceType.Switch,
60942
60957
  DeviceType.PetFeeder,
60943
60958
  DeviceType.Container,
60944
- DeviceType.Thermostat
60959
+ DeviceType.Thermostat,
60960
+ DeviceType.EventEmitter
60945
60961
  ];
60946
60962
  /** Generic Customize target for the percentage reading (D936). */
60947
60963
  var batteryCustomize = {
@@ -67959,9 +67975,9 @@ var PowerMeterStatusSchema = object({
67959
67975
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
67960
67976
  kwhTotal: number().optional().meta(readingMeta("energy", { label: "Energy" })),
67961
67977
  /** Voltage in volts. */
67962
- volts: number().optional().meta(readingMeta("voltage")),
67978
+ volts: number().optional().meta(readingMeta("voltage", { label: "Voltage" })),
67963
67979
  /** Current in amperes. */
67964
- amps: number().optional().meta(readingMeta("current")),
67980
+ amps: number().optional().meta(readingMeta("current", { label: "Current" })),
67965
67981
  /** Apparent power in volt-amperes. */
67966
67982
  va: number().optional().meta(readingMeta("apparent-power")),
67967
67983
  /** Power factor (0..1) if reported. */
@@ -67969,17 +67985,74 @@ var PowerMeterStatusSchema = object({
67969
67985
  /** Ms epoch when the slice was last updated. */
67970
67986
  lastFetchedAt: number()
67971
67987
  });
67988
+ /**
67989
+ * Loads that draw metered mains power (D951). The reading is a feature of the
67990
+ * device itself — a plug, a lamp, a fan, an air conditioner, a boiler, a
67991
+ * vacuum dock — not a separate sensor beside it. A `Sensor` stays: a clamp
67992
+ * meter or a standalone energy monitor IS the device. Cover, lock, valve,
67993
+ * camera and the like are left out: their draw is not what anyone meters.
67994
+ */
67995
+ var POWER_METER_DEVICE_TYPES = [
67996
+ DeviceType.Sensor,
67997
+ DeviceType.Switch,
67998
+ DeviceType.Light,
67999
+ DeviceType.Fan,
68000
+ DeviceType.Climate,
68001
+ DeviceType.Thermostat,
68002
+ DeviceType.Humidifier,
68003
+ DeviceType.WaterHeater,
68004
+ DeviceType.MediaPlayer,
68005
+ DeviceType.Washer,
68006
+ DeviceType.Dryer,
68007
+ DeviceType.Dishwasher,
68008
+ DeviceType.Vacuum,
68009
+ DeviceType.LawnMower,
68010
+ DeviceType.PetFeeder
68011
+ ];
68012
+ /** Everything but a bare `Sensor`: a sensor that takes its reading from another sensor adds nothing. */
68013
+ var POWER_METER_CUSTOMIZE_DEVICE_TYPES = POWER_METER_DEVICE_TYPES.filter((type) => type !== DeviceType.Sensor);
68014
+ /** One scalar target per reading; each is sourced from a device of its own (D951). */
68015
+ function powerTarget(id, unit) {
68016
+ return {
68017
+ id,
68018
+ cardinality: "scalar",
68019
+ vocabulary: {
68020
+ cap: "power-meter",
68021
+ stateField: id
68022
+ },
68023
+ deviceTypes: POWER_METER_CUSTOMIZE_DEVICE_TYPES,
68024
+ apply: "add",
68025
+ path: id,
68026
+ sources: [{
68027
+ kind: "numeric",
68028
+ requiredUnit: unit,
68029
+ transforms: [{ kind: "identity" }]
68030
+ }],
68031
+ companions: [{
68032
+ kind: "clock",
68033
+ path: "lastFetchedAt",
68034
+ when: "always"
68035
+ }],
68036
+ sourceReport: { status: "assignment-status" },
68037
+ advancedExpression: true
68038
+ };
68039
+ }
68040
+ /** "Power and energy" extension: watts, energy, voltage and current from other devices (D951). */
68041
+ var powerMeterCustomize = {
68042
+ version: 1,
68043
+ targets: [
68044
+ powerTarget("watts", "W"),
68045
+ powerTarget("kwhTotal", "kWh"),
68046
+ powerTarget("volts", "V"),
68047
+ powerTarget("amps", "A")
68048
+ ]
68049
+ };
67972
68050
  var powerMeterCapability = {
67973
68051
  name: "power-meter",
67974
68052
  scope: "device",
67975
68053
  deviceNative: true,
67976
68054
  mode: "singleton",
67977
- deviceTypes: [
67978
- DeviceType.Sensor,
67979
- DeviceType.Washer,
67980
- DeviceType.Dryer,
67981
- DeviceType.Dishwasher
67982
- ],
68055
+ deviceTypes: POWER_METER_DEVICE_TYPES,
67983
68056
  methods: {},
67984
68057
  status: {
67985
68058
  schema: PowerMeterStatusSchema,
@@ -68036,7 +68109,8 @@ var powerMeterCapability = {
68036
68109
  } },
68037
68110
  /** Clock fields: written, but excluded from the compare that decides
68038
68111
  * whether persisting is worth a SQLite commit. */
68039
- volatileStateFields: ["lastFetchedAt"]
68112
+ volatileStateFields: ["lastFetchedAt"],
68113
+ customize: powerMeterCustomize
68040
68114
  };
68041
68115
  /**
68042
68116
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
@@ -73474,7 +73548,7 @@ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" })
73474
73548
  });
73475
73549
  DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
73476
73550
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
73477
- DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer, DeviceType.Camera, DeviceType.Camera, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
73551
+ DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer, DeviceType.Camera, DeviceType.Camera, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
73478
73552
  String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
73479
73553
  DeviceRole.BinarySensor, DeviceRole.MotionSensor;
73480
73554
  new Set(CAP_NAMES);
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_clip_model_registry = require("../clip-model-registry-lKeBMKlT.js");
5
+ const require_clip_model_registry = require("../clip-model-registry-Bu2ZxGpm.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_clip_model_registry.__toESM(node_fs);
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Qi as BaseAddon, _r as embeddingRequirementsUnavailableError, a as CLIP_EMBEDDING_STEP_ID, da as normalizeNodeId, gi as resolvePoolMemoryPolicy, gr as embeddingRequirementsFailedError, i as CLIP_TEXT_MODELS, l as resolveClusterModelPin, mr as embeddingModelFailedError, n as DEFAULT_CLIP_MODEL, ni as parseProcStatus, pr as embeddingEncoderCapability, r as CLIP_IMAGE_MODELS, t as BUILTIN_CLIP_MODELS, tn as PoolMemoryWatchdog } from "../clip-model-registry-DdgT3gdf.mjs";
1
+ import { Qi as BaseAddon, _r as embeddingRequirementsUnavailableError, a as CLIP_EMBEDDING_STEP_ID, da as normalizeNodeId, gi as resolvePoolMemoryPolicy, gr as embeddingRequirementsFailedError, i as CLIP_TEXT_MODELS, l as resolveClusterModelPin, mr as embeddingModelFailedError, n as DEFAULT_CLIP_MODEL, ni as parseProcStatus, pr as embeddingEncoderCapability, r as CLIP_IMAGE_MODELS, t as BUILTIN_CLIP_MODELS, tn as PoolMemoryWatchdog } from "../clip-model-registry-CnFDRU_E.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs from "node:fs";
4
4
  import * as path$1 from "node:path";
@@ -1,8 +1,8 @@
1
1
  import { a as e, i as t, n, o as r, r as i, t as a } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare__react__loadShare__.js-Cx9AsA5q.mjs";
2
2
  import { t as o } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-B3Wx5J80.mjs";
3
- import { a as s, c, d as l, f as u, i as d, l as f, m as p, n as m, o as h, p as g, r as _, s as v, t as y, u as b } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js--XkysBjS.mjs";
3
+ import { a as s, c, d as l, f as u, i as d, l as f, m as p, n as m, o as h, p as g, r as _, s as v, t as y, u as b } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CVItuOhm.mjs";
4
4
  import { n as x, t as S } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-CkwmHEi0.mjs";
5
- import { t as C } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BIjXlrFH.mjs";
5
+ import { t as C } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B8Q_nFhl.mjs";
6
6
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
7
7
  var w = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), T = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), E = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), D = (e) => {
8
8
  let t = E(e);
@@ -3,7 +3,7 @@ import "./dist-CYZr2fwk.mjs";
3
3
  var e = {
4
4
  "@camstack/sdk": {
5
5
  name: "@camstack/sdk",
6
- version: "1.2.153",
6
+ version: "1.2.154",
7
7
  scope: ["default"],
8
8
  loaded: !1,
9
9
  from: "addon_pipeline_analytics_widgets",
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.424",
21
+ version: "1.2.428",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_analytics_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.2.335",
36
+ version: "1.2.337",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_pipeline_analytics_widgets",