openstudio-standards 0.8.2 → 0.8.4

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 (152) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  3. data/data/standards/openstudio_standards_duplicates_log.csv +7962 -0
  4. data/lib/openstudio-standards/btap/costing/README.md +502 -0
  5. data/lib/openstudio-standards/btap/costing/btap_costing.rb +473 -0
  6. data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +359 -0
  7. data/lib/openstudio-standards/btap/costing/btap_workflow.rb +117 -0
  8. data/lib/openstudio-standards/btap/costing/common_paths.rb +78 -0
  9. data/lib/openstudio-standards/btap/costing/common_resources/ConstructionProperties.csv +52 -0
  10. data/lib/openstudio-standards/btap/costing/common_resources/Constructions.csv +37 -0
  11. data/lib/openstudio-standards/btap/costing/common_resources/construction_sets.csv +1270 -0
  12. data/lib/openstudio-standards/btap/costing/common_resources/constructions_glazing.csv +61 -0
  13. data/lib/openstudio-standards/btap/costing/common_resources/constructions_opaque.csv +2256 -0
  14. data/lib/openstudio-standards/btap/costing/common_resources/costs.csv +1904 -0
  15. data/lib/openstudio-standards/btap/costing/common_resources/costs_local_factors.csv +2315 -0
  16. data/lib/openstudio-standards/btap/costing/common_resources/hvac_vent_ahu.csv +925 -0
  17. data/lib/openstudio-standards/btap/costing/common_resources/lighting.csv +364 -0
  18. data/lib/openstudio-standards/btap/costing/common_resources/lighting_sets.csv +2667 -0
  19. data/lib/openstudio-standards/btap/costing/common_resources/locations.csv +75 -0
  20. data/lib/openstudio-standards/btap/costing/common_resources/materials_glazing.csv +35 -0
  21. data/lib/openstudio-standards/btap/costing/common_resources/materials_hvac.csv +1699 -0
  22. data/lib/openstudio-standards/btap/costing/common_resources/materials_lighting.csv +267 -0
  23. data/lib/openstudio-standards/btap/costing/common_resources/materials_opaque.csv +164 -0
  24. data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +11 -0
  25. data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +136 -0
  26. data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +177 -0
  27. data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +353 -0
  28. data/lib/openstudio-standards/btap/costing/dcv_costing.rb +314 -0
  29. data/lib/openstudio-standards/btap/costing/dummy.epw +8768 -0
  30. data/lib/openstudio-standards/btap/costing/dummy.osm +5320 -0
  31. data/lib/openstudio-standards/btap/costing/envelope_costing.rb +284 -0
  32. data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2584 -0
  33. data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +155 -0
  34. data/lib/openstudio-standards/btap/costing/lighting_costing.rb +209 -0
  35. data/lib/openstudio-standards/btap/costing/mech_sizing.json +502 -0
  36. data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +42 -0
  37. data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +225 -0
  38. data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +28705 -0
  39. data/lib/openstudio-standards/btap/costing/nv_costing.rb +547 -0
  40. data/lib/openstudio-standards/btap/costing/parallel_tests.rb +92 -0
  41. data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +687 -0
  42. data/lib/openstudio-standards/btap/costing/shw_costing.rb +705 -0
  43. data/lib/openstudio-standards/btap/costing/test_list.txt +17 -0
  44. data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +26 -0
  45. data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +80 -0
  46. data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2616 -0
  47. data/lib/openstudio-standards/constructions/modify.rb +2 -1
  48. data/lib/openstudio-standards/refrigeration/create_case.rb +58 -21
  49. data/lib/openstudio-standards/refrigeration/create_typical_refrigeration.rb +4 -2
  50. data/lib/openstudio-standards/refrigeration/create_walkin.rb +57 -22
  51. data/lib/openstudio-standards/refrigeration/data/refrigerated_cases.csv +31 -31
  52. data/lib/openstudio-standards/refrigeration/data/refrigerated_walkins.csv +76 -76
  53. data/lib/openstudio-standards/service_water_heating/create_typical.rb +10 -10
  54. data/lib/openstudio-standards/service_water_heating/create_water_heater.rb +10 -0
  55. data/lib/openstudio-standards/service_water_heating/create_water_heating_loop.rb +16 -3
  56. data/lib/openstudio-standards/service_water_heating/data/convert_data.rb +9 -9
  57. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.csv +49 -49
  58. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.json +159 -159
  59. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +7 -18
  60. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +10 -20
  61. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +6 -15
  62. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +5 -6
  63. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +93 -43
  64. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +5 -5
  65. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +135 -37
  66. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -2
  67. data/lib/openstudio-standards/standards/Standards.Model.rb +48 -13
  68. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.computer_room_acs.json +302 -140
  69. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +648 -326
  70. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +371 -90
  71. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +66 -22
  72. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.computer_room_acs.json +302 -140
  73. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +1012 -296
  74. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +443 -79
  75. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +66 -22
  76. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.computer_room_acs.json +302 -140
  77. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +672 -306
  78. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +354 -74
  79. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +72 -24
  80. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.computer_room_acs.json +302 -140
  81. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +8 -8
  82. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +930 -604
  83. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +415 -111
  84. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +72 -24
  85. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.computer_room_acs.json +602 -140
  86. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps.json +1005 -333
  87. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +642 -88
  88. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_heaters.json +78 -26
  89. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.computer_room_acs.json +722 -140
  90. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps.json +1741 -426
  91. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +1108 -111
  92. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_heaters.json +186 -62
  93. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +62 -232
  94. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +2 -3
  95. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
  96. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +7 -18
  97. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +9 -7
  98. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -1
  99. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +2 -2
  100. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps.json +154 -69
  101. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps_heating.json +72 -72
  102. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.water_heaters.json +382 -295
  103. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +6 -1
  104. data/lib/openstudio-standards/standards/deer/data/deer.schedules.json +62 -232
  105. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +2 -27
  106. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps.json +16 -0
  107. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps_heating.json +6 -0
  108. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +68 -27
  109. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +64 -25
  110. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +9 -14
  111. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +46 -20
  112. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +635 -248
  113. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +43 -7
  114. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -1
  115. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartmentMult.osm +14272 -0
  116. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps.json +16 -0
  117. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +6 -0
  118. data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2015_table_c1.json +1 -1
  119. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +437 -437
  120. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems.json +516 -0
  121. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems_including_sys5.json +588 -0
  122. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +489 -0
  123. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +16 -6
  124. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +48 -5
  125. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +2 -2
  126. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +35 -27
  127. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +34 -23
  128. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +8 -6
  129. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +43 -14
  130. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +214 -25
  131. data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +61 -1
  132. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps.json +16 -0
  133. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +8 -0
  134. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +636 -636
  135. data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +38 -38
  136. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +15 -6
  137. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +636 -636
  138. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +71 -71
  139. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps.json +20 -0
  140. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +10 -0
  141. data/lib/openstudio-standards/standards/necb/README.md +343 -0
  142. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +190 -28
  143. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +14 -5
  144. data/lib/openstudio-standards/standards/necb/common/eccc_electric_grid_intensity_20250311.csv +14 -0
  145. data/lib/openstudio-standards/standards/necb/common/nir_gas_grid_intensity_20250311.csv +14 -0
  146. data/lib/openstudio-standards/standards/necb/common/system_types.yaml +0 -0
  147. data/lib/openstudio-standards/utilities/logging.rb +18 -14
  148. data/lib/openstudio-standards/utilities/simulation.rb +3 -2
  149. data/lib/openstudio-standards/version.rb +1 -1
  150. data/lib/openstudio-standards/weather/modify.rb +2 -2
  151. data/lib/openstudio-standards.rb +12 -0
  152. metadata +56 -3
@@ -0,0 +1,343 @@
1
+ # NECB (National Energy Code for Buildings) Standards
2
+
3
+ ## Overview
4
+
5
+ The NECB (National Energy Code for Buildings) standards module provides comprehensive implementation of Canadian building energy codes. This module represents one of the most complete implementations of a national building energy standard, covering multiple versions of the Canadian National Energy Code for Buildings, vintage building standards, and energy conservation measures.
6
+
7
+ ## Architecture
8
+
9
+ The NECB module is organized into four main categories:
10
+
11
+ 1. **NECB Standard Versions** (2011, 2015, 2017, 2020)
12
+ 2. **BTAP Vintage Standards** (Pre-1980, 1980-2010)
13
+ 3. **Energy Conservation Measures (ECMS)**
14
+ 4. **Shared Resources** (Common data, documentation, QAQC)
15
+
16
+ ## NECB Standard Versions
17
+
18
+ ### NECB2011 - Foundation Implementation
19
+
20
+ #### Core Module: `necb_2011.rb`
21
+ **Most comprehensive NECB implementation with full building system coverage**
22
+
23
+ **Key Features:**
24
+ - Complete climate zone implementation for Canada (8 climate zones)
25
+ - All 8 HVAC system types with both single-speed and multi-speed variants
26
+ - Comprehensive building envelope requirements
27
+ - LED lighting compliance and occupancy sensor controls
28
+ - Service water heating system requirements
29
+ - BEPS (Building Energy Performance Standards) compliance pathways
30
+ - Thermal bridging calculations (TBD integration)
31
+ - Quality assurance and quality control (QAQC) framework
32
+
33
+ **Major Subsystems:**
34
+
35
+ ##### HVAC Systems (`hvac_system_*.rb`)
36
+ - **System 1**: Single Zone systems (`hvac_system_1_single_speed.rb`, `hvac_system_1_multi_speed.rb`)
37
+ - **Systems 2 & 5**: Multi-zone VAV systems (`hvac_system_2_and_5.rb`)
38
+ - **Systems 3 & 8**: Single zone heat pumps (`hvac_system_3_and_8_single_speed.rb`, `hvac_system_3_and_8_multi_speed.rb`)
39
+ - **System 4**: Multi-zone VAV with reheat (`hvac_system_4.rb`)
40
+ - **System 6**: Multi-zone VAV with PFP boxes (`hvac_system_6.rb`)
41
+ - **General**: `hvac_systems.rb`, `hvac_namer.rb`
42
+
43
+ ##### Building Systems
44
+ - **Envelope**: `building_envelope.rb` - Comprehensive building envelope requirements
45
+ - **Lighting**: `lighting.rb` - Interior lighting power density and controls
46
+ - **Service Water Heating**: `service_water_heating.rb` - Hot water system efficiency requirements
47
+ - **Electrical**: `electrical_power_systems_and_motors.rb` - Motor efficiency requirements
48
+
49
+ ##### Specialized Features
50
+ - **Auto-zoning**: `autozone.rb` - Automated thermal zone creation
51
+ - **System Fuels**: `system_fuels.rb` - Fuel type selection and mapping
52
+ - **BEPS Compliance**: `beps_compliance_path.rb` - Building Energy Performance Standards
53
+
54
+ ##### Data Resources (`data/`)
55
+ **Extensive JSON database covering:**
56
+ - **Climate & Geography**: `climate_zone_sets.json`, `province_map.json`
57
+ - **Building Envelope**: `materials.json`, `surface_thermal_transmittance.json`
58
+ - **HVAC Equipment**: `boilers.json`, `chillers.json`, `furnaces.json`, `heat_pumps.json`, `unitary_acs.json`
59
+ - **System Selection**: `systems.json`, `necb_hvac_system_selection_type.json`
60
+ - **Energy Efficiency**: `motors.json`, `heat_rejection.json`, `erv.json`
61
+ - **Building Types**: `space_types.json`, `prototype_inputs.json`
62
+ - **Lighting**: `led_lighting_data.json`
63
+ - **Economics**: `regional_fuel_use.json`
64
+ - **Reference Data**: `necb_2015_table_c1.json`, `constants.json`, `formulas.json`
65
+
66
+ ##### Quality Assurance (`qaqc/`)
67
+ - **Main Module**: `necb_qaqc.rb` - Comprehensive model validation
68
+ - **Resources**: `qaqc_resources/` - Reference data for validation
69
+ - **Data**: `qaqc_data/` - Expected results for testing
70
+
71
+ ### NECB2015 - Enhanced Version
72
+
73
+ #### Core Module: `necb_2015.rb`
74
+ **Updated NECB implementation with enhanced lighting and HVAC systems**
75
+
76
+ **Key Improvements over 2011:**
77
+ - Enhanced lighting power density requirements
78
+ - Updated HVAC system efficiency requirements
79
+ - Refined control strategies
80
+
81
+ **Modules:**
82
+ - **Lighting**: `lighting.rb` - Updated lighting requirements
83
+ - **HVAC**: `hvac_systems.rb` - Enhanced system implementations
84
+ - **QAQC**: `qaqc/necb_2015_qaqc.rb` - Version-specific validation
85
+
86
+ ### NECB2017 - System Updates
87
+
88
+ #### Core Module: `necb_2017.rb`
89
+ **Newer version focusing on HVAC system improvements**
90
+
91
+ **Key Features:**
92
+ - Updated HVAC system requirements
93
+ - Enhanced system control strategies
94
+ - Refined equipment efficiency requirements
95
+
96
+ **Modules:**
97
+ - **HVAC**: `hvac_systems.rb` - Updated system implementations
98
+
99
+ ### NECB2020 - Latest Version
100
+
101
+ #### Core Module: `necb_2020.rb`
102
+ **Latest NECB implementation with building envelope and service water heating improvements**
103
+
104
+ **Key Features:**
105
+ - Enhanced building envelope performance requirements
106
+ - Updated service water heating efficiency standards
107
+ - Latest building code compliance requirements
108
+
109
+ **Modules:**
110
+ - **Envelope**: `building_envelope.rb` - Updated envelope requirements
111
+ - **Service Water Heating**: `service_water_heating.rb` - Enhanced efficiency requirements
112
+
113
+ ## BTAP Vintage Standards
114
+
115
+ ### BTAPPRE1980 - Pre-1980 Building Standards
116
+
117
+ #### Core Module: `btap_pre1980.rb`
118
+ **Building performance standards for buildings constructed before 1980**
119
+
120
+ **Purpose:** Historical building analysis and retrofit potential assessment
121
+
122
+ **Key Features:**
123
+ - Legacy building envelope performance levels
124
+ - Historical HVAC system types and efficiencies
125
+ - Vintage building infiltration rates
126
+ - Baseline performance for retrofit analysis
127
+
128
+ **Modules:**
129
+ - **Envelope**: `building_envelope.rb` - Pre-1980 construction standards
130
+ - **HVAC Systems**: Multiple system files for historical equipment types
131
+ - **Data**: `data/` - Historical performance data
132
+
133
+ ### BTAP1980TO2010 - Transitional Period Standards
134
+
135
+ #### Core Module: `btap_1980to2010.rb`
136
+ **Building standards for the 1980-2010 construction period**
137
+
138
+ **Purpose:** Bridge between historical and modern building standards
139
+
140
+ **Key Features:**
141
+ - Transitional building envelope requirements
142
+ - Equipment efficiency improvements over pre-1980 era
143
+ - Building code evolution tracking
144
+
145
+ ## Energy Conservation Measures (ECMS)
146
+
147
+ ### ECMS Framework (`ECMS/`)
148
+
149
+ #### Core Module: `ecms.rb`
150
+ **Energy Conservation Measures implementation framework**
151
+
152
+ **Purpose:** Systematic evaluation and implementation of building energy efficiency measures
153
+
154
+ **Key ECM Categories:**
155
+
156
+ ##### HVAC ECMs (`hvac_systems.rb`)
157
+ - Advanced HVAC system configurations
158
+ - High-efficiency equipment options
159
+ - System optimization strategies
160
+
161
+ ##### Energy Recovery Ventilation (`erv.rb`)
162
+ - Energy recovery ventilator implementation
163
+ - Heat recovery system integration
164
+ - Ventilation system optimization
165
+
166
+ ##### Natural Ventilation (`nv.rb`)
167
+ - Natural ventilation strategies
168
+ - Mixed-mode system implementation
169
+ - Climate-responsive ventilation control
170
+
171
+ ##### Renewable Energy (`pv_ground.rb`)
172
+ - Ground-mounted photovoltaic systems
173
+ - Solar energy integration
174
+ - On-site renewable energy generation
175
+
176
+ ##### Load Optimization (`loads.rb`)
177
+ - Building load reduction strategies
178
+ - Equipment efficiency improvements
179
+ - Operational optimization measures
180
+
181
+ ##### Data Resources (`data/`)
182
+ - ECM performance data
183
+ - Cost-benefit analysis parameters
184
+ - Implementation guidelines
185
+
186
+ ## Shared Resources
187
+
188
+ ### Common Data and Utilities (`common/`)
189
+
190
+ #### BTAP Integration
191
+ - **`btap_datapoint.rb`**: Large-scale building analysis utilities
192
+ - **`btap_data.rb`**: Common BTAP data handling functions
193
+
194
+ #### Economic and Environmental Data
195
+ - **`national_carbon_price_sched_feb_2025.json`**: Canadian carbon pricing schedules
196
+ - **`utility_pricing_2025-02-20.csv`**: Canadian utility rate data
197
+ - **`neb_end_use_prices.csv`**: End-use energy pricing
198
+ - **`eccc_electric_grid_intensity_20250311.csv`**: Electric grid emissions factors
199
+ - **`nir_gas_grid_intensity_20250311.csv`**: Natural gas grid emissions factors
200
+
201
+ #### Reference Data
202
+ - **`necb_reference_runs.csv`**: Reference building performance data
203
+ - **`space_type_upgrade_map.json`**: Space type transformation mappings
204
+ - **`system_types.yaml`**: HVAC system type definitions
205
+ - **`construction_defaults.osm`**: Default construction assemblies
206
+
207
+ #### Documentation (`docs/`)
208
+ - **`air_system_names_method.md`**: Air system naming conventions
209
+
210
+ #### Specialized Resources
211
+ - **`phius.md`**: Passive House Institute US integration notes
212
+ - **`bc_step_code_indicators.md`**: British Columbia Step Code compliance
213
+
214
+ ## Key Features and Capabilities
215
+
216
+ ### Climate Zone Implementation
217
+ - **8 Canadian Climate Zones**: Complete implementation from Zone 4 (warmest) to Zone 8 (coldest)
218
+ - **Provincial Mapping**: Automatic climate zone determination by province and city
219
+ - **Weather Data Integration**: Seamless integration with Canadian weather files
220
+
221
+ ### HVAC System Types
222
+ **Complete implementation of all 8 NECB system types:**
223
+
224
+ 1. **System 1**: Residential/Small Commercial (≤ 25,000 ft²)
225
+ 2. **System 2**: Multi-zone VAV with reheat
226
+ 3. **System 3**: Single-zone heat pump
227
+ 4. **System 4**: VAV with reheat (large buildings)
228
+ 5. **System 5**: Packaged VAV with reheat
229
+ 6. **System 6**: VAV with PFP boxes and reheat
230
+ 7. **System 7**: VAV with hot water reheat
231
+ 8. **System 8**: VAV with electric reheat
232
+
233
+ **Each system type includes:**
234
+ - Single-speed and multi-speed equipment options
235
+ - Appropriate control strategies
236
+ - Equipment sizing and selection
237
+ - Energy efficiency requirements
238
+
239
+ ### Building Performance Standards (BEPS)
240
+ - **Performance Path Compliance**: Alternative compliance using energy modeling
241
+ - **Prescriptive Path Integration**: Seamless integration with prescriptive requirements
242
+ - **Trade-off Analysis**: Building component performance trade-offs
243
+ - **Compliance Reporting**: Automated compliance documentation
244
+
245
+ ### Advanced Features
246
+
247
+ #### Thermal Bridging Integration
248
+ - **TBD Integration**: Heat transfer through thermal bridges
249
+ - **Detailed Heat Transfer**: Beyond simple assembly U-values
250
+ - **Whole Building Performance**: Complete thermal performance assessment
251
+
252
+ #### LED Lighting Compliance
253
+ - **Power Density Requirements**: Automatic lighting power density calculations
254
+ - **Control Integration**: Occupancy sensor and daylight dimming controls
255
+ - **Compliance Verification**: Automated lighting compliance checking
256
+
257
+ #### Quality Assurance Framework
258
+ - **Comprehensive QAQC**: Model validation and quality checking
259
+ - **Expected Results Testing**: Comparison against reference buildings
260
+ - **Performance Verification**: Energy use intensity and component performance validation
261
+
262
+ ### Canadian-Specific Features
263
+
264
+ #### Provincial Integration
265
+ - **Provincial Fuel Mapping**: Province-specific fuel type availability
266
+ - **Utility Rate Integration**: Provincial electricity and gas rate structures
267
+ - **Climate Data**: Canadian weather station integration
268
+
269
+ #### Economic Analysis
270
+ - **Regional Cost Factors**: Provincial and regional cost adjustments
271
+ - **Carbon Pricing**: Integration with Canadian carbon pricing policies
272
+ - **Lifecycle Cost Analysis**: Complete economic analysis framework
273
+
274
+ ## Usage Patterns
275
+
276
+ ### Typical Implementation Workflow
277
+
278
+ 1. **Standard Selection**: Choose appropriate NECB version (2011, 2015, 2017, 2020)
279
+ 2. **Climate Zone Determination**: Automatic based on building location
280
+ 3. **System Type Selection**: Based on building type and size
281
+ 4. **Component Specification**: Apply standard-specific requirements
282
+ 5. **Performance Verification**: QAQC validation and compliance checking
283
+
284
+ ### ECM Evaluation Process
285
+
286
+ 1. **Baseline Model**: Create NECB-compliant baseline
287
+ 2. **ECM Selection**: Choose from available energy conservation measures
288
+ 3. **Performance Modeling**: Model ECM implementation
289
+ 4. **Economic Analysis**: Cost-benefit analysis using Canadian data
290
+ 5. **Optimization**: Identify optimal ECM combinations
291
+
292
+ ### Integration Points
293
+
294
+ - **BTAP Framework**: Complete integration with BTAP costing and analysis
295
+ - **OpenStudio Standards**: Seamless integration with base standards framework
296
+ - **Canadian Data**: Weather, utility, and economic data integration
297
+
298
+ ## Dependencies
299
+
300
+ ### Internal Dependencies
301
+ - **Base Standards Framework**: Inherits from OpenStudio-Standards base classes
302
+ - **BTAP Integration**: Extensive integration with BTAP utilities and costing
303
+ - **Common Utilities**: Uses shared utility functions and data structures
304
+
305
+ ### External Dependencies
306
+ - **OpenStudio SDK**: Building energy modeling capabilities
307
+ - **EnergyPlus**: Energy simulation engine
308
+ - **TBD**: Thermal bridging analysis (optional)
309
+
310
+ ### Data Dependencies
311
+ - **Canadian Weather Data**: Environment and Climate Change Canada weather files
312
+ - **Economic Data**: Statistics Canada and provincial utility data
313
+ - **Building Code Data**: National Research Council of Canada standards
314
+
315
+ ## Development and Maintenance
316
+
317
+ ### Version Evolution
318
+ - **NECB2011**: Foundation implementation (most complete)
319
+ - **NECB2015**: Lighting and HVAC updates
320
+ - **NECB2017**: System control improvements
321
+ - **NECB2020**: Envelope and service water heating updates
322
+
323
+ ### Testing Framework
324
+ - **Reference Buildings**: Comprehensive test suite using Canadian reference buildings
325
+ - **Regression Testing**: Automated testing against expected results
326
+ - **Compliance Verification**: Validation against published code requirements
327
+
328
+ ### Maintenance Considerations
329
+ - **Code Updates**: Regular updates to reflect changes in Canadian building codes
330
+ - **Data Updates**: Annual updates to utility rates, carbon pricing, and cost data
331
+ - **Weather Data**: Updates to Canadian weather files as available
332
+
333
+ ## Canadian Building Code Context
334
+
335
+ The NECB standards module provides the most comprehensive implementation of Canadian building energy requirements available in any building energy modeling tool. It reflects the unique aspects of Canadian building codes:
336
+
337
+ - **Climate-Based Requirements**: Robust climate zone implementation
338
+ - **System Type Flexibility**: Complete range of HVAC system options
339
+ - **Performance-Based Compliance**: Both prescriptive and performance path options
340
+ - **Provincial Variations**: Accommodation of provincial building code differences
341
+ - **Economic Integration**: Canadian-specific cost and economic data
342
+
343
+ This makes the NECB module essential for any building energy analysis work in Canada.
@@ -20,6 +20,8 @@ class BTAPData
20
20
  @neb_prices_csv_file_name = File.join(__dir__, 'neb_end_use_prices.csv')
21
21
  @neb_prices_csv_file_name = File.join(__dir__, 'utility_pricing_2025-02-20.csv') if oerd_utility_pricing.to_bool
22
22
  @necb_reference_runs_csv_file_name = File.join(__dir__, 'necb_reference_runs.csv')
23
+ @eccc_ghg_electricity = File.join(__dir__, 'eccc_electric_grid_intensity_20250311.csv') #REF (Retrieved March 11, 2025) for ECCC's emissions factors for the current and future years for GHG "without Biomass and RNG CO2 emissions": https://data-donnees.az.ec.gc.ca/data/substances/monitor/canada-s-greenhouse-gas-emissions-projections/Current-Projections-Actuelles/Energy-Energie/AM%20Scenario%20AMS/Grid-O%26G-Intensities-Intensites-Reseau-Delectricite-P%26G?lang=en
24
+ @nir_ghg_gas = File.join(__dir__, 'nir_gas_grid_intensity_20250311.csv') #REF (Retrieved March 11, 2025) for Year 2022 of "Table A6.1–1 CO2 Emission Factors for Marketable Natural Gas" of National Inventory Report: https://data-donnees.az.ec.gc.ca/api/file?path=%2Fsubstances%2Fmonitor%2Fcanada-s-official-greenhouse-gas-inventory%2FD-Emission-Factors%2FEN_Annex6_Emission_Factors.pdf
23
25
 
24
26
  # Conditioned floor area is used so much. May as well make it a object variable.
25
27
  # setup the queries
@@ -159,8 +161,8 @@ class BTAPData
159
161
 
160
162
  def building_costing_data(cost_result)
161
163
  building_data = {}
162
- building_data['cost_rs_means_prov'] = cost_result['rs_means_prov']
163
- building_data['cost_rs_means_city'] = cost_result['rs_means_city']
164
+ building_data['cost_province_state'] = cost_result['province_state']
165
+ building_data['cost_city'] = cost_result['city']
164
166
  building_data['cost_equipment_envelope_total_cost_per_m_sq'] = (cost_result['totals']['envelope']) / @conditioned_floor_area_m_sq
165
167
  building_data['cost_equipment_thermal_bridging_total_cost_per_m_sq'] = (cost_result['totals']['thermal_bridging']) / @conditioned_floor_area_m_sq
166
168
  building_data['cost_equipment_lighting_total_cost_per_m_sq'] = (cost_result['totals']['lighting']) / @conditioned_floor_area_m_sq
@@ -228,6 +230,9 @@ class BTAPData
228
230
  # Create a hash of the neb data.
229
231
  neb_data = CSV.parse(File.read(@neb_prices_csv_file_name), headers: true, converters: :numeric).map(&:to_h)
230
232
 
233
+ # Create a hash of the ECCC's electricity emissions factors for the current and future years for GHG "without Biomass and RNG CO2 emissions".
234
+ eccc_ghg_elec_emission_factors = CSV.parse(File.read(@eccc_ghg_electricity), headers: true, converters: :numeric).map(&:to_h)
235
+
231
236
  # Find which province the proposed building is located in
232
237
  building_type = 'Commercial'
233
238
  geography_data = climate_data
@@ -245,17 +250,14 @@ class BTAPData
245
250
  onsite_elec_generation = @btap_data['total_site_eui_gj_per_m_sq'] - @btap_data['net_site_eui_gj_per_m_sq']
246
251
  if onsite_elec_generation > 0.0
247
252
  eui_elec = @btap_data['energy_eui_electricity_gj_per_m_sq'] - onsite_elec_generation
248
- # Calculate the saved GHG emissions from onsite electricity generatation (assume it does not emmit GHGs)
249
- ghg_saved = get_utility_ghg_kg_per_gj(province: province_abbreviation, fuel_type: "Electricity") * onsite_elec_generation
250
- # Convert to tonnes of ghg/m^2
251
- ghg_elec = (@btap_data['cost_utility_ghg_electricity_kg_per_m_sq'].to_f - ghg_saved.to_f)/1000.0
252
253
  else
253
254
  eui_elec = @btap_data['energy_eui_electricity_gj_per_m_sq']
254
- # Convert to tonnes of ghg/m^2
255
- ghg_elec = @btap_data['cost_utility_ghg_electricity_kg_per_m_sq'].to_f/1000.0
256
255
  end
257
- # puts "onsite_elec_generation is #{onsite_elec_generation}"
258
- # puts "eui_elec is #{eui_elec}"
256
+ # Find the appropriate row for electricity GHG emmission factors
257
+ row_emm_factor = eccc_ghg_elec_emission_factors.detect do |data|
258
+ (data['province'] == province)
259
+ end
260
+ # Find the appropriate row for electricity pricing
259
261
  row = neb_data.detect do |data|
260
262
  (data['building_type'] == building_type) && (data['province'] == province) && (data['fuel_type'] == 'Electricity')
261
263
  end
@@ -269,16 +271,15 @@ class BTAPData
269
271
  year_index = 1.0
270
272
  npv_elec_ghg = 0.0
271
273
  npv_elec_peak = 0.0
274
+ emm_factor_conv = 3600.0 #GWH to GJ
272
275
  if eui_elec > 0.0
273
276
  for year in npv_start_year.to_int..npv_end_year.to_int
274
- # puts "year, #{year}, #{row[year.to_s]}, year_index, #{year_index}"
275
277
  npv_elec += (eui_elec * row[year.to_s]) / (1+npv_discount_rate)**year_index
276
- npv_elec_ghg += (ghg_elec * get_national_ghg_cost(year: year.to_i)) / (1+npv_discount_rate_carbon)**year_index
277
- npv_elec_peak += (annual_peak_kW_per_m_sq * row_peak[year.to_s]) / (1+npv_discount_rate)**year_index unless row_peak.nil? || annual_peak_kW_per_m_sq.nil?
278
+ npv_elec_ghg += (((eui_elec * row_emm_factor[year.to_i.to_s].to_f) / emm_factor_conv) * get_national_ghg_cost(year: year.to_i)) / (1+npv_discount_rate_carbon)**year_index
279
+ npv_elec_peak += (annual_peak_kW_per_m_sq * row_peak[year.to_i.to_s]).to_f / (1+npv_discount_rate)**year_index unless row_peak.nil? || annual_peak_kW_per_m_sq.nil?
278
280
  year_index += 1.0
279
281
  end
280
282
  end
281
- # puts "npv_elec is #{npv_elec}"
282
283
 
283
284
  # Calculate npv of natural gas
284
285
  eui_ngas= @btap_data['energy_eui_natural_gas_gj_per_m_sq']
@@ -740,7 +741,16 @@ class BTAPData
740
741
  economics_data["cost_utility_neb_#{neb_fuel.downcase}_cost_per_m_sq"] = fuel_consumption_gj * neb_fuel_cost.to_f / @conditioned_floor_area_m_sq
741
742
  economics_data['cost_utility_neb_total_cost_per_m_sq'] += economics_data["cost_utility_neb_#{neb_fuel.downcase}_cost_per_m_sq"]
742
743
  # Determine cost in GHG kg of CO2
743
- economics_data["cost_utility_ghg_#{neb_fuel.downcase}_kg_per_m_sq"] = fuel_consumption_gj * get_utility_ghg_kg_per_gj(province: model.getWeatherFile.stateProvinceRegion, fuel_type: ep_fuel[:eplus_fuel_name]) / @conditioned_floor_area_m_sq
744
+ if neb_fuel.downcase == 'electricity' # Use ECCC data for utility emission factors rather than NEB data.
745
+ # Create a hash of the ECCC's electricity emissions factors for the current and future years for GHG "without Biomass and RNG CO2 emissions".
746
+ eccc_ghg_elec_emission_factors = CSV.parse(File.read(@eccc_ghg_electricity), headers: true, converters: :numeric).map(&:to_h)
747
+ # Find the appropriate row for electricity GHG emmission factors
748
+ row_emm_factor = eccc_ghg_elec_emission_factors.detect { |data| (data['province'] == province) }
749
+ emm_factor_conv = 3600.0
750
+ economics_data["cost_utility_ghg_#{neb_fuel.downcase}_kg_per_m_sq"] = ((fuel_consumption_gj * row_emm_factor[utility_pricing_year.to_i.to_s].to_f) / emm_factor_conv) * 1000 / @conditioned_floor_area_m_sq
751
+ else
752
+ economics_data["cost_utility_ghg_#{neb_fuel.downcase}_kg_per_m_sq"] = fuel_consumption_gj * get_utility_ghg_kg_per_gj(province: model.getWeatherFile.stateProvinceRegion, fuel_type: ep_fuel[:eplus_fuel_name]) / @conditioned_floor_area_m_sq
753
+ end
744
754
  economics_data['cost_utility_ghg_total_kg_per_m_sq'] += economics_data["cost_utility_ghg_#{neb_fuel.downcase}_kg_per_m_sq"]
745
755
  end
746
756
  # Commenting out block charge rates for now....
@@ -1582,6 +1592,142 @@ class BTAPData
1582
1592
  cooling_peak_w = [cooling_peak_w_electricity.to_f, cooling_peak_w_gas.to_f].max
1583
1593
  data['cooling_peak_w_per_m_sq'] = cooling_peak_w / @conditioned_floor_area_m_sq
1584
1594
 
1595
+ # Peak water system load # @todo IMPORTANT NOTE: Peak water system load must be updated if a combination of fuel types is used in a building model.
1596
+ command = "SELECT Value
1597
+ FROM TabularDataWithStrings
1598
+ WHERE ReportName='EnergyMeters'
1599
+ AND ReportForString='Entire Facility'
1600
+ AND TableName='Annual and Peak Values - Electricity'
1601
+ AND RowName='WaterSystems:Electricity'
1602
+ AND ColumnName='Electricity Maximum Value'
1603
+ AND Units='W'"
1604
+ water_heating_peak_w_electricity = @sqlite_file.get.execAndReturnFirstDouble(command)
1605
+ command = "SELECT Value
1606
+ FROM TabularDataWithStrings
1607
+ WHERE ReportName='EnergyMeters'
1608
+ AND ReportForString='Entire Facility'
1609
+ AND TableName='Annual and Peak Values - Natural Gas'
1610
+ AND RowName='WaterSystems:NaturalGas'
1611
+ AND ColumnName='Natural Gas Maximum Value'
1612
+ AND Units='W'"
1613
+ water_heating_peak_w_gas = @sqlite_file.get.execAndReturnFirstDouble(command)
1614
+ water_heating_peak_w = [water_heating_peak_w_electricity.to_f, water_heating_peak_w_gas.to_f].max
1615
+ data['energy_peak_water_systems_w_per_m_sq'] = water_heating_peak_w / @conditioned_floor_area_m_sq
1616
+
1617
+ #===================================================================================================================
1618
+ # Winter peak values
1619
+ ### Get number of timesteps from the model
1620
+ number_of_timesteps_per_hour = 1
1621
+ timestep_second = 3600 / number_of_timesteps_per_hour
1622
+ #===================================================================================================================
1623
+ ### Calculate number of timesteps of the whole year, and create dates/times for the whole year
1624
+ number_of_timesteps_of_year = 365 * 24 * number_of_timesteps_per_hour
1625
+ timesteps_of_year = []
1626
+ d = Time.new(2006, 1, 1, 0)
1627
+ (0...number_of_timesteps_of_year).each do |increment|
1628
+ timesteps_of_year << (d + (60 * 60 / number_of_timesteps_per_hour) * increment).strftime('%Y-%m-%d %H:%M')
1629
+ end
1630
+ # Find month of each timestep
1631
+ keys_month = timesteps_of_year.map{ |timestep| DateTime.parse(timestep).to_date.month }
1632
+ # Peak electricity in winter
1633
+ query = "
1634
+ SELECT ReportDataDictionaryIndex
1635
+ FROM ReportDataDictionary
1636
+ WHERE Name=='Electricity:Facility' AND ReportingFrequency == 'Hourly' AND Units == 'J'
1637
+ "
1638
+ index_timestep_electricity = @model.sqlFile.get.execAndReturnVectorOfInt(query).get[0]
1639
+ number_of_timesteps_per_hour = 1
1640
+ if index_timestep_electricity.nil?
1641
+ puts "No hourly or timestep data available. Peak data not available"
1642
+ data['energy_peak_electric_w_per_m_sq_winter'] = 0
1643
+ else
1644
+ ### Get timestep output for Electricity:Facility output.
1645
+ query = "
1646
+ Select VariableValue
1647
+ FROM ReportVariableData
1648
+ WHERE
1649
+ ReportVariableDataDictionaryIndex = #{index_timestep_electricity}
1650
+ "
1651
+ timestep_values = @model.sqlFile.get.execAndReturnVectorOfDouble(query).get
1652
+ # Create a hash where its keys are months and values for eahc month are electricity energy use (J) of all timesteps for that month
1653
+ hash_months_electricity = keys_month.zip(timestep_values).group_by(&:first).map{|key, value| [key, value.map(&:last)]}.to_h
1654
+ # Find maximum of electricity energy use (J) among all timesteps for each month of the year
1655
+ monthly_peak_J = hash_months_electricity.map { |key, value| [key, value.max()] }.to_h
1656
+ ### Convert J to W of maximum electricity energy use (J)
1657
+ monthly_peak_W = monthly_peak_J.map { |key, value| [key, value / timestep_second] }.to_h
1658
+ # Get winter peak
1659
+ winter_peak_W = [monthly_peak_W[12].to_f, monthly_peak_W[1].to_f, monthly_peak_W[2].to_f].max
1660
+ ### Normalize by building floor area
1661
+ annual_peak_W_per_m_sq = winter_peak_W / @btap_data['bldg_conditioned_floor_area_m_sq'].to_f
1662
+ data['energy_peak_electric_w_per_m_sq_winter'] = annual_peak_W_per_m_sq
1663
+ end
1664
+
1665
+ # Peak electricity heating in winter
1666
+ query = "
1667
+ SELECT ReportDataDictionaryIndex
1668
+ FROM ReportDataDictionary
1669
+ WHERE Name=='Heating:Electricity' AND ReportingFrequency == 'Hourly' AND Units == 'J'
1670
+ "
1671
+ index_timestep_electricity = @model.sqlFile.get.execAndReturnVectorOfInt(query).get[0]
1672
+ number_of_timesteps_per_hour = 1
1673
+ if index_timestep_electricity.nil?
1674
+ puts "No hourly or timestep data available. Peak data not available"
1675
+ data['energy_peak_electric_heating_w_per_m_sq_winter'] = 0
1676
+ else
1677
+ ### Get timestep output for Electricity:Facility output.
1678
+ query = "
1679
+ Select VariableValue
1680
+ FROM ReportVariableData
1681
+ WHERE
1682
+ ReportVariableDataDictionaryIndex = #{index_timestep_electricity}
1683
+ "
1684
+ timestep_values = @model.sqlFile.get.execAndReturnVectorOfDouble(query).get
1685
+ # Create a hash where its keys are months and values for eahc month are electricity energy use (J) of all timesteps for that month
1686
+ hash_months_electricity = keys_month.zip(timestep_values).group_by(&:first).map{|key, value| [key, value.map(&:last)]}.to_h
1687
+ # Find maximum of electricity energy use (J) among all timesteps for each month of the year
1688
+ monthly_peak_J = hash_months_electricity.map { |key, value| [key, value.max()] }.to_h
1689
+ ### Convert J to W of maximum electricity energy use (J)
1690
+ monthly_peak_W = monthly_peak_J.map { |key, value| [key, value / timestep_second] }.to_h
1691
+ # Get winter peak
1692
+ winter_peak_W = [monthly_peak_W[12].to_f, monthly_peak_W[1].to_f, monthly_peak_W[2].to_f].max
1693
+ ### Normalize by building floor area
1694
+ annual_peak_W_per_m_sq = winter_peak_W / @btap_data['bldg_conditioned_floor_area_m_sq'].to_f
1695
+ data['energy_peak_electric_heating_w_per_m_sq_winter'] = annual_peak_W_per_m_sq
1696
+ end
1697
+
1698
+ # Peak water system electricity heating in winter
1699
+ query = "
1700
+ SELECT ReportDataDictionaryIndex
1701
+ FROM ReportDataDictionary
1702
+ WHERE Name=='WaterSystems:Electricity' AND ReportingFrequency == 'Hourly' AND Units == 'J'
1703
+ "
1704
+ index_timestep_electricity = @model.sqlFile.get.execAndReturnVectorOfInt(query).get[0]
1705
+ number_of_timesteps_per_hour = 1
1706
+ if index_timestep_electricity.nil?
1707
+ puts "No hourly or timestep data available. Peak data not available"
1708
+ data['energy_peak_electric_water_systems_w_per_m_sq_winter'] = 0
1709
+ else
1710
+ ### Get timestep output for Electricity:Facility output.
1711
+ query = "
1712
+ Select VariableValue
1713
+ FROM ReportVariableData
1714
+ WHERE
1715
+ ReportVariableDataDictionaryIndex = #{index_timestep_electricity}
1716
+ "
1717
+ timestep_values = @model.sqlFile.get.execAndReturnVectorOfDouble(query).get
1718
+ # Create a hash where its keys are months and values for eahc month are electricity energy use (J) of all timesteps for that month
1719
+ hash_months_electricity = keys_month.zip(timestep_values).group_by(&:first).map{|key, value| [key, value.map(&:last)]}.to_h
1720
+ # Find maximum of electricity energy use (J) among all timesteps for each month of the year
1721
+ monthly_peak_J = hash_months_electricity.map { |key, value| [key, value.max()] }.to_h
1722
+ ### Convert J to W of maximum electricity energy use (J)
1723
+ monthly_peak_W = monthly_peak_J.map { |key, value| [key, value / timestep_second] }.to_h
1724
+ # Get winter peak
1725
+ winter_peak_W = [monthly_peak_W[12].to_f, monthly_peak_W[1].to_f, monthly_peak_W[2].to_f].max
1726
+ ### Normalize by building floor area
1727
+ annual_peak_W_per_m_sq = winter_peak_W / @btap_data['bldg_conditioned_floor_area_m_sq'].to_f
1728
+ data['energy_peak_electric_water_systems_w_per_m_sq_winter'] = annual_peak_W_per_m_sq
1729
+ end
1730
+
1585
1731
  return data
1586
1732
  end
1587
1733
 
@@ -2081,20 +2227,36 @@ class BTAPData
2081
2227
  def get_utility_ghg_kg_per_gj(province:, fuel_type:)
2082
2228
  ghg_data = [
2083
2229
  # Obtained from Portfolio Manager https://portfoliomanager.energystar.gov/pdf/reference/Emissions.pdf 10/10/2020
2084
- { "province": 'AB', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 53.24, "CO2eq Emissions (g/m3)": 1939.0 },
2085
- { "province": 'BC', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 53.19, "CO2eq Emissions (g/m3)": 1937.0 },
2086
- { "province": 'MB', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.09, "CO2eq Emissions (g/m3)": 1897.0 },
2087
- { "province": 'NB', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2088
- { "province": 'NL', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2089
- { "province": 'NT', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2090
- { "province": 'NS', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2091
- { "province": 'NU', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2092
- { "province": 'ON', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.14, "CO2eq Emissions (g/m3)": 1912.0 },
2093
- { "province": 'PE', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2094
- { "province": 'QC', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.12, "CO2eq Emissions (g/m3)": 1898.0 },
2095
- { "province": 'SK', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 50.53, "CO2eq Emissions (g/m3)": 1840.0 },
2096
- { "province": 'YT', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2230
+ #{ "province": 'AB', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 53.24, "CO2eq Emissions (g/m3)": 1939.0 },
2231
+ #{ "province": 'BC', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 53.19, "CO2eq Emissions (g/m3)": 1937.0 },
2232
+ #{ "province": 'MB', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.09, "CO2eq Emissions (g/m3)": 1897.0 },
2233
+ #{ "province": 'NB', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2234
+ #{ "province": 'NL', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2235
+ #{ "province": 'NT', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2236
+ #{ "province": 'NS', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2237
+ #{ "province": 'NU', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2238
+ #{ "province": 'ON', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.14, "CO2eq Emissions (g/m3)": 1912.0 },
2239
+ #{ "province": 'PE', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2240
+ #{ "province": 'QC', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.12, "CO2eq Emissions (g/m3)": 1898.0 },
2241
+ #{ "province": 'SK', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 50.53, "CO2eq Emissions (g/m3)": 1840.0 },
2242
+ #{ "province": 'YT', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.50, "CO2eq Emissions (g/m3)": 1912.0 },
2243
+
2244
+ #REF (Retrieved March 11, 2025) for Year 2022 of "Table A6.1–1 CO2 Emission Factors for Marketable Natural Gas" of National Inventory Report: https://data-donnees.az.ec.gc.ca/api/file?path=%2Fsubstances%2Fmonitor%2Fcanada-s-official-greenhouse-gas-inventory%2FD-Emission-Factors%2FEN_Annex6_Emission_Factors.pdf
2245
+ { "province": 'AB', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 53.87, "CO2eq Emissions (g/m3)": 1962.0 },
2246
+ { "province": 'BC', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 53.98, "CO2eq Emissions (g/m3)": 1966.0 },
2247
+ { "province": 'MB', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.58, "CO2eq Emissions (g/m3)": 1915.0 },
2248
+ { "province": 'NB', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.69, "CO2eq Emissions (g/m3)": 1919.0 },
2249
+ { "province": 'NL', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.69, "CO2eq Emissions (g/m3)": 1919.0 },
2250
+ { "province": 'NT', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 53.98, "CO2eq Emissions (g/m3)": 1966.0 },
2251
+ { "province": 'NS', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.69, "CO2eq Emissions (g/m3)": 1919.0 },
2252
+ { "province": 'NU', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 53.98, "CO2eq Emissions (g/m3)": 1966.0 },
2253
+ { "province": 'ON', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.75, "CO2eq Emissions (g/m3)": 1921.0 },
2254
+ { "province": 'PE', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.69, "CO2eq Emissions (g/m3)": 1919.0 },
2255
+ { "province": 'QC', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.88, "CO2eq Emissions (g/m3)": 1926.0 },
2256
+ { "province": 'SK', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 52.72, "CO2eq Emissions (g/m3)": 1920.0 },
2257
+ { "province": 'YT', "fuel_type": 'NaturalGas', "CO2eq Emissions (kg/MBtu)": 56.98, "CO2eq Emissions (g/m3)": 1966.0 },
2097
2258
 
2259
+ # Obtained from Portfolio Manager https://portfoliomanager.energystar.gov/pdf/reference/Emissions.pdf 10/10/2020
2098
2260
  { "province": 'AB', "fuel_type": 'FuelOilNo2', "CO2eq Emissions (kg/MBtu)": 75.13, "CO2eq Emissions (g/m3)": 2763.0 },
2099
2261
  { "province": 'BC', "fuel_type": 'FuelOilNo2', "CO2eq Emissions (kg/MBtu)": 75.13, "CO2eq Emissions (g/m3)": 2763.0 },
2100
2262
  { "province": 'MB', "fuel_type": 'FuelOilNo2', "CO2eq Emissions (kg/MBtu)": 75.13, "CO2eq Emissions (g/m3)": 2763.0 },