Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

more advanced heatpump with outputs for dhw and building heating #274

Closed
wants to merge 33 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
a06a757
more advanced heat pump model, example and tester
Hoppe-J Dec 6, 2023
5a13bda
tester for more advanced heatpump
Hoppe-J Dec 6, 2023
4dad045
units for pressure
Hoppe-J Dec 8, 2023
40db176
weather model ergänzt um druck aus-/übergabe
Hoppe-J Dec 8, 2023
6972232
model ergänzt um druck für ggf zukünftige erweiterung von windkraftan…
Hoppe-J Dec 8, 2023
ea6b147
pressure output angepasst
Hoppe-J Dec 8, 2023
ed75731
pressure ergänzt
Hoppe-J Dec 8, 2023
4bda798
anpassen auf SI-Einheit für Druck
Hoppe-J Dec 11, 2023
193f6f1
anpassen auf SI-Einheit für Druck
Hoppe-J Dec 11, 2023
a3d9598
anpassen auf SI-Einheit für Druck
Hoppe-J Dec 11, 2023
569b9bf
modell ergänzt um pressure output für windkraftanlage,
Hoppe-J Dec 20, 2023
cbd47fa
Merge branch 'JHo_more_advanced_heatpump' into JHo_windpower
Hoppe-J Dec 20, 2023
d5c91a6
new:Outputparameter Name for primary side if water/water HP
Hoppe-J Dec 20, 2023
77225fe
Merge remote-tracking branch 'origin/main'
Hoppe-J Dec 20, 2023
da87a62
hisim uodate
Hoppe-J Dec 20, 2023
6ca5a89
erst zu mein branche, wenn komplett fertig und abgenommen
Hoppe-J Dec 21, 2023
dfbe516
Merge branch 'FZJ-IEK3-VSA:main' into JHo_more_advanced_heatpump
Hoppe-J Dec 21, 2023
bba2515
update to newsest HiSim Version, with caching results for heatpump ca…
Hoppe-J Dec 21, 2023
9f79639
new example for more_advanced_heat_pump_hplib model for comparison wi…
Hoppe-J Dec 21, 2023
d8e8794
update new hisim version
Hoppe-J Dec 21, 2023
f0d3e34
set connections of components
Hoppe-J Dec 21, 2023
26a06bc
calculate hp results in every timestep (like version before caching f…
Hoppe-J Dec 21, 2023
5545e99
-new example household (household_1b) for new heatpump
Hoppe-J Dec 21, 2023
6ba9a43
prepared for new cache function
Hoppe-J Dec 21, 2023
0243565
delete "old" system setup tester, add new tester on basis "test_syste…
Hoppe-J Dec 22, 2023
8da54fd
postprocessing_flag only for "p_el_ges", so kpi calculation should be…
Hoppe-J Dec 22, 2023
faae271
tester for only new hp model
Hoppe-J Dec 22, 2023
bef1984
Merge remote-tracking branch 'origin/main'
Hoppe-J Jan 10, 2024
386156e
Merge branch 'main' into JHo_more_advanced_heatpump
Hoppe-J Jan 10, 2024
2eff9b0
update to new HiSim utsp_connector --> url and api_key
Hoppe-J Jan 10, 2024
6360d23
Merge branch 'FZJ-IEK3-VSA:main' into JHo_more_advanced_heatpump
Hoppe-J Jan 12, 2024
1551cdc
system setup with "generic" hp modell --> easier to compare with "hou…
Hoppe-J Jan 13, 2024
16fcf22
implementing caching für dhw,
Hoppe-J Jan 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,686 changes: 1,686 additions & 0 deletions hisim/components/more_advanced_heat_pump_hplib.py

Large diffs are not rendered by default.

87 changes: 86 additions & 1 deletion hisim/components/weather.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class WeatherDataSourceEnum(Enum):
DWD = 1
NSRDB = 2
NSRDB_15MIN = 3
OWN_DWD_10MIN = 4


class LocationEnum(Enum):
Expand Down Expand Up @@ -420,6 +421,7 @@ class Weather(Component):
Azimuth = "Azimuth"
ApparentZenith = "ApparentZenith"
WindSpeed = "WindSpeed"
Pressure = "Pressure"
Weather_Temperature_Forecast_24h = "Weather_Temperature_Forecast_24h"
DailyAverageOutsideTemperatures = "DailyAverageOutsideTemperatures"

Expand Down Expand Up @@ -523,6 +525,14 @@ def __init__(
output_description=f"here a description for {self.WindSpeed} will follow.",
)

self.pressure_output: ComponentOutput = self.add_output(
self.component_name,
self.Pressure,
lt.LoadTypes.PRESSURE,
lt.Units.PASCAL,
output_description=f"here a description for {self.Pressure} will follow.",
)

self.daily_average_outside_temperature_output: ComponentOutput = self.add_output(
self.component_name,
self.DailyAverageOutsideTemperatures,
Expand All @@ -537,6 +547,7 @@ def __init__(
self.altitude_list: List[float]
self.azimuth_list: List[float]
self.wind_speed_list: List[float]
self.pressure_list: List[float]
self.ghi_list: List[float]
self.apparent_zenith_list: List[float]
self.dhi_list: List[float]
Expand Down Expand Up @@ -578,6 +589,7 @@ def i_simulate(
stsv.set_output_value(self.altitude_output, self.altitude_list[timestep])
stsv.set_output_value(self.azimuth_output, self.azimuth_list[timestep])
stsv.set_output_value(self.wind_speed_output, self.wind_speed_list[timestep])
stsv.set_output_value(self.pressure_output, self.pressure_list[timestep]*100) #*100 umrechnung von hPA bzw mbar in PA
stsv.set_output_value(
self.apparent_zenith_output, self.apparent_zenith_list[timestep]
)
Expand Down Expand Up @@ -634,6 +646,7 @@ def i_prepare_simulation(self) -> None:
self.azimuth_list = my_weather["azimuth"].tolist()
self.apparent_zenith_list = my_weather["apparent_zenith"].tolist()
self.wind_speed_list = my_weather["Wspd"].tolist()
self.pressure_list = my_weather["Pressure"].tolist()
else:
tmy_data = read_test_reference_year_data(
weatherconfig=self.weather_config,
Expand All @@ -658,6 +671,30 @@ def i_prepare_simulation(self) -> None:
.asfreq()
.interpolate(method="linear")
)
pressure = (tmy_data["Pressure"].resample("1T").asfreq() .interpolate(method="linear")
)

elif self.weather_config.data_source == WeatherDataSourceEnum.OWN_DWD_10MIN:
dni = (
tmy_data["DNI"].resample("1T").asfreq().interpolate(method="linear")
)
temperature = (
tmy_data["T"].resample("1T").asfreq().interpolate(method="linear")
)
dhi = (
tmy_data["DHI"].resample("1T").asfreq().interpolate(method="linear")
)
ghi = (
tmy_data["GHI"].resample("1T").asfreq().interpolate(method="linear")
)
wind_speed = (
tmy_data["Wspd"]
.resample("1T")
.asfreq()
.interpolate(method="linear")
)
pressure = (tmy_data["Pressure"].resample("1T").asfreq().interpolate(method="linear")
)
else:
dni = self.interpolate(
tmy_data["DNI"], self.my_simulation_parameters.year
Expand All @@ -674,6 +711,9 @@ def i_prepare_simulation(self) -> None:
wind_speed = self.interpolate(
tmy_data["Wspd"], self.my_simulation_parameters.year
)
pressure = self.interpolate(
tmy_data["Pressure"], self.my_simulation_parameters.year
)
# calculate extra terrestrial radiation- n eeded for perez array diffuse irradiance models
dni_extra = pd.Series(pvlib.irradiance.get_extra_radiation(dni.index), index=dni.index) # type: ignore

Expand Down Expand Up @@ -725,6 +765,9 @@ def i_prepare_simulation(self) -> None:
self.wind_speed_list = (
wind_speed.resample(str(seconds_per_timestep) + "S").mean().tolist()
)
self.pressure_list = (
pressure.resample(str(seconds_per_timestep) + "S").mean().tolist()
)
else:
self.temperature_list = temperature.tolist()
self.dry_bulb_list = temperature.to_list()
Expand All @@ -742,6 +785,7 @@ def i_prepare_simulation(self) -> None:
self.wind_speed_list = (
wind_speed.resample(str(seconds_per_timestep) + "S").mean().tolist()
)
self.pressure_list = pressure.tolist()

solardata = [
self.dni_list,
Expand All @@ -753,6 +797,7 @@ def i_prepare_simulation(self) -> None:
self.apparent_zenith_list,
self.dry_bulb_list,
self.wind_speed_list,
self.pressure_list,
self.dniextra_list,
self.daily_average_outside_temperature_list_in_celsius,
]
Expand All @@ -769,6 +814,7 @@ def i_prepare_simulation(self) -> None:
"apparent_zenith",
"DryBulb",
"Wspd",
"Pressure",
"DNIextra",
"t_out_daily_average",
],
Expand Down Expand Up @@ -809,6 +855,10 @@ def i_prepare_simulation(self) -> None:
key=SingletonDictKeyEnum.WEATHERWINDSPEEDYEARLYFORECAST,
entry=self.wind_speed_list,
)
SingletonSimRepository().set_entry(
key=SingletonDictKeyEnum.WEATHERPRESSUREYEARLYFORECAST,
entry=self.pressure_list,
)
SingletonSimRepository().set_entry(
key=SingletonDictKeyEnum.WEATHERALTITUDEYEARLYFORECAST,
entry=self.altitude_list,
Expand Down Expand Up @@ -956,6 +1006,17 @@ def get_coordinates(filepath: str, source_enum: WeatherDataSourceEnum) -> Any:
lon = float(row[6])
elif i > 1:
break

elif source_enum == WeatherDataSourceEnum.OWN_DWD_10MIN:
with open(filepath, encoding="utf-8") as csvfile:
spamreader = csv.reader(csvfile)
for i, row in enumerate(spamreader):
if i == 1:
location_name = row[0]
lat = float(row[1])
lon = float(row[2])
elif i > 1:
break
else:
# get the geoposition
with open(filepath + ".dat", encoding="utf-8") as file_stream:
Expand All @@ -980,6 +1041,8 @@ def read_test_reference_year_data(weatherconfig: WeatherConfig, year: int) -> An
data = read_dwd_data(filepath, year)
elif weatherconfig.data_source == WeatherDataSourceEnum.NSRDB_15MIN:
data = read_nsrdb_15min_data(filepath, year)
elif weatherconfig.data_source == WeatherDataSourceEnum.OWN_DWD_10MIN:
data = read_dwd_simulation_data_10min(filepath, year)

return data

Expand Down Expand Up @@ -1017,7 +1080,6 @@ def read_dwd_data(filepath: str, year: int) -> pd.DataFrame:
"WR": "Wdir",
}
)

# calculate direct normal
data["DNI"] = calculate_direct_normal_radiation(data["B"], lon, lat)
return data
Expand Down Expand Up @@ -1063,6 +1125,29 @@ def read_nsrdb_15min_data(filepath: str, year: int) -> pd.DataFrame:
)
return data

def read_dwd_simulation_data_10min(filepath: str, year: int) -> pd.DataFrame:
"""Reads a set of OWN DWD data in 10 min resolution."""
data = pd.read_csv(filepath, encoding="utf-8", skiprows=[0,1])
# get data
data.index = pd.date_range(
f"{year}-01-01 00:00:00", periods=24 * 6 * 365, freq="600S", tz="UTC"
)
data = data.rename(
columns={
"diffuse_irradiation": "DHI",
"temperature": "T",
"wind_speed": "Wspd",
"month": "Month",
"day": "Day",
"hour": "Hour",
"minute": "Minutes",
"pressure": "Pressure",
"wind_direction": "Wdir",
"global_irradiation": "GHI"
}
)
data["DNI"] = data["GHI"] - data["DHI"]
return data

def calculate_direct_normal_radiation(
direct_horizontal_irradation: pd.Series,
Expand Down
7 changes: 7 additions & 0 deletions hisim/loadtypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,12 @@ class LoadTypes(str, enum.Enum):

VOLUME = "Volume"
TEMPERATURE = "Temperature"
PRESSURE = "Pressure"
TIME = "Time"

# Substance
GAS = "Gas"
AIR = "Air"
HYDROGEN = "Hydrogen"
OXYGEN = "Oxygen"
WATER = "Water"
Expand Down Expand Up @@ -147,6 +149,10 @@ class Units(str, enum.Enum):
# Degrees
DEGREES = "Degrees"

# Pressure
BAR = "bar"
PASCAL = "Pa"

# Time
SECONDS = "s"
HOURS = "h"
Expand All @@ -167,6 +173,7 @@ class ComponentType(str, enum.Enum):
"""Component types for use in dynamic controllers."""

PV = "PV"
WINDTURBINE = "Windturbine"
SMART_DEVICE = "SmartDevice"
SURPLUS_CONTROLLER = "SurplusController"
PREDICTIVE_CONTROLLER = "PredictiveControllerforSmartDevices"
Expand Down
90 changes: 47 additions & 43 deletions hisim/sim_repository_singleton.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,46 +105,50 @@ class SingletonDictKeyEnum(enum.Enum):
"""Class for setting dictionary keys in the singleton sim repository."""

NUMBEROFAPARTMENTS = 1
WATERMASSFLOWRATEOFHEATGENERATOR = 2
MAXTHERMALBUILDINGDEMAND = 3
SETHEATINGTEMPERATUREFORWATERSTORAGE = 4
SETCOOLINGTEMPERATUREFORWATERSTORAGE = 5
LOCATION = 6
RESULT_SCENARIO_NAME = 7
THERMALTRANSMISSIONCOEFFICIENTGLAZING = 8
THERMALTRANSMISSIONSURFACEINDOORAIR = 9
THERMALTRANSMISSIONCOEFFICIENTOPAQUEEM = 10
THERMALTRANSMISSIONCOEFFICIENTOPAQUEMS = 11
THERMALTRANSMISSIONCOEFFICIENTVENTILLATION = 12
THERMALCAPACITYENVELOPE = 13
PREDICTIVE = 14
PREDICTIONHORIZON = 15
PVINCLUDED = 16
PVPEAKPOWER = 17
SMARTDEVICESINCLUDED = 18
BATTERYINCLUDED = 19
MPCBATTERYCAPACITY = 20
COPCOEFFICIENTHEATING = 21
EERCOEFFICIENTCOOLING = 22
WEATHERTEMPERATUREOUTSIDEYEARLYFORECAST = 23
HEATFLUXTHERMALMASSNODEFORECAST = 24
HEATFLUXSURFACENODEFORECAST = 25
HEATFLUXINDOORAIRNODEFORECAST = 26
PVFORECASTYEARLY = 28
MAXIMUMBATTERYCAPACITY = 29
MINIMUMBATTERYCAPACITY = 30
MAXIMALCHARGINGPOWER = 31
MAXIMALDISCHARGINGPOWER = 32
BATTERYEFFICIENCY = 33
INVERTEREFFICIENCY = 34
PRICEPURCHASEFORECAST24H = 35
PRICEINJECTIONFORECAST24H = 36
WEATHERALTITUDEYEARLYFORECAST = 37
WEATHERDIFFUSEHORIZONTALIRRADIANCEYEARLYFORECAST = 38
WEATHERDIRECTNORMALIRRADIANCEYEARLYFORECAST = 39
WEATHERDIRECTNORMALIRRADIANCEEXTRAYEARLYFORECAST = 40
WEATHERGLOBALHORIZONTALIRRADIANCEYEARLYFORECAST = 41
WEATHERAZIMUTHYEARLYFORECAST = 42
WEATHERAPPARENTZENITHYEARLYFORECAST = 43
HEATINGBYRESIDENTSYEARLYFORECAST = 44
WEATHERWINDSPEEDYEARLYFORECAST = 45
SETHEATINGTEMPERATUREFORBUILDING = 2
SETCOOLINGTEMPERATUREFORBUILDING = 3
WATERMASSFLOWRATEOFHEATINGDISTRIBUTIONSYSTEM = 4
WATERMASSFLOWRATEOFHEATGENERATOR = 5
MAXTHERMALBUILDINGDEMAND = 6
SETHEATINGTEMPERATUREFORWATERSTORAGE = 7
SETCOOLINGTEMPERATUREFORWATERSTORAGE = 8
HEATINGSYSTEM = 9
LOCATION = 10
RESULT_SCENARIO_NAME = 11
THERMALTRANSMISSIONCOEFFICIENTGLAZING = 12
THERMALTRANSMISSIONSURFACEINDOORAIR = 13
THERMALTRANSMISSIONCOEFFICIENTOPAQUEEM = 14
THERMALTRANSMISSIONCOEFFICIENTOPAQUEMS = 15
THERMALTRANSMISSIONCOEFFICIENTVENTILLATION = 16
THERMALCAPACITYENVELOPE = 17
PREDICTIVE = 18
PREDICTIONHORIZON = 19
PVINCLUDED = 20
PVPEAKPOWER = 21
SMARTDEVICESINCLUDED = 22
BATTERYINCLUDED = 23
MPCBATTERYCAPACITY = 24
COPCOEFFICIENTHEATING = 25
EERCOEFFICIENTCOOLING = 26
WEATHERTEMPERATUREOUTSIDEYEARLYFORECAST = 27
HEATFLUXTHERMALMASSNODEFORECAST = 28
HEATFLUXSURFACENODEFORECAST = 29
HEATFLUXINDOORAIRNODEFORECAST = 30
PVFORECASTYEARLY = 31
MAXIMUMBATTERYCAPACITY = 32
MINIMUMBATTERYCAPACITY = 33
MAXIMALCHARGINGPOWER = 34
MAXIMALDISCHARGINGPOWER = 35
BATTERYEFFICIENCY = 36
INVERTEREFFICIENCY = 37
PRICEPURCHASEFORECAST24H = 38
PRICEINJECTIONFORECAST24H = 39
WEATHERALTITUDEYEARLYFORECAST = 40
WEATHERDIFFUSEHORIZONTALIRRADIANCEYEARLYFORECAST = 41
WEATHERDIRECTNORMALIRRADIANCEYEARLYFORECAST = 42
WEATHERDIRECTNORMALIRRADIANCEEXTRAYEARLYFORECAST = 43
WEATHERGLOBALHORIZONTALIRRADIANCEYEARLYFORECAST = 44
WEATHERAZIMUTHYEARLYFORECAST = 45
WEATHERAPPARENTZENITHYEARLYFORECAST = 46
HEATINGBYRESIDENTSYEARLYFORECAST = 47
WEATHERWINDSPEEDYEARLYFORECAST = 48
Loading