How to create an environment
In this how-to guide, we will give some tips as to how to create your own environment (EnergyPlus or not).
-
Please read the Agent class, Environment class, and Logger class completely and carefully, otherwise you will not understand the context and meaning of what you’re building.
-
If you would like to read some source code of an already implemented environment, please read first Simple Environment since it’s the basic environment of
ICCP. Its source codeSimpleEnvironment.pymay be informative for the more involved programming details. -
If you would like to know how to implement an environment compatible with a discrete ouput agent (e.g. DQN Agent), please read the source code of
DiscreteEnvironment.py. -
If you would like to know how to implement an environment compatible with a continuous ouput agent (e.g. DDPG Agent), please read the source code of
ContinuousEnvironment.py.
Dealing with EnergyPlus FMUs
Dealing with FMUs is a tricky business as the documentation is obscure or non-existent.
Instantating / resetting the EnergyPlus FMU
Countless hours have been lost by the author trying to figure out how to reset a FMU environment without killing the Python kernel but a solution was found. Here’s how to do it.
simulation_path= absolute path where the EnergyPlus FMU can be foundmodelname= name of the FMU i.e. it must end with “.fmu”timestop= total time length of the simulation in seconds
## getting to the right place for loading
os.chdir(simulation_path)
##
model = load_fmu(modelname)
opts = model.simulate_options() # Get the default options
opts["ncp"] = numsteps # Specifies the total number of timesteps during simulation
opts["initialize"] = True
simtime = 0
## Critical steps to ensure the environment resets correctly
self.model.reset()
self.model.instantiate_slave()
self.model.initialize(simtime, timestop)
Applying action on the FMU
Here’s how to apply an action.
simtime= current simulation time in secondssecondstep= length of a single step in seconds = (total length of simulation) / (total number of steps during simulation)
## setting the HVAC setpoint temperature ("Thsetpoint_diet is defined in the idf file)
self.model.set("Thsetpoint_diet", action)
self.model.do_step(
current_t=simtime, step_size=secondstep, new_step=True
)
Getting observation / state from FMU
Here’s how to get an observation.
# here we use the list of parameters defined in Simple Environment
observation = list(model.get(["Tair","RH","Tmrt", "Tout","Qheat","Occ"]))