@enyo-energy/energy-app-sdk 0.0.197 → 0.0.198

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
@@ -1137,7 +1137,7 @@ A closed, SDK-defined set of user-facing controls the active energy manager hono
1137
1137
  | `BatteryChargingMode` | `paced` \| `immediate` |
1138
1138
  | `BatteryChargeFromGrid` | boolean |
1139
1139
  | `BatteryDischargeWhileChargingWh` | number \| `null` (Wh allowance; `null`/unset = disabled) |
1140
- | `BlockBatteryDischargeWhileEvDischarging` | boolean |
1140
+ | `BlockBatteryDischargeWhileEvCharging` | boolean |
1141
1141
  | `HeatpumpControl` | boolean |
1142
1142
  | `HeatingRodControl` | boolean |
1143
1143
  | `HeatingRodMode` | `pv-surplus-only` \| `boost` |
@@ -118,6 +118,9 @@ function gateValue(values, setting) {
118
118
  * - `batteryDischargeWhileChargingWh` is a finite non-negative number or `null`
119
119
  * (**error**), and is not a negligible positive figure (**warning** — catches
120
120
  * a kWh value in a Wh field).
121
+ * - `blockBatteryDischargeWhileEvCharging` does not sit alongside a positive
122
+ * `batteryDischargeWhileChargingWh` budget (**warning** — the block overrides
123
+ * the budget, so it could never be spent).
121
124
  * - A value stored for an unsupported setting (**warning** — the energy manager
122
125
  * will ignore it).
123
126
  * - A value stored while its gate does not hold (**warning** — it can never take
@@ -160,7 +163,7 @@ function validateEnergyManagerSettingsState(state) {
160
163
  const values = state.values ?? {};
161
164
  // ── value formats ──────────────────────────────────────────────────────
162
165
  for (const key of ['batteryControl', 'batteryChargeFromGrid',
163
- 'blockBatteryDischargeWhileEvDischarging', 'heatpumpControl',
166
+ 'blockBatteryDischargeWhileEvCharging', 'heatpumpControl',
164
167
  'heatingRodControl', 'chargerControl']) {
165
168
  if (values[key] !== undefined && typeof values[key] !== 'boolean') {
166
169
  errors.push(`\`${key}\` must be a boolean when set.`);
@@ -203,6 +206,13 @@ function validateEnergyManagerSettingsState(state) {
203
206
  'any house battery — this field is in watt-hours, not kilowatt-hours.');
204
207
  }
205
208
  }
209
+ if (values.blockBatteryDischargeWhileEvCharging === true
210
+ && typeof values.batteryDischargeWhileChargingWh === 'number'
211
+ && values.batteryDischargeWhileChargingWh > 0) {
212
+ warnings.push('`blockBatteryDischargeWhileEvCharging` is true, which closes the tap entirely, so the ' +
213
+ `\`batteryDischargeWhileChargingWh\` budget of ${values.batteryDischargeWhileChargingWh} Wh ` +
214
+ 'can never be spent. Clear one of the two.');
215
+ }
206
216
  if (values.costOptimizedTargetTime !== undefined) {
207
217
  if (typeof values.costOptimizedTargetTime !== 'string'
208
218
  || !TIME_RE.test(values.costOptimizedTargetTime)) {
@@ -59,6 +59,9 @@ export interface EnergyManagerSettingsValidationResult {
59
59
  * - `batteryDischargeWhileChargingWh` is a finite non-negative number or `null`
60
60
  * (**error**), and is not a negligible positive figure (**warning** — catches
61
61
  * a kWh value in a Wh field).
62
+ * - `blockBatteryDischargeWhileEvCharging` does not sit alongside a positive
63
+ * `batteryDischargeWhileChargingWh` budget (**warning** — the block overrides
64
+ * the budget, so it could never be spent).
62
65
  * - A value stored for an unsupported setting (**warning** — the energy manager
63
66
  * will ignore it).
64
67
  * - A value stored while its gate does not hold (**warning** — it can never take
@@ -46,8 +46,8 @@ var EnergyManagerSettingEnum;
46
46
  EnergyManagerSettingEnum["BatteryChargeFromGrid"] = "battery-charge-from-grid";
47
47
  /** How much energy the battery may discharge into a charging vehicle, in Wh. Unset/`null` disables it. */
48
48
  EnergyManagerSettingEnum["BatteryDischargeWhileChargingWh"] = "battery-discharge-while-charging-wh";
49
- /** Whether the battery is held back while the vehicle discharges into the house (V2H/V2G). */
50
- EnergyManagerSettingEnum["BlockBatteryDischargeWhileEvDischarging"] = "block-battery-discharge-while-ev-discharging";
49
+ /** Hard block on battery discharge into a charging vehicle. Overrides any Wh allowance. */
50
+ EnergyManagerSettingEnum["BlockBatteryDischargeWhileEvCharging"] = "block-battery-discharge-while-ev-charging";
51
51
  // ── Heat pump ──────────────────────────────────────────────────────────
52
52
  /** Whether the energy manager may steer the heat pump. */
53
53
  EnergyManagerSettingEnum["HeatpumpControl"] = "heatpump-control";
@@ -135,7 +135,7 @@ exports.ENERGY_MANAGER_SETTING_DEPENDENCIES = {
135
135
  requires: EnergyManagerSettingEnum.BatteryControl,
136
136
  equals: true,
137
137
  },
138
- [EnergyManagerSettingEnum.BlockBatteryDischargeWhileEvDischarging]: {
138
+ [EnergyManagerSettingEnum.BlockBatteryDischargeWhileEvCharging]: {
139
139
  requires: EnergyManagerSettingEnum.BatteryControl,
140
140
  equals: true,
141
141
  },
@@ -168,7 +168,7 @@ exports.ENERGY_MANAGER_SETTING_VALUE_KEYS = {
168
168
  [EnergyManagerSettingEnum.BatteryChargingMode]: ['batteryChargingMode'],
169
169
  [EnergyManagerSettingEnum.BatteryChargeFromGrid]: ['batteryChargeFromGrid'],
170
170
  [EnergyManagerSettingEnum.BatteryDischargeWhileChargingWh]: ['batteryDischargeWhileChargingWh'],
171
- [EnergyManagerSettingEnum.BlockBatteryDischargeWhileEvDischarging]: ['blockBatteryDischargeWhileEvDischarging'],
171
+ [EnergyManagerSettingEnum.BlockBatteryDischargeWhileEvCharging]: ['blockBatteryDischargeWhileEvCharging'],
172
172
  [EnergyManagerSettingEnum.HeatpumpControl]: ['heatpumpControl'],
173
173
  [EnergyManagerSettingEnum.HeatingRodControl]: ['heatingRodControl'],
174
174
  [EnergyManagerSettingEnum.HeatingRodMode]: ['heatingRodMode'],
@@ -42,8 +42,8 @@ export declare enum EnergyManagerSettingEnum {
42
42
  BatteryChargeFromGrid = "battery-charge-from-grid",
43
43
  /** How much energy the battery may discharge into a charging vehicle, in Wh. Unset/`null` disables it. */
44
44
  BatteryDischargeWhileChargingWh = "battery-discharge-while-charging-wh",
45
- /** Whether the battery is held back while the vehicle discharges into the house (V2H/V2G). */
46
- BlockBatteryDischargeWhileEvDischarging = "block-battery-discharge-while-ev-discharging",
45
+ /** Hard block on battery discharge into a charging vehicle. Overrides any Wh allowance. */
46
+ BlockBatteryDischargeWhileEvCharging = "block-battery-discharge-while-ev-charging",
47
47
  /** Whether the energy manager may steer the heat pump. */
48
48
  HeatpumpControl = "heatpump-control",
49
49
  /** Whether the energy manager may steer the heating rod. Gates {@link HeatingRodMode}. */
@@ -144,27 +144,28 @@ export interface EnergyManagerSettingValues {
144
144
  */
145
145
  batteryDischargeWhileChargingWh?: number | null;
146
146
  /**
147
- * Whether the house battery is held back while the **vehicle** is
148
- * discharging into the house (V2H / V2G).
147
+ * Whether the house battery is forbidden from discharging into a vehicle
148
+ * while it charges — a hard block, regardless of any budget.
149
149
  *
150
- * The mirror image of {@link batteryDischargeWhileChargingWh}, and a
151
- * different question: that one governs energy flowing battery → car while
152
- * the car charges, this one governs what the battery does while the car is
153
- * the one supplying the house.
150
+ * **This overrides {@link batteryDischargeWhileChargingWh}.** The two govern
151
+ * the same flow at different strengths: the Wh field is a budget the energy
152
+ * manager may spend, this one closes the tap. When it is `true`, any
153
+ * allowance is ignored rather than merged, so a stored budget can never take
154
+ * effect. `validateEnergyManagerSettingsState()` warns when both are set
155
+ * that way.
154
156
  *
155
- * `true` means the car alone covers the load and the battery is preserved
156
- * for later — which is usually the point of discharging the car in the first
157
- * place. `false` lets both sources serve the house together, draining them
158
- * in parallel.
157
+ * Why both exist: the budget answers "how much", this answers "at all". A
158
+ * user who wants the battery kept for the house says so once here, and it
159
+ * keeps holding no matter what number is left over in the allowance field.
159
160
  *
160
- * Only meaningful while {@link batteryControl} is `true`, and only ever
161
- * observable on an installation whose vehicle can discharge at all — on
162
- * everything else it simply never applies.
161
+ * Only meaningful while {@link batteryControl} is `true` — an energy manager
162
+ * that may not steer the battery cannot hold it back either.
163
163
  *
164
164
  * As with every field here, `undefined` is not `false`: it means unsupported
165
- * or never chosen.
165
+ * or never chosen, while `false` is the user deciding the battery *may*
166
+ * contribute.
166
167
  */
167
- blockBatteryDischargeWhileEvDischarging?: boolean;
168
+ blockBatteryDischargeWhileEvCharging?: boolean;
168
169
  /**
169
170
  * Whether the energy manager may steer the heat pump.
170
171
  *
@@ -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.197';
12
+ exports.SDK_VERSION = '0.0.198';
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.197";
8
+ export declare const SDK_VERSION = "0.0.198";
9
9
  /**
10
10
  * Gets the current SDK version.
11
11
  * @returns The semantic version string of the SDK
@@ -59,6 +59,9 @@ export interface EnergyManagerSettingsValidationResult {
59
59
  * - `batteryDischargeWhileChargingWh` is a finite non-negative number or `null`
60
60
  * (**error**), and is not a negligible positive figure (**warning** — catches
61
61
  * a kWh value in a Wh field).
62
+ * - `blockBatteryDischargeWhileEvCharging` does not sit alongside a positive
63
+ * `batteryDischargeWhileChargingWh` budget (**warning** — the block overrides
64
+ * the budget, so it could never be spent).
62
65
  * - A value stored for an unsupported setting (**warning** — the energy manager
63
66
  * will ignore it).
64
67
  * - A value stored while its gate does not hold (**warning** — it can never take
@@ -112,6 +112,9 @@ function gateValue(values, setting) {
112
112
  * - `batteryDischargeWhileChargingWh` is a finite non-negative number or `null`
113
113
  * (**error**), and is not a negligible positive figure (**warning** — catches
114
114
  * a kWh value in a Wh field).
115
+ * - `blockBatteryDischargeWhileEvCharging` does not sit alongside a positive
116
+ * `batteryDischargeWhileChargingWh` budget (**warning** — the block overrides
117
+ * the budget, so it could never be spent).
115
118
  * - A value stored for an unsupported setting (**warning** — the energy manager
116
119
  * will ignore it).
117
120
  * - A value stored while its gate does not hold (**warning** — it can never take
@@ -154,7 +157,7 @@ export function validateEnergyManagerSettingsState(state) {
154
157
  const values = state.values ?? {};
155
158
  // ── value formats ──────────────────────────────────────────────────────
156
159
  for (const key of ['batteryControl', 'batteryChargeFromGrid',
157
- 'blockBatteryDischargeWhileEvDischarging', 'heatpumpControl',
160
+ 'blockBatteryDischargeWhileEvCharging', 'heatpumpControl',
158
161
  'heatingRodControl', 'chargerControl']) {
159
162
  if (values[key] !== undefined && typeof values[key] !== 'boolean') {
160
163
  errors.push(`\`${key}\` must be a boolean when set.`);
@@ -197,6 +200,13 @@ export function validateEnergyManagerSettingsState(state) {
197
200
  'any house battery — this field is in watt-hours, not kilowatt-hours.');
198
201
  }
199
202
  }
203
+ if (values.blockBatteryDischargeWhileEvCharging === true
204
+ && typeof values.batteryDischargeWhileChargingWh === 'number'
205
+ && values.batteryDischargeWhileChargingWh > 0) {
206
+ warnings.push('`blockBatteryDischargeWhileEvCharging` is true, which closes the tap entirely, so the ' +
207
+ `\`batteryDischargeWhileChargingWh\` budget of ${values.batteryDischargeWhileChargingWh} Wh ` +
208
+ 'can never be spent. Clear one of the two.');
209
+ }
200
210
  if (values.costOptimizedTargetTime !== undefined) {
201
211
  if (typeof values.costOptimizedTargetTime !== 'string'
202
212
  || !TIME_RE.test(values.costOptimizedTargetTime)) {
@@ -42,8 +42,8 @@ export declare enum EnergyManagerSettingEnum {
42
42
  BatteryChargeFromGrid = "battery-charge-from-grid",
43
43
  /** How much energy the battery may discharge into a charging vehicle, in Wh. Unset/`null` disables it. */
44
44
  BatteryDischargeWhileChargingWh = "battery-discharge-while-charging-wh",
45
- /** Whether the battery is held back while the vehicle discharges into the house (V2H/V2G). */
46
- BlockBatteryDischargeWhileEvDischarging = "block-battery-discharge-while-ev-discharging",
45
+ /** Hard block on battery discharge into a charging vehicle. Overrides any Wh allowance. */
46
+ BlockBatteryDischargeWhileEvCharging = "block-battery-discharge-while-ev-charging",
47
47
  /** Whether the energy manager may steer the heat pump. */
48
48
  HeatpumpControl = "heatpump-control",
49
49
  /** Whether the energy manager may steer the heating rod. Gates {@link HeatingRodMode}. */
@@ -144,27 +144,28 @@ export interface EnergyManagerSettingValues {
144
144
  */
145
145
  batteryDischargeWhileChargingWh?: number | null;
146
146
  /**
147
- * Whether the house battery is held back while the **vehicle** is
148
- * discharging into the house (V2H / V2G).
147
+ * Whether the house battery is forbidden from discharging into a vehicle
148
+ * while it charges — a hard block, regardless of any budget.
149
149
  *
150
- * The mirror image of {@link batteryDischargeWhileChargingWh}, and a
151
- * different question: that one governs energy flowing battery → car while
152
- * the car charges, this one governs what the battery does while the car is
153
- * the one supplying the house.
150
+ * **This overrides {@link batteryDischargeWhileChargingWh}.** The two govern
151
+ * the same flow at different strengths: the Wh field is a budget the energy
152
+ * manager may spend, this one closes the tap. When it is `true`, any
153
+ * allowance is ignored rather than merged, so a stored budget can never take
154
+ * effect. `validateEnergyManagerSettingsState()` warns when both are set
155
+ * that way.
154
156
  *
155
- * `true` means the car alone covers the load and the battery is preserved
156
- * for later — which is usually the point of discharging the car in the first
157
- * place. `false` lets both sources serve the house together, draining them
158
- * in parallel.
157
+ * Why both exist: the budget answers "how much", this answers "at all". A
158
+ * user who wants the battery kept for the house says so once here, and it
159
+ * keeps holding no matter what number is left over in the allowance field.
159
160
  *
160
- * Only meaningful while {@link batteryControl} is `true`, and only ever
161
- * observable on an installation whose vehicle can discharge at all — on
162
- * everything else it simply never applies.
161
+ * Only meaningful while {@link batteryControl} is `true` — an energy manager
162
+ * that may not steer the battery cannot hold it back either.
163
163
  *
164
164
  * As with every field here, `undefined` is not `false`: it means unsupported
165
- * or never chosen.
165
+ * or never chosen, while `false` is the user deciding the battery *may*
166
+ * contribute.
166
167
  */
167
- blockBatteryDischargeWhileEvDischarging?: boolean;
168
+ blockBatteryDischargeWhileEvCharging?: boolean;
168
169
  /**
169
170
  * Whether the energy manager may steer the heat pump.
170
171
  *
@@ -43,8 +43,8 @@ export var EnergyManagerSettingEnum;
43
43
  EnergyManagerSettingEnum["BatteryChargeFromGrid"] = "battery-charge-from-grid";
44
44
  /** How much energy the battery may discharge into a charging vehicle, in Wh. Unset/`null` disables it. */
45
45
  EnergyManagerSettingEnum["BatteryDischargeWhileChargingWh"] = "battery-discharge-while-charging-wh";
46
- /** Whether the battery is held back while the vehicle discharges into the house (V2H/V2G). */
47
- EnergyManagerSettingEnum["BlockBatteryDischargeWhileEvDischarging"] = "block-battery-discharge-while-ev-discharging";
46
+ /** Hard block on battery discharge into a charging vehicle. Overrides any Wh allowance. */
47
+ EnergyManagerSettingEnum["BlockBatteryDischargeWhileEvCharging"] = "block-battery-discharge-while-ev-charging";
48
48
  // ── Heat pump ──────────────────────────────────────────────────────────
49
49
  /** Whether the energy manager may steer the heat pump. */
50
50
  EnergyManagerSettingEnum["HeatpumpControl"] = "heatpump-control";
@@ -132,7 +132,7 @@ export const ENERGY_MANAGER_SETTING_DEPENDENCIES = {
132
132
  requires: EnergyManagerSettingEnum.BatteryControl,
133
133
  equals: true,
134
134
  },
135
- [EnergyManagerSettingEnum.BlockBatteryDischargeWhileEvDischarging]: {
135
+ [EnergyManagerSettingEnum.BlockBatteryDischargeWhileEvCharging]: {
136
136
  requires: EnergyManagerSettingEnum.BatteryControl,
137
137
  equals: true,
138
138
  },
@@ -165,7 +165,7 @@ export const ENERGY_MANAGER_SETTING_VALUE_KEYS = {
165
165
  [EnergyManagerSettingEnum.BatteryChargingMode]: ['batteryChargingMode'],
166
166
  [EnergyManagerSettingEnum.BatteryChargeFromGrid]: ['batteryChargeFromGrid'],
167
167
  [EnergyManagerSettingEnum.BatteryDischargeWhileChargingWh]: ['batteryDischargeWhileChargingWh'],
168
- [EnergyManagerSettingEnum.BlockBatteryDischargeWhileEvDischarging]: ['blockBatteryDischargeWhileEvDischarging'],
168
+ [EnergyManagerSettingEnum.BlockBatteryDischargeWhileEvCharging]: ['blockBatteryDischargeWhileEvCharging'],
169
169
  [EnergyManagerSettingEnum.HeatpumpControl]: ['heatpumpControl'],
170
170
  [EnergyManagerSettingEnum.HeatingRodControl]: ['heatingRodControl'],
171
171
  [EnergyManagerSettingEnum.HeatingRodMode]: ['heatingRodMode'],
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.197";
8
+ export declare const SDK_VERSION = "0.0.198";
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.197';
8
+ export const SDK_VERSION = '0.0.198';
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.197",
3
+ "version": "0.0.198",
4
4
  "description": "enyo Energy App SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",