-
Notifications
You must be signed in to change notification settings - Fork 10
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
120V HPWH #134
base: dev
Are you sure you want to change the base?
120V HPWH #134
Changes from 8 commits
3d6916c
a5cac45
212c4df
0ba3e01
314e900
1411e40
1174c46
b781132
49350c6
f099d2a
deeec2f
aeb1c72
41cfdc3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||
---|---|---|---|---|
|
@@ -413,8 +413,12 @@ class HeatPumpWaterHeater(ElectricResistanceWaterHeater): | |||
def __init__(self, hp_only_mode=False, water_nodes=12, **kwargs): | ||||
super().__init__(water_nodes=water_nodes, **kwargs) | ||||
|
||||
self.low_power_hpwh = kwargs.get('Low Power HPWH', False) | ||||
|
||||
# Control parameters | ||||
self.hp_only_mode = hp_only_mode | ||||
if self.low_power_hpwh: | ||||
self.hp_only_mode = True | ||||
self.er_only_mode = False # True when ambient temp is very hot or cold, forces HP off | ||||
hp_on_time = kwargs.get('HPWH Minimum On Time (min)', 10) | ||||
hp_off_time = kwargs.get('HPWH Minimum Off Time (min)', 0) | ||||
|
@@ -424,25 +428,38 @@ def __init__(self, hp_only_mode=False, water_nodes=12, **kwargs): | |||
self.deadband_temp = kwargs.get('Deadband Temperature (C)', 8.17) # different default than ERWH | ||||
|
||||
# Nominal COP based on simulation of the UEF test procedure at varying COPs | ||||
self.cop_nominal = kwargs['HPWH COP (-)'] | ||||
self.hp_cop = self.cop_nominal | ||||
if self.cop_nominal < 2: | ||||
self.warn("Low Nominal COP:", self.cop_nominal) | ||||
|
||||
# Heat pump capacity and power parameters - hardcoded for now | ||||
if 'HPWH Capacity (W)' in kwargs: | ||||
self.hp_capacity_nominal = kwargs['HPWH Capacity (W)'] # max heating capacity, in W | ||||
else: | ||||
hp_power_nominal = kwargs.get('HPWH Power (W)', 500) # in W | ||||
if self.low_power_hpwh: #TODO: can read a lot of these directly when properly integrated into HPXML | ||||
self.cop_nominal = 4.2 | ||||
self.hp_cop = self.cop_nominal | ||||
self.hp_capacity_nominal = 1499.4 | ||||
hp_power_nominal = self.hp_capacity_nominal / self.cop_nominal # in W | ||||
self.hp_capacity_nominal = hp_power_nominal * self.hp_cop # in W | ||||
self.hp_capacity = self.hp_capacity_nominal # in W | ||||
self.hp_capacity = self.hp_capacity_nominal # in W | ||||
else: | ||||
self.cop_nominal = kwargs['HPWH COP (-)'] | ||||
self.hp_cop = self.cop_nominal | ||||
if self.cop_nominal < 2: | ||||
self.warn("Low Nominal COP:", self.cop_nominal) | ||||
|
||||
# Heat pump capacity and power parameters - hardcoded for now | ||||
if 'HPWH Capacity (W)' in kwargs: | ||||
self.hp_capacity_nominal = kwargs['HPWH Capacity (W)'] # max heating capacity, in W | ||||
else: | ||||
hp_power_nominal = kwargs.get('HPWH Power (W)', 500) # in W | ||||
self.hp_capacity_nominal = hp_power_nominal * self.hp_cop # in W | ||||
self.hp_capacity = self.hp_capacity_nominal # in W | ||||
self.parasitic_power = kwargs.get('HPWH Parasitics (W)', 1) # Standby power in W | ||||
self.fan_power = kwargs.get('HPWH Fan Power (W)', 35) # in W | ||||
|
||||
# Dynamic capacity coefficients | ||||
# curve format: [1, t_in_wet, t_in_wet ** 2, t_lower, t_lower ** 2, t_lower * t_in_wet] | ||||
self.hp_capacity_coeff = np.array([0.563, 0.0437, 0.000039, 0.0055, -0.000148, -0.000145]) | ||||
self.cop_coeff = np.array([1.1332, 0.063, -0.0000979, -0.00972, -0.0000214, -0.000686]) | ||||
if self.low_power_hpwh: | ||||
self.hp_capacity_coeff = np.array([0.813, 0.0160, 0.000537, 0.0020319, -0.0000860, -0.0000686]) | ||||
self.cop_coeff = np.array([1.1332, 0.063, -0.0000979, -0.00972, -0.0000214, -0.000686]) | ||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you double check this? Looks like you copied the existing capacity values There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good call, but this is actually up to date (ie different) in the latest version? OCHRE/ochre/Equipment/WaterHeater.py Line 462 in b781132
|
||||
|
||||
else: | ||||
self.hp_capacity_coeff = np.array([0.563, 0.0437, 0.000039, 0.0055, -0.000148, -0.000145]) | ||||
self.cop_coeff = np.array([1.0132, .0436, 0.0000117, -0.01113, 0.00003688, -0.000498]) | ||||
|
||||
# Sensible and latent heat parameters | ||||
self.shr_nominal = kwargs.get('HPWH SHR (-)', 0.88) # unitless | ||||
|
@@ -562,7 +579,13 @@ def run_thermostat_control(self, use_future_states=False): | |||
def update_internal_control(self): | ||||
# operate as ERWH when ambient temperatures are out of bounds | ||||
t_amb = self.current_schedule['Zone Temperature (C)'] | ||||
if t_amb < 7.222 or t_amb > 43.333: | ||||
if self.low_power_hpwh: | ||||
t_low = 2.778 | ||||
t_high = 62.778 | ||||
else: | ||||
t_low = 7.222 | ||||
t_high = 43.333 | ||||
if t_amb < t_low or t_amb > t_high: | ||||
self.er_only_mode = True | ||||
else: | ||||
self.er_only_mode = False | ||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it'd be better to move these parameters into the hpxml.py file. I can
start to work on that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agreed, when we have HPXML support for 120V HPWHs, we'll get rid of this and a few other things that are just for testing purposes.