Integration with Co-simulation Frameworks

Once you have created your simulator, we provide a simple adaptor API to some other cosimulation frameworks.

Mosaik integration

Available in a next release: mosaik is an API that performs coordinated simulation of Smart Grid scenario.

You can access the GitHub repository of mosaik-demod to get the source code and see a demo of usage.

The following instructions explain how to install the mosaik-demod adapters and how to incorporate demod simulator into mosaik.

  1. Install the python library providing the adaptors

    pip install mosaikdemod
    

2. Import the abstract adapter. If the demod simulator simulates various households, use the Household module. For a single value simulated (ex. climate), use The SingleValue module.

from mosaikdemod.adaptors import AbstractHouseholdsModule
from mosaikdemod.adaptors import AbstractSingleValueModule
  1. import demod library

import demod
  1. Inherit from the abstract module

class ComponentSimulator(AbstractHouseholdsModule):
  1. Specify the attributes of the simulator that can be accessed

attributes_dict = {
    'attr_name_in_mosaik': 'get_demod_getter',
    'other__attr': 'get_smth_else',
    ...
}
  1. Specify the inputs of the simulator that can be accessed

step_inputs_dict = {
    'attr_name_in_mosaik': 'step_input_demod',
    'other_input': 'input_other',
    ...
}
  1. Override the __init__() method

def __init__(
    self,
    # Name of what is simulated used for mosaik instances
    simulated_component='CompName',
    # The simulator class you want to simulate
    default_simulator=demod.simulators.example_simulators.ExampleSimulator,
    # The mosaik step size (depend on your definition)
    step_size=60
):
    super().__init__(simulated_component, default_simulator, step_size)
  1. Import your simulator to your mosaik scenario script.

# Define the Simulator
sim_config = {
    ...
    'CompNameSimulator': {
        'python': 'python_file_of_the_sim:ComponentSimulator',
    },
    ...
}

# Instantiate the simulator
sim = world.start('CompNameSimulator')


# Instantiate the households with parameters
component = actsim.HouseholdsGroupCompName(
    inputs_params={  # demod init params of sim
        'n_households': n_households,
        'start_datetime': START_DATETIME,
        ...
    }
)
# OR instantiate a  SingleValue simulator (remove HouseholdsGroup)
component = actsim.CompName(
    inputs_params={  # demod init params of sim
        'start_datetime': START_DATETIME,
        ...
    }
)

8. Connect the simulators. You can connect a whole household group to another one if you use 2 demod components. Or you can also connect all the households individually by calling the children method

# Connect 2 demod components
# comp1 passes attr to comp2
world.connect(component1, component2, 'attr_name_in_mosaik')

# Connect 2 demod components with single value
# component_single_value passes attr to comp2
world.connect(component_single_value, component2, 'attr_name_in_mosaik')

# Connect a single household using the children
world.connect(component.children[42], other_mosaik_comp, 'attr_name_in_mosaik')

We recommend that you check the example files available at demo.py and simulator_mosaik_modular.py .