openstudio-ee 0.2.0 → 0.2.1

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/Rakefile +2 -0
  4. data/lib/measures/ImproveFanTotalEfficiencybyPercentage/measure.rb +333 -0
  5. data/lib/measures/ImproveFanTotalEfficiencybyPercentage/measure.xml +150 -0
  6. data/lib/measures/ReplaceFanTotalEfficiency/measure.rb +330 -0
  7. data/lib/measures/ReplaceFanTotalEfficiency/measure.xml +150 -0
  8. data/lib/measures/add_apszhp_to_each_zone/measure.rb +607 -0
  9. data/lib/measures/add_apszhp_to_each_zone/measure.xml +184 -0
  10. data/lib/measures/add_energy_recovery_ventilator/measure.rb +354 -0
  11. data/lib/measures/add_energy_recovery_ventilator/measure.xml +78 -0
  12. data/lib/measures/improve_simple_glazing_by_percentage/measure.rb +81 -0
  13. data/lib/measures/improve_simple_glazing_by_percentage/measure.xml +70 -0
  14. data/lib/measures/reduce_water_use_by_percentage/measure.rb +61 -0
  15. data/lib/measures/reduce_water_use_by_percentage/measure.xml +62 -0
  16. data/lib/measures/replace_hvac_with_gshp_and_doas/measure.rb +511 -0
  17. data/lib/measures/replace_hvac_with_gshp_and_doas/measure.xml +375 -0
  18. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_AedgMeasures.rb +454 -0
  19. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_Constructions.rb +221 -0
  20. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_Geometry.rb +41 -0
  21. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_HVAC.rb +1682 -0
  22. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_HelperMethods.rb +114 -0
  23. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_LightingAndEquipment.rb +99 -0
  24. data/lib/measures/replace_hvac_with_gshp_and_doas/resources/OsLib_Schedules.rb +142 -0
  25. data/lib/measures/replace_simple_glazing/measure.rb +86 -0
  26. data/lib/measures/replace_simple_glazing/measure.xml +78 -0
  27. data/lib/measures/set_boiler_thermal_efficiency/measure.rb +520 -0
  28. data/lib/measures/set_boiler_thermal_efficiency/measure.xml +78 -0
  29. data/lib/measures/set_water_heater_efficiency_heat_lossand_peak_water_flow_rate/measure.rb +207 -0
  30. data/lib/measures/set_water_heater_efficiency_heat_lossand_peak_water_flow_rate/measure.xml +78 -0
  31. data/lib/measures/tenant_star_internal_loads/measure.rb +134 -0
  32. data/lib/measures/tenant_star_internal_loads/measure.xml +67 -0
  33. data/lib/measures/tenant_star_internal_loads/resources/os_lib_helper_methods.rb +401 -0
  34. data/lib/measures/vr_fwith_doas/measure.rb +468 -0
  35. data/lib/measures/vr_fwith_doas/measure.xml +298 -0
  36. data/lib/measures/vr_fwith_doas/resources/OsLib_AedgMeasures.rb +454 -0
  37. data/lib/measures/vr_fwith_doas/resources/OsLib_Constructions.rb +221 -0
  38. data/lib/measures/vr_fwith_doas/resources/OsLib_Geometry.rb +41 -0
  39. data/lib/measures/vr_fwith_doas/resources/OsLib_HVAC.rb +1516 -0
  40. data/lib/measures/vr_fwith_doas/resources/OsLib_HelperMethods.rb +114 -0
  41. data/lib/measures/vr_fwith_doas/resources/OsLib_LightingAndEquipment.rb +99 -0
  42. data/lib/measures/vr_fwith_doas/resources/OsLib_Schedules.rb +142 -0
  43. data/lib/openstudio/ee_measures/version.rb +1 -1
  44. data/openstudio-ee.gemspec +7 -5
  45. metadata +48 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c60e88779c2fa0cc92a232609c6b065c5ffb7aedf98a8744a7c3826d8e5c5b2
4
- data.tar.gz: e72168973e3ed40ceeb9dc004a5b5aaebe8c7512c075812dffe28771ad35901e
3
+ metadata.gz: e1f51dd9876af66e73f11f916596a843d40abef627ca4920effca222b1a12518
4
+ data.tar.gz: 8764a7e76b29e452ba9b12945c92a164f985ee6ada6849498368aea3caa0f4f8
5
5
  SHA512:
6
- metadata.gz: 497af7dde5c68eda9047af04dc50541ffaa534675a7a35688e4f2b93c189d9c4e76c430b4f11984c4b33c6fad70ae93ed59814f8269f5b198b95d30d66ac571c
7
- data.tar.gz: f11eb78a21d16d2b4ee8eaf63b67d04e4515a14af280237eb17c0f853d50d10b96d9f85684e67f3b1840617050671e294c583754e9fdaf719551f7a217f3b7f2
6
+ metadata.gz: 2f9b65251ccef1b28f7e16a95d4dedc9265b11899ec9128db9503bc66e50262622c1399ac834eaa60e264af2a5e1558d85a441925ea42ca9f067787ab4a96851
7
+ data.tar.gz: 517716774a902e7852c8527ab68b181af8f6754d6f10830b51815864f13e65330415583c042d6d34152ad21e6576c90f92e23b133802191941b9460f679b90ef
@@ -1,5 +1,21 @@
1
1
  # OpenStudio EE Gem
2
2
 
3
+ ## Version 0.2.1
4
+ * Update openstudio-extension to 0.2.5
5
+ * Adds the following to lib/measures:
6
+ * ImproveFanTotalEfficiencyByPercentage
7
+ * ReplaceFanTotalEfficiency
8
+ * add_apszhp_to_each_zone
9
+ * add_energy_recovery_ventilator
10
+ * improve_simple_glazing_by_percentage
11
+ * reduce_water_use_by_percentage
12
+ * replace_hvac_with_gshp_and_doas
13
+ * replace_simple_glazing
14
+ * set_boiler_thermal_efficiency
15
+ * set_water_heater_efficiency_heat_lossand_peak_water_flow_rate
16
+ * tenant_star_internal_loads
17
+ * vr_fwith_doas
18
+
3
19
  ## Version 0.2.0
4
20
 
5
21
  * Support for OpenStudio 3.0
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # *******************************************************************************
2
4
  # OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
3
5
  # All rights reserved.
@@ -0,0 +1,333 @@
1
+ # frozen_string_literal: true
2
+
3
+ # start the measure
4
+ class ImproveFanTotalEfficiencybyPercentage < OpenStudio::Ruleset::ModelUserScript
5
+ # define the name that a user will see, this method may be deprecated as
6
+ # the display name in PAT comes from the name field in measure.xml
7
+ def name
8
+ return 'Improve Fan Total Efficiency by Percentage'
9
+ end
10
+
11
+ # define the arguments that the user will input
12
+ def arguments(model)
13
+ args = OpenStudio::Ruleset::OSArgumentVector.new
14
+
15
+ # populate choice argument for constructions that are applied to surfaces in the model
16
+ loop_handles = OpenStudio::StringVector.new
17
+ loop_display_names = OpenStudio::StringVector.new
18
+
19
+ # putting air loops and names into hash
20
+ loop_args = model.getAirLoopHVACs
21
+ loop_args_hash = {}
22
+ loop_args.each do |loop_arg|
23
+ loop_args_hash[loop_arg.name.to_s] = loop_arg
24
+ end
25
+
26
+ # looping through sorted hash of air loops
27
+ loop_args_hash.sort.map do |key, value|
28
+ show_loop = false
29
+ components = value.supplyComponents
30
+ components.each do |component|
31
+ if !component.to_FanConstantVolume.empty?
32
+ show_loop = true
33
+ end
34
+ if !component.to_FanVariableVolume.empty?
35
+ show_loop = true
36
+ end
37
+ if !component.to_FanOnOff.empty?
38
+ show_loop = true
39
+ end
40
+ end
41
+
42
+ # if loop as object of correct type then add to hash.
43
+ if show_loop == true
44
+ loop_handles << value.handle.to_s
45
+ loop_display_names << key
46
+ end
47
+ end
48
+
49
+ # add building to string vector with air loops
50
+ building = model.getBuilding
51
+ loop_handles << building.handle.to_s
52
+ loop_display_names << '*All Air Loops*'
53
+
54
+ # make an argument for air loops
55
+ object = OpenStudio::Ruleset::OSArgument.makeChoiceArgument('object', loop_handles, loop_display_names, true)
56
+ object.setDisplayName('Choose an Air Loop to Alter.')
57
+ object.setDefaultValue('*All Air Loops*') # if no loop is chosen this will run on all air loops
58
+ args << object
59
+
60
+ # TODO: - change this to choice list from design document
61
+ # make an argument to add new space true/false
62
+ motor_eff = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('motor_eff', true)
63
+ motor_eff.setDisplayName('Fan Total Efficiency Improvement(%).')
64
+ motor_eff.setDefaultValue(3.0)
65
+ args << motor_eff
66
+
67
+ # bool argument to remove existing costs
68
+ remove_costs = OpenStudio::Ruleset::OSArgument.makeBoolArgument('remove_costs', true)
69
+ remove_costs.setDisplayName('Remove Baseline Costs From Effected Fans?')
70
+ remove_costs.setDefaultValue(false)
71
+ args << remove_costs
72
+
73
+ # make an argument for material and installation cost
74
+ material_cost = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('material_cost', true)
75
+ material_cost.setDisplayName('Material and Installation Costs per Motor ($).')
76
+ material_cost.setDefaultValue(0.0)
77
+ args << material_cost
78
+
79
+ # make an argument for demolition cost
80
+ demolition_cost = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('demolition_cost', true)
81
+ demolition_cost.setDisplayName('Demolition Costs per Motor ($).')
82
+ demolition_cost.setDefaultValue(0.0)
83
+ args << demolition_cost
84
+
85
+ # make an argument for duration in years until costs start
86
+ years_until_costs_start = OpenStudio::Ruleset::OSArgument.makeIntegerArgument('years_until_costs_start', true)
87
+ years_until_costs_start.setDisplayName('Years Until Costs Start (whole years).')
88
+ years_until_costs_start.setDefaultValue(0)
89
+ args << years_until_costs_start
90
+
91
+ # make an argument to determine if demolition costs should be included in initial construction
92
+ demo_cost_initial_const = OpenStudio::Ruleset::OSArgument.makeBoolArgument('demo_cost_initial_const', true)
93
+ demo_cost_initial_const.setDisplayName('Demolition Costs Occur During Initial Construction?')
94
+ demo_cost_initial_const.setDefaultValue(false)
95
+ args << demo_cost_initial_const
96
+
97
+ # make an argument for expected life
98
+ expected_life = OpenStudio::Ruleset::OSArgument.makeIntegerArgument('expected_life', true)
99
+ expected_life.setDisplayName('Expected Life (whole years).')
100
+ expected_life.setDefaultValue(20)
101
+ args << expected_life
102
+
103
+ # make an argument for o&m cost
104
+ om_cost = OpenStudio::Ruleset::OSArgument.makeDoubleArgument('om_cost', true)
105
+ om_cost.setDisplayName('O & M Costs per Motor ($).')
106
+ om_cost.setDefaultValue(0.0)
107
+ args << om_cost
108
+
109
+ # make an argument for o&m frequency
110
+ om_frequency = OpenStudio::Ruleset::OSArgument.makeIntegerArgument('om_frequency', true)
111
+ om_frequency.setDisplayName('O & M Frequency (whole years).')
112
+ om_frequency.setDefaultValue(1)
113
+ args << om_frequency
114
+
115
+ return args
116
+ end # end the arguments method
117
+
118
+ # define what happens when the measure is cop
119
+ def run(model, runner, user_arguments)
120
+ super(model, runner, user_arguments)
121
+
122
+ # use the built-in error checking
123
+ if !runner.validateUserArguments(arguments(model), user_arguments)
124
+ return false
125
+ end
126
+
127
+ # assign the user inputs to variables
128
+ object = runner.getOptionalWorkspaceObjectChoiceValue('object', user_arguments, model) # model is passed in because of argument type
129
+ motor_eff = runner.getDoubleArgumentValue('motor_eff', user_arguments)
130
+ remove_costs = runner.getBoolArgumentValue('remove_costs', user_arguments)
131
+ material_cost = runner.getDoubleArgumentValue('material_cost', user_arguments)
132
+ demolition_cost = runner.getDoubleArgumentValue('demolition_cost', user_arguments)
133
+ years_until_costs_start = runner.getIntegerArgumentValue('years_until_costs_start', user_arguments)
134
+ demo_cost_initial_const = runner.getBoolArgumentValue('demo_cost_initial_const', user_arguments)
135
+ expected_life = runner.getIntegerArgumentValue('expected_life', user_arguments)
136
+ om_cost = runner.getDoubleArgumentValue('om_cost', user_arguments)
137
+ om_frequency = runner.getIntegerArgumentValue('om_frequency', user_arguments)
138
+
139
+ # check the loop for reasonableness
140
+ apply_to_all_loops = false
141
+ loop = nil
142
+ if object.empty?
143
+ handle = runner.getStringArgumentValue('loop', user_arguments)
144
+ if handle.empty?
145
+ runner.registerError('No loop was chosen.')
146
+ else
147
+ runner.registerError("The selected loop with handle '#{handle}' was not found in the model. It may have been removed by another measure.")
148
+ end
149
+ return false
150
+ else
151
+ if !object.get.to_Loop.empty?
152
+ loop = object.get.to_Loop.get
153
+ elsif !object.get.to_Building.empty?
154
+ apply_to_all_loops = true
155
+ else
156
+ runner.registerError('Script Error - argument not showing up as loop.')
157
+ return false
158
+ end
159
+ end # end of if loop.empty?
160
+
161
+ # check the user_name for reasonableness
162
+ if (motor_eff <= 1) || (motor_eff >= 5)
163
+ runner.registerWarning('Requested motor efficiency improvement is not between expected values of 1% and 5%')
164
+ end
165
+ # motor efficiency will be checked motor by motor to see warn if higher than 0.96 and error if not between or equal to 0 and 1
166
+
167
+ # set flags to use later
168
+ costs_requested = false
169
+
170
+ # set values to use later
171
+ yr0_capital_totalCosts_baseline = 0
172
+ yr0_capital_totalCosts_proposed = 0
173
+
174
+ # If demo_cost_initial_const is true then will be applied once in the lifecycle. Future replacements use the demo cost of the new construction.
175
+ demo_costs_of_baseline_objects = 0
176
+
177
+ # check costs for reasonableness
178
+ if material_cost.abs + demolition_cost.abs + om_cost.abs == 0
179
+ runner.registerInfo('No costs were requested for motors improvements.')
180
+ else
181
+ costs_requested = true
182
+ end
183
+
184
+ # check lifecycle arguments for reasonableness
185
+ if (years_until_costs_start < 0) && (years_until_costs_start > expected_life)
186
+ runner.registerError('Years until costs start should be a non-negative integer less than Expected Life.')
187
+ end
188
+ if (expected_life < 1) && (expected_life > 100)
189
+ runner.registerError('Choose an integer greater than 0 and less than or equal to 100 for Expected Life.')
190
+ end
191
+ if om_frequency < 1
192
+ runner.registerError('Choose an integer greater than 0 for O & M Frequency.')
193
+ end
194
+
195
+ # short def to make numbers pretty (converts 4125001.25641 to 4,125,001.26 or 4,125,001). The definition be called through this measure
196
+ def neat_numbers(number, roundto = 2) # round to 0 or 2)
197
+ if roundto == 2
198
+ number = format '%.2f', number
199
+ else
200
+ number = number.round
201
+ end
202
+ # regex to add commas
203
+ number.to_s.reverse.gsub(/([0-9]{3}(?=([0-9])))/, '\\1,').reverse
204
+ end # end def neat_numbers
205
+
206
+ # helper that loops through lifecycle costs getting total costs under "Construction" or "Salvage" category and add to counter if occurs during year 0
207
+ def get_total_costs_for_objects(objects)
208
+ counter = 0
209
+ objects.each do |object|
210
+ object_LCCs = object.lifeCycleCosts
211
+ object_LCCs.each do |object_LCC|
212
+ if (object_LCC.category == 'Construction') || (object_LCC.category == 'Salvage')
213
+ if object_LCC.yearsFromStart == 0
214
+ counter += object_LCC.totalCost
215
+ end
216
+ end
217
+ end
218
+ end
219
+ return counter
220
+ end # end of def get_total_costs_for_objects(objects)
221
+
222
+ # get loops for measure
223
+ if apply_to_all_loops
224
+ loops = model.getAirLoopHVACs
225
+ else
226
+ loops = []
227
+ loops << loop # only run on a single space type
228
+ end
229
+
230
+ # get cop values
231
+ initial_motor_efficiency_values = []
232
+ missing_initial_motor_efficiency = 0
233
+
234
+ # loop through air loops
235
+ loops.each do |loop|
236
+ supply_components = loop.supplyComponents
237
+
238
+ # find fans on loop
239
+ supply_components.each do |supply_component|
240
+ hVACComponent = supply_component.to_FanConstantVolume
241
+ if hVACComponent.empty?
242
+ hVACComponent = supply_component.to_FanVariableVolume
243
+ end
244
+ if hVACComponent.empty?
245
+ hVACComponent = supply_component.to_FanOnOff
246
+ end
247
+
248
+ # alter components of correct type
249
+ if !hVACComponent.empty?
250
+ hVACComponent = hVACComponent.get
251
+
252
+ # change and report changes to fans and motors
253
+ initial_motor_efficiency = hVACComponent.fanEfficiency
254
+ target_motor_efficiency = initial_motor_efficiency + motor_eff * 0.01
255
+ initial_motor_efficiency_values << initial_motor_efficiency
256
+ if target_motor_efficiency > 1
257
+ hVACComponent.setFanEfficiency(1.0)
258
+ runner.registerWarning("Requested efficiency of #{target_motor_efficiency * 100}% for #{hVACComponent.name} is not possible. Setting motor efficiency to 100%.")
259
+ elsif target_motor_efficiency < 0
260
+ hVACComponent.setFanEfficiency(0.0)
261
+ runner.registerWarning("Requested efficiency of #{target_motor_efficiency * 100}% for #{hVACComponent.name} is not possible. Setting motor efficiency to 0%.")
262
+ else
263
+ hVACComponent.setFanEfficiency(target_motor_efficiency)
264
+ runner.registerInfo("Changing the motor efficiency from #{initial_motor_efficiency * 100}% to #{target_motor_efficiency * 100}% for '#{hVACComponent.name}' onloop '#{loop.name}.'")
265
+ if target_motor_efficiency > 0.96
266
+ runner.registerWarning("Requested efficiency for #{hVACComponent.name} is greater than 96%.")
267
+ end
268
+ end
269
+
270
+ # get initial year 0 cost
271
+ yr0_capital_totalCosts_baseline += get_total_costs_for_objects([hVACComponent])
272
+
273
+ # demo value of baseline costs associated with unit
274
+ demo_LCCs = hVACComponent.lifeCycleCosts
275
+ demo_LCCs.each do |demo_LCC|
276
+ if demo_LCC.category == 'Salvage'
277
+ demo_costs_of_baseline_objects += demo_LCC.totalCost
278
+ end
279
+ end
280
+
281
+ # remove all old costs
282
+ if !hVACComponent.lifeCycleCosts.empty? && (remove_costs == true)
283
+ runner.registerInfo("Removing existing lifecycle cost objects associated with #{hVACComponent.name}")
284
+ removed_costs = hVACComponent.removeLifeCycleCosts
285
+ end
286
+
287
+ # add new costs
288
+ if costs_requested == true
289
+
290
+ # adding new cost items
291
+ lcc_mat = OpenStudio::Model::LifeCycleCost.createLifeCycleCost("LCC_Mat - #{hVACComponent.name}", hVACComponent, material_cost, 'CostPerEach', 'Construction', expected_life, years_until_costs_start)
292
+ # cost for if demo_initial_Construction == true is added at the end of the measure
293
+ lcc_demo = OpenStudio::Model::LifeCycleCost.createLifeCycleCost("LCC_Demo - #{hVACComponent.name}", hVACComponent, demolition_cost, 'CostPerEach', 'Salvage', expected_life, years_until_costs_start + expected_life)
294
+ lcc_om = OpenStudio::Model::LifeCycleCost.createLifeCycleCost("LCC_OM - #{hVACComponent.name}", hVACComponent, om_cost, 'CostPerEach', 'Maintenance', om_frequency, 0)
295
+
296
+ # get final year 0 cost
297
+ yr0_capital_totalCosts_proposed += get_total_costs_for_objects([hVACComponent])
298
+
299
+ end # end of costs_requested == true
300
+
301
+ end # end if not hVACComponent.empty?
302
+ end # end supply_components.each do
303
+ end # end loops.each do
304
+
305
+ # add one time demo cost of removed windows if appropriate
306
+ if demo_cost_initial_const == true
307
+ building = model.getBuilding
308
+ lcc_baseline_demo = OpenStudio::Model::LifeCycleCost.createLifeCycleCost('LCC_baseline_demo', building, demo_costs_of_baseline_objects, 'CostPerEach', 'Salvage', 0, years_until_costs_start).get # using 0 for repeat period since one time cost.
309
+ runner.registerInfo("Adding one time cost of $#{neat_numbers(lcc_baseline_demo.totalCost, 0)} related to demolition of baseline objects.")
310
+
311
+ # if demo occurs on year 0 then add to initial capital cost counter
312
+ if lcc_baseline_demo.yearsFromStart == 0
313
+ yr0_capital_totalCosts_proposed += lcc_baseline_demo.totalCost
314
+ end
315
+ end
316
+
317
+ if initial_motor_efficiency_values.size + missing_initial_motor_efficiency == 0
318
+ runner.registerAsNotApplicable('The affected loop(s) does not contain any fans, the model will not be altered.')
319
+ return true
320
+ end
321
+
322
+ # reporting initial condition of model
323
+ runner.registerInitialCondition("The starting motor efficiency values in affected loop(s) range from #{initial_motor_efficiency_values.min * 100}% to #{initial_motor_efficiency_values.max * 100}%. Initial year 0 capital costs for affected fans is $#{neat_numbers(yr0_capital_totalCosts_baseline, 0)}.")
324
+
325
+ # reporting final condition of model
326
+ runner.registerFinalCondition("#{initial_motor_efficiency_values.size + missing_initial_motor_efficiency} fans had motor efficiency values set to altered. Final year 0 capital costs for affected fans is $#{neat_numbers(yr0_capital_totalCosts_proposed, 0)}.")
327
+
328
+ return true
329
+ end # end the cop method
330
+ end # end the measure
331
+
332
+ # this allows the measure to be used by the application
333
+ ImproveFanTotalEfficiencybyPercentage.new.registerWithApplication
@@ -0,0 +1,150 @@
1
+ <measure>
2
+ <schema_version>3.0</schema_version>
3
+ <name>improve_fan_total_efficiencyby_percentage</name>
4
+ <uid>ebeca0aa-a432-4283-a714-17116f7c8f8c</uid>
5
+ <version_id>2988238d-43fd-4d62-883b-130aecd70a90</version_id>
6
+ <version_modified>20190212T002510Z</version_modified>
7
+ <xml_checksum>F78494F2</xml_checksum>
8
+ <class_name>ImproveFanTotalEfficiencybyPercentage</class_name>
9
+ <display_name>Improve Fan Total Efficiency by Percentage</display_name>
10
+ <description></description>
11
+ <modeler_description></modeler_description>
12
+ <arguments>
13
+ <argument>
14
+ <name>object</name>
15
+ <display_name>Choose an Air Loop to Alter.</display_name>
16
+ <type>Choice</type>
17
+ <required>true</required>
18
+ <model_dependent>false</model_dependent>
19
+ <default_value>*All Air Loops*</default_value>
20
+ <choices>
21
+ <choice>
22
+ <value>{be2619d7-0a6a-4a6f-87eb-90118a121a42}</value>
23
+ <display_name>*All Air Loops*</display_name>
24
+ </choice>
25
+ </choices>
26
+ </argument>
27
+ <argument>
28
+ <name>motor_eff</name>
29
+ <display_name>Fan Total Efficiency Improvement(%).</display_name>
30
+ <type>Double</type>
31
+ <required>true</required>
32
+ <model_dependent>false</model_dependent>
33
+ <default_value>3</default_value>
34
+ </argument>
35
+ <argument>
36
+ <name>remove_costs</name>
37
+ <display_name>Remove Baseline Costs From Effected Fans?</display_name>
38
+ <type>Boolean</type>
39
+ <required>true</required>
40
+ <model_dependent>false</model_dependent>
41
+ <default_value>false</default_value>
42
+ <choices>
43
+ <choice>
44
+ <value>true</value>
45
+ <display_name>true</display_name>
46
+ </choice>
47
+ <choice>
48
+ <value>false</value>
49
+ <display_name>false</display_name>
50
+ </choice>
51
+ </choices>
52
+ </argument>
53
+ <argument>
54
+ <name>material_cost</name>
55
+ <display_name>Material and Installation Costs per Motor ($).</display_name>
56
+ <type>Double</type>
57
+ <required>true</required>
58
+ <model_dependent>false</model_dependent>
59
+ <default_value>0</default_value>
60
+ </argument>
61
+ <argument>
62
+ <name>demolition_cost</name>
63
+ <display_name>Demolition Costs per Motor ($).</display_name>
64
+ <type>Double</type>
65
+ <required>true</required>
66
+ <model_dependent>false</model_dependent>
67
+ <default_value>0</default_value>
68
+ </argument>
69
+ <argument>
70
+ <name>years_until_costs_start</name>
71
+ <display_name>Years Until Costs Start (whole years).</display_name>
72
+ <type>Integer</type>
73
+ <required>true</required>
74
+ <model_dependent>false</model_dependent>
75
+ <default_value>0</default_value>
76
+ </argument>
77
+ <argument>
78
+ <name>demo_cost_initial_const</name>
79
+ <display_name>Demolition Costs Occur During Initial Construction?</display_name>
80
+ <type>Boolean</type>
81
+ <required>true</required>
82
+ <model_dependent>false</model_dependent>
83
+ <default_value>false</default_value>
84
+ <choices>
85
+ <choice>
86
+ <value>true</value>
87
+ <display_name>true</display_name>
88
+ </choice>
89
+ <choice>
90
+ <value>false</value>
91
+ <display_name>false</display_name>
92
+ </choice>
93
+ </choices>
94
+ </argument>
95
+ <argument>
96
+ <name>expected_life</name>
97
+ <display_name>Expected Life (whole years).</display_name>
98
+ <type>Integer</type>
99
+ <required>true</required>
100
+ <model_dependent>false</model_dependent>
101
+ <default_value>20</default_value>
102
+ </argument>
103
+ <argument>
104
+ <name>om_cost</name>
105
+ <display_name>O &amp; M Costs per Motor ($).</display_name>
106
+ <type>Double</type>
107
+ <required>true</required>
108
+ <model_dependent>false</model_dependent>
109
+ <default_value>0</default_value>
110
+ </argument>
111
+ <argument>
112
+ <name>om_frequency</name>
113
+ <display_name>O &amp; M Frequency (whole years).</display_name>
114
+ <type>Integer</type>
115
+ <required>true</required>
116
+ <model_dependent>false</model_dependent>
117
+ <default_value>1</default_value>
118
+ </argument>
119
+ </arguments>
120
+ <outputs/>
121
+ <provenances/>
122
+ <tags>
123
+ <tag>HVAC.Distribution</tag>
124
+ </tags>
125
+ <attributes>
126
+ <attribute>
127
+ <name>Measure Type</name>
128
+ <value>ModelMeasure</value>
129
+ <datatype>string</datatype>
130
+ </attribute>
131
+ <attribute>
132
+ <name>Uses SketchUp API</name>
133
+ <value>false</value>
134
+ <datatype>boolean</datatype>
135
+ </attribute>
136
+ </attributes>
137
+ <files>
138
+ <file>
139
+ <version>
140
+ <software_program>OpenStudio</software_program>
141
+ <identifier>1.0.3</identifier>
142
+ <min_compatible>1.0.3</min_compatible>
143
+ </version>
144
+ <filename>measure.rb</filename>
145
+ <filetype>rb</filetype>
146
+ <usage_type>script</usage_type>
147
+ <checksum>7ED92CF1</checksum>
148
+ </file>
149
+ </files>
150
+ </measure>