Implementing an Operating Strategy
Energy Management Strategies are handled by the Energy Management Systems (EMS). To implement a new strategy, additions in multiple places are necessary.
1. Adapt the EMS_model.py file and implement the operating strategy
Create a new class that is inherited from the general HEMS
class. Don’t forget to add the strategy in the valid parameter of the HEMS ABC class. You can also
inherit from subclasses of the HEMS class like HEMS_default to also be able to inherit their methods and
properties.
eelib/core/control/EMS/EMS_model.py (01/24)
290 class HEMS_default(HEMS):
291 """Default strategy for Energy Management System.
292 Should be copied and adapted for the use of a specific EMS concept.
293 """
294
295 @classmethod
296 def get_valid_parameters(cls):
297 """Returns dictionary containing valid parameter types and values.
298
299 Returns:
300 dict: valid parameters for this model
301 """
302
303 # use parent's parameter list and modify them for this class
304 result = HEMS.get_valid_parameters().copy()
305 result.update({})
306 return result
307
308 def __init__(self, eid: str, step_size: int = 900, **kwargs):
309 """Initializes the eELib HEMS default model.
310
311 Args:
312 eid (str): name of the entity to create
313 step_size (int): length of a simulation step in seconds
314 **kwargs: initial values for the HEMS entity
315
316 Raises:
317 ValueError: Error if selected strategy does not comply with model type.
318 """
319
320 # check given strategy
321 if "strategy" in kwargs.keys() and kwargs["strategy"] != "HEMS_default":
322 raise ValueError("Created a HEMS_default entity with strategy not 'HEMS_default'!")
323 else:
324 kwargs["strategy"] = "HEMS_default" # set strategy if not already given
325
326 # call init function of super HEMS class
327 super().__init__(eid=eid, step_size=step_size, **kwargs)
Add a step() function that first calls the HEMS step()
and afterward implement the functionalities of your operating strategy.
eelib/core/control/EMS/EMS_model.py (01/24)
329 def step(self, timestep):
330 """Calculates power set values for each connected component according to the strategy.
331
332 Args:
333 timestep (int): Current simulation time
334 """
335
336 # execute general processes (aggregation of power values etc.)
337 super().step(timestep)
338
339 # from here on: execute strategy-specific processes
340 ...
2. Add the strategy and its input to the model_data of the scenarios
examples/data/model_data_scenario/model_data_building.json (01/24)
1{
2 "ems": [
3 {
4 "strategy": "HEMS_default",
5 "cs_strategy": "balanced"
6 }
7 ],
8 ...
3. Add your EMS class to the model_connections/model_connect_config.json file
Add the data that is sent out…
eelib/model_connections/model_connect_config.json (01/24)
10"HEMS_default": {
11 "PVLib": [["p_set_pv", "p_set"]],
12 "BSS": [
13 [
14 "p_set_storage",
15 "p_set"
16 ]
17 ],
18 "ChargingStation": [
19 [
20 "p_set_charging_station",
21 "p_set"
22 ]
23 ],
24 "Heatpump": [
25 [
26 "p_th_set_heatpump",
27 "p_th_set"
28 ]
29 ],
30 "grid_load": [["p_balance", "p_w"], ["q_balance", "q_var"]]
31},
… but also to every model, which data is sent to your HEMS!
e.g. but not only the BSS
111"BSS": {
112 "HEMS_default": [
113 [
114 "p_discharge_max",
115 "p_min"
116 ],
117 [
118 "p_charge_max",
119 "p_max"
120 ],
121 [
122 "p",
123 "p"
124 ]
125 ],
126 ...
127},
4. Add the model with its name and (input/output) attributes to the META of the EMS_simulator
eelib/core/control/EMS/EMS_simulator.py (01/24)
14META = {
15 "type": "hybrid",
16 "models": {
50 "HEMS_default": {
51 "public": True,
52 "params": ["init_vals"],
53 "attrs": [
54 "q",
55 "p",
56 "p_max",
57 "p_min",
58 "p_set_storage",
59 "p_set_charging_station",
60 "p_set_pv",
61 "p_balance",
62 "q_balance",
63 "bss_data",
64 "pv_data",
65 "cs_data",
66 "p_th",
67 ],