urbanopt-cli 0.8.3 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (657) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -6
  3. data/CHANGELOG.md +20 -0
  4. data/CMakeLists.txt +7 -7
  5. data/Gemfile +3 -1
  6. data/LICENSE.md +1 -1
  7. data/README.md +9 -0
  8. data/Rakefile +1 -1
  9. data/example_files/Gemfile +23 -16
  10. data/example_files/Gemfile.lock +177 -0
  11. data/example_files/base_workflow_res.osw +57 -14
  12. data/example_files/class_project_coincident.json +1322 -0
  13. data/example_files/class_project_diverse.json +1322 -0
  14. data/example_files/disco/config.json +42 -0
  15. data/example_files/disco/cost_database.xlsx +0 -0
  16. data/example_files/disco/technical_catalog.json +12126 -0
  17. data/example_files/mappers/Baseline.rb +11 -8
  18. data/example_files/mappers/ChilledWaterStorage.rb +98 -0
  19. data/example_files/mappers/ClassProject.rb +110 -0
  20. data/example_files/mappers/CreateBar.rb +2 -1
  21. data/example_files/mappers/EvCharging.rb +1 -1
  22. data/example_files/mappers/FlexibleHotWater.rb +1 -1
  23. data/example_files/mappers/Floorspace.rb +1 -1
  24. data/example_files/mappers/HighEfficiency.rb +14 -12
  25. data/example_files/mappers/HighEfficiencyCreateBar.rb +1 -1
  26. data/example_files/mappers/HighEfficiencyFloorspace.rb +1 -1
  27. data/example_files/mappers/PeakHoursMelsShedding.rb +72 -0
  28. data/example_files/mappers/PeakHoursThermostatAdjust.rb +78 -0
  29. data/example_files/mappers/ThermalStorage.rb +2 -1
  30. data/example_files/mappers/base_workflow.osw +55 -14
  31. data/example_files/mappers/class_project_workflow.osw +328 -0
  32. data/example_files/mappers/createbar_workflow.osw +16 -16
  33. data/example_files/measures/BuildResidentialModel/measure.rb +7 -1
  34. data/example_files/measures/BuildResidentialModel/measure.xml +1313 -706
  35. data/example_files/opendss/electrical_database.json +1446 -1446
  36. data/example_files/python_deps/dependencies.json +5 -0
  37. data/example_files/python_deps/install_python.ps1 +96 -0
  38. data/example_files/python_deps/install_python.sh +120 -0
  39. data/example_files/residential/clothes_dryer.tsv +11 -11
  40. data/example_files/residential/clothes_washer.tsv +3 -3
  41. data/example_files/residential/dishwasher.tsv +3 -3
  42. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +0 -1
  43. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +8 -21
  44. data/example_files/resources/hpxml-measures/.gitignore +2 -0
  45. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1272 -1094
  46. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +978 -659
  47. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +52 -74
  48. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +77 -140
  49. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +37 -27
  50. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +42 -15
  51. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +70 -51
  52. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +142 -21
  53. data/example_files/resources/hpxml-measures/Changelog.md +95 -19
  54. data/example_files/resources/hpxml-measures/Gemfile +2 -4
  55. data/example_files/resources/hpxml-measures/Gemfile.lock +2 -13
  56. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +276 -300
  57. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +220 -214
  58. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +215 -170
  59. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +115 -18
  60. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +24 -44
  61. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +564 -197
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/cambium/README.md +8 -8
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +7 -55
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +24 -19
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +541 -211
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +305 -176
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +0 -2
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLBaseElements.xsd +230 -141
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLDataTypes.xsd +145 -137
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +191 -97
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/iso-schematron.xsd +391 -0
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +194 -198
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +140 -145
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +11 -11
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +33 -1
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +4 -4
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +17 -9
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +14 -12
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +39 -17
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +1 -1
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/battery.csv +8761 -0
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +114 -57
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +1 -0
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/utility_bills.rb +148 -0
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +90 -128
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +26 -32
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +2 -14
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +67 -0
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +117 -56
  92. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +141 -14
  93. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +471 -344
  94. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +124 -20
  95. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +1 -1
  96. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +28 -32
  97. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +172 -79
  98. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +54 -8
  99. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +3 -3
  100. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +4 -4
  101. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +7 -7
  102. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +1 -1
  103. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +6 -9
  104. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +8 -8
  105. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +213 -95
  106. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +1 -10
  107. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +76 -0
  108. data/example_files/resources/hpxml-measures/README.md +2 -3
  109. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +587 -284
  110. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +304 -352
  111. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/output_report_test.rb +404 -279
  112. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +222 -501
  113. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +137 -200
  114. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json +649 -0
  115. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json +649 -0
  116. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json +647 -0
  117. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Annual Charge.json +8776 -0
  118. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Monthly Charge.json +8776 -0
  119. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json +8774 -0
  120. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Annual Charge.json +659 -0
  121. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Monthly Charge.json +659 -0
  122. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json +657 -0
  123. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Annual Charge.json +670 -0
  124. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Monthly Charge.json +670 -0
  125. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json +668 -0
  126. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Annual Charge.json +655 -0
  127. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Monthly Charge.json +655 -0
  128. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json +653 -0
  129. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/openei_rates.zip +0 -0
  130. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/Average_retail_price_of_electricity.csv +0 -0
  131. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/HouseholdConsumption.csv +0 -0
  132. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv +0 -0
  133. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv +0 -0
  134. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv +0 -0
  135. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/README.md +0 -0
  136. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/util.rb +506 -25
  137. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Contains Demand Charges.json +1312 -0
  138. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Fixed Charge Units.json +657 -0
  139. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Min Charge Units.json +659 -0
  140. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/JacksonElectricMemberCorp-ResidentialSeniorCitizenLowIncomeAssistance.json +681 -0
  141. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Missing Required Fields.json +54 -0
  142. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/data.csv +8761 -0
  143. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +1006 -235
  144. data/example_files/resources/hpxml-measures/docs/source/conf.py +1 -1
  145. data/example_files/resources/hpxml-measures/docs/source/intro.rst +0 -1
  146. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +4 -3
  147. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +468 -264
  148. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +148 -154
  149. data/example_files/resources/hpxml-measures/tasks.rb +616 -802
  150. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +19 -11
  151. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +20 -12
  152. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +12 -7
  153. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +12 -7
  154. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +19 -11
  155. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +12 -7
  156. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +20 -12
  157. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +28 -16
  158. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +28 -17
  159. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +28 -16
  160. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +20 -12
  161. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +20 -12
  162. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +20 -12
  163. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +20 -12
  164. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +20 -12
  165. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +22 -12
  166. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +19 -11
  167. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +20 -12
  168. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +13 -7
  169. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +12 -7
  170. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +31 -16
  171. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +22 -12
  172. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +21 -12
  173. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +37 -22
  174. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +24 -12
  175. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +33 -21
  176. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +28 -16
  177. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +28 -16
  178. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +30 -17
  179. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +10 -7
  180. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +22 -11
  181. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +12 -7
  182. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +18 -12
  183. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +25 -16
  184. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +22 -12
  185. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +20 -12
  186. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +26 -17
  187. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +19 -11
  188. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +25 -16
  189. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +20 -12
  190. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +35 -21
  191. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +28 -17
  192. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +20 -12
  193. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +35 -21
  194. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +20 -12
  195. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +20 -13
  196. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +12 -9
  197. data/example_files/resources/hpxml-measures/workflow/real_homes/house048.xml +25 -14
  198. data/example_files/resources/hpxml-measures/workflow/real_homes/house049.xml +10 -7
  199. data/example_files/resources/hpxml-measures/workflow/real_homes/house050.xml +20 -11
  200. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +91 -88
  201. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +18 -7
  202. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +546 -535
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +546 -535
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +555 -544
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +18 -7
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +18 -7
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +18 -7
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +18 -7
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +580 -569
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +18 -7
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +580 -569
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +18 -7
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +18 -7
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +7 -0
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +17 -6
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +7 -0
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +18 -7
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +18 -7
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +18 -7
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +600 -0
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +598 -587
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +494 -485
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +606 -593
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +494 -485
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +494 -485
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +494 -485
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-calctype-operational.xml +480 -471
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +464 -457
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +496 -487
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +466 -459
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +518 -509
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +513 -504
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +445 -438
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +476 -467
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +443 -436
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +446 -439
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +494 -485
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +445 -438
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +476 -467
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +446 -439
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +494 -485
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +489 -480
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +499 -490
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +491 -482
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml +510 -0
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +495 -486
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +709 -695
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +528 -519
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +512 -503
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +504 -495
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +497 -488
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +490 -481
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +487 -478
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-2stories.xml +639 -628
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-atticroof-cathedral.xml +587 -580
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +639 -628
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-defaults.xml +539 -528
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon.xml +644 -633
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon2.xml +644 -633
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational.xml +575 -564
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +16 -7
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +16 -7
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +18 -7
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +585 -574
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +18 -7
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +18 -7
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +18 -7
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +18 -7
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +18 -7
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +536 -0
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +16 -7
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +16 -7
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +20 -8
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +16 -7
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +16 -7
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +18 -7
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +18 -7
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +18 -7
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +16 -7
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +18 -7
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +16 -7
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +18 -7
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +19 -8
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +19 -8
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +19 -8
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +19 -8
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +19 -8
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +18 -7
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +18 -7
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +18 -7
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +18 -7
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +18 -7
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +18 -7
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +18 -7
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +582 -571
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +583 -572
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +18 -7
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +584 -573
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +584 -573
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +18 -7
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +583 -572
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +585 -574
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +18 -7
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +582 -571
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +18 -7
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +18 -7
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +18 -7
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +586 -575
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +585 -574
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +18 -7
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +18 -7
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +580 -569
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +18 -7
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +580 -569
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +18 -7
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +580 -569
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +18 -7
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +18 -7
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +18 -7
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +18 -7
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +28 -11
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +20 -7
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +18 -7
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +18 -7
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +18 -7
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +18 -7
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +607 -0
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +550 -0
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +27 -12
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +18 -7
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +18 -7
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +18 -7
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +18 -7
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +18 -7
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +589 -578
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +18 -7
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +18 -7
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +619 -608
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +620 -609
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +618 -607
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +18 -7
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +537 -526
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +90 -43
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2507 -2460
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +595 -584
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +19 -8
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +584 -0
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +18 -7
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +594 -583
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +597 -586
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +598 -587
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +27 -12
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +671 -656
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +18 -7
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +18 -7
  356. 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
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +582 -571
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +35 -16
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +18 -7
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +27 -12
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +27 -12
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +27 -12
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +27 -12
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +27 -12
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +27 -12
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +18 -7
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-backup-lockout-temperature.xml +586 -575
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +580 -569
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +583 -0
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +18 -7
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +18 -7
  373. 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
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +599 -588
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +629 -616
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +18 -7
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +579 -568
  379. 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
  380. 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
  381. 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
  382. 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
  383. 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
  384. 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
  385. 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
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +598 -587
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +628 -615
  388. 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
  389. 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
  390. 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
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +535 -526
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +589 -578
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +536 -527
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +18 -7
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +565 -554
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +565 -554
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  398. 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
  399. 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
  400. 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
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +526 -517
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +573 -562
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +529 -520
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +565 -554
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +580 -569
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +580 -569
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +565 -554
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +578 -567
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +575 -564
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +581 -570
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +583 -572
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +583 -572
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +583 -572
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +18 -7
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +580 -569
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +580 -569
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml +580 -569
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +551 -542
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +532 -530
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +525 -516
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +541 -532
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +541 -532
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +541 -532
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +525 -516
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +533 -0
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +542 -0
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +542 -0
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +542 -0
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +529 -520
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +529 -520
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +580 -569
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +16 -7
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +16 -7
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +18 -7
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +16 -7
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +16 -7
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +16 -7
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +16 -7
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +567 -0
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +18 -7
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +18 -7
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +18 -7
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +16 -7
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +18 -7
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +18 -7
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +18 -7
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +18 -7
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +611 -598
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +589 -0
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +582 -571
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +18 -7
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +16 -7
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +18 -7
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +17 -7
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +16 -7
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +530 -521
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +530 -521
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +530 -521
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +566 -555
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +18 -7
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +18 -7
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +18 -7
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +18 -7
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +566 -555
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +566 -555
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +18 -7
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +18 -7
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +18 -7
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +18 -7
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +16 -7
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +574 -563
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +581 -570
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +583 -572
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +587 -576
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +587 -576
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +587 -576
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +591 -580
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +591 -580
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +591 -580
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +570 -559
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +586 -575
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +570 -559
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +586 -575
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +18 -7
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +16 -7
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +18 -7
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +552 -543
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +16 -7
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +963 -938
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +33 -69
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +530 -521
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +535 -0
  500. 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
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +526 -517
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +541 -532
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +16 -7
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +526 -517
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +526 -517
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +16 -7
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +535 -0
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +542 -0
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +594 -583
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +586 -575
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +18 -7
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +18 -7
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +530 -521
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +530 -521
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +18 -7
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +18 -7
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +530 -521
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +18 -7
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +18 -7
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +18 -7
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +18 -7
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +27 -12
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +591 -576
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +18 -7
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +27 -12
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +582 -571
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +537 -526
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +18 -7
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +537 -526
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +601 -586
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +18 -7
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +18 -7
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +601 -587
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +19 -7
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +20 -7
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +607 -0
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +607 -0
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +21 -7
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +18 -7
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +18 -7
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +18 -7
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +18 -7
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +18 -7
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +18 -7
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +37 -19
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +18 -7
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +18 -7
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +590 -579
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +578 -0
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +632 -0
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +614 -0
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +677 -0
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +593 -0
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +27 -9
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +676 -665
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +616 -0
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +615 -0
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +598 -587
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +586 -0
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +18 -7
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +18 -7
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +18 -7
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +18 -7
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +583 -572
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +18 -7
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1700 -1677
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +622 -611
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +697 -682
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-pv-battery-lifetime-model.xml → base-pv-battery-round-trip-efficiency.xml} +20 -11
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +624 -0
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +622 -611
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +640 -0
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +639 -0
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +623 -0
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +606 -595
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +582 -571
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-smooth.xml +583 -572
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +584 -0
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +583 -572
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +583 -572
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +581 -570
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +581 -570
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +581 -570
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +636 -625
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +18 -7
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +27 -14
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +21 -10
  588. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +21 -10
  589. 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
  590. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +584 -0
  591. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +584 -0
  592. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +18 -7
  593. 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
  594. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +18 -7
  595. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +18 -13
  596. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy-subset.osw +64 -0
  597. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +12 -7
  598. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +8 -24
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +366 -358
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +369 -361
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +369 -361
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +369 -361
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +369 -361
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +369 -361
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +369 -361
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +369 -361
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +311 -303
  608. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +311 -303
  609. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +327 -319
  610. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +327 -319
  611. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +332 -324
  612. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +332 -324
  613. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +341 -333
  614. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +341 -333
  615. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +369 -361
  616. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +369 -361
  617. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +369 -361
  618. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +369 -361
  619. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +369 -361
  620. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +369 -361
  621. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +383 -379
  622. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +383 -379
  623. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +538 -534
  624. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +550 -546
  625. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +444 -410
  626. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +8 -8
  627. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +444 -410
  628. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +18 -4
  629. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +163 -392
  630. data/example_files/scripts/convert_urbanopt_to_disco.py +130 -0
  631. data/example_files/scripts/default_control_changes.csv +8 -0
  632. data/example_files/scripts/default_voltage_regulators.csv +3 -0
  633. data/example_files/scripts/read_data.py +331 -0
  634. data/example_files/visualization/input_visualization_feature.html +172 -81
  635. data/example_files/visualization/input_visualization_scenario.html +178 -82
  636. data/example_files/xml_building/17/README.md +2 -2
  637. data/example_files/xml_building/17/unit 1.xml +40 -41
  638. data/example_files/xml_building/17/unit 2.xml +35 -36
  639. data/example_files/xml_building/17/unit 3.xml +35 -36
  640. data/example_files/xml_building/17/unit 4.xml +41 -42
  641. data/lib/uo_cli/version.rb +2 -2
  642. data/lib/uo_cli.rb +597 -97
  643. data/uo_cli.gemspec +6 -5
  644. metadata +122 -36
  645. data/example_files/residential/exhaust.tsv +0 -3
  646. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/hvac_equipment_efficiency.csv +0 -493
  647. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/water_heater_efficiency.csv +0 -157
  648. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/HPXMLvalidator.xml +0 -620
  649. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +0 -107
  650. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +0 -450
  651. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +0 -85
  652. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +0 -72
  653. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +0 -290
  654. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_10kW.csv +0 -8761
  655. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_1kW.csv +0 -8761
  656. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_None.csv +0 -8761
  657. 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