Commit 906616c7 authored by s181413's avatar s181413
Browse files

Final integration

This update contains the a direct integration of the reliability model with the sizing model as a library. So anyone can directly run the sizing model , and it will call the reliability model on necessity. To integrate, I following are considered: -

  1) The sizing model continues its first loop with 100% reliability for all considered components.
  2) Then from the 2nd loop, it cross-checks if the components' quantity in the optimization of the current loop with the number of reliability parameters it has in its environment.
  3) If there are not enough reliability parameters, then it assigns a new max-quantity for those components by considering a lowest possible availability
  4) It calls the reliability model and collects the reliability parameters in return for new max-quantity of those components
  5) Finally, the sizing model resumes the size optimization through the loops

Note:
  * The sizing model generally calls the reliability model only in the 2nd loop, but it may call it in other loops if it needs reliability parameters for more assets.
  * As in this implementation, the sizing model loads the initial reliability parameters from the CSV files, so there should be at least 1 asset's reliability parameter of each component are stored in the CSV file for now. Which can be resolve by further improvement.

Thanks all
parent 0710b9e9
Pipeline #21138 failed with stages
in 47 seconds
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Output Metrics,Value,Unit
nWT,85,wind turbines
nPV_unit,388,solar PV units
nTR,6,Transformers
Wind_MW,178,MW
Solar_MW,388,MW
Transmission_capacity_MW,600,MW
nBESS_Energy,250,MWh
nBESS_Power,75,MW
AEP,1175,GWh
Curtailed_Energy_MW,14,GWh
NPV,50,MEUR
LCOE,40.59,EUR/MWh
IRR,8.1,%
investment_cost,496,MEUR
maintenance_cost,199,MEUR
List_of_parameters,Values_for_ms73_cf1.05
Number_of_WTs:,28
Number_of_PV_units:,391
Number_of_Transformers:,4
Wind_Capacity:,59
Solar_Capacity:,391
Battery_storage_Power_Rating:,27
Battery_storage_Energy_Rating:,90
AEP:,884
Curtailed_Energy:,6
HPP_Investment_cost:,339
HPP_Maintenance_cost:,127
LCOE:,36.48
NPV:,34
IRR:,8.1
Number_of_Iterations:,10
# -*- coding: utf-8 -*-
"""
Created on Wed Dec 2 13:42:38 2020
@author: jaber
Testing of dependency functions
"""
import pandas as pd
from HyDesign import HPP, read_csv_Data
if __name__ == "__main__":
# =============================================================================
# # Alessandra's data
# =============================================================================
input_wind_ts_filename = './Data/aveW.csv'
input_wind_av_filename = './Data/av_WT.csv'
input_solar_ts_filename = './Data/aveS.csv'
input_solar_av_filename = './Data/av_PV.csv'
input_price_ts_filename = './Data/PriceProfilePPA.csv'
start_date = pd.to_datetime('2018-09-01 00:00')
end_date = pd.to_datetime("2019-08-31 23:00")
timeFormat_wind = "%d/%m/%Y %H:%M"
timeFormat_solar = "%d/%m/%Y %H:%M"
timeFormat_price = '%d/%m/%Y %H:%M'
timename = 'Time'
timeZone_wind = 'Asia/Kolkata'
timeZone_solar = 'Asia/Kolkata'
timeZone_price = 'Asia/Kolkata'
timeZone_analysis = 'Asia/Kolkata'
# inputs
# Alessandra's data
parameter_dict = {
# hpp parameters
'hpp_grid_connection': 300, # in MW
'hpp_land_area_available': 100, # in square km
'hpp_lifetime': 25, # [years]
'hpp_discount_factor': 0.07,
'hpp_BOS_soft_cost': 119940, # [Eur/MW]
'hpp_grid_connection_cost': 37074, # [Eur/MW]
# hpp wind parameters
'wind_rating_WT': 2.1, # 2.1 [MW]
'wind_nWT_per_string': 20,
'wind_lifetime_WT': 30,
'wind_rotor_diameter': 97, # in m
'wind_hub_height': 120, # in m
'wind_turbine_spacing': 5, # in terms of Rotor Diameter
'wind_turbine_row_spacing': 10, # in terms of Rotor Diameter
'wind_turbine_cost': 851000, # [EUR/MW]
'wind_civil_works_cost': 116986, # [Eur/MW]
'wind_fixed_onm_cost': 12805, # Wind fixed O&M cost per year [Eur/MW]
# hpp solar parameters
'solar_rating_PV_unit': 1, # [MW]
'solar_lifetime_PV': 30,
'solar_PV_cost': 219000, # [EUR/MW]
'solar_hardware_installation_cost': 241854, # [Eur/MW]
'solar_fixed_onm_cost': 8149, # Solar O&M cost per year [Eur/MW]
# hpp battery parameters
'battery_energy_cost': 181596, # Eur/MWh
'battery_power_cost': 64190, # Power conversion system cost[Eur/MW]
# Electric Balance of Plant, installation, commissioning cost [Eur/MW]
'battery_BOP_installation_commissioning_cost': 73360,
# Grid management control system cost[Eur/MW]
'battery_control_system_cost': 18340,
# Battery energy capacity maintenance cost [Eur/MWh] per year
'battery_energy_onm_cost': 10000,
'battery_depth_of_discharge': 0.9,
}
simulation_dict = {
'wind_as_component': 1,
'solar_as_component': 1,
'battery_as_component': 1,
}
ExampleHPP = HPP(
parameter_dict=parameter_dict,
simulation_dict=simulation_dict,
)
wind_power_t = read_csv_Data(
input_wind_ts_filename,
timename,
timeFormat_wind,
timeZone_wind,
timeZone_analysis,
)
wind_av_t = read_csv_Data(
input_wind_av_filename,
timename,
timeFormat_wind,
timeZone_wind,
timeZone_analysis,
)
solar_power_t = read_csv_Data(
input_solar_ts_filename,
timename,
timeFormat_solar,
timeZone_solar,
timeZone_analysis,
)
solar_av_t = read_csv_Data(
input_solar_av_filename,
timename,
timeFormat_solar,
timeZone_solar,
timeZone_analysis,
)
spot_price_t = read_csv_Data(
input_price_ts_filename,
timename,
timeFormat_price,
timeZone_price,
timeZone_analysis,
)
wind_power_t = wind_power_t.loc[start_date:end_date, 'Pwind'] / 100
solar_power_t = solar_power_t.loc[start_date:end_date, 'Psolar'] / 100
spot_price_t = spot_price_t.loc[start_date:end_date, 'Price']
data = wind_av_t.iloc[:,0:10]
av_parallel = ExampleHPP.availability_on_parallel_connection(data)
av_series = ExampleHPP.availability_on_series_connection(data)
av_string = ExampleHPP.availability_on_string_connection(data)
av_redundant = ExampleHPP.availability_on_redundant_connection(data.iloc[:,0:2])
\ No newline at end of file
......@@ -2,44 +2,47 @@
"""
Created on Fri Nov 20 22:51:02 2020
@author: jaber
@author: jaber (jaber.ibne.mahboob@gmail.com)
"""
import random as rd
from Reliability import hpp_reliability
#import random as rd # In case you want to evaluate the master seed randomly
from HPP_reliability import HPP_reliability
if __name__ == "__main__":
print("")
print("") # just to increase the readability of console log
#######################################################################
# PARAMETERS FOR THE RELIABILITY MODEL
#######################################################################
params_default_av = { # default reliability parameters
#"master_seed": 14,
"master_seed": 91,
params_default_av = { # default reliability parameters
"master_seed": 14, # set a master seed for the reproducibility
#"master_seed": rd.randint(1, 99),
"sampling_ts":{"start":'2016-01-01 00:00', "end":'2035-12-31 23:00'}, #2035
"sampling_ts":{"start":'2016-01-01 00:00', "end":'2035-12-31 23:00'}, # this is the interval for which, model will evaluate the random failure or, repair samples
#"resulting_ts":{"start":'2016-01-01 00:00', "end":'2035-12-31 23:00'},
"resulting_ts":{"start":'2018-09-01 00:00', "end":'2019-08-31 23:00'},
"timeFormat_availability" : '%d/%m/%Y %H:%M',
"data_directory":'Data/'
"resulting_ts":{"start":'2018-09-01 00:00', "end":'2019-08-31 23:00'}, # this is the interval for which, model will estimate the final availability time-series
"timeFormat_availability" : '%d/%m/%Y %H:%M', # time is the index of the data, so we need to set a time format that fit with the sizing model
"data_directory":'Data/' # where the availability time-seires data will be stored, so the sizing model can load them back
}
params_components_av = { # reliability parameters for each component type
"WT":{"MTTF": 1.10e4, "MTTR": 1.10e2, "N_components": 120, "N_units": 1, "sampling_const": 150}, # 150
"PV":{"MTTF": 3.53e4, "MTTR": 2.18e3, "N_components": 166, "N_units": 400, "sampling_const": 1100}, # 1300
"inverter":{"MTTF": 3.01e4, "MTTR": 7.20e2, "N_components": 400, "N_units": 1, "sampling_const": 300},
"transformer":{"MTTF": 1.77e4, "MTTR": 6*30*24, "N_components": 25, "N_units": 1, "sampling_const": 4000},
"BESS":{"MTTF": 7.09e4, "MTTR": 1.68e2, "N_components": 25, "N_units": 1, "sampling_const": 222}
params_components_av = { # reliability parameters for each component type
"WT":{"MTTF": 1.10e4, "MTTR": 1.10e2, "N_components": 120, # required parameters for the wind turbines
"N_units": 1, "sampling_const": 150},
"PV":{"MTTF": 3.53e4, "MTTR": 2.18e3, "N_components": 166, # required parameters for the solar PV units
"N_units": 400, "sampling_const": 300},
"inverter":{"MTTF": 3.01e4, "MTTR": 7.20e2, "N_components": 400, # required parameters for the solar inverters
"N_units": 1, "sampling_const": 300},
"transformer":{"MTTF": 1.77e4, "MTTR": 6*30*24, "N_components": 25, # required parameters for the transmission transformers
"N_units": 1, "sampling_const": 4000},
"BESS":{"MTTF": 7.09e4, "MTTR": 1.68e2, "N_components": 25, # required parameters for the battery storage system
"N_units": 1, "sampling_const": 222}
}
print(f'The master seed: {params_default_av["master_seed"]}')
#######################################################################
# EXAMPLE SCRIPTS, HOW TO USE RELIABILITY MODEL
#######################################################################
hpp_rmdl = hpp_reliability(params_default_av, params_components_av, debugging_mode=True)
hpp_rmdl.hpp_availability_ts()
hpp_rmdl.hpp_availability_ts_to_csv()
hpp_availability_ts = hpp_rmdl.get_availability_result()
hpp_rmdl = HPP_reliability(params_default_av, params_components_av, # initialize the reliability model
analyzing_mdl_mode=True, logs_in_terminal=True)
hpp_rmdl.hpp_availability_ts() # produce the availability time-seires of all HPP components
hpp_rmdl.hpp_availability_ts_to_csv() # store reliability parameters for future uses
hpp_availability_ts = hpp_rmdl.get_availability_result() # get reliability parameters in the environment to observe using variable explorer
\ No newline at end of file
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 10 12:05:52 2019
@author: jaber (jaber.ibne.mahboob@gmail.com), jumu (jumu@dtu.dk), kdas (kdas@dtu.dk)
"""
# -*- coding: utf-8 -*-
import pandas as pd
from termcolor import cprint
from HPP_sizing import HPP_sizing, read_csv_Data
if __name__ == "__main__":
# =============================================================================
# General parameters for configuration
# =============================================================================
input_wind_ts_filename = './Data/aveW.csv'
input_wind_av_filename = './Data/av_WT.csv'
input_solar_ts_filename = './Data/aveS.csv'
input_solar_av_filename = './Data/av_PV.csv'
input_inverter_av_filename = './Data/av_inverter.csv'
input_transformer_av_filename = './Data/av_transformer.csv'
input_bess_av_filename = './Data/av_BESS.csv'
input_price_ts_filename = './Data/PriceProfilePPA.csv'
start_date = pd.to_datetime('2018-09-01 00:00')
end_date = pd.to_datetime("2019-08-31 23:00")
timeFormat_wind = "%d/%m/%Y %H:%M"
timeFormat_solar = "%d/%m/%Y %H:%M"
timeFormat_price = '%d/%m/%Y %H:%M'
timename = 'Time'
timeZone_wind = 'Asia/Kolkata'
timeZone_solar = 'Asia/Kolkata'
timeZone_price = 'Asia/Kolkata'
timeZone_analysis = 'Asia/Kolkata'
# ASSIGN THE RELIABILITY PARAMETER, THAT MAY BE WE NEED TO CALL ON REQUIREMENT
# MAKE SURE YOU ALWAYS HAVE THESE DEFAULT PARAMETERS, THE REQUIRED CHANGES WILL BE DONE BY THE SIZING MODEL
reliability_mdl_default_params = { # default reliability parameters
"master_seed": 14, # master seed to ensure reproducibility
"sampling_ts":{"start":'2016-01-01 00:00', "end":'2035-12-31 23:00'}, # sampling period (20 years), must include result period (simulation period of the sizing model)
#"resulting_ts":{"start":'2016-01-01 00:00', "end":'2035-12-31 23:00'}, # make sure result period is consist in sampling period such a way, that it can generate well-converged result
"resulting_ts":{"start": start_date, "end": end_date}, # result period / simulaion period of the sizing model
"timeFormat_availability" : timeFormat_wind, # format of time required for the sizing model
"data_directory":'Data/' # directory to store evaluated data
}
reliability_mdl_components_params = { # parameters for the components' of HPP, will be decided be the sizing model
"WT":{"MTTF": 1.10e4, "MTTR": 1.10e2, "N_components": 120, "N_units": 1, "sampling_const": 150}, # 150
"PV":{"MTTF": 3.53e4, "MTTR": 2.18e3, "N_components": 166, "N_units": 400, "sampling_const": 300}, # 1100 # 1300
"inverter":{"MTTF": 3.01e4, "MTTR": 7.20e2, "N_components": 400, "N_units": 1, "sampling_const": 300},
"transformer":{"MTTF": 1.77e4, "MTTR": 6*30*24, "N_components": 25, "N_units": 1, "sampling_const": 4000},
"BESS":{"MTTF": 7.09e4, "MTTR": 1.68e2, "N_components": 25, "N_units": 1, "sampling_const": 222}
}
# ASSIGN SOME COST FACTORS FOR EVALUATING THE COST-VARYING PROFILES
cfh = 1.00 # change it to generate different cost varying profiles for hpp
cfw = 1.00 # change it to generate different cost varying profiles for wind
cfs = 1.00 # change it to generate different cost varying profiles for solar
cft = 1.00 # change it to generate different cost varying profiles for transformer
cfb = 1.00 # change it to generate different cost varying profiles for bess
# ================================================================================================
# input parameters for the sizing model
# ================================================================================================
parameter_dict = {
'logs_in_terminal': True, # set it True to observ result values in every loop
# hpp parameters
'hpp_grid_connection': 300, # [MW]
'hpp_land_area_available': 100, # [sq_km]
'hpp_lifetime': 25, # [years]
'hpp_discount_factor': 0.07, #
'hpp_BOS_soft_cost': round(119940 *cfh), # [Eur/MW]
'hpp_grid_connection_cost': round(11122 *cfh), # [Eur/MW]
# grid connection parameters
'hpp_transformer_cost': round(25952 *cft), # [Eur/MW]
'hpp_transformer_rating': 100, # [MW]
# hpp wind parameters
'wind_rating_WT': 2.1, # [MW]
#'wind_nWT_per_string': 20, # quantity
#'wind_lifetime_WT': 30, # in years
#'wind_rotor_diameter': 97, # in m
#'wind_hub_height': 120, # in m
#'wind_turbine_spacing': 5, # 5 times of Rotor Diameter, i.e., wind_rotor_diameter
#'wind_turbine_row_spacing': 10, # 10 times of Rotor Diameter, i.e., wind_rotor_diameter
'wind_turbine_cost': round(851000 *cfw), # [EUR/MW]
'wind_civil_works_cost': round(116986 *cfw), # [Eur/MW]
'wind_fixed_onm_cost': round(12805 *cfw), # [Eur/MW]
# hpp solar parameters
'solar_rating_PV_unit': 1, # [MW]
#'solar_lifetime_PV': 30, # [years]
'solar_PV_cost': round(219000 *cfs), # [EUR/MW]
'solar_hardware_installation_cost': round(241854 *cfs), # [Eur/MW]
'solar_fixed_onm_cost': round(8149 *cfs), # [Eur/MW]
# hpp battery parameters
'battery_energy_cost': round(181596 *cfb), # [Eur/MWh]
'battery_power_cost': round(64190 *cfb), # [Eur/MW]
'battery_BOP_installation_commissioning_cost': round(73360 *cfb), # [Eur/MW] # Electric Balance of Plant, installation, commissioning cost
'battery_control_system_cost': round(18340 *cfb),# [Eur/MW] # Grid management control system cost
'battery_energy_onm_cost': round(10000 *cfb), # [Eur/MW] # Battery energy capacity maintenance cost
'battery_depth_of_discharge': 0.9, #
}
# ================================================================================================
# Configuratiion variable to define the environment of the simulation
# ================================================================================================
simulation_dict = {
"timeFormat_wind" : "%d/%m/%Y %H:%M",
"timeFormat_solar" : "%d/%m/%Y %H:%M",
"timeFormat_price" : '%d/%m/%Y %H:%M',
"timename" : 'Time',
"timeZone_wind" : 'Asia/Kolkata',
"timeZone_solar" : 'Asia/Kolkata',
"timeZone_price" : 'Asia/Kolkata',
"timeZone_analysis" : 'Asia/Kolkata',
}
# ================================================================================================
# Configuratiion variable to decide which components will be considered for sizing
# ================================================================================================
component_dict = {
#'wind_turbine': 1, # Wind turbines are mandatory simulation element, always considered in the simulation
#'solar_generation_unit': 1, # Solar PV units are mandatory simulation element, always considered in the simulation
#'solar_inverter': 1, # Solar inverters are mandatory simulation element, always considered in the simulation
'battery_storage_system': 0, # Battery storage technology
#'transmission_transformer': 1, # transmission transformer are mandatory simulation element, always considered in the simulation
}
# ================================================================================================
# Configuratiion variable to decide which component's availability will be considered while sizing
# ================================================================================================
reliability_dict = {
'wind_turbine': 1, # Generation unit of wind technology
'solar_generation_unit': 1, # Generation unit of solar technology
'solar_inverter': 1, # Inverter of solar technology
'battery_storage_system': 0, # Battery storage technology
'transmission_transformer': 0, # transmission transformer
}
# ================================================================================================
# Initialize the sizing model
# ================================================================================================
if parameter_dict['logs_in_terminal'] == True:
print("Plese set parameter_dict['logs_in_terminal']=False, if you don't want to look through step by step")
else:
print("Plese set parameter_dict['logs_in_terminal']=True, if you want to look through step by step")
ExampleHPP = HPP_sizing(
parameter_dict=parameter_dict,
simulation_dict=simulation_dict,
component_dict=component_dict,
reliability_dict=reliability_dict,
reliability_mdl_default_params = reliability_mdl_default_params,
reliability_mdl_components_params = reliability_mdl_components_params,
)
# ================================================================================================
# Load external data to the simulation environment
# ================================================================================================
wind_power_t = read_csv_Data(
input_wind_ts_filename,
timename,
timeFormat_wind,
timeZone_wind,
timeZone_analysis,
)
wind_av_t = read_csv_Data(
input_wind_av_filename,
timename,
timeFormat_wind,
timeZone_wind,
timeZone_analysis,
)
solar_power_t = read_csv_Data(
input_solar_ts_filename,
timename,
timeFormat_solar,
timeZone_solar,
timeZone_analysis,
)
solar_av_t = read_csv_Data(
input_solar_av_filename,
timename,
timeFormat_solar,
timeZone_solar,
timeZone_analysis,
)
inverter_av_t = read_csv_Data(
input_inverter_av_filename,
timename,
timeFormat_solar,
timeZone_solar,
timeZone_analysis,
)
transformer_av_t = read_csv_Data(
input_transformer_av_filename,
timename,
timeFormat_price,
timeZone_price,
timeZone_analysis,
)
bess_av_t = read_csv_Data(
input_bess_av_filename,
timename,
timeFormat_price,
timeZone_price,
timeZone_analysis,
)
spot_price_t = read_csv_Data(
input_price_ts_filename,
timename,
timeFormat_price,
timeZone_price,
timeZone_analysis,
)
# ================================================================================================
# Normalize the data
# ================================================================================================
wind_power_t = wind_power_t.loc[start_date:end_date, 'Pwind'] / 100
solar_power_t = solar_power_t.loc[start_date:end_date, 'Psolar'] / 100
spot_price_t = spot_price_t.loc[start_date:end_date, 'Price']
# ================================================================================================
# Estimate the capacity factor, which will be used later to estimate other economic output
# ================================================================================================
capacity_factor_wind = ExampleHPP.calculate_Capacity_Factor(
wind_power_t, 1)
capacity_factor_solar = ExampleHPP.calculate_Capacity_Factor(
solar_power_t, 1)
# ================================================================================================
# Optimization of the size of HPP
# ================================================================================================
solution = ExampleHPP.sizing_HPP( # return a df having rows values and units
wind_power_t, wind_av_t,
solar_power_t, solar_av_t, inverter_av_t,
transformer_av_t,
bess_av_t,
spot_price_t)
# ================================================================================================
# Extract the estimated size solutions in different loops of the sizine model to investigate
# ================================================================================================
result_tbl = ExampleHPP.get_result_tbl()
# ================================================================================================
# Print the result in the output terminal
# ================================================================================================
print(solution.to_string(index=True))
# ================================================================================================
# Store the result in the file system
# ================================================================================================
solution.to_csv('./Solution/result.csv', index=True)
cprint("Results from the sizing model are successfully stored in csv files.","green","on_grey",attrs=['underline'])
\ No newline at end of file
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 10 12:05:52 2019
@author: kdas
"""
# -*- coding: utf-8 -*-
import pandas as pd
from HyDesign import HPP, read_csv_Data
if __name__ == "__main__":
# =============================================================================
# # Alessandra's data
# =============================================================================
input_wind_ts_filename = './Data/aveW.csv'
input_wind_av_filename = './Data/av_WT.csv'
input_solar_ts_filename = './Data/aveS.csv'
input_solar_av_filename = './Data/av_PV.csv'
input_inverter_av_filename = './Data/av_inverter.csv'
input_transformer_av_filename = './Data/av_transformer.csv'
input_bess_av_filename = './Data/av_BESS.csv'
input_price_ts_filename = './Data/PriceProfilePPA.csv'
start_date = pd.to_datetime('2018-09-01 00:00')
end_date = pd.to_datetime("2019-08-31 23:00")
timeFormat_wind = "%d/%m/%Y %H:%M"
timeFormat_solar = "%d/%m/%Y %H:%M"
timeFormat_price = '%d/%m/%Y %H:%M'
timename = 'Time'
timeZone_wind = 'Asia/Kolkata'
timeZone_solar = 'Asia/Kolkata'
timeZone_price = 'Asia/Kolkata'
timeZone_analysis = 'Asia/Kolkata'
# inputs
# Alessandra's data
parameter_dict = {
# hpp parameterscle
'hpp_grid_connection': 300, # in MW # this is original data
'hpp_land_area_available': 100, # in square km
'hpp_lifetime': 25, # [years]
'hpp_discount_factor': 0.07,
'hpp_BOS_soft_cost': 119940, # [Eur/MW]
#'hpp_grid_connection_cost': 37074, # [Eur/MW] # this is original data
'hpp_grid_connection_cost': round(11122 * 1.00), # [Eur/MW] # 70% of original hpp_grid_connection_cost
# grid connection parameters
'hpp_transformer_cost': round(25952 * 1.00), # [Eur/MW] # 30% of original hpp_grid_connection_cost
'hpp_transformer_rating': 100, # [MW]
# hpp wind parameters
'wind_rating_WT': 2.1, # 2.1 [MW]
'wind_nWT_per_string': 20,
'wind_lifetime_WT': 30,
'wind_rotor_diameter': 97, # in m
'wind_hub_height': 120, # in m
'wind_turbine_spacing': 5, # in terms of Rotor Diameter
'wind_turbine_row_spacing': 10, # in terms of Rotor Diameter
'wind_turbine_cost': round(851000 * 1.00), # [EUR/MW]
'wind_civil_works_cost': round(116986 * 1.00), # [Eur/MW]
'wind_fixed_onm_cost': round(12805 * 1.00), # Wind fixed O&M cost per year [Eur/MW]
# hpp solar parameters
'solar_rating_PV_unit': 1, # [MW]
'solar_lifetime_PV': 30,
'solar_PV_cost': round(219000 * 1.00), # [EUR/MW]
'solar_hardware_installation_cost': (241854 * 1.00), # [Eur/MW]
'solar_fixed_onm_cost': (8149 * 1.00), # Solar O&M cost per year [Eur/MW]
# hpp battery parameters
'battery_energy_cost': round(181596 * 1.00), # Eur/MWh
'battery_power_cost': round(64190 * 1.00), # Power conversion system cost[Eur/MW]
# Electric Balance of Plant, installation, commissioning cost [Eur/MW]
'battery_BOP_installation_commissioning_cost': round(73360 * 1.00),
# Grid management control system cost[Eur/MW]
'battery_control_system_cost': round(18340 * 1.00),
# Battery energy capacity maintenance cost [Eur/MWh] per year
'battery_energy_onm_cost': round(10000 * 1.00),
'battery_depth_of_discharge': 0.9,