urbanopt-reporting 0.3.4 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -3
- data/CHANGELOG.md +34 -0
- data/Rakefile +16 -6
- data/doc_templates/copyright_ruby.txt +17 -7
- data/lib/measures/default_feature_reports/measure.rb +120 -93
- data/lib/measures/default_feature_reports/measure.xml +11 -11
- data/lib/measures/export_modelica_loads/LICENSE.md +23 -23
- data/lib/measures/export_modelica_loads/measure.rb +48 -56
- data/lib/measures/export_modelica_loads/measure.xml +21 -21
- data/lib/measures/export_time_series_modelica/LICENSE.md +27 -1
- data/lib/measures/export_time_series_modelica/measure.rb +41 -35
- data/lib/measures/export_time_series_modelica/measure.xml +18 -18
- data/lib/measures/export_time_series_modelica/resources/os_lib_helper_methods.rb +39 -34
- data/lib/urbanopt/reporting.rb +16 -6
- data/lib/urbanopt/reporting/default_reports.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/construction_cost.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/date.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/distributed_generation.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/end_use.rb +54 -23
- data/lib/urbanopt/reporting/default_reports/end_uses.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/extension.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/feature_report.rb +18 -6
- data/lib/urbanopt/reporting/default_reports/generator.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/location.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/logger.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/power_distribution.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/program.rb +17 -7
- data/lib/urbanopt/reporting/default_reports/reporting_period.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/scenario_report.rb +25 -13
- data/lib/urbanopt/reporting/default_reports/schema/scenario_csv_columns.txt +11 -10
- data/lib/urbanopt/reporting/default_reports/schema/scenario_schema.json +4 -1
- data/lib/urbanopt/reporting/default_reports/solar_pv.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/storage.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/thermal_storage.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/timeseries_csv.rb +17 -7
- data/lib/urbanopt/reporting/default_reports/validator.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/wind.rb +16 -6
- data/lib/urbanopt/reporting/derived_extension.rb +16 -6
- data/lib/urbanopt/reporting/version.rb +17 -7
- data/urbanopt-reporting-gem.gemspec +3 -3
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d4e162fc807ce5990af2325b9d38447685379a8e799150959b983f6a0d1ae7e
|
4
|
+
data.tar.gz: 9eca8a86a802e4d4377a06bd69f539c94df3af44eee0948943e5d62325abb504
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a9373a57c740179b972dee996a9aec5ed67bea9ddcb788060c7c6d87f197bbad13943f607245ad84faeb520832f8550ba97f20df3bf78448d8059b9d419fb81
|
7
|
+
data.tar.gz: 7e15367191df22e75ca8d0e5665d6d400f0223e051c4571fb26fbd7f1ae38a534ab2d176af68f17c45180afe427d8143f10938fba9bc28f024bd1a58d61da4ac
|
data/.rubocop.yml
CHANGED
@@ -3,8 +3,7 @@ AllCops:
|
|
3
3
|
- gems/**/*
|
4
4
|
- measures/**/*
|
5
5
|
- spec/files/**/measures/**/*
|
6
|
-
|
6
|
+
require: rubocop-performance
|
7
7
|
|
8
8
|
inherit_from:
|
9
|
-
- http://s3.amazonaws.com/openstudio-resources/styles/
|
10
|
-
|
9
|
+
- http://s3.amazonaws.com/openstudio-resources/styles/rubocop_v4.yml
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,39 @@
|
|
1
1
|
# URBANopt Reporting Gem
|
2
2
|
|
3
|
+
## Version 0.4.1
|
4
|
+
Date Range: 04/27/23 - 07/01/21
|
5
|
+
|
6
|
+
- Fixed [#80](https://github.com/urbanopt/urbanopt-reporting-gem/issues/80), Update rubocop configs to v4
|
7
|
+
-
|
8
|
+
## Version 0.4.0
|
9
|
+
|
10
|
+
Date Range: 03/27/21 - 04/26/21
|
11
|
+
|
12
|
+
- Update dependencies for OpenStudio 3.2.0 and Ruby 2.7
|
13
|
+
|
14
|
+
## Version 0.3.7
|
15
|
+
|
16
|
+
Date Range: 02/12/21 - 03/26/21
|
17
|
+
|
18
|
+
- Fixed [#47]( https://github.com/urbanopt/urbanopt-reporting-gem/issues/47 ), Default features report bugfixes and updates
|
19
|
+
- Fixed [#67]( https://github.com/urbanopt/urbanopt-reporting-gem/issues/67 ), Update copyrights for 2021
|
20
|
+
- Fixed [#70]( https://github.com/urbanopt/urbanopt-reporting-gem/issues/70 ), feature report bug fix
|
21
|
+
|
22
|
+
## Version 0.3.6
|
23
|
+
|
24
|
+
Date Range: 02/05/21 - 02/11/21
|
25
|
+
|
26
|
+
- Fixed [#64]( https://github.com/urbanopt/urbanopt-reporting-gem/issues/64 ), EnergyPlus changed output fuel names in version 9.4
|
27
|
+
|
28
|
+
## Version 0.3.5
|
29
|
+
|
30
|
+
Date Range: 01/16/21 - 02/04/21
|
31
|
+
|
32
|
+
- Fixed [#58]( https://github.com/urbanopt/urbanopt-reporting-gem/issues/58 ), Feature report saving bug fix.
|
33
|
+
- Fixed [#60]( https://github.com/urbanopt/urbanopt-reporting-gem/issues/60 ), Added EV/ ExteriorEquipment results to csv and json reports
|
34
|
+
- Fixed [#61]( https://github.com/urbanopt/urbanopt-reporting-gem/issues/61 ), Enhance the aggregation of enduses.
|
35
|
+
|
36
|
+
|
3
37
|
## Version 0.3.4
|
4
38
|
|
5
39
|
Date Range: 01/14/21 - 01/15/21
|
data/Rakefile
CHANGED
@@ -1,21 +1,31 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
2
|
+
# URBANopt™, Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other
|
3
3
|
# contributors. All rights reserved.
|
4
|
-
|
4
|
+
|
5
5
|
# Redistribution and use in source and binary forms, with or without modification,
|
6
6
|
# are permitted provided that the following conditions are met:
|
7
|
-
|
7
|
+
|
8
8
|
# Redistributions of source code must retain the above copyright notice, this list
|
9
9
|
# of conditions and the following disclaimer.
|
10
|
-
|
10
|
+
|
11
11
|
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
12
|
# list of conditions and the following disclaimer in the documentation and/or other
|
13
13
|
# materials provided with the distribution.
|
14
|
-
|
14
|
+
|
15
15
|
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
16
|
# used to endorse or promote products derived from this software without specific
|
17
17
|
# prior written permission.
|
18
|
-
|
18
|
+
|
19
|
+
# Redistribution of this software, without modification, must refer to the software
|
20
|
+
# by the same designation. Redistribution of a modified version of this software
|
21
|
+
# (i) may not refer to the modified version by the same designation, or by any
|
22
|
+
# confusingly similar designation, and (ii) must refer to the underlying software
|
23
|
+
# originally provided by Alliance as “URBANopt”. Except to comply with the foregoing,
|
24
|
+
# the term “URBANopt”, or any confusingly similar designation may not be used to
|
25
|
+
# refer to any modified version of this software or any modified version of the
|
26
|
+
# underlying software originally provided by Alliance without the prior written
|
27
|
+
# consent of Alliance.
|
28
|
+
|
19
29
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
30
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
31
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
@@ -1,21 +1,31 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
2
|
+
# URBANopt™, Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other
|
3
3
|
# contributors. All rights reserved.
|
4
|
-
|
4
|
+
|
5
5
|
# Redistribution and use in source and binary forms, with or without modification,
|
6
6
|
# are permitted provided that the following conditions are met:
|
7
|
-
|
7
|
+
|
8
8
|
# Redistributions of source code must retain the above copyright notice, this list
|
9
9
|
# of conditions and the following disclaimer.
|
10
|
-
|
10
|
+
|
11
11
|
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
12
|
# list of conditions and the following disclaimer in the documentation and/or other
|
13
13
|
# materials provided with the distribution.
|
14
|
-
|
14
|
+
|
15
15
|
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
16
|
# used to endorse or promote products derived from this software without specific
|
17
17
|
# prior written permission.
|
18
|
-
|
18
|
+
|
19
|
+
# Redistribution of this software, without modification, must refer to the software
|
20
|
+
# by the same designation. Redistribution of a modified version of this software
|
21
|
+
# (i) may not refer to the modified version by the same designation, or by any
|
22
|
+
# confusingly similar designation, and (ii) must refer to the underlying software
|
23
|
+
# originally provided by Alliance as “URBANopt”. Except to comply with the foregoing,
|
24
|
+
# the term “URBANopt”, or any confusingly similar designation may not be used to
|
25
|
+
# refer to any modified version of this software or any modified version of the
|
26
|
+
# underlying software originally provided by Alliance without the prior written
|
27
|
+
# consent of Alliance.
|
28
|
+
|
19
29
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
30
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
31
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
@@ -26,4 +36,4 @@
|
|
26
36
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
27
37
|
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
28
38
|
# OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
-
# *********************************************************************************
|
39
|
+
# *********************************************************************************
|
@@ -1,21 +1,31 @@
|
|
1
1
|
# *********************************************************************************
|
2
|
-
# URBANopt
|
2
|
+
# URBANopt™, Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other
|
3
3
|
# contributors. All rights reserved.
|
4
|
-
|
4
|
+
|
5
5
|
# Redistribution and use in source and binary forms, with or without modification,
|
6
6
|
# are permitted provided that the following conditions are met:
|
7
|
-
|
7
|
+
|
8
8
|
# Redistributions of source code must retain the above copyright notice, this list
|
9
9
|
# of conditions and the following disclaimer.
|
10
|
-
|
10
|
+
|
11
11
|
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
12
|
# list of conditions and the following disclaimer in the documentation and/or other
|
13
13
|
# materials provided with the distribution.
|
14
|
-
|
14
|
+
|
15
15
|
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
16
|
# used to endorse or promote products derived from this software without specific
|
17
17
|
# prior written permission.
|
18
|
-
|
18
|
+
|
19
|
+
# Redistribution of this software, without modification, must refer to the software
|
20
|
+
# by the same designation. Redistribution of a modified version of this software
|
21
|
+
# (i) may not refer to the modified version by the same designation, or by any
|
22
|
+
# confusingly similar designation, and (ii) must refer to the underlying software
|
23
|
+
# originally provided by Alliance as “URBANopt”. Except to comply with the foregoing,
|
24
|
+
# the term “URBANopt”, or any confusingly similar designation may not be used to
|
25
|
+
# refer to any modified version of this software or any modified version of the
|
26
|
+
# underlying software originally provided by Alliance without the prior written
|
27
|
+
# consent of Alliance.
|
28
|
+
|
19
29
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
30
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
31
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
@@ -101,10 +111,9 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
101
111
|
def fuel_types
|
102
112
|
fuel_types = {
|
103
113
|
'Electricity' => 'Electricity',
|
104
|
-
'
|
105
|
-
'
|
114
|
+
'NaturalGas' => 'Natural Gas',
|
115
|
+
'FuelOilNo2' => 'Fuel Oil #2',
|
106
116
|
'Propane' => 'Propane',
|
107
|
-
'AdditionalFuel' => 'Additional Fuel',
|
108
117
|
'DistrictCooling' => 'District Cooling',
|
109
118
|
'DistrictHeating' => 'District Heating',
|
110
119
|
'Water' => 'Water'
|
@@ -113,6 +122,11 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
113
122
|
return fuel_types
|
114
123
|
end
|
115
124
|
|
125
|
+
# define other fuel types
|
126
|
+
def other_fuels
|
127
|
+
return ['Gasoline', 'Diesel', 'Coal', 'Fuel Oil No 1', 'Other Fuel 1', 'Steam']
|
128
|
+
end
|
129
|
+
|
116
130
|
# define enduses
|
117
131
|
def end_uses
|
118
132
|
end_uses = {
|
@@ -177,13 +191,13 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
177
191
|
end
|
178
192
|
end
|
179
193
|
|
180
|
-
# OtherFuels
|
181
|
-
other_fuels = ['FuelOil#1', 'Diesel', 'Gasoline', 'Coal', 'Steam']
|
194
|
+
# Create a custom meter for OtherFuels
|
182
195
|
other_fuel_uses = ['HeatRejection', 'Heating', 'WaterSystems', 'InteriorEquipment']
|
183
|
-
custom_meter_facility = 'Meter:Custom,OtherFuels:Facility,
|
196
|
+
custom_meter_facility = 'Meter:Custom,OtherFuels:Facility,OtherFuel2'
|
184
197
|
other_fuel_uses.each do |end_use|
|
185
|
-
custom_meter = "Meter:Custom,#{end_use}:OtherFuels,
|
198
|
+
custom_meter = "Meter:Custom,#{end_use}:OtherFuels,OtherFuel2"
|
186
199
|
other_fuels.each do |other_fuel|
|
200
|
+
other_fuel = other_fuel.gsub(' ', '')
|
187
201
|
result << OpenStudio::IdfObject.load("Output:Meter,#{end_use}:#{other_fuel},#{reporting_frequency};").get
|
188
202
|
custom_meter_facility += ",,#{end_use}:#{other_fuel}"
|
189
203
|
custom_meter += ",,#{end_use}:#{other_fuel}"
|
@@ -198,9 +212,10 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
198
212
|
# Request the output for each end use/fuel type combination
|
199
213
|
result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,Electricity:Facility,#{reporting_frequency};").get
|
200
214
|
result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,ElectricityProduced:Facility,#{reporting_frequency};").get
|
201
|
-
result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,
|
215
|
+
result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,NaturalGas:Facility,#{reporting_frequency};").get
|
202
216
|
result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,DistrictCooling:Facility,#{reporting_frequency};").get
|
203
217
|
result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,DistrictHeating:Facility,#{reporting_frequency};").get
|
218
|
+
|
204
219
|
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,Cooling:Electricity,#{reporting_frequency};").get
|
205
220
|
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,Heating:Electricity,#{reporting_frequency};").get
|
206
221
|
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,InteriorLights:Electricity,#{reporting_frequency};").get
|
@@ -209,18 +224,22 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
209
224
|
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,Fans:Electricity,#{reporting_frequency};").get
|
210
225
|
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,Pumps:Electricity,#{reporting_frequency};").get
|
211
226
|
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,WaterSystems:Electricity,#{reporting_frequency};").get
|
212
|
-
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,Heating:
|
213
|
-
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,WaterSystems:
|
214
|
-
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,InteriorEquipment:
|
227
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,Heating:NaturalGas,#{reporting_frequency};").get
|
228
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,WaterSystems:NaturalGas,#{reporting_frequency};").get
|
229
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,InteriorEquipment:NaturalGas,#{reporting_frequency};").get
|
215
230
|
result << OpenStudio::IdfObject.load('Output:Variable,*,Heating Coil Heating Rate,hourly; !- HVAC Average [W];').get
|
231
|
+
# result << OpenStudio::IdfObject.load("Output:Variable,*,Exterior Equipment:Electric Vehicles,#{reporting_frequency};").get
|
216
232
|
|
217
233
|
timeseries_data = ['District Cooling Chilled Water Rate', 'District Cooling Mass Flow Rate',
|
218
234
|
'District Cooling Inlet Temperature', 'District Cooling Outlet Temperature',
|
219
235
|
'District Heating Hot Water Rate', 'District Heating Mass Flow Rate',
|
220
236
|
'District Heating Inlet Temperature', 'District Heating Outlet Temperature', 'Cooling Coil Total Cooling Rate',
|
221
|
-
'Heating Coil Heating Rate']
|
237
|
+
'Heating Coil Heating Rate', 'ExteriorEquipment:Electricity']
|
222
238
|
|
223
239
|
tes_timeseries_data = ['Ice Thermal Storage End Fraction', 'Cooling coil Ice Thermal Storage End Fraction']
|
240
|
+
|
241
|
+
ev_timeseries_data = ['Exterior Equipment:Electric Vehicles']
|
242
|
+
|
224
243
|
timeseries_data += tes_timeseries_data
|
225
244
|
|
226
245
|
timeseries_data.each do |ts|
|
@@ -389,27 +408,36 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
389
408
|
# unconditioned_area
|
390
409
|
unconditioned_area = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='Building Area' AND RowName='Unconditioned Building Area' AND ColumnName='Area'")
|
391
410
|
feature_report.program.unconditioned_area_sqft = convert_units(unconditioned_area, 'm^2', 'ft^2')
|
392
|
-
|
393
|
-
|
394
|
-
|
411
|
+
if building.standardsBuildingType.is_initialized
|
412
|
+
floor_area -= unconditioned_area if ['Residential'].include?(building.standardsBuildingType.get) # conditioned floor area only
|
413
|
+
end
|
395
414
|
|
396
415
|
# maximum_number_of_stories
|
397
416
|
number_of_stories = building.standardsNumberOfStories.get if building.standardsNumberOfStories.is_initialized
|
398
417
|
number_of_stories ||= 1
|
399
418
|
feature_report.program.maximum_number_of_stories = number_of_stories
|
400
419
|
|
401
|
-
# maximum_roof_height
|
402
|
-
floor_to_floor_height = building.nominalFloortoFloorHeight.to_f
|
403
|
-
maximum_roof_height = number_of_stories * floor_to_floor_height
|
404
|
-
feature_report.program.maximum_roof_height_ft = maximum_roof_height
|
405
|
-
|
406
420
|
# maximum_number_of_stories_above_ground
|
407
421
|
number_of_stories_above_ground = building.standardsNumberOfAboveGroundStories.get if building.standardsNumberOfAboveGroundStories.is_initialized
|
408
422
|
number_of_stories_above_ground ||= 1
|
409
423
|
feature_report.program.maximum_number_of_stories_above_ground = number_of_stories_above_ground
|
410
424
|
|
425
|
+
# maximum_roof_height
|
426
|
+
floor_to_floor_height = building.nominalFloortoFloorHeight.get if building.nominalFloortoFloorHeight.is_initialized
|
427
|
+
floor_to_floor_height ||= 8
|
428
|
+
feature_report.program.maximum_roof_height_ft = feature_report.program.maximum_number_of_stories_above_ground * floor_to_floor_height
|
429
|
+
|
430
|
+
# footprint_area
|
431
|
+
if building.standardsBuildingType.is_initialized
|
432
|
+
if not ['Residential'].include?(building.standardsBuildingType.get)
|
433
|
+
feature_report.program.footprint_area_sqft = feature_report.program.floor_area_sqft / number_of_stories
|
434
|
+
else
|
435
|
+
feature_report.program.footprint_area_sqft = convert_units(floor_area, 'm^2', 'ft^2') / building.additionalProperties.getFeatureAsInteger('NumberOfConditionedStories').get
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
411
439
|
# number_of_residential_units
|
412
|
-
number_of_living_units = building.standardsNumberOfLivingUnits.
|
440
|
+
number_of_living_units = building.standardsNumberOfLivingUnits.get if building.standardsNumberOfLivingUnits.is_initialized
|
413
441
|
number_of_living_units ||= 1
|
414
442
|
feature_report.program.number_of_residential_units = number_of_living_units
|
415
443
|
|
@@ -430,6 +458,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
430
458
|
else
|
431
459
|
building_type = building_type.get
|
432
460
|
end
|
461
|
+
next if ['Residential'].include?(building_type) # space types with empty building type fields will inherit from the building object
|
433
462
|
space_type_areas[building_type] = 0 if space_type_areas[building_type].nil?
|
434
463
|
space_type_areas[building_type] += convert_units(space_type.floorArea, 'm^2', 'ft^2')
|
435
464
|
end
|
@@ -605,13 +634,13 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
605
634
|
if begin_month == 1 && begin_day_of_month == 1 && end_month == 12 && end_day_of_month == 31
|
606
635
|
# calculate site EUI
|
607
636
|
site_EUI_kwh_per_m2 = feature_report.reporting_periods[0].total_site_energy_kwh / floor_area
|
608
|
-
site_EUI_kbtu_per_ft2 = convert_units(total_site_energy, 'GJ', 'kBtu') /
|
637
|
+
site_EUI_kbtu_per_ft2 = convert_units(total_site_energy, 'GJ', 'kBtu') / convert_units(floor_area, 'm^2', 'ft^2')
|
609
638
|
# add site EUI to feature report
|
610
639
|
feature_report.reporting_periods[0].site_EUI_kwh_per_m2 = site_EUI_kwh_per_m2
|
611
640
|
feature_report.reporting_periods[0].site_EUI_kbtu_per_ft2 = site_EUI_kbtu_per_ft2
|
612
641
|
# calculate source EUI
|
613
642
|
source_EUI_kwh_per_m2 = feature_report.reporting_periods[0].total_source_energy_kwh / floor_area
|
614
|
-
source_EUI_kbtu_per_ft2 = convert_units(total_source_energy, 'GJ', 'kBtu') /
|
643
|
+
source_EUI_kbtu_per_ft2 = convert_units(total_source_energy, 'GJ', 'kBtu') / convert_units(floor_area, 'm^2', 'ft^2')
|
615
644
|
# add source EUI to feature report
|
616
645
|
feature_report.reporting_periods[0].source_EUI_kwh_per_m2 = source_EUI_kwh_per_m2
|
617
646
|
feature_report.reporting_periods[0].source_EUI_kbtu_per_ft2 = source_EUI_kbtu_per_ft2
|
@@ -634,40 +663,45 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
634
663
|
feature_report.reporting_periods[0].natural_gas_kwh = convert_units(natural_gas, 'GJ', 'kWh')
|
635
664
|
|
636
665
|
# propane
|
637
|
-
propane = sql_query(runner, sql_file, '
|
638
|
-
feature_report.reporting_periods[0].propane_kwh =
|
639
|
-
feature_report.reporting_periods[0].propane_kwh = convert_units(propane, 'GJ', 'kWh') unless propane.nil?
|
666
|
+
propane = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='Propane'")
|
667
|
+
feature_report.reporting_periods[0].propane_kwh = convert_units(propane, 'GJ', 'kWh')
|
640
668
|
|
641
669
|
# fuel_oil
|
642
|
-
fuel_oil = sql_query(runner, sql_file, '
|
643
|
-
feature_report.reporting_periods[0].fuel_oil_kwh =
|
644
|
-
feature_report.reporting_periods[0].fuel_oil_kwh = convert_units(fuel_oil, 'GJ', 'kWh') unless fuel_oil.nil?
|
670
|
+
fuel_oil = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='Fuel Oil No 2'")
|
671
|
+
feature_report.reporting_periods[0].fuel_oil_kwh = convert_units(fuel_oil, 'GJ', 'kWh')
|
645
672
|
|
646
673
|
# other_fuels
|
647
|
-
|
648
|
-
|
674
|
+
gasoline = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='Gasoline'")
|
675
|
+
diesel = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='Diesel'")
|
676
|
+
coal = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='Coal'")
|
677
|
+
fueloilno1 = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='Fuel Oil No 1'")
|
678
|
+
otherfuel1 = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='Other Fuel 1'")
|
679
|
+
steam = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='Steam'")
|
680
|
+
# ensure not nil
|
649
681
|
feature_report.reporting_periods[0].other_fuels_kwh = 0.0
|
650
|
-
feature_report.reporting_periods[0].other_fuels_kwh
|
651
|
-
feature_report.reporting_periods[0].other_fuels_kwh
|
652
|
-
feature_report.reporting_periods[0].other_fuels_kwh
|
682
|
+
feature_report.reporting_periods[0].other_fuels_kwh += convert_units(gasoline, 'GJ', 'kWh') unless gasoline.nil?
|
683
|
+
feature_report.reporting_periods[0].other_fuels_kwh += convert_units(diesel, 'GJ', 'kWh') unless diesel.nil?
|
684
|
+
feature_report.reporting_periods[0].other_fuels_kwh += convert_units(coal, 'GJ', 'kWh') unless coal.nil?
|
685
|
+
feature_report.reporting_periods[0].other_fuels_kwh += convert_units(fueloilno1, 'GJ', 'kWh') unless fueloilno1.nil?
|
686
|
+
feature_report.reporting_periods[0].other_fuels_kwh += convert_units(otherfuel1, 'GJ', 'kWh') unless otherfuel1.nil?
|
687
|
+
feature_report.reporting_periods[0].other_fuels_kwh += convert_units(steam, 'GJ', 'kWh') unless steam.nil?
|
653
688
|
|
654
689
|
# district_cooling
|
655
690
|
district_cooling = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='District Cooling'")
|
656
691
|
feature_report.reporting_periods[0].district_cooling_kwh = convert_units(district_cooling, 'GJ', 'kWh')
|
657
|
-
|
658
|
-
feature_report.reporting_periods[0].district_cooling_kwh = 0.0 if
|
692
|
+
if building.standardsBuildingType.is_initialized
|
693
|
+
feature_report.reporting_periods[0].district_cooling_kwh = 0.0 if ['Residential'].include?(building.standardsBuildingType.get)
|
659
694
|
end
|
660
695
|
|
661
696
|
# district_heating
|
662
697
|
district_heating = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='District Heating'")
|
663
698
|
feature_report.reporting_periods[0].district_heating_kwh = convert_units(district_heating, 'GJ', 'kWh')
|
664
|
-
|
665
|
-
feature_report.reporting_periods[0].district_heating_kwh = 0.0 if
|
699
|
+
if building.standardsBuildingType.is_initialized
|
700
|
+
feature_report.reporting_periods[0].district_heating_kwh = 0.0 if ['Residential'].include?(building.standardsBuildingType.get)
|
666
701
|
end
|
667
702
|
|
668
703
|
# water
|
669
704
|
water = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='Water'")
|
670
|
-
# feature_report.reporting_periods[0].water = convert_units(water, 'm3', 'ft3')
|
671
705
|
feature_report.reporting_periods[0].water_qbft = water
|
672
706
|
|
673
707
|
# electricity_produced
|
@@ -678,34 +712,11 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
678
712
|
|
679
713
|
# get fuel type as listed in the sql file
|
680
714
|
fueltypes = fuel_types.values
|
681
|
-
fueltypes.delete('Propane')
|
682
|
-
fueltypes.delete('Fuel Oil #2')
|
683
715
|
|
684
716
|
# get enduses as listed in the sql file
|
685
717
|
enduses = end_uses.values
|
686
718
|
enduses.delete('Facility')
|
687
719
|
|
688
|
-
# propane / fuel_oil
|
689
|
-
['Propane', 'Fuel Oil #2'].each do |ft|
|
690
|
-
end_uses.keys.each do |eu|
|
691
|
-
next if eu == 'Facility'
|
692
|
-
|
693
|
-
sql_r = sql_query(runner, sql_file, 'EnergyMeters', "TableName='Annual and Peak Values - Other' AND RowName='#{eu}:#{ft.tr(' ', '')}' AND ColumnName='Annual Value'")
|
694
|
-
|
695
|
-
# report each query in its corresponding feature report obeject
|
696
|
-
x = ft.tr(' ', '_').downcase
|
697
|
-
x = x.gsub('_#2', '')
|
698
|
-
x_u = x + '_kwh'
|
699
|
-
m = feature_report.reporting_periods[0].end_uses.send(x_u)
|
700
|
-
|
701
|
-
y = end_uses[eu].tr(' ', '_').downcase
|
702
|
-
if sql_r.nil?
|
703
|
-
sql_r = 0.0
|
704
|
-
end
|
705
|
-
m.send("#{y}=", convert_units(sql_r, 'GJ', 'kWh'))
|
706
|
-
end
|
707
|
-
end
|
708
|
-
|
709
720
|
# loop through fuel types and enduses to fill in sql_query method
|
710
721
|
fueltypes.each do |ft|
|
711
722
|
enduses.each do |eu|
|
@@ -715,12 +726,10 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
715
726
|
x = ft.tr(' ', '_').downcase
|
716
727
|
if x.include? 'water'
|
717
728
|
x_u = x + '_qbft'
|
718
|
-
else
|
729
|
+
else
|
730
|
+
x = x.gsub('_#2', '')
|
719
731
|
x_u = x + '_kwh'
|
720
732
|
end
|
721
|
-
if x_u == 'additional_fuel_kwh'
|
722
|
-
x_u = 'other_fuels_kwh'
|
723
|
-
end
|
724
733
|
m = feature_report.reporting_periods[0].end_uses.send(x_u)
|
725
734
|
|
726
735
|
y = eu.tr(' ', '_').downcase
|
@@ -729,17 +738,34 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
729
738
|
sql_r = 0.0
|
730
739
|
end
|
731
740
|
sql_r = convert_units(sql_r, 'GJ', 'kWh')
|
732
|
-
|
733
|
-
|
734
|
-
sql_r
|
735
|
-
end
|
736
|
-
building_types.each do |i|
|
737
|
-
sql_r = 0.0 if i[:building_type].include?('Single-Family Detached') && x_u.include?('district')
|
741
|
+
|
742
|
+
if building.standardsBuildingType.is_initialized
|
743
|
+
sql_r = 0.0 if ['Residential'].include?(building.standardsBuildingType.get) && x_u.include?('district')
|
738
744
|
end
|
739
745
|
m.send("#{y}=", sql_r)
|
740
746
|
end
|
741
747
|
end
|
742
748
|
|
749
|
+
# other fuels
|
750
|
+
m = feature_report.reporting_periods[0].end_uses.send('other_fuels_kwh')
|
751
|
+
enduses.each do |eu|
|
752
|
+
y = eu.tr(' ', '_').downcase
|
753
|
+
sql_r = 0.0
|
754
|
+
other_fuels.each do |ft|
|
755
|
+
sql = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='#{eu}' AND ColumnName='#{ft}'")
|
756
|
+
|
757
|
+
# ensure not nil so the equations below don't error out
|
758
|
+
if not sql.nil?
|
759
|
+
sql_r += convert_units(sql, 'GJ', 'kWh')
|
760
|
+
end
|
761
|
+
end
|
762
|
+
m.send("#{y}=", sql_r)
|
763
|
+
end
|
764
|
+
|
765
|
+
# add enduses subcategories
|
766
|
+
electric_vehicles = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses By Subcategory' AND RowName='Exterior Equipment:Electric Vehicles' AND ColumnName='Electricity'")
|
767
|
+
feature_report.reporting_periods[0].end_uses.electricity_kwh.electric_vehicles = convert_units(electric_vehicles, 'GJ', 'kWh')
|
768
|
+
|
743
769
|
### energy_production
|
744
770
|
## electricity_produced
|
745
771
|
# photovoltaic
|
@@ -756,7 +782,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
756
782
|
feature_report.reporting_periods[0].utility_costs_dollar[0][:fuel_type] = 'Electricity'
|
757
783
|
feature_report.reporting_periods[0].utility_costs_dollar[0][:total_cost] = elec_utility_cost
|
758
784
|
# gas utility cost
|
759
|
-
gas_utility_cost = sql_query(runner, sql_file, 'Economics Results Summary Report', "TableName='Annual Cost' AND RowName='Cost' AND ColumnName='Gas'")
|
785
|
+
gas_utility_cost = sql_query(runner, sql_file, 'Economics Results Summary Report', "TableName='Annual Cost' AND RowName='Cost' AND ColumnName='Natural Gas'")
|
760
786
|
feature_report.reporting_periods[0].utility_costs_dollar << { fuel_type: 'Natural Gas', total_cost: gas_utility_cost }
|
761
787
|
|
762
788
|
## comfort_result
|
@@ -794,31 +820,32 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
794
820
|
requested_timeseries_names = [
|
795
821
|
'Electricity:Facility',
|
796
822
|
'ElectricityProduced:Facility',
|
797
|
-
'
|
823
|
+
'NaturalGas:Facility',
|
798
824
|
'Propane:Facility',
|
799
|
-
'
|
825
|
+
'FuelOilNo2:Facility',
|
800
826
|
'OtherFuels:Facility',
|
801
827
|
'Cooling:Electricity',
|
802
828
|
'Heating:Electricity',
|
803
829
|
'InteriorLights:Electricity',
|
804
830
|
'ExteriorLights:Electricity',
|
805
831
|
'InteriorEquipment:Electricity',
|
832
|
+
'ExteriorEquipment:Electricity',
|
806
833
|
'Fans:Electricity',
|
807
834
|
'Pumps:Electricity',
|
808
835
|
'WaterSystems:Electricity',
|
809
836
|
'HeatRejection:Electricity',
|
810
|
-
'HeatRejection:
|
811
|
-
'Heating:
|
812
|
-
'WaterSystems:
|
813
|
-
'InteriorEquipment:
|
837
|
+
'HeatRejection:NaturalGas',
|
838
|
+
'Heating:NaturalGas',
|
839
|
+
'WaterSystems:NaturalGas',
|
840
|
+
'InteriorEquipment:NaturalGas',
|
814
841
|
'HeatRejection:Propane',
|
815
842
|
'Heating:Propane',
|
816
843
|
'WaterSystems:Propane',
|
817
844
|
'InteriorEquipment:Propane',
|
818
|
-
'HeatRejection:
|
819
|
-
'Heating:
|
820
|
-
'WaterSystems:
|
821
|
-
'InteriorEquipment:
|
845
|
+
'HeatRejection:FuelOilNo2',
|
846
|
+
'Heating:FuelOilNo2',
|
847
|
+
'WaterSystems:FuelOilNo2',
|
848
|
+
'InteriorEquipment:FuelOilNo2',
|
822
849
|
'HeatRejection:OtherFuels',
|
823
850
|
'Heating:OtherFuels',
|
824
851
|
'WaterSystems:OtherFuels',
|
@@ -955,14 +982,14 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
955
982
|
end
|
956
983
|
|
957
984
|
# residential considerations
|
958
|
-
|
959
|
-
values[key_cnt] = Array.new(n, 0) if ['DistrictCooling:Facility', 'DistrictHeating:Facility'].include?(timeseries_name) &&
|
985
|
+
if building.standardsBuildingType.is_initialized
|
986
|
+
values[key_cnt] = Array.new(n, 0) if ['DistrictCooling:Facility', 'DistrictHeating:Facility'].include?(timeseries_name) && ['Residential'].include?(building.standardsBuildingType.get)
|
960
987
|
end
|
961
988
|
|
962
989
|
# unit conversion
|
963
990
|
old_unit = ts.get.units if ts.is_initialized
|
964
991
|
|
965
|
-
if timeseries_name.include?('
|
992
|
+
if timeseries_name.include?('NaturalGas') || timeseries_name.include?('Propane') || timeseries_name.include?('FuelOilNo2') || timeseries_name.include?('OtherFuels')
|
966
993
|
new_unit = 'kBtu'
|
967
994
|
else
|
968
995
|
new_unit = case old_unit.to_s
|
@@ -1151,7 +1178,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
1151
1178
|
# get the timeseries for any of available timeseries
|
1152
1179
|
# RK: code enhancement needed
|
1153
1180
|
ts_d_e = sql_file.timeSeries(ann_env_pd.to_s, reporting_frequency.to_s, 'Electricity:Facility', '')
|
1154
|
-
ts_d_g = sql_file.timeSeries(ann_env_pd.to_s, reporting_frequency.to_s, '
|
1181
|
+
ts_d_g = sql_file.timeSeries(ann_env_pd.to_s, reporting_frequency.to_s, 'NaturalGas:Facility', '')
|
1155
1182
|
|
1156
1183
|
if ts_d_e.is_initialized
|
1157
1184
|
timeseries_d = ts_d_e.get
|