Source code for honeybee_openstudio.hvac.standards.central_air_source_heat_pump
# coding=utf-8
"""Module taken from OpenStudio-standards.
https://github.com/NREL/openstudio-standards/blob/master/
lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb
"""
from __future__ import division
from honeybee_openstudio.openstudio import openstudio_model
from .utilities import ems_friendly_name
[docs]
def create_central_air_source_heat_pump(model, hot_water_loop, name=None, cop=3.65):
"""Prototype CentralAirSourceHeatPump object using PlantComponentUserDefined.
Args:
model: [OpenStudio::Model::Model] OpenStudio model object.
hot_water_loop: [<OpenStudio::Model::PlantLoop>] a hot water loop served
by the central air source heat pump.
name: [String] the name of the central air source heat pump, or nil in
which case it will be defaulted.
cop: [Double] air source heat pump rated cop.
"""
# create the PlantComponentUserDefined object as a proxy for the Central Air Source Heat Pump
plant_comp = openstudio_model.PlantComponentUserDefined(model)
if name is None:
if hot_water_loop is None:
name = 'Central Air Source Heat Pump'
else:
name = '{} Central Air Source Heat Pump'.format(hot_water_loop.nameString())
# change equipment name for EMS validity
plant_comp.setName(ems_friendly_name(name))
# set plant component properties
plant_comp.setPlantLoadingMode('MeetsLoadWithNominalCapacityHiOutLimit')
plant_comp.setPlantLoopFlowRequestMode('NeedsFlowIfLoopOn')
# plant design volume flow rate internal variable
vdot_des_int_var = openstudio_model.EnergyManagementSystemInternalVariable(
model, 'Plant Design Volume Flow Rate')
vdot_des_int_var.setName('{}_Vdot_Des_Int_Var'.format(plant_comp.nameString()))
vdot_des_int_var.setInternalDataIndexKeyName(str(hot_water_loop.handle()))
# inlet temperature internal variable
tin_int_var = openstudio_model.EnergyManagementSystemInternalVariable(
model, 'Inlet Temperature for Plant Connection 1')
tin_int_var.setName('{}_Tin_Int_Var'.format(plant_comp.nameString()))
tin_int_var.setInternalDataIndexKeyName(str(plant_comp.handle()))
# inlet mass flow rate internal variable
mdot_int_var = openstudio_model.EnergyManagementSystemInternalVariable(
model, 'Inlet Mass Flow Rate for Plant Connection 1')
mdot_int_var.setName('{}_Mdot_Int_Var'.format(plant_comp.nameString()))
mdot_int_var.setInternalDataIndexKeyName(str(plant_comp.handle()))
# inlet specific heat internal variable
cp_int_var = openstudio_model.EnergyManagementSystemInternalVariable(
model, 'Inlet Specific Heat for Plant Connection 1')
cp_int_var.setName('{}_Cp_Int_Var'.format(plant_comp.nameString()))
cp_int_var.setInternalDataIndexKeyName(str(plant_comp.handle()))
# inlet density internal variable
rho_int_var = openstudio_model.EnergyManagementSystemInternalVariable(
model, 'Inlet Density for Plant Connection 1')
rho_int_var.setName('{}_rho_Int_Var'.format(plant_comp.nameString()))
rho_int_var.setInternalDataIndexKeyName(str(plant_comp.handle()))
# load request internal variable
load_int_var = openstudio_model.EnergyManagementSystemInternalVariable(
model, 'Load Request for Plant Connection 1')
load_int_var.setName('{}_Load_Int_Var'.format(plant_comp.nameString()))
load_int_var.setInternalDataIndexKeyName(str(plant_comp.handle()))
# supply outlet node setpoint temperature sensor
setpt_mgr_sch_sen = openstudio_model.EnergyManagementSystemSensor(
model, 'Schedule Value')
setpt_mgr_sch_sen.setName('{}_Setpt_Mgr_Temp_Sen'.format(plant_comp.nameString()))
for m in hot_water_loop.supplyOutletNode().setpointManagers():
if m.to_SetpointManagerScheduled().is_initialized():
m_name = m.to_SetpointManagerScheduled().get().schedule().nameString()
setpt_mgr_sch_sen.setKeyName(m_name)
# outdoor air drybulb temperature sensor
oa_dbt_sen = openstudio_model.EnergyManagementSystemSensor(
model, 'Site Outdoor Air Drybulb Temperature')
oa_dbt_sen.setName('{}_OA_DBT_Sen'.format(plant_comp.nameString()))
oa_dbt_sen.setKeyName('Environment')
# minimum mass flow rate actuator
mdot_min_act = plant_comp.minimumMassFlowRateActuator().get()
mdot_min_act.setName('{}_Mdot_Min_Act'.format(plant_comp.nameString()))
# maximum mass flow rate actuator
mdot_max_act = plant_comp.maximumMassFlowRateActuator().get()
mdot_max_act.setName('{}_Mdot_Max_Act'.format(plant_comp.nameString()))
# design flow rate actuator
vdot_des_act = plant_comp.designVolumeFlowRateActuator().get()
vdot_des_act.setName('{}_Vdot_Des_Act'.format(plant_comp.nameString()))
# minimum loading capacity actuator
cap_min_act = plant_comp.minimumLoadingCapacityActuator().get()
cap_min_act.setName('{}_Cap_Min_Act'.format(plant_comp.nameString()))
# maximum loading capacity actuator
cap_max_act = plant_comp.maximumLoadingCapacityActuator().get()
cap_max_act.setName('{}_Cap_Max_Act'.format(plant_comp.nameString()))
# optimal loading capacity actuator
cap_opt_act = plant_comp.optimalLoadingCapacityActuator().get()
cap_opt_act.setName('{}_Cap_Opt_Act'.format(plant_comp.nameString()))
# outlet temperature actuator
tout_act = plant_comp.outletTemperatureActuator().get()
tout_act.setName('{}_Tout_Act'.format(plant_comp.nameString()))
# mass flow rate actuator
mdot_req_act = plant_comp.massFlowRateActuator().get()
mdot_req_act.setName('{}_Mdot_Req_Act'.format(plant_comp.nameString()))
# heat pump COP curve
constant_coeff = 1.932 + (cop - 3.65)
hp_cop_curve = openstudio_model.CurveQuadratic(model)
hp_cop_curve.setCoefficient1Constant(constant_coeff)
hp_cop_curve.setCoefficient2x(0.227674286)
hp_cop_curve.setCoefficient3xPOW2(-0.007313143)
hp_cop_curve.setMinimumValueofx(1.67)
hp_cop_curve.setMaximumValueofx(12.78)
hp_cop_curve.setInputUnitTypeforX('Temperature')
hp_cop_curve.setOutputUnitType('Dimensionless')
# heat pump COP curve index variable
hp_cop_curve_idx_var = \
openstudio_model.EnergyManagementSystemCurveOrTableIndexVariable(model, hp_cop_curve)
# high outlet temperature limit actuator
tout_max_act = openstudio_model.EnergyManagementSystemActuator(
plant_comp, 'Plant Connection 1', 'High Outlet Temperature Limit')
tout_max_act.setName('{}_Tout_Max_Act'.format(plant_comp.nameString()))
# init program
init_pgrm = plant_comp.plantInitializationProgram().get()
init_pgrm.setName('{}_Init_Pgrm'.format(plant_comp.nameString()))
init_pgrm_body = \
'SET Loop_Exit_Temp = {loop_exit_temp}\n' \
'SET Loop_Delta_Temp = {design_temp_diff}\n' \
'SET Cp = @CPHW Loop_Exit_Temp\n' \
'SET rho = @RhoH2O Loop_Exit_Temp\n' \
'SET {vdot_des_act_handle} = {vdot_des_int_var_handle}\n' \
'SET {mdot_min_act_handle} = 0\n' \
'SET Mdot_Max = {vdot_des_int_var_handle} * rho\n' \
'SET {mdot_max_act_handle} = Mdot_Max\n' \
'SET Cap = Mdot_Max * Cp * Loop_Delta_Temp\n' \
'SET {cap_min_act_handle} = 0\n' \
'SET {cap_max_act_handle} = Cap\n' \
'SET {cap_opt_act_handle} = 1 * Cap'.format(
loop_exit_temp=hot_water_loop.sizingPlant().designLoopExitTemperature(),
design_temp_diff=hot_water_loop.sizingPlant().loopDesignTemperatureDifference(),
vdot_des_act_handle=vdot_des_act.handle(),
vdot_des_int_var_handle=vdot_des_int_var.handle(),
mdot_min_act_handle=mdot_min_act.handle(),
mdot_max_act_handle=mdot_max_act.handle(),
cap_min_act_handle=cap_min_act.handle(),
cap_max_act_handle=cap_max_act.handle(),
cap_opt_act_handle=cap_opt_act.handle()
)
init_pgrm.setBody(init_pgrm_body)
# sim program
sim_pgrm = plant_comp.plantSimulationProgram().get()
sim_pgrm.setName('{}_Sim_Pgrm'.format(plant_comp.nameString()))
sim_pgrm_body = \
'SET tmp = {load_int_var_handle}\n' \
'SET tmp = {tin_int_var_handle}\n' \
'SET tmp = {mdot_int_var_handle}\n' \
'SET {tout_max_act_handle} = 75.0\n' \
'IF {load_int_var_handle} == 0\n' \
'SET {tout_act_handle} = {tin_int_var_handle}\n' \
'SET {mdot_req_act_handle} = 0\n' \
'SET Elec = 0\n' \
'RETURN\n' \
'ENDIF\n' \
'IF {load_int_var_handle} >= {cap_max_act_handle}\n' \
'SET Qdot = {cap_max_act_handle}\n' \
'SET Mdot = {mdot_max_act_handle}\n' \
'SET {mdot_req_act_handle} = Mdot\n' \
'SET {tout_act_handle} = (Qdot / (Mdot * {cp_int_var_handle})) + {tin_int_var_handle}\n' \
'IF {tout_act_handle} > {tout_max_act_handle}\n' \
'SET {tout_act_handle} = {tout_max_act_handle}\n' \
'SET Qdot = Mdot * {cp_int_var_handle} * ({tout_act_handle} - {tin_int_var_handle})\n' \
'ENDIF\n' \
'ELSE\n' \
'SET Qdot = {load_int_var_handle}\n' \
'SET {tout_act_handle} = {setpt_mgr_sch_sen_handle}\n' \
'SET Mdot = Qdot / ({cp_int_var_handle} * ({tout_act_handle} - {tin_int_var_handle}))\n' \
'SET {mdot_req_act_handle} = Mdot\n' \
'ENDIF\n' \
'SET Tdb = {oa_dbt_sen_handle}\n' \
'SET COP = @CurveValue {hp_cop_curve_idx_var_handle} Tdb\n' \
'SET EIR = 1 / COP\n' \
'SET Pwr = Qdot * EIR\n' \
'SET Elec = Pwr * SystemTimestep * 3600'.format(
load_int_var_handle=load_int_var.handle(),
tin_int_var_handle=tin_int_var.handle(),
mdot_int_var_handle=mdot_int_var.handle(),
tout_max_act_handle=tout_max_act.handle(),
tout_act_handle=tout_act.handle(),
mdot_req_act_handle=mdot_req_act.handle(),
cap_max_act_handle=cap_max_act.handle(),
mdot_max_act_handle=mdot_max_act.handle(),
cp_int_var_handle=cp_int_var.handle(),
setpt_mgr_sch_sen_handle=setpt_mgr_sch_sen.handle(),
oa_dbt_sen_handle=oa_dbt_sen.handle(),
hp_cop_curve_idx_var_handle=hp_cop_curve_idx_var.handle()
)
sim_pgrm.setBody(sim_pgrm_body)
# init program calling manager
init_mgr = plant_comp.plantInitializationProgramCallingManager().get()
init_mgr.setName('{}_Init_Pgrm_Mgr'.format(plant_comp.nameString()))
# sim program calling manager
sim_mgr = plant_comp.plantSimulationProgramCallingManager().get()
sim_mgr.setName('{}_Sim_Pgrm_Mgr'.format(plant_comp.nameString()))
# metered output variable
elec_mtr_out_var = openstudio_model.EnergyManagementSystemMeteredOutputVariable(
model, '{} Electricity Consumption'.format(plant_comp.nameString()))
elec_mtr_out_var.setName('{} Electricity Consumption'.format(plant_comp.nameString()))
elec_mtr_out_var.setEMSVariableName('Elec')
elec_mtr_out_var.setUpdateFrequency('SystemTimestep')
elec_mtr_out_var.setString(4, str(sim_pgrm.handle()))
elec_mtr_out_var.setResourceType('Electricity')
elec_mtr_out_var.setGroupType('HVAC')
elec_mtr_out_var.setEndUseCategory('Heating')
elec_mtr_out_var.setEndUseSubcategory('')
elec_mtr_out_var.setUnits('J')
# add to supply side of hot water loop if specified
if hot_water_loop is not None:
hot_water_loop.addSupplyBranchForComponent(plant_comp)
# add operation scheme
htg_op_scheme = openstudio_model.PlantEquipmentOperationHeatingLoad(model)
htg_op_scheme.addEquipment(1000000000, plant_comp)
hot_water_loop.setPlantEquipmentOperationHeatingLoad(htg_op_scheme)
return plant_comp