urbanopt-cli 0.8.2 → 0.9.0

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 (650) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -6
  3. data/CHANGELOG.md +21 -0
  4. data/CMakeLists.txt +7 -7
  5. data/Gemfile +3 -1
  6. data/README.md +9 -0
  7. data/example_files/Gemfile +23 -16
  8. data/example_files/Gemfile.lock +177 -0
  9. data/example_files/base_workflow_res.osw +57 -14
  10. data/example_files/class_project_coincident.json +1322 -0
  11. data/example_files/class_project_diverse.json +1322 -0
  12. data/example_files/disco/config.json +42 -0
  13. data/example_files/disco/cost_database.xlsx +0 -0
  14. data/example_files/disco/technical_catalog.json +12126 -0
  15. data/example_files/mappers/Baseline.rb +10 -7
  16. data/example_files/mappers/ChilledWaterStorage.rb +98 -0
  17. data/example_files/mappers/ClassProject.rb +110 -0
  18. data/example_files/mappers/CreateBar.rb +1 -0
  19. data/example_files/mappers/HighEfficiency.rb +13 -11
  20. data/example_files/mappers/PeakHoursMelsShedding.rb +72 -0
  21. data/example_files/mappers/PeakHoursThermostatAdjust.rb +78 -0
  22. data/example_files/mappers/ThermalStorage.rb +1 -0
  23. data/example_files/mappers/base_workflow.osw +55 -14
  24. data/example_files/mappers/class_project_workflow.osw +328 -0
  25. data/example_files/mappers/createbar_workflow.osw +16 -16
  26. data/example_files/measures/BuildResidentialModel/measure.rb +7 -1
  27. data/example_files/measures/BuildResidentialModel/measure.xml +1313 -706
  28. data/example_files/opendss/electrical_database.json +1446 -1446
  29. data/example_files/python_deps/dependencies.json +5 -0
  30. data/example_files/python_deps/install_python.ps1 +96 -0
  31. data/example_files/python_deps/install_python.sh +120 -0
  32. data/example_files/residential/clothes_dryer.tsv +11 -11
  33. data/example_files/residential/clothes_washer.tsv +3 -3
  34. data/example_files/residential/dishwasher.tsv +3 -3
  35. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +0 -1
  36. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +8 -21
  37. data/example_files/resources/hpxml-measures/.gitignore +2 -0
  38. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1272 -1094
  39. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +978 -659
  40. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +52 -74
  41. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +77 -140
  42. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +30 -27
  43. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +32 -13
  44. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +55 -51
  45. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +89 -16
  46. data/example_files/resources/hpxml-measures/Changelog.md +65 -0
  47. data/example_files/resources/hpxml-measures/Gemfile +2 -4
  48. data/example_files/resources/hpxml-measures/Gemfile.lock +2 -13
  49. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +276 -300
  50. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +221 -215
  51. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +215 -170
  52. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +108 -16
  53. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +24 -44
  54. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +564 -197
  55. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/cambium/README.md +8 -8
  56. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
  57. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +7 -55
  58. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +24 -19
  59. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +541 -211
  60. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +300 -172
  61. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +0 -2
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLBaseElements.xsd +230 -141
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLDataTypes.xsd +145 -137
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +191 -97
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/iso-schematron.xsd +391 -0
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +194 -198
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +140 -145
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +11 -11
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +33 -1
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +4 -4
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +17 -9
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +14 -12
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +39 -17
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +1 -1
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/battery.csv +8761 -0
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +114 -57
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +1 -0
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/utility_bills.rb +148 -0
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +85 -127
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +26 -32
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +2 -14
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +67 -0
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +117 -56
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +141 -14
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +453 -344
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +124 -20
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +1 -1
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +28 -32
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +172 -79
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +54 -8
  92. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +3 -3
  93. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +4 -4
  94. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +7 -7
  95. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +1 -1
  96. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +6 -9
  97. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +8 -8
  98. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +213 -95
  99. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +1 -10
  100. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +76 -0
  101. data/example_files/resources/hpxml-measures/README.md +2 -3
  102. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +585 -287
  103. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +304 -352
  104. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/output_report_test.rb +404 -279
  105. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +222 -501
  106. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +137 -200
  107. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json +649 -0
  108. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json +649 -0
  109. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json +647 -0
  110. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Annual Charge.json +8776 -0
  111. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Monthly Charge.json +8776 -0
  112. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json +8774 -0
  113. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Annual Charge.json +659 -0
  114. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Monthly Charge.json +659 -0
  115. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json +657 -0
  116. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Annual Charge.json +670 -0
  117. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Monthly Charge.json +670 -0
  118. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json +668 -0
  119. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Annual Charge.json +655 -0
  120. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Monthly Charge.json +655 -0
  121. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json +653 -0
  122. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/openei_rates.zip +0 -0
  123. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/Average_retail_price_of_electricity.csv +0 -0
  124. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/HouseholdConsumption.csv +0 -0
  125. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv +0 -0
  126. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv +0 -0
  127. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv +0 -0
  128. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/README.md +0 -0
  129. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/util.rb +506 -25
  130. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Contains Demand Charges.json +1312 -0
  131. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Fixed Charge Units.json +657 -0
  132. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Min Charge Units.json +659 -0
  133. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/JacksonElectricMemberCorp-ResidentialSeniorCitizenLowIncomeAssistance.json +681 -0
  134. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Missing Required Fields.json +54 -0
  135. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/data.csv +8761 -0
  136. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +1006 -235
  137. data/example_files/resources/hpxml-measures/docs/source/conf.py +1 -1
  138. data/example_files/resources/hpxml-measures/docs/source/intro.rst +0 -1
  139. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +2 -2
  140. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +461 -261
  141. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +146 -152
  142. data/example_files/resources/hpxml-measures/tasks.rb +616 -802
  143. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +19 -11
  144. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +20 -12
  145. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +12 -7
  146. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +12 -7
  147. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +19 -11
  148. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +12 -7
  149. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +20 -12
  150. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +28 -16
  151. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +28 -17
  152. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +28 -16
  153. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +20 -12
  154. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +20 -12
  155. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +20 -12
  156. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +20 -12
  157. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +20 -12
  158. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +22 -12
  159. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +19 -11
  160. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +20 -12
  161. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +13 -7
  162. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +12 -7
  163. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +31 -16
  164. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +22 -12
  165. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +21 -12
  166. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +37 -22
  167. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +24 -12
  168. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +33 -21
  169. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +28 -16
  170. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +28 -16
  171. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +30 -17
  172. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +10 -7
  173. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +22 -11
  174. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +12 -7
  175. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +18 -12
  176. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +25 -16
  177. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +22 -12
  178. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +20 -12
  179. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +26 -17
  180. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +19 -11
  181. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +25 -16
  182. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +20 -12
  183. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +35 -21
  184. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +28 -17
  185. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +20 -12
  186. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +35 -21
  187. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +20 -12
  188. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +20 -13
  189. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +12 -9
  190. data/example_files/resources/hpxml-measures/workflow/real_homes/house048.xml +25 -14
  191. data/example_files/resources/hpxml-measures/workflow/real_homes/house049.xml +10 -7
  192. data/example_files/resources/hpxml-measures/workflow/real_homes/house050.xml +20 -11
  193. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +91 -88
  194. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +18 -7
  195. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +546 -535
  196. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +546 -535
  197. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +555 -544
  198. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +18 -7
  199. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +18 -7
  200. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +18 -7
  201. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +18 -7
  202. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +580 -569
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +18 -7
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +580 -569
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +18 -7
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +18 -7
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +7 -0
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +17 -6
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +7 -0
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +18 -7
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +18 -7
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +18 -7
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +600 -0
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +598 -587
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +494 -485
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +606 -593
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +494 -485
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +494 -485
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +494 -485
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-calctype-operational.xml +480 -471
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +464 -457
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +496 -487
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +466 -459
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +518 -509
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +513 -504
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +445 -438
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +476 -467
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +443 -436
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +446 -439
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +494 -485
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +445 -438
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +476 -467
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +446 -439
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +494 -485
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +489 -480
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +499 -490
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +491 -482
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml +510 -0
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +495 -486
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +709 -695
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +528 -519
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +512 -503
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +504 -495
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +497 -488
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +490 -481
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +487 -478
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-2stories.xml +639 -628
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-atticroof-cathedral.xml +587 -580
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +639 -628
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-defaults.xml +539 -528
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon.xml +644 -633
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon2.xml +644 -633
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational.xml +575 -564
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +16 -7
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +16 -7
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +18 -7
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +585 -574
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +18 -7
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +18 -7
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +18 -7
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +18 -7
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +18 -7
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +536 -0
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +16 -7
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +16 -7
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +20 -8
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +16 -7
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +16 -7
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +18 -7
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +18 -7
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +18 -7
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +16 -7
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +18 -7
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +16 -7
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +18 -7
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +19 -8
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +19 -8
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +19 -8
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +19 -8
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +19 -8
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +18 -7
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +18 -7
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +18 -7
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +18 -7
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +18 -7
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +18 -7
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +18 -7
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +582 -571
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +583 -572
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +18 -7
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +584 -573
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +584 -573
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +18 -7
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +583 -572
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +585 -574
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +18 -7
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +582 -571
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +18 -7
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +18 -7
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +18 -7
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +586 -575
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +585 -574
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +18 -7
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +18 -7
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +580 -569
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +18 -7
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +580 -569
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +18 -7
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +580 -569
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +18 -7
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +18 -7
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +18 -7
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +18 -7
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +28 -11
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +20 -7
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +18 -7
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +18 -7
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +18 -7
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +18 -7
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +607 -0
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +550 -0
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +27 -12
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +18 -7
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +18 -7
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +18 -7
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +18 -7
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +18 -7
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +589 -578
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +18 -7
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +18 -7
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +619 -608
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +620 -609
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +618 -607
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +18 -7
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +537 -526
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +90 -43
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2507 -2460
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +595 -584
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +19 -8
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +584 -0
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +18 -7
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +594 -583
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +597 -586
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +598 -587
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +27 -12
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +671 -656
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +18 -7
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +18 -7
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-foundation-conditioned-basement-wall-interior-insulation.xml → base-foundation-conditioned-basement-wall-insulation.xml} +585 -574
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +582 -571
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +35 -16
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +18 -7
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +27 -12
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +27 -12
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +27 -12
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +27 -12
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +27 -12
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +27 -12
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +18 -7
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-backup-lockout-temperature.xml +586 -575
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +580 -569
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +583 -0
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +18 -7
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +18 -7
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +600 -589
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +599 -588
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +629 -616
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +18 -7
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +579 -568
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +581 -570
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +581 -570
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload-miami-fl.xml +582 -0
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +581 -570
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +581 -570
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +581 -570
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +581 -570
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +598 -587
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +628 -615
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml +581 -570
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml +581 -570
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +581 -570
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +535 -526
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +589 -578
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +536 -527
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +18 -7
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +565 -554
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +565 -554
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +582 -571
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +582 -571
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +582 -571
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +526 -517
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +573 -562
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +529 -520
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +565 -554
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +580 -569
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +580 -569
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +565 -554
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +578 -567
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +575 -564
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +581 -570
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +583 -572
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +583 -572
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +583 -572
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +18 -7
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +580 -569
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +580 -569
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml +580 -569
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +551 -542
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +532 -530
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +525 -516
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +541 -532
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +541 -532
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +541 -532
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +525 -516
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +533 -0
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +542 -0
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +542 -0
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +542 -0
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +529 -520
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +529 -520
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +580 -569
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +16 -7
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +16 -7
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +18 -7
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +16 -7
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +16 -7
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +16 -7
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +16 -7
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +567 -0
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +18 -7
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +18 -7
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +18 -7
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +16 -7
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +18 -7
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +18 -7
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +18 -7
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +18 -7
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +611 -598
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +589 -0
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +582 -571
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +18 -7
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +16 -7
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +18 -7
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +17 -7
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +16 -7
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +530 -521
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +530 -521
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +530 -521
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +566 -555
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +18 -7
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +18 -7
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +18 -7
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +18 -7
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +566 -555
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +566 -555
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +18 -7
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +18 -7
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +18 -7
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +18 -7
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +16 -7
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +574 -563
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +581 -570
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +583 -572
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +587 -576
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +587 -576
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +587 -576
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +591 -580
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +591 -580
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +591 -580
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +570 -559
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +586 -575
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +570 -559
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +586 -575
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +18 -7
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +16 -7
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +18 -7
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +552 -543
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +16 -7
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +963 -938
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +33 -69
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +530 -521
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +535 -0
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-ptac-with-heating.xml → base-hvac-ptac-with-heating-natural-gas.xml} +23 -21
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +526 -517
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +541 -532
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +16 -7
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +526 -517
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +526 -517
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +16 -7
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +535 -0
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +542 -0
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +594 -583
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +586 -575
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +18 -7
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +18 -7
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +530 -521
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +530 -521
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +18 -7
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +18 -7
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +530 -521
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +18 -7
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +18 -7
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +18 -7
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +18 -7
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +27 -12
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +591 -576
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +18 -7
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +27 -12
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +582 -571
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +537 -526
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +18 -7
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +537 -526
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +601 -586
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +18 -7
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +18 -7
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +601 -587
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +19 -7
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +20 -7
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +607 -0
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +607 -0
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +21 -7
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +18 -7
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +18 -7
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +18 -7
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +18 -7
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +18 -7
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +18 -7
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +37 -19
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +18 -7
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +18 -7
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +590 -579
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +578 -0
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +632 -0
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +614 -0
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +677 -0
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +593 -0
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +27 -9
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +676 -665
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +616 -0
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +615 -0
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +598 -587
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +586 -0
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +18 -7
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +18 -7
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +18 -7
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +18 -7
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +583 -572
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +18 -7
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1700 -1677
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +622 -611
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +697 -682
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-pv-battery-lifetime-model.xml → base-pv-battery-round-trip-efficiency.xml} +20 -11
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +624 -0
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +622 -611
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +640 -0
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +639 -0
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +623 -0
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +606 -595
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +582 -571
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-smooth.xml +583 -572
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +584 -0
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +583 -572
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +583 -572
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +581 -570
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +581 -570
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +581 -570
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +636 -625
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +18 -7
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +27 -14
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +21 -10
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +21 -10
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-operating-modes.xml → base-simcontrol-temperature-capacitance-multiplier.xml} +25 -13
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +584 -0
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +584 -0
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +18 -7
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-setpoints.xml → base-simcontrol-timestep-30-mins.xml} +25 -14
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +18 -7
  588. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +18 -13
  589. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +12 -7
  590. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +8 -24
  591. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +366 -358
  592. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +369 -361
  593. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +369 -361
  594. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +369 -361
  595. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +369 -361
  596. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +369 -361
  597. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +369 -361
  598. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +369 -361
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +311 -303
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +311 -303
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +327 -319
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +327 -319
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +332 -324
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +332 -324
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +341 -333
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +341 -333
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +369 -361
  608. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +369 -361
  609. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +369 -361
  610. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +369 -361
  611. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +369 -361
  612. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +369 -361
  613. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +383 -379
  614. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +383 -379
  615. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +538 -534
  616. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +550 -546
  617. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +444 -410
  618. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +8 -8
  619. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +444 -410
  620. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +18 -4
  621. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +133 -288
  622. data/example_files/scripts/convert_urbanopt_to_disco.py +130 -0
  623. data/example_files/scripts/default_control_changes.csv +8 -0
  624. data/example_files/scripts/default_voltage_regulators.csv +3 -0
  625. data/example_files/scripts/read_data.py +331 -0
  626. data/example_files/visualization/input_visualization_feature.html +172 -81
  627. data/example_files/visualization/input_visualization_scenario.html +178 -82
  628. data/example_files/xml_building/17/README.md +2 -2
  629. data/example_files/xml_building/17/unit 1.xml +40 -41
  630. data/example_files/xml_building/17/unit 2.xml +35 -36
  631. data/example_files/xml_building/17/unit 3.xml +35 -36
  632. data/example_files/xml_building/17/unit 4.xml +41 -42
  633. data/lib/uo_cli/version.rb +1 -1
  634. data/lib/uo_cli.rb +601 -101
  635. data/scripts/setup-env.bat +6 -7
  636. data/uo_cli.gemspec +6 -5
  637. metadata +121 -36
  638. data/example_files/residential/exhaust.tsv +0 -3
  639. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/hvac_equipment_efficiency.csv +0 -493
  640. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/water_heater_efficiency.csv +0 -157
  641. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/HPXMLvalidator.xml +0 -620
  642. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +0 -107
  643. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +0 -450
  644. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +0 -85
  645. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +0 -72
  646. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +0 -290
  647. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_10kW.csv +0 -8761
  648. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_1kW.csv +0 -8761
  649. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_None.csv +0 -8761
  650. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +0 -410
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'ostruct'
4
+
3
5
  '''
4
6
  Example Usage:
5
7
 
@@ -42,16 +44,13 @@ XMLHelper.write_file(hpxml.to_oga, "out.xml")
42
44
 
43
45
  '''
44
46
 
45
- require_relative 'version'
46
- require 'ostruct'
47
-
48
47
  # FUTURE: Remove all idref attributes, make object attributes instead
49
48
  # E.g., in class Window, :wall_idref => :wall
50
49
 
51
50
  class HPXML < Object
52
51
  HPXML_ATTRS = [:header, :site, :neighbor_buildings, :building_occupancy, :building_construction,
53
52
  :climate_and_risk_zones, :air_infiltration_measurements, :attics, :foundations,
54
- :roofs, :rim_joists, :walls, :foundation_walls, :frame_floors, :slabs, :windows,
53
+ :roofs, :rim_joists, :walls, :foundation_walls, :floors, :slabs, :windows,
55
54
  :skylights, :doors, :partition_wall_mass, :furniture_mass, :heating_systems,
56
55
  :cooling_systems, :heat_pumps, :hvac_plant, :hvac_controls, :hvac_distributions,
57
56
  :ventilation_fans, :water_heating_systems, :hot_water_distributions, :water_fixtures,
@@ -61,6 +60,8 @@ class HPXML < Object
61
60
  :ceiling_fans, :pools, :hot_tubs, :plug_loads, :fuel_loads]
62
61
  attr_reader(*HPXML_ATTRS, :doc, :errors, :warnings, :hpxml_path)
63
62
 
63
+ NameSpace = 'http://hpxmlonline.com/2019/10'
64
+
64
65
  # Constants
65
66
  # FUTURE: Move some of these to within child classes (e.g., HPXML::Attic class)
66
67
  AirTypeFanCoil = 'fan coil'
@@ -77,9 +78,13 @@ class HPXML < Object
77
78
  BatteryTypeLithiumIon = 'Li-ion'
78
79
  BatteryLifetimeModelNone = 'None'
79
80
  BatteryLifetimeModelKandlerSmith = 'KandlerSmith'
81
+ BuildingAmerica = 'BuildingAmerica'
80
82
  CertificationEnergyStar = 'Energy Star'
81
83
  ClothesDryerControlTypeMoisture = 'moisture'
82
84
  ClothesDryerControlTypeTimer = 'timer'
85
+ CFISModeAirHandler = 'air handler fan'
86
+ CFISModeNone = 'none'
87
+ CFISModeSupplementalFan = 'supplemental fan'
83
88
  ColorDark = 'dark'
84
89
  ColorLight = 'light'
85
90
  ColorMedium = 'medium'
@@ -119,8 +124,12 @@ class HPXML < Object
119
124
  FoundationWallTypeDoubleBrick = 'double brick'
120
125
  FoundationWallTypeSolidConcrete = 'solid concrete'
121
126
  FoundationWallTypeWood = 'wood'
122
- FrameFloorOtherSpaceAbove = 'above'
123
- FrameFloorOtherSpaceBelow = 'below'
127
+ FloorOrCeilingCeiling = 'ceiling'
128
+ FloorOrCeilingFloor = 'floor'
129
+ FloorTypeWoodFrame = 'WoodFrame'
130
+ FloorTypeSIP = 'StructuralInsulatedPanel'
131
+ FloorTypeSteelFrame = 'SteelFrame'
132
+ FloorTypeConcrete = 'SolidConcrete'
124
133
  FuelLoadTypeGrill = 'grill'
125
134
  FuelLoadTypeLighting = 'lighting'
126
135
  FuelLoadTypeFireplace = 'fireplace'
@@ -168,12 +177,12 @@ class HPXML < Object
168
177
  HVACTypeFixedHeater = 'FixedHeater'
169
178
  HVACTypeFloorFurnace = 'FloorFurnace'
170
179
  HVACTypeFurnace = 'Furnace'
171
- HVACTypePTACHeating = 'PackagedTerminalAirConditionerHeating'
172
180
  HVACTypeHeatPumpAirToAir = 'air-to-air'
173
181
  HVACTypeHeatPumpGroundToAir = 'ground-to-air'
174
182
  HVACTypeHeatPumpMiniSplit = 'mini-split'
175
183
  HVACTypeHeatPumpWaterLoopToAir = 'water-loop-to-air'
176
184
  HVACTypeHeatPumpPTHP = 'packaged terminal heat pump'
185
+ HVACTypeHeatPumpRoom = 'room air conditioner with reverse cycle'
177
186
  HVACTypeMiniSplitAirConditioner = 'mini-split'
178
187
  HVACTypePortableHeater = 'PortableHeater'
179
188
  HVACTypeRoomAirConditioner = 'room air conditioner'
@@ -241,6 +250,10 @@ class HPXML < Object
241
250
  PlugLoadTypeOther = 'other'
242
251
  PlugLoadTypeTelevision = 'TV other'
243
252
  PlugLoadTypeWellPump = 'well pump'
253
+ PVAnnualExcessSellbackRateTypeRetailElectricityCost = 'Retail Electricity Cost'
254
+ PVAnnualExcessSellbackRateTypeUserSpecified = 'User-Specified'
255
+ PVCompensationTypeFeedInTariff = 'FeedInTariff'
256
+ PVCompensationTypeNetMetering = 'NetMetering'
244
257
  PVModuleTypePremium = 'premium'
245
258
  PVModuleTypeStandard = 'standard'
246
259
  PVModuleTypeThinFilm = 'thin film'
@@ -296,19 +309,26 @@ class HPXML < Object
296
309
  UnitsACHNatural = 'ACHnatural'
297
310
  UnitsAFUE = 'AFUE'
298
311
  UnitsAh = 'Ah'
312
+ UnitsBtuPerHour = 'Btu/hr'
299
313
  UnitsCFM = 'CFM'
300
314
  UnitsCFM25 = 'CFM25'
301
315
  UnitsCFM50 = 'CFM50'
302
316
  UnitsCOP = 'COP'
317
+ UnitsDegFPerHour = 'F/hr'
318
+ UnitsDollars = '$'
319
+ UnitsDollarsPerkW = '$/kW'
303
320
  UnitsEER = 'EER'
304
321
  UnitsCEER = 'CEER'
305
322
  UnitsHSPF = 'HSPF'
323
+ UnitsHSPF2 = 'HSPF2'
306
324
  UnitsKwh = 'kWh'
307
325
  UnitsKwhPerYear = 'kWh/year'
308
326
  UnitsKwhPerDay = 'kWh/day'
309
327
  UnitsKwPerTon = 'kW/ton'
310
328
  UnitsPercent = 'Percent'
329
+ UnitsPercentPerHour = '%/hr'
311
330
  UnitsSEER = 'SEER'
331
+ UnitsSEER2 = 'SEER2'
312
332
  UnitsSLA = 'SLA'
313
333
  UnitsThermPerYear = 'therm/year'
314
334
  VerticalSurroundingsNoAboveOrBelow = 'no units above or below'
@@ -322,7 +342,7 @@ class HPXML < Object
322
342
  WallTypeDoubleWoodStud = 'DoubleWoodStud'
323
343
  WallTypeICF = 'InsulatedConcreteForms'
324
344
  WallTypeLog = 'LogWall'
325
- WallTypeSIP = 'StructurallyInsulatedPanel'
345
+ WallTypeSIP = 'StructuralInsulatedPanel'
326
346
  WallTypeSteelStud = 'SteelFrame'
327
347
  WallTypeStone = 'Stone'
328
348
  WallTypeStrawBale = 'StrawBale'
@@ -369,7 +389,7 @@ class HPXML < Object
369
389
  WindowClassResidential = 'residential'
370
390
  WindowClassLightCommercial = 'light commercial'
371
391
 
372
- def initialize(hpxml_path: nil, schematron_validators: [], collapse_enclosure: true, building_id: nil)
392
+ def initialize(hpxml_path: nil, schema_path: nil, schematron_path: nil, collapse_enclosure: true, building_id: nil)
373
393
  @doc = nil
374
394
  @hpxml_path = hpxml_path
375
395
  @errors = []
@@ -379,13 +399,23 @@ class HPXML < Object
379
399
  if not hpxml_path.nil?
380
400
  @doc = XMLHelper.parse_file(hpxml_path)
381
401
 
402
+ if not schema_path.nil?
403
+ xsd_errors, xsd_warnings = XMLValidator.validate_against_schema(hpxml_path, schema_path)
404
+ @errors += xsd_errors
405
+ @warnings += xsd_warnings
406
+ return unless @errors.empty?
407
+ end
408
+
382
409
  # Check HPXML version
383
410
  hpxml = XMLHelper.get_element(@doc, '/HPXML')
384
411
  Version.check_hpxml_version(XMLHelper.get_attribute_value(hpxml, 'schemaVersion'))
385
412
 
386
- # Validate against Schematron docs
387
- @errors, @warnings = validate_against_schematron(schematron_validators: schematron_validators)
388
- return unless @errors.empty?
413
+ if not schematron_path.nil?
414
+ sct_errors, sct_warnings = XMLValidator.validate_against_schematron(hpxml_path, schematron_path, hpxml)
415
+ @errors += sct_errors
416
+ @warnings += sct_warnings
417
+ return unless @errors.empty?
418
+ end
389
419
 
390
420
  # Handle multiple buildings
391
421
  if XMLHelper.get_elements(hpxml, 'Building').size > 1
@@ -428,7 +458,7 @@ class HPXML < Object
428
458
 
429
459
  def has_location(location)
430
460
  # Search for surfaces attached to this location
431
- (@roofs + @rim_joists + @walls + @foundation_walls + @frame_floors + @slabs).each do |surface|
461
+ (@roofs + @rim_joists + @walls + @foundation_walls + @floors + @slabs).each do |surface|
432
462
  return true if surface.interior_adjacent_to == location
433
463
  return true if surface.exterior_adjacent_to == location
434
464
  end
@@ -444,6 +474,25 @@ class HPXML < Object
444
474
  return false
445
475
  end
446
476
 
477
+ def has_fuel(fuel, hpxml_doc = nil)
478
+ # If calling multiple times, pass in hpxml_doc for better performance
479
+ if hpxml_doc.nil?
480
+ hpxml_doc = to_oga
481
+ end
482
+ ['HeatingSystemFuel',
483
+ 'CoolingSystemFuel',
484
+ 'HeatPumpFuel',
485
+ 'BackupSystemFuel',
486
+ 'FuelType',
487
+ 'IntegratedHeatingSystemFuel'].each do |fuel_name|
488
+ if XMLHelper.has_element(hpxml_doc, "//#{fuel_name}[text() = '#{fuel}']")
489
+ return true
490
+ end
491
+ end
492
+
493
+ return false
494
+ end
495
+
447
496
  def predominant_heating_fuel
448
497
  fuel_fracs = {}
449
498
  @heating_systems.each do |heating_system|
@@ -503,7 +552,7 @@ class HPXML < Object
503
552
  end
504
553
 
505
554
  def total_fraction_heat_load_served()
506
- return @heating_systems.total_fraction_heat_load_served + @heat_pumps.total_fraction_heat_load_served
555
+ return @heating_systems.total_fraction_heat_load_served + @heat_pumps.total_fraction_heat_load_served + @cooling_systems.total_fraction_heat_load_served
507
556
  end
508
557
 
509
558
  def has_walkout_basement()
@@ -576,7 +625,7 @@ class HPXML < Object
576
625
 
577
626
  # Get surfaces bounding infiltration volume
578
627
  spaces_within_infil_volume.each do |location|
579
- (@roofs + @rim_joists + @walls + @foundation_walls + @frame_floors + @slabs).each do |surface|
628
+ (@roofs + @rim_joists + @walls + @foundation_walls + @floors + @slabs).each do |surface|
580
629
  is_adiabatic_surface = (surface.interior_adjacent_to == surface.exterior_adjacent_to)
581
630
  next unless [surface.interior_adjacent_to,
582
631
  surface.exterior_adjacent_to].include? location
@@ -662,7 +711,7 @@ class HPXML < Object
662
711
  @rim_joists.to_oga(@doc)
663
712
  @walls.to_oga(@doc)
664
713
  @foundation_walls.to_oga(@doc)
665
- @frame_floors.to_oga(@doc)
714
+ @floors.to_oga(@doc)
666
715
  @slabs.to_oga(@doc)
667
716
  @windows.to_oga(@doc)
668
717
  @skylights.to_oga(@doc)
@@ -716,7 +765,7 @@ class HPXML < Object
716
765
  @rim_joists = RimJoists.new(self, hpxml)
717
766
  @walls = Walls.new(self, hpxml)
718
767
  @foundation_walls = FoundationWalls.new(self, hpxml)
719
- @frame_floors = FrameFloors.new(self, hpxml)
768
+ @floors = Floors.new(self, hpxml)
720
769
  @slabs = Slabs.new(self, hpxml)
721
770
  @windows = Windows.new(self, hpxml)
722
771
  @skylights = Skylights.new(self, hpxml)
@@ -869,30 +918,27 @@ class HPXML < Object
869
918
  class Header < BaseElement
870
919
  def initialize(hpxml_object, *args)
871
920
  @emissions_scenarios = EmissionsScenarios.new(hpxml_object)
921
+ @utility_bill_scenarios = UtilityBillScenarios.new(hpxml_object)
872
922
  super(hpxml_object, *args)
873
923
  end
874
924
  ATTRS = [:xml_type, :xml_generated_by, :created_date_and_time, :transaction,
875
925
  :software_program_used, :software_program_version, :eri_calculation_version,
876
- :eri_design, :timestep, :building_id, :event_type, :state_code, :zip_code,
926
+ :timestep, :building_id, :event_type, :state_code, :zip_code,
877
927
  :egrid_region, :egrid_subregion, :cambium_region_gea, :time_zone_utc_offset,
878
928
  :sim_begin_month, :sim_begin_day, :sim_end_month, :sim_end_day, :sim_calendar_year,
879
929
  :dst_enabled, :dst_begin_month, :dst_begin_day, :dst_end_month, :dst_end_day,
880
930
  :heat_pump_sizing_methodology, :allow_increased_fixed_capacities,
881
931
  :apply_ashrae140_assumptions, :energystar_calculation_version, :schedules_filepaths,
882
- :occupancy_calculation_type, :extension_properties]
932
+ :occupancy_calculation_type, :extension_properties, :iecc_eri_calculation_version,
933
+ :zerh_calculation_version, :temperature_capacitance_multiplier,
934
+ :natvent_days_per_week]
883
935
  attr_accessor(*ATTRS)
884
936
  attr_reader(:emissions_scenarios)
937
+ attr_reader(:utility_bill_scenarios)
885
938
 
886
939
  def check_for_errors
887
940
  errors = []
888
941
 
889
- if not @timestep.nil?
890
- valid_tsteps = [60, 30, 20, 15, 12, 10, 6, 5, 4, 3, 2, 1]
891
- if not valid_tsteps.include? @timestep
892
- errors << "Timestep (#{@timestep}) must be one of: #{valid_tsteps.join(', ')}."
893
- end
894
- end
895
-
896
942
  errors += HPXML::check_dates('Run Period', @sim_begin_month, @sim_begin_day, @sim_end_month, @sim_end_day)
897
943
 
898
944
  if (not @sim_begin_month.nil?) && (not @sim_end_month.nil?)
@@ -908,8 +954,8 @@ class HPXML < Object
908
954
  end
909
955
 
910
956
  errors += HPXML::check_dates('Daylight Saving', @dst_begin_month, @dst_begin_day, @dst_end_month, @dst_end_day)
911
-
912
957
  errors += @emissions_scenarios.check_for_errors
958
+ errors += @utility_bill_scenarios.check_for_errors
913
959
 
914
960
  return errors
915
961
  end
@@ -931,26 +977,19 @@ class HPXML < Object
931
977
  software_info = XMLHelper.add_element(hpxml, 'SoftwareInfo')
932
978
  XMLHelper.add_element(software_info, 'SoftwareProgramUsed', @software_program_used, :string) unless @software_program_used.nil?
933
979
  XMLHelper.add_element(software_info, 'SoftwareProgramVersion', @software_program_version, :string) unless @software_program_version.nil?
934
- if not @occupancy_calculation_type.nil?
935
- extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
936
- XMLHelper.add_element(extension, 'OccupancyCalculationType', @occupancy_calculation_type, :string, @occupancy_calculation_type_isdefaulted) unless @occupancy_calculation_type.nil?
937
- end
938
- if not @apply_ashrae140_assumptions.nil?
939
- extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
940
- XMLHelper.add_element(extension, 'ApplyASHRAE140Assumptions', @apply_ashrae140_assumptions, :boolean) unless @apply_ashrae140_assumptions.nil?
941
- end
942
- if (not @eri_calculation_version.nil?) || (not @eri_design.nil?)
943
- extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
944
- eri_calculation = XMLHelper.add_element(extension, 'ERICalculation')
945
- XMLHelper.add_element(eri_calculation, 'Version', @eri_calculation_version, :string) unless @eri_calculation_version.nil?
946
- XMLHelper.add_element(eri_calculation, 'Design', @eri_design, :string) unless @eri_design.nil?
947
- end
948
- if not @energystar_calculation_version.nil?
980
+ XMLHelper.add_extension(software_info, 'OccupancyCalculationType', @occupancy_calculation_type, :string, @occupancy_calculation_type_isdefaulted) unless @occupancy_calculation_type.nil?
981
+ XMLHelper.add_extension(software_info, 'ApplyASHRAE140Assumptions', @apply_ashrae140_assumptions, :boolean) unless @apply_ashrae140_assumptions.nil?
982
+ { @eri_calculation_version => 'ERICalculation',
983
+ @energystar_calculation_version => 'EnergyStarCalculation',
984
+ @iecc_eri_calculation_version => 'IECCERICalculation',
985
+ @zerh_calculation_version => 'ZERHCalculation' }.each do |calculation_version, element_name|
986
+ next if calculation_version.nil?
987
+
949
988
  extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
950
- energystar_calculation = XMLHelper.add_element(extension, 'EnergyStarCalculation')
951
- XMLHelper.add_element(energystar_calculation, 'Version', @energystar_calculation_version, :string) unless @energystar_calculation_version.nil?
989
+ calculation = XMLHelper.add_element(extension, element_name)
990
+ XMLHelper.add_element(calculation, 'Version', calculation_version, :string)
952
991
  end
953
- if (not @timestep.nil?) || (not @sim_begin_month.nil?) || (not @sim_begin_day.nil?) || (not @sim_end_month.nil?) || (not @sim_end_day.nil?) || (not @dst_enabled.nil?) || (not @dst_begin_month.nil?) || (not @dst_begin_day.nil?) || (not @dst_end_month.nil?) || (not @dst_end_day.nil?)
992
+ if (not @timestep.nil?) || (not @sim_begin_month.nil?) || (not @sim_begin_day.nil?) || (not @sim_end_month.nil?) || (not @sim_end_day.nil?) || (not @temperature_capacitance_multiplier.nil?)
954
993
  extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
955
994
  simulation_control = XMLHelper.add_element(extension, 'SimulationControl')
956
995
  XMLHelper.add_element(simulation_control, 'Timestep', @timestep, :integer, @timestep_isdefaulted) unless @timestep.nil?
@@ -959,20 +998,14 @@ class HPXML < Object
959
998
  XMLHelper.add_element(simulation_control, 'EndMonth', @sim_end_month, :integer, @sim_end_month_isdefaulted) unless @sim_end_month.nil?
960
999
  XMLHelper.add_element(simulation_control, 'EndDayOfMonth', @sim_end_day, :integer, @sim_end_day_isdefaulted) unless @sim_end_day.nil?
961
1000
  XMLHelper.add_element(simulation_control, 'CalendarYear', @sim_calendar_year, :integer, @sim_calendar_year_isdefaulted) unless @sim_calendar_year.nil?
962
- if (not @dst_enabled.nil?) || (not @dst_begin_month.nil?) || (not @dst_begin_day.nil?) || (not @dst_end_month.nil?) || (not @dst_end_day.nil?)
963
- daylight_saving = XMLHelper.add_element(simulation_control, 'DaylightSaving')
964
- XMLHelper.add_element(daylight_saving, 'Enabled', @dst_enabled, :boolean, @dst_enabled_isdefaulted) unless @dst_enabled.nil?
965
- XMLHelper.add_element(daylight_saving, 'BeginMonth', @dst_begin_month, :integer, @dst_begin_month_isdefaulted) unless @dst_begin_month.nil?
966
- XMLHelper.add_element(daylight_saving, 'BeginDayOfMonth', @dst_begin_day, :integer, @dst_begin_day_isdefaulted) unless @dst_begin_day.nil?
967
- XMLHelper.add_element(daylight_saving, 'EndMonth', @dst_end_month, :integer, @dst_end_month_isdefaulted) unless @dst_end_month.nil?
968
- XMLHelper.add_element(daylight_saving, 'EndDayOfMonth', @dst_end_day, :integer, @dst_end_day_isdefaulted) unless @dst_end_day.nil?
969
- end
1001
+ XMLHelper.add_element(simulation_control, 'TemperatureCapacitanceMultiplier', @temperature_capacitance_multiplier, :float, @temperature_capacitance_multiplier_isdefaulted) unless @temperature_capacitance_multiplier.nil?
970
1002
  end
971
1003
  if (not @heat_pump_sizing_methodology.nil?) || (not @allow_increased_fixed_capacities.nil?)
972
1004
  hvac_sizing_control = XMLHelper.create_elements_as_needed(software_info, ['extension', 'HVACSizingControl'])
973
1005
  XMLHelper.add_element(hvac_sizing_control, 'HeatPumpSizingMethodology', @heat_pump_sizing_methodology, :string, @heat_pump_sizing_methodology_isdefaulted) unless @heat_pump_sizing_methodology.nil?
974
1006
  XMLHelper.add_element(hvac_sizing_control, 'AllowIncreasedFixedCapacities', @allow_increased_fixed_capacities, :boolean, @allow_increased_fixed_capacities_isdefaulted) unless @allow_increased_fixed_capacities.nil?
975
1007
  end
1008
+ XMLHelper.add_extension(software_info, 'NaturalVentilationAvailabilityDaysperWeek', @natvent_days_per_week, :integer, @natvent_days_per_week_isdefaulted) unless @natvent_days_per_week.nil?
976
1009
  if (not @schedules_filepaths.nil?) && (not @schedules_filepaths.empty?)
977
1010
  extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
978
1011
  @schedules_filepaths.each do |schedules_filepath|
@@ -986,11 +1019,12 @@ class HPXML < Object
986
1019
  end
987
1020
  end
988
1021
  @emissions_scenarios.to_oga(software_info)
1022
+ @utility_bill_scenarios.to_oga(software_info)
989
1023
 
990
1024
  building = XMLHelper.add_element(hpxml, 'Building')
991
1025
  building_building_id = XMLHelper.add_element(building, 'BuildingID')
992
1026
  XMLHelper.add_attribute(building_building_id, 'id', @building_id)
993
- if (not @state_code.nil?) || (not @zip_code.nil?) || (not @time_zone_utc_offset.nil?) || (not @egrid_region.nil?) || (not @egrid_subregion.nil?) || (not @cambium_region_gea.nil?)
1027
+ if (not @state_code.nil?) || (not @zip_code.nil?) || (not @time_zone_utc_offset.nil?) || (not @egrid_region.nil?) || (not @egrid_subregion.nil?) || (not @cambium_region_gea.nil?) || (not @dst_enabled.nil?) || (not @dst_begin_month.nil?) || (not @dst_begin_day.nil?) || (not @dst_end_month.nil?) || (not @dst_end_day.nil?)
994
1028
  site = XMLHelper.add_element(building, 'Site')
995
1029
  site_id = XMLHelper.add_element(site, 'SiteID')
996
1030
  XMLHelper.add_attribute(site_id, 'id', 'SiteID')
@@ -1008,9 +1042,14 @@ class HPXML < Object
1008
1042
  if not @cambium_region_gea.nil?
1009
1043
  XMLHelper.add_element(site, 'CambiumRegionGEA', @cambium_region_gea, :string, @cambium_region_gea_isdefaulted)
1010
1044
  end
1011
- if not @time_zone_utc_offset.nil?
1045
+ if (not @time_zone_utc_offset.nil?) || (not @dst_enabled.nil?) || (not @dst_begin_month.nil?) || (not @dst_begin_day.nil?) || (not @dst_end_month.nil?) || (not @dst_end_day.nil?)
1012
1046
  time_zone = XMLHelper.add_element(site, 'TimeZone')
1013
- XMLHelper.add_element(time_zone, 'UTCOffset', @time_zone_utc_offset, :float, @time_zone_utc_offset_isdefaulted)
1047
+ XMLHelper.add_element(time_zone, 'UTCOffset', @time_zone_utc_offset, :float, @time_zone_utc_offset_isdefaulted) unless @time_zone_utc_offset.nil?
1048
+ XMLHelper.add_element(time_zone, 'DSTObserved', @dst_enabled, :boolean, @dst_enabled_isdefaulted) unless @dst_enabled.nil?
1049
+ XMLHelper.add_extension(time_zone, 'DSTBeginMonth', @dst_begin_month, :integer, @dst_begin_month_isdefaulted) unless @dst_begin_month.nil?
1050
+ XMLHelper.add_extension(time_zone, 'DSTBeginDayOfMonth', @dst_begin_day, :integer, @dst_begin_day_isdefaulted) unless @dst_begin_day.nil?
1051
+ XMLHelper.add_extension(time_zone, 'DSTEndMonth', @dst_end_month, :integer, @dst_end_month_isdefaulted) unless @dst_end_month.nil?
1052
+ XMLHelper.add_extension(time_zone, 'DSTEndDayOfMonth', @dst_end_day, :integer, @dst_end_day_isdefaulted) unless @dst_end_day.nil?
1014
1053
  end
1015
1054
  end
1016
1055
  project_status = XMLHelper.add_element(building, 'ProjectStatus')
@@ -1027,20 +1066,18 @@ class HPXML < Object
1027
1066
  @software_program_used = XMLHelper.get_value(hpxml, 'SoftwareInfo/SoftwareProgramUsed', :string)
1028
1067
  @software_program_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/SoftwareProgramVersion', :string)
1029
1068
  @eri_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ERICalculation/Version', :string)
1030
- @eri_design = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ERICalculation/Design', :string)
1069
+ @iecc_eri_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/IECCERICalculation/Version', :string)
1031
1070
  @energystar_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/EnergyStarCalculation/Version', :string)
1071
+ @zerh_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ZERHCalculation/Version', :string)
1032
1072
  @timestep = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/Timestep', :integer)
1033
1073
  @sim_begin_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginMonth', :integer)
1034
1074
  @sim_begin_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginDayOfMonth', :integer)
1035
1075
  @sim_end_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndMonth', :integer)
1036
1076
  @sim_end_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndDayOfMonth', :integer)
1037
1077
  @sim_calendar_year = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/CalendarYear', :integer)
1038
- @dst_enabled = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/Enabled', :boolean)
1039
- @dst_begin_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/BeginMonth', :integer)
1040
- @dst_begin_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/BeginDayOfMonth', :integer)
1041
- @dst_end_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/EndMonth', :integer)
1042
- @dst_end_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/EndDayOfMonth', :integer)
1078
+ @temperature_capacitance_multiplier = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/TemperatureCapacitanceMultiplier', :float)
1043
1079
  @occupancy_calculation_type = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/OccupancyCalculationType', :string)
1080
+ @natvent_days_per_week = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/NaturalVentilationAvailabilityDaysperWeek', :integer)
1044
1081
  @apply_ashrae140_assumptions = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ApplyASHRAE140Assumptions', :boolean)
1045
1082
  @heat_pump_sizing_methodology = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/HeatPumpSizingMethodology', :string)
1046
1083
  @allow_increased_fixed_capacities = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/AllowIncreasedFixedCapacities', :boolean)
@@ -1055,6 +1092,7 @@ class HPXML < Object
1055
1092
  end
1056
1093
  end
1057
1094
  @emissions_scenarios.from_oga(XMLHelper.get_element(hpxml, 'SoftwareInfo'))
1095
+ @utility_bill_scenarios.from_oga(XMLHelper.get_element(hpxml, 'SoftwareInfo'))
1058
1096
  @building_id = HPXML::get_id(hpxml, 'Building/BuildingID')
1059
1097
  @event_type = XMLHelper.get_value(hpxml, 'Building/ProjectStatus/EventType', :string)
1060
1098
  @state_code = XMLHelper.get_value(hpxml, 'Building/Site/Address/StateCode', :string)
@@ -1063,6 +1101,11 @@ class HPXML < Object
1063
1101
  @egrid_subregion = XMLHelper.get_value(hpxml, 'Building/Site/eGridSubregion', :string)
1064
1102
  @cambium_region_gea = XMLHelper.get_value(hpxml, 'Building/Site/CambiumRegionGEA', :string)
1065
1103
  @time_zone_utc_offset = XMLHelper.get_value(hpxml, 'Building/Site/TimeZone/UTCOffset', :float)
1104
+ @dst_enabled = XMLHelper.get_value(hpxml, 'Building/Site/TimeZone/DSTObserved', :boolean)
1105
+ @dst_begin_month = XMLHelper.get_value(hpxml, 'Building/Site/TimeZone/extension/DSTBeginMonth', :integer)
1106
+ @dst_begin_day = XMLHelper.get_value(hpxml, 'Building/Site/TimeZone/extension/DSTBeginDayOfMonth', :integer)
1107
+ @dst_end_month = XMLHelper.get_value(hpxml, 'Building/Site/TimeZone/extension/DSTEndMonth', :integer)
1108
+ @dst_end_day = XMLHelper.get_value(hpxml, 'Building/Site/TimeZone/extension/DSTEndDayOfMonth', :integer)
1066
1109
  end
1067
1110
  end
1068
1111
 
@@ -1094,7 +1137,7 @@ class HPXML < Object
1094
1137
  attr_accessor(*ATTRS)
1095
1138
 
1096
1139
  def delete
1097
- @hpxml_object.emissions_scenarios.delete(self)
1140
+ @hpxml_object.header.emissions_scenarios.delete(self)
1098
1141
  end
1099
1142
 
1100
1143
  def check_for_errors
@@ -1164,8 +1207,131 @@ class HPXML < Object
1164
1207
  end
1165
1208
  end
1166
1209
 
1210
+ class UtilityBillScenarios < BaseArrayElement
1211
+ def add(**kwargs)
1212
+ self << UtilityBillScenario.new(@hpxml_object, **kwargs)
1213
+ end
1214
+
1215
+ def from_oga(software_info)
1216
+ return if software_info.nil?
1217
+
1218
+ XMLHelper.get_elements(software_info, 'extension/UtilityBillScenarios/UtilityBillScenario').each do |utility_bill_scenario|
1219
+ self << UtilityBillScenario.new(@hpxml_object, utility_bill_scenario)
1220
+ end
1221
+ end
1222
+
1223
+ def has_simple_electric_rates
1224
+ any? { |bill_scen| !bill_scen.elec_fixed_charge.nil? || !bill_scen.elec_marginal_rate.nil? }
1225
+ end
1226
+
1227
+ def has_detailed_electric_rates
1228
+ any? { |bill_scen| !bill_scen.elec_tariff_filepath.nil? }
1229
+ end
1230
+ end
1231
+
1232
+ class UtilityBillScenario < BaseElement
1233
+ ATTRS = [:name,
1234
+ :elec_tariff_filepath,
1235
+ :elec_fixed_charge, :natural_gas_fixed_charge, :propane_fixed_charge, :fuel_oil_fixed_charge,
1236
+ :coal_fixed_charge, :wood_fixed_charge, :wood_pellets_fixed_charge,
1237
+ :elec_marginal_rate, :natural_gas_marginal_rate, :propane_marginal_rate, :fuel_oil_marginal_rate,
1238
+ :coal_marginal_rate, :wood_marginal_rate, :wood_pellets_marginal_rate,
1239
+ :pv_compensation_type,
1240
+ :pv_net_metering_annual_excess_sellback_rate_type, :pv_net_metering_annual_excess_sellback_rate,
1241
+ :pv_feed_in_tariff_rate,
1242
+ :pv_monthly_grid_connection_fee_dollars_per_kw, :pv_monthly_grid_connection_fee_dollars]
1243
+ attr_accessor(*ATTRS)
1244
+
1245
+ def delete
1246
+ @hpxml_object.header.utility_bill_scenarios.delete(self)
1247
+ end
1248
+
1249
+ def check_for_errors
1250
+ errors = []
1251
+ return errors
1252
+ end
1253
+
1254
+ def to_oga(software_info)
1255
+ utility_bill_scenarios = XMLHelper.create_elements_as_needed(software_info, ['extension', 'UtilityBillScenarios'])
1256
+ utility_bill_scenario = XMLHelper.add_element(utility_bill_scenarios, 'UtilityBillScenario')
1257
+ XMLHelper.add_element(utility_bill_scenario, 'Name', @name, :string) unless @name.nil?
1258
+ { HPXML::FuelTypeElectricity => [@elec_fixed_charge, @elec_fixed_charge_isdefaulted, @elec_marginal_rate, @elec_marginal_rate_isdefaulted, @elec_tariff_filepath],
1259
+ HPXML::FuelTypeNaturalGas => [@natural_gas_fixed_charge, @natural_gas_fixed_charge_isdefaulted, @natural_gas_marginal_rate, @natural_gas_marginal_rate_isdefaulted, nil],
1260
+ HPXML::FuelTypePropane => [@propane_fixed_charge, @propane_fixed_charge_isdefaulted, @propane_marginal_rate, @propane_marginal_rate_isdefaulted, nil],
1261
+ HPXML::FuelTypeOil => [@fuel_oil_fixed_charge, @fuel_oil_fixed_charge_isdefaulted, @fuel_oil_marginal_rate, @fuel_oil_marginal_rate_isdefaulted, nil],
1262
+ HPXML::FuelTypeCoal => [@coal_fixed_charge, @coal_fixed_charge_isdefaulted, @coal_marginal_rate, @coal_marginal_rate_isdefaulted, nil],
1263
+ HPXML::FuelTypeWoodCord => [@wood_fixed_charge, @wood_fixed_charge_isdefaulted, @wood_marginal_rate, @wood_marginal_rate_isdefaulted, nil],
1264
+ HPXML::FuelTypeWoodPellets => [@wood_pellets_fixed_charge, @wood_pellets_fixed_charge_isdefaulted, @wood_pellets_marginal_rate, @wood_pellets_marginal_rate_isdefaulted, nil] }.each do |fuel, vals|
1265
+ fixed_charge, fixed_charge_isdefaulted, marginal_rate, marginal_rate_isdefaulted, tariff_filepath = vals
1266
+ next if fixed_charge.nil? && marginal_rate.nil? && tariff_filepath.nil?
1267
+
1268
+ utility_rate = XMLHelper.add_element(utility_bill_scenario, 'UtilityRate')
1269
+ XMLHelper.add_element(utility_rate, 'FuelType', fuel, :string)
1270
+ XMLHelper.add_element(utility_rate, 'TariffFilePath', tariff_filepath, :string) unless tariff_filepath.nil?
1271
+ XMLHelper.add_element(utility_rate, 'FixedCharge', fixed_charge, :float, fixed_charge_isdefaulted) unless fixed_charge.nil?
1272
+ XMLHelper.add_element(utility_rate, 'MarginalRate', marginal_rate, :float, marginal_rate_isdefaulted) unless marginal_rate.nil?
1273
+ end
1274
+ if not @pv_compensation_type.nil?
1275
+ pv = XMLHelper.add_element(utility_bill_scenario, 'PVCompensation')
1276
+ pc_compensation_type = XMLHelper.add_element(pv, 'CompensationType')
1277
+ pv_compensation_type_el = XMLHelper.add_element(pc_compensation_type, @pv_compensation_type, nil, nil, pv_compensation_type_isdefaulted)
1278
+ if @pv_compensation_type == HPXML::PVCompensationTypeNetMetering
1279
+ XMLHelper.add_element(pv_compensation_type_el, 'AnnualExcessSellbackRateType', @pv_net_metering_annual_excess_sellback_rate_type, :string, pv_net_metering_annual_excess_sellback_rate_type_isdefaulted) unless @pv_net_metering_annual_excess_sellback_rate_type.nil?
1280
+ if @pv_net_metering_annual_excess_sellback_rate_type == HPXML::PVAnnualExcessSellbackRateTypeUserSpecified
1281
+ XMLHelper.add_element(pv_compensation_type_el, 'AnnualExcessSellbackRate', @pv_net_metering_annual_excess_sellback_rate, :float, pv_net_metering_annual_excess_sellback_rate_isdefaulted) unless @pv_net_metering_annual_excess_sellback_rate.nil?
1282
+ end
1283
+ elsif @pv_compensation_type == HPXML::PVCompensationTypeFeedInTariff
1284
+ XMLHelper.add_element(pv_compensation_type_el, 'FeedInTariffRate', @pv_feed_in_tariff_rate, :float, pv_feed_in_tariff_rate_isdefaulted) unless @pv_feed_in_tariff_rate.nil?
1285
+ end
1286
+ if not @pv_monthly_grid_connection_fee_dollars_per_kw.nil?
1287
+ monthly_grid_connection_fee = XMLHelper.add_element(pv, 'MonthlyGridConnectionFee')
1288
+ XMLHelper.add_element(monthly_grid_connection_fee, 'Units', UnitsDollarsPerkW, :string)
1289
+ XMLHelper.add_element(monthly_grid_connection_fee, 'Value', @pv_monthly_grid_connection_fee_dollars_per_kw, :float, pv_monthly_grid_connection_fee_dollars_per_kw_isdefaulted)
1290
+ end
1291
+ if not @pv_monthly_grid_connection_fee_dollars.nil?
1292
+ monthly_grid_connection_fee = XMLHelper.add_element(pv, 'MonthlyGridConnectionFee')
1293
+ XMLHelper.add_element(monthly_grid_connection_fee, 'Units', UnitsDollars, :string)
1294
+ XMLHelper.add_element(monthly_grid_connection_fee, 'Value', @pv_monthly_grid_connection_fee_dollars, :float, pv_monthly_grid_connection_fee_dollars_isdefaulted)
1295
+ end
1296
+ end
1297
+ end
1298
+
1299
+ def from_oga(utility_bill_scenario)
1300
+ return if utility_bill_scenario.nil?
1301
+
1302
+ @name = XMLHelper.get_value(utility_bill_scenario, 'Name', :string)
1303
+ @elec_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeElectricity}']/FixedCharge", :float)
1304
+ @elec_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeElectricity}']/MarginalRate", :float)
1305
+ @elec_tariff_filepath = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeElectricity}']/TariffFilePath", :string)
1306
+ @natural_gas_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeNaturalGas}']/FixedCharge", :float)
1307
+ @natural_gas_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeNaturalGas}']/MarginalRate", :float)
1308
+ @propane_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypePropane}']/FixedCharge", :float)
1309
+ @propane_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypePropane}']/MarginalRate", :float)
1310
+ @fuel_oil_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeOil}']/FixedCharge", :float)
1311
+ @fuel_oil_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeOil}']/MarginalRate", :float)
1312
+ @coal_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeCoal}']/FixedCharge", :float)
1313
+ @coal_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeCoal}']/MarginalRate", :float)
1314
+ @wood_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeWoodCord}']/FixedCharge", :float)
1315
+ @wood_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeWoodCord}']/MarginalRate", :float)
1316
+ @wood_pellets_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeWoodPellets}']/FixedCharge", :float)
1317
+ @wood_pellets_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeWoodPellets}']/MarginalRate", :float)
1318
+ @pv_compensation_type = XMLHelper.get_child_name(utility_bill_scenario, 'PVCompensation/CompensationType')
1319
+ if @pv_compensation_type == HPXML::PVCompensationTypeNetMetering
1320
+ @pv_net_metering_annual_excess_sellback_rate_type = XMLHelper.get_value(utility_bill_scenario, "PVCompensation/CompensationType/#{HPXML::PVCompensationTypeNetMetering}/AnnualExcessSellbackRateType", :string)
1321
+ if @pv_net_metering_annual_excess_sellback_rate_type == HPXML::PVAnnualExcessSellbackRateTypeUserSpecified
1322
+ @pv_net_metering_annual_excess_sellback_rate = XMLHelper.get_value(utility_bill_scenario, "PVCompensation/CompensationType/#{HPXML::PVCompensationTypeNetMetering}/AnnualExcessSellbackRate", :float)
1323
+ end
1324
+ elsif @pv_compensation_type == HPXML::PVCompensationTypeFeedInTariff
1325
+ @pv_feed_in_tariff_rate = XMLHelper.get_value(utility_bill_scenario, "PVCompensation/CompensationType/#{HPXML::PVCompensationTypeFeedInTariff}/FeedInTariffRate", :float)
1326
+ end
1327
+ @pv_monthly_grid_connection_fee_dollars_per_kw = XMLHelper.get_value(utility_bill_scenario, "PVCompensation/MonthlyGridConnectionFee[Units='#{UnitsDollarsPerkW}']/Value", :float)
1328
+ @pv_monthly_grid_connection_fee_dollars = XMLHelper.get_value(utility_bill_scenario, "PVCompensation/MonthlyGridConnectionFee[Units='#{UnitsDollars}']/Value", :float)
1329
+ end
1330
+ end
1331
+
1167
1332
  class Site < BaseElement
1168
- ATTRS = [:site_type, :surroundings, :vertical_surroundings, :shielding_of_home, :orientation_of_front_of_home, :azimuth_of_front_of_home, :fuels]
1333
+ ATTRS = [:site_type, :surroundings, :vertical_surroundings, :shielding_of_home, :orientation_of_front_of_home, :azimuth_of_front_of_home, :fuels,
1334
+ :ground_conductivity]
1169
1335
  attr_accessor(*ATTRS)
1170
1336
 
1171
1337
  def check_for_errors
@@ -1189,6 +1355,7 @@ class HPXML < Object
1189
1355
  XMLHelper.add_element(fuel_types_available, 'Fuel', fuel, :string)
1190
1356
  end
1191
1357
  end
1358
+ XMLHelper.add_extension(site, 'GroundConductivity', @ground_conductivity, :float, @ground_conductivity_isdefaulted) unless @ground_conductivity.nil?
1192
1359
 
1193
1360
  if site.children.size == 0
1194
1361
  bldg_summary = XMLHelper.get_element(doc, '/HPXML/Building/BuildingDetails/BuildingSummary')
@@ -1209,6 +1376,7 @@ class HPXML < Object
1209
1376
  @orientation_of_front_of_home = XMLHelper.get_value(site, 'OrientationOfFrontOfHome', :string)
1210
1377
  @azimuth_of_front_of_home = XMLHelper.get_value(site, 'AzimuthOfFrontOfHome', :integer)
1211
1378
  @fuels = XMLHelper.get_values(site, 'FuelTypesAvailable/Fuel', :string)
1379
+ @ground_conductivity = XMLHelper.get_value(site, 'extension/GroundConductivity', :float)
1212
1380
  end
1213
1381
  end
1214
1382
 
@@ -1292,7 +1460,7 @@ class HPXML < Object
1292
1460
  ATTRS = [:year_built, :number_of_conditioned_floors, :number_of_conditioned_floors_above_grade,
1293
1461
  :average_ceiling_height, :number_of_bedrooms, :number_of_bathrooms,
1294
1462
  :conditioned_floor_area, :conditioned_building_volume, :residential_facility_type,
1295
- :has_flue_or_chimney]
1463
+ :building_footprint_area, :has_flue_or_chimney]
1296
1464
  attr_accessor(*ATTRS)
1297
1465
 
1298
1466
  def check_for_errors
@@ -1311,6 +1479,7 @@ class HPXML < Object
1311
1479
  XMLHelper.add_element(building_construction, 'AverageCeilingHeight', @average_ceiling_height, :float, @average_ceiling_height_isdefaulted) unless @average_ceiling_height.nil?
1312
1480
  XMLHelper.add_element(building_construction, 'NumberofBedrooms', @number_of_bedrooms, :integer) unless @number_of_bedrooms.nil?
1313
1481
  XMLHelper.add_element(building_construction, 'NumberofBathrooms', @number_of_bathrooms, :integer, @number_of_bathrooms_isdefaulted) unless @number_of_bathrooms.nil?
1482
+ XMLHelper.add_element(building_construction, 'BuildingFootprintArea', @building_footprint_area, :float, @building_footprint_area_isdefaulted) unless @building_footprint_area.nil?
1314
1483
  XMLHelper.add_element(building_construction, 'ConditionedFloorArea', @conditioned_floor_area, :float) unless @conditioned_floor_area.nil?
1315
1484
  XMLHelper.add_element(building_construction, 'ConditionedBuildingVolume', @conditioned_building_volume, :float, @conditioned_building_volume_isdefaulted) unless @conditioned_building_volume.nil?
1316
1485
  XMLHelper.add_extension(building_construction, 'HasFlueOrChimney', @has_flue_or_chimney, :boolean, @has_flue_or_chimney_isdefaulted) unless @has_flue_or_chimney.nil?
@@ -1329,6 +1498,7 @@ class HPXML < Object
1329
1498
  @average_ceiling_height = XMLHelper.get_value(building_construction, 'AverageCeilingHeight', :float)
1330
1499
  @number_of_bedrooms = XMLHelper.get_value(building_construction, 'NumberofBedrooms', :integer)
1331
1500
  @number_of_bathrooms = XMLHelper.get_value(building_construction, 'NumberofBathrooms', :integer)
1501
+ @building_footprint_area = XMLHelper.get_value(building_construction, 'BuildingFootprintArea', :float)
1332
1502
  @conditioned_floor_area = XMLHelper.get_value(building_construction, 'ConditionedFloorArea', :float)
1333
1503
  @conditioned_building_volume = XMLHelper.get_value(building_construction, 'ConditionedBuildingVolume', :float)
1334
1504
  @has_flue_or_chimney = XMLHelper.get_value(building_construction, 'extension/HasFlueOrChimney', :boolean)
@@ -1336,12 +1506,17 @@ class HPXML < Object
1336
1506
  end
1337
1507
 
1338
1508
  class ClimateandRiskZones < BaseElement
1339
- ATTRS = [:iecc_year, :iecc_zone, :weather_station_id, :weather_station_name, :weather_station_wmo,
1340
- :weather_station_epw_filepath]
1509
+ def initialize(hpxml_object, *args)
1510
+ @climate_zone_ieccs = ClimateZoneIECCs.new(hpxml_object)
1511
+ super(hpxml_object, *args)
1512
+ end
1513
+ ATTRS = [:weather_station_id, :weather_station_name, :weather_station_wmo, :weather_station_epw_filepath]
1341
1514
  attr_accessor(*ATTRS)
1515
+ attr_reader(:climate_zone_ieccs)
1342
1516
 
1343
1517
  def check_for_errors
1344
1518
  errors = []
1519
+ errors += @climate_zone_ieccs.check_for_errors
1345
1520
  return errors
1346
1521
  end
1347
1522
 
@@ -1350,11 +1525,7 @@ class HPXML < Object
1350
1525
 
1351
1526
  climate_and_risk_zones = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'ClimateandRiskZones'])
1352
1527
 
1353
- if (not @iecc_year.nil?) && (not @iecc_zone.nil?)
1354
- climate_zone_iecc = XMLHelper.add_element(climate_and_risk_zones, 'ClimateZoneIECC')
1355
- XMLHelper.add_element(climate_zone_iecc, 'Year', @iecc_year, :integer, @iecc_year_isdefaulted) unless @iecc_year.nil?
1356
- XMLHelper.add_element(climate_zone_iecc, 'ClimateZone', @iecc_zone, :string, @iecc_zone_isdefaulted) unless @iecc_zone.nil?
1357
- end
1528
+ @climate_zone_ieccs.to_oga(climate_and_risk_zones)
1358
1529
 
1359
1530
  if not @weather_station_id.nil?
1360
1531
  weather_station = XMLHelper.add_element(climate_and_risk_zones, 'WeatherStation')
@@ -1372,8 +1543,8 @@ class HPXML < Object
1372
1543
  climate_and_risk_zones = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/ClimateandRiskZones')
1373
1544
  return if climate_and_risk_zones.nil?
1374
1545
 
1375
- @iecc_year = XMLHelper.get_value(climate_and_risk_zones, 'ClimateZoneIECC/Year', :integer)
1376
- @iecc_zone = XMLHelper.get_value(climate_and_risk_zones, 'ClimateZoneIECC/ClimateZone', :string)
1546
+ @climate_zone_ieccs.from_oga(climate_and_risk_zones)
1547
+
1377
1548
  weather_station = XMLHelper.get_element(climate_and_risk_zones, 'WeatherStation')
1378
1549
  if not weather_station.nil?
1379
1550
  @weather_station_id = HPXML::get_id(weather_station)
@@ -1384,6 +1555,47 @@ class HPXML < Object
1384
1555
  end
1385
1556
  end
1386
1557
 
1558
+ class ClimateZoneIECCs < BaseArrayElement
1559
+ def add(**kwargs)
1560
+ self << ClimateZoneIECC.new(@hpxml_object, **kwargs)
1561
+ end
1562
+
1563
+ def from_oga(climate_and_risk_zones)
1564
+ return if climate_and_risk_zones.nil?
1565
+
1566
+ XMLHelper.get_elements(climate_and_risk_zones, 'ClimateZoneIECC').each do |climate_zone_iecc|
1567
+ self << ClimateZoneIECC.new(@hpxml_object, climate_zone_iecc)
1568
+ end
1569
+ end
1570
+ end
1571
+
1572
+ class ClimateZoneIECC < BaseElement
1573
+ ATTRS = [:year, :zone]
1574
+ attr_accessor(*ATTRS)
1575
+
1576
+ def delete
1577
+ @hpxml_object.climate_and_risk_zones.climate_zone_ieccs.delete(self)
1578
+ end
1579
+
1580
+ def check_for_errors
1581
+ errors = []
1582
+ return errors
1583
+ end
1584
+
1585
+ def to_oga(climate_and_risk_zones)
1586
+ climate_zone_iecc = XMLHelper.add_element(climate_and_risk_zones, 'ClimateZoneIECC')
1587
+ XMLHelper.add_element(climate_zone_iecc, 'Year', @year, :integer, @year_isdefaulted) unless @year.nil?
1588
+ XMLHelper.add_element(climate_zone_iecc, 'ClimateZone', @zone, :string, @zone_isdefaulted) unless @zone.nil?
1589
+ end
1590
+
1591
+ def from_oga(climate_zone_iecc)
1592
+ return if climate_zone_iecc.nil?
1593
+
1594
+ @year = XMLHelper.get_value(climate_zone_iecc, 'Year', :integer)
1595
+ @zone = XMLHelper.get_value(climate_zone_iecc, 'ClimateZone', :string)
1596
+ end
1597
+ end
1598
+
1387
1599
  class AirInfiltrationMeasurements < BaseArrayElement
1388
1600
  def add(**kwargs)
1389
1601
  self << AirInfiltrationMeasurement.new(@hpxml_object, **kwargs)
@@ -1461,7 +1673,7 @@ class HPXML < Object
1461
1673
 
1462
1674
  class Attic < BaseElement
1463
1675
  ATTRS = [:id, :attic_type, :vented_attic_sla, :vented_attic_ach, :within_infiltration_volume,
1464
- :attached_to_roof_idrefs, :attached_to_wall_idrefs, :attached_to_frame_floor_idrefs]
1676
+ :attached_to_roof_idrefs, :attached_to_wall_idrefs, :attached_to_floor_idrefs]
1465
1677
  attr_accessor(*ATTRS)
1466
1678
 
1467
1679
  def attached_roofs
@@ -1486,12 +1698,12 @@ class HPXML < Object
1486
1698
  return list
1487
1699
  end
1488
1700
 
1489
- def attached_frame_floors
1490
- return [] if @attached_to_frame_floor_idrefs.nil?
1701
+ def attached_floors
1702
+ return [] if @attached_to_floor_idrefs.nil?
1491
1703
 
1492
- list = @hpxml_object.frame_floors.select { |frame_floor| @attached_to_frame_floor_idrefs.include? frame_floor.id }
1493
- if @attached_to_frame_floor_idrefs.size > list.size
1494
- fail "Attached frame floor not found for attic '#{@id}'."
1704
+ list = @hpxml_object.floors.select { |floor| @attached_to_floor_idrefs.include? floor.id }
1705
+ if @attached_to_floor_idrefs.size > list.size
1706
+ fail "Attached floor not found for attic '#{@id}'."
1495
1707
  end
1496
1708
 
1497
1709
  return list
@@ -1519,7 +1731,7 @@ class HPXML < Object
1519
1731
  errors = []
1520
1732
  begin; attached_roofs; rescue StandardError => e; errors << e.message; end
1521
1733
  begin; attached_walls; rescue StandardError => e; errors << e.message; end
1522
- begin; attached_frame_floors; rescue StandardError => e; errors << e.message; end
1734
+ begin; attached_floors; rescue StandardError => e; errors << e.message; end
1523
1735
  begin; to_location; rescue StandardError => e; errors << e.message; end
1524
1736
  return errors
1525
1737
  end
@@ -1570,9 +1782,9 @@ class HPXML < Object
1570
1782
  XMLHelper.add_attribute(wall_attached, 'idref', wall)
1571
1783
  end
1572
1784
  end
1573
- if not @attached_to_frame_floor_idrefs.nil?
1574
- @attached_to_frame_floor_idrefs.each do |floor|
1575
- floor_attached = XMLHelper.add_element(attic, 'AttachedToFrameFloor')
1785
+ if not @attached_to_floor_idrefs.nil?
1786
+ @attached_to_floor_idrefs.each do |floor|
1787
+ floor_attached = XMLHelper.add_element(attic, 'AttachedToFloor')
1576
1788
  XMLHelper.add_attribute(floor_attached, 'idref', floor)
1577
1789
  end
1578
1790
  end
@@ -1608,9 +1820,9 @@ class HPXML < Object
1608
1820
  XMLHelper.get_elements(attic, 'AttachedToWall').each do |wall|
1609
1821
  @attached_to_wall_idrefs << HPXML::get_idref(wall)
1610
1822
  end
1611
- @attached_to_frame_floor_idrefs = []
1612
- XMLHelper.get_elements(attic, 'AttachedToFrameFloor').each do |frame_floor|
1613
- @attached_to_frame_floor_idrefs << HPXML::get_idref(frame_floor)
1823
+ @attached_to_floor_idrefs = []
1824
+ XMLHelper.get_elements(attic, 'AttachedToFloor').each do |floor|
1825
+ @attached_to_floor_idrefs << HPXML::get_idref(floor)
1614
1826
  end
1615
1827
  end
1616
1828
  end
@@ -1631,7 +1843,7 @@ class HPXML < Object
1631
1843
 
1632
1844
  class Foundation < BaseElement
1633
1845
  ATTRS = [:id, :foundation_type, :vented_crawlspace_sla, :within_infiltration_volume,
1634
- :attached_to_slab_idrefs, :attached_to_frame_floor_idrefs, :attached_to_foundation_wall_idrefs,
1846
+ :attached_to_slab_idrefs, :attached_to_floor_idrefs, :attached_to_foundation_wall_idrefs,
1635
1847
  :attached_to_wall_idrefs, :attached_to_rim_joist_idrefs]
1636
1848
  attr_accessor(*ATTRS)
1637
1849
 
@@ -1646,12 +1858,12 @@ class HPXML < Object
1646
1858
  return list
1647
1859
  end
1648
1860
 
1649
- def attached_frame_floors
1650
- return [] if @attached_to_frame_floor_idrefs.nil?
1861
+ def attached_floors
1862
+ return [] if @attached_to_floor_idrefs.nil?
1651
1863
 
1652
- list = @hpxml_object.frame_floors.select { |frame_floor| @attached_to_frame_floor_idrefs.include? frame_floor.id }
1653
- if @attached_to_frame_floor_idrefs.size > list.size
1654
- fail "Attached frame floor not found for foundation '#{@id}'."
1864
+ list = @hpxml_object.floors.select { |floor| @attached_to_floor_idrefs.include? floor.id }
1865
+ if @attached_to_floor_idrefs.size > list.size
1866
+ fail "Attached floor not found for foundation '#{@id}'."
1655
1867
  end
1656
1868
 
1657
1869
  return list
@@ -1721,9 +1933,9 @@ class HPXML < Object
1721
1933
  sum_area += slab.area
1722
1934
  end
1723
1935
  if sum_area <= 0
1724
- # Check FrameFloors next
1725
- attached_frame_floors.each do |frame_floor|
1726
- sum_area += frame_floor.area
1936
+ # Check Floors next
1937
+ attached_floors.each do |floor|
1938
+ sum_area += floor.area
1727
1939
  end
1728
1940
  end
1729
1941
  return sum_area
@@ -1736,7 +1948,7 @@ class HPXML < Object
1736
1948
  def check_for_errors
1737
1949
  errors = []
1738
1950
  begin; attached_slabs; rescue StandardError => e; errors << e.message; end
1739
- begin; attached_frame_floors; rescue StandardError => e; errors << e.message; end
1951
+ begin; attached_floors; rescue StandardError => e; errors << e.message; end
1740
1952
  begin; attached_foundation_walls; rescue StandardError => e; errors << e.message; end
1741
1953
  begin; attached_walls; rescue StandardError => e; errors << e.message; end
1742
1954
  begin; attached_rim_joists; rescue StandardError => e; errors << e.message; end
@@ -1798,10 +2010,10 @@ class HPXML < Object
1798
2010
  XMLHelper.add_attribute(foundation_wall_attached, 'idref', foundation_wall)
1799
2011
  end
1800
2012
  end
1801
- if not @attached_to_frame_floor_idrefs.nil?
1802
- @attached_to_frame_floor_idrefs.each do |frame_floor|
1803
- floor_frame_attached = XMLHelper.add_element(foundation, 'AttachedToFrameFloor')
1804
- XMLHelper.add_attribute(floor_frame_attached, 'idref', frame_floor)
2013
+ if not @attached_to_floor_idrefs.nil?
2014
+ @attached_to_floor_idrefs.each do |floor|
2015
+ floor_attached = XMLHelper.add_element(foundation, 'AttachedToFloor')
2016
+ XMLHelper.add_attribute(floor_attached, 'idref', floor)
1805
2017
  end
1806
2018
  end
1807
2019
  if not @attached_to_slab_idrefs.nil?
@@ -1849,9 +2061,9 @@ class HPXML < Object
1849
2061
  XMLHelper.get_elements(foundation, 'AttachedToSlab').each do |slab|
1850
2062
  @attached_to_slab_idrefs << HPXML::get_idref(slab)
1851
2063
  end
1852
- @attached_to_frame_floor_idrefs = []
1853
- XMLHelper.get_elements(foundation, 'AttachedToFrameFloor').each do |frame_floor|
1854
- @attached_to_frame_floor_idrefs << HPXML::get_idref(frame_floor)
2064
+ @attached_to_floor_idrefs = []
2065
+ XMLHelper.get_elements(foundation, 'AttachedToFloor').each do |floor|
2066
+ @attached_to_floor_idrefs << HPXML::get_idref(floor)
1855
2067
  end
1856
2068
  @attached_to_foundation_wall_idrefs = []
1857
2069
  XMLHelper.get_elements(foundation, 'AttachedToFoundationWall').each do |foundation_wall|
@@ -2478,40 +2690,44 @@ class HPXML < Object
2478
2690
  end
2479
2691
  end
2480
2692
 
2481
- class FrameFloors < BaseArrayElement
2693
+ class Floors < BaseArrayElement
2482
2694
  def add(**kwargs)
2483
- self << FrameFloor.new(@hpxml_object, **kwargs)
2695
+ self << Floor.new(@hpxml_object, **kwargs)
2484
2696
  end
2485
2697
 
2486
2698
  def from_oga(hpxml)
2487
2699
  return if hpxml.nil?
2488
2700
 
2489
- XMLHelper.get_elements(hpxml, 'Building/BuildingDetails/Enclosure/FrameFloors/FrameFloor').each do |frame_floor|
2490
- self << FrameFloor.new(@hpxml_object, frame_floor)
2701
+ XMLHelper.get_elements(hpxml, 'Building/BuildingDetails/Enclosure/Floors/Floor').each do |floor|
2702
+ self << Floor.new(@hpxml_object, floor)
2491
2703
  end
2492
2704
  end
2493
2705
  end
2494
2706
 
2495
- class FrameFloor < BaseElement
2496
- ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :area, :insulation_id,
2707
+ class Floor < BaseElement
2708
+ ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :floor_type, :area, :insulation_id,
2497
2709
  :insulation_assembly_r_value, :insulation_cavity_r_value, :insulation_continuous_r_value,
2498
- :other_space_above_or_below, :interior_finish_type, :interior_finish_thickness]
2710
+ :floor_or_ceiling, :interior_finish_type, :interior_finish_thickness]
2499
2711
  attr_accessor(*ATTRS)
2500
2712
 
2501
2713
  def is_ceiling
2502
- if [LocationAtticVented, LocationAtticUnvented].include? @interior_adjacent_to
2503
- return true
2504
- elsif [LocationAtticVented, LocationAtticUnvented].include? @exterior_adjacent_to
2505
- return true
2506
- elsif [LocationOtherHousingUnit, LocationOtherHeatedSpace, LocationOtherMultifamilyBufferSpace, LocationOtherNonFreezingSpace].include?(@exterior_adjacent_to) && (@other_space_above_or_below == FrameFloorOtherSpaceAbove)
2507
- return true
2714
+ # From the perspective of the living space
2715
+ if @floor_or_ceiling.nil?
2716
+ ceiling_locations = [LocationAtticUnconditioned,
2717
+ LocationAtticVented,
2718
+ LocationAtticUnvented]
2719
+ if (ceiling_locations.include? @interior_adjacent_to) || (ceiling_locations.include? @exterior_adjacent_to)
2720
+ return true
2721
+ else # If we don't explicitly know that it's a ceiling, assume a floor
2722
+ return false
2723
+ end
2724
+ else
2725
+ return @floor_or_ceiling == FloorOrCeilingCeiling
2508
2726
  end
2509
-
2510
- return false
2511
2727
  end
2512
2728
 
2513
2729
  def is_floor
2514
- !is_ceiling
2730
+ return !is_ceiling
2515
2731
  end
2516
2732
 
2517
2733
  def is_exterior
@@ -2543,15 +2759,15 @@ class HPXML < Object
2543
2759
  end
2544
2760
 
2545
2761
  def delete
2546
- @hpxml_object.frame_floors.delete(self)
2762
+ @hpxml_object.floors.delete(self)
2547
2763
  @hpxml_object.attics.each do |attic|
2548
- attic.attached_to_frame_floor_idrefs.delete(@id) unless attic.attached_to_frame_floor_idrefs.nil?
2764
+ attic.attached_to_floor_idrefs.delete(@id) unless attic.attached_to_floor_idrefs.nil?
2549
2765
  end
2550
2766
  @hpxml_object.foundations.each do |foundation|
2551
- foundation.attached_to_frame_floor_idrefs.delete(@id) unless foundation.attached_to_frame_floor_idrefs.nil?
2767
+ foundation.attached_to_floor_idrefs.delete(@id) unless foundation.attached_to_floor_idrefs.nil?
2552
2768
  end
2553
2769
  @hpxml_object.attics.each do |attic|
2554
- attic.attached_to_frame_floor_idrefs.delete(@id) unless attic.attached_to_frame_floor_idrefs.nil?
2770
+ attic.attached_to_floor_idrefs.delete(@id) unless attic.attached_to_floor_idrefs.nil?
2555
2771
  end
2556
2772
  end
2557
2773
 
@@ -2563,19 +2779,24 @@ class HPXML < Object
2563
2779
  def to_oga(doc)
2564
2780
  return if nil?
2565
2781
 
2566
- frame_floors = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Enclosure', 'FrameFloors'])
2567
- frame_floor = XMLHelper.add_element(frame_floors, 'FrameFloor')
2568
- sys_id = XMLHelper.add_element(frame_floor, 'SystemIdentifier')
2782
+ floors = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Enclosure', 'Floors'])
2783
+ floor = XMLHelper.add_element(floors, 'Floor')
2784
+ sys_id = XMLHelper.add_element(floor, 'SystemIdentifier')
2569
2785
  XMLHelper.add_attribute(sys_id, 'id', @id)
2570
- XMLHelper.add_element(frame_floor, 'ExteriorAdjacentTo', @exterior_adjacent_to, :string) unless @exterior_adjacent_to.nil?
2571
- XMLHelper.add_element(frame_floor, 'InteriorAdjacentTo', @interior_adjacent_to, :string) unless @interior_adjacent_to.nil?
2572
- XMLHelper.add_element(frame_floor, 'Area', @area, :float) unless @area.nil?
2786
+ XMLHelper.add_element(floor, 'ExteriorAdjacentTo', @exterior_adjacent_to, :string) unless @exterior_adjacent_to.nil?
2787
+ XMLHelper.add_element(floor, 'InteriorAdjacentTo', @interior_adjacent_to, :string) unless @interior_adjacent_to.nil?
2788
+ XMLHelper.add_element(floor, 'FloorOrCeiling', @floor_or_ceiling, :string, @floor_or_ceiling_isdefaulted) unless @floor_or_ceiling.nil?
2789
+ if not @floor_type.nil?
2790
+ floor_type_el = XMLHelper.add_element(floor, 'FloorType')
2791
+ XMLHelper.add_element(floor_type_el, @floor_type)
2792
+ end
2793
+ XMLHelper.add_element(floor, 'Area', @area, :float) unless @area.nil?
2573
2794
  if (not @interior_finish_type.nil?) || (not @interior_finish_thickness.nil?)
2574
- interior_finish = XMLHelper.add_element(frame_floor, 'InteriorFinish')
2795
+ interior_finish = XMLHelper.add_element(floor, 'InteriorFinish')
2575
2796
  XMLHelper.add_element(interior_finish, 'Type', @interior_finish_type, :string, @interior_finish_type_isdefaulted) unless @interior_finish_type.nil?
2576
2797
  XMLHelper.add_element(interior_finish, 'Thickness', @interior_finish_thickness, :float, @interior_finish_thickness_isdefaulted) unless @interior_finish_thickness.nil?
2577
2798
  end
2578
- insulation = XMLHelper.add_element(frame_floor, 'Insulation')
2799
+ insulation = XMLHelper.add_element(floor, 'Insulation')
2579
2800
  sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
2580
2801
  if not @insulation_id.nil?
2581
2802
  XMLHelper.add_attribute(sys_id, 'id', @insulation_id)
@@ -2593,29 +2814,29 @@ class HPXML < Object
2593
2814
  XMLHelper.add_element(layer, 'InstallationType', 'continuous', :string)
2594
2815
  XMLHelper.add_element(layer, 'NominalRValue', @insulation_continuous_r_value, :float)
2595
2816
  end
2596
- XMLHelper.add_extension(frame_floor, 'OtherSpaceAboveOrBelow', @other_space_above_or_below, :string) unless @other_space_above_or_below.nil?
2597
2817
  end
2598
2818
 
2599
- def from_oga(frame_floor)
2600
- return if frame_floor.nil?
2819
+ def from_oga(floor)
2820
+ return if floor.nil?
2601
2821
 
2602
- @id = HPXML::get_id(frame_floor)
2603
- @exterior_adjacent_to = XMLHelper.get_value(frame_floor, 'ExteriorAdjacentTo', :string)
2604
- @interior_adjacent_to = XMLHelper.get_value(frame_floor, 'InteriorAdjacentTo', :string)
2605
- @area = XMLHelper.get_value(frame_floor, 'Area', :float)
2606
- interior_finish = XMLHelper.get_element(frame_floor, 'InteriorFinish')
2822
+ @id = HPXML::get_id(floor)
2823
+ @exterior_adjacent_to = XMLHelper.get_value(floor, 'ExteriorAdjacentTo', :string)
2824
+ @interior_adjacent_to = XMLHelper.get_value(floor, 'InteriorAdjacentTo', :string)
2825
+ @floor_or_ceiling = XMLHelper.get_value(floor, 'FloorOrCeiling', :string)
2826
+ @floor_type = XMLHelper.get_child_name(floor, 'FloorType')
2827
+ @area = XMLHelper.get_value(floor, 'Area', :float)
2828
+ interior_finish = XMLHelper.get_element(floor, 'InteriorFinish')
2607
2829
  if not interior_finish.nil?
2608
2830
  @interior_finish_type = XMLHelper.get_value(interior_finish, 'Type', :string)
2609
2831
  @interior_finish_thickness = XMLHelper.get_value(interior_finish, 'Thickness', :float)
2610
2832
  end
2611
- insulation = XMLHelper.get_element(frame_floor, 'Insulation')
2833
+ insulation = XMLHelper.get_element(floor, 'Insulation')
2612
2834
  if not insulation.nil?
2613
2835
  @insulation_id = HPXML::get_id(insulation)
2614
2836
  @insulation_assembly_r_value = XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue', :float)
2615
2837
  @insulation_cavity_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue", :float)
2616
2838
  @insulation_continuous_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue", :float)
2617
2839
  end
2618
- @other_space_above_or_below = XMLHelper.get_value(frame_floor, 'extension/OtherSpaceAboveOrBelow', :string)
2619
2840
  end
2620
2841
  end
2621
2842
 
@@ -3374,15 +3595,21 @@ class HPXML < Object
3374
3595
  def total_fraction_cool_load_served
3375
3596
  map { |clg_sys| clg_sys.fraction_cool_load_served.to_f }.sum(0.0)
3376
3597
  end
3598
+
3599
+ def total_fraction_heat_load_served
3600
+ map { |clg_sys| clg_sys.integrated_heating_system_fraction_heat_load_served.to_f }.sum(0.0)
3601
+ end
3377
3602
  end
3378
3603
 
3379
3604
  class CoolingSystem < BaseElement
3380
- ATTRS = [:id, :distribution_system_idref, :year_installed, :cooling_system_type,
3381
- :cooling_system_fuel, :cooling_capacity, :compressor_type, :fraction_cool_load_served,
3382
- :cooling_efficiency_seer, :cooling_efficiency_eer, :cooling_efficiency_ceer, :cooling_efficiency_kw_per_ton,
3605
+ ATTRS = [:id, :distribution_system_idref, :year_installed, :cooling_system_type, :cooling_system_fuel,
3606
+ :cooling_capacity, :compressor_type, :fraction_cool_load_served, :cooling_efficiency_seer,
3607
+ :cooling_efficiency_seer2, :cooling_efficiency_eer, :cooling_efficiency_ceer, :cooling_efficiency_kw_per_ton,
3383
3608
  :cooling_shr, :third_party_certification, :clg_seed_id, :is_shared_system, :number_of_units_served,
3384
3609
  :shared_loop_watts, :shared_loop_motor_efficiency, :fan_coil_watts, :airflow_defect_ratio,
3385
- :fan_watts_per_cfm, :charge_defect_ratio, :cooling_airflow_cfm, :location, :primary_system]
3610
+ :fan_watts_per_cfm, :charge_defect_ratio, :cooling_airflow_cfm, :location, :primary_system, :integrated_heating_system_fuel,
3611
+ :integrated_heating_system_capacity, :integrated_heating_system_efficiency_percent, :integrated_heating_system_fraction_heat_load_served,
3612
+ :integrated_heating_system_airflow_cfm, :htg_seed_id]
3386
3613
  attr_accessor(*ATTRS)
3387
3614
 
3388
3615
  def distribution_system
@@ -3408,6 +3635,13 @@ class HPXML < Object
3408
3635
  return
3409
3636
  end
3410
3637
 
3638
+ def has_integrated_heating
3639
+ return false unless [HVACTypePTAC, HVACTypeRoomAirConditioner].include? @cooling_system_type
3640
+ return false if @integrated_heating_system_fuel.nil?
3641
+
3642
+ return true
3643
+ end
3644
+
3411
3645
  def delete
3412
3646
  @hpxml_object.cooling_systems.delete(self)
3413
3647
  @hpxml_object.water_heating_systems.each do |water_heating_system|
@@ -3450,6 +3684,11 @@ class HPXML < Object
3450
3684
  XMLHelper.add_element(annual_efficiency, 'Units', UnitsSEER, :string)
3451
3685
  XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_seer, :float, @cooling_efficiency_seer_isdefaulted)
3452
3686
  end
3687
+ if not @cooling_efficiency_seer2.nil?
3688
+ annual_efficiency = XMLHelper.add_element(cooling_system, 'AnnualCoolingEfficiency')
3689
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsSEER2, :string)
3690
+ XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_seer2, :float, @cooling_efficiency_seer2_isdefaulted)
3691
+ end
3453
3692
  if not @cooling_efficiency_eer.nil?
3454
3693
  annual_efficiency = XMLHelper.add_element(cooling_system, 'AnnualCoolingEfficiency')
3455
3694
  XMLHelper.add_element(annual_efficiency, 'Units', UnitsEER, :string)
@@ -3466,10 +3705,19 @@ class HPXML < Object
3466
3705
  XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_kw_per_ton, :float, @cooling_efficiency_kw_per_ton_isdefaulted)
3467
3706
  end
3468
3707
  XMLHelper.add_element(cooling_system, 'SensibleHeatFraction', @cooling_shr, :float, @cooling_shr_isdefaulted) unless @cooling_shr.nil?
3708
+ XMLHelper.add_element(cooling_system, 'IntegratedHeatingSystemFuel', @integrated_heating_system_fuel, :string) unless @integrated_heating_system_fuel.nil?
3709
+ XMLHelper.add_element(cooling_system, 'IntegratedHeatingSystemCapacity', @integrated_heating_system_capacity, :float, @integrated_heating_system_capacity_isdefaulted) unless @integrated_heating_system_capacity.nil?
3710
+ if not @integrated_heating_system_efficiency_percent.nil?
3711
+ annual_efficiency = XMLHelper.add_element(cooling_system, 'IntegratedHeatingSystemAnnualEfficiency')
3712
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsPercent, :string)
3713
+ XMLHelper.add_element(annual_efficiency, 'Value', @integrated_heating_system_efficiency_percent, :float, @integrated_heating_system_efficiency_percent_isdefaulted)
3714
+ end
3715
+ XMLHelper.add_element(cooling_system, 'IntegratedHeatingSystemFractionHeatLoadServed', @integrated_heating_system_fraction_heat_load_served, :float) unless @integrated_heating_system_fraction_heat_load_served.nil?
3469
3716
  XMLHelper.add_extension(cooling_system, 'AirflowDefectRatio', @airflow_defect_ratio, :float, @airflow_defect_ratio_isdefaulted) unless @airflow_defect_ratio.nil?
3470
3717
  XMLHelper.add_extension(cooling_system, 'ChargeDefectRatio', @charge_defect_ratio, :float, @charge_defect_ratio_isdefaulted) unless @charge_defect_ratio.nil?
3471
3718
  XMLHelper.add_extension(cooling_system, 'FanPowerWattsPerCFM', @fan_watts_per_cfm, :float, @fan_watts_per_cfm_isdefaulted) unless @fan_watts_per_cfm.nil?
3472
3719
  XMLHelper.add_extension(cooling_system, 'CoolingAirflowCFM', @cooling_airflow_cfm, :float, @cooling_airflow_cfm_isdefaulted) unless @cooling_airflow_cfm.nil?
3720
+ XMLHelper.add_extension(cooling_system, 'HeatingAirflowCFM', @integrated_heating_system_airflow_cfm, :float, @integrated_heating_system_airflow_cfm_isdefaulted) unless @integrated_heating_system_airflow_cfm.nil?
3473
3721
  XMLHelper.add_extension(cooling_system, 'SharedLoopWatts', @shared_loop_watts, :float) unless @shared_loop_watts.nil?
3474
3722
  XMLHelper.add_extension(cooling_system, 'SharedLoopMotorEfficiency', @shared_loop_motor_efficiency, :float) unless @shared_loop_motor_efficiency.nil?
3475
3723
  XMLHelper.add_extension(cooling_system, 'FanCoilWatts', @fan_coil_watts, :float) unless @fan_coil_watts.nil?
@@ -3496,14 +3744,20 @@ class HPXML < Object
3496
3744
  @compressor_type = XMLHelper.get_value(cooling_system, 'CompressorType', :string)
3497
3745
  @fraction_cool_load_served = XMLHelper.get_value(cooling_system, 'FractionCoolLoadServed', :float)
3498
3746
  @cooling_efficiency_seer = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsSEER}']/Value", :float)
3747
+ @cooling_efficiency_seer2 = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsSEER2}']/Value", :float)
3499
3748
  @cooling_efficiency_eer = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsEER}']/Value", :float)
3500
3749
  @cooling_efficiency_ceer = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsCEER}']/Value", :float)
3501
3750
  @cooling_efficiency_kw_per_ton = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsKwPerTon}']/Value", :float)
3502
3751
  @cooling_shr = XMLHelper.get_value(cooling_system, 'SensibleHeatFraction', :float)
3752
+ @integrated_heating_system_fuel = XMLHelper.get_value(cooling_system, 'IntegratedHeatingSystemFuel', :string)
3753
+ @integrated_heating_system_capacity = XMLHelper.get_value(cooling_system, 'IntegratedHeatingSystemCapacity', :float)
3754
+ @integrated_heating_system_efficiency_percent = XMLHelper.get_value(cooling_system, "IntegratedHeatingSystemAnnualEfficiency[Units='#{UnitsPercent}']/Value", :float)
3755
+ @integrated_heating_system_fraction_heat_load_served = XMLHelper.get_value(cooling_system, 'IntegratedHeatingSystemFractionHeatLoadServed', :float)
3503
3756
  @airflow_defect_ratio = XMLHelper.get_value(cooling_system, 'extension/AirflowDefectRatio', :float)
3504
3757
  @charge_defect_ratio = XMLHelper.get_value(cooling_system, 'extension/ChargeDefectRatio', :float)
3505
3758
  @fan_watts_per_cfm = XMLHelper.get_value(cooling_system, 'extension/FanPowerWattsPerCFM', :float)
3506
3759
  @cooling_airflow_cfm = XMLHelper.get_value(cooling_system, 'extension/CoolingAirflowCFM', :float)
3760
+ @integrated_heating_system_airflow_cfm = XMLHelper.get_value(cooling_system, 'extension/HeatingAirflowCFM', :float)
3507
3761
  @shared_loop_watts = XMLHelper.get_value(cooling_system, 'extension/SharedLoopWatts', :float)
3508
3762
  @shared_loop_motor_efficiency = XMLHelper.get_value(cooling_system, 'extension/SharedLoopMotorEfficiency', :float)
3509
3763
  @fan_coil_watts = XMLHelper.get_value(cooling_system, 'extension/FanCoilWatts', :float)
@@ -3544,10 +3798,10 @@ class HPXML < Object
3544
3798
  :heating_capacity, :heating_capacity_17F, :cooling_capacity, :compressor_type,
3545
3799
  :cooling_shr, :backup_type, :backup_system_idref, :backup_heating_fuel, :backup_heating_capacity,
3546
3800
  :backup_heating_efficiency_percent, :backup_heating_efficiency_afue, :backup_heating_lockout_temp,
3547
- :backup_heating_switchover_temp, :fraction_heat_load_served, :fraction_cool_load_served,
3548
- :cooling_efficiency_seer, :cooling_efficiency_eer, :cooling_efficiency_ceer, :heating_efficiency_hspf,
3549
- :heating_efficiency_cop, :third_party_certification, :htg_seed_id, :clg_seed_id, :pump_watts_per_ton,
3550
- :fan_watts_per_cfm, :is_shared_system, :number_of_units_served, :shared_loop_watts,
3801
+ :backup_heating_switchover_temp, :fraction_heat_load_served, :fraction_cool_load_served, :cooling_efficiency_seer,
3802
+ :cooling_efficiency_seer2, :cooling_efficiency_eer, :cooling_efficiency_ceer, :heating_efficiency_hspf,
3803
+ :heating_efficiency_hspf2, :heating_efficiency_cop, :third_party_certification, :htg_seed_id, :clg_seed_id,
3804
+ :pump_watts_per_ton, :fan_watts_per_cfm, :is_shared_system, :number_of_units_served, :shared_loop_watts,
3551
3805
  :shared_loop_motor_efficiency, :airflow_defect_ratio, :charge_defect_ratio,
3552
3806
  :heating_airflow_cfm, :cooling_airflow_cfm, :location, :primary_heating_system, :primary_cooling_system]
3553
3807
  attr_accessor(*ATTRS)
@@ -3655,6 +3909,11 @@ class HPXML < Object
3655
3909
  XMLHelper.add_element(annual_efficiency, 'Units', UnitsSEER, :string)
3656
3910
  XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_seer, :float, @cooling_efficiency_seer_isdefaulted)
3657
3911
  end
3912
+ if not @cooling_efficiency_seer2.nil?
3913
+ annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualCoolingEfficiency')
3914
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsSEER2, :string)
3915
+ XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_seer2, :float, @cooling_efficiency_seer2_isdefaulted)
3916
+ end
3658
3917
  if not @cooling_efficiency_ceer.nil?
3659
3918
  annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualCoolingEfficiency')
3660
3919
  XMLHelper.add_element(annual_efficiency, 'Units', UnitsCEER, :string)
@@ -3670,6 +3929,11 @@ class HPXML < Object
3670
3929
  XMLHelper.add_element(annual_efficiency, 'Units', UnitsHSPF, :string)
3671
3930
  XMLHelper.add_element(annual_efficiency, 'Value', @heating_efficiency_hspf, :float, @heating_efficiency_hspf_isdefaulted)
3672
3931
  end
3932
+ if not @heating_efficiency_hspf2.nil?
3933
+ annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualHeatingEfficiency')
3934
+ XMLHelper.add_element(annual_efficiency, 'Units', UnitsHSPF2, :string)
3935
+ XMLHelper.add_element(annual_efficiency, 'Value', @heating_efficiency_hspf2, :float, @heating_efficiency_hspf2_isdefaulted)
3936
+ end
3673
3937
  if not @heating_efficiency_cop.nil?
3674
3938
  annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualHeatingEfficiency')
3675
3939
  XMLHelper.add_element(annual_efficiency, 'Units', UnitsCOP, :string)
@@ -3723,9 +3987,11 @@ class HPXML < Object
3723
3987
  @fraction_heat_load_served = XMLHelper.get_value(heat_pump, 'FractionHeatLoadServed', :float)
3724
3988
  @fraction_cool_load_served = XMLHelper.get_value(heat_pump, 'FractionCoolLoadServed', :float)
3725
3989
  @cooling_efficiency_seer = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsSEER}']/Value", :float)
3990
+ @cooling_efficiency_seer2 = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsSEER2}']/Value", :float)
3726
3991
  @cooling_efficiency_ceer = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsCEER}']/Value", :float)
3727
3992
  @cooling_efficiency_eer = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsEER}']/Value", :float)
3728
3993
  @heating_efficiency_hspf = XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='#{UnitsHSPF}']/Value", :float)
3994
+ @heating_efficiency_hspf2 = XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='#{UnitsHSPF2}']/Value", :float)
3729
3995
  @heating_efficiency_cop = XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='#{UnitsCOP}']/Value", :float)
3730
3996
  @airflow_defect_ratio = XMLHelper.get_value(heat_pump, 'extension/AirflowDefectRatio', :float)
3731
3997
  @charge_defect_ratio = XMLHelper.get_value(heat_pump, 'extension/ChargeDefectRatio', :float)
@@ -3780,7 +4046,9 @@ class HPXML < Object
3780
4046
  cdl_lat_ducts: 'Ducts',
3781
4047
  cdl_lat_infilvent: 'InfilVent',
3782
4048
  cdl_lat_intgains: 'InternalGains' }
3783
- ATTRS = HDL_ATTRS.keys + CDL_SENS_ATTRS.keys + CDL_LAT_ATTRS.keys
4049
+ TEMPERATURE_ATTRS = { temp_heating: 'Heating',
4050
+ temp_cooling: 'Cooling' }
4051
+ ATTRS = HDL_ATTRS.keys + CDL_SENS_ATTRS.keys + CDL_LAT_ATTRS.keys + TEMPERATURE_ATTRS.keys
3784
4052
  attr_accessor(*ATTRS)
3785
4053
 
3786
4054
  def check_for_errors
@@ -3792,6 +4060,13 @@ class HPXML < Object
3792
4060
  return if nil?
3793
4061
 
3794
4062
  hvac_plant = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'HVAC', 'HVACPlant'])
4063
+ if not @temp_heating.nil?
4064
+ dl_extension = XMLHelper.create_elements_as_needed(hvac_plant, ['extension', 'DesignTemperatures'])
4065
+ XMLHelper.add_attribute(dl_extension, 'dataSource', 'software')
4066
+ TEMPERATURE_ATTRS.each do |attr, element_name|
4067
+ XMLHelper.add_element(dl_extension, element_name, send(attr), :float)
4068
+ end
4069
+ end
3795
4070
  if not @hdl_total.nil?
3796
4071
  dl_extension = XMLHelper.create_elements_as_needed(hvac_plant, ['extension', 'DesignLoads'])
3797
4072
  XMLHelper.add_attribute(dl_extension, 'dataSource', 'software')
@@ -3816,6 +4091,9 @@ class HPXML < Object
3816
4091
  hvac_plant = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Systems/HVAC/HVACPlant')
3817
4092
  return if hvac_plant.nil?
3818
4093
 
4094
+ TEMPERATURE_ATTRS.each do |attr, element_name|
4095
+ send("#{attr}=", XMLHelper.get_value(hvac_plant, "extension/DesignTemperatures/#{element_name}", :float))
4096
+ end
3819
4097
  HDL_ATTRS.each do |attr, element_name|
3820
4098
  send("#{attr}=", XMLHelper.get_value(hvac_plant, "extension/DesignLoads/Heating/#{element_name}", :float))
3821
4099
  end
@@ -4161,8 +4439,8 @@ class HPXML < Object
4161
4439
  end
4162
4440
 
4163
4441
  class Duct < BaseElement
4164
- ATTRS = [:duct_type, :duct_insulation_r_value, :duct_insulation_material, :duct_location,
4165
- :duct_fraction_area, :duct_surface_area]
4442
+ ATTRS = [:id, :duct_type, :duct_insulation_r_value, :duct_insulation_material, :duct_location,
4443
+ :duct_fraction_area, :duct_surface_area, :duct_surface_area_multiplier]
4166
4444
  attr_accessor(*ATTRS)
4167
4445
 
4168
4446
  def delete
@@ -4180,6 +4458,8 @@ class HPXML < Object
4180
4458
 
4181
4459
  def to_oga(air_distribution)
4182
4460
  ducts_el = XMLHelper.add_element(air_distribution, 'Ducts')
4461
+ sys_id = XMLHelper.add_element(ducts_el, 'SystemIdentifier')
4462
+ XMLHelper.add_attribute(sys_id, 'id', @id)
4183
4463
  XMLHelper.add_element(ducts_el, 'DuctType', @duct_type, :string) unless @duct_type.nil?
4184
4464
  if not @duct_insulation_material.nil?
4185
4465
  ins_material_el = XMLHelper.add_element(ducts_el, 'DuctInsulationMaterial')
@@ -4189,17 +4469,20 @@ class HPXML < Object
4189
4469
  XMLHelper.add_element(ducts_el, 'DuctLocation', @duct_location, :string, @duct_location_isdefaulted) unless @duct_location.nil?
4190
4470
  XMLHelper.add_element(ducts_el, 'FractionDuctArea', @duct_fraction_area, :float, @duct_fraction_area_isdefaulted) unless @duct_fraction_area.nil?
4191
4471
  XMLHelper.add_element(ducts_el, 'DuctSurfaceArea', @duct_surface_area, :float, @duct_surface_area_isdefaulted) unless @duct_surface_area.nil?
4472
+ XMLHelper.add_extension(ducts_el, 'DuctSurfaceAreaMultiplier', @duct_surface_area_multiplier, :float, @duct_surface_area_multiplier_isdefaulted) unless @duct_surface_area_multiplier.nil?
4192
4473
  end
4193
4474
 
4194
4475
  def from_oga(duct)
4195
4476
  return if duct.nil?
4196
4477
 
4478
+ @id = HPXML::get_id(duct)
4197
4479
  @duct_type = XMLHelper.get_value(duct, 'DuctType', :string)
4198
4480
  @duct_insulation_material = XMLHelper.get_child_name(duct, 'DuctInsulationMaterial')
4199
4481
  @duct_insulation_r_value = XMLHelper.get_value(duct, 'DuctInsulationRValue', :float)
4200
4482
  @duct_location = XMLHelper.get_value(duct, 'DuctLocation', :string)
4201
4483
  @duct_fraction_area = XMLHelper.get_value(duct, 'FractionDuctArea', :float)
4202
4484
  @duct_surface_area = XMLHelper.get_value(duct, 'DuctSurfaceArea', :float)
4485
+ @duct_surface_area_multiplier = XMLHelper.get_value(duct, 'extension/DuctSurfaceAreaMultiplier', :float)
4203
4486
  end
4204
4487
  end
4205
4488
 
@@ -4226,7 +4509,8 @@ class HPXML < Object
4226
4509
  :is_shared_system, :in_unit_flow_rate, :fraction_recirculation, :used_for_garage_ventilation,
4227
4510
  :preheating_fuel, :preheating_efficiency_cop, :preheating_fraction_load_served, :precooling_fuel,
4228
4511
  :precooling_efficiency_cop, :precooling_fraction_load_served, :calculated_flow_rate,
4229
- :delivered_ventilation, :cfis_vent_mode_airflow_fraction]
4512
+ :delivered_ventilation, :cfis_vent_mode_airflow_fraction, :cfis_addtl_runtime_operating_mode,
4513
+ :cfis_supplemental_fan_idref]
4230
4514
  attr_accessor(*ATTRS)
4231
4515
 
4232
4516
  def distribution_system
@@ -4342,6 +4626,41 @@ class HPXML < Object
4342
4626
  return false
4343
4627
  end
4344
4628
 
4629
+ def cfis_supplemental_fan
4630
+ return if @cfis_supplemental_fan_idref.nil?
4631
+ return unless @fan_type == MechVentTypeCFIS
4632
+
4633
+ @hpxml_object.ventilation_fans.each do |ventilation_fan|
4634
+ next unless ventilation_fan.id == @cfis_supplemental_fan_idref
4635
+
4636
+ if not [MechVentTypeSupply, MechVentTypeExhaust].include? ventilation_fan.fan_type
4637
+ fail "CFIS supplemental fan '#{ventilation_fan.id}' must be of type '#{MechVentTypeSupply}' or '#{MechVentTypeExhaust}'."
4638
+ end
4639
+ if not ventilation_fan.used_for_whole_building_ventilation
4640
+ fail "CFIS supplemental fan '#{ventilation_fan.id}' must be set as used for whole building ventilation."
4641
+ end
4642
+ if ventilation_fan.is_shared_system
4643
+ fail "CFIS supplemental fan '#{ventilation_fan.id}' cannot be a shared system."
4644
+ end
4645
+ if not ventilation_fan.hours_in_operation.nil?
4646
+ fail "CFIS supplemental fan '#{ventilation_fan.id}' cannot have HoursInOperation specified."
4647
+ end
4648
+
4649
+ return ventilation_fan
4650
+ end
4651
+ fail "CFIS Supplemental Fan '#{@cfis_supplemental_fan_idref}' not found for ventilation fan '#{@id}'."
4652
+ end
4653
+
4654
+ def is_cfis_supplemental_fan?
4655
+ @hpxml_object.ventilation_fans.each do |ventilation_fan|
4656
+ next unless ventilation_fan.fan_type == MechVentTypeCFIS
4657
+ next unless ventilation_fan.cfis_supplemental_fan_idref == @id
4658
+
4659
+ return true
4660
+ end
4661
+ return false
4662
+ end
4663
+
4345
4664
  def delete
4346
4665
  @hpxml_object.ventilation_fans.delete(self)
4347
4666
  end
@@ -4351,6 +4670,7 @@ class HPXML < Object
4351
4670
  begin; distribution_system; rescue StandardError => e; errors << e.message; end
4352
4671
  begin; oa_unit_flow_rate; rescue StandardError => e; errors << e.message; end
4353
4672
  begin; unit_flow_rate_ratio; rescue StandardError => e; errors << e.message; end
4673
+ begin; cfis_supplemental_fan; rescue StandardError => e; errors << e.message; end
4354
4674
  return errors
4355
4675
  end
4356
4676
 
@@ -4363,6 +4683,14 @@ class HPXML < Object
4363
4683
  XMLHelper.add_attribute(sys_id, 'id', @id)
4364
4684
  XMLHelper.add_element(ventilation_fan, 'Quantity', @quantity, :integer, @quantity_isdefaulted) unless @quantity.nil?
4365
4685
  XMLHelper.add_element(ventilation_fan, 'FanType', @fan_type, :string) unless @fan_type.nil?
4686
+ if (not @cfis_addtl_runtime_operating_mode.nil?) || (not @cfis_supplemental_fan_idref.nil?)
4687
+ cfis_controls = XMLHelper.add_element(ventilation_fan, 'CFISControls')
4688
+ XMLHelper.add_element(cfis_controls, 'AdditionalRuntimeOperatingMode', @cfis_addtl_runtime_operating_mode, :string, @cfis_addtl_runtime_operating_mode_isdefaulted) unless @cfis_addtl_runtime_operating_mode.nil?
4689
+ if not @cfis_supplemental_fan_idref.nil?
4690
+ supplemental_fan = XMLHelper.add_element(cfis_controls, 'SupplementalFan')
4691
+ XMLHelper.add_attribute(supplemental_fan, 'idref', @cfis_supplemental_fan_idref)
4692
+ end
4693
+ end
4366
4694
  XMLHelper.add_element(ventilation_fan, 'RatedFlowRate', @rated_flow_rate, :float, @rated_flow_rate_isdefaulted) unless @rated_flow_rate.nil?
4367
4695
  XMLHelper.add_element(ventilation_fan, 'CalculatedFlowRate', @calculated_flow_rate, :float, @calculated_flow_rate_isdefaulted) unless @calculated_flow_rate.nil?
4368
4696
  XMLHelper.add_element(ventilation_fan, 'TestedFlowRate', @tested_flow_rate, :float, @tested_flow_rate_isdefaulted) unless @tested_flow_rate.nil?
@@ -4442,6 +4770,8 @@ class HPXML < Object
4442
4770
  @flow_rate_not_tested = XMLHelper.get_value(ventilation_fan, 'extension/FlowRateNotTested', :boolean)
4443
4771
  @fan_power_defaulted = XMLHelper.get_value(ventilation_fan, 'extension/FanPowerDefaulted', :boolean)
4444
4772
  @cfis_vent_mode_airflow_fraction = XMLHelper.get_value(ventilation_fan, 'extension/VentilationOnlyModeAirflowFraction', :float)
4773
+ @cfis_addtl_runtime_operating_mode = XMLHelper.get_value(ventilation_fan, 'CFISControls/AdditionalRuntimeOperatingMode', :string)
4774
+ @cfis_supplemental_fan_idref = HPXML::get_idref(XMLHelper.get_element(ventilation_fan, 'CFISControls/SupplementalFan'))
4445
4775
  end
4446
4776
  end
4447
4777
 
@@ -4463,8 +4793,8 @@ class HPXML < Object
4463
4793
  ATTRS = [:id, :year_installed, :fuel_type, :water_heater_type, :location, :performance_adjustment,
4464
4794
  :tank_volume, :fraction_dhw_load_served, :heating_capacity, :energy_factor, :usage_bin,
4465
4795
  :uniform_energy_factor, :first_hour_rating, :recovery_efficiency, :uses_desuperheater, :jacket_r_value,
4466
- :related_hvac_idref, :third_party_certification, :standby_loss, :temperature, :is_shared_system,
4467
- :number_of_units_served, :tank_model_type, :operating_mode]
4796
+ :related_hvac_idref, :third_party_certification, :standby_loss_units, :standby_loss_value,
4797
+ :temperature, :is_shared_system, :number_of_units_served, :tank_model_type, :operating_mode]
4468
4798
  attr_accessor(*ATTRS)
4469
4799
 
4470
4800
  def related_hvac_system
@@ -4521,7 +4851,11 @@ class HPXML < Object
4521
4851
  jacket = XMLHelper.add_element(water_heater_insulation, 'Jacket')
4522
4852
  XMLHelper.add_element(jacket, 'JacketRValue', @jacket_r_value, :float)
4523
4853
  end
4524
- XMLHelper.add_element(water_heating_system, 'StandbyLoss', @standby_loss, :float, @standby_loss_isdefaulted) unless @standby_loss.nil?
4854
+ if (not @standby_loss_units.nil?) && (not @standby_loss_value.nil?)
4855
+ standby_loss = XMLHelper.add_element(water_heating_system, 'StandbyLoss')
4856
+ XMLHelper.add_element(standby_loss, 'Units', @standby_loss_units, :string, @standby_loss_units_isdefaulted)
4857
+ XMLHelper.add_element(standby_loss, 'Value', @standby_loss_value, :float, @standby_loss_value_isdefaulted)
4858
+ end
4525
4859
  XMLHelper.add_element(water_heating_system, 'HotWaterTemperature', @temperature, :float, @temperature_isdefaulted) unless @temperature.nil?
4526
4860
  XMLHelper.add_element(water_heating_system, 'UsesDesuperheater', @uses_desuperheater, :boolean) unless @uses_desuperheater.nil?
4527
4861
  if not @related_hvac_idref.nil?
@@ -4556,7 +4890,8 @@ class HPXML < Object
4556
4890
  @usage_bin = XMLHelper.get_value(water_heating_system, 'UsageBin', :string)
4557
4891
  @recovery_efficiency = XMLHelper.get_value(water_heating_system, 'RecoveryEfficiency', :float)
4558
4892
  @jacket_r_value = XMLHelper.get_value(water_heating_system, 'WaterHeaterInsulation/Jacket/JacketRValue', :float)
4559
- @standby_loss = XMLHelper.get_value(water_heating_system, 'StandbyLoss', :float)
4893
+ @standby_loss_units = XMLHelper.get_value(water_heating_system, 'StandbyLoss/Units', :string)
4894
+ @standby_loss_value = XMLHelper.get_value(water_heating_system, 'StandbyLoss/Value', :float)
4560
4895
  @temperature = XMLHelper.get_value(water_heating_system, 'HotWaterTemperature', :float)
4561
4896
  @uses_desuperheater = XMLHelper.get_value(water_heating_system, 'UsesDesuperheater', :boolean)
4562
4897
  @related_hvac_idref = HPXML::get_idref(XMLHelper.get_element(water_heating_system, 'RelatedHVACSystem'))
@@ -4613,7 +4948,7 @@ class HPXML < Object
4613
4948
  recirculation = XMLHelper.add_element(system_type_el, @system_type)
4614
4949
  XMLHelper.add_element(recirculation, 'ControlType', @recirculation_control_type, :string) unless @recirculation_control_type.nil?
4615
4950
  XMLHelper.add_element(recirculation, 'RecirculationPipingLoopLength', @recirculation_piping_length, :float, @recirculation_piping_length_isdefaulted) unless @recirculation_piping_length.nil?
4616
- XMLHelper.add_element(recirculation, 'BranchPipingLoopLength', @recirculation_branch_piping_length, :float, @recirculation_branch_piping_length_isdefaulted) unless @recirculation_branch_piping_length.nil?
4951
+ XMLHelper.add_element(recirculation, 'BranchPipingLength', @recirculation_branch_piping_length, :float, @recirculation_branch_piping_length_isdefaulted) unless @recirculation_branch_piping_length.nil?
4617
4952
  XMLHelper.add_element(recirculation, 'PumpPower', @recirculation_pump_power, :float, @recirculation_pump_power_isdefaulted) unless @recirculation_pump_power.nil?
4618
4953
  else
4619
4954
  fail "Unhandled hot water distribution type '#{@system_type}'."
@@ -4649,7 +4984,7 @@ class HPXML < Object
4649
4984
  elsif @system_type == 'Recirculation'
4650
4985
  @recirculation_control_type = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/ControlType', :string)
4651
4986
  @recirculation_piping_length = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/RecirculationPipingLoopLength', :float)
4652
- @recirculation_branch_piping_length = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/BranchPipingLoopLength', :float)
4987
+ @recirculation_branch_piping_length = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/BranchPipingLength', :float)
4653
4988
  @recirculation_pump_power = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/PumpPower', :float)
4654
4989
  end
4655
4990
  @pipe_r_value = XMLHelper.get_value(hot_water_distribution, 'PipeInsulation/PipeRValue', :float)
@@ -4971,7 +5306,7 @@ class HPXML < Object
4971
5306
  class Battery < BaseElement
4972
5307
  ATTRS = [:id, :type, :location, :lifetime_model, :rated_power_output,
4973
5308
  :nominal_capacity_kwh, :nominal_capacity_ah, :nominal_voltage,
4974
- :usable_capacity_kwh, :usable_capacity_ah]
5309
+ :round_trip_efficiency, :usable_capacity_kwh, :usable_capacity_ah]
4975
5310
  attr_accessor(*ATTRS)
4976
5311
 
4977
5312
  def delete
@@ -5014,6 +5349,7 @@ class HPXML < Object
5014
5349
  end
5015
5350
  XMLHelper.add_element(battery, 'RatedPowerOutput', @rated_power_output, :float, @rated_power_output_isdefaulted) unless @rated_power_output.nil?
5016
5351
  XMLHelper.add_element(battery, 'NominalVoltage', @nominal_voltage, :float, @nominal_voltage_isdefaulted) unless @nominal_voltage.nil?
5352
+ XMLHelper.add_element(battery, 'RoundTripEfficiency', @round_trip_efficiency, :float, @round_trip_efficiency_isdefaulted) unless @round_trip_efficiency.nil?
5017
5353
  XMLHelper.add_extension(battery, 'LifetimeModel', @lifetime_model, :string, @lifetime_model_isdefaulted) unless @lifetime_model.nil?
5018
5354
  end
5019
5355
 
@@ -5029,6 +5365,7 @@ class HPXML < Object
5029
5365
  @usable_capacity_ah = XMLHelper.get_value(battery, "UsableCapacity[Units='#{UnitsAh}']/Value", :float)
5030
5366
  @rated_power_output = XMLHelper.get_value(battery, 'RatedPowerOutput', :float)
5031
5367
  @nominal_voltage = XMLHelper.get_value(battery, 'NominalVoltage', :float)
5368
+ @round_trip_efficiency = XMLHelper.get_value(battery, 'RoundTripEFficiency', :float)
5032
5369
  @lifetime_model = XMLHelper.get_value(battery, 'extension/LifetimeModel', :string)
5033
5370
  end
5034
5371
  end
@@ -5051,8 +5388,8 @@ class HPXML < Object
5051
5388
  ATTRS = [:id, :location, :modified_energy_factor, :integrated_modified_energy_factor,
5052
5389
  :rated_annual_kwh, :label_electric_rate, :label_gas_rate, :label_annual_gas_cost,
5053
5390
  :capacity, :label_usage, :usage_multiplier, :is_shared_appliance, :number_of_units,
5054
- :number_of_units_served, :water_heating_system_idref, :weekday_fractions,
5055
- :weekend_fractions, :monthly_multipliers]
5391
+ :number_of_units_served, :water_heating_system_idref, :hot_water_distribution_idref,
5392
+ :weekday_fractions, :weekend_fractions, :monthly_multipliers]
5056
5393
 
5057
5394
  attr_accessor(*ATTRS)
5058
5395
 
@@ -5067,6 +5404,17 @@ class HPXML < Object
5067
5404
  fail "Attached water heating system '#{@water_heating_system_idref}' not found for clothes washer '#{@id}'."
5068
5405
  end
5069
5406
 
5407
+ def hot_water_distribution
5408
+ return if @hot_water_distribution_idref.nil?
5409
+
5410
+ @hpxml_object.hot_water_distributions.each do |hot_water_distribution|
5411
+ next unless hot_water_distribution.id == @hot_water_distribution_idref
5412
+
5413
+ return hot_water_distribution
5414
+ end
5415
+ fail "Attached hot water distribution '#{@hot_water_distribution_idref}' not found for clothes washer '#{@id}'."
5416
+ end
5417
+
5070
5418
  def delete
5071
5419
  @hpxml_object.clothes_washers.delete(self)
5072
5420
  end
@@ -5074,6 +5422,7 @@ class HPXML < Object
5074
5422
  def check_for_errors
5075
5423
  errors = []
5076
5424
  begin; water_heating_system; rescue StandardError => e; errors << e.message; end
5425
+ begin; hot_water_distribution; rescue StandardError => e; errors << e.message; end
5077
5426
  return errors
5078
5427
  end
5079
5428
 
@@ -5090,6 +5439,9 @@ class HPXML < Object
5090
5439
  if not @water_heating_system_idref.nil?
5091
5440
  attached_water_heater = XMLHelper.add_element(clothes_washer, 'AttachedToWaterHeatingSystem')
5092
5441
  XMLHelper.add_attribute(attached_water_heater, 'idref', @water_heating_system_idref)
5442
+ elsif not @hot_water_distribution_idref.nil?
5443
+ attached_hot_water_dist = XMLHelper.add_element(clothes_washer, 'AttachedToHotWaterDistribution')
5444
+ XMLHelper.add_attribute(attached_hot_water_dist, 'idref', @hot_water_distribution_idref)
5093
5445
  end
5094
5446
  XMLHelper.add_element(clothes_washer, 'Location', @location, :string, @location_isdefaulted) unless @location.nil?
5095
5447
  XMLHelper.add_element(clothes_washer, 'ModifiedEnergyFactor', @modified_energy_factor, :float) unless @modified_energy_factor.nil?
@@ -5114,6 +5466,7 @@ class HPXML < Object
5114
5466
  @is_shared_appliance = XMLHelper.get_value(clothes_washer, 'IsSharedAppliance', :boolean)
5115
5467
  @number_of_units_served = XMLHelper.get_value(clothes_washer, 'NumberofUnitsServed', :integer)
5116
5468
  @water_heating_system_idref = HPXML::get_idref(XMLHelper.get_element(clothes_washer, 'AttachedToWaterHeatingSystem'))
5469
+ @hot_water_distribution_idref = HPXML::get_idref(XMLHelper.get_element(clothes_washer, 'AttachedToHotWaterDistribution'))
5117
5470
  @location = XMLHelper.get_value(clothes_washer, 'Location', :string)
5118
5471
  @modified_energy_factor = XMLHelper.get_value(clothes_washer, 'ModifiedEnergyFactor', :float)
5119
5472
  @integrated_modified_energy_factor = XMLHelper.get_value(clothes_washer, 'IntegratedModifiedEnergyFactor', :float)
@@ -5220,9 +5573,9 @@ class HPXML < Object
5220
5573
 
5221
5574
  class Dishwasher < BaseElement
5222
5575
  ATTRS = [:id, :location, :energy_factor, :rated_annual_kwh, :place_setting_capacity,
5223
- :label_electric_rate, :label_gas_rate, :label_annual_gas_cost,
5224
- :label_usage, :usage_multiplier, :is_shared_appliance, :water_heating_system_idref,
5225
- :weekday_fractions, :weekend_fractions, :monthly_multipliers]
5576
+ :label_electric_rate, :label_gas_rate, :label_annual_gas_cost, :label_usage,
5577
+ :usage_multiplier, :is_shared_appliance, :water_heating_system_idref,
5578
+ :hot_water_distribution_idref, :weekday_fractions, :weekend_fractions, :monthly_multipliers]
5226
5579
  attr_accessor(*ATTRS)
5227
5580
 
5228
5581
  def water_heating_system
@@ -5236,6 +5589,17 @@ class HPXML < Object
5236
5589
  fail "Attached water heating system '#{@water_heating_system_idref}' not found for dishwasher '#{@id}'."
5237
5590
  end
5238
5591
 
5592
+ def hot_water_distribution
5593
+ return if @hot_water_distribution_idref.nil?
5594
+
5595
+ @hpxml_object.hot_water_distributions.each do |hot_water_distribution|
5596
+ next unless hot_water_distribution.id == @hot_water_distribution_idref
5597
+
5598
+ return hot_water_distribution
5599
+ end
5600
+ fail "Attached hot water distribution '#{@hot_water_distribution_idref}' not found for dishwasher '#{@id}'."
5601
+ end
5602
+
5239
5603
  def delete
5240
5604
  @hpxml_object.dishwashers.delete(self)
5241
5605
  end
@@ -5243,6 +5607,7 @@ class HPXML < Object
5243
5607
  def check_for_errors
5244
5608
  errors = []
5245
5609
  begin; water_heating_system; rescue StandardError => e; errors << e.message; end
5610
+ begin; hot_water_distribution; rescue StandardError => e; errors << e.message; end
5246
5611
  return errors
5247
5612
  end
5248
5613
 
@@ -5257,6 +5622,9 @@ class HPXML < Object
5257
5622
  if not @water_heating_system_idref.nil?
5258
5623
  attached_water_heater = XMLHelper.add_element(dishwasher, 'AttachedToWaterHeatingSystem')
5259
5624
  XMLHelper.add_attribute(attached_water_heater, 'idref', @water_heating_system_idref)
5625
+ elsif not @hot_water_distribution_idref.nil?
5626
+ attached_hot_water_dist = XMLHelper.add_element(dishwasher, 'AttachedToHotWaterDistribution')
5627
+ XMLHelper.add_attribute(attached_hot_water_dist, 'idref', @hot_water_distribution_idref)
5260
5628
  end
5261
5629
  XMLHelper.add_element(dishwasher, 'Location', @location, :string, @location_isdefaulted) unless @location.nil?
5262
5630
  XMLHelper.add_element(dishwasher, 'RatedAnnualkWh', @rated_annual_kwh, :float, @rated_annual_kwh_isdefaulted) unless @rated_annual_kwh.nil?
@@ -5278,6 +5646,7 @@ class HPXML < Object
5278
5646
  @id = HPXML::get_id(dishwasher)
5279
5647
  @is_shared_appliance = XMLHelper.get_value(dishwasher, 'IsSharedAppliance', :boolean)
5280
5648
  @water_heating_system_idref = HPXML::get_idref(XMLHelper.get_element(dishwasher, 'AttachedToWaterHeatingSystem'))
5649
+ @hot_water_distribution_idref = HPXML::get_idref(XMLHelper.get_element(dishwasher, 'AttachedToHotWaterDistribution'))
5281
5650
  @location = XMLHelper.get_value(dishwasher, 'Location', :string)
5282
5651
  @rated_annual_kwh = XMLHelper.get_value(dishwasher, 'RatedAnnualkWh', :float)
5283
5652
  @energy_factor = XMLHelper.get_value(dishwasher, 'EnergyFactor', :float)
@@ -6097,11 +6466,11 @@ class HPXML < Object
6097
6466
  end
6098
6467
 
6099
6468
  def _create_oga_document()
6100
- doc = XMLHelper.create_doc(version = '1.0', encoding = 'UTF-8')
6469
+ doc = XMLHelper.create_doc('1.0', 'UTF-8')
6101
6470
  hpxml = XMLHelper.add_element(doc, 'HPXML')
6102
- XMLHelper.add_attribute(hpxml, 'xmlns', 'http://hpxmlonline.com/2019/10')
6471
+ XMLHelper.add_attribute(hpxml, 'xmlns', NameSpace)
6103
6472
  XMLHelper.add_attribute(hpxml, 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance')
6104
- XMLHelper.add_attribute(hpxml, 'xsi:schemaLocation', 'http://hpxmlonline.com/2019/10')
6473
+ XMLHelper.add_attribute(hpxml, 'xsi:schemaLocation', NameSpace)
6105
6474
  XMLHelper.add_attribute(hpxml, 'schemaVersion', Version::HPXML_Version)
6106
6475
  return doc
6107
6476
  end
@@ -6115,7 +6484,7 @@ class HPXML < Object
6115
6484
  walls: @walls,
6116
6485
  rim_joists: @rim_joists,
6117
6486
  foundation_walls: @foundation_walls,
6118
- frame_floors: @frame_floors,
6487
+ floors: @floors,
6119
6488
  slabs: @slabs,
6120
6489
  windows: @windows,
6121
6490
  skylights: @skylights,
@@ -6184,7 +6553,7 @@ class HPXML < Object
6184
6553
  end
6185
6554
 
6186
6555
  def delete_tiny_surfaces()
6187
- (@rim_joists + @walls + @foundation_walls + @frame_floors + @roofs + @windows + @skylights + @doors + @slabs).reverse_each do |surface|
6556
+ (@rim_joists + @walls + @foundation_walls + @floors + @roofs + @windows + @skylights + @doors + @slabs).reverse_each do |surface|
6188
6557
  next if surface.area.nil? || (surface.area > 1.0)
6189
6558
 
6190
6559
  surface.delete
@@ -6206,24 +6575,6 @@ class HPXML < Object
6206
6575
  end
6207
6576
  end
6208
6577
 
6209
- def validate_against_schematron(schematron_validators: [])
6210
- # ----------------------------- #
6211
- # Perform Schematron validation #
6212
- # ----------------------------- #
6213
-
6214
- if not schematron_validators.empty?
6215
- errors, warnings = Validator.run_validators(@doc, schematron_validators)
6216
- else
6217
- errors = []
6218
- warnings = []
6219
- end
6220
-
6221
- errors.map! { |e| "#{@hpxml_path}: #{e}" }
6222
- warnings.map! { |w| "#{@hpxml_path}: #{w}" }
6223
-
6224
- return errors, warnings
6225
- end
6226
-
6227
6578
  def check_for_errors()
6228
6579
  errors = []
6229
6580
 
@@ -6245,27 +6596,6 @@ class HPXML < Object
6245
6596
  # Check for errors across objects #
6246
6597
  # ------------------------------- #
6247
6598
 
6248
- # FUTURE: Move these to EPvalidator.xml where possible
6249
-
6250
- # Check for globally unique SystemIdentifier IDs and empty IDs
6251
- sys_ids = {}
6252
- self.class::HPXML_ATTRS.each do |attribute|
6253
- hpxml_obj = send(attribute)
6254
- next unless hpxml_obj.is_a? HPXML::BaseArrayElement
6255
-
6256
- hpxml_obj.each do |obj|
6257
- next unless obj.respond_to? :id
6258
-
6259
- sys_ids[obj.id] = 0 if sys_ids[obj.id].nil?
6260
- sys_ids[obj.id] += 1
6261
-
6262
- errors << "Empty SystemIdentifier ID ('#{obj.id}') detected for #{attribute}." if !obj.id || obj.id.size == 0
6263
- end
6264
- end
6265
- sys_ids.each do |sys_id, cnt|
6266
- errors << "Duplicate SystemIdentifier IDs detected for '#{sys_id}'." if cnt > 1
6267
- end
6268
-
6269
6599
  # Check for HVAC systems referenced by multiple water heating systems
6270
6600
  hvac_systems.each do |hvac_system|
6271
6601
  num_attached = 0
@@ -6387,7 +6717,7 @@ class HPXML < Object
6387
6717
  return true
6388
6718
  elsif conditioned_locations.include?(surface.interior_adjacent_to) &&
6389
6719
  conditioned_locations.include?(surface.exterior_adjacent_to)
6390
- # E.g., frame floor between living space and conditioned basement, or
6720
+ # E.g., floor between living space and conditioned basement, or
6391
6721
  # wall between living space and "other housing unit"
6392
6722
  return true
6393
6723
  end