Class: OpenStudio::Model::ZoneHVACComponent

Inherits:
Object
  • Object
show all
Defined in:
lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb

Overview

open the class to add methods to apply HVAC efficiency standards

Instance Method Summary collapse

Instance Method Details

#apply_prm_baseline_fan_power(template) ⇒ Bool

Sets the fan power of zone level HVAC equipment (PTACs, PTHPs, Fan Coils, and Unit Heaters) based on the W/cfm specified in the standard.

Parameters:

  • template (String)

    the template base requirements on

Returns:

  • (Bool)

    returns true if successful, false if not



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb', line 9

def apply_prm_baseline_fan_power(template)
  OpenStudio.logFree(OpenStudio::Debug, 'openstudio.model.ZoneHVACComponent', "Setting fan power for #{name}.")

  # Convert this to the actual class type
  zone_hvac = if to_ZoneHVACFourPipeFanCoil.is_initialized
                to_ZoneHVACFourPipeFanCoil.get
              elsif to_ZoneHVACUnitHeater.is_initialized
                to_ZoneHVACUnitHeater.get
              elsif to_ZoneHVACPackagedTerminalAirConditioner.is_initialized
                to_ZoneHVACPackagedTerminalAirConditioner.get
              elsif to_ZoneHVACPackagedTerminalHeatPump.is_initialized
                to_ZoneHVACPackagedTerminalHeatPump.get
              else
                nil
              end

  # Do nothing for other types of zone HVAC equipment
  if zone_hvac.nil?
    return false
  end

  # Determine the W/cfm
  fan_efficacy_w_per_cfm = 0.3

  # Convert efficacy to metric
  # 1 cfm = 0.0004719 m^3/s
  fan_efficacy_w_per_m3_per_s = fan_efficacy_w_per_cfm / 0.0004719

  # Get the fan
  fan = if zone_hvac.supplyAirFan.to_FanConstantVolume.is_initialized
          zone_hvac.supplyAirFan.to_FanConstantVolume.get
        elsif zone_hvac.supplyAirFan.to_FanVariableVolume.is_initialized
          zone_hvac.supplyAirFan.to_FanVariableVolume.get
        elsif zone_hvac.supplyAirFan.to_FanOnOff.is_initialized
          zone_hvac.supplyAirFan.to_FanOnOff.get
        end

  # Get the maximum flow rate through the fan
  max_air_flow_rate = nil
  if fan.autosizedMaximumFlowRate.is_initialized
    max_air_flow_rate = fan.autosizedMaximumFlowRate.get
  elsif fan.maximumFlowRate.is_initialized
    max_air_flow_rate = fan.maximumFlowRate.get
  end
  max_air_flow_rate_cfm = OpenStudio.convert(max_air_flow_rate, 'm^3/s', 'ft^3/min').get

  # Set the impeller efficiency
  fan.change_impeller_efficiency(fan.baseline_impeller_efficiency(template))

  # Set the motor efficiency, preserving the impeller efficency.
  # For zone HVAC fans, a bhp lookup of 0.5bhp is always used because
  # they are assumed to represent a series of small fans in reality.
  fan.apply_standard_minimum_motor_efficiency(template, fan.brake_horsepower)

  # Calculate a new pressure rise to hit the target W/cfm
  fan_tot_eff = fan.fanEfficiency
  fan_rise_new_pa = fan_efficacy_w_per_m3_per_s * fan_tot_eff
  fan.setPressureRise(fan_rise_new_pa)

  # Calculate the newly set efficacy
  fan_power_new_w = fan_rise_new_pa * max_air_flow_rate / fan_tot_eff
  fan_efficacy_new_w_per_cfm = fan_power_new_w / max_air_flow_rate_cfm
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.ZoneHVACComponent', "For #{name}: fan efficacy set to #{fan_efficacy_new_w_per_cfm.round(2)} W/cfm.")

  return true
end