Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

environment.add_microgrid() is now the only way to create new microgrids #176

Merged
merged 1 commit into from
Feb 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ Vessim allows you to simulate energy systems next to real or simulated computing
```python
from vessim.actor import ComputingSystem, Generator
from vessim.controller import Monitor
from vessim.cosim import Environment, Microgrid
from vessim.cosim import Environment
from vessim.power_meter import MockPowerMeter
from vessim.signal import HistoricalSignal
from vessim.storage import SimpleBattery

environment = Environment(sim_start="15-06-2022")

monitor = Monitor()
microgrid = Microgrid(
environment.add_microgrid(
actors=[
ComputingSystem(power_meters=[MockPowerMeter(p=100)]),
Generator(signal=HistoricalSignal.from_dataset("solcast2022_global")),
Expand All @@ -31,7 +31,6 @@ microgrid = Microgrid(
storage=SimpleBattery(capacity=100),
step_size=60,
)
environment.add_microgrid(microgrid)

environment.run(until=24 * 3600) # 24h
monitor.to_csv("result.csv")
Expand Down
5 changes: 2 additions & 3 deletions examples/basic_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@

def main(result_csv: str):
environment = Environment(sim_start=SIM_START)

monitor = Monitor() # stores simulation result on each step
microgrid = Microgrid(
environment.add_microgrid(
actors=[
ComputingSystem(power_meters=[
MockPowerMeter(p=2.194),
Expand All @@ -23,10 +24,8 @@ def main(result_csv: str):
],
controllers=[monitor],
storage=SimpleBattery(capacity=100),
zone="DE",
step_size=60, # global step size (can be overridden by actors or controllers)
)
environment.add_microgrid(microgrid)

environment.run(until=DURATION)
monitor.to_csv(result_csv)
Expand Down
9 changes: 5 additions & 4 deletions examples/controller_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,10 @@ def main(result_csv: str):
battery=battery,
policy=POLICY,
carbon_signal=ci_signal,
zone="DE",
)

microgrid = Microgrid(
environment.add_microgrid(
actors=[
ComputingSystem(power_meters=power_meters),
Generator(signal=HistoricalSignal(load_solar_data(sqm=0.4 * 0.5))),
Expand All @@ -47,19 +48,19 @@ def main(result_csv: str):
controllers=[monitor, carbon_aware_controller],
step_size=60, # global step size (can be overridden by actors or controllers)
)
environment.add_microgrid(microgrid)

environment.run(until=DURATION)
monitor.to_csv(result_csv)


class CarbonAwareController(Controller):
def __init__(self, power_meters, battery, policy, carbon_signal, step_size=None):
def __init__(self, power_meters, battery, policy, carbon_signal, zone: str, step_size=None):
super().__init__(step_size)
self.power_meters = power_meters
self.battery = battery
self.policy = policy
self.carbon_signal = carbon_signal
self.zone = zone

self.microgrid: Optional["Microgrid"] = None
self.clock: Optional[Clock] = None
Expand All @@ -70,7 +71,7 @@ def step(self, time: int, p_delta: float, actor_infos: dict):
time=time,
battery_soc=self.battery.soc(),
ci=self.carbon_signal.at(
self.clock.to_datetime(time), self.microgrid.zone
self.clock.to_datetime(time), self.zone
),
node_names=[node.name for node in self.power_meters],
)
Expand Down
3 changes: 1 addition & 2 deletions examples/sil_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def main(result_csv: str):
ComputeNode(name="raspi", address=RASPI_ADDRESS),
],
)
microgrid = Microgrid(
environment.add_microgrid(
actors=[
ComputingSystem(power_meters=power_meters),
Generator(signal=HistoricalSignal(load_solar_data(sqm=0.4 * 0.5))),
Expand All @@ -61,7 +61,6 @@ def main(result_csv: str):
controllers=[monitor, carbon_aware_controller],
step_size=60, # global step size (can be overridden by actors or controllers)
)
environment.add_microgrid(microgrid)

environment.run(until=DURATION, rt_factor=RT_FACTOR, print_progress=False)
monitor.to_csv(result_csv)
Expand Down
49 changes: 32 additions & 17 deletions vessim/cosim.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@
class Microgrid:
def __init__(
self,
actors: Optional[list[Actor]] = None,
controllers: Optional[list[Controller]] = None,
world: mosaik.World,
clock: Clock,
actors: list[Actor],
controllers: list[Controller],
storage: Optional[Storage] = None,
storage_policy: Optional[StoragePolicy] = None,
step_size: int = 1, # global default
Expand All @@ -28,23 +30,21 @@ def __init__(
self.storage_policy = storage_policy
self.step_size = step_size

def initialize(self, world: mosaik.World, clock: Clock):
"""Create co-simulation entities and connect them to world."""
grid_sim = world.start("Grid")
grid_entity = grid_sim.Grid(storage=self.storage, policy=self.storage_policy)
grid_entity = grid_sim.Grid(storage=storage, policy=storage_policy)

actor_names_and_entities = []
for actor in self.actors:
step_size = actor.step_size if actor.step_size else self.step_size
actor_sim = world.start("Actor", clock=clock, step_size=step_size)
for actor in actors:
actor_step_size = actor.step_size if actor.step_size else step_size
actor_sim = world.start("Actor", clock=clock, step_size=actor_step_size)
actor_entity = actor_sim.Actor(actor=actor)
world.connect(actor_entity, grid_entity, "p")
actor_names_and_entities.append((actor.name, actor_entity))

for controller in self.controllers:
for controller in controllers:
controller.start(self, clock)
step_size = controller.step_size if controller.step_size else self.step_size
controller_sim = world.start("Controller", step_size=step_size)
controller_step_size = controller.step_size if controller.step_size else step_size
controller_sim = world.start("Controller", step_size=controller_step_size)
controller_entity = controller_sim.Controller(controller=controller)
world.connect(grid_entity, controller_entity, "p_delta")
for actor_name, actor_entity in actor_names_and_entities:
Expand Down Expand Up @@ -82,22 +82,37 @@ class Environment:
def __init__(self, sim_start):
self.clock = Clock(sim_start)
self.microgrids = []
self.world = mosaik.World(self.COSIM_CONFIG) # type: ignore
self.world = mosaik.World(self.COSIM_CONFIG) # type: ignore

def add_microgrid(self, microgrid: Microgrid):
def add_microgrid(
self,
actors: Optional[list[Actor]] = None,
controllers: Optional[list[Controller]] = None,
storage: Optional[Storage] = None,
storage_policy: Optional[StoragePolicy] = None,
step_size: int = 1, # global default
):
microgrid = Microgrid(
self.world,
self.clock,
actors if actors is not None else [],
controllers if controllers is not None else [],
storage,
storage_policy,
step_size
)
self.microgrids.append(microgrid)
return microgrid

def run(
self,
until: Optional[int] = None,
rt_factor: Optional[float] = None,
print_progress: bool | Literal["individual"] = True,
):
if until is None:
until = int("inf")
try:
for microgrid in self.microgrids:
microgrid.initialize(self.world, self.clock)
if until is None:
until = int("inf")
self.world.run(
until=until, rt_factor=rt_factor, print_progress=print_progress
)
Expand Down
Loading