@enyo-energy/energy-app-sdk 0.0.166 → 0.0.167

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 (73) hide show
  1. package/dist/cjs/energy-app-appliance-type.enum.cjs +1 -0
  2. package/dist/cjs/energy-app-appliance-type.enum.d.cts +2 -1
  3. package/dist/cjs/implementations/appliances/appliance-manager.cjs +2 -0
  4. package/dist/cjs/implementations/appliances/appliance-manager.d.cts +5 -1
  5. package/dist/cjs/implementations/appliances/in-memory-appliance-manager.cjs +17 -4
  6. package/dist/cjs/index.cjs +1 -0
  7. package/dist/cjs/index.d.cts +1 -0
  8. package/dist/cjs/types/enyo-appliance.cjs +1 -0
  9. package/dist/cjs/types/enyo-appliance.d.cts +5 -1
  10. package/dist/cjs/types/enyo-data-bus-value.cjs +1 -0
  11. package/dist/cjs/types/enyo-data-bus-value.d.cts +17 -0
  12. package/dist/cjs/types/enyo-heating-rod-appliance.cjs +24 -0
  13. package/dist/cjs/types/enyo-heating-rod-appliance.d.cts +37 -0
  14. package/dist/cjs/version.cjs +1 -1
  15. package/dist/cjs/version.d.cts +1 -1
  16. package/dist/energy-app-appliance-type.enum.d.ts +2 -1
  17. package/dist/energy-app-appliance-type.enum.js +1 -0
  18. package/dist/implementations/appliances/appliance-manager.d.ts +5 -1
  19. package/dist/implementations/appliances/appliance-manager.js +2 -0
  20. package/dist/implementations/appliances/in-memory-appliance-manager.js +17 -4
  21. package/dist/index.d.ts +1 -0
  22. package/dist/index.js +1 -0
  23. package/dist/types/enyo-appliance.d.ts +5 -1
  24. package/dist/types/enyo-appliance.js +1 -0
  25. package/dist/types/enyo-data-bus-value.d.ts +17 -0
  26. package/dist/types/enyo-data-bus-value.js +1 -0
  27. package/dist/types/enyo-heating-rod-appliance.d.ts +37 -0
  28. package/dist/types/enyo-heating-rod-appliance.js +21 -0
  29. package/dist/version.d.ts +1 -1
  30. package/dist/version.js +1 -1
  31. package/package.json +1 -1
  32. package/dist/cjs/implementations/modbus/EnergyAppModbusBattery.cjs +0 -388
  33. package/dist/cjs/implementations/modbus/EnergyAppModbusBattery.d.cts +0 -59
  34. package/dist/cjs/implementations/modbus/EnergyAppModbusInverter.cjs +0 -348
  35. package/dist/cjs/implementations/modbus/EnergyAppModbusInverter.d.cts +0 -56
  36. package/dist/cjs/implementations/modbus/EnergyAppModbusMeter.cjs +0 -199
  37. package/dist/cjs/implementations/modbus/EnergyAppModbusMeter.d.cts +0 -26
  38. package/dist/cjs/implementations/modbus/sunspec/sunspec-devices.cjs +0 -342
  39. package/dist/cjs/implementations/modbus/sunspec/sunspec-devices.d.cts +0 -95
  40. package/dist/cjs/implementations/modbus/sunspec/sunspec-modbus-client.cjs +0 -433
  41. package/dist/cjs/implementations/modbus/sunspec/sunspec-modbus-client.d.cts +0 -171
  42. package/dist/cjs/implementations/udp/EnergyAppUdpServer.cjs +0 -174
  43. package/dist/cjs/implementations/udp/EnergyAppUdpServer.d.cts +0 -42
  44. package/dist/cjs/packages/energy-app-electricity-prices.cjs +0 -2
  45. package/dist/cjs/packages/energy-app-electricity-prices.d.cts +0 -74
  46. package/dist/cjs/types/enyo-electricity-prices.cjs +0 -2
  47. package/dist/cjs/types/enyo-electricity-prices.d.cts +0 -65
  48. package/dist/cjs/types/enyo-energy-tariff.cjs +0 -2
  49. package/dist/cjs/types/enyo-energy-tariff.d.cts +0 -64
  50. package/dist/cjs/types/enyo-storage.cjs +0 -2
  51. package/dist/cjs/types/enyo-storage.d.cts +0 -4
  52. package/dist/implementations/appliances/demo-appliance-manager.d.ts +0 -118
  53. package/dist/implementations/appliances/demo-appliance-manager.js +0 -277
  54. package/dist/implementations/modbus/EnergyAppModbusBattery.d.ts +0 -59
  55. package/dist/implementations/modbus/EnergyAppModbusBattery.js +0 -384
  56. package/dist/implementations/modbus/EnergyAppModbusInverter.d.ts +0 -56
  57. package/dist/implementations/modbus/EnergyAppModbusInverter.js +0 -344
  58. package/dist/implementations/modbus/EnergyAppModbusMeter.d.ts +0 -26
  59. package/dist/implementations/modbus/EnergyAppModbusMeter.js +0 -195
  60. package/dist/implementations/modbus/sunspec/sunspec-devices.d.ts +0 -95
  61. package/dist/implementations/modbus/sunspec/sunspec-devices.js +0 -335
  62. package/dist/implementations/modbus/sunspec/sunspec-modbus-client.d.ts +0 -171
  63. package/dist/implementations/modbus/sunspec/sunspec-modbus-client.js +0 -429
  64. package/dist/implementations/udp/EnergyAppUdpServer.d.ts +0 -42
  65. package/dist/implementations/udp/EnergyAppUdpServer.js +0 -169
  66. package/dist/packages/energy-app-electricity-prices.d.ts +0 -74
  67. package/dist/packages/energy-app-electricity-prices.js +0 -1
  68. package/dist/types/enyo-electricity-prices.d.ts +0 -65
  69. package/dist/types/enyo-electricity-prices.js +0 -1
  70. package/dist/types/enyo-energy-tariff.d.ts +0 -64
  71. package/dist/types/enyo-energy-tariff.js +0 -1
  72. package/dist/types/enyo-storage.d.ts +0 -4
  73. package/dist/types/enyo-storage.js +0 -1
@@ -20,4 +20,5 @@ var EnergyAppApplianceTypeEnum;
20
20
  EnergyAppApplianceTypeEnum["Oven"] = "oven";
21
21
  EnergyAppApplianceTypeEnum["Freezer"] = "freezer";
22
22
  EnergyAppApplianceTypeEnum["AirConditioning"] = "air-conditioning";
23
+ EnergyAppApplianceTypeEnum["HeatingRod"] = "heating-rod";
23
24
  })(EnergyAppApplianceTypeEnum || (exports.EnergyAppApplianceTypeEnum = EnergyAppApplianceTypeEnum = {}));
@@ -15,5 +15,6 @@ export declare enum EnergyAppApplianceTypeEnum {
15
15
  Dryer = "dryer",
16
16
  Oven = "oven",
17
17
  Freezer = "freezer",
18
- AirConditioning = "air-conditioning"
18
+ AirConditioning = "air-conditioning",
19
+ HeatingRod = "heating-rod"
19
20
  }
@@ -59,6 +59,7 @@ const MERGEABLE_METADATA_KEYS = [
59
59
  'meter',
60
60
  'temperatureSensor',
61
61
  'airConditioning',
62
+ 'heatingRod',
62
63
  ];
63
64
  /**
64
65
  * Manages appliances in the energy system with configurable identification strategies.
@@ -207,6 +208,7 @@ class ApplianceManager {
207
208
  inverter: appliance.inverter,
208
209
  temperatureSensor: appliance.temperatureSensor,
209
210
  airConditioning: appliance.airConditioning,
211
+ heatingRod: appliance.heatingRod,
210
212
  // Conditionally spread the two optional top-level fields that are NOT
211
213
  // covered by MERGEABLE_METADATA_KEYS. If they were always materialized
212
214
  // as explicit keys, an omitted (undefined) value would clobber the
@@ -8,6 +8,7 @@ import type { EnyoInverterApplianceMetadata } from "../../types/enyo-inverter-ap
8
8
  import type { EnyoMeterAppliance } from "../../types/enyo-meter-appliance.cjs";
9
9
  import type { EnyoTemperatureSensorApplianceMetadata } from "../../types/enyo-temperature-sensor-appliance.cjs";
10
10
  import type { EnyoAirConditioningApplianceMetadata } from "../../types/enyo-air-conditioning-appliance.cjs";
11
+ import type { EnyoHeatingRodApplianceMetadata } from "../../types/enyo-heating-rod-appliance.cjs";
11
12
  import { IdentifierStrategy } from "./identifier-strategies.cjs";
12
13
  /**
13
14
  * Thrown when {@link ApplianceManager.createOrUpdateAppliance} is called with
@@ -59,6 +60,7 @@ export interface ApplianceConfig {
59
60
  battery?: EnyoBatteryApplianceMetadata;
60
61
  temperatureSensor?: EnyoTemperatureSensorApplianceMetadata;
61
62
  airConditioning?: EnyoAirConditioningApplianceMetadata;
63
+ heatingRod?: EnyoHeatingRodApplianceMetadata;
62
64
  availableFeatures?: EnyoApplianceAvailableFeaturesEnum[];
63
65
  /**
64
66
  * Optional identifier of the cloud-deployed energy app package that manages
@@ -140,7 +142,7 @@ export declare class ApplianceManager {
140
142
  * @param update The partial update data to merge
141
143
  * @returns The merged appliance data (without `id`)
142
144
  */
143
- private mergeApplianceData;
145
+ protected mergeApplianceData(existing: EnyoAppliance, update: Partial<Omit<PartialEnyoAppliance, 'id'>>): Omit<EnyoAppliance, 'id'>;
144
146
  /**
145
147
  * Creates a new ApplianceManager instance.
146
148
  *
@@ -418,6 +420,8 @@ export interface PartialEnyoAppliance {
418
420
  temperatureSensor?: Partial<EnyoTemperatureSensorApplianceMetadata>;
419
421
  /** Optional Metadata of the Appliance if of type AirConditioning */
420
422
  airConditioning?: Partial<EnyoAirConditioningApplianceMetadata>;
423
+ /** Optional Metadata of the Appliance if of type HeatingRod */
424
+ heatingRod?: Partial<EnyoHeatingRodApplianceMetadata>;
421
425
  /** Optional custom name for the appliance, defined by the user */
422
426
  customName?: string;
423
427
  /**
@@ -52,10 +52,12 @@ class InMemoryApplianceManager extends appliance_manager_js_1.ApplianceManager {
52
52
  enyo_appliance_js_1.EnyoApplianceStateEnum.Connected,
53
53
  ...appliance.metadata
54
54
  };
55
- // Build appliance data
56
- const applianceId = existingAppliance?.id || (0, node_crypto_1.randomUUID)();
57
- const applianceData = {
58
- id: applianceId,
55
+ // Build the incoming appliance data covering every ApplianceConfig field.
56
+ // The two optional top-level fields that are NOT shallow-merged by
57
+ // mergeApplianceData (`cloudPackageId`, `availableFeatures`) are only
58
+ // materialized when provided so an omitted value cannot clobber the stored
59
+ // one during an update; pass an explicit value (e.g. `[]`) to clear them.
60
+ const newApplianceData = {
59
61
  name: appliance.name,
60
62
  type: appliance.type,
61
63
  networkDeviceIds,
@@ -66,7 +68,18 @@ class InMemoryApplianceManager extends appliance_manager_js_1.ApplianceManager {
66
68
  battery: appliance.battery,
67
69
  charger: appliance.charger,
68
70
  inverter: appliance.inverter,
71
+ temperatureSensor: appliance.temperatureSensor,
72
+ airConditioning: appliance.airConditioning,
73
+ heatingRod: appliance.heatingRod,
74
+ ...(appliance.cloudPackageId !== undefined && { cloudPackageId: appliance.cloudPackageId }),
75
+ ...(appliance.availableFeatures !== undefined && { availableFeatures: appliance.availableFeatures }),
69
76
  };
77
+ // On update, merge onto the stored appliance so type-specific metadata and
78
+ // top-level fields that were not supplied in this call are preserved.
79
+ const applianceId = existingAppliance?.id || (0, node_crypto_1.randomUUID)();
80
+ const applianceData = existingAppliance
81
+ ? { ...this.mergeApplianceData(existingAppliance, newApplianceData), id: applianceId }
82
+ : { id: applianceId, ...newApplianceData };
70
83
  // Save to memory store
71
84
  this.memoryStore.set(applianceId, applianceData);
72
85
  // Store network devices if provided
@@ -74,6 +74,7 @@ __exportStar(require("./packages/energy-app-grid-connection-point.cjs"), exports
74
74
  __exportStar(require("./types/enyo-configuration-manager.cjs"), exports);
75
75
  __exportStar(require("./packages/energy-app-configuration-manager.cjs"), exports);
76
76
  __exportStar(require("./types/enyo-air-conditioning-appliance.cjs"), exports);
77
+ __exportStar(require("./types/enyo-heating-rod-appliance.cjs"), exports);
77
78
  __exportStar(require("./types/enyo-onboarding.cjs"), exports);
78
79
  __exportStar(require("./packages/energy-app-onboarding.cjs"), exports);
79
80
  __exportStar(require("./types/enyo-retry-manager.cjs"), exports);
@@ -58,6 +58,7 @@ export * from './packages/energy-app-grid-connection-point.cjs';
58
58
  export * from './types/enyo-configuration-manager.cjs';
59
59
  export * from './packages/energy-app-configuration-manager.cjs';
60
60
  export * from './types/enyo-air-conditioning-appliance.cjs';
61
+ export * from './types/enyo-heating-rod-appliance.cjs';
61
62
  export * from './types/enyo-onboarding.cjs';
62
63
  export * from './packages/energy-app-onboarding.cjs';
63
64
  export * from './types/enyo-retry-manager.cjs';
@@ -10,6 +10,7 @@ var EnyoApplianceTypeEnum;
10
10
  EnyoApplianceTypeEnum["Heatpump"] = "Heatpump";
11
11
  EnyoApplianceTypeEnum["AirConditioning"] = "AirConditioning";
12
12
  EnyoApplianceTypeEnum["TemperatureSensor"] = "TemperatureSensor";
13
+ EnyoApplianceTypeEnum["HeatingRod"] = "HeatingRod";
13
14
  })(EnyoApplianceTypeEnum || (exports.EnyoApplianceTypeEnum = EnyoApplianceTypeEnum = {}));
14
15
  var EnyoApplianceStateEnum;
15
16
  (function (EnyoApplianceStateEnum) {
@@ -6,6 +6,7 @@ import { EnyoInverterApplianceMetadata } from "./enyo-inverter-appliance.cjs";
6
6
  import { EnyoMeterAppliance } from "./enyo-meter-appliance.cjs";
7
7
  import { EnyoTemperatureSensorApplianceMetadata } from "./enyo-temperature-sensor-appliance.cjs";
8
8
  import { EnyoAirConditioningApplianceMetadata } from "./enyo-air-conditioning-appliance.cjs";
9
+ import { EnyoHeatingRodApplianceMetadata } from "./enyo-heating-rod-appliance.cjs";
9
10
  export declare enum EnyoApplianceTypeEnum {
10
11
  Inverter = "Inverter",
11
12
  Charger = "Charger",
@@ -13,7 +14,8 @@ export declare enum EnyoApplianceTypeEnum {
13
14
  Meter = "Meter",
14
15
  Heatpump = "Heatpump",
15
16
  AirConditioning = "AirConditioning",
16
- TemperatureSensor = "TemperatureSensor"
17
+ TemperatureSensor = "TemperatureSensor",
18
+ HeatingRod = "HeatingRod"
17
19
  }
18
20
  export interface EnyoApplianceName {
19
21
  language: EnergyAppPackageLanguage;
@@ -247,6 +249,8 @@ export interface EnyoAppliance {
247
249
  temperatureSensor?: EnyoTemperatureSensorApplianceMetadata;
248
250
  /** Optional Metadata of the Appliance if of type AirConditioning */
249
251
  airConditioning?: EnyoAirConditioningApplianceMetadata;
252
+ /** Optional Metadata of the Appliance if of type HeatingRod */
253
+ heatingRod?: EnyoHeatingRodApplianceMetadata;
250
254
  /** Optional custom name for the appliance, defined by the user */
251
255
  customName?: string;
252
256
  /**
@@ -219,6 +219,7 @@ var EnyoDataBusMessageEnum;
219
219
  EnyoDataBusMessageEnum["ClearChargingProfilesV1"] = "ClearChargingProfilesV1";
220
220
  EnyoDataBusMessageEnum["HeatpumpOverheatingV1"] = "HeatpumpOverheatingV1";
221
221
  EnyoDataBusMessageEnum["HeatpumpAvailablePowerAnnouncementV1"] = "HeatpumpAvailablePowerAnnouncementV1";
222
+ EnyoDataBusMessageEnum["HeatingRodAvailablePowerAnnouncementV1"] = "HeatingRodAvailablePowerAnnouncementV1";
222
223
  EnyoDataBusMessageEnum["AirConditioningValuesUpdateV1"] = "AirConditioningValuesUpdateV1";
223
224
  EnyoDataBusMessageEnum["AirConditioningTemperaturesUpdateV1"] = "AirConditioningTemperaturesUpdateV1";
224
225
  EnyoDataBusMessageEnum["StartAirConditioningV1"] = "StartAirConditioningV1";
@@ -251,6 +251,7 @@ export declare enum EnyoDataBusMessageEnum {
251
251
  ClearChargingProfilesV1 = "ClearChargingProfilesV1",
252
252
  HeatpumpOverheatingV1 = "HeatpumpOverheatingV1",
253
253
  HeatpumpAvailablePowerAnnouncementV1 = "HeatpumpAvailablePowerAnnouncementV1",
254
+ HeatingRodAvailablePowerAnnouncementV1 = "HeatingRodAvailablePowerAnnouncementV1",
254
255
  AirConditioningValuesUpdateV1 = "AirConditioningValuesUpdateV1",
255
256
  AirConditioningTemperaturesUpdateV1 = "AirConditioningTemperaturesUpdateV1",
256
257
  StartAirConditioningV1 = "StartAirConditioningV1",
@@ -1594,6 +1595,22 @@ export interface EnyoDataBusHeatpumpAvailablePowerAnnouncementV1 extends EnyoDat
1594
1595
  reason?: EnyoDataBusCommandReason;
1595
1596
  };
1596
1597
  }
1598
+ /**
1599
+ * Data bus message announcing available power for a heating rod appliance.
1600
+ * Used to inform the heating rod about how much power is available for consumption.
1601
+ */
1602
+ export interface EnyoDataBusHeatingRodAvailablePowerAnnouncementV1 extends EnyoDataBusMessage {
1603
+ type: 'message';
1604
+ message: EnyoDataBusMessageEnum.HeatingRodAvailablePowerAnnouncementV1;
1605
+ /** ID of the heating rod appliance */
1606
+ applianceId: string;
1607
+ data: {
1608
+ /** Available power for the heating rod to use (in Watt) */
1609
+ powerW: number;
1610
+ /** Optional reason why this announcement was issued */
1611
+ reason?: EnyoDataBusCommandReason;
1612
+ };
1613
+ }
1597
1614
  /**
1598
1615
  * Data bus message for reporting air conditioning power values.
1599
1616
  * Contains the current operating mode and power consumption.
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnyoHeatingRodApplianceModeEnum = exports.EnyoHeatingRodApplianceAvailableFeaturesEnum = void 0;
4
+ /**
5
+ * Available features for a heating rod (immersion / electric resistive heating
6
+ * element) appliance.
7
+ */
8
+ var EnyoHeatingRodApplianceAvailableFeaturesEnum;
9
+ (function (EnyoHeatingRodApplianceAvailableFeaturesEnum) {
10
+ /** If the heating rod reports electrical power values (e.g. consumption in watts) */
11
+ EnyoHeatingRodApplianceAvailableFeaturesEnum["Power"] = "Power";
12
+ /** If the heating rod supports available power announcements */
13
+ EnyoHeatingRodApplianceAvailableFeaturesEnum["AvailablePowerAnnouncement"] = "AvailablePowerAnnouncement";
14
+ })(EnyoHeatingRodApplianceAvailableFeaturesEnum || (exports.EnyoHeatingRodApplianceAvailableFeaturesEnum = EnyoHeatingRodApplianceAvailableFeaturesEnum = {}));
15
+ /**
16
+ * Operating modes for a heating rod appliance.
17
+ */
18
+ var EnyoHeatingRodApplianceModeEnum;
19
+ (function (EnyoHeatingRodApplianceModeEnum) {
20
+ /** The heating rod is idle (not consuming power) */
21
+ EnyoHeatingRodApplianceModeEnum["Idle"] = "Idle";
22
+ /** The heating rod is actively heating */
23
+ EnyoHeatingRodApplianceModeEnum["Heating"] = "Heating";
24
+ })(EnyoHeatingRodApplianceModeEnum || (exports.EnyoHeatingRodApplianceModeEnum = EnyoHeatingRodApplianceModeEnum = {}));
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Available features for a heating rod (immersion / electric resistive heating
3
+ * element) appliance.
4
+ */
5
+ export declare enum EnyoHeatingRodApplianceAvailableFeaturesEnum {
6
+ /** If the heating rod reports electrical power values (e.g. consumption in watts) */
7
+ Power = "Power",
8
+ /** If the heating rod supports available power announcements */
9
+ AvailablePowerAnnouncement = "AvailablePowerAnnouncement"
10
+ }
11
+ /**
12
+ * Operating modes for a heating rod appliance.
13
+ */
14
+ export declare enum EnyoHeatingRodApplianceModeEnum {
15
+ /** The heating rod is idle (not consuming power) */
16
+ Idle = "Idle",
17
+ /** The heating rod is actively heating */
18
+ Heating = "Heating"
19
+ }
20
+ /**
21
+ * Type-specific metadata for a heating rod appliance.
22
+ * Contains available features, current operating mode, rated power, and an
23
+ * optional reference to the heat pump the heating rod is associated with.
24
+ */
25
+ export interface EnyoHeatingRodApplianceMetadata {
26
+ /** List of features supported by this heating rod */
27
+ availableFeatures: EnyoHeatingRodApplianceAvailableFeaturesEnum[];
28
+ /** Current operating mode of the heating rod */
29
+ mode?: EnyoHeatingRodApplianceModeEnum;
30
+ /** Rated electrical power of the heating rod in watts */
31
+ ratedPowerW?: number;
32
+ /**
33
+ * Optional identifier of the heat pump appliance this heating rod is
34
+ * associated with. References the `id` of an EnyoAppliance of type Heatpump.
35
+ */
36
+ heatpumpApplianceId?: string;
37
+ }
@@ -9,7 +9,7 @@ exports.getSdkVersion = getSdkVersion;
9
9
  /**
10
10
  * Current version of the enyo Energy App SDK.
11
11
  */
12
- exports.SDK_VERSION = '0.0.166';
12
+ exports.SDK_VERSION = '0.0.167';
13
13
  /**
14
14
  * Gets the current SDK version.
15
15
  * @returns The semantic version string of the SDK
@@ -5,7 +5,7 @@
5
5
  /**
6
6
  * Current version of the enyo Energy App SDK.
7
7
  */
8
- export declare const SDK_VERSION = "0.0.166";
8
+ export declare const SDK_VERSION = "0.0.167";
9
9
  /**
10
10
  * Gets the current SDK version.
11
11
  * @returns The semantic version string of the SDK
@@ -15,5 +15,6 @@ export declare enum EnergyAppApplianceTypeEnum {
15
15
  Dryer = "dryer",
16
16
  Oven = "oven",
17
17
  Freezer = "freezer",
18
- AirConditioning = "air-conditioning"
18
+ AirConditioning = "air-conditioning",
19
+ HeatingRod = "heating-rod"
19
20
  }
@@ -17,4 +17,5 @@ export var EnergyAppApplianceTypeEnum;
17
17
  EnergyAppApplianceTypeEnum["Oven"] = "oven";
18
18
  EnergyAppApplianceTypeEnum["Freezer"] = "freezer";
19
19
  EnergyAppApplianceTypeEnum["AirConditioning"] = "air-conditioning";
20
+ EnergyAppApplianceTypeEnum["HeatingRod"] = "heating-rod";
20
21
  })(EnergyAppApplianceTypeEnum || (EnergyAppApplianceTypeEnum = {}));
@@ -8,6 +8,7 @@ import type { EnyoInverterApplianceMetadata } from "../../types/enyo-inverter-ap
8
8
  import type { EnyoMeterAppliance } from "../../types/enyo-meter-appliance.js";
9
9
  import type { EnyoTemperatureSensorApplianceMetadata } from "../../types/enyo-temperature-sensor-appliance.js";
10
10
  import type { EnyoAirConditioningApplianceMetadata } from "../../types/enyo-air-conditioning-appliance.js";
11
+ import type { EnyoHeatingRodApplianceMetadata } from "../../types/enyo-heating-rod-appliance.js";
11
12
  import { IdentifierStrategy } from "./identifier-strategies.js";
12
13
  /**
13
14
  * Thrown when {@link ApplianceManager.createOrUpdateAppliance} is called with
@@ -59,6 +60,7 @@ export interface ApplianceConfig {
59
60
  battery?: EnyoBatteryApplianceMetadata;
60
61
  temperatureSensor?: EnyoTemperatureSensorApplianceMetadata;
61
62
  airConditioning?: EnyoAirConditioningApplianceMetadata;
63
+ heatingRod?: EnyoHeatingRodApplianceMetadata;
62
64
  availableFeatures?: EnyoApplianceAvailableFeaturesEnum[];
63
65
  /**
64
66
  * Optional identifier of the cloud-deployed energy app package that manages
@@ -140,7 +142,7 @@ export declare class ApplianceManager {
140
142
  * @param update The partial update data to merge
141
143
  * @returns The merged appliance data (without `id`)
142
144
  */
143
- private mergeApplianceData;
145
+ protected mergeApplianceData(existing: EnyoAppliance, update: Partial<Omit<PartialEnyoAppliance, 'id'>>): Omit<EnyoAppliance, 'id'>;
144
146
  /**
145
147
  * Creates a new ApplianceManager instance.
146
148
  *
@@ -418,6 +420,8 @@ export interface PartialEnyoAppliance {
418
420
  temperatureSensor?: Partial<EnyoTemperatureSensorApplianceMetadata>;
419
421
  /** Optional Metadata of the Appliance if of type AirConditioning */
420
422
  airConditioning?: Partial<EnyoAirConditioningApplianceMetadata>;
423
+ /** Optional Metadata of the Appliance if of type HeatingRod */
424
+ heatingRod?: Partial<EnyoHeatingRodApplianceMetadata>;
421
425
  /** Optional custom name for the appliance, defined by the user */
422
426
  customName?: string;
423
427
  /**
@@ -53,6 +53,7 @@ const MERGEABLE_METADATA_KEYS = [
53
53
  'meter',
54
54
  'temperatureSensor',
55
55
  'airConditioning',
56
+ 'heatingRod',
56
57
  ];
57
58
  /**
58
59
  * Manages appliances in the energy system with configurable identification strategies.
@@ -201,6 +202,7 @@ export class ApplianceManager {
201
202
  inverter: appliance.inverter,
202
203
  temperatureSensor: appliance.temperatureSensor,
203
204
  airConditioning: appliance.airConditioning,
205
+ heatingRod: appliance.heatingRod,
204
206
  // Conditionally spread the two optional top-level fields that are NOT
205
207
  // covered by MERGEABLE_METADATA_KEYS. If they were always materialized
206
208
  // as explicit keys, an omitted (undefined) value would clobber the
@@ -49,10 +49,12 @@ export class InMemoryApplianceManager extends ApplianceManager {
49
49
  EnyoApplianceStateEnum.Connected,
50
50
  ...appliance.metadata
51
51
  };
52
- // Build appliance data
53
- const applianceId = existingAppliance?.id || randomUUID();
54
- const applianceData = {
55
- id: applianceId,
52
+ // Build the incoming appliance data covering every ApplianceConfig field.
53
+ // The two optional top-level fields that are NOT shallow-merged by
54
+ // mergeApplianceData (`cloudPackageId`, `availableFeatures`) are only
55
+ // materialized when provided so an omitted value cannot clobber the stored
56
+ // one during an update; pass an explicit value (e.g. `[]`) to clear them.
57
+ const newApplianceData = {
56
58
  name: appliance.name,
57
59
  type: appliance.type,
58
60
  networkDeviceIds,
@@ -63,7 +65,18 @@ export class InMemoryApplianceManager extends ApplianceManager {
63
65
  battery: appliance.battery,
64
66
  charger: appliance.charger,
65
67
  inverter: appliance.inverter,
68
+ temperatureSensor: appliance.temperatureSensor,
69
+ airConditioning: appliance.airConditioning,
70
+ heatingRod: appliance.heatingRod,
71
+ ...(appliance.cloudPackageId !== undefined && { cloudPackageId: appliance.cloudPackageId }),
72
+ ...(appliance.availableFeatures !== undefined && { availableFeatures: appliance.availableFeatures }),
66
73
  };
74
+ // On update, merge onto the stored appliance so type-specific metadata and
75
+ // top-level fields that were not supplied in this call are preserved.
76
+ const applianceId = existingAppliance?.id || randomUUID();
77
+ const applianceData = existingAppliance
78
+ ? { ...this.mergeApplianceData(existingAppliance, newApplianceData), id: applianceId }
79
+ : { id: applianceId, ...newApplianceData };
67
80
  // Save to memory store
68
81
  this.memoryStore.set(applianceId, applianceData);
69
82
  // Store network devices if provided
package/dist/index.d.ts CHANGED
@@ -58,6 +58,7 @@ export * from './packages/energy-app-grid-connection-point.js';
58
58
  export * from './types/enyo-configuration-manager.js';
59
59
  export * from './packages/energy-app-configuration-manager.js';
60
60
  export * from './types/enyo-air-conditioning-appliance.js';
61
+ export * from './types/enyo-heating-rod-appliance.js';
61
62
  export * from './types/enyo-onboarding.js';
62
63
  export * from './packages/energy-app-onboarding.js';
63
64
  export * from './types/enyo-retry-manager.js';
package/dist/index.js CHANGED
@@ -58,6 +58,7 @@ export * from './packages/energy-app-grid-connection-point.js';
58
58
  export * from './types/enyo-configuration-manager.js';
59
59
  export * from './packages/energy-app-configuration-manager.js';
60
60
  export * from './types/enyo-air-conditioning-appliance.js';
61
+ export * from './types/enyo-heating-rod-appliance.js';
61
62
  export * from './types/enyo-onboarding.js';
62
63
  export * from './packages/energy-app-onboarding.js';
63
64
  export * from './types/enyo-retry-manager.js';
@@ -6,6 +6,7 @@ import { EnyoInverterApplianceMetadata } from "./enyo-inverter-appliance.js";
6
6
  import { EnyoMeterAppliance } from "./enyo-meter-appliance.js";
7
7
  import { EnyoTemperatureSensorApplianceMetadata } from "./enyo-temperature-sensor-appliance.js";
8
8
  import { EnyoAirConditioningApplianceMetadata } from "./enyo-air-conditioning-appliance.js";
9
+ import { EnyoHeatingRodApplianceMetadata } from "./enyo-heating-rod-appliance.js";
9
10
  export declare enum EnyoApplianceTypeEnum {
10
11
  Inverter = "Inverter",
11
12
  Charger = "Charger",
@@ -13,7 +14,8 @@ export declare enum EnyoApplianceTypeEnum {
13
14
  Meter = "Meter",
14
15
  Heatpump = "Heatpump",
15
16
  AirConditioning = "AirConditioning",
16
- TemperatureSensor = "TemperatureSensor"
17
+ TemperatureSensor = "TemperatureSensor",
18
+ HeatingRod = "HeatingRod"
17
19
  }
18
20
  export interface EnyoApplianceName {
19
21
  language: EnergyAppPackageLanguage;
@@ -247,6 +249,8 @@ export interface EnyoAppliance {
247
249
  temperatureSensor?: EnyoTemperatureSensorApplianceMetadata;
248
250
  /** Optional Metadata of the Appliance if of type AirConditioning */
249
251
  airConditioning?: EnyoAirConditioningApplianceMetadata;
252
+ /** Optional Metadata of the Appliance if of type HeatingRod */
253
+ heatingRod?: EnyoHeatingRodApplianceMetadata;
250
254
  /** Optional custom name for the appliance, defined by the user */
251
255
  customName?: string;
252
256
  /**
@@ -7,6 +7,7 @@ export var EnyoApplianceTypeEnum;
7
7
  EnyoApplianceTypeEnum["Heatpump"] = "Heatpump";
8
8
  EnyoApplianceTypeEnum["AirConditioning"] = "AirConditioning";
9
9
  EnyoApplianceTypeEnum["TemperatureSensor"] = "TemperatureSensor";
10
+ EnyoApplianceTypeEnum["HeatingRod"] = "HeatingRod";
10
11
  })(EnyoApplianceTypeEnum || (EnyoApplianceTypeEnum = {}));
11
12
  export var EnyoApplianceStateEnum;
12
13
  (function (EnyoApplianceStateEnum) {
@@ -251,6 +251,7 @@ export declare enum EnyoDataBusMessageEnum {
251
251
  ClearChargingProfilesV1 = "ClearChargingProfilesV1",
252
252
  HeatpumpOverheatingV1 = "HeatpumpOverheatingV1",
253
253
  HeatpumpAvailablePowerAnnouncementV1 = "HeatpumpAvailablePowerAnnouncementV1",
254
+ HeatingRodAvailablePowerAnnouncementV1 = "HeatingRodAvailablePowerAnnouncementV1",
254
255
  AirConditioningValuesUpdateV1 = "AirConditioningValuesUpdateV1",
255
256
  AirConditioningTemperaturesUpdateV1 = "AirConditioningTemperaturesUpdateV1",
256
257
  StartAirConditioningV1 = "StartAirConditioningV1",
@@ -1594,6 +1595,22 @@ export interface EnyoDataBusHeatpumpAvailablePowerAnnouncementV1 extends EnyoDat
1594
1595
  reason?: EnyoDataBusCommandReason;
1595
1596
  };
1596
1597
  }
1598
+ /**
1599
+ * Data bus message announcing available power for a heating rod appliance.
1600
+ * Used to inform the heating rod about how much power is available for consumption.
1601
+ */
1602
+ export interface EnyoDataBusHeatingRodAvailablePowerAnnouncementV1 extends EnyoDataBusMessage {
1603
+ type: 'message';
1604
+ message: EnyoDataBusMessageEnum.HeatingRodAvailablePowerAnnouncementV1;
1605
+ /** ID of the heating rod appliance */
1606
+ applianceId: string;
1607
+ data: {
1608
+ /** Available power for the heating rod to use (in Watt) */
1609
+ powerW: number;
1610
+ /** Optional reason why this announcement was issued */
1611
+ reason?: EnyoDataBusCommandReason;
1612
+ };
1613
+ }
1597
1614
  /**
1598
1615
  * Data bus message for reporting air conditioning power values.
1599
1616
  * Contains the current operating mode and power consumption.
@@ -216,6 +216,7 @@ export var EnyoDataBusMessageEnum;
216
216
  EnyoDataBusMessageEnum["ClearChargingProfilesV1"] = "ClearChargingProfilesV1";
217
217
  EnyoDataBusMessageEnum["HeatpumpOverheatingV1"] = "HeatpumpOverheatingV1";
218
218
  EnyoDataBusMessageEnum["HeatpumpAvailablePowerAnnouncementV1"] = "HeatpumpAvailablePowerAnnouncementV1";
219
+ EnyoDataBusMessageEnum["HeatingRodAvailablePowerAnnouncementV1"] = "HeatingRodAvailablePowerAnnouncementV1";
219
220
  EnyoDataBusMessageEnum["AirConditioningValuesUpdateV1"] = "AirConditioningValuesUpdateV1";
220
221
  EnyoDataBusMessageEnum["AirConditioningTemperaturesUpdateV1"] = "AirConditioningTemperaturesUpdateV1";
221
222
  EnyoDataBusMessageEnum["StartAirConditioningV1"] = "StartAirConditioningV1";
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Available features for a heating rod (immersion / electric resistive heating
3
+ * element) appliance.
4
+ */
5
+ export declare enum EnyoHeatingRodApplianceAvailableFeaturesEnum {
6
+ /** If the heating rod reports electrical power values (e.g. consumption in watts) */
7
+ Power = "Power",
8
+ /** If the heating rod supports available power announcements */
9
+ AvailablePowerAnnouncement = "AvailablePowerAnnouncement"
10
+ }
11
+ /**
12
+ * Operating modes for a heating rod appliance.
13
+ */
14
+ export declare enum EnyoHeatingRodApplianceModeEnum {
15
+ /** The heating rod is idle (not consuming power) */
16
+ Idle = "Idle",
17
+ /** The heating rod is actively heating */
18
+ Heating = "Heating"
19
+ }
20
+ /**
21
+ * Type-specific metadata for a heating rod appliance.
22
+ * Contains available features, current operating mode, rated power, and an
23
+ * optional reference to the heat pump the heating rod is associated with.
24
+ */
25
+ export interface EnyoHeatingRodApplianceMetadata {
26
+ /** List of features supported by this heating rod */
27
+ availableFeatures: EnyoHeatingRodApplianceAvailableFeaturesEnum[];
28
+ /** Current operating mode of the heating rod */
29
+ mode?: EnyoHeatingRodApplianceModeEnum;
30
+ /** Rated electrical power of the heating rod in watts */
31
+ ratedPowerW?: number;
32
+ /**
33
+ * Optional identifier of the heat pump appliance this heating rod is
34
+ * associated with. References the `id` of an EnyoAppliance of type Heatpump.
35
+ */
36
+ heatpumpApplianceId?: string;
37
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Available features for a heating rod (immersion / electric resistive heating
3
+ * element) appliance.
4
+ */
5
+ export var EnyoHeatingRodApplianceAvailableFeaturesEnum;
6
+ (function (EnyoHeatingRodApplianceAvailableFeaturesEnum) {
7
+ /** If the heating rod reports electrical power values (e.g. consumption in watts) */
8
+ EnyoHeatingRodApplianceAvailableFeaturesEnum["Power"] = "Power";
9
+ /** If the heating rod supports available power announcements */
10
+ EnyoHeatingRodApplianceAvailableFeaturesEnum["AvailablePowerAnnouncement"] = "AvailablePowerAnnouncement";
11
+ })(EnyoHeatingRodApplianceAvailableFeaturesEnum || (EnyoHeatingRodApplianceAvailableFeaturesEnum = {}));
12
+ /**
13
+ * Operating modes for a heating rod appliance.
14
+ */
15
+ export var EnyoHeatingRodApplianceModeEnum;
16
+ (function (EnyoHeatingRodApplianceModeEnum) {
17
+ /** The heating rod is idle (not consuming power) */
18
+ EnyoHeatingRodApplianceModeEnum["Idle"] = "Idle";
19
+ /** The heating rod is actively heating */
20
+ EnyoHeatingRodApplianceModeEnum["Heating"] = "Heating";
21
+ })(EnyoHeatingRodApplianceModeEnum || (EnyoHeatingRodApplianceModeEnum = {}));
package/dist/version.d.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  /**
6
6
  * Current version of the enyo Energy App SDK.
7
7
  */
8
- export declare const SDK_VERSION = "0.0.166";
8
+ export declare const SDK_VERSION = "0.0.167";
9
9
  /**
10
10
  * Gets the current SDK version.
11
11
  * @returns The semantic version string of the SDK
package/dist/version.js CHANGED
@@ -5,7 +5,7 @@
5
5
  /**
6
6
  * Current version of the enyo Energy App SDK.
7
7
  */
8
- export const SDK_VERSION = '0.0.166';
8
+ export const SDK_VERSION = '0.0.167';
9
9
  /**
10
10
  * Gets the current SDK version.
11
11
  * @returns The semantic version string of the SDK
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@enyo-energy/energy-app-sdk",
3
- "version": "0.0.166",
3
+ "version": "0.0.167",
4
4
  "description": "enyo Energy App SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",