Skip to content

Open-Building-Management/EnergyGym

Repository files navigation

Energy Gym

Environnement gym openAI pour simuler le comportement énergétique d'un bâtiment tertiaire

Pylint

documentation

le_jeu_du_chauffage_en_mode_random.webm

requirements

sudo apt-get update
sudo apt-get install --upgrade python3-pip
python3 -m pip install pip --upgrade
sudo apt-get install -y python3-numpy python3-matplotlib
python3 -m pip install click
python3 -m pip install gym
python3 -m pip install PyFina
python3 -m pip install --upgrade tensorflow

Tous les exemples utilisent l'autocomplétion en ligne de commande pour choisir le nom de l'agent

apprentissage renforcé

Les réseaux après entrainement sont enregistrés dans le répertoire TensorBoard

pour lancer tensorboard :

tensorboard --logdir=TensorBoard

Pour obtenir de l'aide sur un algorithme :

python3 dueling.py --help

scénario de type hystérésis

Ce scénario permet d'entrainer un réseau à maintenir une température constante autour d'une consigne donnée tc. C'est le réseau le plus simple, avec une espace d'observation de taille 3 : [Text, Tint, tc]

python3 standalone_d_dqn.py

Pour entraîner un agent à gérer des consignes variables de 18, 19, 20, 21 et 22°C :

numéro du flux temp. extérieure : 1
modèle : cells
scénario : Hyst
consigne moyenne de confort en °C : 20
demi-étendue en °C pour travailler à consigne variable : 2

Peu importe le modèle choisi pour l'entrainement, içi cells, le réseau obtenu fonctionnera aussi avec toutes les configurations.

scénario de type vacancy, pour entrainer à jouer une période de non-occupation

L'objectif est d'utiliser le moins d'énergie possible et d'avoir la température souhaitée à l'ouverture des locaux.

pour entrainer à modèle variable

python3 standalone_d_dqn.py --autosize_max_power=True
numéro du flux temp. extérieure ? [1]: 
modèle ou banque : synth
scénario : StepRewardVacancy
consigne moyenne de confort en °C : 20
demi-étendue en °C pour W à consigne variable : 2
nombre d'épisodes : 3000

On peut définir des coefficients de pondération personnalisés pour la récompense :

python3 standalone_d_dqn.py --autosize_max_power=True --k=1 --p_c=15 --vote_interval -1 1

Lorsqu'on joue un scénario de type vacancy, la récompense finale, attribuée à la fin de l'épisode, lorsque l'occupation du bâtiment recommence, est la somme de 2 termes :

  • l'un positif proportionnel au pourcentage d'énergie totale économisée sur l'épisode
  • l'autre négatif représentant en quelque sorte le vote à l'ouverture du bâtiment, de type hystérésis, donc proportionnel à la valeur absolue de l'écart entre la température à l'ouverture des locaux et la température de consigne

Lors des entrainements, le réseau va d'abord chercher à converger vers cette température cible pour ne pas avoir de malus, puis à maximiser l'énergie économisée.

coefficient signification
p_c pondération à appliquer sur le confort à l'ouverture
k coefficient énergétique sur la partie finale de la récompense
k_step coefficient sur la partie pas à pas de la récompense
vote_interval intervalle de température dans lequel le bonus énergétique est attribué. si vote_interval vaut (-1, 1), on attribue le bonus énergétique si et seulement si l'écart entre la température à l'ouverture des locaux et la température de consigne est compris entre -1 et 1

basicplay

La variable globale TEXT_FEED de conf.py, dont la valeur par défaut est 1, définit le numéro du flux de température extérieure. Si on utilise les données du répertoire datas, on n'a pas besoin de changer ce paramètre.

paramètre description
agent_type random = décision aléatoire
deterministic = argmax
stochastic = softmax
random_ts True = joue jusqu'à 200 épisodes
False = joue un seul épisode sur le timestamp 1609104740
scenario type d'environnement, par exemple
hyst: hysteresis
vacancy: non-occupation
reduce: hysteresis avec réduit hors occupation
size week: 8 jours
weekend: 63 heures
modelkey le nom d'une des configurations de conf.py - random pour jouer un modèle au hasard
stepbystep True = joue en mode pas à pas
tc valeur de la consigne en °C
halfrange demi-étendue en °C pour rendre la consigne variable
nbh nombre d'heures que l'on peut remonter dans l'histoire passée
nbh_forecast nombre d'heures de prévisions météo à donner à l'agent
action_space taille de l'espace d'actions

Pour un espace d'observation sans historique ni prévisions :

python3 basicplay.py

Pour un espace d'observation avec un historique de 48 heures :

python3 basicplay.py --nbh=48

jouer un hystérésis

Avec la crise climatique, les gestionnaires de bâtiments sont tentés de vouloir couper au maximum le chauffage lorsque le bâtiment n'est pas occupé.

Hors il est assez compliqué de déterminer le moment opportun pour rallumer si on veut avoir la température de confort à l'ouverture des locaux. De plus, dans le milieu des chauffagistes, on entend dire qu'on ne fait pas plus d'économie en coupant car le coût pour remonter en température est souvent équivalent à celui qu'on doit payer pour maintenir une température stable. Quant on n'a pas de capteurs de confort intérieur, pour maintenir cet hystérésis, on régule avec une loi d'eau sur la température extérieure :

water_temp = pente * (t_c - text) + t_c

t_c est la consigne de température intérieure, text la valeur de la température extérieure à l'instant t et pente la pente de la loi d'eau, souvent égale à 1.5. La formule donne la valeur de la température de l'eau à injecter dans les tuyaux. Cette recette empirique fonctionne assez bien en pratique et c'est la méthode de régulation la plus répandue depuis plusieurs dizaines d'années.

Pour en revenir à l'intérêt des coupures sur des périodes courtes, il est vrai qu'en simulateur, l'agent hystérésis n'est généralement pas plus énergivore que la politique optimale qui effectue des coupures la nuit et les week-ends. Le premier graphique concerne des modulaires mal isolés, avec un système de chauffage sous-dimensionné, le second un ensemble de bureaux tertiaires avec une isolation correcte.

C'est moins vrai lorsque le bâtiment est énergivore mais dispose d'un système de chauffage puissant (cas d'un bâtiment logistique de type hangar ou laboratoire dans lequel on a construit des petits bureaux, qui sont quasiment les seuls espaces chauffés)

Avec un pilotage au quart d'heure :

jouer des réduits de nuit et de weekend

On peut faire jouer des réduits d'inoccupation à un agent hystérésis entrainé à consigne variable :

comportement de l'agent : deterministic
timestamp de démarrage aléatoire : True
scénario ou mode de jeu : Reduce
longueur des épisodes : week
modèle : tertiaire
jouer l'épisode pas à pas : False
jouer le mirror play après avoir joué l'épisode : False
consigne moyenne de confort en °C : 20
demi-étendue en °C pour travailler à consigne variable : 2
nom du réseau : TensorBoard/DDQN/Heat_Hyst5400_200220232222_cells_GAMMA=0dot97_NBACTIONS=2_tc=20+ou-2

Par défaut la hauteur du réduit est de 2°C, c'est-à-dire que la nuit ou le week-end, on n'acceptera pas de descendre en dessous de 18°C si la température de consigne est 20°C. On peut moduler la hauteur du réduit en modifiant la valeur de la variable globale REDUCE dans conf.py

Avec cette approche, on économise de l'énergie par rapport à la stratégie optimale mais le gros inconvénient est qu'on n'a pas la température de confort à l'ouverture des locaux

play

DEPRECATED : espace d'observation de taille 4 [Text, Tint, tc*occ, nbh]

./play.py
paramètre description
text numéro du flux de température extérieure = 1
model le nom d'une des configurations de conf.py
powerlimit coefficient multiplicatif de la puissance max.
tc température de consigne
n nombre d'épisodes à jouer
0 = joue une série d'épisodes prédéfinis, on parle de snapshots
optimalpolicy politique optimale que l'environnement déterministe va jouer
intermittence = succession de périodes d'occupation et de non-occupation
occupation_permanente = bâtiment occupé en permanence - cf hopital
hystpath nom d'un agent de type hystérésis, à fournir si on veut utiliser un agent pour gérer les périodes de non-occupation et un hystéréris pour gérer les périodes de présence du personnel : ./play.py --hystpath=agents/hys20.h5
holiday nombre de jours fériés à intégrer dans les replay
silent True = production de statistiques ou de snapshots
False = affiche les épisodes à l'écran
k coefficient énergétique, utilisé dans le calcul de la récompense

A propos du modèle d'environnement

L'environnement est représenté sous la forme d'un modèle électrique équivalent simple à deux paramètres :

  • une résistance R en K/W qui représente l'isolation du bâtiment
  • une capacité C en J/K qui représente l'inertie du bâtiment

Pour en savoir plus

Pour une résistance de 1e-4 K/W, et quelle que soit l’inertie entre 4e8 et 4e9 J/K, le système de chauffage, même utilisé à fond en permanence, ne parvient pas à maintenir la température.

Pour pouvoir gérer des épisodes de froid sur des bâtiments présentant majoritairement des résistances inférieures à 2e-4 K/W, la seule solution est d’augmenter la puissance disponible.

On ne devrait toutefois pas rencontrer ce cas de figure sur le terrain si les équipements de production et les pompes sont correctement dimensionnés.

Le couple R=2e-4 K/W et C=2e8 J/K semble donc être une configuration extrême, peu probable en pratique, mais susceptible de nous donner de la matière pour bien cerner le fonctionnement de notre modèle.

comportement sous météo hivernale froide