Skip to content

Commit a113692

Browse files
committed
adding multi-model run capabilities in gridappsd-python
1 parent 3d2beb6 commit a113692

2 files changed

Lines changed: 60 additions & 47 deletions

File tree

gridappsd-python-lib/gridappsd/simulation.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ def asdict(self):
2727
for k, v in self.__dict__.items():
2828
if isinstance(v, ConfigBase):
2929
built[k] = v.asdict()
30+
elif isinstance(v, list):
31+
built[k] = []
32+
for item in v:
33+
if isinstance(item, ConfigBase):
34+
built[k].append(item.asdict())
35+
else:
36+
built[k].append(item)
3037
else:
3138
built[k] = v
3239
return built
@@ -50,15 +57,18 @@ class ModelCreationConfig(ConfigBase):
5057
class SimulationArgs(ConfigBase):
5158
start_time: str = field(default = "1655321830")
5259
duration: str = field(default = "300")
53-
simulator: str = field(default = "GridLAB-D")
5460
timestep_frequency: str = field(default = "1000")
5561
timestep_increment: str = field(default = "1000")
5662
run_realtime: bool = field(default = True)
5763
pause_after_measurements: bool = field(default = False)
5864
simulation_name: str = field(default = "ieee13nodeckt")
59-
power_flow_solver_method: str = field(default = "NR")
65+
66+
67+
@dataclass
68+
class SimulatorArgs(ConfigBase):
69+
simulator: str = field(default = "GridLAB-D")
6070
model_creation_config: ModelCreationConfig = field(default_factory = ModelCreationConfig)
61-
71+
power_flow_solver_method: str = field(default = "NR")
6272

6373
# __default_simulation_args__ = SimulationArgs()
6474

@@ -95,11 +105,12 @@ class PowerSystemConfig(ConfigBase):
95105
Line_name: str
96106
GeographicalRegion_name: str = field(default = None)
97107
SubGeographicalRegion_name: str = field(default = None)
108+
simulator_config: SimulatorArgs = field(default_factory=SimulatorArgs)
98109

99110

100111
@dataclass
101112
class SimulationConfig(ConfigBase):
102-
power_system_config: PowerSystemConfig
113+
power_system_configs: List[PowerSystemConfig] = field(default_factory=list)
103114
application_configs: List[ApplicationConfig] = field(default_factory=list)
104115
simulation_config: SimulationArgs = field(default_factory=SimulationArgs)
105116
service_configs: List[ServiceConfig] = field(default_factory=list)
Lines changed: 45 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,45 @@
1-
# import json
2-
# # from pprint import pprint
3-
# import logging
4-
# import os
5-
# import sys
6-
# import time
7-
# import pytest
8-
9-
# logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
10-
11-
# from gridappsd import GridAPPSD, topics as t
12-
# from gridappsd.simulation import Simulation
13-
14-
# # The directory containing this file
15-
# HERE = os.path.dirname(__file__)
16-
17-
# def base_config():
18-
# data = {"power_system_config":{"SubGeographicalRegion_name":"_ABEB635F-729D-24BF-B8A4-E2EF268D8B9E","GeographicalRegion_name":"_73C512BD-7249-4F50-50DA-D93849B89C43","Line_name":"_49AD8E07-3BF9-A4E2-CB8F-C3722F837B62"},"simulation_config":{"power_flow_solver_method":"NR","duration":120,"simulation_name":"ieee13nodeckt","simulator":"GridLAB-D","start_time":1605418946,"run_realtime":False,"simulation_output":{},"model_creation_config":{"load_scaling_factor":1.0,"triplex":"y","encoding":"u","system_frequency":60,"voltage_multiplier":1.0,"power_unit_conversion":1.0,"unique_names":"y","schedule_name":"ieeezipload","z_fraction":0.0,"i_fraction":1.0,"p_fraction":0.0,"randomize_zipload_fractions":False,"use_houses":False},"simulation_broker_port":51044,"simulation_broker_location":"127.0.0.1"},"application_config":{"applications":[]},"service_configs":[],"test_config":{"randomNum":{"seed":{"value":185213303967438},"nextNextGaussian":0.0,"haveNextNextGaussian":False},"events":[],"testInput":True,"testOutput":True,"appId":"","testId":"1468836560","testType":"simulation_vs_expected","storeMatches":False},"simulation_request_type":"NEW"}
19-
# # with open("{HERE}/simulation_fixtures/13_node_2_min_base.json".format(HERE=HERE)) as fp:
20-
# # data = json.load(fp)
21-
# return data
22-
23-
# def test_simulation_no_duplicate_measurement_timestamps(gridappsd_client: GridAPPSD):
24-
# num_measurements = 0
25-
# timestamps = set()
26-
27-
# def measurement(sim, timestamp, measurement):
28-
# nonlocal num_measurements
29-
# num_measurements += 1
30-
# assert timestamp not in timestamps
31-
# timestamps.add(timestamp)
32-
33-
# gapps = gridappsd_client
34-
# sim = Simulation(gapps, base_config())
35-
# sim.add_onmeasurement_callback(measurement)
36-
# sim.start_simulation()
37-
# sim.run_loop()
38-
39-
# # did we get a measurement?
40-
# assert num_measurements > 0
41-
42-
# # if empty then we know the simulation did not work.
43-
# assert timestamps
1+
import json
2+
import logging
3+
import os
4+
import sys
5+
import time
6+
import pytest
7+
from datetime import datetime, timezone
8+
9+
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
10+
11+
from gridappsd import GridAPPSD, topics as t
12+
from gridappsd.simulation import Simulation, PowerSystemConfig, SimulationArgs, SimulationConfig
13+
14+
@pytest.fixture
15+
def createGadObject():
16+
gad_user = os.environ.get('GRIDAPPSD_USER')
17+
if gad_user is None:
18+
os.environ['GRIDAPPSD_USER'] = 'system'
19+
gad_password = os.environ.get('GRIDAPPSD_PASSWORD')
20+
if gad_password is None:
21+
os.environ['GRIDAPPSD_PASSWORD'] = 'manager'
22+
return GridAPPSD()
23+
24+
25+
def test_createSimulations(createGadObject):
26+
gadObj = createGadObject
27+
response = gadObj.query_model_info()
28+
models = response.get("data", {}).get("models", {})
29+
start_time = int(datetime(year=2025, month=1, day=1, hour=0, minute=0, second=0, microsecond=0, tzinfo=timezone.utc).timestamp())
30+
simulationArgs = SimulationArgs(start_time=f"{start_time}",
31+
duration="120",
32+
run_realtime=True,
33+
pause_after_measurements=False)
34+
sim_config = SimulationConfig(simulation_config=simulationArgs)
35+
for m in models:
36+
line_name = m.get("modelId")
37+
subregion_name = m.get("subRegionId")
38+
region_name = m.get("regionId")
39+
psc = PowerSystemConfig(Line_name=line_name,
40+
SubGeographicalRegion_name=subregion_name,
41+
GeographicalRegion_name=region_name)
42+
sim_config.power_system_configs.append(psc)
43+
sim_obj = Simulation(gapps=gadObj, run_config=sim_config)
44+
rvStr = json.dumps(sim_obj._run_config, indent=4, sort_keys=True)
45+
pass

0 commit comments

Comments
 (0)