openstudio-standards 0.2.17.rc1 → 0.2.17.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  3. data/data/standards/openstudio_standards_duplicates_log.csv +5 -0
  4. data/lib/openstudio-standards/btap/btap_result.rb +138 -138
  5. data/lib/openstudio-standards/btap/economics.rb +58 -53
  6. data/lib/openstudio-standards/btap/envelope.rb +1 -1
  7. data/lib/openstudio-standards/btap/fileio.rb +12 -12
  8. data/lib/openstudio-standards/btap/measures.rb +63 -59
  9. data/lib/openstudio-standards/btap/vintagizer.rb +1 -1
  10. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +9 -3
  11. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +50 -22
  12. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +15 -1
  13. data/lib/openstudio-standards/standards/Standards.Construction.rb +1 -1
  14. data/lib/openstudio-standards/standards/Standards.Model.rb +18 -18
  15. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +1 -1
  16. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +3 -2
  17. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +43 -40
  18. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +2 -1
  19. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.entryways.json +8 -8
  20. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.parking.json +2 -2
  21. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +11 -0
  22. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +11 -0
  23. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +1 -1
  24. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +9 -9
  25. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +1 -1
  26. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +5 -1
  27. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +5 -1
  28. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +8 -4
  29. data/lib/openstudio-standards/standards/necb/ECMS/nv.rb +8 -2
  30. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +7 -3
  31. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +4 -4
  32. data/lib/openstudio-standards/version.rb +1 -1
  33. metadata +4 -2
@@ -640,46 +640,49 @@ class ASHRAE9012019 < ASHRAE901
640
640
  # Controller:MechanicalVentilation object
641
641
  # to the design v_ot using the maximum OA
642
642
  # fraction schedule
643
-
644
- # Add EMS sensors
645
- # OA mass flow calculated by the Controller:MechanicalVentilation
646
- air_loop_hvac_name_ems = "EMS_#{air_loop_hvac.name.to_s.gsub(' ', '_')}"
647
- oa_vrp_mass_flow = OpenStudio::Model::EnergyManagementSystemSensor.new(air_loop_hvac.model, 'Air System Outdoor Air Mechanical Ventilation Requested Mass Flow Rate')
648
- oa_vrp_mass_flow.setKeyName(air_loop_hvac.name.to_s)
649
- oa_vrp_mass_flow.setName("#{air_loop_hvac_name_ems}_OA_VRP")
650
- # Actual sensed OA mass flow
651
- oa_mass_flow = OpenStudio::Model::EnergyManagementSystemSensor.new(air_loop_hvac.model, 'Air System Outdoor Air Mass Flow Rate')
652
- oa_mass_flow.setKeyName(air_loop_hvac.name.to_s)
653
- oa_mass_flow.setName("#{air_loop_hvac_name_ems}_OA")
654
- # Actual sensed volumetric OA flow
655
- oa_vol_flow = OpenStudio::Model::EnergyManagementSystemSensor.new(air_loop_hvac.model, 'System Node Standard Density Volume Flow Rate')
656
- oa_vol_flow.setKeyName("#{air_loop_hvac.name} Mixed Air Node")
657
- oa_vol_flow.setName("#{air_loop_hvac_name_ems}_SUPPLY_FLOW")
658
-
659
- # Add EMS actuator
660
- max_oa_fraction = OpenStudio::Model::EnergyManagementSystemActuator.new(max_oa_frac_sch, max_oa_frac_sch_type, 'Schedule Value')
661
- max_oa_fraction.setName("#{air_loop_hvac_name_ems}_MAX_OA_FRAC")
662
-
663
- # Add EMS program
664
- max_oa_ems_prog = OpenStudio::Model::EnergyManagementSystemProgram.new(air_loop_hvac.model)
665
- max_oa_ems_prog.setName("#{air_loop_hvac.name}_MAX_OA_FRAC")
666
- max_oa_ems_prog_body = <<-EMS
667
- IF #{air_loop_hvac_name_ems}_OA > #{air_loop_hvac_name_ems}_OA_VRP,
668
- SET #{air_loop_hvac_name_ems}_MAX_OA_FRAC = NULL,
669
- ELSE,
670
- IF #{air_loop_hvac_name_ems}_SUPPLY_FLOW > 0,
671
- SET #{air_loop_hvac_name_ems}_MAX_OA_FRAC = #{v_ot} / #{air_loop_hvac_name_ems}_SUPPLY_FLOW,
672
- ELSE,
673
- SET #{air_loop_hvac_name_ems}_MAX_OA_FRAC = NULL,
674
- ENDIF,
675
- ENDIF
676
- EMS
677
- max_oa_ems_prog.setBody(max_oa_ems_prog_body)
678
-
679
- max_oa_ems_prog_manager = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(air_loop_hvac.model)
680
- max_oa_ems_prog_manager.setName("SET_#{air_loop_hvac.name.to_s.gsub(' ', '_')}_MAX_OA_FRAC")
681
- max_oa_ems_prog_manager.setCallingPoint('InsideHVACSystemIterationLoop')
682
- max_oa_ems_prog_manager.addProgram(max_oa_ems_prog)
643
+ # In newer EnergyPlus versions, this is handled by Standard62.1VentilationRateProcedureWithLimit
644
+ # in the Controller:MechanicalVentilation object
645
+ if air_loop_hvac.model.version < OpenStudio::VersionString.new('3.3.0')
646
+ # Add EMS sensors
647
+ # OA mass flow calculated by the Controller:MechanicalVentilation
648
+ air_loop_hvac_name_ems = "EMS_#{air_loop_hvac.name.to_s.gsub(' ', '_')}"
649
+ oa_vrp_mass_flow = OpenStudio::Model::EnergyManagementSystemSensor.new(air_loop_hvac.model, 'Air System Outdoor Air Mechanical Ventilation Requested Mass Flow Rate')
650
+ oa_vrp_mass_flow.setKeyName(air_loop_hvac.name.to_s)
651
+ oa_vrp_mass_flow.setName("#{air_loop_hvac_name_ems}_OA_VRP")
652
+ # Actual sensed OA mass flow
653
+ oa_mass_flow = OpenStudio::Model::EnergyManagementSystemSensor.new(air_loop_hvac.model, 'Air System Outdoor Air Mass Flow Rate')
654
+ oa_mass_flow.setKeyName(air_loop_hvac.name.to_s)
655
+ oa_mass_flow.setName("#{air_loop_hvac_name_ems}_OA")
656
+ # Actual sensed volumetric OA flow
657
+ oa_vol_flow = OpenStudio::Model::EnergyManagementSystemSensor.new(air_loop_hvac.model, 'System Node Standard Density Volume Flow Rate')
658
+ oa_vol_flow.setKeyName("#{air_loop_hvac.name} Mixed Air Node")
659
+ oa_vol_flow.setName("#{air_loop_hvac_name_ems}_SUPPLY_FLOW")
660
+
661
+ # Add EMS actuator
662
+ max_oa_fraction = OpenStudio::Model::EnergyManagementSystemActuator.new(max_oa_frac_sch, max_oa_frac_sch_type, 'Schedule Value')
663
+ max_oa_fraction.setName("#{air_loop_hvac_name_ems}_MAX_OA_FRAC")
664
+
665
+ # Add EMS program
666
+ max_oa_ems_prog = OpenStudio::Model::EnergyManagementSystemProgram.new(air_loop_hvac.model)
667
+ max_oa_ems_prog.setName("#{air_loop_hvac.name}_MAX_OA_FRAC")
668
+ max_oa_ems_prog_body = <<-EMS
669
+ IF #{air_loop_hvac_name_ems}_OA > #{air_loop_hvac_name_ems}_OA_VRP,
670
+ SET #{air_loop_hvac_name_ems}_MAX_OA_FRAC = NULL,
671
+ ELSE,
672
+ IF #{air_loop_hvac_name_ems}_SUPPLY_FLOW > 0,
673
+ SET #{air_loop_hvac_name_ems}_MAX_OA_FRAC = #{v_ot} / #{air_loop_hvac_name_ems}_SUPPLY_FLOW,
674
+ ELSE,
675
+ SET #{air_loop_hvac_name_ems}_MAX_OA_FRAC = NULL,
676
+ ENDIF,
677
+ ENDIF
678
+ EMS
679
+ max_oa_ems_prog.setBody(max_oa_ems_prog_body)
680
+
681
+ max_oa_ems_prog_manager = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(air_loop_hvac.model)
682
+ max_oa_ems_prog_manager.setName("SET_#{air_loop_hvac.name.to_s.gsub(' ', '_')}_MAX_OA_FRAC")
683
+ max_oa_ems_prog_manager.setCallingPoint('InsideHVACSystemIterationLoop')
684
+ max_oa_ems_prog_manager.addProgram(max_oa_ems_prog)
685
+ end
683
686
 
684
687
  # Hard-size the sizing:system
685
688
  # object with the calculated min OA flow rate
@@ -44,7 +44,8 @@ class ASHRAE9012019 < ASHRAE901
44
44
  end
45
45
 
46
46
  # Set fan operating schedule during assumed occupant standby mode time to 0 so the fan can cycle
47
- new_sch = model_set_schedule_value(zone_hvac_component.supplyAirFanOperatingModeSchedule.get, '12' => 0)
47
+ # ZoneHVACFourPipeFanCoil has it optional, PTAC/PTHP starting a 3.5.0 is required
48
+ new_sch = model_set_schedule_value(OpenStudio::Model::OptionalSchedule.new(zone_hvac_component.supplyAirFanOperatingModeSchedule).get, '12' => 0)
48
49
  zone_hvac_component.setSupplyAirFanOperatingModeSchedule(new_sch) unless new_sch == true
49
50
 
50
51
  return true
@@ -2,25 +2,25 @@
2
2
  "entryways": [
3
3
  {
4
4
  "building_type": "College",
5
- "rollup_doors_per_10,000": null,
6
- "entrance_doors_per_10,000": null,
7
- "others_doors_per_10,000": null,
5
+ "rollup_doors_per_10,000": 0.0,
6
+ "entrance_doors_per_10,000": 2.0,
7
+ "others_doors_per_10,000": 2.45,
8
8
  "entrance_canopies": null,
9
9
  "emergency_canopies": null,
10
10
  "canopy_size": null,
11
11
  "floor_area_per_drive_through_window": null,
12
- "notes": null
12
+ "notes": "match secondary school"
13
13
  },
14
14
  {
15
15
  "building_type": "Courthouse",
16
- "rollup_doors_per_10,000": null,
17
- "entrance_doors_per_10,000": null,
18
- "others_doors_per_10,000": null,
16
+ "rollup_doors_per_10,000": 0.0,
17
+ "entrance_doors_per_10,000": 1.0,
18
+ "others_doors_per_10,000": 3.0,
19
19
  "entrance_canopies": null,
20
20
  "emergency_canopies": null,
21
21
  "canopy_size": null,
22
22
  "floor_area_per_drive_through_window": null,
23
- "notes": null
23
+ "notes": "match medium office"
24
24
  },
25
25
  {
26
26
  "building_type": "FullServiceRestaurant",
@@ -2,7 +2,7 @@
2
2
  "parking": [
3
3
  {
4
4
  "building_type": "College",
5
- "building_area_per_spot": null,
5
+ "building_area_per_spot": 250.0,
6
6
  "units_per_spot": null,
7
7
  "students_per_spot": null,
8
8
  "beds_per_spot": null,
@@ -11,7 +11,7 @@
11
11
  },
12
12
  {
13
13
  "building_type": "Courthouse",
14
- "building_area_per_spot": null,
14
+ "building_area_per_spot": 250.0,
15
15
  "units_per_spot": null,
16
16
  "students_per_spot": null,
17
17
  "beds_per_spot": null,
@@ -47,4 +47,15 @@ class DOERef1980to2004 < ASHRAE901
47
47
  damper_action = 'Single Maximum'
48
48
  return damper_action
49
49
  end
50
+
51
+ # Determine minimum ventilation efficiency for zones.
52
+ # For DOE Ref 1980-2004, assume that VAV system designers did not
53
+ # care about decreasing system OA flow rates and therefore did not
54
+ # adjust minimum damper positions to achieve any specific
55
+ # ventilation efficiency.
56
+ def air_loop_hvac_minimum_zone_ventilation_efficiency(air_loop_hvac)
57
+ min_ventilation_efficiency = 0
58
+
59
+ return min_ventilation_efficiency
60
+ end
50
61
  end
@@ -47,4 +47,15 @@ class DOERefPre1980 < ASHRAE901
47
47
  damper_action = 'Single Maximum'
48
48
  return damper_action
49
49
  end
50
+
51
+ # Determine minimum ventilation efficiency for zones.
52
+ # For DOE Ref Pre-1980, assume that VAV system designers did not
53
+ # care about decreasing system OA flow rates and therefore did not
54
+ # adjust minimum damper positions to achieve any specific
55
+ # ventilation efficiency.
56
+ def air_loop_hvac_minimum_zone_ventilation_efficiency(air_loop_hvac)
57
+ min_ventilation_efficiency = 0
58
+
59
+ return min_ventilation_efficiency
60
+ end
50
61
  end
@@ -272,7 +272,7 @@ class ASHRAE901PRM < Standard
272
272
  return_fan_power_fraction /= total_fan_avg_fan_w
273
273
  relief_fan_power_fraction /= total_fan_avg_fan_w
274
274
  else
275
- Openstudio.logFree(OpenStudio::Error, "Total zone design airflow for #{air_loop_hvac.name} is 0.")
275
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.ashrae_90_1_prm.AirLoopHVAC', "Total zone design airflow for #{air_loop_hvac.name} is 0.")
276
276
  end
277
277
  elsif system_type == 'PTAC' ||
278
278
  system_type == 'PTHP' ||
@@ -1176,7 +1176,7 @@ class ASHRAE901PRM < Standard
1176
1176
  # Template method for adding a setpoint manager for a coil control logic to a heating coil.
1177
1177
  # ASHRAE 90.1-2019 Appendix G.
1178
1178
  #
1179
- # @param model [OpenStudio::Model::Model] Openstudio model
1179
+ # @param model [OpenStudio::Model::Model] OpenStudio model
1180
1180
  # @param thermalZones Array([OpenStudio::Model::ThermalZone]) thermal zone array
1181
1181
  # @param coil Heating Coils
1182
1182
  # @return [Boolean] true
@@ -1228,7 +1228,7 @@ class ASHRAE901PRM < Standard
1228
1228
  # - 'false' otherwise
1229
1229
  #
1230
1230
  # @author Xuechen (Jerry) Lei, PNNL
1231
- # @param model [OpenStudio::Model::Model] Openstudio model
1231
+ # @param model [OpenStudio::Model::Model] OpenStudio model
1232
1232
  def model_mark_zone_dcv_existence(model)
1233
1233
  model.getAirLoopHVACs.each do |air_loop_hvac|
1234
1234
  next unless air_loop_hvac.airLoopHVACOutdoorAirSystem.is_initialized
@@ -1274,7 +1274,7 @@ class ASHRAE901PRM < Standard
1274
1274
  # "one user specified DCV exception"
1275
1275
  #
1276
1276
  # @author Xuechen (Jerry) Lei, PNNL
1277
- # @param model [OpenStudio::Model::Model] Openstudio model
1277
+ # @param model [OpenStudio::Model::Model] OpenStudio model
1278
1278
  def model_add_dcv_user_exception_properties(model)
1279
1279
  model.getAirLoopHVACs.each do |air_loop_hvac|
1280
1280
  dcv_airloop_user_exception = false
@@ -1336,7 +1336,7 @@ class ASHRAE901PRM < Standard
1336
1336
  # - 'flase' otherwise
1337
1337
  #
1338
1338
  # @author Xuechen (Jerry) Lei, PNNL
1339
- # @param model [OpenStudio::Model::Model] Openstudio model
1339
+ # @param model [OpenStudio::Model::Model] OpenStudio model
1340
1340
  def model_add_dcv_requirement_properties(model)
1341
1341
  model.getAirLoopHVACs.each do |air_loop_hvac|
1342
1342
  if user_model_air_loop_hvac_demand_control_ventilation_required?(air_loop_hvac)
@@ -1370,7 +1370,7 @@ class ASHRAE901PRM < Standard
1370
1370
  # generation
1371
1371
  #
1372
1372
  # @author Xuechen (Jerry) Lei, PNNL
1373
- # @param model [OpenStudio::Model::Model] Openstudio model
1373
+ # @param model [OpenStudio::Model::Model] OpenStudio model
1374
1374
  def model_raise_user_model_dcv_errors(model)
1375
1375
  # TODO: JXL add log msgs to PRM logger
1376
1376
  model.getThermalZones.each do |thermal_zone|
@@ -1396,7 +1396,7 @@ class ASHRAE901PRM < Standard
1396
1396
  # property 'apxg no need to have DCV' added
1397
1397
  #
1398
1398
  # @author Xuechen (Jerry) Lei, PNNL
1399
- # @param model [OpenStudio::Model::Model] Openstudio model
1399
+ # @param model [OpenStudio::Model::Model] OpenStudio model
1400
1400
  def model_add_apxg_dcv_properties(model)
1401
1401
  model.getAirLoopHVACs.each do |air_loop_hvac|
1402
1402
  if air_loop_hvac.airLoopHVACOutdoorAirSystem.is_initialized
@@ -1434,7 +1434,7 @@ class ASHRAE901PRM < Standard
1434
1434
  # Set DCV in baseline HVAC system if required
1435
1435
  #
1436
1436
  # @author Xuechen (Jerry) Lei, PNNL
1437
- # @param model [OpenStudio::Model::Model] Openstudio model
1437
+ # @param model [OpenStudio::Model::Model] OpenStudio model
1438
1438
  def model_set_baseline_demand_control_ventilation(model, climate_zone)
1439
1439
  model.getAirLoopHVACs.each do |air_loop_hvac|
1440
1440
  if baseline_air_loop_hvac_demand_control_ventilation_required?(air_loop_hvac)
@@ -1452,7 +1452,7 @@ class ASHRAE901PRM < Standard
1452
1452
  # include data source from:
1453
1453
  # 1. user data csv files
1454
1454
  # 2. data from measure and OpenStudio interface
1455
- # @param [Openstudio:model:Model] model
1455
+ # @param [OpenStudio:model:Model] model
1456
1456
  # @param [String] climate_zone
1457
1457
  # @param [String] default_hvac_building_type
1458
1458
  # @param [String] default_wwr_building_type
@@ -1948,7 +1948,7 @@ class ASHRAE901PRM < Standard
1948
1948
  # The default shall be true
1949
1949
  #
1950
1950
  # @param [Boolean] run_all_orients: user inputs to indicate whether it is required to run all orientations
1951
- # @param [OpenStudio::Model::Model] Openstudio model
1951
+ # @param [OpenStudio::Model::Model] OpenStudio model
1952
1952
  def run_all_orientations(run_all_orients, user_model)
1953
1953
  # Step 0, assign the default value
1954
1954
  run_orients_flag = run_all_orients
@@ -7,7 +7,7 @@ class ASHRAE901PRM < Standard
7
7
  # create a construction that meets those properties and assign it to this surface.
8
8
  # 90.1-PRM-2019
9
9
  #
10
- # @param planar_surface [Openstudio::Model:PlanarSurface] surface object
10
+ # @param planar_surface [OpenStudio::Model:PlanarSurface] surface object
11
11
  # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
12
12
  # @param previous_construction_map [Hash] a hash where the keys are an array of inputs
13
13
  # [template, climate_zone, intended_surface_type, standards_construction_type, occ_type]
@@ -112,7 +112,11 @@ class ASHRAE901PRM < Standard
112
112
  sizing_run_ran = model_run_sizing_run(model, "#{sizing_run_dir}/SR_cooling_plant") if !sizing_run_ran
113
113
 
114
114
  if sizing_run_ran
115
- sizing_run_capacity = model.getAutosizedValueFromEquipmentSummary(chiller, 'Central Plant', 'Nominal Capacity', 'W').get
115
+ if model.version <= OpenStudio::VersionString.new('3.2.1')
116
+ sizing_run_capacity = model.getAutosizedValueFromEquipmentSummary(chiller, 'Central Plant', 'Nominal Capacity', 'W').get
117
+ else
118
+ sizing_run_capacity = model.getAutosizedValueFromEquipmentSummary(chiller, 'Central Plant', 'Rated Capacity', 'W').get
119
+ end
116
120
  chiller.setReferenceCapacity(sizing_run_capacity)
117
121
  total_cooling_capacity_w += sizing_run_capacity
118
122
  else
@@ -235,7 +235,11 @@ class BTAPPRE1980
235
235
  air_loop_sizing.setCentralHeatingDesignSupplyAirTemperature(system_data[:CentralHeatingDesignSupplyAirTemperature])
236
236
  air_loop_sizing.setAllOutdoorAirinCooling(system_data[:AllOutdoorAirinCooling])
237
237
  air_loop_sizing.setAllOutdoorAirinHeating(system_data[:AllOutdoorAirinHeating])
238
- air_loop_sizing.setMinimumSystemAirFlowRatio(system_data[:MinimumSystemAirFlowRatio])
238
+ if model.version < OpenStudio::VersionString.new('2.7.0')
239
+ air_loop_sizing.setMinimumSystemAirFlowRatio(system_data[:MinimumSystemAirFlowRatio])
240
+ else
241
+ air_loop_sizing.setCentralHeatingMaximumSystemAirFlowRatio(system_data[:MinimumSystemAirFlowRatio])
242
+ end
239
243
 
240
244
  supply_fan = OpenStudio::Model::FanVariableVolume.new(model, always_on)
241
245
  supply_fan.setName('Sys6 Supply Fan')
@@ -442,7 +442,7 @@ class ECMS
442
442
  end
443
443
  return storey_zones_map
444
444
  end
445
-
445
+
446
446
  #==============================================================================================================================
447
447
  # Update the map between systems and zones
448
448
  def update_system_zones_map(model,system_zones_map,system_zones_map_option,system_key)
@@ -482,7 +482,7 @@ class ECMS
482
482
  system_zones_map = update_system_zones_map(model,system_zones_map,ecm_system_zones_map_option,'sys_1')
483
483
  else
484
484
  updated_system_zones_map = {}
485
- system_zones_map.each {|sname,zones| updated_system_zones_map["sys_1#{sname[5..-1]}"] = zones} # doas unit is an NECB sys_1
485
+ system_zones_map.each {|sname,zones| updated_system_zones_map["sys_1#{sname[5..-1]}"] = zones} # doas unit is an NECB sys_1
486
486
  system_zones_map = updated_system_zones_map
487
487
  end
488
488
  # Add outdoor VRF unit
@@ -612,7 +612,11 @@ class ECMS
612
612
  airloop.sizingSystem.setSystemOutdoorAirMethod('ZoneSum')
613
613
  airloop.sizingSystem.setCentralCoolingDesignSupplyAirHumidityRatio(0.0085)
614
614
  airloop.sizingSystem.setCentralHeatingDesignSupplyAirHumidityRatio(0.0080)
615
- airloop.sizingSystem.setMinimumSystemAirFlowRatio(1.0)
615
+ if model.version < OpenStudio::VersionString.new('2.7.0')
616
+ airloop.sizingSystem.setMinimumSystemAirFlowRatio(1.0)
617
+ else
618
+ airloop.sizingSystem.setCentralHeatingMaximumSystemAirFlowRatio(1.0)
619
+ end
616
620
  case sys_vent_type.downcase
617
621
  when 'doas'
618
622
  airloop.sizingSystem.setAllOutdoorAirinCooling(true)
@@ -1126,7 +1130,7 @@ class ECMS
1126
1130
  # There is an error in EnergyPlus in the estimated capacity of the coil "CoilCoolingDXVariableSpeed".
1127
1131
  # Here the capacity reported by OS is adjusted to estimate an appropriate capacity for the cooling coil.
1128
1132
  # The autosized capacity is corrected for the actual fan flow rate and fan power.
1129
- if supply_fan.autosizedMaximumFlowRate.is_initialized
1133
+ if supply_fan.autosizedMaximumFlowRate.is_initialized
1130
1134
  fan_max_afr = supply_fan.autosizedMaximumFlowRate.to_f
1131
1135
  elsif supply_fan.maximumFlowRate.is_initialized
1132
1136
  fan_max_afr = supply_fan.maximumFlowRate.to_f
@@ -121,8 +121,11 @@ class ECMS
121
121
 
122
122
  ##### Add a "ZoneVentilation:DesignFlowRate" object for NV to set OA per person.
123
123
  zn_vent_design_flow_rate_1 = OpenStudio::Model::ZoneVentilationDesignFlowRate.new(model)
124
- zn_vent_design_flow_rate_1.setDesignFlowRateCalculationMethod('Flow/Person')
125
124
  zn_vent_design_flow_rate_1.setFlowRateperPerson(oa_per_person_normalized_by_number_of_windows)
125
+ if model.version < OpenStudio::VersionString.new('3.5.0')
126
+ # Design Flow Rate Calculation Method is automatically set in 3.5.0+
127
+ zn_vent_design_flow_rate_1.setDesignFlowRateCalculationMethod('Flow/Person')
128
+ end
126
129
  zn_vent_design_flow_rate_1.setVentilationType('Natural')
127
130
  zn_vent_design_flow_rate_1.setMinimumIndoorTemperatureSchedule(min_Tin_schedule)
128
131
  zn_vent_design_flow_rate_1.setMaximumIndoorTemperatureSchedule(max_Tin_schedule)
@@ -133,8 +136,11 @@ class ECMS
133
136
 
134
137
  ##### Add another "ZoneVentilation:DesignFlowRate" object for NV to set OA per floor area.
135
138
  zn_vent_design_flow_rate_2 = OpenStudio::Model::ZoneVentilationDesignFlowRate.new(model)
136
- zn_vent_design_flow_rate_2.setDesignFlowRateCalculationMethod('Flow/Area')
137
139
  zn_vent_design_flow_rate_2.setFlowRateperZoneFloorArea(oa_per_floor_area_normalized_by_number_of_windows)
140
+ if model.version < OpenStudio::VersionString.new('3.5.0')
141
+ # Design Flow Rate Calculation Method is automatically set in 3.5.0+
142
+ zn_vent_design_flow_rate_2.setDesignFlowRateCalculationMethod('Flow/Area')
143
+ end
138
144
  zn_vent_design_flow_rate_2.setVentilationType('Natural')
139
145
  zn_vent_design_flow_rate_2.setMinimumIndoorTemperatureSchedule(min_Tin_schedule)
140
146
  zn_vent_design_flow_rate_2.setMaximumIndoorTemperatureSchedule(max_Tin_schedule)
@@ -21,9 +21,9 @@ class NECB2011
21
21
  # @return [Bool] returns true if an economizer is required, false if not
22
22
  def air_loop_hvac_economizer_required?(air_loop_hvac)
23
23
  economizer_required = false
24
-
24
+
25
25
  # need a better way to determine if an economizer is needed.
26
- return economizer_required if ((air_loop_hvac.name.to_s.include? 'Outpatient F1' ) ||
26
+ return economizer_required if ((air_loop_hvac.name.to_s.include? 'Outpatient F1' ) ||
27
27
  (air_loop_hvac.sizingSystem.typeofLoadtoSizeOn.to_s == "VentilationRequirement"))
28
28
 
29
29
  # A big number of btu per hr as the minimum requirement
@@ -1997,7 +1997,11 @@ class NECB2011
1997
1997
  air_loop_sizing.setCentralHeatingDesignSupplyAirTemperature(system_data[:CentralHeatingDesignSupplyAirTemperature]) unless system_data[:CentralHeatingDesignSupplyAirTemperature].nil?
1998
1998
  air_loop_sizing.setAllOutdoorAirinCooling(system_data[:AllOutdoorAirinCooling]) unless system_data[:AllOutdoorAirinCooling].nil?
1999
1999
  air_loop_sizing.setAllOutdoorAirinHeating(system_data[:AllOutdoorAirinHeating]) unless system_data[:AllOutdoorAirinHeating].nil?
2000
- air_loop_sizing.setMinimumSystemAirFlowRatio(system_data[:MinimumSystemAirFlowRatio]) unless system_data[:MinimumSystemAirFlowRatio].nil?
2000
+ if model.version < OpenStudio::VersionString.new('2.7.0')
2001
+ air_loop_sizing.setMinimumSystemAirFlowRatio(system_data[:MinimumSystemAirFlowRatio]) unless system_data[:MinimumSystemAirFlowRatio].nil?
2002
+ else
2003
+ air_loop_sizing.setCentralHeatingMaximumSystemAirFlowRatio(system_data[:MinimumSystemAirFlowRatio]) unless system_data[:MinimumSystemAirFlowRatio].nil?
2004
+ end
2001
2005
  return mau_air_loop
2002
2006
  end
2003
2007
 
@@ -835,7 +835,7 @@ class NECB2011
835
835
  air_loop_info[:cooling_coils][:dx_single_speed] << coil
836
836
  single_speed = supply_comp.to_CoilCoolingDXSingleSpeed.get
837
837
  coil[:name] = single_speed.name.get
838
- coil[:cop] = single_speed.ratedCOP.get
838
+ coil[:cop] = single_speed.ratedCOP.to_f
839
839
  coil[:nominal_total_capacity_w] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Cooling Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].upcase}' ")
840
840
  coil[:nominal_total_capacity_w] = validate_optional(coil[:nominal_total_capacity_w], model, -1.0)
841
841
  end
@@ -844,8 +844,8 @@ class NECB2011
844
844
  air_loop_info[:cooling_coils][:dx_two_speed] << coil
845
845
  two_speed = supply_comp.to_CoilCoolingDXTwoSpeed.get
846
846
  coil[:name] = two_speed.name.get
847
- coil[:cop_low] = two_speed.ratedLowSpeedCOP.get
848
- coil[:cop_high] = two_speed.ratedHighSpeedCOP.get
847
+ coil[:cop_low] = two_speed.ratedLowSpeedCOP.to_f
848
+ coil[:cop_high] = two_speed.ratedHighSpeedCOP.to_f
849
849
  coil[:nominal_total_capacity_w] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Cooling Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].upcase}' ")
850
850
  coil[:nominal_total_capacity_w] = validate_optional(coil[:nominal_total_capacity_w], model, -1.0)
851
851
  end
@@ -1712,7 +1712,7 @@ class NECB2011
1712
1712
  # This method will run the HRV compliance for a single air loop
1713
1713
  #
1714
1714
  # @param qaqc [:hash] Hash that contains the base data with qaqc keys
1715
- # @param model [:OS:Model] Openstudio Model
1715
+ # @param model [:OS:Model] OpenStudio Model
1716
1716
  # @param air_loop_info [:hash] single air_loop object from the qaqc hash
1717
1717
  def necb_hrv_compliance_for_single_airloop(qaqc, model, air_loop_info)
1718
1718
  # HRV check
@@ -13,5 +13,5 @@ module OpenstudioStandards
13
13
  end
14
14
  return 'git-not-found-on-this-system'
15
15
  end
16
- VERSION = '0.2.17.rc1'.freeze
16
+ VERSION = '0.2.17.rc2'.freeze
17
17
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstudio-standards
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.17.rc1
4
+ version: 0.2.17.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Parker
@@ -28,7 +28,7 @@ authors:
28
28
  autorequire:
29
29
  bindir: bin
30
30
  cert_chain: []
31
- date: 2022-10-07 00:00:00.000000000 Z
31
+ date: 2022-10-20 00:00:00.000000000 Z
32
32
  dependencies:
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: minitest-reporters
@@ -653,6 +653,7 @@ files:
653
653
  - data/geometry/DOERefSmallOffice.json
654
654
  - data/geometry/DOERefWarehouse.json
655
655
  - data/geometry/DOERefWarehouse.osm
656
+ - data/standards/OpenStudio_Standards-ashrae_90_1.xlsx
656
657
  - data/standards/exclude_list.csv
657
658
  - data/standards/export_OpenStudio_libraries.rb
658
659
  - data/standards/legacy_dd_results.csv
@@ -661,6 +662,7 @@ files:
661
662
  - data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1-ALL-comstockspace_types.csv
662
663
  - data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1.csv
663
664
  - data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1space_types.csv
665
+ - data/standards/openstudio_standards_duplicates_log.csv
664
666
  - data/standards/templates_to_climate_zones.json
665
667
  - data/standards/test_performance_expected_dd_results.csv
666
668
  - data/weather/ALTURAS_725958_CZ2010.ddy