openstudio-standards 0.8.5 → 0.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/test_performance_expected_dd_results.csv +90 -90
  3. data/lib/openstudio-standards/btap/activity.rb +858 -61
  4. data/lib/openstudio-standards/btap/attributes.rb +297 -103
  5. data/lib/openstudio-standards/btap/bridging.rb +1335 -593
  6. data/lib/openstudio-standards/btap/btap.rb +60 -181
  7. data/lib/openstudio-standards/btap/carbon/btap_carbon.rb +199 -142
  8. data/lib/openstudio-standards/btap/common/constructions.json +1275 -0
  9. data/lib/openstudio-standards/btap/common/costs.csv +1969 -0
  10. data/lib/openstudio-standards/btap/common/costs_local_factors.csv +2315 -0
  11. data/lib/openstudio-standards/btap/common/materials_glazing.csv +61 -0
  12. data/lib/openstudio-standards/btap/{common_resources → common}/materials_hvac.csv +1685 -1685
  13. data/lib/openstudio-standards/btap/{common_resources → common}/materials_lighting.csv +266 -266
  14. data/lib/openstudio-standards/btap/common/materials_opaque.csv +214 -0
  15. data/lib/openstudio-standards/btap/common/necb_building_types.csv +35 -0
  16. data/lib/openstudio-standards/btap/common/necb_space_types.csv +110 -0
  17. data/lib/openstudio-standards/btap/common/thermal_bridging.csv +73 -0
  18. data/lib/openstudio-standards/btap/costing/btap_costing.rb +346 -429
  19. data/lib/openstudio-standards/btap/costing/database.rb +104 -0
  20. data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +356 -344
  21. data/lib/openstudio-standards/btap/costing/dcv_costing.rb +282 -296
  22. data/lib/openstudio-standards/btap/costing/envelope_costing.rb +179 -192
  23. data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2477 -2316
  24. data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +127 -142
  25. data/lib/openstudio-standards/btap/costing/lighting_costing.rb +216 -198
  26. data/lib/openstudio-standards/btap/costing/nv_costing.rb +522 -523
  27. data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +649 -649
  28. data/lib/openstudio-standards/btap/costing/shw_costing.rb +626 -625
  29. data/lib/openstudio-standards/btap/costing/thermal_bridging_costing.rb +72 -0
  30. data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2363 -2361
  31. data/lib/openstudio-standards/btap/deprecated.rb +1033 -0
  32. data/lib/openstudio-standards/btap/envelope.rb +313 -572
  33. data/lib/openstudio-standards/btap/fileio.rb +152 -1070
  34. data/lib/openstudio-standards/btap/geometry.rb +486 -766
  35. data/lib/openstudio-standards/btap/linear_regression.rb +130 -0
  36. data/lib/openstudio-standards/btap/paths.rb +46 -0
  37. data/lib/openstudio-standards/btap/qaqc/analysis.rb +163 -0
  38. data/lib/openstudio-standards/btap/qaqc/data.rb +2293 -0
  39. data/lib/openstudio-standards/btap/qaqc/datapoint.rb +641 -0
  40. data/lib/openstudio-standards/btap/schedules.rb +11 -611
  41. data/lib/openstudio-standards/btap/structure.rb +574 -189
  42. data/lib/openstudio-standards/constructions/materials/information.rb +1 -1
  43. data/lib/openstudio-standards/create_typical/create_typical.rb +1 -1
  44. data/lib/openstudio-standards/exterior_lighting/create.rb +135 -85
  45. data/lib/openstudio-standards/exterior_lighting/data/typical_exterior_lighting.json +20 -0
  46. data/lib/openstudio-standards/exterior_lighting/information.rb +23 -2
  47. data/lib/openstudio-standards/geometry/create.rb +7 -3
  48. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +3 -2
  49. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +3 -2
  50. data/lib/openstudio-standards/prototypes/common/data/thermostat_schedule_lookup.json +84 -84
  51. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +4 -4
  52. data/lib/openstudio-standards/refrigeration/create_walkin.rb +45 -5
  53. data/lib/openstudio-standards/refrigeration/data/refrigerated_walkins.csv +75 -75
  54. data/lib/openstudio-standards/schedules/parametric.rb +6 -0
  55. data/lib/openstudio-standards/service_water_heating/create_typical.rb +10 -3
  56. data/lib/openstudio-standards/service_water_heating/create_water_heating_loop.rb +30 -14
  57. data/lib/openstudio-standards/service_water_heating/information.rb +4 -1
  58. data/lib/openstudio-standards/sql_file/unmet_hours.rb +2 -1
  59. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +3 -1
  60. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +3 -1
  61. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.boilers.json +12 -0
  62. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +18432 -3072
  63. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.boilers.json +26 -0
  64. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +8532 -1422
  65. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.boilers.json +26 -0
  66. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +8532 -1422
  67. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +16 -0
  68. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.computer_room_acs.json +30 -30
  69. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +7560 -1260
  70. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +1 -2
  71. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.boilers.json +16 -0
  72. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_properties.json +7560 -1260
  73. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +3 -3
  74. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +1 -2
  75. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.boilers.json +22 -0
  76. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_properties.json +7236 -1206
  77. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.furnaces.json +223 -19
  78. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +37 -1
  79. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.boilers.json +3 -0
  80. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.construction_properties.json +6900 -1150
  81. data/lib/openstudio-standards/standards/cbes/data/cbes.schedules.json +1 -1
  82. data/lib/openstudio-standards/standards/deer/data/deer.schedules.json +1 -1
  83. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/surface_thermal_transmittance.json +76 -40
  84. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/surface_thermal_transmittance.json +76 -40
  85. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +6 -4
  86. data/lib/openstudio-standards/standards/necb/NECB2011/NECB2011_QAQC.json +2988 -0
  87. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +25 -3
  88. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +672 -534
  89. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Hospital.osm +1791 -1792
  90. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LEEPMultiTower.osm +7 -1
  91. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LEEPTownHouse.osm +7 -1
  92. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LargeHotel.osm +5 -6
  93. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LargeOffice.osm +8 -9
  94. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernEducation.osm +10 -4
  95. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernHealthCare.osm +14 -15
  96. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Outpatient.osm +7 -1
  97. data/lib/openstudio-standards/standards/necb/NECB2011/data/surface_thermal_transmittance.json +76 -40
  98. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +14 -6
  99. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +542 -130
  100. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +30 -63
  101. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +7 -2
  102. data/lib/openstudio-standards/standards/necb/NECB2015/data/surface_thermal_transmittance.json +90 -0
  103. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +8 -6
  104. data/lib/openstudio-standards/standards/necb/NECB2017/data/surface_thermal_transmittance.json +76 -40
  105. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +2 -1
  106. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +0 -117
  107. data/lib/openstudio-standards/standards/necb/NECB2020/data/surface_thermal_transmittance.json +76 -45
  108. data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +218 -0
  109. data/lib/openstudio-standards/standards/necb/common/construction_defaults.osm +12 -7
  110. data/lib/openstudio-standards/standards/standard.rb +1 -1
  111. data/lib/openstudio-standards/version.rb +1 -1
  112. data/lib/openstudio-standards.rb +9 -4
  113. metadata +59 -66
  114. data/data/inventory/thermal_bridging.csv +0 -90
  115. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  116. data/data/standards/openstudio_standards_duplicates_log.csv +0 -7962
  117. data/lib/openstudio-standards/btap/NECB_building_types.csv +0 -35
  118. data/lib/openstudio-standards/btap/NECB_space_types.csv +0 -109
  119. data/lib/openstudio-standards/btap/WeatherData1.json +0 -2110
  120. data/lib/openstudio-standards/btap/WeatherData1.xlsx +0 -0
  121. data/lib/openstudio-standards/btap/btap_result.rb +0 -1144
  122. data/lib/openstudio-standards/btap/btap_test_helper.rb +0 -86
  123. data/lib/openstudio-standards/btap/common_paths.rb +0 -81
  124. data/lib/openstudio-standards/btap/common_resources/ConstructionProperties.csv +0 -52
  125. data/lib/openstudio-standards/btap/common_resources/Constructions.csv +0 -37
  126. data/lib/openstudio-standards/btap/common_resources/construction_sets.csv +0 -1270
  127. data/lib/openstudio-standards/btap/common_resources/constructions_glazing.csv +0 -121
  128. data/lib/openstudio-standards/btap/common_resources/constructions_opaque.csv +0 -2256
  129. data/lib/openstudio-standards/btap/common_resources/costs.csv +0 -1897
  130. data/lib/openstudio-standards/btap/common_resources/costs_local_factors.csv +0 -2315
  131. data/lib/openstudio-standards/btap/common_resources/materials_glazing.csv +0 -35
  132. data/lib/openstudio-standards/btap/common_resources/materials_opaque.csv +0 -164
  133. data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +0 -359
  134. data/lib/openstudio-standards/btap/costing/btap_workflow.rb +0 -117
  135. data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +0 -11
  136. data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +0 -136
  137. data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +0 -173
  138. data/lib/openstudio-standards/btap/costing/dummy.epw +0 -8768
  139. data/lib/openstudio-standards/btap/costing/dummy.osm +0 -5320
  140. data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +0 -42
  141. data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +0 -225
  142. data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +0 -28705
  143. data/lib/openstudio-standards/btap/costing/parallel_tests.rb +0 -92
  144. data/lib/openstudio-standards/btap/costing/test_list.txt +0 -15
  145. data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +0 -27
  146. data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +0 -80
  147. data/lib/openstudio-standards/btap/necb_2011_spacetype_info.csv +0 -225
  148. data/lib/openstudio-standards/btap/utilities/Add_template_field_to_json.rb +0 -22
  149. data/lib/openstudio-standards/btap/utilities/convert_surfaces_to_adiabatic_necb_8426.rb +0 -204
  150. data/lib/openstudio-standards/btap/utilities/generate_space_types.rb +0 -8
  151. data/lib/openstudio-standards/btap/utilities/necb_to_epw_map.rb +0 -50
  152. data/lib/openstudio-standards/btap/utilities/os_sim_extract.rb +0 -48
  153. data/lib/openstudio-standards/btap/utilities/rename_surfaces.rb +0 -24
  154. data/lib/openstudio-standards/btap/utilities/round_surf_coords.rb +0 -32
  155. data/lib/openstudio-standards/btap/utilities/sched_create.rb +0 -145
  156. data/lib/openstudio-standards/btap/utilities/set_mult_to_adiabatic.rb +0 -53
  157. data/lib/openstudio-standards/btap/utilities/space_type.rb +0 -78
  158. data/lib/openstudio-standards/btap/utilities/weatherData1_xlsx_to_json.rb +0 -56
  159. data/lib/openstudio-standards/btap/vintagizer.rb +0 -161
  160. data/lib/openstudio-standards/btap/visualization.rb +0 -72
  161. data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2011_spacetype_info.csv +0 -225
  162. data/lib/openstudio-standards/standards/necb/common/btap_analysis.rb +0 -79
  163. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +0 -2656
  164. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +0 -653
  165. data/lib/openstudio-standards/standards/necb/common/necb_reference_runs.csv +0 -28705
  166. data/lib/openstudio-standards/standards/necb/common/utility_pricing_2025-02-20.csv +0 -92
  167. /data/lib/openstudio-standards/btap/{common_resources → common}/carbon_frame.csv +0 -0
  168. /data/lib/openstudio-standards/btap/{common_resources → common}/carbon_glazing.csv +0 -0
  169. /data/lib/openstudio-standards/btap/{common_resources → common}/carbon_opaque.csv +0 -0
  170. /data/lib/openstudio-standards/btap/{common_resources → common}/hvac_vent_ahu.csv +0 -0
  171. /data/lib/openstudio-standards/btap/{common_resources → common}/lighting.csv +0 -0
  172. /data/lib/openstudio-standards/btap/{common_resources → common}/lighting_sets.csv +0 -0
  173. /data/lib/openstudio-standards/btap/{common_resources → common}/locations.csv +0 -0
  174. /data/lib/openstudio-standards/btap/{costing → common}/mech_sizing.json +0 -0
@@ -1,314 +1,300 @@
1
- class BTAPCosting
2
-
3
- def cost_audit_dcv(model:, prototype_creator:)
4
- @costing_report['ventilation'][:demand_controlled_ventilation] = []
5
- a = 0.0 # This is for reporting purposes.
6
-
7
- ##### Initialize cost of various parts of DCV
8
- dcv_cost_zone_occupancy = 0.0
9
- dcv_cost_zone_co2 = 0.0
10
- dcv_cost_box = 0.0
11
- dcv_cost_vertical_conduit = 0.0
12
- dcv_cost_roof = 0.0
13
- dcv_cost_control = 0.0
14
- dcv_cost_total = 0.0
15
-
16
- ##### Get number of stories and nominal floor to floor height.
17
- ##### These inputs are required for the calculation of the length of conduit for each AirLoopHVAC.
18
- util_dist, ht_roof, nominal_flr2flr_height_ft, horizontal_dist, standards_number_of_stories, mechRmInBsmt = getGeometryData(model, prototype_creator)
19
- nominal_flr2flr_height_m = (OpenStudio.convert(nominal_flr2flr_height_ft, 'ft', 'm').get)
20
-
21
- number_of_dcv_controller_for_all_air_loops = 0
22
-
23
- model.getAirLoopHVACs.sort.each do |air_loop|
24
- number_of_thermal_zones_served_by_air_loop = 0
25
- number_floors_served_by_air_loop = 0
26
- number_of_junction_boxes_for_air_loop = 0
27
-
28
- ##### Step A: Calculate number of thermal zones and floors served by each AirLoopHVAC (air_loop)
29
- building_story_list = []
30
- air_loop.thermalZones.sort.each do |thermal_zone|
31
- thermal_zone.spaces().sort.each do |space|
32
- building_story_list << space.buildingStory.get.name()
1
+ module BTAP
2
+ class Costing
3
+ def cost_audit_dcv(model:, prototype_creator:)
4
+ @costing_report['ventilation'][:demand_controlled_ventilation] = []
5
+ a = 0.0 # This is for reporting purposes.
6
+
7
+ dcv_cost_zone_occupancy = 0.0
8
+ dcv_cost_zone_co2 = 0.0
9
+ dcv_cost_box = 0.0
10
+ dcv_cost_vertical_conduit = 0.0
11
+ dcv_cost_roof = 0.0
12
+ dcv_cost_control = 0.0
13
+ dcv_cost_total = 0.0
14
+
15
+ # Get number of stories and nominal floor to floor height.
16
+ # These inputs are required for the calculation of the length of conduit
17
+ # for each AirLoopHVAC.
18
+ util_dist, ht_roof, nominal_flr2flr_height_ft, horizontal_dist, standards_number_of_stories, mechRmInBsmt =
19
+ getGeometryData(model, prototype_creator)
20
+ nominal_flr2flr_height_m = (OpenStudio.convert(nominal_flr2flr_height_ft, 'ft', 'm').get)
21
+
22
+ number_of_dcv_controller_for_all_air_loops = 0
23
+
24
+ model.getAirLoopHVACs.sort.each do |air_loop|
25
+ number_of_thermal_zones_served_by_air_loop = 0
26
+ number_floors_served_by_air_loop = 0
27
+ number_of_junction_boxes_for_air_loop = 0
28
+
29
+ # Step A: Calculate number of thermal zones and floors served by each
30
+ # AirLoopHVAC (air_loop).
31
+ building_story_list = []
32
+ air_loop.thermalZones.sort.each do |thermal_zone|
33
+ thermal_zone.spaces().sort.each do |space|
34
+ building_story_list << space.buildingStory.get.name()
35
+ end
36
+ number_of_thermal_zones_served_by_air_loop += thermal_zone.multiplier()
33
37
  end
34
- number_of_thermal_zones_served_by_air_loop += thermal_zone.multiplier()
35
- end
36
- building_story_list = building_story_list.uniq()
37
- number_floors_served_by_air_loop = building_story_list.length
38
-
39
- ##### Loop through AirLoopHVAC's supply nodes to:
40
- ##### (1) Find its AirLoopHVAC:OutdoorAirSystem using the supply node;
41
- ##### (2) Find Controller:OutdoorAir using AirLoopHVAC:OutdoorAirSystem;
42
- ##### (3) Get "Controller Mechanical Ventilation" from Controller:OutdoorAir.
43
- air_loop.supplyComponents.sort.each do |supply_component|
44
- ##### Find AirLoopHVAC:OutdoorAirSystem of AirLoopHVAC using the supply node.
45
- hvac_component = supply_component.to_AirLoopHVACOutdoorAirSystem
46
-
47
- if !hvac_component.empty?
48
-
49
- tags = ['ventilation', 'demand_controlled_ventilation']
50
-
51
- ##### Find Controller:OutdoorAir using AirLoopHVAC:OutdoorAirSystem.
52
- hvac_component = hvac_component.get
53
- hvac_component_name = hvac_component.name()
54
- controller_outdoorair = hvac_component.getControllerOutdoorAir
55
- controller_outdoorair_name = controller_outdoorair.name()
56
-
57
- ##### Get "Controller Mechanical Ventilation" from Controller:OutdoorAir.
58
- controller_mechanical_ventilation = controller_outdoorair.controllerMechanicalVentilation
59
- controller_mechanical_ventilation_name = controller_mechanical_ventilation.name()
60
-
61
- ##### Check if "Demand Controlled Ventilation" is "Yes" in Controller:MechanicalVentilation depending on dcv_type.
62
- controller_mechanical_ventilation_demand_controlled_ventilation_status = controller_mechanical_ventilation.demandControlledVentilation
63
-
64
- controller_mechanical_ventilation_system_outdoor_air_method = controller_mechanical_ventilation.systemOutdoorAirMethod()
65
- if controller_mechanical_ventilation_demand_controlled_ventilation_status == true && (controller_mechanical_ventilation_system_outdoor_air_method == 'ZoneSum' || controller_mechanical_ventilation_system_outdoor_air_method == 'IndoorAirQualityProcedure')
66
-
67
- ##### Step B: Calculate costs of the installation of a single junction box for each floor within that AirLoopHVAC (air_loop) to accumulate the wiring
68
- quantity_ahu_floors_junction_box = 1.0 * number_floors_served_by_air_loop
69
- search_ahu_floors_junction_box = {
70
- row_id_1: 'Ea',
71
- row_id_2: 14
72
- }
73
- sheet_name = 'materials_lighting'
74
- column_1 = 'unit'
75
- column_2 = 'lighting_type_id'
76
- dcv_cost_box = assembly_cost(cost_info:search_ahu_floors_junction_box,
77
- sheet_name:sheet_name,
78
- column_1:column_1,
79
- column_2:column_2,
80
- quantity:quantity_ahu_floors_junction_box,
81
- tags: tags)
82
-
83
- ##### Step C: Calculate costs of the installation of a single conduit that runs the entire height of the building for each AirLoopHVAC to accumulate the wiring
84
- quantity_ahu_vertical_wiring = 1.0/100.0 * standards_number_of_stories * nominal_flr2flr_height_ft
85
- search_ahu_vertical_wiring = {
86
- row_id_1: 'CLF',
87
- row_id_2: 10
88
- }
89
- sheet_name = 'materials_lighting'
90
- column_1 = 'unit'
91
- column_2 = 'lighting_type_id'
92
- cost_ahu_vertical_wiring = assembly_cost(cost_info:search_ahu_vertical_wiring,
93
- sheet_name:sheet_name,
94
- column_1:column_1,
95
- column_2:column_2,
96
- quantity:quantity_ahu_vertical_wiring,
97
- tags: tags)
98
- quantity_ahu_vertical_conduit = 1.0 * standards_number_of_stories * nominal_flr2flr_height_ft
99
- search_ahu_vertical_conduit = {
100
- row_id_1: 'LF',
101
- row_id_2: 13
102
- }
103
- sheet_name = 'materials_lighting'
104
- column_1 = 'unit'
105
- column_2 = 'lighting_type_id'
106
- cost_ahu_vertical_conduit = assembly_cost(cost_info:search_ahu_vertical_conduit,
107
- sheet_name:sheet_name,
108
- column_1:column_1,
109
- column_2:column_2,
110
- quantity:quantity_ahu_vertical_conduit,
111
- tags: tags)
112
- dcv_cost_vertical_conduit = cost_ahu_vertical_wiring + cost_ahu_vertical_conduit
113
-
114
- ##### Step D: Calculate the roof conduit and wiring for each AirLoopHVAC.
115
- quantity_ahu_roof_wiring = 20.0/100.0
116
- search_ahu_roof_wiring = {
117
- row_id_1: 'CLF',
118
- row_id_2: 10
119
- }
120
- sheet_name = 'materials_lighting'
121
- column_1 = 'unit'
122
- column_2 = 'lighting_type_id'
123
- cost_ahu_roof_wiring = assembly_cost(cost_info:search_ahu_roof_wiring,
124
- sheet_name:sheet_name,
125
- column_1:column_1,
126
- column_2:column_2,
127
- quantity:quantity_ahu_roof_wiring,
128
- tags: tags)
129
- quantity_ahu_roof_conduit = 20.0
130
- search_ahu_roof_conduit = {
131
- row_id_1: 'LF',
132
- row_id_2: 13
133
- }
134
- sheet_name = 'materials_lighting'
135
- column_1 = 'unit'
136
- column_2 = 'lighting_type_id'
137
- cost_ahu_roof_conduit = assembly_cost(cost_info:search_ahu_roof_conduit,
138
- sheet_name:sheet_name,
139
- column_1:column_1,
140
- column_2:column_2,
141
- quantity:quantity_ahu_roof_conduit,
142
- tags: tags)
143
- quantity_ahu_roof_junction_box = 1.0
144
- search_ahu_roof_junction_box = {
145
- row_id_1: 'Ea',
146
- row_id_2: 14
147
- }
148
- sheet_name = 'materials_lighting'
149
- column_1 = 'unit'
150
- column_2 = 'lighting_type_id'
151
- cost_ahu_roof_junction_box = assembly_cost(cost_info:search_ahu_roof_junction_box,
152
- sheet_name:sheet_name,
153
- column_1:column_1,
154
- column_2:column_2,
155
- quantity:quantity_ahu_roof_junction_box,
156
- tags: tags)
157
- dcv_cost_roof = cost_ahu_roof_wiring + cost_ahu_roof_conduit + cost_ahu_roof_junction_box
158
-
159
- ##### Step E: Calculate DCV controller for each AirLoopHVAC.
160
- number_of_dcv_controller_for_all_air_loops += 1
161
- quantity_ahu_contorller = 1.0
162
- search_ahu_contorller = {
163
- row_id_1: 'Ea',
164
- row_id_2: 400
165
- }
166
- sheet_name = 'materials_lighting'
167
- column_1 = 'unit'
168
- column_2 = 'lighting_type_id'
169
- dcv_cost_control = assembly_cost(cost_info:search_ahu_contorller,
170
- sheet_name:sheet_name,
171
- column_1:column_1,
172
- column_2:column_2,
173
- quantity:quantity_ahu_contorller,
174
- tags: tags)
175
-
176
- if controller_mechanical_ventilation_system_outdoor_air_method == 'ZoneSum'
177
- ##### Step F: Calculate total Cost for each AirLoopHVAC
178
- # Calculate occupancy sensor-related costs of each thermal zone served by each AirLoopHVAC (air_loop)
179
- quantity_tz_occupancy_sensor = 1.0 * number_of_thermal_zones_served_by_air_loop.to_f
180
- search_tz_occupancy_sensor = {
181
- row_id_1: 'Ea',
182
- row_id_2: 404
183
- }
38
+ building_story_list = building_story_list.uniq()
39
+ number_floors_served_by_air_loop = building_story_list.length
40
+
41
+ # Loop through AirLoopHVAC's supply nodes to:
42
+ # (1) Find its AirLoopHVAC:OutdoorAirSystem using the supply node;
43
+ # (2) Find Controller:OutdoorAir using AirLoopHVAC:OutdoorAirSystem;
44
+ # (3) Get "Controller Mechanical Ventilation" from Controller:OutdoorAir.
45
+ air_loop.supplyComponents.sort.each do |supply_component|
46
+
47
+ # Find AirLoopHVAC:OutdoorAirSystem of AirLoopHVAC using the supply node.
48
+ hvac_component = supply_component.to_AirLoopHVACOutdoorAirSystem
49
+
50
+ if !hvac_component.empty?
51
+
52
+ tags = ['ventilation', 'demand_controlled_ventilation']
53
+
54
+ # Find Controller:OutdoorAir using AirLoopHVAC:OutdoorAirSystem.
55
+ hvac_component = hvac_component.get
56
+ hvac_component_name = hvac_component.name()
57
+ controller_outdoorair = hvac_component.getControllerOutdoorAir
58
+ controller_outdoorair_name = controller_outdoorair.name()
59
+
60
+ # Get "Controller Mechanical Ventilation" from Controller:OutdoorAir.
61
+ controller_mechanical_ventilation = controller_outdoorair.controllerMechanicalVentilation
62
+ controller_mechanical_ventilation_name = controller_mechanical_ventilation.name()
63
+
64
+ # Check if "Demand Controlled Ventilation" is "Yes" in
65
+ # Controller:MechanicalVentilation depending on dcv_type.
66
+ controller_mechanical_ventilation_demand_controlled_ventilation_status =
67
+ controller_mechanical_ventilation.demandControlledVentilation
68
+
69
+ controller_mechanical_ventilation_system_outdoor_air_method =
70
+ controller_mechanical_ventilation.systemOutdoorAirMethod()
71
+
72
+ if controller_mechanical_ventilation_demand_controlled_ventilation_status == true &&
73
+ (controller_mechanical_ventilation_system_outdoor_air_method == 'ZoneSum' ||
74
+ controller_mechanical_ventilation_system_outdoor_air_method == 'IndoorAirQualityProcedure')
75
+
76
+ # Step B: Calculate costs of the installation of a single junction
77
+ # box for each floor within that AirLoopHVAC (air_loop) to
78
+ # accumulate the wiring.
79
+ quantity_ahu_floors_junction_box = 1.0 * number_floors_served_by_air_loop
80
+ search_ahu_floors_junction_box = { row_id_1: 'Ea', row_id_2: 14 }
184
81
  sheet_name = 'materials_lighting'
185
- column_1 = 'unit'
186
- column_2 = 'lighting_type_id'
187
- cost_tz_occupancy_sensor = assembly_cost(cost_info:search_tz_occupancy_sensor,
188
- sheet_name:sheet_name,
189
- column_1:column_1,
190
- column_2:column_2,
191
- quantity:quantity_tz_occupancy_sensor,
192
- tags: tags)
193
- quantity_tz_occupancy_sensor_wiring = 30.0/100.0 * number_of_thermal_zones_served_by_air_loop.to_f
194
- search_tz_occupancy_sensor_wiring = {
195
- row_id_1: 'CLF',
196
- row_id_2: 10
197
- }
82
+ column_1 = 'unit'
83
+ column_2 = 'lighting_type_id'
84
+ dcv_cost_box = assembly_cost(cost_info: search_ahu_floors_junction_box,
85
+ sheet_name: sheet_name,
86
+ column_1: column_1,
87
+ column_2: column_2,
88
+ quantity: quantity_ahu_floors_junction_box,
89
+ tags: tags)
90
+
91
+ # Step C: Calculate costs of the installation of a single conduit
92
+ # that runs the entire height of the building for each AirLoopHVAC
93
+ # to accumulate the wiring.
94
+ quantity_ahu_vertical_wiring = 1.0/100.0 * standards_number_of_stories * nominal_flr2flr_height_ft
95
+ search_ahu_vertical_wiring = { row_id_1: 'CLF', row_id_2: 10 }
198
96
  sheet_name = 'materials_lighting'
199
- column_1 = 'unit'
200
- column_2 = 'lighting_type_id'
201
- cost_tz_occupancy_sensor_wiring = assembly_cost(cost_info:search_tz_occupancy_sensor_wiring,
202
- sheet_name:sheet_name,
203
- column_1:column_1,
204
- column_2:column_2,
205
- quantity:quantity_tz_occupancy_sensor_wiring,
206
- tags: tags)
207
- quantity_tz_occupancy_sensor_pvc_conduit = 30.0 * number_of_thermal_zones_served_by_air_loop.to_f
208
- search_tz_occupancy_sensor_pvc_conduit = {
209
- row_id_1: 'LF',
210
- row_id_2: 17
211
- }
97
+ column_1 = 'unit'
98
+ column_2 = 'lighting_type_id'
99
+ cost_ahu_vertical_wiring = assembly_cost(cost_info: search_ahu_vertical_wiring,
100
+ sheet_name: sheet_name,
101
+ column_1: column_1,
102
+ column_2: column_2,
103
+ quantity: quantity_ahu_vertical_wiring,
104
+ tags: tags)
105
+
106
+ quantity_ahu_vertical_conduit = 1.0 * standards_number_of_stories * nominal_flr2flr_height_ft
107
+ search_ahu_vertical_conduit = { row_id_1: 'LF', row_id_2: 13 }
212
108
  sheet_name = 'materials_lighting'
213
- column_1 = 'unit'
214
- column_2 = 'lighting_type_id'
215
- cost_tz_occupancy_sensor_pvc_conduit = assembly_cost(cost_info:search_tz_occupancy_sensor_pvc_conduit,
216
- sheet_name:sheet_name,
217
- column_1:column_1,
218
- column_2:column_2,
219
- quantity:quantity_tz_occupancy_sensor_pvc_conduit,
220
- tags: tags)
221
- dcv_cost_zone_occupancy = cost_tz_occupancy_sensor + cost_tz_occupancy_sensor_wiring + cost_tz_occupancy_sensor_pvc_conduit
222
- dcv_cost_total += dcv_cost_zone_occupancy + dcv_cost_box + dcv_cost_vertical_conduit + dcv_cost_roof + dcv_cost_control
223
- total_cost_for_air_loop = dcv_cost_zone_occupancy + dcv_cost_box + dcv_cost_vertical_conduit + dcv_cost_roof + dcv_cost_control
224
- elsif controller_mechanical_ventilation_system_outdoor_air_method == 'IndoorAirQualityProcedure'
225
- ##### Step F: Calculate total Cost for each AirLoopHVAC
226
- # Calculate CO2 sensor-related costs of each thermal zone served by each AirLoopHVAC (air_loop)
227
- quantity_tz_co2_sensor = 1.0 * number_of_thermal_zones_served_by_air_loop.to_f
228
- search_tz_co2_sensor = {
229
- row_id_1: nil,
230
- row_id_2: 1316
231
- }
232
- sheet_name = 'materials_hvac'
233
- column_1 = nil
234
- column_2 = 'material_id'
235
- cost_tz_co2_sensor = assembly_cost(cost_info:search_tz_co2_sensor,
236
- sheet_name:sheet_name,
237
- column_1:column_1,
238
- column_2:column_2,
239
- quantity:quantity_tz_co2_sensor,
240
- tags: tags)
241
- quantity_tz_co2_sensor_wiring = 30.0/100.0 * number_of_thermal_zones_served_by_air_loop.to_f
242
- search_tz_co2_sensor_wiring = {
243
- row_id_1: 'CLF',
244
- row_id_2: 10
245
- }
109
+ column_1 = 'unit'
110
+ column_2 = 'lighting_type_id'
111
+ cost_ahu_vertical_conduit = assembly_cost(cost_info: search_ahu_vertical_conduit,
112
+ sheet_name: sheet_name,
113
+ column_1: column_1,
114
+ column_2: column_2,
115
+ quantity: quantity_ahu_vertical_conduit,
116
+ tags: tags)
117
+
118
+ dcv_cost_vertical_conduit = cost_ahu_vertical_wiring + cost_ahu_vertical_conduit
119
+
120
+ # Step D: Calculate the roof conduit and wiring for each
121
+ # AirLoopHVAC.
122
+ quantity_ahu_roof_wiring = 20.0/100.0
123
+ search_ahu_roof_wiring = { row_id_1: 'CLF', row_id_2: 10 }
246
124
  sheet_name = 'materials_lighting'
247
- column_1 = 'unit'
248
- column_2 = 'lighting_type_id'
249
- cost_tz_co2_sensor_wiring = assembly_cost(cost_info:search_tz_co2_sensor_wiring,
250
- sheet_name:sheet_name,
251
- column_1:column_1,
252
- column_2:column_2,
253
- quantity:quantity_tz_co2_sensor_wiring,
254
- tags: tags)
255
- quantity_tz_co2_sensor_pvc_conduit = 30.0 * number_of_thermal_zones_served_by_air_loop.to_f
256
- search_tz_co2_sensor_pvc_conduit = {
257
- row_id_1: 'LF',
258
- row_id_2: 17
259
- }
125
+ column_1 = 'unit'
126
+ column_2 = 'lighting_type_id'
127
+ cost_ahu_roof_wiring = assembly_cost(cost_info: search_ahu_roof_wiring,
128
+ sheet_name: sheet_name,
129
+ column_1: column_1,
130
+ column_2: column_2,
131
+ quantity: quantity_ahu_roof_wiring,
132
+ tags: tags)
133
+ quantity_ahu_roof_conduit = 20.0
134
+ search_ahu_roof_conduit = { row_id_1: 'LF', row_id_2: 13 }
260
135
  sheet_name = 'materials_lighting'
261
- column_1 = 'unit'
262
- column_2 = 'lighting_type_id'
263
- cost_tz_co2_sensor_pvc_conduit = assembly_cost(cost_info:search_tz_co2_sensor_pvc_conduit,
264
- sheet_name:sheet_name,
265
- column_1:column_1,
266
- column_2:column_2,
267
- quantity:quantity_tz_co2_sensor_pvc_conduit,
268
- tags: tags)
269
- dcv_cost_zone_co2 = cost_tz_co2_sensor + cost_tz_co2_sensor_wiring + cost_tz_co2_sensor_pvc_conduit
270
- dcv_cost_total += dcv_cost_zone_co2 + dcv_cost_box + dcv_cost_vertical_conduit + dcv_cost_roof + dcv_cost_control
271
- total_cost_for_air_loop = dcv_cost_zone_co2 + dcv_cost_box + dcv_cost_vertical_conduit + dcv_cost_roof + dcv_cost_control
272
- end
136
+ column_1 = 'unit'
137
+ column_2 = 'lighting_type_id'
138
+ cost_ahu_roof_conduit = assembly_cost(cost_info: search_ahu_roof_conduit,
139
+ sheet_name: sheet_name,
140
+ column_1: column_1,
141
+ column_2: column_2,
142
+ quantity: quantity_ahu_roof_conduit,
143
+ tags: tags)
273
144
 
274
- ##### Gather information for reporting
275
- @costing_report['ventilation'][:demand_controlled_ventilation] << {
276
- air_loop_name: air_loop.name().to_s,
277
- controller_Outdoor_air: controller_outdoorair_name.to_s,
278
- controller_mechanical_ventilation_name: controller_mechanical_ventilation_name.to_s,
279
- controller_mechanical_ventilation_demand_controlled_ventilation_status: controller_mechanical_ventilation_demand_controlled_ventilation_status.to_s,
280
- controller_mechanical_ventilation_system_outdoor_air_method: controller_mechanical_ventilation_system_outdoor_air_method.to_s,
281
- number_of_floors_served_by_air_loop: number_floors_served_by_air_loop.to_f,
282
- number_of_thermal_zones_served_by_air_loop: number_of_thermal_zones_served_by_air_loop.to_f,
283
- number_of_junction_boxes_for_air_loop: number_floors_served_by_air_loop.to_f,
284
- total_cost_for_air_loop: total_cost_for_air_loop.to_f.round(2)
285
- }
286
- a += 1.0
145
+ quantity_ahu_roof_junction_box = 1.0
146
+ search_ahu_roof_junction_box = { row_id_1: 'Ea', row_id_2: 14 }
147
+ sheet_name = 'materials_lighting'
148
+ column_1 = 'unit'
149
+ column_2 = 'lighting_type_id'
150
+ cost_ahu_roof_junction_box = assembly_cost(cost_info: search_ahu_roof_junction_box,
151
+ sheet_name: sheet_name,
152
+ column_1: column_1,
153
+ column_2: column_2,
154
+ quantity: quantity_ahu_roof_junction_box,
155
+ tags: tags)
287
156
 
288
- end
157
+ dcv_cost_roof = cost_ahu_roof_wiring + cost_ahu_roof_conduit + cost_ahu_roof_junction_box
289
158
 
290
- # puts dcv_cost_total
159
+ # Step E: Calculate DCV controller for each AirLoopHVAC.
160
+ number_of_dcv_controller_for_all_air_loops += 1
161
+ quantity_ahu_contorller = 1.0
162
+ search_ahu_contorller = { row_id_1: 'Ea', row_id_2: 400 }
163
+ sheet_name = 'materials_lighting'
164
+ column_1 = 'unit'
165
+ column_2 = 'lighting_type_id'
166
+ dcv_cost_control = assembly_cost(cost_info: search_ahu_contorller,
167
+ sheet_name: sheet_name,
168
+ column_1: column_1,
169
+ column_2: column_2,
170
+ quantity: quantity_ahu_contorller,
171
+ tags: tags)
291
172
 
292
- end #if !hvac_component.empty?
173
+ if controller_mechanical_ventilation_system_outdoor_air_method == 'ZoneSum'
293
174
 
294
- end #air_loop.supplyComponents.each do |supply_component|
175
+ # Step F: Calculate total Cost for each AirLoopHVAC.
176
+ # Calculate occupancy sensor-related costs of each thermal zone
177
+ # served by each AirLoopHVAC (air_loop)
178
+ quantity_tz_occupancy_sensor = 1.0 * number_of_thermal_zones_served_by_air_loop.to_f
179
+ search_tz_occupancy_sensor = { row_id_1: 'Ea', row_id_2: 404 }
180
+ sheet_name = 'materials_lighting'
181
+ column_1 = 'unit'
182
+ column_2 = 'lighting_type_id'
183
+ cost_tz_occupancy_sensor = assembly_cost(cost_info: search_tz_occupancy_sensor,
184
+ sheet_name: sheet_name,
185
+ column_1: column_1,
186
+ column_2: column_2,
187
+ quantity: quantity_tz_occupancy_sensor,
188
+ tags: tags)
295
189
 
296
- end #model.getAirLoopHVACs.each do |air_loop|
190
+ quantity_tz_occupancy_sensor_wiring = 30.0/100.0 * number_of_thermal_zones_served_by_air_loop.to_f
191
+ search_tz_occupancy_sensor_wiring = { row_id_1: 'CLF', row_id_2: 10 }
192
+ sheet_name = 'materials_lighting'
193
+ column_1 = 'unit'
194
+ column_2 = 'lighting_type_id'
195
+ cost_tz_occupancy_sensor_wiring = assembly_cost(cost_info: search_tz_occupancy_sensor_wiring,
196
+ sheet_name: sheet_name,
197
+ column_1: column_1,
198
+ column_2: column_2,
199
+ quantity: quantity_tz_occupancy_sensor_wiring,
200
+ tags: tags)
297
201
 
298
- if a > 0.0
299
- ###### Gather information for reporting
300
- @costing_report['ventilation'][:demand_controlled_ventilation] << {
301
- standards_number_of_building_stories: standards_number_of_stories.to_f,
302
- nominal_floor_to_floor_height: nominal_flr2flr_height_m.to_f.round(2),
303
- total_cost_for_all_dcvs: dcv_cost_total.to_f.round(2)
304
- }
305
- end
202
+ quantity_tz_occupancy_sensor_pvc_conduit = 30.0 * number_of_thermal_zones_served_by_air_loop.to_f
203
+ search_tz_occupancy_sensor_pvc_conduit = { row_id_1: 'LF', row_id_2: 17 }
204
+ sheet_name = 'materials_lighting'
205
+ column_1 = 'unit'
206
+ column_2 = 'lighting_type_id'
207
+ cost_tz_occupancy_sensor_pvc_conduit = assembly_cost(
208
+ cost_info: search_tz_occupancy_sensor_pvc_conduit,
209
+ sheet_name: sheet_name,
210
+ column_1: column_1,
211
+ column_2: column_2,
212
+ quantity: quantity_tz_occupancy_sensor_pvc_conduit,
213
+ tags: tags)
306
214
 
215
+ dcv_cost_zone_occupancy =
216
+ cost_tz_occupancy_sensor + cost_tz_occupancy_sensor_wiring + cost_tz_occupancy_sensor_pvc_conduit
217
+ dcv_cost_total +=
218
+ dcv_cost_zone_occupancy + dcv_cost_box + dcv_cost_vertical_conduit + dcv_cost_roof + dcv_cost_control
219
+ total_cost_for_air_loop =
220
+ dcv_cost_zone_occupancy + dcv_cost_box + dcv_cost_vertical_conduit + dcv_cost_roof + dcv_cost_control
307
221
 
308
- puts "\nDemand-controlled ventilation costing data successfully generated. Total DCV costs: $#{dcv_cost_total.round(2)}"
222
+ elsif controller_mechanical_ventilation_system_outdoor_air_method == 'IndoorAirQualityProcedure'
223
+ # Step F: Calculate total Cost for each AirLoopHVAC
224
+ # Calculate CO2 sensor-related costs of each thermal zone served
225
+ # by each AirLoopHVAC (air_loop).
226
+ quantity_tz_co2_sensor = 1.0 * number_of_thermal_zones_served_by_air_loop.to_f
227
+ search_tz_co2_sensor = { row_id_1: nil, row_id_2: 1316 }
228
+ sheet_name = 'materials_hvac'
229
+ column_1 = nil
230
+ column_2 = 'material_id'
231
+ cost_tz_co2_sensor = assembly_cost(cost_info: search_tz_co2_sensor,
232
+ sheet_name: sheet_name,
233
+ column_1: column_1,
234
+ column_2: column_2,
235
+ quantity: quantity_tz_co2_sensor,
236
+ tags: tags)
237
+ quantity_tz_co2_sensor_wiring = 30.0/100.0 * number_of_thermal_zones_served_by_air_loop.to_f
238
+ search_tz_co2_sensor_wiring = { row_id_1: 'CLF', row_id_2: 10 }
239
+ sheet_name = 'materials_lighting'
240
+ column_1 = 'unit'
241
+ column_2 = 'lighting_type_id'
242
+ cost_tz_co2_sensor_wiring = assembly_cost(cost_info: search_tz_co2_sensor_wiring,
243
+ sheet_name: sheet_name,
244
+ column_1: column_1,
245
+ column_2: column_2,
246
+ quantity: quantity_tz_co2_sensor_wiring,
247
+ tags: tags)
309
248
 
310
- return dcv_cost_total
311
- end #cost_audit_dcv(model, prototype_creator)
249
+ quantity_tz_co2_sensor_pvc_conduit = 30.0 * number_of_thermal_zones_served_by_air_loop.to_f
250
+ search_tz_co2_sensor_pvc_conduit = { row_id_1: 'LF', row_id_2: 17 }
251
+ sheet_name = 'materials_lighting'
252
+ column_1 = 'unit'
253
+ column_2 = 'lighting_type_id'
254
+ cost_tz_co2_sensor_pvc_conduit = assembly_cost(cost_info: search_tz_co2_sensor_pvc_conduit,
255
+ sheet_name: sheet_name,
256
+ column_1: column_1,
257
+ column_2: column_2,
258
+ quantity: quantity_tz_co2_sensor_pvc_conduit,
259
+ tags: tags)
260
+ dcv_cost_zone_co2 = cost_tz_co2_sensor + cost_tz_co2_sensor_wiring + cost_tz_co2_sensor_pvc_conduit
261
+ dcv_cost_total +=
262
+ dcv_cost_zone_co2 + dcv_cost_box + dcv_cost_vertical_conduit + dcv_cost_roof + dcv_cost_control
263
+ total_cost_for_air_loop =
264
+ dcv_cost_zone_co2 + dcv_cost_box + dcv_cost_vertical_conduit + dcv_cost_roof + dcv_cost_control
265
+ end
266
+
267
+ # Gather information for reporting
268
+ @costing_report['ventilation'][:demand_controlled_ventilation] << {
269
+ air_loop_name: air_loop.name().to_s,
270
+ controller_Outdoor_air: controller_outdoorair_name.to_s,
271
+ controller_mechanical_ventilation_name: controller_mechanical_ventilation_name.to_s,
272
+ controller_mechanical_ventilation_demand_controlled_ventilation_status: controller_mechanical_ventilation_demand_controlled_ventilation_status.to_s,
273
+ controller_mechanical_ventilation_system_outdoor_air_method: controller_mechanical_ventilation_system_outdoor_air_method.to_s,
274
+ number_of_floors_served_by_air_loop: number_floors_served_by_air_loop.to_f,
275
+ number_of_thermal_zones_served_by_air_loop: number_of_thermal_zones_served_by_air_loop.to_f,
276
+ number_of_junction_boxes_for_air_loop: number_floors_served_by_air_loop.to_f,
277
+ total_cost_for_air_loop: total_cost_for_air_loop.to_f.round(2)
278
+ }
279
+ a += 1.0
280
+
281
+ end
282
+ end # if !hvac_component.empty?
283
+ end # air_loop.supplyComponents.each do |supply_component|
284
+ end # model.getAirLoopHVACs.each do |air_loop|
285
+
286
+ if a > 0.0
287
+ # Gather information for reporting
288
+ @costing_report['ventilation'][:demand_controlled_ventilation] << {
289
+ standards_number_of_building_stories: standards_number_of_stories.to_f,
290
+ nominal_floor_to_floor_height: nominal_flr2flr_height_m.to_f.round(2),
291
+ total_cost_for_all_dcvs: dcv_cost_total.to_f.round(2)
292
+ }
293
+ end
312
294
 
295
+ puts "\nDemand-controlled ventilation costing data successfully generated. Total DCV costs: $#{dcv_cost_total.round(2)}"
313
296
 
314
- end
297
+ return dcv_cost_total
298
+ end # cost_audit_dcv(model, prototype_creator)
299
+ end
300
+ end