lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb in openstudio-standards-0.2.14 vs lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb in openstudio-standards-0.2.15.pre.rc1
- old
+ new
@@ -1,17 +1,21 @@
class Standard
# @!group ZoneHVACComponent
+ # default fan efficiency for small zone hvac fans, in watts per cfm
+ #
+ # @return [Double] fan efficiency in watts per cfm
def zone_hvac_component_prm_baseline_fan_efficacy
fan_efficacy_w_per_cfm = 0.3
return fan_efficacy_w_per_cfm
end
# Sets the fan power of zone level HVAC equipment
# (Fan coils, Unit Heaters, PTACs, PTHPs, VRF Terminals, WSHPs, ERVs)
# based on the W/cfm specified in the standard.
#
+ # @param zone_hvac_component [OpenStudio::Model::ZoneHVACComponent] zone hvac component
# @return [Bool] returns true if successful, false if not
def zone_hvac_component_apply_prm_baseline_fan_power(zone_hvac_component)
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.ZoneHVACComponent', "Setting fan power for #{zone_hvac_component.name}.")
# Convert this to the actual class type
@@ -81,16 +85,21 @@
return true
end
# Default occupancy fraction threshold for determining if the spaces served by the zone hvac are occupied
+ #
+ # @return [Double] unoccupied threshold
def zone_hvac_unoccupied_threshold
return 0.15
end
# If the supply air fan operating mode schedule is always off (to follow load),
# and the zone requires ventilation, override it to follow the zone occupancy schedule
+ #
+ # @param zone_hvac_component [OpenStudio::Model::ZoneHVACComponent] zone hvac component
+ # @return [Bool] returns true if successful, false if not
def zone_hvac_component_occupancy_ventilation_control(zone_hvac_component)
ventilation = false
# Zone HVAC operating schedule if providing ventilation
# Zone HVAC components return an OptionalSchedule object for supplyAirFanOperatingModeSchedule
# except for ZoneHVACTerminalUnitVariableRefrigerantFlow which returns a Schedule
@@ -145,11 +154,11 @@
# if supply air fan operating schedule is always off,
# override to provide ventilation during occupied hours
unless existing_sch.nil?
if existing_sch.name.is_initialized
OpenStudio.logFree(OpenStudio::Info, 'openstudio.Standards.ZoneHVACComponent', "#{zone_hvac_component.name} has ventilation, and schedule is set to always on; keeping always on schedule.")
- return false if existing_sch.name.get.to_s.downcase.include? 'always on discrete'
+ return false if existing_sch.name.get.to_s.downcase.include?('always on discrete') || existing_sch.name.get.to_s.downcase.include?('guestroom_vent_ctrl_sch')
end
end
thermal_zone = zone_hvac_component.thermalZone.get
occ_threshold = zone_hvac_unoccupied_threshold
@@ -162,33 +171,75 @@
return true
end
# Apply all standard required controls to the zone equipment
#
+ # @param zone_hvac_component [OpenStudio::Model::ZoneHVACComponent] zone hvac component
# @return [Bool] returns true if successful, false if not
def zone_hvac_component_apply_standard_controls(zone_hvac_component)
# Vestibule heating control
if zone_hvac_component_vestibule_heating_control_required?(zone_hvac_component)
zone_hvac_component_apply_vestibule_heating_control(zone_hvac_component)
end
+ # Convert to objects
+ zone_hvac_component = if zone_hvac_component.to_ZoneHVACFourPipeFanCoil.is_initialized
+ zone_hvac_component.to_ZoneHVACFourPipeFanCoil.get
+ elsif zone_hvac_component.to_ZoneHVACPackagedTerminalAirConditioner.is_initialized
+ zone_hvac_component.to_ZoneHVACPackagedTerminalAirConditioner.get
+ elsif zone_hvac_component.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
+ zone_hvac_component.to_ZoneHVACPackagedTerminalHeatPump.get
+ end
+
+ # Do nothing for other types of zone HVAC equipment
+ if zone_hvac_component.nil?
+ return true
+ end
+
+ # Standby mode occupancy control
+ return true unless zone_hvac_component.thermalZone.empty?
+
+ thermal_zone = zone_hvac_component.thermalZone.get
+
+ standby_mode_spaces = []
+ thermal_zone.spaces.sort.each do |space|
+ if space_occupancy_standby_mode_required?(space)
+ standby_mode_spaces << space
+ end
+ end
+ if !standby_mode_spaces.empty?
+ zone_hvac_model_standby_mode_occupancy_control(zone_hvac_component)
+ end
+
# zone ventilation occupancy control for systems with ventilation
zone_hvac_component_occupancy_ventilation_control(zone_hvac_component)
return true
end
# Determine if vestibule heating control is required.
# Defaults to 90.1-2004 through 2010, not required.
#
+ # @param zone_hvac_component [OpenStudio::Model::ZoneHVACComponent] zone hvac component
# @return [Bool] returns true if successful, false if not
def zone_hvac_component_vestibule_heating_control_required?(zone_hvac_component)
vest_htg_control_required = false
return vest_htg_control_required
end
+ # Add occupant standby controls to zone equipment
+ # Currently, the controls consists of cycling the
+ # fan during the occupant standby mode hours
+ #
+ # @param zone_hvac_component OpenStudio zonal equipment object
+ # @retrun [Boolean] true if sucessful, false otherwise
+ def zone_hvac_model_standby_mode_occupancy_control(zone_hvac_component)
+ return true
+ end
+
# Turns off vestibule heating below 45F
#
+ # @param zone_hvac_component [OpenStudio::Model::ZoneHVACComponent] zone hvac component
# @return [Bool] returns true if successful, false if not
def zone_hvac_component_apply_vestibule_heating_control(zone_hvac_component)
# Ensure that the equipment is assigned to a thermal zone
if zone_hvac_component.thermalZone.empty?
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.ZoneHVACComponent', "For #{zone_hvac_component.name}: equipment is not assigned to a thermal zone, cannot apply vestibule heating control.")