Skip to content
Snippets Groups Projects
Commit 24391e29 authored by Tobias Spratte's avatar Tobias Spratte
Browse files

Umstrukturierung

parent 08fcf3f4
Branches
No related tags found
No related merge requests found
Showing
with 7 additions and 842 deletions
...@@ -10,3 +10,9 @@ ...@@ -10,3 +10,9 @@
[submodule "01_Input/Vorlagen/MPC Minimalbeispiele"] [submodule "01_Input/Vorlagen/MPC Minimalbeispiele"]
path = 01_Input/Vorlagen/MPC Minimalbeispiele path = 01_Input/Vorlagen/MPC Minimalbeispiele
url = https://git-ce.rwth-aachen.de/ebc/ebc-general/controls/mpc-tool-examples.git url = https://git-ce.rwth-aachen.de/ebc/ebc-general/controls/mpc-tool-examples.git
[submodule "MA Konrad"]
path = MA Konrad
url = https://git-ce.rwth-aachen.de/ebc/projects/GGE_EBC0002_BMWi_MPCGeothermie_/data-driven-model-predictive-control.git
[submodule "01_Input/MA Konrad"]
path = 01_Input/MA Konrad
url = https://git-ce.rwth-aachen.de/ebc/projects/GGE_EBC0002_BMWi_MPCGeothermie_/data-driven-model-predictive-control.git
Subproject commit 959391878e07bdeb38847897bdf8ccbd81665f29
# Data Driven Model Predictive Control - DDMPC
Framework for creating and investigating data-driven model predictive controllers.
------------
**ann_ddmpc:** Base framework and some examples for ANN based data-driven MPC
**gpr_ddmpc:** gaussian process based ddmpc, framework needs to be adapted to ann_ddmpc framework
**lsi_ddmpc:** base example for the use of linear system identification
**vdp_example:** proof of concept for ann-based ddmpc for a van der pol oscillator
import requests
from urllib.parse import urljoin
import pandas as pd
import numpy as np
url = "http://134.130.166.203:5000"
""" Get Properties: """
name = requests.get(url=urljoin(url,'name')).json()
inputs_meta = requests.get(url=urljoin(url,'inputs')).json()
measurements_meta = requests.get(url=urljoin(url,'measurements')).json()
""" Initialize: """
init_params = {'start_time': 8*24*3600,
'warmup_period': 7*24*3600}
meas_dict = requests.put(url=urljoin(url, 'initialize'), data=init_params).json()
step_size = requests.get(url=urljoin(url, 'step')).json()
print(step_size)
new_step_size = {'step': 900}
requests.put(url=urljoin(url,'step'),data=new_step_size)
# Setting a scenario resets the simulation to a given start time,
# also a predefined duration will be passed
scenario = {'electricity_price': 'dynamic',
'time_period': 'peak_heat_day'}
scenario_return = requests.put(urljoin(url, 'scenario'), data=scenario).json()
""" Set Forecast parameters and get forecast"""
forecast_param = requests.get(urljoin(url, 'forecast_parameters')).json()
new_forecast_param = {'horizon': 32*900,
'interval': 900}
requests.put(urljoin(url, 'forecast_parameters'),data=new_forecast_param)
print(requests.get(urljoin(url, 'forecast_parameters')).json())
forecast = requests.get(urljoin(url, 'forecast')).json()
forecast_pd = pd.DataFrame(data=forecast)
""" Set Inputs and Advance"""
inputs={'oveHeaPumY_u':0.5}
y=requests.post(urljoin(url, 'advance'),inputs).json()
""" get results and KPIs"""
res_req = {'point_name': 'oveHeaPumY_u',
'start_time': -np.inf,
'final_time': np.inf}
res = requests.put(url=urljoin(url,'results'),data=res_req).json()
kpis = requests.get(url= urljoin(url,'kpi')).json()
import requests
url = "http://134.130.166.203:80"
testcase = 'bestest_hydronic_heat_pump'
testid=requests.post('{0}/testcases/{1}/select'.format(url,testcase)).json()['testid']
name = requests.get('{0}/name/{1}'.format(url, testid)).json()
from Examples.ashrae140_900_set_point_ctrl_predicting_energy_consumption.configuration import *
# PID controller for the BKT
BKT_PID = PID(
y=TAirRoom,
u=Q_flowTabs,
dt=60*15,
Kp=1,
Ti=600,
Td=0,
)
# PID controller for the AHU
AHU_PID = PID(
y=TAirRoom,
u=TsetAHU,
dt=60 * 15,
Kp=1,
Ti=600,
Td=0,
)
ThermalZone_Simulator.plotter.sub_folder_name = 'pid'
ThermalZone_FMU.setup(start_time=0)
ThermalZone_DataContainer = ThermalZone_Simulator.run(controllers=(AHU_PID, BKT_PID),
duration=60 * 60 * 24 * 6)
ThermalZone_DataContainers = ThermalZone_DataContainer.split_container(training_share=0.8,testing_share=0.1,validating_share=0.1)
ThermalZone_DataHandler = DataHandler(containers=ThermalZone_DataContainers)
ThermalZone_DataHandler.save(pid_DataHandler_name, override=True)
from Examples.ashrae140_900_set_point_ctrl_predicting_energy_consumption.configuration import *
ThermalZone_DataHandler = load_DataHandler(pid_DataHandler_name)
containers = load_DataHandler(pid_DataHandler_name).containers
# ----------------------------------- TAirRoom NetworkTrainer -----------------------------------
TAirRoom_NetworkTrainer = NetworkTrainer(
inputs=(
# disturbances
Input(feature=dry_bul, lag=2),
Input(feature=rad_dir, lag=1),
Input(feature=daily_sin, lag=2),
Input(feature=daily_cos, lag=2),
Input(feature=weekly_sin, lag=2),
Input(feature=weekly_cos, lag=2),
# Stellgrößen
Input(feature=Q_flowTabs, lag=6),
Input(feature=TsetAHU, lag=2),
# T air room
Input(feature=TAirRoom, lag=6),
),
output=Output(feature=d_TAirRoom),
step_size=60*15
)
TAirRoom_NetworkTrainer.load_data(containers=containers)
TAirRoom_NetworkTrainer.tune(layer_range=(1,), neurons_range=(8, 16), trials=10, epochs=500, batch_size=100)
TAirRoom_NetworkTrainer.save(d_TAirRoom_NetworkTrainer_name, override=True)
# ----------------------------------- Q_flowAHU NetworkTrainer -----------------------------------
Q_flowAhu_NetworkTrainer = NetworkTrainer(
inputs=(
# AHU
Input(feature=TAirRoom, lag=2),
Input(feature=TsetAHU, lag=2),
Input(feature=dry_bul, lag=2),
),
output=Output(feature=Q_flowAhu),
step_size=60*15
)
Q_flowAhu_NetworkTrainer.clear_data()
Q_flowAhu_NetworkTrainer.load_data(containers=containers)
Q_flowAhu_NetworkTrainer.tune(layer_range=(1,), neurons_range=(4, 8), trials=10, epochs=500, batch_size=100)
Q_flowAhu_NetworkTrainer.save(Q_flowAHU_NetworkTrainer_name, override=True)
from Examples.ashrae140_900_set_point_ctrl_predicting_energy_consumption.configuration import *
# load ann1
TAirRoom_NetworkTrainer = load_NetworkTrainer(d_TAirRoom_NetworkTrainer_name)
TAirRoom_NetworkTrainer.load_best_ann(loc=0)
# load ann2
Q_flowAhu_NetworkTrainer = load_NetworkTrainer(Q_flowAHU_NetworkTrainer_name)
Q_flowAhu_NetworkTrainer.load_best_ann(loc=0)
TAirRoom.mode = 'economic'
ThermalZone_MPC = ModelPredictive(
dt=60*15,
N=32,
objectives=(
Objective(feature=TAirRoom, weight=500, k_0_offset=1),
Objective(feature=Q_flowTabs, weight=1, norm=5, k_N_offset=-1),
Objective(feature=d_Q_flowTabs, weight=2, norm=5, k_N_offset=-1),
Objective(feature=Q_flowAhu, weight=1, norm=5, k_N_offset=-1),
Objective(feature=d_TsetAHU, weight=2, norm=5, k_N_offset=-1),
),
constraints=(
Constraint(features=(Q_flowTabs,), lb=-5, ub=5, k_N_offset=-1),
Constraint(features=(TsetAHU,), lb=273.15 + 18, ub=273.15 + 25, k_N_offset=-1),
),
model=ThermalZone_Model,
disturbances_df=ThermalZone_FMU.load_disturbances(),
network_trainers=(TAirRoom_NetworkTrainer, Q_flowAhu_NetworkTrainer),
solver_options= {'verbose': False,
'ipopt': {'print_level': 2,
'linear_solver': 'ma57'}}
)
ThermalZone_Simulator.plotter.sub_folder_name = 'online_mpc'
ThermalZone_FMU.setup(start_time=60*60*24*0)
ThermalZone_MPC_DataHandler = DataHandler()
# online mpc loop
for repetition in range(3):
# run mpc and add to DataHandler
ThermalZone_DataContainer = ThermalZone_Simulator.run(
controllers=(ThermalZone_MPC,),
duration=60 * 60 * 24 * 3,
)
# split data into training, testing and validating
ThermalZone_DataContainers = ThermalZone_DataContainer.split_container(testing_share=0.15,training_share=0.7,validating_share=0.15)
ThermalZone_MPC_DataHandler.add_containers(ThermalZone_DataContainers)
# online learning
ThermalZone_Simulator.retrain_anns(
containers=ThermalZone_DataContainers,
network_trainer=TAirRoom_NetworkTrainer,
epochs=500,
batch_size=250,
clear_data=False,
)
ThermalZone_Simulator.retrain_anns(
containers=ThermalZone_DataContainers,
network_trainer=Q_flowAhu_NetworkTrainer,
epochs=500,
batch_size=250,
clear_data=False,
)
ThermalZone_MPC.reinitialize_mpc = True
ThermalZone_MPC_DataHandler.save(MPC_DataHandler_name, override=True)
from Examples.ashrae140_900_set_point_ctrl_predicting_energy_consumption.configuration import *
TAirRoom_DataHandler_online = load_DataHandler(MPC_DataHandler_name)
complete_df_online = DataContainer.merge_containers(TAirRoom_DataHandler_online.containers)
# comparison of online and offline learning
complete_df_online = abs(complete_df_online.rolling(window=4*6*24*7, center=False).mean())
plt.plot(complete_df_online['TAirRoom error_bounds'], color=fmt.red, label='TAirRoom error_bounds mean online')
plt.legend()
plt.show()
# exit()
TAirRoom_NetworkTrainer = load_NetworkTrainer('d_TAirRoom')
TAirRoom_NetworkTrainer.evaluate_data(containers=TAirRoom_DataHandler_online.containers)
import numpy as np
import pandas as pd
from ddmpc.controller import *
from ddmpc.modeling import *
from ddmpc.utils import *
# ---------------------------------------------- names -----------------------------------------------
pid_DataHandler_name = 'ThermalZone_PID_Data'
d_TAirRoom_NetworkTrainer_name = 'd_TAirRoom_NetworkTrainer'
Q_flowAHU_NetworkTrainer_name = 'Q_flowAHU_NetworkTrainer'
MPC_DataHandler_name = "Online_Learning_MPC"
# -------------------------------------------- FEATURES --------------------------------------------
time = Time(dis_name='Simulation Time', var_name='SimTime')
dry_bul = Temperature(dis_name='Außentemperatur', var_name='weaBus.TDryBul', plt_opts=PlotOptions(color=blue, line=line_solid, label='Außentemperatur'))
rad_dif = Radiation(dis_name='Horizontale diffuse Strahlung', var_name='weaBus.HDifHor', plt_opts=PlotOptions(color=light_red, line=line_solid, label='Strahlung'))
rad_dir = Radiation(dis_name='Direkte normale Strahlung', var_name='weaBus.HDirNor', plt_opts=PlotOptions(color=red, line=line_dashdot, label=''))
rad_glo = Radiation(dis_name='Horizontale globale Strahlung', var_name='weaBus.HGloHor', plt_opts=PlotOptions(color=dark_red, line=line_dotted, label=''))
int_gain_human = Percentage(dis_name='Personen', var_name='internalGains.y[1]', plt_opts=PlotOptions(color=light_grey, line=line_solid, label='Interne Gewinne'))
int_gain_elect = Percentage(dis_name='Verbraucher', var_name='internalGains.y[2]', plt_opts=PlotOptions(color=grey, line=line_dashdot, label=''))
int_gain_light = Percentage(dis_name='Licht', var_name='internalGains.y[3]', plt_opts=PlotOptions(color=dark_grey, line=line_dotted, label=''))
Q_flowTabs = HeatFlowSetPoint(dis_name='Wärmestrom', var_name='QFlowTabsSet', lb=-5, ub=5, plt_opts=PlotOptions(color=red, line=fmt.line_solid))
d_Q_flowTabs = Change(base_feature=Q_flowTabs)
d_d_Q_flowTabs = Change(base_feature=d_Q_flowTabs)
Q_flowCold = HeatFlowMeas(dis_name='Wärmestrom_kalt', var_name='QFlowCold', plt_opts=PlotOptions(color=red, line=fmt.line_solid))
Q_flowHot = HeatFlowMeas(dis_name='Wärmestrom_warm', var_name='QFlowHeat', plt_opts=PlotOptions(color=red, line=fmt.line_solid))
TsetAHU = TemperatureSetPoint(dis_name='Tsoll AHU', var_name='TAhuSet', lb=290.15, ub=299.15,default=290, plt_opts=PlotOptions(color=red, line=fmt.line_solid))
d_TsetAHU = Change(base_feature=TsetAHU)
d_d_TsetAHU = Change(base_feature=d_TsetAHU)
TsetAHU_movsum = MovingSum(base_feature=TsetAHU, n=3)
d_TsetAHU_movsum = MovingSum(base_feature=TsetAHU, n=2)
TAirRoom = Controlled(
dis_name='Raumlufttemperatur',
var_name='TAirRoom',
mode='random',
plt_opts=PlotOptions(color=red, line=line_solid),
day_start=8,
day_end=18,
day_target=295.15,
day_lb=294.15,
day_ub=296.15,
night_lb=290.15,
night_ub=300.15,
night_target=295.15
)
TAirIn = Temperature(dis_name='Einlasstemperatur', var_name='Bus.ahuBus.TSupAirMea')
TsetAHU_minus_dry_bul = Subtraction(base_feature_one=TsetAHU, base_feature_two=dry_bul)
d_TsetAHU_minus_dry_bul = Change(base_feature=TsetAHU_minus_dry_bul)
TsetAHU_minus_TAirRoom = Subtraction(base_feature_one=TsetAHU, base_feature_two=TAirRoom)
d_TsetAHU_minus_TAirRoom = Change(base_feature=TsetAHU_minus_TAirRoom)
dry_bul_minus_TAirRoom = Subtraction(base_feature_one=dry_bul, base_feature_two=TAirRoom)
d_dry_bul_minus_TAirRoom = Change(base_feature=dry_bul_minus_TAirRoom)
d_dry_bul = Change(base_feature=dry_bul)
d_rad_dir = Change(base_feature=rad_dir)
d_TAirRoom = Change(base_feature=TAirRoom)
d_TAirIn = Change(base_feature=TAirIn)
daily_sin = PeriodicTime(name='Daily Sin', time=time, function=np.sin, frequency=60 * 60 * 24)
daily_cos = PeriodicTime(name='Daily Cos', time=time, function=np.cos, frequency=60 * 60 * 24)
weekly_sin = PeriodicTime(name='Weekly Sin', time=time, function=np.sin, frequency=60 * 60 * 24 * 7)
weekly_cos = PeriodicTime(name='Weekly Cos', time=time, function=np.cos, frequency=60 * 60 * 24 * 7)
t_1 = Temperature(dis_name='AHU_hot_in', var_name='Bus.ahuBus.heaterBus.hydraulicBus.TFwrdInMea')
t_2 = Temperature(dis_name='AHU_hot_out', var_name='Bus.ahuBus.heaterBus.hydraulicBus.TRtrnOutMea')
t_3 = Temperature(dis_name='AHU_cold_in', var_name='Bus.ahuBus.coolerBus.hydraulicBus.TFwrdInMea')
t_4 = Temperature(dis_name='AHU_cold_out', var_name='Bus.ahuBus.coolerBus.hydraulicBus.TRtrnOutMea')
f_1 = MassFlow(dis_name='AHU_hot', var_name='Bus.ahuBus.heaterBus.hydraulicBus.VFlowInMea', temperature_in=t_1, temperature_out=t_2)
f_2 = MassFlow(dis_name='AHU_cold', var_name='Bus.ahuBus.coolerBus.hydraulicBus.VFlowInMea', temperature_in=t_3, temperature_out=t_4)
Q_flowAhu = EnergyBalance(name='Q_flow_Ahu', flows=[f_1, f_2])
# ------------------------------------------- Model -------------------------------------------
ThermalZone_Model = Model(
t=time,
X=(
TAirRoom,
Q_flowAhu,
),
U=(
Q_flowTabs,
TsetAHU
),
D=(
dry_bul,
rad_dir,
daily_sin,
daily_cos,
weekly_sin,
weekly_cos,
),
C=(
d_TAirRoom,
TsetAHU_minus_dry_bul,
TsetAHU_minus_TAirRoom,
d_TsetAHU,
d_Q_flowTabs,
),
T=(
Q_flowCold,
Q_flowHot,
t_1,
t_2,
t_3,
t_4,
f_1,
f_2
),
)
# ------------------------------------------- Plotter -------------------------------------------
ThermalZone_Plotter = Plotter(
SubPlot(features=(TAirRoom,), y_label='Raumlufttemperatur in °C', shift=273.15),
SubPlot(features=(Q_flowTabs,), y_label='Sollwert Wärmestrom BKT', step=True),
SubPlot(features=(TsetAHU,), y_label='Sollwert Einlasstemperatur', shift=273.15, lb=14, ub=31, step=True),
SubPlot(features=(Q_flowAhu,), y_label='Ist Wärmestrom AHU', step=True),
SubPlot(features=(dry_bul, rad_dir), y_label='Störgrößen in %', normalize=True),
size=(8, 8)
)
# ---------------------------------------------- FMU -----------------------------------------------
ThermalZone_FMU = FMUSystem(model= ThermalZone_Model,
step_size=60 * 15,
fmu_name='ashrae140_900_set_point_fmu.fmu')
# ------------------------------------------ Simulator ------------------------------------------
ThermalZone_FMU.load_disturbances()
ThermalZone_Simulator = Simulator(
system=ThermalZone_FMU,
plotter=ThermalZone_Plotter
)
from Examples.ashrae140_900_set_point_ctrl_predicting_energy_consumption.configuration import *
# ----------------------------------- TsetAHU NetworkTrainer -----------------------------------
TAirRoom_NetworkTrainer = NetworkTrainer(
inputs=(
# disturbances
Input(feature=dry_bul, lag=2),
Input(feature=rad_dir, lag=1),
Input(feature=d_dry_bul, lag=2),
Input(feature=d_rad_dir, lag=1),
Input(feature=daily_sin, lag=1),
Input(feature=daily_cos, lag=1),
Input(feature=weekly_sin, lag=1),
Input(feature=weekly_cos, lag=1),
# Stellgrößen
Input(feature=Q_flowTabs, lag=6),
Input(feature=TsetAHU, lag=3),
Input(feature=d_Q_flowTabs, lag=5),
Input(feature=d_TsetAHU, lag=2),
# T air room
Input(feature=TAirRoom, lag=1),
Input(feature=d_TAirRoom, lag=1),
),
output=Output(feature=TsetAHU),
step_size=60*15
)
containers = load_DataHandler('ThermalZone_MPC_online').containers
TAirRoom_NetworkTrainer.load_data(containers=containers)
TAirRoom_NetworkTrainer.tune(layer_range=(1,), neurons_range=(8, 16), trials=5, epochs=500, batch_size=100)
TAirRoom_NetworkTrainer.save('TsetAHU', override=True)
from ddmpc import *
import pandas as pd
ThermalZone_DataHandler = read_pkl(r"C:\Users\Administrator\Documents\data-driven-model-predictive-control\DataDrivenMPC\ashrae140_900_set_point_ctrl\stored_data\Res_6\MPC_one_year_8h_no_online_learning_reduced_features.pkl")
training = ThermalZone_DataHandler[0].df
training.index = training['SimTime']
for i in range(1,12):
container = ThermalZone_DataHandler[i].df
container.index = container['SimTime']
container = container[1:]
training = training.append(container)
mpc_res = ThermalZone_DataHandler[12].df
mpc_res.index = mpc_res['SimTime']
for i in range(13,49):
container = ThermalZone_DataHandler[i].df
container.index = container['SimTime']
container = container[1:]
mpc_res = mpc_res.append(container)
write_pkl(data={'Training':training,'MPC':mpc_res},filename="DDMPC_one_year_8h_online_learning_reduced_features")
mpc_res.to_csv("data_driven_mpc_one_year_8h_prediction_online_learning_reduced_features.csv")
training.to_csv("data_driven_mpc_one_year_8h_prediction_online_learning_reduced_features_training.csv")
\ No newline at end of file
from Examples.boptest_hydronic_heat_pump_cost_based.configuration_boptest import *
# PID controller for the HP
HP_PID = PID(
y=TAirRoom,
u=u_hp_rel,
dt=900,
Kp=0.05,
Ti=300,
Td=0,
)
TAirRoom.mode = 'random'
hydronic_hp_Simulator.plotter.sub_folder_name = 'pid'
hydronic_hp_system.setup(start_time=0,warmup_period=7*24*3600)
hydronic_hp_system.activate_ctrl_layer({'oveHeaPumY_activate':1})
hydronic_hp_DataContainer_random = hydronic_hp_Simulator.run(controllers=(HP_PID,),
duration=60 * 60 * 24 * 14)
TAirRoom.mode = 'steady'
hydronic_hp_DataContainer_steady = hydronic_hp_Simulator.run(controllers=(HP_PID,),
duration=60 * 60 * 24 * 14)
hydronic_hp_DataContainers_random = hydronic_hp_DataContainer_random.split_container(training_share=0.7,testing_share=0.15,validating_share=0.15)
hydronic_hp_DataContainers_steady = hydronic_hp_DataContainer_steady.split_container(training_share=0.7,testing_share=0.15,validating_share=0.15)
hydronic_hp_DataHandler = DataHandler()
hydronic_hp_DataHandler.add_containers(*hydronic_hp_DataContainers_random)
hydronic_hp_DataHandler.add_containers(*hydronic_hp_DataContainers_steady)
hydronic_hp_DataHandler.save(pid_DataHandler_name, override=True)
from Examples.boptest_hydronic_heat_pump_cost_based.configuration_boptest import *
containers = load_DataHandler(pid_DataHandler_name).containers
# ------------------ P_el Networktrainer
P_el_NetworkTrainer = NetworkTrainer(
inputs=(
# disturbances
Input(feature=t_amb, lag=3),
# Stellgrößen
Input(feature=u_hp_rel, lag=3),
# T air room
Input(feature=TAirRoom, lag=3),
),
output=Output(feature=power_hp),
step_size=60*15,
)
P_el_NetworkTrainer.load_data(containers=containers)
P_el_NetworkTrainer.tune(layer_range=(1,),
neurons_range=(8, 16),
trials=5,
epochs=1000,
batch_size=100,
output_scale=6000,
loss='mse')
P_el_NetworkTrainer.save(P_hp_el_NetworkTrainer_name, override=True)
# ----------------------------------- TAirRoom NetworkTrainer -----------------------------------
TAirRoom_NetworkTrainer = NetworkTrainer(
inputs=(
# disturbances
Input(feature=t_amb, lag=2),
Input(feature=rad_dir, lag=1),
Input(feature=daily_sin, lag=2),
Input(feature=daily_cos, lag=2),
Input(feature=weekly_sin, lag=2),
Input(feature=weekly_cos, lag=2),
# Stellgrößen
Input(feature=u_hp_rel, lag=4),
# T air room
Input(feature=TAirRoom, lag=4),
),
output=Output(feature=d_TAirRoom),
step_size=60*15
)
TAirRoom_NetworkTrainer.load_data(containers=containers)
TAirRoom_NetworkTrainer.tune(layer_range=(1,), neurons_range=(8, 16), trials=5, epochs=1000, batch_size=100)
TAirRoom_NetworkTrainer.save(d_TAir_NetworkTrainer_name, override=True)
from Examples.boptest_hydronic_heat_pump_cost_based.configuration_boptest import *
MPC_DataHandler_name = 'mpc_online_2'
# load ann1
TAirRoom_NetworkTrainer = load_NetworkTrainer(d_TAir_NetworkTrainer_name+'online_learning')
TAirRoom_NetworkTrainer.load_best_ann(loc=0)
# load ann2
P_el_NetworkTrainer = load_NetworkTrainer(P_hp_el_NetworkTrainer_name+'online_learning')
P_el_NetworkTrainer.load_best_ann(loc=0)
TAirRoom.mode = 'economic'
hydronic_MPC = ModelPredictive(
dt=60*15,
N=96,
objectives=(
Objective(feature=TAirRoom, weight=25, k_0_offset=1),
Objective(feature=costs_el, weight=10, norm=1000, k_N_offset=-1, cost_order=CostOrder.linear),
Objective(feature=d_u_hp_rel, weight=1, norm=1 ,k_N_offset=-1),
),
constraints=(
Constraint(features=(u_hp_rel,), lb=0, ub=1, k_N_offset=-1),
),
model=hydronic_hp_model,
disturbances_df=pd.DataFrame(),
network_trainers=(TAirRoom_NetworkTrainer, P_el_NetworkTrainer,),
solver_options={'verbose': False,
'ipopt': {'print_level': 2,
'linear_solver': 'ma27'}}
)
hydronic_hp_Simulator.plotter.sub_folder_name = 'online_mpc'
hydronic_hp_system.setup(start_time=0,warmup_period=7*24*3600)
hydronic_hp_system.activate_ctrl_layer({'oveHeaPumY_activate': 1})
hydronic_hp_MPC_DataHandler = DataHandler()
# online mpc loop
for repetition in range(12):
# run mpc and add to DataHandler
hydronic_DataContainer = hydronic_hp_Simulator.run(
controllers=(hydronic_MPC,),
duration=60 * 60 * 24 * 6,
)
# split data into training, testing and validating
hydronic_DataContainers = hydronic_DataContainer.split_container(testing_share=0.2,training_share=0.6,validating_share=0.2)
hydronic_hp_MPC_DataHandler.add_containers(*hydronic_DataContainers)
hydronic_MPC.reinitialize_mpc = True
# online learning
hydronic_hp_Simulator.retrain_anns(
containers=hydronic_DataContainers,
network_trainer=TAirRoom_NetworkTrainer,
epochs=500,
batch_size=250,
clear_data=False,
)
hydronic_hp_Simulator.retrain_anns(
containers=hydronic_DataContainers,
network_trainer=P_el_NetworkTrainer,
epochs=500,
batch_size=250,
clear_data=False,
)
hydronic_hp_MPC_DataHandler.save(MPC_DataHandler_name, override=True)
TAirRoom_NetworkTrainer.save_ann()
P_el_NetworkTrainer.save_ann()
TAirRoom_NetworkTrainer.save(d_TAir_NetworkTrainer_name+'_online_learning_2', override=True)
P_el_NetworkTrainer.save(P_hp_el_NetworkTrainer_name+'_online_learning_2', override=True)
import numpy as np
import pandas as pd
from ddmpc.controller import *
from ddmpc.modeling import *
from ddmpc.utils import *
# ---------------------------------------------- names -----------------------------------------------
pid_DataHandler_name = 'hydronic_PID_Data'
d_TAir_NetworkTrainer_name = 'd_TAir_NetworkTrainer'
P_hp_el_NetworkTrainer_name = 'P_hp_el_NetworkTrainer'
MPC_DataHandler_name = "Online_Learning_MPC"
# -------------------------------------------- FEATURES --------------------------------------------
time = Time(dis_name='Simulation Time', var_name='SimTime')
t_amb = Temperature(dis_name='Ambient temperature_',
var_name='TDryBul',
plt_opts=PlotOptions(color=blue,
line=line_solid,
label='Ambient Temperature'))
rad_dir = Radiation(dis_name='direct radiation',
var_name='HDirNor',
plt_opts=PlotOptions(color=light_red, line=line_solid, label='Radiation'))
TAirRoom = Controlled(
dis_name='TAir',
var_name='reaTZon_y',
mode='random',
plt_opts=PlotOptions(color=red, line=line_solid),
day_start=8,
day_end=18,
day_target=295.15,
day_lb=294.15,
day_ub=296.15,
night_lb=290.15,
night_ub=300.15,
night_target=295.15,
random_step_size=3600*4
)
d_TAirRoom = Change(base_feature=TAirRoom)
u_hp_rel = RelPower(var_name='oveHeaPumY_u',
dis_name='u_hp',
plt_opts=PlotOptions(color=blue, line=line_solid, label='u_hp'),
lb=0,
ub=1,
default=0)
d_u_hp_rel = Change(base_feature=u_hp_rel)
daily_sin = PeriodicTime(name='Daily Sin', time=time, function=np.sin, frequency=60 * 60 * 24)
daily_cos = PeriodicTime(name='Daily Cos', time=time, function=np.cos, frequency=60 * 60 * 24)
weekly_sin = PeriodicTime(name='Weekly Sin', time=time, function=np.sin, frequency=60 * 60 * 24 * 7)
weekly_cos = PeriodicTime(name='Weekly Cos', time=time, function=np.cos, frequency=60 * 60 * 24 * 7)
power_fan = PowerMeas(var_name='reaPFan_y', dis_name='el. Power Fan', plt_opts=PlotOptions(color=blue, line=line_dotted, label='P_fan'),)
power_hp = PowerMeas(var_name='reaPHeaPum_y', dis_name='el. Power HP', plt_opts=PlotOptions(color=red, line=line_solid, label='P_hp'),)
power_ec = PowerMeas(var_name='reaPPumEmi_y', dis_name='el. Power emission circuit', plt_opts=PlotOptions(color=grey, line=line_dashdot, label='P_ec'),)
price_el = Price(var_name='PriceElectricPowerHighlyDynamic', dis_name='el. Power Price', plt_opts=PlotOptions(color=black, line=line_solid, label='P_ec'))
costs_el = Product(base_feature_one=price_el, base_feature_two=power_hp,plt_opts=PlotOptions(color=black, line=line_solid, label='P_ec'))
# ------------------------------------------- Model -------------------------------------------
hydronic_hp_model = Model(
t=time,
X=(
TAirRoom,
power_hp,
),
U=(
u_hp_rel,
),
D=(
t_amb,
rad_dir,
daily_sin,
daily_cos,
weekly_sin,
weekly_cos,
price_el,
),
C=(
d_TAirRoom,
d_u_hp_rel,
costs_el,
),
T=(
power_fan,
power_ec,
),
)
# ------------------------------------------- Plotter -------------------------------------------
plotter_hydronic = Plotter(
SubPlot(features=(TAirRoom,), y_label='Room temperature in °C', shift=273.15),
SubPlot(features=(u_hp_rel,), y_label='Modulation hp', step=True),
SubPlot(features=(t_amb,), y_label='Ambient temperature in °C', normalize=False, shift=273.15),
SubPlot(features=(power_fan, power_hp, power_ec), y_label='el. Power in W', normalize=False),
SubPlot(features=(price_el,), y_label='el. Price in €', normalize=False),
size=(8, 8)
)
# ---------------------------------------------- FMU -----------------------------------------------
hydronic_hp_system = BOPTESTSystem(model=hydronic_hp_model,
step_size=60 * 15,
url='http://134.130.166.203:5000',
name='simple_test')
# ------------------------------------------ Simulator ------------------------------------------
hydronic_hp_Simulator = Simulator(
system=hydronic_hp_system,
plotter=plotter_hydronic
)
from Examples.boptest_hydronic_heat_pump_hp_ctrl.configuration_boptest import *
# PID controller for the HP
HP_PID = PID(
y=TAirRoom,
u=u_hp_rel,
dt=60*30,
Kp=0.05,
Ti=300,
Td=0,
)
TAirRoom.mode = 'random'
hydronic_hp_Simulator.plotter.sub_folder_name = 'pid'
hydronic_hp_system.setup(start_time=0,warmup_period=7*24*3600)
hydronic_hp_system.activate_ctrl_layer({'oveHeaPumY_activate':1})
hydronic_hp_DataContainer = hydronic_hp_Simulator.run(controllers=(HP_PID,),
duration=60 * 60 * 24 * 7)
hydronic_hp_DataContainers = hydronic_hp_DataContainer.split_container(training_share=0.7,testing_share=0.15,validating_share=0.15)
hydronic_hp_DataHandler = DataHandler(containers=hydronic_hp_DataContainers)
hydronic_hp_DataHandler.save(pid_DataHandler_name, override=True)
from Examples.boptest_hydronic_heat_pump_hp_ctrl.configuration_boptest import *
hydronic_DataHandler = load_DataHandler(pid_DataHandler_name)
containers = load_DataHandler(pid_DataHandler_name).containers
# ----------------------------------- TAirRoom NetworkTrainer -----------------------------------
TAirRoom_NetworkTrainer = NetworkTrainer(
inputs=(
# disturbances
Input(feature=t_amb, lag=2),
Input(feature=rad_dir, lag=1),
Input(feature=daily_sin, lag=2),
Input(feature=daily_cos, lag=2),
Input(feature=weekly_sin, lag=2),
Input(feature=weekly_cos, lag=2),
# Stellgrößen
Input(feature=u_hp_rel, lag=6),
# T air room
Input(feature=TAirRoom, lag=6),
),
output=Output(feature=d_TAirRoom),
step_size=60*30
)
TAirRoom_NetworkTrainer.load_data(containers=containers)
TAirRoom_NetworkTrainer.tune(layer_range=(1,), neurons_range=(8, 16), trials=10, epochs=1000, batch_size=100)
TAirRoom_NetworkTrainer.save(d_TAir_NetworkTrainer_name, override=True)
from Examples.boptest_hydronic_heat_pump_hp_ctrl.configuration_boptest import *
# load ann1
TAirRoom_NetworkTrainer = load_NetworkTrainer(d_TAir_NetworkTrainer_name)
TAirRoom_NetworkTrainer.load_best_ann(loc=0)
TAirRoom.mode = 'economic'
hydronic_MPC = ModelPredictive(
dt=60*30,
N=32,
objectives=(
Objective(feature=TAirRoom, weight=50, k_0_offset=1),
Objective(feature=u_hp_rel, weight=1, norm=1, k_N_offset=-1, cost_order=CostOrder.linear),
Objective(feature=d_u_hp_rel, weight=0.01, norm=1 , k_N_offset=-1),
),
constraints=(
Constraint(features=(u_hp_rel,), lb=0, ub=1, k_N_offset=-1),
),
model=hydronic_hp_model,
disturbances_df=pd.DataFrame(),
network_trainers=(TAirRoom_NetworkTrainer,),
)
hydronic_hp_Simulator.plotter.sub_folder_name = 'online_mpc'
hydronic_hp_system.setup(start_time=0,warmup_period=7*24*3600)
hydronic_hp_system.activate_ctrl_layer({'oveHeaPumY_activate':1})
hydronic_hp_MPC_DataHandler = DataHandler()
# online mpc loop
for repetition in range(1):
# run mpc and add to DataHandler
hydronic_DataContainer = hydronic_hp_Simulator.run(
controllers=(hydronic_MPC,),
duration=60 * 60 * 24 * 3,
)
# split data into training, testing and validating
hydronic_DataContainers = hydronic_DataContainer.split_container(testing_share=0.15,training_share=0.7,validating_share=0.15)
hydronic_hp_MPC_DataHandler.add_containers(hydronic_DataContainers)
# online learning
hydronic_hp_Simulator.retrain_anns(
containers=hydronic_DataContainers,
network_trainer=TAirRoom_NetworkTrainer,
epochs=500,
batch_size=250,
clear_data=False,
)
hydronic_MPC.reinitialize_mpc = True
hydronic_hp_MPC_DataHandler.save(MPC_DataHandler_name, override=True)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment