Skip to content

Commit 817fcdd

Browse files
[DEV 3366] Added support for load/gen vMinPu and vMaxPu values, and ctPrimScalingFactor (#34)
Signed-off-by: Jimmy Tung <jimmy.tung@zepben.com> Signed-off-by: vince <vince.white@zepben.com> Co-authored-by: vince <vince.white@zepben.com>
1 parent e9696bd commit 817fcdd

File tree

4 files changed

+80
-44
lines changed

4 files changed

+80
-44
lines changed

changelog.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
# EAS Python client
22
## [0.20.0] - UNRELEASED
33
### Breaking Changes
4-
* None.
4+
* `FixedTimeLoadOverride` now takes in optional list of floats instead of optional float for its variable.
55

66
### New Features
7-
* None.
7+
* Modification to `ModelConfig` to allow more customization for model generation
8+
* Added support for separate `vMinPu` and `vMaxPu` with load and generators.
9+
* Added support for `ctPrimScalingFactor` which is required when calculating new `ctPrim` value when feeder proxy loads are not in use.
810

911
### Enhancements
1012
* None.

src/zepben/eas/client/eas_client.py

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ async def async_get_work_package_cost_estimation(self, work_package: WorkPackage
234234
]
235235
} if isinstance(config.load_time, TimePeriod) else None,
236236
"fixedTime": config.load_time and {
237-
"loadTime": config.load_time.time.isoformat(),
237+
"loadTime": config.load_time.load_time.isoformat(),
238238
"overrides": config.load_time.load_overrides and [
239239
{
240240
"loadId": key,
@@ -260,7 +260,7 @@ async def async_get_work_package_cost_estimation(self, work_package: WorkPackage
260260
for key, value in work_package.syf_config.load_time.load_overrides.items()}
261261
} if isinstance(work_package.syf_config.load_time, TimePeriod) else None,
262262
"fixedTime": work_package.syf_config.load_time and {
263-
"loadTime": work_package.syf_config.load_time.fetch_load_time.isoformat(),
263+
"loadTime": work_package.syf_config.load_time.load_time.isoformat(),
264264
"overrides": work_package.syf_config.load_time.load_overrides and {
265265
key: value.__dict__
266266
for key, value in work_package.syf_config.load_time.load_overrides.items()}
@@ -270,8 +270,10 @@ async def async_get_work_package_cost_estimation(self, work_package: WorkPackage
270270
"generatorConfig": work_package.generator_config and {
271271
"model": work_package.generator_config.model and {
272272
"vmPu": work_package.generator_config.model.vm_pu,
273-
"vMinPu": work_package.generator_config.model.vmin_pu,
274-
"vMaxPu": work_package.generator_config.model.vmax_pu,
273+
"loadVMinPu": work_package.generator_config.model.load_vmin_pu,
274+
"loadVMaxPu": work_package.generator_config.model.load_vmax_pu,
275+
"genVMinPu": work_package.generator_config.model.gen_vmin_pu,
276+
"genVMaxPu": work_package.generator_config.model.gen_vmax_pu,
275277
"loadModel": work_package.generator_config.model.load_model,
276278
"collapseSWER": work_package.generator_config.model.collapse_swer,
277279
"calibration": work_package.generator_config.model.calibration,
@@ -320,6 +322,7 @@ async def async_get_work_package_cost_estimation(self, work_package: WorkPackage
320322
"defaultLoadVar": work_package.generator_config.model.default_load_var,
321323
"defaultGenVar": work_package.generator_config.model.default_gen_var,
322324
"transformerTapSettings": work_package.generator_config.model.transformer_tap_settings,
325+
"ctPrimScalingFactor": work_package.generator_config.model.ct_prim_scaling_factor,
323326
},
324327
"solve": work_package.generator_config.solve and {
325328
"normVMinPu": work_package.generator_config.solve.norm_vmin_pu,
@@ -465,7 +468,7 @@ async def async_run_hosting_capacity_work_package(self, work_package: WorkPackag
465468
]
466469
} if isinstance(config.load_time, TimePeriod) else None,
467470
"fixedTime": config.load_time and {
468-
"loadTime": config.load_time.time.isoformat(),
471+
"loadTime": config.load_time.load_time.isoformat(),
469472
"overrides": config.load_time.load_overrides and [
470473
{
471474
"loadId": key,
@@ -491,7 +494,7 @@ async def async_run_hosting_capacity_work_package(self, work_package: WorkPackag
491494
for key, value in work_package.syf_config.load_time.load_overrides.items()}
492495
} if isinstance(work_package.syf_config.load_time, TimePeriod) else None,
493496
"fixedTime": work_package.syf_config.load_time and {
494-
"loadTime": work_package.syf_config.load_time.time.isoformat(),
497+
"loadTime": work_package.syf_config.load_time.load_time.isoformat(),
495498
"overrides": work_package.syf_config.load_time.load_overrides and {
496499
key: value.__dict__
497500
for key, value in work_package.syf_config.load_time.load_overrides.items()}
@@ -501,8 +504,10 @@ async def async_run_hosting_capacity_work_package(self, work_package: WorkPackag
501504
"generatorConfig": work_package.generator_config and {
502505
"model": work_package.generator_config.model and {
503506
"vmPu": work_package.generator_config.model.vm_pu,
504-
"vMinPu": work_package.generator_config.model.vmin_pu,
505-
"vMaxPu": work_package.generator_config.model.vmax_pu,
507+
"loadVMinPu": work_package.generator_config.model.load_vmin_pu,
508+
"loadVMaxPu": work_package.generator_config.model.load_vmax_pu,
509+
"genVMinPu": work_package.generator_config.model.gen_vmin_pu,
510+
"genVMaxPu": work_package.generator_config.model.gen_vmax_pu,
506511
"loadModel": work_package.generator_config.model.load_model,
507512
"collapseSWER": work_package.generator_config.model.collapse_swer,
508513
"calibration": work_package.generator_config.model.calibration,
@@ -550,7 +555,8 @@ async def async_run_hosting_capacity_work_package(self, work_package: WorkPackag
550555
"defaultGenWatts": work_package.generator_config.model.default_gen_watts,
551556
"defaultLoadVar": work_package.generator_config.model.default_load_var,
552557
"defaultGenVar": work_package.generator_config.model.default_gen_var,
553-
"transformerTapSettings": work_package.generator_config.model.transformer_tap_settings
558+
"transformerTapSettings": work_package.generator_config.model.transformer_tap_settings,
559+
"ctPrimScalingFactor": work_package.generator_config.model.ct_prim_scaling_factor,
554560
},
555561
"solve": work_package.generator_config.solve and {
556562
"normVMinPu": work_package.generator_config.solve.norm_vmin_pu,
@@ -1045,17 +1051,17 @@ async def async_run_opendss_export(self, config: OpenDssConfig):
10451051
},
10461052
"modulesConfiguration": {
10471053
"common": {
1048-
**({"fixedTime": {"loadTime": config.load_time.time.isoformat(),
1049-
"overrides": config.load_time.load_overrides and [
1050-
{
1051-
"loadId": key,
1052-
"loadWattsOverride": value.load_watts,
1053-
"genWattsOverride": value.gen_watts,
1054-
"loadVarOverride": value.load_var,
1055-
"genVarOverride": value.gen_var,
1056-
} for key, value in config.load_time.load_overrides.items()
1057-
]
1058-
}} if isinstance(config.load_time, FixedTime) else {}),
1054+
**({"fixedTime": {"loadTime": config.load_time.load_time.isoformat(),
1055+
"overrides": config.load_time.load_overrides and [
1056+
{
1057+
"loadId": key,
1058+
"loadWattsOverride": value.load_watts,
1059+
"genWattsOverride": value.gen_watts,
1060+
"loadVarOverride": value.load_var,
1061+
"genVarOverride": value.gen_var,
1062+
} for key, value in config.load_time.load_overrides.items()
1063+
]
1064+
}} if isinstance(config.load_time, FixedTime) else {}),
10591065
**({"timePeriod": {
10601066
"startTime": config.load_time.start_time.isoformat(),
10611067
"endTime": config.load_time.end_time.isoformat(),
@@ -1073,8 +1079,10 @@ async def async_run_opendss_export(self, config: OpenDssConfig):
10731079
**({"generator": {
10741080
**({"model": {
10751081
"vmPu": config.generator_config.model.vm_pu,
1076-
"vMinPu": config.generator_config.model.vmin_pu,
1077-
"vMaxPu": config.generator_config.model.vmax_pu,
1082+
"loadVMinPu": config.generator_config.model.load_vmin_pu,
1083+
"loadVMaxPu": config.generator_config.model.load_vmax_pu,
1084+
"genVMinPu": config.generator_config.model.gen_vmin_pu,
1085+
"genVMaxPu": config.generator_config.model.gen_vmax_pu,
10781086
"loadModel": config.generator_config.model.load_model,
10791087
"collapseSWER": config.generator_config.model.collapse_swer,
10801088
"calibration": config.generator_config.model.calibration,
@@ -1122,7 +1130,8 @@ async def async_run_opendss_export(self, config: OpenDssConfig):
11221130
"defaultGenWatts": config.generator_config.model.default_gen_watts,
11231131
"defaultLoadVar": config.generator_config.model.default_load_var,
11241132
"defaultGenVar": config.generator_config.model.default_gen_var,
1125-
"transformerTapSettings": config.generator_config.model.transformer_tap_settings
1133+
"transformerTapSettings": config.generator_config.model.transformer_tap_settings,
1134+
"ctPrimScalingFactor": config.generator_config.model.ct_prim_scaling_factor,
11261135
}} if config.generator_config.model else {}),
11271136
**({"solve": {
11281137
"normVMinPu": config.generator_config.solve.norm_vmin_pu,
@@ -1246,8 +1255,10 @@ async def async_get_paged_opendss_models(
12461255
generator {
12471256
model {
12481257
vmPu
1249-
vMinPu
1250-
vMaxPu
1258+
loadVMinPu
1259+
loadVMaxPu
1260+
genVMinPu
1261+
genVMaxPu
12511262
loadModel
12521263
collapseSWER
12531264
calibration
@@ -1293,6 +1304,7 @@ async def async_get_paged_opendss_models(
12931304
defaultLoadVar
12941305
defaultGenVar
12951306
transformerTapSettings
1307+
ctPrimScalingFactor
12961308
}
12971309
solve {
12981310
normVMinPu

src/zepben/eas/client/work_package.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ class FixedTime:
145145
present for the provided time in the load database for accurate results.
146146
"""
147147

148-
def __init__(self, time: datetime, load_overrides: Optional[Dict[str, FixedTimeLoadOverride]] = None):
149-
self.time = time.replace(tzinfo=None)
148+
def __init__(self, load_time: datetime, load_overrides: Optional[Dict[str, FixedTimeLoadOverride]] = None):
149+
self.load_time = load_time.replace(tzinfo=None)
150150
self.load_overrides = load_overrides
151151

152152

@@ -212,17 +212,25 @@ class ModelConfig:
212212
vm_pu: Optional[float] = None
213213
"""Voltage per-unit of voltage source."""
214214

215-
vmin_pu: Optional[float] = None
215+
load_vmin_pu: Optional[float] = None
216216
"""
217-
Minimum per unit voltage for which the load model selected and generator model is assumed to apply. Below this value, the load/gen model reverts to a
218-
constant impedance model. For generator model used, this is used to determine the upper current limit. For example, if Vminpu is 0.90 then the current
219-
limit is (1/0.90) = 111%.
217+
Minimum per unit voltage for which the load model selected is assumed to apply. Below this value, the load model reverts to a constant impedance model.
220218
"""
221219

222-
vmax_pu: Optional[float] = None
220+
load_vmax_pu: Optional[float] = None
223221
"""
224-
Maximum per unit voltage for which the load model selected and generator model is assumed to apply. Above this value, the load/gen model reverts to a
225-
constant impedance model.
222+
Maximum per unit voltage for which the load model selected is assumed to apply. Above this value, the load model reverts to a constant impedance model.
223+
"""
224+
225+
gen_vmin_pu: Optional[float] = None
226+
"""
227+
Minimum per unit voltage for which the generator model is assumed to apply. Below this value, the gen model reverts to a constant impedance model.
228+
For generator model used, this is used to determine the upper current limit. For example, if Vminpu is 0.90 then the current limit is (1/0.90) = 111%.
229+
"""
230+
231+
gen_vmax_pu: Optional[float] = None
232+
"""
233+
Maximum per unit voltage for which the generator model is assumed to apply. Above this value, the gen model reverts to a constant impedance model.
226234
"""
227235

228236
load_model: Optional[int] = None
@@ -438,6 +446,11 @@ class ModelConfig:
438446
The name of the set of distribution transformer tap settings to be applied to the model from an external source.
439447
"""
440448

449+
ct_prim_scaling_factor: Optional[float] = None
450+
"""
451+
Optional setting for scaling factor of calculated CTPrim for zone sub transformers.
452+
"""
453+
441454

442455
class SolveMode(Enum):
443456
YEARLY = "YEARLY"

test/test_eas_client.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -805,8 +805,10 @@ def run_opendss_export_request_handler(request):
805805
"generator": {
806806
"model": {
807807
"vmPu": 1.0,
808-
"vMinPu": 0.80,
809-
"vMaxPu": 1.15,
808+
"loadVMinPu": 0.80,
809+
"loadVMaxPu": 1.15,
810+
"genVMinPu": 0.50,
811+
"genVMaxPu": 2.00,
810812
"loadModel": 1,
811813
"collapseSWER": False,
812814
"calibration": False,
@@ -861,7 +863,8 @@ def run_opendss_export_request_handler(request):
861863
"defaultGenWatts": [50.0, 150.0, 250.0],
862864
"defaultLoadVar": [10.0, 20.0, 30.0],
863865
"defaultGenVar": [5.0, 15.0, 25.0],
864-
"transformerTapSettings": "tap-3"
866+
"transformerTapSettings": "tap-3",
867+
"ctPrimScalingFactor": 2.0
865868
},
866869
"solve": {
867870
"normVMinPu": 0.9,
@@ -904,8 +907,10 @@ def run_opendss_export_request_handler(request):
904907
generator_config=GeneratorConfig(
905908
ModelConfig(
906909
vm_pu=1.0,
907-
vmin_pu=0.80,
908-
vmax_pu=1.15,
910+
load_vmin_pu=0.80,
911+
load_vmax_pu=1.15,
912+
gen_vmin_pu=0.50,
913+
gen_vmax_pu=2.00,
909914
load_model=1,
910915
collapse_swer=False,
911916
calibration=False,
@@ -954,7 +959,8 @@ def run_opendss_export_request_handler(request):
954959
default_gen_watts=[50.0, 150.0, 250.0],
955960
default_load_var=[10.0, 20.0, 30.0],
956961
default_gen_var=[5.0, 15.0, 25.0],
957-
transformer_tap_settings="tap-3"
962+
transformer_tap_settings="tap-3",
963+
ct_prim_scaling_factor=2.0
958964
),
959965
SolveConfig(
960966
norm_vmin_pu=0.9,
@@ -1070,8 +1076,10 @@ def test_run_opendss_export_valid_certificate_success(ca: trustme.CA, httpserver
10701076
generator {
10711077
model {
10721078
vmPu
1073-
vMinPu
1074-
vMaxPu
1079+
loadVMinPu
1080+
loadVMaxPu
1081+
genVMinPu
1082+
genVMaxPu
10751083
loadModel
10761084
collapseSWER
10771085
calibration
@@ -1117,6 +1125,7 @@ def test_run_opendss_export_valid_certificate_success(ca: trustme.CA, httpserver
11171125
defaultLoadVar
11181126
defaultGenVar
11191127
transformerTapSettings
1128+
ctPrimScalingFactor
11201129
}
11211130
solve {
11221131
normVMinPu

0 commit comments

Comments
 (0)