@enyo-energy/energy-app-sdk 1.34.0 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1653,6 +1653,7 @@ A closed, SDK-defined set of user-facing controls the active energy manager hono
1653
1653
  | `BatteryPvPriorityTargetSocPercent` | number \| `null`, **%** target the battery is charged to from PV before other surplus consumers (absent / `null` = disabled) |
1654
1654
  | `BatteryDischargeBlockAboveHomeConsumptionW` | number \| `null`, **W** home consumption above which the battery may not discharge (absent / `null` = disabled) |
1655
1655
  | `HeatpumpControl` | boolean |
1656
+ | `HeatpumpEcoModeInExpensiveTimes` | boolean, off by default — switch the heat pump to its eco setpoint while electricity is expensive |
1656
1657
  | `HeatingRodControl` | boolean |
1657
1658
  | `HeatingRodMode` | `pv-surplus-only` \| `boost` |
1658
1659
  | `HeatingRodBatteryDischargeSocLimitPercent` | number \| `null`, **%** floor the battery may feed the heating rod down to (absent / `null` = disabled) |
@@ -1706,7 +1707,8 @@ Three things to get right:
1706
1707
  - **The heating rod may draw from the battery only down to a floor, and only when asked.** `HeatingRodBatteryDischargeSocLimitPercent` (`80` = the rod may use the battery while it holds more than 80 %) is disabled while absent or `null`. It applies under both heating rod modes — under `pv-surplus-only` the battery above the floor counts as supply alongside PV, still never a grid import. It needs `batteryControl` to be enforced, and should not lie below `BatteryPvPriorityTargetSocPercent`; the validator warns on both. A consumer held back by it carries the command reason `BatteryPvPriority` (category `PvSurplus`) with `context.batteryPvPriority.targetSocPercent` and `socPercent`.
1707
1708
  - **The battery can be blocked from discharging under a heavy load.** `BatteryDischargeBlockAboveHomeConsumptionW` (`11000` = no discharge while the house draws more than 11 kW) keeps a sauna or an oven from emptying the battery in minutes. It is in **watts** — the validator warns below 100 W, which catches a kW value. Home consumption means the household plus every appliance the energy manager does **not** track — the same quantity as `homeConsumptionW` in the home consumption timeseries. Tracked appliances (wallbox, heat pump, heating rod, …) and the battery's own charging are excluded, so a charging car alone never trips the block. The block wins over the EV and heating rod discharge permissions; charging is unaffected. Disabled while absent or `null`. A battery held by it carries `HomeConsumptionHigh` with `context.batteryDischargeBlock.thresholdW` and `powerW` set to the current consumption.
1708
1709
  - **Grid-optimised EV charging is about the grid, not the bill.** `GridOptimizedEvCharging` adds no charge mode. It only affects `cost-optimized` sessions while the tariff is static or time-of-use (no effect under a dynamic one): the grid energy PV does not cover is placed in the hours with the lowest EPEX spot price before the deadline — the spot price as a proxy for grid load — instead of as late as possible or in the tariff's cheap windows. PV still comes first, the deadline still holds, and a session's price ceiling still applies against the customer's own tariff. On a time-of-use tariff a low-load hour can be a more expensive one; that is the trade the owner opts into.
1709
- - **Fifteen settings are gated by another** (`heatingRodMode` needs `heatingRodControl`, `priceLimitCtPerKwh` only applies under `priceLimitMode: 'ct-per-kwh'`, …). The tree is exported as `ENERGY_MANAGER_SETTING_DEPENDENCIES`, with two helpers over it: `getEnergyManagerSettingDependency(setting)` returns the direct gate and the value it must hold (or `null` for an ungated root), and `isEnergyManagerSettingActive(setting, values)` walks the whole chain — the gates are now two deep, so a Wh budget is live only when the mode is `fixed-wh` *and* battery control is on.
1710
+ - **Eco mode in expensive times switches setpoints, not temperatures.** `HeatpumpEcoModeInExpensiveTimes` (needs `heatpumpControl`) lets the energy manager send `HeatpumpProgramSwitchV3` with `mode: Eco` to every zone listing `eco` in `supportedProgramModes` while the tariff is expensive, and `mode: Program` once it is not. The user's own eco temperature applies (`programModeTemperaturesC`); the energy manager only chooses *when*. "Expensive" comes from the consumption tariff — the dearest slots under a dynamic tariff, the high-price windows under a time-of-use one; under a static tariff the setting has no effect, as it has on heat pumps without `ProgramSwitch`. Each such switch carries `ElectricityPriceAboveThreshold` (category `EnergyPrice`) with `electricityPricePerKwh`.
1711
+ - **Sixteen settings are gated by another** (`heatingRodMode` needs `heatingRodControl`, `priceLimitCtPerKwh` only applies under `priceLimitMode: 'ct-per-kwh'`, …). The tree is exported as `ENERGY_MANAGER_SETTING_DEPENDENCIES`, with two helpers over it: `getEnergyManagerSettingDependency(setting)` returns the direct gate and the value it must hold (or `null` for an ungated root), and `isEnergyManagerSettingActive(setting, values)` walks the whole chain — the gates are now two deep, so a Wh budget is live only when the mode is `fixed-wh` *and* battery control is on.
1710
1712
  - **`priceLimitCtPerKwh` is in cents**, unlike the SDK's machine-readable price fields (`electricityPricePerKwh`, EUR/kWh). Divide by 100 when comparing. `validateEnergyManagerSettingsState()` warns on values outside a plausible ct band, which catches the mix-up.
1711
1713
  - **A price ceiling is one mode plus its parameter**, the same shape as the battery-to-EV one. `PriceLimitMode` picks how the ceiling is expressed — an absolute `ct-per-kwh` or a relative `cheapest-share` — and each value is read only under its own mode; the mode being absent means no ceiling at all. A relative ceiling ranks the price intervals *known* for the day and treats the cheapest `n` % as importable (the same rule as the `cheapest-share-of-day` automation trigger), so its effective threshold moves when tomorrow's prices publish — re-evaluate it rather than resolving it once.
1712
1714
 
@@ -3216,6 +3218,7 @@ Switches one heating circuit or DHW zone to its **comfort** or **eco** setpoint
3216
3218
  - **One zone per message**, answered with a plain `CommandAcknowledgeV1`.
3217
3219
  - **Ending and safety net.** `mode: Program` ends a switch (idempotent). A switch to comfort or eco holds until `untilIso` (at most `HEATPUMP_PROGRAM_SWITCH_MAX_MINUTES` = 30 min ahead); the energy manager re-sends about every 15 min while it should hold. When `untilIso` passes without a newer message, the base class calls `handleHeatpumpProgramSwitch` with `mode: Program` and `cause: HeatpumpProgramSwitchCauseEnum.Expired` — so after a restart of either side a zone is back on its program within 30 min, and the app stores nothing.
3218
3220
  - **Alongside `HeatpumpControlV3`.** The two run side by side: the mode sets the base, an action raises above it (eco 20 °C + room action +1 K = 21 °C).
3221
+ - **Owner's consent for price-driven eco.** An energy manager switches zones to eco for price reasons only while the general setting `heatpumpEcoModeInExpensiveTimes` (and `heatpumpControl`) is `true` — see [General settings](#general-settings).
3219
3222
  - **Validation** (run by the base class before the handler, or `validateHeatpumpProgramSwitch(data, metadata)` directly): target `Room` / `Dhw`, a known mode, a valid `untilIso` for comfort / eco (`Rejected`); `ProgramSwitch` declared and the mode listed for the zone (`NotSupported`); a known zone index (`Rejected`).
3220
3223
 
3221
3224
  #### HeatpumpFlexibilityAnnouncementV3
@@ -208,7 +208,8 @@ function validateEnergyManagerSettingsState(state) {
208
208
  const values = state.values ?? {};
209
209
  // ── value formats ──────────────────────────────────────────────────────
210
210
  for (const key of ['batteryControl', 'batteryChargeFromGrid', 'heatpumpControl',
211
- 'heatingRodControl', 'chargerControl', 'gridOptimizedEvCharging']) {
211
+ 'heatpumpEcoModeInExpensiveTimes', 'heatingRodControl', 'chargerControl',
212
+ 'gridOptimizedEvCharging']) {
212
213
  if (values[key] !== undefined && typeof values[key] !== 'boolean') {
213
214
  errors.push(`\`${key}\` must be a boolean when set.`);
214
215
  }
@@ -4583,6 +4583,11 @@ export interface EnyoDataBusHeatpumpControlStatusV3 extends EnyoDataBusMessage {
4583
4583
  * with a fresh `untilIso`. So if the energy manager or the app restarts, a
4584
4584
  * zone is back on its program after at most that long.
4585
4585
  *
4586
+ * **Price-driven eco needs the owner's consent.** Switch a zone to eco because
4587
+ * electricity is expensive only while the general setting
4588
+ * {@link EnergyManagerSettingValues.heatpumpEcoModeInExpensiveTimes} (and
4589
+ * {@link EnergyManagerSettingValues.heatpumpControl}) is `true`.
4590
+ *
4586
4591
  * **Together with {@link EnyoDataBusHeatpumpControlV3}.** The two run side by
4587
4592
  * side. The mode sets the base and an action raises above it: eco at 20 °C
4588
4593
  * plus a room action of +1 K gives 21 °C.
@@ -61,8 +61,13 @@ var EnergyManagerSettingEnum;
61
61
  */
62
62
  EnergyManagerSettingEnum["BatteryDischargeBlockAboveHomeConsumptionW"] = "battery-discharge-block-above-home-consumption-w";
63
63
  // ── Heat pump ──────────────────────────────────────────────────────────
64
- /** Whether the energy manager may steer the heat pump. */
64
+ /** Whether the energy manager may steer the heat pump. Gates {@link HeatpumpEcoModeInExpensiveTimes}. */
65
65
  EnergyManagerSettingEnum["HeatpumpControl"] = "heatpump-control";
66
+ /**
67
+ * Whether the heat pump is switched to its eco / reduced setpoint while
68
+ * electricity is expensive.
69
+ */
70
+ EnergyManagerSettingEnum["HeatpumpEcoModeInExpensiveTimes"] = "heatpump-eco-mode-in-expensive-times";
66
71
  // ── Heating rod ────────────────────────────────────────────────────────
67
72
  /** Whether the energy manager may steer the heating rod. Gates {@link HeatingRodMode}. */
68
73
  EnergyManagerSettingEnum["HeatingRodControl"] = "heating-rod-control";
@@ -238,7 +243,7 @@ var EnergyManagerHeatingRodModeEnum;
238
243
  /**
239
244
  * Which settings are gated by which, as data.
240
245
  *
241
- * Fifteen of the nineteen settings only mean anything while another one holds a specific
246
+ * Sixteen of the twenty settings only mean anything while another one holds a specific
242
247
  * value. Encoding that here rather than in prose gives the cockpit a single
243
248
  * source of truth for greying out dependent controls, and lets
244
249
  * `validateEnergyManagerSettingsState()` flag values that can never take effect.
@@ -280,6 +285,10 @@ exports.ENERGY_MANAGER_SETTING_DEPENDENCIES = {
280
285
  requires: EnergyManagerSettingEnum.BatteryControl,
281
286
  equals: true,
282
287
  },
288
+ [EnergyManagerSettingEnum.HeatpumpEcoModeInExpensiveTimes]: {
289
+ requires: EnergyManagerSettingEnum.HeatpumpControl,
290
+ equals: true,
291
+ },
283
292
  [EnergyManagerSettingEnum.HeatingRodMode]: {
284
293
  requires: EnergyManagerSettingEnum.HeatingRodControl,
285
294
  equals: true,
@@ -332,6 +341,7 @@ exports.ENERGY_MANAGER_SETTING_VALUE_KEYS = {
332
341
  'batteryDischargeBlockAboveHomeConsumptionW',
333
342
  ],
334
343
  [EnergyManagerSettingEnum.HeatpumpControl]: ['heatpumpControl'],
344
+ [EnergyManagerSettingEnum.HeatpumpEcoModeInExpensiveTimes]: ['heatpumpEcoModeInExpensiveTimes'],
335
345
  [EnergyManagerSettingEnum.HeatingRodControl]: ['heatingRodControl'],
336
346
  [EnergyManagerSettingEnum.HeatingRodMode]: ['heatingRodMode'],
337
347
  [EnergyManagerSettingEnum.HeatingRodBatteryDischargeSocLimitPercent]: [
@@ -56,8 +56,13 @@ export declare enum EnergyManagerSettingEnum {
56
56
  * Unset or `null` means no such block.
57
57
  */
58
58
  BatteryDischargeBlockAboveHomeConsumptionW = "battery-discharge-block-above-home-consumption-w",
59
- /** Whether the energy manager may steer the heat pump. */
59
+ /** Whether the energy manager may steer the heat pump. Gates {@link HeatpumpEcoModeInExpensiveTimes}. */
60
60
  HeatpumpControl = "heatpump-control",
61
+ /**
62
+ * Whether the heat pump is switched to its eco / reduced setpoint while
63
+ * electricity is expensive.
64
+ */
65
+ HeatpumpEcoModeInExpensiveTimes = "heatpump-eco-mode-in-expensive-times",
61
66
  /** Whether the energy manager may steer the heating rod. Gates {@link HeatingRodMode}. */
62
67
  HeatingRodControl = "heating-rod-control",
63
68
  /** What the heating rod is allowed to do — see {@link EnergyManagerHeatingRodModeEnum}. */
@@ -373,6 +378,43 @@ export interface EnergyManagerSettingValues {
373
378
  * allow control before the energy manager acts.
374
379
  */
375
380
  heatpumpControl?: boolean;
381
+ /**
382
+ * Whether the energy manager switches the heat pump to the user's **eco**
383
+ * setpoint while electricity is expensive. **Off by default** — absent or
384
+ * `false` means off.
385
+ *
386
+ * While on, the energy manager sends
387
+ * {@link EnyoDataBusHeatpumpProgramSwitchV3} with
388
+ * {@link EnyoHeatpumpProgramModeEnum.Eco} to every zone (heating circuit or
389
+ * DHW zone) that lists `eco` in its `supportedProgramModes`, for the hours
390
+ * the active consumption tariff makes expensive, and
391
+ * {@link EnyoHeatpumpProgramModeEnum.Program} once they are over. The
392
+ * temperatures are the user's own
393
+ * ({@link EnyoHeatpumpApplianceHeatingCircuit.programModeTemperaturesC}) —
394
+ * the energy manager chooses only *when* eco applies, never how low it is.
395
+ *
396
+ * Which hours count as expensive is the energy manager's call, taken from
397
+ * the tariff: the dearest slots of the day under a
398
+ * {@link EnyoTariffPricingTypeEnum.Dynamic} tariff, the high-price windows
399
+ * under a {@link EnyoTariffPricingTypeEnum.TimeVariable} one. Under a
400
+ * {@link EnyoTariffPricingTypeEnum.Static} tariff no hour is dearer than
401
+ * another, so the setting has no effect. While PV surplus covers the heat
402
+ * pump, the grid price does not apply and the energy manager may leave the
403
+ * zone on its program.
404
+ *
405
+ * Only heat pumps declaring
406
+ * {@link EnyoHeatpumpApplianceAvailableFeaturesEnum.ProgramSwitch} can
407
+ * follow it; on all others the setting has no effect.
408
+ *
409
+ * Each switch to eco because of this setting carries the reason
410
+ * {@link EnyoDataBusCommandReasonTypeEnum.ElectricityPriceAboveThreshold}
411
+ * (category {@link EnyoDataBusCommandReasonCategoryEnum.EnergyPrice}), with
412
+ * {@link EnyoDataBusCommandReason.electricityPricePerKwh} set to the price
413
+ * of the current slot.
414
+ *
415
+ * Only meaningful while {@link heatpumpControl} is `true`.
416
+ */
417
+ heatpumpEcoModeInExpensiveTimes?: boolean;
376
418
  /** Whether the energy manager may steer the heating rod. */
377
419
  heatingRodControl?: boolean;
378
420
  /** What the heating rod may do. Only meaningful while {@link heatingRodControl} is `true`. */
@@ -586,7 +628,7 @@ export interface EnergyManagerSettingDependency {
586
628
  /**
587
629
  * Which settings are gated by which, as data.
588
630
  *
589
- * Fifteen of the nineteen settings only mean anything while another one holds a specific
631
+ * Sixteen of the twenty settings only mean anything while another one holds a specific
590
632
  * value. Encoding that here rather than in prose gives the cockpit a single
591
633
  * source of truth for greying out dependent controls, and lets
592
634
  * `validateEnergyManagerSettingsState()` flag values that can never take effect.
@@ -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 = '1.34.0';
12
+ exports.SDK_VERSION = '1.35.0';
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 = "1.34.0";
8
+ export declare const SDK_VERSION = "1.35.0";
9
9
  /**
10
10
  * Gets the current SDK version.
11
11
  * @returns The semantic version string of the SDK
@@ -202,7 +202,8 @@ export function validateEnergyManagerSettingsState(state) {
202
202
  const values = state.values ?? {};
203
203
  // ── value formats ──────────────────────────────────────────────────────
204
204
  for (const key of ['batteryControl', 'batteryChargeFromGrid', 'heatpumpControl',
205
- 'heatingRodControl', 'chargerControl', 'gridOptimizedEvCharging']) {
205
+ 'heatpumpEcoModeInExpensiveTimes', 'heatingRodControl', 'chargerControl',
206
+ 'gridOptimizedEvCharging']) {
206
207
  if (values[key] !== undefined && typeof values[key] !== 'boolean') {
207
208
  errors.push(`\`${key}\` must be a boolean when set.`);
208
209
  }
@@ -4583,6 +4583,11 @@ export interface EnyoDataBusHeatpumpControlStatusV3 extends EnyoDataBusMessage {
4583
4583
  * with a fresh `untilIso`. So if the energy manager or the app restarts, a
4584
4584
  * zone is back on its program after at most that long.
4585
4585
  *
4586
+ * **Price-driven eco needs the owner's consent.** Switch a zone to eco because
4587
+ * electricity is expensive only while the general setting
4588
+ * {@link EnergyManagerSettingValues.heatpumpEcoModeInExpensiveTimes} (and
4589
+ * {@link EnergyManagerSettingValues.heatpumpControl}) is `true`.
4590
+ *
4586
4591
  * **Together with {@link EnyoDataBusHeatpumpControlV3}.** The two run side by
4587
4592
  * side. The mode sets the base and an action raises above it: eco at 20 °C
4588
4593
  * plus a room action of +1 K gives 21 °C.
@@ -56,8 +56,13 @@ export declare enum EnergyManagerSettingEnum {
56
56
  * Unset or `null` means no such block.
57
57
  */
58
58
  BatteryDischargeBlockAboveHomeConsumptionW = "battery-discharge-block-above-home-consumption-w",
59
- /** Whether the energy manager may steer the heat pump. */
59
+ /** Whether the energy manager may steer the heat pump. Gates {@link HeatpumpEcoModeInExpensiveTimes}. */
60
60
  HeatpumpControl = "heatpump-control",
61
+ /**
62
+ * Whether the heat pump is switched to its eco / reduced setpoint while
63
+ * electricity is expensive.
64
+ */
65
+ HeatpumpEcoModeInExpensiveTimes = "heatpump-eco-mode-in-expensive-times",
61
66
  /** Whether the energy manager may steer the heating rod. Gates {@link HeatingRodMode}. */
62
67
  HeatingRodControl = "heating-rod-control",
63
68
  /** What the heating rod is allowed to do — see {@link EnergyManagerHeatingRodModeEnum}. */
@@ -373,6 +378,43 @@ export interface EnergyManagerSettingValues {
373
378
  * allow control before the energy manager acts.
374
379
  */
375
380
  heatpumpControl?: boolean;
381
+ /**
382
+ * Whether the energy manager switches the heat pump to the user's **eco**
383
+ * setpoint while electricity is expensive. **Off by default** — absent or
384
+ * `false` means off.
385
+ *
386
+ * While on, the energy manager sends
387
+ * {@link EnyoDataBusHeatpumpProgramSwitchV3} with
388
+ * {@link EnyoHeatpumpProgramModeEnum.Eco} to every zone (heating circuit or
389
+ * DHW zone) that lists `eco` in its `supportedProgramModes`, for the hours
390
+ * the active consumption tariff makes expensive, and
391
+ * {@link EnyoHeatpumpProgramModeEnum.Program} once they are over. The
392
+ * temperatures are the user's own
393
+ * ({@link EnyoHeatpumpApplianceHeatingCircuit.programModeTemperaturesC}) —
394
+ * the energy manager chooses only *when* eco applies, never how low it is.
395
+ *
396
+ * Which hours count as expensive is the energy manager's call, taken from
397
+ * the tariff: the dearest slots of the day under a
398
+ * {@link EnyoTariffPricingTypeEnum.Dynamic} tariff, the high-price windows
399
+ * under a {@link EnyoTariffPricingTypeEnum.TimeVariable} one. Under a
400
+ * {@link EnyoTariffPricingTypeEnum.Static} tariff no hour is dearer than
401
+ * another, so the setting has no effect. While PV surplus covers the heat
402
+ * pump, the grid price does not apply and the energy manager may leave the
403
+ * zone on its program.
404
+ *
405
+ * Only heat pumps declaring
406
+ * {@link EnyoHeatpumpApplianceAvailableFeaturesEnum.ProgramSwitch} can
407
+ * follow it; on all others the setting has no effect.
408
+ *
409
+ * Each switch to eco because of this setting carries the reason
410
+ * {@link EnyoDataBusCommandReasonTypeEnum.ElectricityPriceAboveThreshold}
411
+ * (category {@link EnyoDataBusCommandReasonCategoryEnum.EnergyPrice}), with
412
+ * {@link EnyoDataBusCommandReason.electricityPricePerKwh} set to the price
413
+ * of the current slot.
414
+ *
415
+ * Only meaningful while {@link heatpumpControl} is `true`.
416
+ */
417
+ heatpumpEcoModeInExpensiveTimes?: boolean;
376
418
  /** Whether the energy manager may steer the heating rod. */
377
419
  heatingRodControl?: boolean;
378
420
  /** What the heating rod may do. Only meaningful while {@link heatingRodControl} is `true`. */
@@ -586,7 +628,7 @@ export interface EnergyManagerSettingDependency {
586
628
  /**
587
629
  * Which settings are gated by which, as data.
588
630
  *
589
- * Fifteen of the nineteen settings only mean anything while another one holds a specific
631
+ * Sixteen of the twenty settings only mean anything while another one holds a specific
590
632
  * value. Encoding that here rather than in prose gives the cockpit a single
591
633
  * source of truth for greying out dependent controls, and lets
592
634
  * `validateEnergyManagerSettingsState()` flag values that can never take effect.
@@ -58,8 +58,13 @@ export var EnergyManagerSettingEnum;
58
58
  */
59
59
  EnergyManagerSettingEnum["BatteryDischargeBlockAboveHomeConsumptionW"] = "battery-discharge-block-above-home-consumption-w";
60
60
  // ── Heat pump ──────────────────────────────────────────────────────────
61
- /** Whether the energy manager may steer the heat pump. */
61
+ /** Whether the energy manager may steer the heat pump. Gates {@link HeatpumpEcoModeInExpensiveTimes}. */
62
62
  EnergyManagerSettingEnum["HeatpumpControl"] = "heatpump-control";
63
+ /**
64
+ * Whether the heat pump is switched to its eco / reduced setpoint while
65
+ * electricity is expensive.
66
+ */
67
+ EnergyManagerSettingEnum["HeatpumpEcoModeInExpensiveTimes"] = "heatpump-eco-mode-in-expensive-times";
63
68
  // ── Heating rod ────────────────────────────────────────────────────────
64
69
  /** Whether the energy manager may steer the heating rod. Gates {@link HeatingRodMode}. */
65
70
  EnergyManagerSettingEnum["HeatingRodControl"] = "heating-rod-control";
@@ -235,7 +240,7 @@ export var EnergyManagerHeatingRodModeEnum;
235
240
  /**
236
241
  * Which settings are gated by which, as data.
237
242
  *
238
- * Fifteen of the nineteen settings only mean anything while another one holds a specific
243
+ * Sixteen of the twenty settings only mean anything while another one holds a specific
239
244
  * value. Encoding that here rather than in prose gives the cockpit a single
240
245
  * source of truth for greying out dependent controls, and lets
241
246
  * `validateEnergyManagerSettingsState()` flag values that can never take effect.
@@ -277,6 +282,10 @@ export const ENERGY_MANAGER_SETTING_DEPENDENCIES = {
277
282
  requires: EnergyManagerSettingEnum.BatteryControl,
278
283
  equals: true,
279
284
  },
285
+ [EnergyManagerSettingEnum.HeatpumpEcoModeInExpensiveTimes]: {
286
+ requires: EnergyManagerSettingEnum.HeatpumpControl,
287
+ equals: true,
288
+ },
280
289
  [EnergyManagerSettingEnum.HeatingRodMode]: {
281
290
  requires: EnergyManagerSettingEnum.HeatingRodControl,
282
291
  equals: true,
@@ -329,6 +338,7 @@ export const ENERGY_MANAGER_SETTING_VALUE_KEYS = {
329
338
  'batteryDischargeBlockAboveHomeConsumptionW',
330
339
  ],
331
340
  [EnergyManagerSettingEnum.HeatpumpControl]: ['heatpumpControl'],
341
+ [EnergyManagerSettingEnum.HeatpumpEcoModeInExpensiveTimes]: ['heatpumpEcoModeInExpensiveTimes'],
332
342
  [EnergyManagerSettingEnum.HeatingRodControl]: ['heatingRodControl'],
333
343
  [EnergyManagerSettingEnum.HeatingRodMode]: ['heatingRodMode'],
334
344
  [EnergyManagerSettingEnum.HeatingRodBatteryDischargeSocLimitPercent]: [
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 = "1.34.0";
8
+ export declare const SDK_VERSION = "1.35.0";
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 = '1.34.0';
8
+ export const SDK_VERSION = '1.35.0';
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": "1.34.0",
3
+ "version": "1.35.0",
4
4
  "description": "enyo Energy App SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",