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.")