openstudio-common-measures 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +6 -3
- data/Rakefile +17 -3
- data/lib/measures/AddDaylightSensors/LICENSE.md +27 -0
- data/lib/measures/AddDaylightSensors/README.md +136 -0
- data/lib/measures/AddDaylightSensors/README.md.erb +42 -0
- data/lib/measures/AddDaylightSensors/measure.rb +521 -0
- data/lib/measures/AddDaylightSensors/measure.xml +233 -0
- data/lib/measures/EnableDemandControlledVentilation/LICENSE.md +27 -0
- data/lib/measures/EnableDemandControlledVentilation/README.md +32 -0
- data/lib/measures/EnableDemandControlledVentilation/README.md.erb +42 -0
- data/lib/measures/EnableDemandControlledVentilation/measure.rb +154 -0
- data/lib/measures/EnableDemandControlledVentilation/measure.xml +99 -0
- data/lib/measures/EnableEconomizerControl/LICENSE.md +27 -0
- data/lib/measures/EnableEconomizerControl/README.md +48 -0
- data/lib/measures/EnableEconomizerControl/README.md.erb +42 -0
- data/lib/measures/EnableEconomizerControl/measure.rb +172 -0
- data/lib/measures/EnableEconomizerControl/measure.xml +124 -0
- data/lib/measures/IncreaseInsulationRValueForExteriorWalls/LICENSE.md +27 -0
- data/lib/measures/IncreaseInsulationRValueForExteriorWalls/README.md +64 -0
- data/lib/measures/IncreaseInsulationRValueForExteriorWalls/README.md.erb +42 -0
- data/lib/measures/IncreaseInsulationRValueForExteriorWalls/measure.rb +422 -0
- data/lib/measures/IncreaseInsulationRValueForExteriorWalls/measure.xml +150 -0
- data/lib/measures/IncreaseInsulationRValueForRoofs/LICENSE.md +27 -0
- data/lib/measures/IncreaseInsulationRValueForRoofs/README.md +64 -0
- data/lib/measures/IncreaseInsulationRValueForRoofs/README.md.erb +42 -0
- data/lib/measures/IncreaseInsulationRValueForRoofs/measure.rb +422 -0
- data/lib/measures/IncreaseInsulationRValueForRoofs/measure.xml +143 -0
- data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/LICENSE.md +27 -0
- data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/README.md +97 -0
- data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/README.md.erb +42 -0
- data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/measure.rb +450 -0
- data/lib/measures/ReduceElectricEquipmentLoadsByPercentage/measure.xml +186 -0
- data/lib/measures/ReduceLightingLoadsByPercentage/LICENSE.md +27 -0
- data/lib/measures/ReduceLightingLoadsByPercentage/README.md +96 -0
- data/lib/measures/ReduceLightingLoadsByPercentage/README.md.erb +42 -0
- data/lib/measures/ReduceLightingLoadsByPercentage/measure.rb +513 -0
- data/lib/measures/ReduceLightingLoadsByPercentage/measure.xml +191 -0
- data/lib/measures/ReduceSpaceInfiltrationByPercentage/LICENSE.md +27 -0
- data/lib/measures/ReduceSpaceInfiltrationByPercentage/README.md +104 -0
- data/lib/measures/ReduceSpaceInfiltrationByPercentage/README.md.erb +42 -0
- data/lib/measures/ReduceSpaceInfiltrationByPercentage/measure.rb +349 -0
- data/lib/measures/ReduceSpaceInfiltrationByPercentage/measure.xml +181 -0
- data/lib/measures/ReduceVentilationByPercentage/LICENSE.md +27 -0
- data/lib/measures/ReduceVentilationByPercentage/README.md +40 -0
- data/lib/measures/ReduceVentilationByPercentage/README.md.erb +42 -0
- data/lib/measures/ReduceVentilationByPercentage/measure.rb +291 -0
- data/lib/measures/ReduceVentilationByPercentage/measure.xml +96 -0
- data/lib/measures/add_ems_to_control_ev_charging/{ReadMe.MD → README.md} +0 -0
- data/lib/measures/add_ev_load/{ReadMe.MD → README.md} +0 -0
- data/lib/measures/create_variable_speed_rtu/LICENSE.md +27 -0
- data/lib/measures/create_variable_speed_rtu/README.md +120 -0
- data/lib/measures/create_variable_speed_rtu/README.md.erb +42 -0
- data/lib/measures/create_variable_speed_rtu/measure.rb +539 -0
- data/lib/measures/create_variable_speed_rtu/measure.xml +207 -0
- data/lib/measures/generic_qaqc/measure.xml +14 -14
- data/lib/measures/generic_qaqc/resources/check_envelope_conductance.rb +7 -1
- data/lib/measures/generic_qaqc/resources/check_eui_by_end_use.rb +10 -11
- data/lib/measures/openstudio_results/README.md +5 -1
- data/lib/measures/openstudio_results/measure.rb +12 -8
- data/lib/measures/openstudio_results/measure.xml +56 -36
- data/lib/measures/openstudio_results/resources/os_lib_reporting.rb +115 -37
- data/lib/measures/openstudio_results/resources/os_lib_schedules.rb +27 -25
- data/lib/measures/set_exterior_walls_and_floors_to_adiabatic/README.md +16 -0
- data/lib/measures/set_exterior_walls_and_floors_to_adiabatic/measure.rb +32 -1
- data/lib/measures/set_exterior_walls_and_floors_to_adiabatic/measure.xml +31 -12
- data/lib/measures/view_data/measure.xml +8 -8
- data/lib/measures/view_data/resources/va3c.rb +50 -46
- data/lib/measures/view_model/resources/va3c.rb +50 -46
- data/lib/openstudio/common_measures/version.rb +1 -1
- data/openstudio-common-measures.gemspec +2 -2
- metadata +59 -9
@@ -0,0 +1,191 @@
|
|
1
|
+
<measure>
|
2
|
+
<schema_version>3.0</schema_version>
|
3
|
+
<name>reduce_lighting_loads_by_percentage</name>
|
4
|
+
<uid>791f3404-a28b-4a80-ba3f-e15b339e39ea</uid>
|
5
|
+
<version_id>01e31b73-acc4-47cd-b6cb-8c54238964fc</version_id>
|
6
|
+
<version_modified>20200229T024320Z</version_modified>
|
7
|
+
<xml_checksum>293730A7</xml_checksum>
|
8
|
+
<class_name>ReduceLightingLoadsByPercentage</class_name>
|
9
|
+
<display_name>Reduce Lighting Loads by Percentage</display_name>
|
10
|
+
<description>The lighting system in this building uses more power per area than is required with the latest lighting technologies. Replace the lighting system with a newer, more efficient lighting technology. Newer technologies provide the same amount of light but use less energy in the process.</description>
|
11
|
+
<modeler_description>This measure supports models which have a mixture of lighting assigned to spaces and space types. The lighting may be specified as individual luminaires, lighting equipment level, lighting power per area, or lighting power per person. Loop through all lights and luminaires in the specified space type or the entire building. Clone the definition if it is shared by other lights, rename and adjust the power based on the specified percentage. Link the new definition to the existing lights or luminaire instance. Adjust the power for lighting equipment assigned to a particular space but only if that space is part of the selected space type by looping through the objects first in space types and then in spaces, but again only for spaces that are in the specified space type (unless the entire building has been chosen). Material and installation cost increases will be applied to all costs related to both the definition and instance of the lighting object. If this measure includes baseline costs, then the material and installation costs of the lighting objects in the baseline model will be summed together and added as a capital cost on the building object.</modeler_description>
|
12
|
+
<arguments>
|
13
|
+
<argument>
|
14
|
+
<name>space_type</name>
|
15
|
+
<display_name>Apply the Measure to a Specific Space Type or to the Entire Model</display_name>
|
16
|
+
<type>Choice</type>
|
17
|
+
<required>true</required>
|
18
|
+
<model_dependent>false</model_dependent>
|
19
|
+
<default_value>*Entire Building*</default_value>
|
20
|
+
<choices>
|
21
|
+
<choice>
|
22
|
+
<value>{ba5b25d6-8c19-43e3-abc8-bb5666d4cc52}</value>
|
23
|
+
<display_name>*Entire Building*</display_name>
|
24
|
+
</choice>
|
25
|
+
</choices>
|
26
|
+
</argument>
|
27
|
+
<argument>
|
28
|
+
<name>lighting_power_reduction_percent</name>
|
29
|
+
<display_name>Lighting Power Reduction</display_name>
|
30
|
+
<type>Double</type>
|
31
|
+
<units>%</units>
|
32
|
+
<required>true</required>
|
33
|
+
<model_dependent>false</model_dependent>
|
34
|
+
<default_value>30</default_value>
|
35
|
+
</argument>
|
36
|
+
<argument>
|
37
|
+
<name>material_and_installation_cost</name>
|
38
|
+
<display_name>Increase in Material and Installation Cost for Lighting per Floor Area</display_name>
|
39
|
+
<type>Double</type>
|
40
|
+
<units>%</units>
|
41
|
+
<required>true</required>
|
42
|
+
<model_dependent>false</model_dependent>
|
43
|
+
<default_value>0</default_value>
|
44
|
+
</argument>
|
45
|
+
<argument>
|
46
|
+
<name>demolition_cost</name>
|
47
|
+
<display_name>Increase in Demolition Costs for Lighting per Floor Area</display_name>
|
48
|
+
<type>Double</type>
|
49
|
+
<units>%</units>
|
50
|
+
<required>true</required>
|
51
|
+
<model_dependent>false</model_dependent>
|
52
|
+
<default_value>0</default_value>
|
53
|
+
</argument>
|
54
|
+
<argument>
|
55
|
+
<name>years_until_costs_start</name>
|
56
|
+
<display_name>Years Until Costs Start</display_name>
|
57
|
+
<type>Integer</type>
|
58
|
+
<units>whole years</units>
|
59
|
+
<required>true</required>
|
60
|
+
<model_dependent>false</model_dependent>
|
61
|
+
<default_value>0</default_value>
|
62
|
+
</argument>
|
63
|
+
<argument>
|
64
|
+
<name>demo_cost_initial_const</name>
|
65
|
+
<display_name>Demolition Costs Occur During Initial Construction</display_name>
|
66
|
+
<type>Boolean</type>
|
67
|
+
<required>true</required>
|
68
|
+
<model_dependent>false</model_dependent>
|
69
|
+
<default_value>false</default_value>
|
70
|
+
<choices>
|
71
|
+
<choice>
|
72
|
+
<value>true</value>
|
73
|
+
<display_name>true</display_name>
|
74
|
+
</choice>
|
75
|
+
<choice>
|
76
|
+
<value>false</value>
|
77
|
+
<display_name>false</display_name>
|
78
|
+
</choice>
|
79
|
+
</choices>
|
80
|
+
</argument>
|
81
|
+
<argument>
|
82
|
+
<name>expected_life</name>
|
83
|
+
<display_name>Expected Life</display_name>
|
84
|
+
<type>Integer</type>
|
85
|
+
<units>whole years</units>
|
86
|
+
<required>true</required>
|
87
|
+
<model_dependent>false</model_dependent>
|
88
|
+
<default_value>15</default_value>
|
89
|
+
</argument>
|
90
|
+
<argument>
|
91
|
+
<name>om_cost</name>
|
92
|
+
<display_name>Increase O & M Costs for Lighting per Floor Area</display_name>
|
93
|
+
<type>Double</type>
|
94
|
+
<units>%</units>
|
95
|
+
<required>true</required>
|
96
|
+
<model_dependent>false</model_dependent>
|
97
|
+
<default_value>0</default_value>
|
98
|
+
</argument>
|
99
|
+
<argument>
|
100
|
+
<name>om_frequency</name>
|
101
|
+
<display_name>O & M Frequency</display_name>
|
102
|
+
<type>Integer</type>
|
103
|
+
<units>whole years</units>
|
104
|
+
<required>true</required>
|
105
|
+
<model_dependent>false</model_dependent>
|
106
|
+
<default_value>1</default_value>
|
107
|
+
</argument>
|
108
|
+
</arguments>
|
109
|
+
<outputs/>
|
110
|
+
<provenances/>
|
111
|
+
<tags>
|
112
|
+
<tag>Electric Lighting.Lighting Equipment</tag>
|
113
|
+
</tags>
|
114
|
+
<attributes>
|
115
|
+
<attribute>
|
116
|
+
<name>Measure Type</name>
|
117
|
+
<value>ModelMeasure</value>
|
118
|
+
<datatype>string</datatype>
|
119
|
+
</attribute>
|
120
|
+
<attribute>
|
121
|
+
<name>Measure Function</name>
|
122
|
+
<value>Measure</value>
|
123
|
+
<datatype>string</datatype>
|
124
|
+
</attribute>
|
125
|
+
<attribute>
|
126
|
+
<name>Requires EnergyPlus Results</name>
|
127
|
+
<value>false</value>
|
128
|
+
<datatype>boolean</datatype>
|
129
|
+
</attribute>
|
130
|
+
<attribute>
|
131
|
+
<name>Uses SketchUp API</name>
|
132
|
+
<value>false</value>
|
133
|
+
<datatype>boolean</datatype>
|
134
|
+
</attribute>
|
135
|
+
</attributes>
|
136
|
+
<files>
|
137
|
+
<file>
|
138
|
+
<filename>EC_QAQC.osm</filename>
|
139
|
+
<filetype>osm</filetype>
|
140
|
+
<usage_type>test</usage_type>
|
141
|
+
<checksum>A0F6342F</checksum>
|
142
|
+
</file>
|
143
|
+
<file>
|
144
|
+
<filename>EnvelopeAndLoadTestModel_01.osm</filename>
|
145
|
+
<filetype>osm</filetype>
|
146
|
+
<usage_type>test</usage_type>
|
147
|
+
<checksum>10AA8866</checksum>
|
148
|
+
</file>
|
149
|
+
<file>
|
150
|
+
<filename>EnvelopeAndLoadTestModel_01_FullyCosted.osm</filename>
|
151
|
+
<filetype>osm</filetype>
|
152
|
+
<usage_type>test</usage_type>
|
153
|
+
<checksum>824A4C53</checksum>
|
154
|
+
</file>
|
155
|
+
<file>
|
156
|
+
<filename>README.md.erb</filename>
|
157
|
+
<filetype>erb</filetype>
|
158
|
+
<usage_type>readmeerb</usage_type>
|
159
|
+
<checksum>703C9964</checksum>
|
160
|
+
</file>
|
161
|
+
<file>
|
162
|
+
<filename>README.md</filename>
|
163
|
+
<filetype>md</filetype>
|
164
|
+
<usage_type>readme</usage_type>
|
165
|
+
<checksum>9169535E</checksum>
|
166
|
+
</file>
|
167
|
+
<file>
|
168
|
+
<filename>ReduceLightingLoadsByPercentage_Test.rb</filename>
|
169
|
+
<filetype>rb</filetype>
|
170
|
+
<usage_type>test</usage_type>
|
171
|
+
<checksum>F5BAA5CC</checksum>
|
172
|
+
</file>
|
173
|
+
<file>
|
174
|
+
<filename>LICENSE.md</filename>
|
175
|
+
<filetype>md</filetype>
|
176
|
+
<usage_type>license</usage_type>
|
177
|
+
<checksum>E0468DD6</checksum>
|
178
|
+
</file>
|
179
|
+
<file>
|
180
|
+
<version>
|
181
|
+
<software_program>OpenStudio</software_program>
|
182
|
+
<identifier>2.0.0</identifier>
|
183
|
+
<min_compatible>2.0.0</min_compatible>
|
184
|
+
</version>
|
185
|
+
<filename>measure.rb</filename>
|
186
|
+
<filetype>rb</filetype>
|
187
|
+
<usage_type>script</usage_type>
|
188
|
+
<checksum>BD37BF51</checksum>
|
189
|
+
</file>
|
190
|
+
</files>
|
191
|
+
</measure>
|
@@ -0,0 +1,27 @@
|
|
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.
|
@@ -0,0 +1,104 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
###### (Automatically generated documentation)
|
4
|
+
|
5
|
+
# ReduceSpaceInfiltrationByPercentage
|
6
|
+
|
7
|
+
## Description
|
8
|
+
This measure will reduce space infiltration rates by the requested percentage. A cost per square foot of building area can be added to the model.
|
9
|
+
|
10
|
+
## Modeler Description
|
11
|
+
This can be run across a space type or the entire building. Costs will be associated with the building. If infiltration objects are removed at a later date, the costs will remain.
|
12
|
+
|
13
|
+
## Measure Type
|
14
|
+
ModelMeasure
|
15
|
+
|
16
|
+
## Taxonomy
|
17
|
+
|
18
|
+
|
19
|
+
## Arguments
|
20
|
+
|
21
|
+
|
22
|
+
### Apply the Measure to a Specific Space Type or to the Entire Model.
|
23
|
+
|
24
|
+
**Name:** space_type,
|
25
|
+
**Type:** Choice,
|
26
|
+
**Units:** ,
|
27
|
+
**Required:** true,
|
28
|
+
**Model Dependent:** false
|
29
|
+
|
30
|
+
### Space Infiltration Power Reduction
|
31
|
+
|
32
|
+
**Name:** space_infiltration_reduction_percent,
|
33
|
+
**Type:** Double,
|
34
|
+
**Units:** %,
|
35
|
+
**Required:** true,
|
36
|
+
**Model Dependent:** false
|
37
|
+
|
38
|
+
### Constant Coefficient
|
39
|
+
|
40
|
+
**Name:** constant_coefficient,
|
41
|
+
**Type:** Double,
|
42
|
+
**Units:** ,
|
43
|
+
**Required:** true,
|
44
|
+
**Model Dependent:** false
|
45
|
+
|
46
|
+
### Temperature Coefficient
|
47
|
+
|
48
|
+
**Name:** temperature_coefficient,
|
49
|
+
**Type:** Double,
|
50
|
+
**Units:** ,
|
51
|
+
**Required:** true,
|
52
|
+
**Model Dependent:** false
|
53
|
+
|
54
|
+
### Wind Speed Coefficient
|
55
|
+
|
56
|
+
**Name:** wind_speed_coefficient,
|
57
|
+
**Type:** Double,
|
58
|
+
**Units:** ,
|
59
|
+
**Required:** true,
|
60
|
+
**Model Dependent:** false
|
61
|
+
|
62
|
+
### Wind Speed Squared Coefficient
|
63
|
+
|
64
|
+
**Name:** wind_speed_squared_coefficient,
|
65
|
+
**Type:** Double,
|
66
|
+
**Units:** ,
|
67
|
+
**Required:** true,
|
68
|
+
**Model Dependent:** false
|
69
|
+
|
70
|
+
### Alter constant temperature and wind speed coefficients.
|
71
|
+
Setting this to false will result in infiltration objects that maintain the coefficients from the initial model. Setting this to true replaces the existing coefficients with the values entered for the coefficient arguments in this measure
|
72
|
+
**Name:** alter_coef,
|
73
|
+
**Type:** Boolean,
|
74
|
+
**Units:** ,
|
75
|
+
**Required:** true,
|
76
|
+
**Model Dependent:** false
|
77
|
+
|
78
|
+
### Increase in Material and Installation Costs for Building per Affected Floor Area
|
79
|
+
|
80
|
+
**Name:** material_and_installation_cost,
|
81
|
+
**Type:** Double,
|
82
|
+
**Units:** $/ft^2,
|
83
|
+
**Required:** true,
|
84
|
+
**Model Dependent:** false
|
85
|
+
|
86
|
+
### O & M Costs for Construction per Affected Floor Area
|
87
|
+
|
88
|
+
**Name:** om_cost,
|
89
|
+
**Type:** Double,
|
90
|
+
**Units:** $/ft^2,
|
91
|
+
**Required:** true,
|
92
|
+
**Model Dependent:** false
|
93
|
+
|
94
|
+
### O & M Frequency
|
95
|
+
|
96
|
+
**Name:** om_frequency,
|
97
|
+
**Type:** Integer,
|
98
|
+
**Units:** whole years,
|
99
|
+
**Required:** true,
|
100
|
+
**Model Dependent:** false
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
@@ -0,0 +1,42 @@
|
|
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 %>
|
@@ -0,0 +1,349 @@
|
|
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://openstudio.nrel.gov/openstudio-measure-writing-guide
|
38
|
+
|
39
|
+
# see the URL below for information on using life cycle cost objects in OpenStudio
|
40
|
+
# http://openstudio.nrel.gov/openstudio-life-cycle-examples
|
41
|
+
|
42
|
+
# see the URL below for access to C++ documentation on model objects (click on "model" in the main window to view model objects)
|
43
|
+
# http://openstudio.nrel.gov/sites/openstudio.nrel.gov/files/nv_data/cpp_documentation_it/model/html/namespaces.html
|
44
|
+
|
45
|
+
# start the measure
|
46
|
+
class ReduceSpaceInfiltrationByPercentage < OpenStudio::Measure::ModelMeasure
|
47
|
+
# define the name that a user will see, this method may be deprecated as
|
48
|
+
# the display name in PAT comes from the name field in measure.xml
|
49
|
+
def name
|
50
|
+
return 'ReduceSpaceInfiltrationByPercentage'
|
51
|
+
end
|
52
|
+
|
53
|
+
# human readable description
|
54
|
+
def description
|
55
|
+
return 'This measure will reduce space infiltration rates by the requested percentage. A cost per square foot of building area can be added to the model.'
|
56
|
+
end
|
57
|
+
|
58
|
+
# human readable description of modeling approach
|
59
|
+
def modeler_description
|
60
|
+
return 'This can be run across a space type or the entire building. Costs will be associated with the building. If infiltration objects are removed at a later date, the costs will remain.'
|
61
|
+
end
|
62
|
+
|
63
|
+
# define the arguments that the user will input
|
64
|
+
def arguments(model)
|
65
|
+
args = OpenStudio::Measure::OSArgumentVector.new
|
66
|
+
|
67
|
+
# make a choice argument for model objects
|
68
|
+
space_type_handles = OpenStudio::StringVector.new
|
69
|
+
space_type_display_names = OpenStudio::StringVector.new
|
70
|
+
|
71
|
+
# putting model object and names into hash
|
72
|
+
space_type_args = model.getSpaceTypes
|
73
|
+
space_type_args_hash = {}
|
74
|
+
space_type_args.each do |space_type_arg|
|
75
|
+
space_type_args_hash[space_type_arg.name.to_s] = space_type_arg
|
76
|
+
end
|
77
|
+
|
78
|
+
# looping through sorted hash of model objects
|
79
|
+
space_type_args_hash.sort.map do |key, value|
|
80
|
+
# only include if space type is used in the model
|
81
|
+
if !value.spaces.empty?
|
82
|
+
space_type_handles << value.handle.to_s
|
83
|
+
space_type_display_names << key
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# add building to string vector with space type
|
88
|
+
building = model.getBuilding
|
89
|
+
space_type_handles << building.handle.to_s
|
90
|
+
space_type_display_names << '*Entire Building*'
|
91
|
+
|
92
|
+
# make a choice argument for space type
|
93
|
+
space_type = OpenStudio::Measure::OSArgument.makeChoiceArgument('space_type', space_type_handles, space_type_display_names)
|
94
|
+
space_type.setDisplayName('Apply the Measure to a Specific Space Type or to the Entire Model.')
|
95
|
+
space_type.setDefaultValue('*Entire Building*') # if no space type is chosen this will run on the entire building
|
96
|
+
args << space_type
|
97
|
+
|
98
|
+
# make an argument for reduction percentage
|
99
|
+
space_infiltration_reduction_percent = OpenStudio::Measure::OSArgument.makeDoubleArgument('space_infiltration_reduction_percent', true)
|
100
|
+
space_infiltration_reduction_percent.setDisplayName('Space Infiltration Power Reduction')
|
101
|
+
space_infiltration_reduction_percent.setDefaultValue(30.0)
|
102
|
+
space_infiltration_reduction_percent.setUnits('%')
|
103
|
+
args << space_infiltration_reduction_percent
|
104
|
+
|
105
|
+
# make an argument for constant_coefficient
|
106
|
+
constant_coefficient = OpenStudio::Measure::OSArgument.makeDoubleArgument('constant_coefficient', true)
|
107
|
+
constant_coefficient.setDisplayName('Constant Coefficient')
|
108
|
+
constant_coefficient.setDefaultValue(1.0)
|
109
|
+
args << constant_coefficient
|
110
|
+
|
111
|
+
# make an argument for temperature_coefficient
|
112
|
+
temperature_coefficient = OpenStudio::Measure::OSArgument.makeDoubleArgument('temperature_coefficient', true)
|
113
|
+
temperature_coefficient.setDisplayName('Temperature Coefficient')
|
114
|
+
temperature_coefficient.setDefaultValue(0.0)
|
115
|
+
args << temperature_coefficient
|
116
|
+
|
117
|
+
# make an argument for wind_speed_coefficient
|
118
|
+
wind_speed_coefficient = OpenStudio::Measure::OSArgument.makeDoubleArgument('wind_speed_coefficient', true)
|
119
|
+
wind_speed_coefficient.setDisplayName('Wind Speed Coefficient')
|
120
|
+
wind_speed_coefficient.setDefaultValue(0.0)
|
121
|
+
args << wind_speed_coefficient
|
122
|
+
|
123
|
+
# make an argument for wind_speed_squared_coefficient
|
124
|
+
wind_speed_squared_coefficient = OpenStudio::Measure::OSArgument.makeDoubleArgument('wind_speed_squared_coefficient', true)
|
125
|
+
wind_speed_squared_coefficient.setDisplayName('Wind Speed Squared Coefficient')
|
126
|
+
wind_speed_squared_coefficient.setDefaultValue(0.0)
|
127
|
+
args << wind_speed_squared_coefficient
|
128
|
+
|
129
|
+
# make an argument for alter_coef
|
130
|
+
alter_coef = OpenStudio::Measure::OSArgument.makeBoolArgument('alter_coef', true)
|
131
|
+
alter_coef.setDisplayName('Alter constant temperature and wind speed coefficients.')
|
132
|
+
alter_coef.setDescription('Setting this to false will result in infiltration objects that maintain the coefficients from the initial model. Setting this to true replaces the existing coefficients with the values entered for the coefficient arguments in this measure')
|
133
|
+
alter_coef.setDefaultValue(true)
|
134
|
+
args << alter_coef
|
135
|
+
|
136
|
+
# make an argument for material and installation cost
|
137
|
+
material_and_installation_cost = OpenStudio::Measure::OSArgument.makeDoubleArgument('material_and_installation_cost', true)
|
138
|
+
material_and_installation_cost.setDisplayName('Increase in Material and Installation Costs for Building per Affected Floor Area')
|
139
|
+
material_and_installation_cost.setDefaultValue(0.0)
|
140
|
+
material_and_installation_cost.setUnits('$/ft^2')
|
141
|
+
args << material_and_installation_cost
|
142
|
+
|
143
|
+
# make an argument for O & M cost
|
144
|
+
om_cost = OpenStudio::Measure::OSArgument.makeDoubleArgument('om_cost', true)
|
145
|
+
om_cost.setDisplayName('O & M Costs for Construction per Affected Floor Area')
|
146
|
+
om_cost.setDefaultValue(0.0)
|
147
|
+
om_cost.setUnits('$/ft^2')
|
148
|
+
args << om_cost
|
149
|
+
|
150
|
+
# make an argument for O & M frequency
|
151
|
+
om_frequency = OpenStudio::Measure::OSArgument.makeIntegerArgument('om_frequency', true)
|
152
|
+
om_frequency.setDisplayName('O & M Frequency')
|
153
|
+
om_frequency.setDefaultValue(1)
|
154
|
+
om_frequency.setUnits('whole years')
|
155
|
+
args << om_frequency
|
156
|
+
|
157
|
+
return args
|
158
|
+
end
|
159
|
+
|
160
|
+
# define what happens when the measure is run
|
161
|
+
def run(model, runner, user_arguments)
|
162
|
+
super(model, runner, user_arguments)
|
163
|
+
|
164
|
+
# use the built-in error checking
|
165
|
+
if !runner.validateUserArguments(arguments(model), user_arguments)
|
166
|
+
return false
|
167
|
+
end
|
168
|
+
|
169
|
+
# assign the user inputs to variables
|
170
|
+
object = runner.getOptionalWorkspaceObjectChoiceValue('space_type', user_arguments, model)
|
171
|
+
space_infiltration_reduction_percent = runner.getDoubleArgumentValue('space_infiltration_reduction_percent', user_arguments)
|
172
|
+
constant_coefficient = runner.getDoubleArgumentValue('constant_coefficient', user_arguments)
|
173
|
+
temperature_coefficient = runner.getDoubleArgumentValue('temperature_coefficient', user_arguments)
|
174
|
+
wind_speed_coefficient = runner.getDoubleArgumentValue('wind_speed_coefficient', user_arguments)
|
175
|
+
wind_speed_squared_coefficient = runner.getDoubleArgumentValue('wind_speed_squared_coefficient', user_arguments)
|
176
|
+
alter_coef = runner.getBoolArgumentValue('alter_coef', user_arguments)
|
177
|
+
material_and_installation_cost = runner.getDoubleArgumentValue('material_and_installation_cost', user_arguments)
|
178
|
+
om_cost = runner.getDoubleArgumentValue('om_cost', user_arguments)
|
179
|
+
om_frequency = runner.getIntegerArgumentValue('om_frequency', user_arguments)
|
180
|
+
|
181
|
+
# check the space_type for reasonableness and see if measure should run on space type or on the entire building
|
182
|
+
apply_to_building = false
|
183
|
+
space_type = nil
|
184
|
+
if object.empty?
|
185
|
+
handle = runner.getStringArgumentValue('space_type', user_arguments)
|
186
|
+
if handle.empty?
|
187
|
+
runner.registerError('No space type was chosen.')
|
188
|
+
else
|
189
|
+
runner.registerError("The selected space type with handle '#{handle}' was not found in the model. It may have been removed by another measure.")
|
190
|
+
end
|
191
|
+
return false
|
192
|
+
else
|
193
|
+
if !object.get.to_SpaceType.empty?
|
194
|
+
space_type = object.get.to_SpaceType.get
|
195
|
+
elsif !object.get.to_Building.empty?
|
196
|
+
apply_to_building = true
|
197
|
+
else
|
198
|
+
runner.registerError('Script Error - argument not showing up as space type or building.')
|
199
|
+
return false
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
# check the space_infiltration_reduction_percent and for reasonableness
|
204
|
+
if space_infiltration_reduction_percent > 100
|
205
|
+
runner.registerError('Please enter a value less than or equal to 100 for the Space Infiltration reduction percentage.')
|
206
|
+
return false
|
207
|
+
elsif space_infiltration_reduction_percent == 0
|
208
|
+
runner.registerInfo('No Space Infiltration adjustment requested, but infiltration coefficients or life cycle costs may still be affected.')
|
209
|
+
elsif (space_infiltration_reduction_percent < 1) && (space_infiltration_reduction_percent > -1)
|
210
|
+
runner.registerWarning("A Space Infiltration reduction percentage of #{space_infiltration_reduction_percent} percent is abnormally low.")
|
211
|
+
elsif space_infiltration_reduction_percent > 90
|
212
|
+
runner.registerWarning("A Space Infiltration reduction percentage of #{space_infiltration_reduction_percent} percent is abnormally high.")
|
213
|
+
elsif space_infiltration_reduction_percent < 0
|
214
|
+
runner.registerInfo('The requested value for Space Infiltration reduction percentage was negative. This will result in an increase in Space Infiltration.')
|
215
|
+
end
|
216
|
+
|
217
|
+
# TODO: - currently not checking for negative $/ft^2 for material_and_installation_cost and om_cost, confirm if E+ will allow negative cost
|
218
|
+
|
219
|
+
if om_frequency < 1
|
220
|
+
runner.registerError('Choose an integer greater than 0 for O & M Frequency.')
|
221
|
+
end
|
222
|
+
|
223
|
+
# helper to make numbers pretty (converts 4125001.25641 to 4,125,001.26 or 4,125,001). The definition be called through this measure.
|
224
|
+
def neat_numbers(number, roundto = 2) # round to 0 or 2)
|
225
|
+
if roundto == 2
|
226
|
+
number = format '%.2f', number
|
227
|
+
else
|
228
|
+
number = number.round
|
229
|
+
end
|
230
|
+
# regex to add commas
|
231
|
+
number.to_s.reverse.gsub(/([0-9]{3}(?=([0-9])))/, '\\1,').reverse
|
232
|
+
end
|
233
|
+
|
234
|
+
# get space infiltration objects used in the model
|
235
|
+
space_infiltration_objects = model.getSpaceInfiltrationDesignFlowRates
|
236
|
+
# TODO: - it would be nice to give ranges for different calculation methods but would take some work.
|
237
|
+
|
238
|
+
# counters needed for measure
|
239
|
+
altered_instances = 0
|
240
|
+
affected_area_si = 0
|
241
|
+
|
242
|
+
# reporting initial condition of model
|
243
|
+
if !space_infiltration_objects.empty?
|
244
|
+
runner.registerInitialCondition("The initial model contained #{space_infiltration_objects.size} space infiltration objects.")
|
245
|
+
else
|
246
|
+
runner.registerInitialCondition('The initial model did not contain any space infiltration objects.')
|
247
|
+
end
|
248
|
+
|
249
|
+
# get space types in model
|
250
|
+
building = model.building.get
|
251
|
+
if apply_to_building
|
252
|
+
space_types = model.getSpaceTypes
|
253
|
+
affected_area_si = building.floorArea
|
254
|
+
else
|
255
|
+
space_types = []
|
256
|
+
space_types << space_type # only run on a single space type
|
257
|
+
affected_area_si = space_type.floorArea
|
258
|
+
end
|
259
|
+
|
260
|
+
# def to alter performance and life cycle costs of objects
|
261
|
+
def alter_performance(object, space_infiltration_reduction_percent, constant_coefficient, temperature_coefficient, wind_speed_coefficient, wind_speed_squared_coefficient, alter_coef, runner)
|
262
|
+
# edit instance based on percentage reduction
|
263
|
+
instance = object
|
264
|
+
if !instance.designFlowRate.empty?
|
265
|
+
new_infiltration_design_flow_rate = instance.setDesignFlowRate(instance.designFlowRate.get - instance.designFlowRate.get * space_infiltration_reduction_percent * 0.01)
|
266
|
+
elsif !instance.flowperSpaceFloorArea.empty?
|
267
|
+
new_infiltration_flow_floor_area = instance.setFlowperSpaceFloorArea(instance.flowperSpaceFloorArea.get - instance.flowperSpaceFloorArea.get * space_infiltration_reduction_percent * 0.01)
|
268
|
+
elsif !instance.flowperExteriorSurfaceArea.empty?
|
269
|
+
new_infiltration_flow_ext_area = instance.setFlowperExteriorSurfaceArea(instance.flowperExteriorSurfaceArea.get - instance.flowperExteriorSurfaceArea.get * space_infiltration_reduction_percent * 0.01)
|
270
|
+
elsif !instance.flowperExteriorWallArea.empty?
|
271
|
+
new_infiltration_flow_ext_area = instance.setFlowperExteriorWallArea(instance.flowperExteriorWallArea.get - instance.flowperExteriorWallArea.get * space_infiltration_reduction_percent * 0.01)
|
272
|
+
elsif !instance.airChangesperHour.empty?
|
273
|
+
new_infiltration_ach = instance.setAirChangesperHour(instance.airChangesperHour.get - instance.airChangesperHour.get * space_infiltration_reduction_percent * 0.01)
|
274
|
+
else
|
275
|
+
runner.registerWarning("'#{instance.name}' is used by one or more instances and has no load values.")
|
276
|
+
end
|
277
|
+
|
278
|
+
# only alter coefficients if requested
|
279
|
+
if alter_coef
|
280
|
+
instance.setConstantTermCoefficient(constant_coefficient)
|
281
|
+
instance.setTemperatureTermCoefficient(temperature_coefficient)
|
282
|
+
instance.setVelocityTermCoefficient(wind_speed_coefficient)
|
283
|
+
instance.setVelocitySquaredTermCoefficient(wind_speed_squared_coefficient)
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
# loop through space types
|
288
|
+
space_types.each do |space_type|
|
289
|
+
next if space_type.spaces.size <= 0
|
290
|
+
space_type_infiltration_objects = space_type.spaceInfiltrationDesignFlowRates
|
291
|
+
space_type_infiltration_objects.each do |space_type_infiltration_object|
|
292
|
+
# call def to alter performance and life cycle costs
|
293
|
+
alter_performance(space_type_infiltration_object, space_infiltration_reduction_percent, constant_coefficient, temperature_coefficient, wind_speed_coefficient, wind_speed_squared_coefficient, alter_coef, runner)
|
294
|
+
|
295
|
+
# rename
|
296
|
+
updated_instance_name = space_type_infiltration_object.setName("#{space_type_infiltration_object.name} #{space_infiltration_reduction_percent} percent reduction")
|
297
|
+
altered_instances += 1
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
# getting spaces in the model
|
302
|
+
spaces = model.getSpaces
|
303
|
+
|
304
|
+
# get space types in model
|
305
|
+
if apply_to_building
|
306
|
+
spaces = model.getSpaces
|
307
|
+
else
|
308
|
+
if !space_type.spaces.empty?
|
309
|
+
spaces = space_type.spaces # only run on a single space type
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
spaces.each do |space|
|
314
|
+
space_infiltration_objects = space.spaceInfiltrationDesignFlowRates
|
315
|
+
space_infiltration_objects.each do |space_infiltration_object|
|
316
|
+
# call def to alter performance and life cycle costs
|
317
|
+
alter_performance(space_infiltration_object, space_infiltration_reduction_percent, constant_coefficient, temperature_coefficient, wind_speed_coefficient, wind_speed_squared_coefficient, alter_coef, runner)
|
318
|
+
|
319
|
+
# rename
|
320
|
+
updated_instance_name = space_infiltration_object.setName("#{space_infiltration_object.name} #{space_infiltration_reduction_percent} percent reduction")
|
321
|
+
altered_instances += 1
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
if (altered_instances == 0) && (material_and_installation_cost == 0) && (om_cost == 0)
|
326
|
+
runner.registerAsNotApplicable('No space infiltration objects were found in the specified space type(s) and no life cycle costs were requested.')
|
327
|
+
end
|
328
|
+
|
329
|
+
# only add LifeCyCyleCostItem if the user entered some non 0 cost values
|
330
|
+
affected_area_ip = OpenStudio.convert(affected_area_si, 'm^2', 'ft^2').get
|
331
|
+
if (material_and_installation_cost != 0) || (om_cost != 0)
|
332
|
+
lcc_mat = OpenStudio::Model::LifeCycleCost.createLifeCycleCost('LCC_Mat - Cost to Adjust Infiltration', building, affected_area_ip * material_and_installation_cost, 'CostPerEach', 'Construction', 0, 0) # 0 for expected life will result infinite expected life
|
333
|
+
lcc_om = OpenStudio::Model::LifeCycleCost.createLifeCycleCost('LCC_OM - Cost to Adjust Infiltration', building, affected_area_ip * om_cost, 'CostPerEach', 'Maintenance', om_frequency, 0) # o&m costs start after at sane time that material and installation costs occur
|
334
|
+
runner.registerInfo("Costs related to the change in infiltration are attached to the building object. Any subsequent measures that may affect infiltration won't affect these costs.")
|
335
|
+
final_cost = lcc_mat.get.totalCost
|
336
|
+
else
|
337
|
+
runner.registerInfo('Cost arguments were not provided, no cost objects were added to the model.')
|
338
|
+
final_cost = 0
|
339
|
+
end
|
340
|
+
|
341
|
+
# report final condition
|
342
|
+
runner.registerFinalCondition("#{altered_instances} space infiltration objects in the model were altered affecting #{neat_numbers(affected_area_ip, 0)}(ft^2) at a total cost of $#{neat_numbers(final_cost, 0)}.")
|
343
|
+
|
344
|
+
return true
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
# this allows the measure to be use by the application
|
349
|
+
ReduceSpaceInfiltrationByPercentage.new.registerWithApplication
|