openstudio-common-measures 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +44 -0
  3. data/Rakefile +3 -0
  4. data/lib/measures/ChangeBuildingLocation/measure.xml +11 -11
  5. data/lib/measures/ExportScheduleCSV/measure.rb +1 -1
  6. data/lib/measures/ExportScheduleCSV/measure.xml +16 -15
  7. data/lib/measures/ImportEnvelopeAndInternalLoadsFromIdf/measure.xml +7 -6
  8. data/lib/measures/MeterFlodPlot/measure.rb +1 -1
  9. data/lib/measures/MeterFlodPlot/measure.xml +16 -15
  10. data/lib/measures/ReportModelChanges/measure.xml +2 -2
  11. data/lib/measures/RunPeriodMultiple/measure.xml +12 -11
  12. data/lib/measures/ServerDirectoryCleanup/README.md +97 -3
  13. data/lib/measures/ServerDirectoryCleanup/measure.rb +1 -1
  14. data/lib/measures/ServerDirectoryCleanup/measure.xml +10 -59
  15. data/lib/measures/UnmetLoadHoursTroubleshooting/README.md +9 -3
  16. data/lib/measures/UnmetLoadHoursTroubleshooting/measure.rb +1 -1
  17. data/lib/measures/UnmetLoadHoursTroubleshooting/measure.xml +66 -17
  18. data/lib/measures/VentilationQAQC/README.md +9 -3
  19. data/lib/measures/VentilationQAQC/measure.rb +52 -45
  20. data/lib/measures/VentilationQAQC/measure.xml +25 -30
  21. data/lib/measures/ZoneReport/README.md +2 -2
  22. data/lib/measures/ZoneReport/measure.rb +1 -1
  23. data/lib/measures/ZoneReport/measure.xml +10 -11
  24. data/lib/measures/add_ems_to_control_ev_charging/LICENSE.MD.txt +15 -0
  25. data/lib/measures/{AddDaylightSensors → add_ems_to_control_ev_charging}/LICENSE.md +0 -0
  26. data/lib/measures/add_ems_to_control_ev_charging/ReadMe.MD +29 -0
  27. data/lib/measures/add_ems_to_control_ev_charging/measure.rb +288 -0
  28. data/lib/measures/add_ems_to_control_ev_charging/measure.xml +87 -0
  29. data/lib/measures/add_ev_load/LICENSE.MD.txt +15 -0
  30. data/lib/measures/{EnableDemandControlledVentilation → add_ev_load}/LICENSE.md +0 -0
  31. data/lib/measures/add_ev_load/ReadMe.MD +34 -0
  32. data/lib/measures/add_ev_load/measure.rb +328 -0
  33. data/lib/measures/add_ev_load/measure.xml +153 -0
  34. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/PSN_BuildingKey.csv +104 -0
  35. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/PSN_BuildingKey_v2.csv +104 -0
  36. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow1_flex1.csv +96 -0
  37. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow1_flex2.csv +96 -0
  38. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow1_flex3.csv +96 -0
  39. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow2_flex1.csv +96 -0
  40. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow2_flex2.csv +96 -0
  41. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow2_flex3.csv +96 -0
  42. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow3_flex1.csv +96 -0
  43. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow3_flex2.csv +96 -0
  44. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg1_dow3_flex3.csv +96 -0
  45. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow1_flex1.csv +96 -0
  46. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow1_flex2.csv +96 -0
  47. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow1_flex3.csv +96 -0
  48. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow2_flex1.csv +96 -0
  49. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow2_flex2.csv +96 -0
  50. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow2_flex3.csv +96 -0
  51. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow3_flex1.csv +96 -0
  52. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow3_flex2.csv +96 -0
  53. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg2_dow3_flex3.csv +96 -0
  54. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow1_flex1.csv +96 -0
  55. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow1_flex2.csv +96 -0
  56. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow1_flex3.csv +96 -0
  57. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow2_flex1.csv +96 -0
  58. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow2_flex2.csv +96 -0
  59. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow2_flex3.csv +96 -0
  60. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow3_flex1.csv +96 -0
  61. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow3_flex2.csv +96 -0
  62. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/chg3_dow3_flex3.csv +96 -0
  63. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/fast_charge_15min_Saturday.csv +96 -0
  64. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/fast_charge_15min_Sunday.csv +96 -0
  65. data/lib/measures/add_ev_load/resources/EV_Load_Profiles/fast_charge_15min_Weekday.csv +96 -0
  66. data/lib/measures/envelope_and_internal_load_breakdown/README.md +4 -3
  67. data/lib/measures/envelope_and_internal_load_breakdown/measure.rb +7 -4
  68. data/lib/measures/envelope_and_internal_load_breakdown/measure.xml +16 -17
  69. data/lib/measures/envelope_and_internal_load_breakdown/resources/report.html.erb +1 -0
  70. data/lib/measures/example_report/README.md +27 -5
  71. data/lib/measures/example_report/measure.rb +7 -4
  72. data/lib/measures/example_report/measure.xml +16 -29
  73. data/lib/measures/example_report/resources/report.html.erb +1 -0
  74. data/lib/measures/gem_env_report/measure.xml +1 -1
  75. data/lib/measures/generic_qaqc/README.md +187 -5
  76. data/lib/measures/generic_qaqc/measure.rb +1 -1
  77. data/lib/measures/generic_qaqc/measure.xml +15 -85
  78. data/lib/measures/generic_qaqc/resources/report.html.erb +1 -0
  79. data/lib/measures/hvac_psychrometric_chart/README.md +11 -5
  80. data/lib/measures/hvac_psychrometric_chart/measure.rb +1 -1
  81. data/lib/measures/hvac_psychrometric_chart/measure.xml +13 -18
  82. data/lib/measures/hvac_psychrometric_chart/resources/report.html.erb +1 -0
  83. data/lib/measures/inject_idf_objects/measure.xml +25 -24
  84. data/lib/measures/openstudio_results/README.md +195 -5
  85. data/lib/measures/openstudio_results/measure.rb +2 -2
  86. data/lib/measures/openstudio_results/measure.xml +30 -154
  87. data/lib/measures/openstudio_results/resources/report.html.erb +1 -0
  88. data/lib/measures/set_run_period/measure.xml +2 -2
  89. data/lib/measures/{EnableEconomizerControl → view_data}/LICENSE.md +0 -0
  90. data/lib/measures/view_data/README.md +64 -0
  91. data/lib/measures/{AddDaylightSensors → view_data}/README.md.erb +0 -0
  92. data/lib/measures/view_data/measure.rb +454 -0
  93. data/lib/measures/view_data/measure.xml +159 -0
  94. data/lib/measures/view_data/resources/report.html.in +2881 -0
  95. data/lib/measures/view_data/resources/va3c.rb +1021 -0
  96. data/lib/measures/{ImproveFanBeltEfficiency → view_model}/LICENSE.md +0 -0
  97. data/lib/measures/view_model/README.md +26 -0
  98. data/lib/measures/{EnableDemandControlledVentilation → view_model}/README.md.erb +0 -0
  99. data/lib/measures/view_model/measure.rb +146 -0
  100. data/lib/measures/view_model/measure.xml +98 -0
  101. data/lib/measures/view_model/resources/report.html.in +2881 -0
  102. data/lib/measures/view_model/resources/va3c.rb +1021 -0
  103. data/lib/openstudio/common_measures/version.rb +1 -1
  104. data/openstudio-common-measures.gemspec +1 -1
  105. metadata +61 -71
  106. data/lib/measures/AddDaylightSensors/README.md +0 -136
  107. data/lib/measures/AddDaylightSensors/measure.rb +0 -521
  108. data/lib/measures/AddDaylightSensors/measure.xml +0 -233
  109. data/lib/measures/EnableDemandControlledVentilation/README.md +0 -32
  110. data/lib/measures/EnableDemandControlledVentilation/measure.rb +0 -154
  111. data/lib/measures/EnableDemandControlledVentilation/measure.xml +0 -99
  112. data/lib/measures/EnableEconomizerControl/README.md +0 -48
  113. data/lib/measures/EnableEconomizerControl/README.md.erb +0 -42
  114. data/lib/measures/EnableEconomizerControl/measure.rb +0 -172
  115. data/lib/measures/EnableEconomizerControl/measure.xml +0 -124
  116. data/lib/measures/ImproveFanBeltEfficiency/README.md +0 -104
  117. data/lib/measures/ImproveFanBeltEfficiency/README.md.erb +0 -42
  118. data/lib/measures/ImproveFanBeltEfficiency/measure.rb +0 -366
  119. data/lib/measures/ImproveFanBeltEfficiency/measure.xml +0 -185
  120. data/lib/measures/ImproveMotorEfficiency/LICENSE.md +0 -27
  121. data/lib/measures/ImproveMotorEfficiency/README.md +0 -104
  122. data/lib/measures/ImproveMotorEfficiency/README.md.erb +0 -42
  123. data/lib/measures/ImproveMotorEfficiency/measure.rb +0 -365
  124. data/lib/measures/ImproveMotorEfficiency/measure.xml +0 -182
  125. data/lib/measures/IncreaseInsulationRValueForExteriorWalls/LICENSE.md +0 -27
  126. data/lib/measures/IncreaseInsulationRValueForExteriorWalls/README.md +0 -64
  127. data/lib/measures/IncreaseInsulationRValueForExteriorWalls/README.md.erb +0 -42
  128. data/lib/measures/IncreaseInsulationRValueForExteriorWalls/measure.rb +0 -422
  129. data/lib/measures/IncreaseInsulationRValueForExteriorWalls/measure.xml +0 -150
  130. data/lib/measures/IncreaseInsulationRValueForRoofs/LICENSE.md +0 -27
  131. data/lib/measures/IncreaseInsulationRValueForRoofs/README.md +0 -64
  132. data/lib/measures/IncreaseInsulationRValueForRoofs/README.md.erb +0 -42
  133. data/lib/measures/IncreaseInsulationRValueForRoofs/measure.rb +0 -422
  134. data/lib/measures/IncreaseInsulationRValueForRoofs/measure.xml +0 -143
  135. data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/LICENSE.md +0 -27
  136. data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/README.md +0 -97
  137. data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/README.md.erb +0 -42
  138. data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/measure.rb +0 -450
  139. data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/measure.xml +0 -186
  140. data/lib/measures/ReduceLightingLoadsByPercentage/LICENSE.md +0 -27
  141. data/lib/measures/ReduceLightingLoadsByPercentage/README.md +0 -96
  142. data/lib/measures/ReduceLightingLoadsByPercentage/README.md.erb +0 -42
  143. data/lib/measures/ReduceLightingLoadsByPercentage/measure.rb +0 -513
  144. data/lib/measures/ReduceLightingLoadsByPercentage/measure.xml +0 -191
  145. data/lib/measures/ReduceSpaceInfiltrationByPercentage/LICENSE.md +0 -27
  146. data/lib/measures/ReduceSpaceInfiltrationByPercentage/README.md +0 -104
  147. data/lib/measures/ReduceSpaceInfiltrationByPercentage/README.md.erb +0 -42
  148. data/lib/measures/ReduceSpaceInfiltrationByPercentage/measure.rb +0 -349
  149. data/lib/measures/ReduceSpaceInfiltrationByPercentage/measure.xml +0 -181
  150. data/lib/measures/ReduceVentilationByPercentage/LICENSE.md +0 -27
  151. data/lib/measures/ReduceVentilationByPercentage/README.md +0 -40
  152. data/lib/measures/ReduceVentilationByPercentage/README.md.erb +0 -42
  153. data/lib/measures/ReduceVentilationByPercentage/measure.rb +0 -291
  154. data/lib/measures/ReduceVentilationByPercentage/measure.xml +0 -96
  155. data/lib/measures/VentilationQAQC/ExampleModel.osm +0 -28468
  156. data/lib/measures/create_variable_speed_rtu/LICENSE.md +0 -27
  157. data/lib/measures/create_variable_speed_rtu/README.md +0 -120
  158. data/lib/measures/create_variable_speed_rtu/README.md.erb +0 -42
  159. data/lib/measures/create_variable_speed_rtu/measure.rb +0 -539
  160. data/lib/measures/create_variable_speed_rtu/measure.xml +0 -207
  161. data/lib/measures/radiant_slab_with_doas/LICENSE.md +0 -27
  162. data/lib/measures/radiant_slab_with_doas/README.md +0 -156
  163. data/lib/measures/radiant_slab_with_doas/README.md.erb +0 -42
  164. data/lib/measures/radiant_slab_with_doas/measure.rb +0 -403
  165. data/lib/measures/radiant_slab_with_doas/measure.xml +0 -345
@@ -1,27 +0,0 @@
1
- OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC. All rights reserved.
2
-
3
- Redistribution and use in source and binary forms, with or without modification, are permitted
4
- provided that the following conditions are met:
5
-
6
- (1) Redistributions of source code must retain the above copyright notice, this list of conditions
7
- and the following disclaimer.
8
-
9
- (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions
10
- and the following disclaimer in the documentation and/or other materials provided with the distribution.
11
-
12
- (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse
13
- or promote products derived from this software without specific prior written permission from the
14
- respective party.
15
-
16
- (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other
17
- derivative works may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar
18
- designation without specific prior written permission from Alliance for Sustainable Energy, LLC.
19
-
20
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
21
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22
- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, THE UNITED STATES GOVERNMENT,
23
- OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
25
- OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -1,120 +0,0 @@
1
-
2
-
3
- ###### (Automatically generated documentation)
4
-
5
- # Create Variable Speed RTU
6
-
7
- ## Description
8
- This measure examines the existing HVAC system(s) present in the current OpenStudio model. If a constant-speed system is found, the user can opt to have the measure replace that system with a variable-speed RTU. 'Variable speed' in this case means that the compressor will be operated using either two or four stages (user's choice). The user can choose between using a gas heating coil, or a direct-expansion (DX) heating coil. Additionally, the user is able to enter the EER (cooling) and COP (heating) values for each DX stage. This measure allows users to easily identify the impact of improved part-load efficiency.
9
-
10
- ## Modeler Description
11
- This measure loops through the existing airloops, looking for loops that have a constant speed fan. (Note that if an object such as an AirloopHVAC:UnitarySystem is present in the model, that the measure will NOT identify that loop as either constant- or variable-speed, since the fan is located inside the UnitarySystem object.) The user can designate which constant-speed airloop they'd like to apply the measure to, or opt to apply the measure to all airloops. The measure then replaces the supply components on the airloop with an AirloopHVAC:UnitarySystem object. Any DX coils added to the UnitarySystem object are of the type CoilCoolingDXMultiSpeed / CoilHeatingDXMultiSpeed, with the number of stages set to either two or four, depending on user input. If the user opts for a gas furnace, an 80% efficient CoilHeatingGas object is added. Fan properties (pressure rise and total efficiency) are transferred automatically from the existing (but deleted) constant speed fan to the new variable-speed fan. Currently, this measure is only applicable to the Standalone Retail DOE Prototype building model, but it has been structured to facilitate expansion to other models with a minimum of effort.
12
-
13
- ## Measure Type
14
- ModelMeasure
15
-
16
- ## Taxonomy
17
-
18
-
19
- ## Arguments
20
-
21
-
22
- ### Choose an Air Loop to change from CAV to VAV.
23
-
24
- **Name:** object,
25
- **Type:** Choice,
26
- **Units:** ,
27
- **Required:** true,
28
- **Model Dependent:** false
29
-
30
- ### Choose the type of cooling coil.
31
-
32
- **Name:** cooling_coil_type,
33
- **Type:** Choice,
34
- **Units:** ,
35
- **Required:** true,
36
- **Model Dependent:** false
37
-
38
- ### Rated Cooling Coil EER
39
-
40
- **Name:** rated_cc_eer,
41
- **Type:** Double,
42
- **Units:** ,
43
- **Required:** false,
44
- **Model Dependent:** false
45
-
46
- ### Cooling Coil EER at 75% Capacity
47
-
48
- **Name:** three_quarter_cc_eer,
49
- **Type:** Double,
50
- **Units:** ,
51
- **Required:** false,
52
- **Model Dependent:** false
53
-
54
- ### Cooling Coil EER at 50% Capacity
55
-
56
- **Name:** half_cc_eer,
57
- **Type:** Double,
58
- **Units:** ,
59
- **Required:** false,
60
- **Model Dependent:** false
61
-
62
- ### Cooling Coil EER at 25% Capacity
63
-
64
- **Name:** quarter_cc_eer,
65
- **Type:** Double,
66
- **Units:** ,
67
- **Required:** false,
68
- **Model Dependent:** false
69
-
70
- ### Choose the type of heating coil.
71
-
72
- **Name:** heating_coil_type,
73
- **Type:** Choice,
74
- **Units:** ,
75
- **Required:** true,
76
- **Model Dependent:** false
77
-
78
- ### Rated Gas Heating Coil Efficiency (0-1.00)
79
-
80
- **Name:** rated_hc_gas_efficiency,
81
- **Type:** Double,
82
- **Units:** ,
83
- **Required:** false,
84
- **Model Dependent:** false
85
-
86
- ### Rated Heating Coil COP
87
-
88
- **Name:** rated_hc_cop,
89
- **Type:** Double,
90
- **Units:** ,
91
- **Required:** false,
92
- **Model Dependent:** false
93
-
94
- ### Heating Coil COP at 75% Capacity
95
-
96
- **Name:** three_quarter_hc_cop,
97
- **Type:** Double,
98
- **Units:** ,
99
- **Required:** false,
100
- **Model Dependent:** false
101
-
102
- ### Heating Coil COP at 50% Capacity
103
-
104
- **Name:** half_hc_cop,
105
- **Type:** Double,
106
- **Units:** ,
107
- **Required:** false,
108
- **Model Dependent:** false
109
-
110
- ### Heating Coil COP at 25% Capacity
111
-
112
- **Name:** quarter_hc_cop,
113
- **Type:** Double,
114
- **Units:** ,
115
- **Required:** false,
116
- **Model Dependent:** false
117
-
118
-
119
-
120
-
@@ -1,42 +0,0 @@
1
- <%#= README.md.erb is used to auto-generate README.md. %>
2
- <%#= To manually maintain README.md throw away README.md.erb and manually edit README.md %>
3
- ###### (Automatically generated documentation)
4
-
5
- # <%= name %>
6
-
7
- ## Description
8
- <%= description %>
9
-
10
- ## Modeler Description
11
- <%= modelerDescription %>
12
-
13
- ## Measure Type
14
- <%= measureType %>
15
-
16
- ## Taxonomy
17
- <%= taxonomy %>
18
-
19
- ## Arguments
20
-
21
- <% arguments.each do |argument| %>
22
- ### <%= argument[:display_name] %>
23
- <%= argument[:description] %>
24
- **Name:** <%= argument[:name] %>,
25
- **Type:** <%= argument[:type] %>,
26
- **Units:** <%= argument[:units] %>,
27
- **Required:** <%= argument[:required] %>,
28
- **Model Dependent:** <%= argument[:model_dependent] %>
29
- <% end %>
30
-
31
- <% if arguments.size == 0 %>
32
- <%= "This measure does not have any user arguments" %>
33
- <% end %>
34
-
35
- <% if outputs.size > 0 %>
36
- ## Outputs
37
- <% output_names = [] %>
38
- <% outputs.each do |output| %>
39
- <% output_names << output[:display_name] %>
40
- <% end %>
41
- <%= output_names.join(", ") %>
42
- <% end %>
@@ -1,539 +0,0 @@
1
- # *******************************************************************************
2
- # OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
3
- # All rights reserved.
4
- # Redistribution and use in source and binary forms, with or without
5
- # modification, are permitted provided that the following conditions are met:
6
- #
7
- # (1) Redistributions of source code must retain the above copyright notice,
8
- # this list of conditions and the following disclaimer.
9
- #
10
- # (2) Redistributions in binary form must reproduce the above copyright notice,
11
- # this list of conditions and the following disclaimer in the documentation
12
- # and/or other materials provided with the distribution.
13
- #
14
- # (3) Neither the name of the copyright holder nor the names of any contributors
15
- # may be used to endorse or promote products derived from this software without
16
- # specific prior written permission from the respective party.
17
- #
18
- # (4) Other than as required in clauses (1) and (2), distributions in any form
19
- # of modifications or other derivative works may not use the "OpenStudio"
20
- # trademark, "OS", "os", or any other confusingly similar designation without
21
- # specific prior written permission from Alliance for Sustainable Energy, LLC.
22
- #
23
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
24
- # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
25
- # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26
- # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
27
- # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
28
- # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29
- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
30
- # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31
- # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
32
- # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33
- # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
- # *******************************************************************************
35
-
36
- # see the URL below for information on how to write OpenStudio measures
37
- # http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/
38
-
39
- # start the measure
40
- class CreateVariableSpeedRTU < OpenStudio::Ruleset::ModelUserScript
41
- # human readable name
42
- def name
43
- return 'Create Variable Speed RTU'
44
- end
45
-
46
- # human readable description
47
- def description
48
- return "This measure examines the existing HVAC system(s) present in the current OpenStudio model. If a constant-speed system is found, the user can opt to have the measure replace that system with a variable-speed RTU. 'Variable speed' in this case means that the compressor will be operated using either two or four stages (user's choice). The user can choose between using a gas heating coil, or a direct-expansion (DX) heating coil. Additionally, the user is able to enter the EER (cooling) and COP (heating) values for each DX stage. This measure allows users to easily identify the impact of improved part-load efficiency."
49
- end
50
-
51
- # human readable description of modeling approach
52
- def modeler_description
53
- return "This measure loops through the existing airloops, looking for loops that have a constant speed fan. (Note that if an object such as an AirloopHVAC:UnitarySystem is present in the model, that the measure will NOT identify that loop as either constant- or variable-speed, since the fan is located inside the UnitarySystem object.) The user can designate which constant-speed airloop they'd like to apply the measure to, or opt to apply the measure to all airloops. The measure then replaces the supply components on the airloop with an AirloopHVAC:UnitarySystem object. Any DX coils added to the UnitarySystem object are of the type CoilCoolingDXMultiSpeed / CoilHeatingDXMultiSpeed, with the number of stages set to either two or four, depending on user input. If the user opts for a gas furnace, an 80% efficient CoilHeatingGas object is added. Fan properties (pressure rise and total efficiency) are transferred automatically from the existing (but deleted) constant speed fan to the new variable-speed fan. Currently, this measure is only applicable to the Standalone Retail DOE Prototype building model, but it has been structured to facilitate expansion to other models with a minimum of effort."
54
- end
55
-
56
- # define the arguments that the user will input
57
- def arguments(model)
58
- args = OpenStudio::Ruleset::OSArgumentVector.new
59
-
60
- # populate choice argument for air loops in the model
61
- air_loop_handles = OpenStudio::StringVector.new
62
- air_loop_display_names = OpenStudio::StringVector.new
63
-
64
- # putting air loop names into hash
65
- air_loop_args = model.getAirLoopHVACs
66
- air_loop_args_hash = {}
67
- air_loop_args.each do |air_loop_arg|
68
- air_loop_args_hash[air_loop_arg.name.to_s] = air_loop_arg
69
- end
70
-
71
- # looping through sorted hash of air loops
72
- air_loop_args_hash.sort.map do |air_loop_name, air_loop|
73
- air_loop.supplyComponents.each do |supply_comp|
74
- # find CAV fans
75
- if supply_comp.to_FanConstantVolume.is_initialized
76
- air_loop_handles << air_loop.handle.to_s
77
- air_loop_display_names << air_loop_name
78
- end
79
- end
80
- end
81
-
82
- # add building to string vector with air loops
83
- building = model.getBuilding
84
- air_loop_handles << building.handle.to_s
85
- air_loop_display_names << '*All CAV Air Loops*'
86
-
87
- # make an argument for air loops
88
- object = OpenStudio::Ruleset::OSArgument.makeChoiceArgument('object', air_loop_handles, air_loop_display_names, true)
89
- object.setDisplayName('Choose an Air Loop to change from CAV to VAV.')
90
- object.setDefaultValue('*All CAV Air Loops*') # if no air loop is chosen this will run on all air loops
91
- args << object
92
-
93
- # make an argument for cooling type
94
- cooling_coil_options = OpenStudio::StringVector.new
95
- cooling_coil_options << 'Two-Stage Compressor'
96
- cooling_coil_options << 'Four-Stage Compressor'
97
- cooling_coil_type = OpenStudio::Ruleset::OSArgument.makeChoiceArgument('cooling_coil_type', cooling_coil_options, true)
98
- cooling_coil_type.setDisplayName('Choose the type of cooling coil.')
99
- cooling_coil_type.setDefaultValue('Two-Stage Compressor')
100
- args << cooling_coil_type
101
-
102
- # make an argument for rated cooling coil EER
103
- rated_cc_eer = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('rated_cc_eer', false)
104
- rated_cc_eer.setDisplayName('Rated Cooling Coil EER')
105
- # rated_cc_eer.setDefaultValue(0.0)
106
- args << rated_cc_eer
107
-
108
- # make an argument for 75% cooling coil EER
109
- three_quarter_cc_eer = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('three_quarter_cc_eer', false)
110
- three_quarter_cc_eer.setDisplayName('Cooling Coil EER at 75% Capacity')
111
- # three_quarter_cc_eer.setDefaultValue(0.0)
112
- args << three_quarter_cc_eer
113
-
114
- # make an argument for 50% cooling coil EER
115
- half_cc_eer = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('half_cc_eer', false)
116
- half_cc_eer.setDisplayName('Cooling Coil EER at 50% Capacity')
117
- # half_cc_eer.setDefaultValue(0.0)
118
- args << half_cc_eer
119
-
120
- # make an argument for 25% cooling coil EER
121
- quarter_cc_eer = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('quarter_cc_eer', false)
122
- quarter_cc_eer.setDisplayName('Cooling Coil EER at 25% Capacity')
123
- # quarter_cc_eer.setDefaultValue(0.0)
124
- args << quarter_cc_eer
125
-
126
- # make an argument for heating type
127
- heating_coil_options = OpenStudio::StringVector.new
128
- heating_coil_options << 'Gas Heating Coil'
129
- heating_coil_options << 'Heat Pump'
130
- heating_coil_type = OpenStudio::Ruleset::OSArgument.makeChoiceArgument('heating_coil_type', heating_coil_options, true)
131
- heating_coil_type.setDisplayName('Choose the type of heating coil.')
132
- heating_coil_type.setDefaultValue('Gas Heating Coil')
133
- args << heating_coil_type
134
-
135
- # make an argument for rated gas heating coil efficiency
136
- rated_hc_gas_efficiency = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('rated_hc_gas_efficiency', false)
137
- rated_hc_gas_efficiency.setDisplayName('Rated Gas Heating Coil Efficiency (0-1.00)')
138
- # rated_hc_gas_efficiency.setDefaultValue(0.0)
139
- args << rated_hc_gas_efficiency
140
-
141
- # make an argument for rated heating coil COP
142
- rated_hc_cop = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('rated_hc_cop', false)
143
- rated_hc_cop.setDisplayName('Rated Heating Coil COP')
144
- # rated_hc_cop.setDefaultValue(0.0)
145
- args << rated_hc_cop
146
-
147
- # make an argument for 75% heating coil COP
148
- three_quarter_hc_cop = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('three_quarter_hc_cop', false)
149
- three_quarter_hc_cop.setDisplayName('Heating Coil COP at 75% Capacity')
150
- # three_quarter_hc_cop.setDefaultValue(0.0)
151
- args << three_quarter_hc_cop
152
-
153
- # make an argument for 50% heating coil COP
154
- half_hc_cop = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('half_hc_cop', false)
155
- half_hc_cop.setDisplayName('Heating Coil COP at 50% Capacity')
156
- # half_hc_cop.setDefaultValue(0.0)
157
- args << half_hc_cop
158
-
159
- # make an argument for 25% heating coil COP
160
- quarter_hc_cop = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('quarter_hc_cop', false)
161
- quarter_hc_cop.setDisplayName('Heating Coil COP at 25% Capacity')
162
- # quarter_hc_cop.setDefaultValue(0.0)
163
- args << quarter_hc_cop
164
-
165
- return args
166
- end # end the arguments method
167
-
168
- # define what happens when the measure is run
169
- def run(model, runner, user_arguments)
170
- super(model, runner, user_arguments)
171
-
172
- # Use the built-in error checking
173
- if !runner.validateUserArguments(arguments(model), user_arguments)
174
- return false
175
- end
176
-
177
- # Assign the user inputs to variables
178
- object = runner.getOptionalWorkspaceObjectChoiceValue('object', user_arguments, model)
179
- cooling_coil_type = runner.getStringArgumentValue('cooling_coil_type', user_arguments)
180
- rated_cc_eer = runner.getOptionalDoubleArgumentValue('rated_cc_eer', user_arguments)
181
- three_quarter_cc_eer = runner.getOptionalDoubleArgumentValue('three_quarter_cc_eer', user_arguments)
182
- half_cc_eer = runner.getOptionalDoubleArgumentValue('half_cc_eer', user_arguments)
183
- quarter_cc_eer = runner.getOptionalDoubleArgumentValue('quarter_cc_eer', user_arguments)
184
- heating_coil_type = runner.getStringArgumentValue('heating_coil_type', user_arguments)
185
- rated_hc_gas_efficiency = runner.getOptionalDoubleArgumentValue('rated_hc_gas_efficiency', user_arguments)
186
- rated_hc_cop = runner.getOptionalDoubleArgumentValue('rated_hc_cop', user_arguments)
187
- three_quarter_hc_cop = runner.getOptionalDoubleArgumentValue('three_quarter_hc_cop', user_arguments)
188
- half_hc_cop = runner.getOptionalDoubleArgumentValue('half_hc_cop', user_arguments)
189
- quarter_hc_cop = runner.getOptionalDoubleArgumentValue('quarter_hc_cop', user_arguments)
190
-
191
- if rated_cc_eer.empty?
192
- runner.registerError('User must enter a value for the rated capacity cooling coil EER.')
193
- return false
194
- elsif rated_cc_eer.to_f <= 0
195
- runner.registerError("Invalid rated cooling coil EER value of #{rated_cc_eer} entered. EER must be >0.")
196
- return false
197
- end
198
-
199
- if three_quarter_cc_eer.empty? && cooling_coil_type == 'Four-Stage Compressor'
200
- runner.registerError('User must enter a value for 75% capacity cooling coil EER.')
201
- return false
202
- elsif three_quarter_cc_eer.to_f <= 0 && cooling_coil_type == 'Four-Stage Compressor'
203
- runner.registerError("Invalid 75% capacity cooling coil EER value of #{three_quarter_cc_eer} entered. EER must be >0.")
204
- return false
205
- end
206
-
207
- if half_cc_eer.empty?
208
- runner.registerError('User must enter a value for 50% capacity cooling coil EER.')
209
- return false
210
- elsif half_cc_eer.to_f <= 0
211
- runner.registerError("Invalid 50% capacity cooling coil EER value of #{half_cc_eer} entered. EER must be >0.")
212
- return false
213
- end
214
-
215
- if quarter_cc_eer.empty? && cooling_coil_type == 'Four-Stage Compressor'
216
- runner.registerError('User must enter a value for 25% capacity cooling coil EER.')
217
- return false
218
- elsif quarter_cc_eer.to_f <= 0 && cooling_coil_type == 'Four-Stage Compressor'
219
- runner.registerError("Invalid 25% capacity cooling coil EER value of #{quarter_cc_eer} entered. EER must be >0.")
220
- return false
221
- end
222
-
223
- if rated_hc_gas_efficiency.empty? && heating_coil_type == 'Gas Heating Coil'
224
- runner.registerError('User must enter a value for the rated gas heating coil efficiency.')
225
- return false
226
- elsif rated_hc_gas_efficiency.to_f <= 0 && heating_coil_type == 'Gas Heating Coil'
227
- runner.registerError("Invalid rated heating coil efficiency value of #{rated_hc_gas_efficiency} entered. Value must be >0.")
228
- return false
229
- elsif rated_hc_gas_efficiency.to_f > 1 && heating_coil_type == 'Gas Heating Coil'
230
- runner.registerError("Invalid rated heating coil efficiency value of #{rated_hc_gas_efficiency} entered. Value must be between 0 and 1.")
231
- return false
232
- end
233
-
234
- if rated_hc_cop.empty? && heating_coil_type == 'Heat Pump'
235
- runner.registerError('User must enter a value for the rated heating coil COP.')
236
- return false
237
- elsif rated_hc_cop.to_f <= 0 && heating_coil_type == 'Heat Pump'
238
- runner.registerError("Invalid rated heating coil COP value of #{rated_hc_cop} entered. COP must be >0.")
239
- return false
240
- end
241
-
242
- if three_quarter_hc_cop.empty? && heating_coil_type == 'Heat Pump' && cooling_coil_type == 'Four-Stage Compressor'
243
- runner.registerError('User must enter a value for 75% capacity heating coil COP.')
244
- return false
245
- elsif half_hc_cop.to_f <= 0 && heating_coil_type == 'Heat Pump' && cooling_coil_type == 'Four-Stage Compressor'
246
- runner.registerError("Invalid 75% capacity heating coil COP value of #{three_quarter_hc_cop} entered. COP must be >0.")
247
- return false
248
- end
249
-
250
- if half_hc_cop.empty? && heating_coil_type == 'Heat Pump'
251
- runner.registerError('User must enter a value for 50% capacity heating coil COP.')
252
- return false
253
- elsif half_hc_cop.to_f <= 0 && heating_coil_type == 'Heat Pump'
254
- runner.registerError("Invalid 50% capacity heating coil COP value of #{half_hc_cop} entered. COP must be >0.")
255
- return false
256
- end
257
-
258
- if quarter_hc_cop.empty? && heating_coil_type == 'Heat Pump' && cooling_coil_type == 'Four-Stage Compressor'
259
- runner.registerError('User must enter a value for 25% capacity heating coil COP.')
260
- return false
261
- elsif quarter_hc_cop.to_f <= 0 && heating_coil_type == 'Heat Pump' && cooling_coil_type == 'Four-Stage Compressor'
262
- runner.registerError("Invalid 25% capacity heating coil COP value of #{quarter_hc_cop} entered. COP must be >0.")
263
- return false
264
- end
265
-
266
- # Report initial condition of model
267
- initial_cav_airloops = 0
268
- initial_vav_airloops = 0
269
- model.getAirLoopHVACs.each do |air_loop|
270
- # Loop through all supply components on the airloop and find CAV and VAV fans
271
- air_loop.supplyComponents.each do |supply_comp|
272
- if supply_comp.to_FanConstantVolume.is_initialized
273
- initial_cav_airloops += 1
274
- elsif supply_comp.to_FanVariableVolume.is_initialized
275
- initial_vav_airloops += 1
276
- end
277
- end
278
- end
279
- runner.registerInitialCondition("The building started with #{initial_cav_airloops} CAV air loops and #{initial_vav_airloops} VAV air loops.")
280
-
281
- # Check the air loop selection
282
- apply_to_all_air_loops = false
283
- selected_airloop = nil
284
- if object.empty?
285
- handle = runner.getStringArgumentValue('object', user_arguments)
286
- if handle.empty?
287
- runner.registerError('No air loop was chosen.')
288
- else
289
- runner.registerError("The selected air loop with handle '#{handle}' was not found in the model. It may have been removed by another measure.")
290
- end
291
- return false
292
- else
293
- if !object.get.to_AirLoopHVAC.empty?
294
- selected_airloop = object.get.to_AirLoopHVAC.get
295
- elsif !object.get.to_Building.empty?
296
- apply_to_all_air_loops = true
297
- else
298
- runner.registerError('Script Error - argument not showing up as air loop.')
299
- return false
300
- end
301
- end # end of if object.empty?
302
-
303
- # Add selected airloops to an array
304
- selected_airloops = []
305
- if apply_to_all_air_loops == true
306
- selected_airloops = model.getAirLoopHVACs
307
- else
308
- selected_airloops << selected_airloop
309
- end
310
-
311
- # Change CAV to VAV on the selected airloops, where applicable
312
- selected_airloops.each do |air_loop|
313
- changed_cav_to_vav = false
314
-
315
- # Make a new AirLoopHVAC:UnitarySystem object
316
- air_loop_hvac_unitary_system = OpenStudio::Model::AirLoopHVACUnitarySystem.new(model)
317
-
318
- # Find CAV fan and replace with VAV fan
319
- air_loop.supplyComponents.each do |supply_comp|
320
- if supply_comp.to_FanConstantVolume.is_initialized
321
-
322
- # Preserve characteristics of the original fan
323
- cav_fan = supply_comp.to_FanConstantVolume.get
324
- fan_pressure_rise = cav_fan.pressureRise
325
- fan_efficiency = cav_fan.fanEfficiency
326
- motor_efficiency = cav_fan.motorEfficiency
327
- fan_availability_schedule = cav_fan.availabilitySchedule
328
-
329
- # Get the previous and next components on the loop
330
- prev_node = cav_fan.inletModelObject.get.to_Node.get
331
- next_node = cav_fan.outletModelObject.get.to_Node.get
332
-
333
- # Make the new vav_fan and transfer existing parameters to it
334
- vav_fan = OpenStudio::Model::FanVariableVolume.new(model, model.alwaysOnDiscreteSchedule)
335
- vav_fan.setPressureRise(fan_pressure_rise)
336
- vav_fan.setFanEfficiency(fan_efficiency)
337
- vav_fan.setMotorEfficiency(motor_efficiency)
338
- vav_fan.setAvailabilitySchedule(fan_availability_schedule)
339
-
340
- # Remove the supply fan
341
- supply_comp.remove
342
-
343
- # Get back the remaining node
344
- remaining_node = nil
345
- if prev_node.outletModelObject.is_initialized
346
- remaining_node = prev_node
347
- elsif next_node.inletModelObject.is_initialized
348
- remaining_node = next_node
349
- end
350
-
351
- # Add a new AirLoopHVAC:UnitarySystem object to the node where the old fan was
352
- if remaining_node.nil?
353
- runner.registerError("Couldn't add the new AirLoopHVAC:UnitarySystem object to the loop after removing existing CAV fan.")
354
- return false
355
- else
356
- air_loop_hvac_unitary_system.addToNode(remaining_node)
357
- end
358
-
359
- # Change the unitary system control type to setpoint to enable the VAV fan to ramp down.
360
- air_loop_hvac_unitary_system.setString(2, 'Setpoint')
361
-
362
- # Add the VAV fan to the AirLoopHVAC:UnitarySystem object
363
- air_loop_hvac_unitary_system.setSupplyFan(vav_fan)
364
-
365
- # Set the AirLoopHVAC:UnitarySystem fan placement
366
- air_loop_hvac_unitary_system.setFanPlacement('BlowThrough')
367
-
368
- # Set the AirLoopHVAC:UnitarySystem Supply Air Fan Operating Mode Schedule
369
- air_loop_hvac_unitary_system.setSupplyAirFanOperatingModeSchedule(model.alwaysOnDiscreteSchedule)
370
-
371
- # let the user know that a change was made
372
- changed_cav_to_vav = true
373
- runner.registerInfo("AirLoop '#{air_loop.name}' was changed from CAV to VAV")
374
-
375
- end
376
- end # next supply component
377
-
378
- # Move on to the next air loop if no CAV to VAV change happened
379
- next if changed_cav_to_vav != true
380
-
381
- # initialize COP variables to make available in both multi-speed heating and cooling coils
382
- low_speed_cop = nil
383
- high_speed_cop = nil
384
-
385
- # Move the cooling coil to the AirLoopHVAC:UnitarySystem object
386
- air_loop.supplyComponents.each do |supply_comp|
387
- if supply_comp.to_CoilCoolingDXTwoSpeed.is_initialized
388
-
389
- existing_cooling_coil = supply_comp.to_CoilCoolingDXTwoSpeed.get
390
-
391
- # Add a new cooling coil object
392
- if cooling_coil_type == 'Two-Stage Compressor'
393
- new_cooling_coil = OpenStudio::Model::CoilCoolingDXMultiSpeed.new(model)
394
- half_speed_cc_cop = half_cc_eer.to_f / 3.412
395
- new_cooling_coil_data_1 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
396
- new_cooling_coil_data_1.setGrossRatedCoolingCOP(half_speed_cc_cop.to_f)
397
- rated_speed_cc_cop = rated_cc_eer.to_f / 3.412
398
- new_cooling_coil_data_2 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
399
- new_cooling_coil_data_2.setGrossRatedCoolingCOP(rated_speed_cc_cop.to_f)
400
- new_cooling_coil.setFuelType('Electricity')
401
- new_cooling_coil.addStage(new_cooling_coil_data_1)
402
- new_cooling_coil.addStage(new_cooling_coil_data_2)
403
- air_loop_hvac_unitary_system.setCoolingCoil(new_cooling_coil)
404
- elsif cooling_coil_type == 'Four-Stage Compressor'
405
- new_cooling_coil = OpenStudio::Model::CoilCoolingDXMultiSpeed.new(model)
406
- quarter_speed_cc_cop = quarter_cc_eer.to_f / 3.412
407
- new_cooling_coil_data_1 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
408
- new_cooling_coil_data_1.setGrossRatedCoolingCOP(quarter_speed_cc_cop.to_f)
409
- half_speed_cc_cop = half_cc_eer.to_f / 3.412
410
- new_cooling_coil_data_2 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
411
- new_cooling_coil_data_2.setGrossRatedCoolingCOP(half_speed_cc_cop.to_f)
412
- three_quarter_speed_cc_cop = three_quarter_cc_eer.to_f / 3.412
413
- new_cooling_coil_data_3 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
414
- new_cooling_coil_data_3.setGrossRatedCoolingCOP(three_quarter_speed_cc_cop.to_f)
415
- rated_speed_cc_cop = rated_cc_eer.to_f / 3.412
416
- new_cooling_coil_data_4 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
417
- new_cooling_coil_data_4.setGrossRatedCoolingCOP(rated_speed_cc_cop.to_f)
418
- new_cooling_coil.setFuelType('Electricity')
419
- new_cooling_coil.addStage(new_cooling_coil_data_1)
420
- new_cooling_coil.addStage(new_cooling_coil_data_2)
421
- new_cooling_coil.addStage(new_cooling_coil_data_3)
422
- new_cooling_coil.addStage(new_cooling_coil_data_4)
423
- air_loop_hvac_unitary_system.setCoolingCoil(new_cooling_coil)
424
- end
425
-
426
- # Remove the existing cooling coil.
427
- existing_cooling_coil.remove
428
- end
429
- end # next supply component
430
-
431
- # Move the heating coil to the AirLoopHVAC:UnitarySystem object
432
- air_loop.supplyComponents.each do |supply_comp|
433
- if supply_comp.to_CoilHeatingGas.is_initialized
434
-
435
- existing_heating_coil = supply_comp.to_CoilHeatingGas.get
436
-
437
- # Remove the existing heating coil.
438
- existing_heating_coil.remove
439
-
440
- # Add a new heating coil object
441
- if heating_coil_type == 'Gas Heating Coil'
442
- new_heating_coil = OpenStudio::Model::CoilHeatingGas.new(model)
443
- new_heating_coil.setGasBurnerEfficiency(rated_hc_gas_efficiency.to_f)
444
- air_loop_hvac_unitary_system.setHeatingCoil(new_heating_coil)
445
-
446
- elsif heating_coil_type == 'Heat Pump' && cooling_coil_type == 'Two-Stage Compressor'
447
- new_heating_coil = OpenStudio::Model::CoilHeatingDXMultiSpeed.new(model)
448
- new_heating_coil_data_1 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
449
- new_heating_coil_data_1.setGrossRatedHeatingCOP(half_hc_cop.to_f)
450
- new_heating_coil_data_2 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
451
- new_heating_coil_data_2.setGrossRatedHeatingCOP(rated_hc_cop.to_f)
452
- new_heating_coil.setFuelType('Electricity')
453
- new_heating_coil.addStage(new_heating_coil_data_1)
454
- new_heating_coil.addStage(new_heating_coil_data_2)
455
- air_loop_hvac_unitary_system.setHeatingCoil(new_heating_coil)
456
- elsif heating_coil_type == 'Heat Pump' && cooling_coil_type == 'Four-Stage Compressor'
457
- new_heating_coil = OpenStudio::Model::CoilHeatingDXMultiSpeed.new(model)
458
- new_heating_coil_data_1 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
459
- new_heating_coil_data_1.setGrossRatedHeatingCOP(quarter_hc_cop.to_f)
460
- new_heating_coil_data_2 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
461
- new_heating_coil_data_2.setGrossRatedHeatingCOP(half_hc_cop.to_f)
462
- new_heating_coil_data_3 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
463
- new_heating_coil_data_3.setGrossRatedHeatingCOP(three_quarter_hc_cop.to_f)
464
- new_heating_coil_data_4 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
465
- new_heating_coil_data_4.setGrossRatedHeatingCOP(rated_hc_cop.to_f)
466
- new_heating_coil.setFuelType('Electricity')
467
- new_heating_coil.addStage(new_heating_coil_data_1)
468
- new_heating_coil.addStage(new_heating_coil_data_2)
469
- new_heating_coil.addStage(new_heating_coil_data_3)
470
- new_heating_coil.addStage(new_heating_coil_data_4)
471
- air_loop_hvac_unitary_system.setHeatingCoil(new_heating_coil)
472
- end
473
- end
474
- end # next supply component
475
-
476
- # Find the supply outlet node for the current AirLoop
477
- airloop_outlet_node = air_loop.supplyOutletNode
478
-
479
- # Identify if there is a setpoint manager on the AirLoop outlet node
480
- if !airloop_outlet_node.setpointManagers.empty?
481
- setpoint_manager = airloop_outlet_node.setpointManagers[0]
482
- # runner.registerInfo("Setpoint manager on node '#{airloop_outlet_node.name}' is '#{setpoint_manager.name}'.")
483
- else
484
- runner.registerInfo("No setpoint manager on node '#{airloop_outlet_node.name}'.")
485
- end
486
-
487
- # Set the controlling zone location to the zone on the airloop
488
- air_loop.demandComponents.each do |demand_comp|
489
- if demand_comp.to_AirTerminalSingleDuctUncontrolled.is_initialized
490
-
491
- terminal_obj = demand_comp.to_AirTerminalSingleDuctUncontrolled.get
492
-
493
- # Record the zone that the terminal unit is in.
494
- # If zone cannot be determined, skip to next demand component
495
- # and warn user that this the associated zone could not be found
496
- term_zone = nil
497
- model.getThermalZones.each do |zone|
498
- zone.equipment.each do |equip|
499
- if equip == terminal_obj
500
- term_zone = zone
501
- end
502
- end
503
- end
504
- if term_zone.nil?
505
- runner.registerWarning("Could not determine the zone for terminal '#{new_vav_terminal.name}', cannot assign to AirLoopHVAC:UnitarySystem object.")
506
- next
507
- else
508
- # Associate the zone with the AirLoopHVAC:UnitarySystem object
509
- air_loop_hvac_unitary_system.setControllingZoneorThermostatLocation(term_zone)
510
- end
511
- end
512
- end
513
- end # Next selected airloop
514
-
515
- # Report final condition of model
516
- final_cav_airloops = 0
517
- final_vav_airloops = 0
518
- model.getAirLoopHVACs.each do |air_loop|
519
- # Loop through all supply components on the airloop and find CAV and VAV fans
520
- air_loop.supplyComponents.each do |supply_comp|
521
- if supply_comp.to_FanConstantVolume.is_initialized
522
- final_cav_airloops += 1
523
- elsif supply_comp.to_AirLoopHVACUnitarySystem.is_initialized
524
- final_vav_airloops += 1
525
- end
526
- end
527
- end
528
- runner.registerFinalCondition("The building finished with #{final_cav_airloops} constant-speed RTUs and #{final_vav_airloops} multi-speed RTUs.")
529
-
530
- if final_cav_airloops == initial_cav_airloops
531
- runner.registerAsNotApplicable('This measure is not applicable; no variable speed RTUs were added.')
532
- end
533
-
534
- return true
535
- end # end the run method
536
- end # end the measure
537
-
538
- # register the measure to be used by the application
539
- CreateVariableSpeedRTU.new.registerWithApplication