Cosimulation

La cosimulation entre deux modèles nécessite l’emploi (et bien souvent le développement !) d’un logiciel middleware permettant d’homogénéiser les structures de données (notamment pour les variables échangées). L’emploi d’un standard de mise en donnée commun permet d’éviter ce problème, voici un tutoriel sur le couplage EnergyPlus/Python au format FMI réalisé par EnergyPlusToFMU (installation Windows).

Prérequis (à installer dans l’ordre) :

EnergyPlusToFMU requiert une configuration après installation. Afin d’activer l’environnement Python inclus dans JModelica, on doit alors lancer la commande suivante sur le terminal Windows :

C:\> <path-to-JModelica-install>\Python64.bat

Il est recommandé de créer un alias permanent pour l’environnement Python de JModelica. Une fois l’environnement activé, on peut alors convertir un fichier .idf en fichier .FMU grâce à la commande suivante, oujours sur le terminal Windows :

C:\> <path-to-JModelica-install>\Python64.bat <path-to-scripts-subdir>EnergyPlusToFMU.py  \
        -i <path-to-idd-file> -w <path-to-weather-file> -a <fmi-version> <path-to-idf-file>

Il est important de bien définir les variables échangées dans le fichier .idf avant sa conversion en .FMU selon la procédure renseignée dans l’ External Interface Application . Le fichier .FMU est donc prêt à interagir avec l’autre modèle (script Python, modèle équationnel JModelica, autre .FMU …).

On peut alors utiliser un IDE permettant de changer d’interpréteur Python sans problème (PyCharm est vivement conseillé) et utiliser PyFMI inclus dans la version Python de JModelica afin de lancer une cosimulation :

lancement python
Lancement de Python / JModelica

param IDE
Paramétrage IDE (PyCharm)pour le bon environnement

Et un exemple de premier script à adapter :

import os
from pymodelica import compil_fmu
from pyfmi import load_fmu
import matplotlib.pyplot as plt

# Add EnergyPLus cli script to $PATH, not neeeded if already in $PATH
os.environ['PATH'] = os.environ['PATH'] + ":/EnergyPlus-v9-4-0"

# Load `.fmu` with pyfmi
fmu_path = "<path>/<file.FMU>"
model = load_fmu(fmu=fmu_path)

# Change Input variable (default in `.idf` is given to be 6)
model.set("<variale_name>", <value>)

# Set number of communication points dependent on "final_time" and `.idf`
# steps per hour
final_time = <max_duration> # 72 jour simulation
idf_steps_per_hour = <step_length>
ncp = final_time / (3600. / idf_steps_per_hour)
opts["ncp"] = ncp

# Run simulation and return results
res = model.simulate(start_time=0., final_time=final_time, options=opts)
# Show result variables names
print(res.keys())