urbanopt-cli 0.9.2 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (641) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/{nightly_build.yml → nightly_ci_build.yml} +6 -5
  3. data/CHANGELOG.md +16 -2
  4. data/CMakeLists.txt +7 -7
  5. data/Gemfile +8 -7
  6. data/LICENSE.md +18 -15
  7. data/README.md +2 -1
  8. data/Rakefile +2 -37
  9. data/example_files/Gemfile +10 -8
  10. data/example_files/mappers/Baseline.rb +170 -191
  11. data/example_files/mappers/ChilledWaterStorage.rb +8 -30
  12. data/example_files/mappers/ClassProject.rb +2 -27
  13. data/example_files/mappers/CreateBar.rb +2 -28
  14. data/example_files/mappers/EvCharging.rb +2 -27
  15. data/example_files/mappers/FlexibleHotWater.rb +2 -27
  16. data/example_files/mappers/Floorspace.rb +2 -27
  17. data/example_files/mappers/HighEfficiency.rb +2 -27
  18. data/example_files/mappers/HighEfficiencyCreateBar.rb +2 -27
  19. data/example_files/mappers/HighEfficiencyFloorspace.rb +2 -27
  20. data/example_files/mappers/PeakHoursMelsShedding.rb +4 -27
  21. data/example_files/mappers/PeakHoursThermostatAdjust.rb +4 -27
  22. data/example_files/mappers/ThermalStorage.rb +2 -28
  23. data/example_files/measures/BuildResidentialModel/measure.rb +30 -60
  24. data/example_files/measures/BuildResidentialModel/measure.xml +253 -84
  25. data/example_files/measures/BuildResidentialModel/resources/util.rb +45 -45
  26. data/example_files/python_deps/dependencies.json +3 -3
  27. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +1 -1
  28. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +28 -19
  29. data/example_files/resources/hpxml-measures/.gitignore +0 -997
  30. data/example_files/resources/hpxml-measures/.readthedocs.yml +9 -0
  31. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +476 -230
  32. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +244 -75
  33. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +42 -15
  34. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +24 -9
  35. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +11 -33
  36. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +23 -50
  37. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/README.md +2 -2
  38. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/constants.rb +119 -0
  39. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +67 -290
  40. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules_config.md +6 -5
  41. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +78 -349
  42. data/example_files/resources/hpxml-measures/Changelog.md +80 -10
  43. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +212 -144
  44. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +164 -170
  45. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +238 -167
  46. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +1 -1
  47. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +12 -4
  48. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +36 -6
  49. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/unavailable_periods.csv +33 -0
  50. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
  51. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +9 -7
  52. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +79 -61
  53. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +387 -124
  54. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +427 -196
  55. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +11515 -2
  56. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/README.md +1 -0
  57. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +224 -85
  58. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +334 -319
  59. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +572 -838
  60. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +162 -68
  61. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +4 -20
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +12 -10
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +34 -37
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +8 -101
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +31 -40
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +1 -1
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-non-stochastic.csv +8761 -0
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-10-mins.csv +52561 -52561
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic.csv +8761 -8761
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +384 -155
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +1 -1
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/util.rb +2 -2
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +68 -90
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +34 -223
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +1 -1
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +16 -4
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +94 -40
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +765 -302
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +119 -69
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +8 -8
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +1 -1
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +51 -11
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +196 -9
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +36 -13
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +3 -3
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +2 -2
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +571 -61
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +190 -81
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +11 -11
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +188 -50
  92. data/example_files/resources/hpxml-measures/README.md +3 -3
  93. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +659 -815
  94. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +301 -1112
  95. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/output_report_test.rb +605 -350
  96. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +18 -14
  97. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +15 -15
  98. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +13 -3
  99. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +3 -3
  100. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +894 -596
  101. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +127 -76
  102. data/example_files/resources/hpxml-measures/tasks.rb +185 -2802
  103. data/example_files/resources/hpxml-measures/workflow/hpxml_inputs.json +3401 -0
  104. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +0 -1
  105. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +0 -1
  106. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +0 -1
  107. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +0 -1
  108. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +0 -1
  109. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +1 -3
  110. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +0 -1
  111. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +1 -3
  112. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +0 -1
  113. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +1 -3
  114. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +0 -1
  115. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +0 -1
  116. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +0 -1
  117. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +0 -1
  118. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +0 -1
  119. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +3 -4
  120. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +17 -4
  121. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +2 -3
  122. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +3 -4
  123. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +3 -4
  124. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +4 -5
  125. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +3 -4
  126. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +3 -4
  127. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +3 -4
  128. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +3 -4
  129. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +1 -1
  130. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +1 -1
  131. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +1 -1
  132. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +1 -1
  133. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +0 -1
  134. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +4 -5
  135. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +3 -3
  136. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +3 -3
  137. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +3 -4
  138. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +3 -3
  139. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +3 -4
  140. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +3 -3
  141. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +3 -4
  142. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +3 -3
  143. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +3 -4
  144. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +0 -1
  145. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +0 -1
  146. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +0 -1
  147. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +0 -1
  148. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +0 -1
  149. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +1 -0
  150. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +1 -0
  151. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +12 -8
  152. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +10 -40
  153. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +10 -40
  154. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +10 -40
  155. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +10 -40
  156. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +10 -40
  157. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +10 -40
  158. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +10 -40
  159. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +10 -40
  160. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +10 -40
  161. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +10 -40
  162. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +10 -40
  163. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +10 -40
  164. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +10 -40
  165. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +10 -40
  166. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +9 -39
  167. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +9 -39
  168. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +10 -40
  169. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +10 -40
  170. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +10 -40
  171. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +10 -40
  172. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +10 -40
  173. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-single-family-attached-2stories.xml → base-bldgtype-attached-2stories.xml} +610 -639
  174. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-single-family-attached-atticroof-cathedral.xml → base-bldgtype-attached-atticroof-cathedral.xml} +558 -587
  175. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-attached-infil-compartmentalization-test.xml +611 -0
  176. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-single-family-attached.xml → base-bldgtype-attached.xml} +610 -639
  177. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +10 -39
  178. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +10 -39
  179. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +10 -39
  180. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +10 -39
  181. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +10 -39
  182. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-infil-compartmentalization-test.xml +462 -0
  183. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-calctype-operational.xml → base-bldgtype-multifamily-residents-1.xml} +453 -480
  184. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +10 -39
  185. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +10 -39
  186. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +10 -39
  187. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +10 -39
  188. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +10 -39
  189. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +10 -39
  190. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +10 -39
  191. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +10 -39
  192. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +10 -39
  193. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +10 -39
  194. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +10 -39
  195. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +10 -39
  196. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +10 -39
  197. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +10 -39
  198. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +10 -39
  199. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +11 -40
  200. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +10 -39
  201. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml +10 -39
  202. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +10 -39
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +10 -39
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +10 -39
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +10 -39
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +15 -40
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +10 -39
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +10 -39
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +10 -39
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +10 -40
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +10 -40
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +10 -40
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +10 -40
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +10 -40
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +10 -40
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +10 -40
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +10 -40
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +10 -40
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +10 -40
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +10 -40
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +10 -40
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +10 -40
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +10 -40
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +10 -40
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +10 -40
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +10 -40
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +10 -40
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +10 -40
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +10 -40
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +10 -40
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +10 -40
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +10 -40
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +10 -40
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +10 -40
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +10 -40
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +10 -40
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +10 -40
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +10 -40
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +10 -40
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +10 -40
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +10 -40
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +10 -40
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +10 -40
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +10 -40
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +10 -40
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +10 -40
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +10 -40
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +10 -40
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +10 -40
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +10 -40
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +11 -43
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +10 -40
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +10 -40
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +10 -40
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +10 -40
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +10 -40
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +10 -40
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +10 -40
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +10 -40
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +10 -40
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +10 -40
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +10 -40
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +10 -40
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +10 -40
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +10 -40
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +10 -40
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +10 -40
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +10 -40
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +10 -40
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +19 -25
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +10 -40
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +10 -40
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +10 -40
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +10 -40
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +10 -40
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +10 -40
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +10 -40
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +18 -24
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +11 -41
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +11 -41
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +10 -40
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ela.xml +549 -0
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +13 -43
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +10 -40
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-cfm.xml +552 -0
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +10 -40
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +10 -40
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +17 -47
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +10 -40
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +10 -40
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +10 -40
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +10 -40
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +10 -40
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +10 -40
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +10 -40
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +10 -40
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +10 -40
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +10 -40
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading-seasons.xml +559 -0
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +10 -40
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +10 -40
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +10 -40
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +19 -25
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +10 -40
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +10 -40
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-insulation.xml +10 -40
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +10 -40
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +10 -40
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +10 -40
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +10 -40
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +10 -40
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +10 -40
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +10 -40
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +10 -40
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +10 -40
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +10 -40
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-autosized-backup.xml +557 -0
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +16 -41
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml → base-hvac-air-to-air-heat-pump-1-speed-heating-capacity-17f.xml} +552 -583
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +16 -41
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-air-to-air-heat-pump-1-speed-backup-lockout-temperature.xml → base-hvac-air-to-air-heat-pump-1-speed-lockout-temperatures.xml} +562 -586
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +16 -41
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +16 -41
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +16 -41
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-hvac-seasons.xml +587 -0
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +17 -42
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +16 -41
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +16 -41
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +16 -41
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +10 -40
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +10 -40
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +10 -40
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +10 -40
  334. 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 +10 -40
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +10 -40
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +10 -40
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +10 -40
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +10 -40
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +10 -40
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +10 -40
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml +10 -40
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml +10 -40
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +10 -40
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +10 -40
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +10 -40
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +10 -40
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +10 -40
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +10 -40
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +10 -40
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +10 -40
  351. 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 +11 -41
  352. 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 +11 -41
  353. 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 +11 -41
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted-backup-hardsized.xml +553 -0
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +11 -41
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +10 -40
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +10 -40
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +10 -40
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +10 -40
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +10 -40
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +10 -40
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +10 -40
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +10 -40
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +10 -40
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +10 -40
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +10 -40
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +10 -40
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +10 -40
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +10 -40
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +10 -40
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +10 -40
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +10 -40
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +10 -40
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml +10 -40
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-baseboard.xml +519 -0
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +10 -40
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +10 -40
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +10 -40
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +16 -40
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +16 -40
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +16 -40
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +10 -40
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +10 -40
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +16 -40
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +16 -40
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +16 -40
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-sizing-controls.xml +566 -0
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +10 -40
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +10 -40
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +10 -40
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +10 -40
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +10 -40
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +10 -40
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only-pilot.xml +513 -0
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +10 -40
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +10 -40
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +10 -40
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +10 -40
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +10 -40
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +10 -40
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +10 -40
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +10 -40
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +16 -41
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-crankcase-heater-40w.xml +556 -0
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +10 -40
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-lockout-temperatures.xml +560 -0
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +17 -42
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +17 -42
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +17 -42
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +17 -42
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +10 -40
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +10 -40
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-buried.xml +555 -0
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-effective-rvalue.xml +553 -0
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +10 -40
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +10 -40
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +10 -40
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +10 -40
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +10 -40
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +10 -40
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +10 -40
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +10 -40
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only-pilot-light.xml +506 -0
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +10 -40
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +10 -40
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +10 -40
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +10 -40
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +10 -40
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +10 -40
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +10 -40
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-pilot.xml +542 -0
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +10 -40
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +10 -40
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +10 -40
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +10 -40
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +10 -40
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +10 -40
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +10 -40
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +10 -40
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +10 -40
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +14 -41
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +14 -41
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +14 -41
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +10 -40
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +10 -40
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +10 -40
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +10 -40
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +10 -40
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +10 -40
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +14 -41
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +10 -40
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +10 -40
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +16 -41
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +16 -41
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +16 -41
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-baseboard.xml +525 -0
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-furnace.xml +564 -0
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +16 -41
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-heating-capacity-17f.xml +506 -0
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +16 -41
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +10 -40
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +10 -40
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +10 -40
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +10 -40
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-natural-gas.xml +10 -40
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +10 -40
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp-heating-capacity-17f.xml +513 -0
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +16 -40
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +10 -40
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +10 -40
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +10 -40
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +10 -40
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +10 -40
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +16 -40
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +10 -40
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +10 -40
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +10 -40
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +10 -40
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +10 -40
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +10 -40
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +10 -40
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +10 -40
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +10 -40
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +11 -41
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +10 -40
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-kwh-per-year.xml +529 -0
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-mixed.xml +537 -0
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none-ceiling-fans.xml +516 -0
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +1 -7
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +10 -40
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +10 -40
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +10 -40
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +10 -40
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +10 -40
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +10 -40
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +10 -40
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +10 -40
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +10 -40
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +10 -40
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +10 -40
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +12 -42
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +10 -40
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +10 -40
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +10 -40
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +10 -40
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +10 -40
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +10 -40
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +10 -40
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +10 -40
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +10 -40
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +10 -40
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +10 -40
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +10 -40
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +14 -44
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +10 -40
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +10 -40
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +10 -38
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +10 -40
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +16 -42
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +16 -42
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +16 -42
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +10 -40
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +14 -37
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +16 -42
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +12 -42
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +12 -42
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +12 -42
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +10 -40
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +10 -38
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +10 -38
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +10 -40
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading-bldgtype-multifamily.xml +509 -0
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +10 -40
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +10 -40
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +10 -41
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +30 -138
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +16 -42
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +24 -26
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-round-trip-efficiency.xml +16 -42
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +16 -42
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +16 -42
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +18 -44
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +18 -44
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +18 -44
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +16 -42
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0-runperiod-1-month.xml +560 -0
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0.xml +556 -0
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational-misc-loads-large-uncommon.xml → base-residents-1-misc-loads-large-uncommon.xml} +616 -644
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational-misc-loads-large-uncommon2.xml → base-residents-1-misc-loads-large-uncommon2.xml} +616 -644
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational.xml → base-residents-1.xml} +547 -575
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational-misc-defaults.xml → base-residents-5.xml} +515 -539
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +10 -40
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +10 -40
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-power-outage.xml +565 -0
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-detailed-occupancy-smooth.xml → base-schedules-detailed-occupancy-stochastic-vacancy-year-round.xml} +563 -583
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +21 -41
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +10 -40
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +10 -40
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +10 -40
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +10 -40
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage-natvent-available.xml +565 -0
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage-natvent-unavailable.xml +565 -0
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage.xml +620 -0
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy-year-round.xml +619 -0
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy.xml +619 -0
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +10 -38
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +10 -40
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +10 -40
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +10 -40
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +10 -40
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-temperature-capacitance-multiplier.xml +10 -40
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +10 -40
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +10 -40
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +10 -40
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-30-mins.xml +10 -40
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +10 -37
  577. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +16 -4
  578. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy-subset.osw +16 -3
  579. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +16 -3
  580. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +16 -2
  581. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Long_Residence.xml +386 -0
  582. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Vatilo_Residence.xml +381 -0
  583. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Victor_Residence.xml +370 -0
  584. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +2 -2
  585. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +2 -5
  586. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +2 -5
  587. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +2 -5
  588. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +2 -5
  589. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +2 -5
  590. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +2 -5
  591. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +2 -5
  592. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +2 -5
  593. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +2 -5
  594. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +2 -5
  595. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +2 -5
  596. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +2 -5
  597. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +2 -5
  598. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +2 -5
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +2 -5
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +2 -12
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +2 -12
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +2 -5
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +2 -5
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +2 -5
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +2 -5
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +2 -5
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +2 -5
  608. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +6 -9
  609. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +6 -9
  610. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +475 -444
  611. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +475 -444
  612. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +177 -112
  613. data/example_files/resources/meta_measure.rb +2 -27
  614. data/example_files/xml_building/17/README.md +3 -3
  615. data/lib/uo_cli/version.rb +3 -38
  616. data/lib/uo_cli.rb +3 -38
  617. data/uo_cli.gemspec +6 -7
  618. metadata +70 -51
  619. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules_config.json +0 -388
  620. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLBaseElements.xsd +0 -6136
  621. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLDataTypes.xsd +0 -4846
  622. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-smooth.csv +0 -8761
  623. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-vacancy.csv +0 -8761
  624. data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3-cache.csv +0 -35
  625. data/example_files/resources/hpxml-measures/weather/USA_CO_Colorado.Springs-Peterson.Field.724660_TMY3-cache.csv +0 -35
  626. data/example_files/resources/hpxml-measures/weather/USA_CO_Denver.Intl.AP.725650_TMY3-cache.csv +0 -35
  627. data/example_files/resources/hpxml-measures/weather/USA_DE_Wilmington-New.Castle.County.AP.724089_TMY3-cache.csv +0 -35
  628. data/example_files/resources/hpxml-measures/weather/USA_FL_Miami.Intl.AP.722020_TMY3-cache.csv +0 -35
  629. data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3-cache.csv +0 -35
  630. data/example_files/resources/hpxml-measures/weather/USA_MD_Baltimore-Washington.Intl.AP.724060_TMY3-cache.csv +0 -35
  631. data/example_files/resources/hpxml-measures/weather/USA_MN_Duluth.Intl.AP.727450_TMY3-cache.csv +0 -35
  632. data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3-cache.csv +0 -35
  633. data/example_files/resources/hpxml-measures/weather/USA_NC_Charlotte-Douglas.Intl.AP.723140_TMY3-cache.csv +0 -35
  634. data/example_files/resources/hpxml-measures/weather/USA_NJ_Cape.May.County.AP.745966_TMY3-cache.csv +0 -35
  635. data/example_files/resources/hpxml-measures/weather/USA_NV_Las.Vegas-McCarran.Intl.AP.723860_TMY3-cache.csv +0 -35
  636. data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3-cache.csv +0 -35
  637. data/example_files/resources/hpxml-measures/weather/USA_TX_Dallas-Fort.Worth.Intl.AP.722590_TMY3-cache.csv +0 -35
  638. data/example_files/resources/hpxml-measures/weather/US_CO_Boulder_AMY_2012-cache.csv +0 -35
  639. data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC-cache.csv +0 -35
  640. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +0 -2508
  641. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +0 -2508
@@ -49,13 +49,13 @@ XMLHelper.write_file(hpxml.to_oga, "out.xml")
49
49
 
50
50
  class HPXML < Object
51
51
  HPXML_ATTRS = [:header, :site, :neighbor_buildings, :building_occupancy, :building_construction,
52
- :climate_and_risk_zones, :air_infiltration_measurements, :attics, :foundations,
53
- :roofs, :rim_joists, :walls, :foundation_walls, :floors, :slabs, :windows,
52
+ :climate_and_risk_zones, :air_infiltration, :air_infiltration_measurements, :attics,
53
+ :foundations, :roofs, :rim_joists, :walls, :foundation_walls, :floors, :slabs, :windows,
54
54
  :skylights, :doors, :partition_wall_mass, :furniture_mass, :heating_systems,
55
55
  :cooling_systems, :heat_pumps, :hvac_plant, :hvac_controls, :hvac_distributions,
56
56
  :ventilation_fans, :water_heating_systems, :hot_water_distributions, :water_fixtures,
57
- :water_heating, :solar_thermal_systems, :pv_systems, :generators, :batteries,
58
- :clothes_washers, :clothes_dryers, :dishwashers, :refrigerators,
57
+ :water_heating, :solar_thermal_systems, :pv_systems, :inverters, :generators,
58
+ :batteries, :clothes_washers, :clothes_dryers, :dishwashers, :refrigerators,
59
59
  :freezers, :dehumidifiers, :cooking_ranges, :ovens, :lighting_groups, :lighting,
60
60
  :ceiling_fans, :pools, :hot_tubs, :plug_loads, :fuel_loads]
61
61
  attr_reader(*HPXML_ATTRS, :doc, :errors, :warnings, :hpxml_path)
@@ -75,6 +75,7 @@ class HPXML < Object
75
75
  AtticTypeUnvented = 'UnventedAttic'
76
76
  AtticTypeVented = 'VentedAttic'
77
77
  AtticWallTypeGable = 'gable'
78
+ AtticWallTypeKneeWall = 'knee wall'
78
79
  BatteryTypeLithiumIon = 'Li-ion'
79
80
  BatteryLifetimeModelNone = 'None'
80
81
  BatteryLifetimeModelKandlerSmith = 'KandlerSmith'
@@ -92,6 +93,10 @@ class HPXML < Object
92
93
  ColorReflective = 'reflective'
93
94
  DehumidifierTypePortable = 'portable'
94
95
  DehumidifierTypeWholeHome = 'whole-home'
96
+ DuctBuriedInsulationNone = 'not buried'
97
+ DuctBuriedInsulationPartial = 'partially buried'
98
+ DuctBuriedInsulationFull = 'fully buried'
99
+ DuctBuriedInsulationDeep = 'deeply buried'
95
100
  DHWRecirControlTypeManual = 'manual demand control'
96
101
  DHWRecirControlTypeNone = 'no control'
97
102
  DHWRecirControlTypeSensor = 'presence sensor demand control'
@@ -199,6 +204,8 @@ class HPXML < Object
199
204
  InteriorFinishNone = 'none'
200
205
  InteriorFinishPlaster = 'plaster'
201
206
  InteriorFinishWood = 'wood'
207
+ InfiltrationTypeUnitTotal = 'unit total'
208
+ InfiltrationTypeUnitExterior = 'unit exterior only'
202
209
  LeakinessTight = 'tight'
203
210
  LeakinessAverage = 'average'
204
211
  LightingTypeCFL = 'CompactFluorescent'
@@ -236,8 +243,6 @@ class HPXML < Object
236
243
  MechVentTypeExhaust = 'exhaust only'
237
244
  MechVentTypeHRV = 'heat recovery ventilator'
238
245
  MechVentTypeSupply = 'supply only'
239
- OccupancyCalculationTypeAsset = 'asset'
240
- OccupancyCalculationTypeOperational = 'operational'
241
246
  OrientationEast = 'east'
242
247
  OrientationNorth = 'north'
243
248
  OrientationNortheast = 'northeast'
@@ -274,6 +279,9 @@ class HPXML < Object
274
279
  RoofTypePlasticRubber = 'plastic/rubber/synthetic sheeting'
275
280
  RoofTypeShingles = 'shingles'
276
281
  RoofTypeWoodShingles = 'wood shingles or shakes'
282
+ ScheduleRegular = 'regular schedule'
283
+ ScheduleAvailable = 'always available'
284
+ ScheduleUnavailable = 'always unavailable'
277
285
  ShieldingExposed = 'exposed'
278
286
  ShieldingNormal = 'normal'
279
287
  ShieldingWellShielded = 'well-shielded'
@@ -313,11 +321,13 @@ class HPXML < Object
313
321
  UnitsCFM = 'CFM'
314
322
  UnitsCFM25 = 'CFM25'
315
323
  UnitsCFM50 = 'CFM50'
324
+ UnitsCFMNatural = 'CFMnatural'
316
325
  UnitsCOP = 'COP'
317
326
  UnitsDegFPerHour = 'F/hr'
318
327
  UnitsDollars = '$'
319
328
  UnitsDollarsPerkW = '$/kW'
320
329
  UnitsEER = 'EER'
330
+ UnitsELA = 'EffectiveLeakageArea'
321
331
  UnitsCEER = 'CEER'
322
332
  UnitsHSPF = 'HSPF'
323
333
  UnitsHSPF2 = 'HSPF2'
@@ -349,7 +359,7 @@ class HPXML < Object
349
359
  WallTypeWoodStud = 'WoodStud'
350
360
  WaterFixtureTypeFaucet = 'faucet'
351
361
  WaterFixtureTypeShowerhead = 'shower head'
352
- WaterHeaterOperatingModeStandard = 'standard'
362
+ WaterHeaterOperatingModeHybridAuto = 'hybrid/auto'
353
363
  WaterHeaterOperatingModeHeatPumpOnly = 'heat pump only'
354
364
  WaterHeaterTankModelTypeMixed = 'mixed'
355
365
  WaterHeaterTankModelTypeStratified = 'stratified'
@@ -389,7 +399,7 @@ class HPXML < Object
389
399
  WindowClassResidential = 'residential'
390
400
  WindowClassLightCommercial = 'light commercial'
391
401
 
392
- def initialize(hpxml_path: nil, schema_path: nil, schematron_path: nil, collapse_enclosure: true, building_id: nil)
402
+ def initialize(hpxml_path: nil, schema_validator: nil, schematron_validator: nil, building_id: nil)
393
403
  @doc = nil
394
404
  @hpxml_path = hpxml_path
395
405
  @errors = []
@@ -399,8 +409,9 @@ class HPXML < Object
399
409
  if not hpxml_path.nil?
400
410
  @doc = XMLHelper.parse_file(hpxml_path)
401
411
 
402
- if not schema_path.nil?
403
- xsd_errors, xsd_warnings = XMLValidator.validate_against_schema(hpxml_path, schema_path)
412
+ # Validate against XSD schema
413
+ if not schema_validator.nil?
414
+ xsd_errors, xsd_warnings = XMLValidator.validate_against_schema(hpxml_path, schema_validator)
404
415
  @errors += xsd_errors
405
416
  @warnings += xsd_warnings
406
417
  return unless @errors.empty?
@@ -410,14 +421,10 @@ class HPXML < Object
410
421
  hpxml = XMLHelper.get_element(@doc, '/HPXML')
411
422
  Version.check_hpxml_version(XMLHelper.get_attribute_value(hpxml, 'schemaVersion'))
412
423
 
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
419
-
420
424
  # Handle multiple buildings
425
+ # Do this before schematron validation so that:
426
+ # 1. We don't give schematron warnings for Building elements that are not of interest.
427
+ # 2. The schematron validation occurs faster (as we're only validating one Building).
421
428
  if XMLHelper.get_elements(hpxml, 'Building').size > 1
422
429
  if building_id.nil?
423
430
  @errors << 'Multiple Building elements defined in HPXML file; Building ID argument must be provided.'
@@ -434,6 +441,18 @@ class HPXML < Object
434
441
  @errors << "Could not find Building element with ID '#{building_id}'."
435
442
  return unless @errors.empty?
436
443
  end
444
+
445
+ # Write new HPXML file with all other Building elements removed
446
+ hpxml_path = Tempfile.new(['hpxml', '.xml']).path.to_s
447
+ XMLHelper.write_file(hpxml, hpxml_path)
448
+ end
449
+
450
+ # Validate against Schematron
451
+ if not schematron_validator.nil?
452
+ sct_errors, sct_warnings = XMLValidator.validate_against_schematron(hpxml_path, schematron_validator, hpxml)
453
+ @errors += sct_errors
454
+ @warnings += sct_warnings
455
+ return unless @errors.empty?
437
456
  end
438
457
  end
439
458
 
@@ -443,13 +462,6 @@ class HPXML < Object
443
462
  # Check for additional errors (those hard to check via Schematron)
444
463
  @errors += check_for_errors()
445
464
  return unless @errors.empty?
446
-
447
- # Clean up
448
- delete_tiny_surfaces()
449
- delete_adiabatic_subsurfaces()
450
- if collapse_enclosure
451
- collapse_enclosure_surfaces()
452
- end
453
465
  end
454
466
 
455
467
  def hvac_systems
@@ -533,7 +545,7 @@ class HPXML < Object
533
545
 
534
546
  def fraction_of_windows_operable()
535
547
  # Calculates the fraction of windows that are operable.
536
- # Since we don't have quantity available, we use area as an approximation.
548
+ # Since we don't have count available, we use area as an approximation.
537
549
  window_area_total = @windows.map { |w| w.area }.sum(0.0)
538
550
  window_area_operable = @windows.map { |w| w.fraction_operable * w.area }.sum(0.0)
539
551
  if window_area_total <= 0
@@ -605,7 +617,7 @@ class HPXML < Object
605
617
  def compartmentalization_boundary_areas()
606
618
  # Returns the infiltration compartmentalization boundary areas
607
619
  total_area = 0.0 # Total surface area that bounds the Infiltration Volume
608
- exterior_area = 0.0 # Same as above excluding surfaces attached to garage or other housing units
620
+ exterior_area = 0.0 # Same as above excluding surfaces attached to garage, other housing units, or other multifamily spaces (see 301-2019 Addendum B)
609
621
 
610
622
  # Determine which spaces are within infiltration volume
611
623
  spaces_within_infil_volume = HPXML::conditioned_locations_this_unit
@@ -705,6 +717,7 @@ class HPXML < Object
705
717
  @building_construction.to_oga(@doc)
706
718
  @climate_and_risk_zones.to_oga(@doc)
707
719
  @air_infiltration_measurements.to_oga(@doc)
720
+ @air_infiltration.to_oga(@doc)
708
721
  @attics.to_oga(@doc)
709
722
  @foundations.to_oga(@doc)
710
723
  @roofs.to_oga(@doc)
@@ -731,6 +744,7 @@ class HPXML < Object
731
744
  @water_heating.to_oga(@doc)
732
745
  @solar_thermal_systems.to_oga(@doc)
733
746
  @pv_systems.to_oga(@doc)
747
+ @inverters.to_oga(@doc)
734
748
  @batteries.to_oga(@doc)
735
749
  @generators.to_oga(@doc)
736
750
  @clothes_washers.to_oga(@doc)
@@ -759,6 +773,7 @@ class HPXML < Object
759
773
  @building_construction = BuildingConstruction.new(self, hpxml)
760
774
  @climate_and_risk_zones = ClimateandRiskZones.new(self, hpxml)
761
775
  @air_infiltration_measurements = AirInfiltrationMeasurements.new(self, hpxml)
776
+ @air_infiltration = AirInfiltration.new(self, hpxml)
762
777
  @attics = Attics.new(self, hpxml)
763
778
  @foundations = Foundations.new(self, hpxml)
764
779
  @roofs = Roofs.new(self, hpxml)
@@ -785,6 +800,7 @@ class HPXML < Object
785
800
  @water_heating = WaterHeating.new(self, hpxml)
786
801
  @solar_thermal_systems = SolarThermalSystems.new(self, hpxml)
787
802
  @pv_systems = PVSystems.new(self, hpxml)
803
+ @inverters = Inverters.new(self, hpxml)
788
804
  @batteries = Batteries.new(self, hpxml)
789
805
  @generators = Generators.new(self, hpxml)
790
806
  @clothes_washers = ClothesWashers.new(self, hpxml)
@@ -919,22 +935,26 @@ class HPXML < Object
919
935
  def initialize(hpxml_object, *args)
920
936
  @emissions_scenarios = EmissionsScenarios.new(hpxml_object)
921
937
  @utility_bill_scenarios = UtilityBillScenarios.new(hpxml_object)
938
+ @unavailable_periods = UnavailablePeriods.new(hpxml_object)
922
939
  super(hpxml_object, *args)
923
940
  end
924
941
  ATTRS = [:xml_type, :xml_generated_by, :created_date_and_time, :transaction,
925
942
  :software_program_used, :software_program_version, :eri_calculation_version,
926
- :timestep, :building_id, :event_type, :state_code, :zip_code,
943
+ :co2index_calculation_version, :timestep, :building_id, :event_type, :state_code, :zip_code,
927
944
  :egrid_region, :egrid_subregion, :cambium_region_gea, :time_zone_utc_offset,
928
945
  :sim_begin_month, :sim_begin_day, :sim_end_month, :sim_end_day, :sim_calendar_year,
929
946
  :dst_enabled, :dst_begin_month, :dst_begin_day, :dst_end_month, :dst_end_day,
930
- :heat_pump_sizing_methodology, :allow_increased_fixed_capacities,
931
- :apply_ashrae140_assumptions, :energystar_calculation_version, :schedules_filepaths,
932
- :occupancy_calculation_type, :extension_properties, :iecc_eri_calculation_version,
933
- :zerh_calculation_version, :temperature_capacitance_multiplier,
934
- :natvent_days_per_week]
947
+ :heat_pump_sizing_methodology, :allow_increased_fixed_capacities, :apply_ashrae140_assumptions,
948
+ :energystar_calculation_version, :schedules_filepaths, :extension_properties, :iecc_eri_calculation_version,
949
+ :zerh_calculation_version, :temperature_capacitance_multiplier, :natvent_days_per_week,
950
+ :shading_summer_begin_month, :shading_summer_begin_day, :shading_summer_end_month,
951
+ :shading_summer_end_day, :manualj_heating_design_temp, :manualj_cooling_design_temp,
952
+ :manualj_heating_setpoint, :manualj_cooling_setpoint, :manualj_humidity_setpoint,
953
+ :manualj_internal_loads_sensible, :manualj_internal_loads_latent, :manualj_num_occupants]
935
954
  attr_accessor(*ATTRS)
936
955
  attr_reader(:emissions_scenarios)
937
956
  attr_reader(:utility_bill_scenarios)
957
+ attr_reader(:unavailable_periods)
938
958
 
939
959
  def check_for_errors
940
960
  errors = []
@@ -954,8 +974,10 @@ class HPXML < Object
954
974
  end
955
975
 
956
976
  errors += HPXML::check_dates('Daylight Saving', @dst_begin_month, @dst_begin_day, @dst_end_month, @dst_end_day)
977
+ errors += HPXML::check_dates('Shading Summer Season', @shading_summer_begin_month, @shading_summer_begin_day, @shading_summer_end_month, @shading_summer_end_day)
957
978
  errors += @emissions_scenarios.check_for_errors
958
979
  errors += @utility_bill_scenarios.check_for_errors
980
+ errors += @unavailable_periods.check_for_errors
959
981
 
960
982
  return errors
961
983
  end
@@ -977,12 +999,12 @@ class HPXML < Object
977
999
  software_info = XMLHelper.add_element(hpxml, 'SoftwareInfo')
978
1000
  XMLHelper.add_element(software_info, 'SoftwareProgramUsed', @software_program_used, :string) unless @software_program_used.nil?
979
1001
  XMLHelper.add_element(software_info, 'SoftwareProgramVersion', @software_program_version, :string) unless @software_program_version.nil?
980
- XMLHelper.add_extension(software_info, 'OccupancyCalculationType', @occupancy_calculation_type, :string, @occupancy_calculation_type_isdefaulted) unless @occupancy_calculation_type.nil?
981
1002
  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|
1003
+ { 'ERICalculation' => @eri_calculation_version,
1004
+ 'CO2IndexCalculation' => @co2index_calculation_version,
1005
+ 'EnergyStarCalculation' => @energystar_calculation_version,
1006
+ 'IECCERICalculation' => @iecc_eri_calculation_version,
1007
+ 'ZERHCalculation' => @zerh_calculation_version }.each do |element_name, calculation_version|
986
1008
  next if calculation_version.nil?
987
1009
 
988
1010
  extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
@@ -1005,6 +1027,17 @@ class HPXML < Object
1005
1027
  XMLHelper.add_element(hvac_sizing_control, 'HeatPumpSizingMethodology', @heat_pump_sizing_methodology, :string, @heat_pump_sizing_methodology_isdefaulted) unless @heat_pump_sizing_methodology.nil?
1006
1028
  XMLHelper.add_element(hvac_sizing_control, 'AllowIncreasedFixedCapacities', @allow_increased_fixed_capacities, :boolean, @allow_increased_fixed_capacities_isdefaulted) unless @allow_increased_fixed_capacities.nil?
1007
1029
  end
1030
+ if (not @manualj_heating_design_temp.nil?) || (not @manualj_cooling_design_temp.nil?) || (not @manualj_heating_setpoint.nil?) || (not @manualj_cooling_setpoint.nil?) || (not @manualj_humidity_setpoint.nil?) || (not @manualj_internal_loads_sensible.nil?) || (not @manualj_internal_loads_latent.nil?) || (not @manualj_num_occupants.nil?)
1031
+ manualj_sizing_inputs = XMLHelper.create_elements_as_needed(software_info, ['extension', 'HVACSizingControl', 'ManualJInputs'])
1032
+ XMLHelper.add_element(manualj_sizing_inputs, 'HeatingDesignTemperature', @manualj_heating_design_temp, :float, @manualj_heating_design_temp_isdefaulted) unless @manualj_heating_design_temp.nil?
1033
+ XMLHelper.add_element(manualj_sizing_inputs, 'CoolingDesignTemperature', @manualj_cooling_design_temp, :float, @manualj_cooling_design_temp_isdefaulted) unless @manualj_cooling_design_temp.nil?
1034
+ XMLHelper.add_element(manualj_sizing_inputs, 'HeatingSetpoint', @manualj_heating_setpoint, :float, @manualj_heating_setpoint_isdefaulted) unless @manualj_heating_setpoint.nil?
1035
+ XMLHelper.add_element(manualj_sizing_inputs, 'CoolingSetpoint', @manualj_cooling_setpoint, :float, @manualj_cooling_setpoint_isdefaulted) unless @manualj_cooling_setpoint.nil?
1036
+ XMLHelper.add_element(manualj_sizing_inputs, 'HumiditySetpoint', @manualj_humidity_setpoint, :float, @manualj_humidity_setpoint_isdefaulted) unless @manualj_humidity_setpoint.nil?
1037
+ XMLHelper.add_element(manualj_sizing_inputs, 'InternalLoadsSensible', @manualj_internal_loads_sensible, :float, @manualj_internal_loads_sensible_isdefaulted) unless @manualj_internal_loads_sensible.nil?
1038
+ XMLHelper.add_element(manualj_sizing_inputs, 'InternalLoadsLatent', @manualj_internal_loads_latent, :float, @manualj_internal_loads_latent_isdefaulted) unless @manualj_internal_loads_latent.nil?
1039
+ XMLHelper.add_element(manualj_sizing_inputs, 'NumberofOccupants', @manualj_num_occupants, :integer, @manualj_num_occupants_isdefaulted) unless @manualj_num_occupants.nil?
1040
+ end
1008
1041
  XMLHelper.add_extension(software_info, 'NaturalVentilationAvailabilityDaysperWeek', @natvent_days_per_week, :integer, @natvent_days_per_week_isdefaulted) unless @natvent_days_per_week.nil?
1009
1042
  if (not @schedules_filepaths.nil?) && (not @schedules_filepaths.empty?)
1010
1043
  extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
@@ -1012,6 +1045,13 @@ class HPXML < Object
1012
1045
  XMLHelper.add_element(extension, 'SchedulesFilePath', schedules_filepath, :string)
1013
1046
  end
1014
1047
  end
1048
+ if (not @shading_summer_begin_month.nil?) || (not @shading_summer_begin_day.nil?) || (not @shading_summer_end_month.nil?) || (not @shading_summer_end_day.nil?)
1049
+ window_shading_season = XMLHelper.create_elements_as_needed(software_info, ['extension', 'ShadingControl'])
1050
+ XMLHelper.add_element(window_shading_season, 'SummerBeginMonth', @shading_summer_begin_month, :integer, @shading_summer_begin_month_isdefaulted) unless @shading_summer_begin_month.nil?
1051
+ XMLHelper.add_element(window_shading_season, 'SummerBeginDayOfMonth', @shading_summer_begin_day, :integer, @shading_summer_begin_day_isdefaulted) unless @shading_summer_begin_day.nil?
1052
+ XMLHelper.add_element(window_shading_season, 'SummerEndMonth', @shading_summer_end_month, :integer, @shading_summer_end_month_isdefaulted) unless @shading_summer_end_month.nil?
1053
+ XMLHelper.add_element(window_shading_season, 'SummerEndDayOfMonth', @shading_summer_end_day, :integer, @shading_summer_end_day_isdefaulted) unless @shading_summer_end_day.nil?
1054
+ end
1015
1055
  if (not @extension_properties.nil?) && (not @extension_properties.empty?)
1016
1056
  properties = XMLHelper.create_elements_as_needed(software_info, ['extension', 'AdditionalProperties'])
1017
1057
  @extension_properties.each do |key, value|
@@ -1020,6 +1060,7 @@ class HPXML < Object
1020
1060
  end
1021
1061
  @emissions_scenarios.to_oga(software_info)
1022
1062
  @utility_bill_scenarios.to_oga(software_info)
1063
+ @unavailable_periods.to_oga(software_info)
1023
1064
 
1024
1065
  building = XMLHelper.add_element(hpxml, 'Building')
1025
1066
  building_building_id = XMLHelper.add_element(building, 'BuildingID')
@@ -1066,6 +1107,7 @@ class HPXML < Object
1066
1107
  @software_program_used = XMLHelper.get_value(hpxml, 'SoftwareInfo/SoftwareProgramUsed', :string)
1067
1108
  @software_program_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/SoftwareProgramVersion', :string)
1068
1109
  @eri_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ERICalculation/Version', :string)
1110
+ @co2index_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/CO2IndexCalculation/Version', :string)
1069
1111
  @iecc_eri_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/IECCERICalculation/Version', :string)
1070
1112
  @energystar_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/EnergyStarCalculation/Version', :string)
1071
1113
  @zerh_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ZERHCalculation/Version', :string)
@@ -1076,11 +1118,22 @@ class HPXML < Object
1076
1118
  @sim_end_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndDayOfMonth', :integer)
1077
1119
  @sim_calendar_year = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/CalendarYear', :integer)
1078
1120
  @temperature_capacitance_multiplier = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/TemperatureCapacitanceMultiplier', :float)
1079
- @occupancy_calculation_type = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/OccupancyCalculationType', :string)
1080
1121
  @natvent_days_per_week = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/NaturalVentilationAvailabilityDaysperWeek', :integer)
1122
+ @shading_summer_begin_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ShadingControl/SummerBeginMonth', :integer)
1123
+ @shading_summer_begin_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ShadingControl/SummerBeginDayOfMonth', :integer)
1124
+ @shading_summer_end_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ShadingControl/SummerEndMonth', :integer)
1125
+ @shading_summer_end_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ShadingControl/SummerEndDayOfMonth', :integer)
1081
1126
  @apply_ashrae140_assumptions = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ApplyASHRAE140Assumptions', :boolean)
1082
1127
  @heat_pump_sizing_methodology = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/HeatPumpSizingMethodology', :string)
1083
1128
  @allow_increased_fixed_capacities = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/AllowIncreasedFixedCapacities', :boolean)
1129
+ @manualj_heating_design_temp = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/ManualJInputs/HeatingDesignTemperature', :float)
1130
+ @manualj_cooling_design_temp = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/ManualJInputs/CoolingDesignTemperature', :float)
1131
+ @manualj_heating_setpoint = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/ManualJInputs/HeatingSetpoint', :float)
1132
+ @manualj_cooling_setpoint = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/ManualJInputs/CoolingSetpoint', :float)
1133
+ @manualj_humidity_setpoint = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/ManualJInputs/HumiditySetpoint', :float)
1134
+ @manualj_internal_loads_sensible = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/ManualJInputs/InternalLoadsSensible', :float)
1135
+ @manualj_internal_loads_latent = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/ManualJInputs/InternalLoadsLatent', :float)
1136
+ @manualj_num_occupants = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/ManualJInputs/NumberofOccupants', :integer)
1084
1137
  @schedules_filepaths = XMLHelper.get_values(hpxml, 'SoftwareInfo/extension/SchedulesFilePath', :string)
1085
1138
  @extension_properties = {}
1086
1139
  XMLHelper.get_elements(hpxml, 'SoftwareInfo/extension/AdditionalProperties').each do |property|
@@ -1093,6 +1146,7 @@ class HPXML < Object
1093
1146
  end
1094
1147
  @emissions_scenarios.from_oga(XMLHelper.get_element(hpxml, 'SoftwareInfo'))
1095
1148
  @utility_bill_scenarios.from_oga(XMLHelper.get_element(hpxml, 'SoftwareInfo'))
1149
+ @unavailable_periods.from_oga(XMLHelper.get_element(hpxml, 'SoftwareInfo'))
1096
1150
  @building_id = HPXML::get_id(hpxml, 'Building/BuildingID')
1097
1151
  @event_type = XMLHelper.get_value(hpxml, 'Building/ProjectStatus/EventType', :string)
1098
1152
  @state_code = XMLHelper.get_value(hpxml, 'Building/Site/Address/StateCode', :string)
@@ -1329,6 +1383,61 @@ class HPXML < Object
1329
1383
  end
1330
1384
  end
1331
1385
 
1386
+ class UnavailablePeriods < BaseArrayElement
1387
+ def add(**kwargs)
1388
+ self << UnavailablePeriod.new(@hpxml_object, **kwargs)
1389
+ end
1390
+
1391
+ def from_oga(software_info)
1392
+ return if software_info.nil?
1393
+
1394
+ XMLHelper.get_elements(software_info, 'extension/UnavailablePeriods/UnavailablePeriod').each do |unavailable_period|
1395
+ self << UnavailablePeriod.new(@hpxml_object, unavailable_period)
1396
+ end
1397
+ end
1398
+ end
1399
+
1400
+ class UnavailablePeriod < BaseElement
1401
+ ATTRS = [:column_name, :begin_month, :begin_day, :begin_hour, :end_month, :end_day, :end_hour, :natvent_availability]
1402
+ attr_accessor(*ATTRS)
1403
+
1404
+ def delete
1405
+ @hpxml_object.header.unavailable_periods.delete(self)
1406
+ end
1407
+
1408
+ def check_for_errors
1409
+ errors = []
1410
+ errors += HPXML::check_dates('Unavailable Period', @begin_month, @begin_day, @end_month, @end_day)
1411
+ return errors
1412
+ end
1413
+
1414
+ def to_oga(software_info)
1415
+ unavailable_periods = XMLHelper.create_elements_as_needed(software_info, ['extension', 'UnavailablePeriods'])
1416
+ unavailable_period = XMLHelper.add_element(unavailable_periods, 'UnavailablePeriod')
1417
+ XMLHelper.add_element(unavailable_period, 'ColumnName', @column_name, :string) unless @column_name.nil?
1418
+ XMLHelper.add_element(unavailable_period, 'BeginMonth', @begin_month, :integer, @begin_month_isdefaulted) unless @begin_month.nil?
1419
+ XMLHelper.add_element(unavailable_period, 'BeginDayOfMonth', @begin_day, :integer, @begin_day_isdefaulted) unless @begin_day.nil?
1420
+ XMLHelper.add_element(unavailable_period, 'BeginHourOfDay', @begin_hour, :integer, @begin_hour_isdefaulted) unless @begin_hour.nil?
1421
+ XMLHelper.add_element(unavailable_period, 'EndMonth', @end_month, :integer, @end_month_isdefaulted) unless @end_month.nil?
1422
+ XMLHelper.add_element(unavailable_period, 'EndDayOfMonth', @end_day, :integer, @end_day_isdefaulted) unless @end_day.nil?
1423
+ XMLHelper.add_element(unavailable_period, 'EndHourOfDay', @end_hour, :integer, @end_hour_isdefaulted) unless @end_hour.nil?
1424
+ XMLHelper.add_element(unavailable_period, 'NaturalVentilation', @natvent_availability, :string, @natvent_availability_isdefaulted) unless @natvent_availability.nil?
1425
+ end
1426
+
1427
+ def from_oga(unavailable_period)
1428
+ return if unavailable_period.nil?
1429
+
1430
+ @column_name = XMLHelper.get_value(unavailable_period, 'ColumnName', :string)
1431
+ @begin_month = XMLHelper.get_value(unavailable_period, 'BeginMonth', :integer)
1432
+ @begin_day = XMLHelper.get_value(unavailable_period, 'BeginDayOfMonth', :integer)
1433
+ @begin_hour = XMLHelper.get_value(unavailable_period, 'BeginHourOfDay', :integer)
1434
+ @end_month = XMLHelper.get_value(unavailable_period, 'EndMonth', :integer)
1435
+ @end_day = XMLHelper.get_value(unavailable_period, 'EndDayOfMonth', :integer)
1436
+ @end_hour = XMLHelper.get_value(unavailable_period, 'EndHourOfDay', :integer)
1437
+ @natvent_availability = XMLHelper.get_value(unavailable_period, 'NaturalVentilation', :string)
1438
+ end
1439
+ end
1440
+
1332
1441
  class Site < BaseElement
1333
1442
  ATTRS = [:site_type, :surroundings, :vertical_surroundings, :shielding_of_home, :orientation_of_front_of_home, :azimuth_of_front_of_home, :fuels,
1334
1443
  :ground_conductivity]
@@ -1460,7 +1569,7 @@ class HPXML < Object
1460
1569
  ATTRS = [:year_built, :number_of_conditioned_floors, :number_of_conditioned_floors_above_grade,
1461
1570
  :average_ceiling_height, :number_of_bedrooms, :number_of_bathrooms,
1462
1571
  :conditioned_floor_area, :conditioned_building_volume, :residential_facility_type,
1463
- :building_footprint_area, :has_flue_or_chimney]
1572
+ :building_footprint_area]
1464
1573
  attr_accessor(*ATTRS)
1465
1574
 
1466
1575
  def check_for_errors
@@ -1482,7 +1591,6 @@ class HPXML < Object
1482
1591
  XMLHelper.add_element(building_construction, 'BuildingFootprintArea', @building_footprint_area, :float, @building_footprint_area_isdefaulted) unless @building_footprint_area.nil?
1483
1592
  XMLHelper.add_element(building_construction, 'ConditionedFloorArea', @conditioned_floor_area, :float) unless @conditioned_floor_area.nil?
1484
1593
  XMLHelper.add_element(building_construction, 'ConditionedBuildingVolume', @conditioned_building_volume, :float, @conditioned_building_volume_isdefaulted) unless @conditioned_building_volume.nil?
1485
- XMLHelper.add_extension(building_construction, 'HasFlueOrChimney', @has_flue_or_chimney, :boolean, @has_flue_or_chimney_isdefaulted) unless @has_flue_or_chimney.nil?
1486
1594
  end
1487
1595
 
1488
1596
  def from_oga(hpxml)
@@ -1501,7 +1609,6 @@ class HPXML < Object
1501
1609
  @building_footprint_area = XMLHelper.get_value(building_construction, 'BuildingFootprintArea', :float)
1502
1610
  @conditioned_floor_area = XMLHelper.get_value(building_construction, 'ConditionedFloorArea', :float)
1503
1611
  @conditioned_building_volume = XMLHelper.get_value(building_construction, 'ConditionedBuildingVolume', :float)
1504
- @has_flue_or_chimney = XMLHelper.get_value(building_construction, 'extension/HasFlueOrChimney', :boolean)
1505
1612
  end
1506
1613
  end
1507
1614
 
@@ -1596,6 +1703,32 @@ class HPXML < Object
1596
1703
  end
1597
1704
  end
1598
1705
 
1706
+ class AirInfiltration < BaseElement
1707
+ ATTRS = [:has_flue_or_chimney_in_conditioned_space]
1708
+ attr_accessor(*ATTRS)
1709
+
1710
+ def check_for_errors
1711
+ errors = []
1712
+ return errors
1713
+ end
1714
+
1715
+ def to_oga(doc)
1716
+ return if nil?
1717
+
1718
+ air_infiltration = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Enclosure', 'AirInfiltration'])
1719
+ XMLHelper.add_extension(air_infiltration, 'HasFlueOrChimneyInConditionedSpace', @has_flue_or_chimney_in_conditioned_space, :boolean, @has_flue_or_chimney_in_conditioned_space_isdefaulted) unless @has_flue_or_chimney_in_conditioned_space.nil?
1720
+ end
1721
+
1722
+ def from_oga(hpxml)
1723
+ return if hpxml.nil?
1724
+
1725
+ air_infiltration = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Enclosure/AirInfiltration')
1726
+ return if air_infiltration.nil?
1727
+
1728
+ @has_flue_or_chimney_in_conditioned_space = XMLHelper.get_value(air_infiltration, 'extension/HasFlueOrChimneyInConditionedSpace', :boolean)
1729
+ end
1730
+ end
1731
+
1599
1732
  class AirInfiltrationMeasurements < BaseArrayElement
1600
1733
  def add(**kwargs)
1601
1734
  self << AirInfiltrationMeasurement.new(@hpxml_object, **kwargs)
@@ -1611,8 +1744,8 @@ class HPXML < Object
1611
1744
  end
1612
1745
 
1613
1746
  class AirInfiltrationMeasurement < BaseElement
1614
- ATTRS = [:id, :house_pressure, :unit_of_measure, :air_leakage, :effective_leakage_area, :type,
1615
- :infiltration_volume, :leakiness_description, :infiltration_height, :a_ext]
1747
+ ATTRS = [:id, :house_pressure, :unit_of_measure, :air_leakage, :effective_leakage_area, :type_of_measurement,
1748
+ :infiltration_volume, :leakiness_description, :infiltration_height, :a_ext, :infiltration_type]
1616
1749
  attr_accessor(*ATTRS)
1617
1750
 
1618
1751
  def check_for_errors
@@ -1627,7 +1760,8 @@ class HPXML < Object
1627
1760
  air_infiltration_measurement = XMLHelper.add_element(air_infiltration, 'AirInfiltrationMeasurement')
1628
1761
  sys_id = XMLHelper.add_element(air_infiltration_measurement, 'SystemIdentifier')
1629
1762
  XMLHelper.add_attribute(sys_id, 'id', @id)
1630
- XMLHelper.add_element(air_infiltration_measurement, 'TypeOfInfiltrationMeasurement', @type, :string) unless @type.nil?
1763
+ XMLHelper.add_element(air_infiltration_measurement, 'TypeOfInfiltrationMeasurement', @type_of_measurement, :string) unless @type_of_measurement.nil?
1764
+ XMLHelper.add_element(air_infiltration_measurement, 'TypeOfInfiltrationLeakage', @infiltration_type, :string) unless @infiltration_type.nil?
1631
1765
  XMLHelper.add_element(air_infiltration_measurement, 'HousePressure', @house_pressure, :float) unless @house_pressure.nil?
1632
1766
  XMLHelper.add_element(air_infiltration_measurement, 'LeakinessDescription', @leakiness_description, :string) unless @leakiness_description.nil?
1633
1767
  if (not @unit_of_measure.nil?) && (not @air_leakage.nil?)
@@ -1638,14 +1772,15 @@ class HPXML < Object
1638
1772
  XMLHelper.add_element(air_infiltration_measurement, 'EffectiveLeakageArea', @effective_leakage_area, :float) unless @effective_leakage_area.nil?
1639
1773
  XMLHelper.add_element(air_infiltration_measurement, 'InfiltrationVolume', @infiltration_volume, :float, @infiltration_volume_isdefaulted) unless @infiltration_volume.nil?
1640
1774
  XMLHelper.add_element(air_infiltration_measurement, 'InfiltrationHeight', @infiltration_height, :float, @infiltration_height_isdefaulted) unless @infiltration_height.nil?
1641
- XMLHelper.add_extension(air_infiltration_measurement, 'Aext', @a_ext, :float) unless @a_ext.nil?
1775
+ XMLHelper.add_extension(air_infiltration_measurement, 'Aext', @a_ext, :float, @a_ext_isdefaulted) unless @a_ext.nil?
1642
1776
  end
1643
1777
 
1644
1778
  def from_oga(air_infiltration_measurement)
1645
1779
  return if air_infiltration_measurement.nil?
1646
1780
 
1647
1781
  @id = HPXML::get_id(air_infiltration_measurement)
1648
- @type = XMLHelper.get_value(air_infiltration_measurement, 'TypeOfInfiltrationMeasurement', :string)
1782
+ @type_of_measurement = XMLHelper.get_value(air_infiltration_measurement, 'TypeOfInfiltrationMeasurement', :string)
1783
+ @infiltration_type = XMLHelper.get_value(air_infiltration_measurement, 'TypeOfInfiltrationLeakage', :string)
1649
1784
  @house_pressure = XMLHelper.get_value(air_infiltration_measurement, 'HousePressure', :float)
1650
1785
  @leakiness_description = XMLHelper.get_value(air_infiltration_measurement, 'LeakinessDescription', :string)
1651
1786
  @unit_of_measure = XMLHelper.get_value(air_infiltration_measurement, 'BuildingAirLeakage/UnitofMeasure', :string)
@@ -2090,8 +2225,9 @@ class HPXML < Object
2090
2225
  ATTRS = [:id, :interior_adjacent_to, :area, :azimuth, :orientation, :roof_type,
2091
2226
  :roof_color, :solar_absorptance, :emittance, :pitch, :radiant_barrier,
2092
2227
  :insulation_id, :insulation_assembly_r_value, :insulation_cavity_r_value,
2093
- :insulation_continuous_r_value, :radiant_barrier_grade,
2094
- :interior_finish_type, :interior_finish_thickness]
2228
+ :insulation_continuous_r_value, :radiant_barrier_grade, :insulation_grade,
2229
+ :interior_finish_type, :interior_finish_thickness, :framing_factor,
2230
+ :framing_size, :framing_spacing]
2095
2231
  attr_accessor(*ATTRS)
2096
2232
 
2097
2233
  def skylights
@@ -2171,6 +2307,12 @@ class HPXML < Object
2171
2307
  XMLHelper.add_element(interior_finish, 'Type', @interior_finish_type, :string, @interior_finish_type_isdefaulted) unless @interior_finish_type.nil?
2172
2308
  XMLHelper.add_element(interior_finish, 'Thickness', @interior_finish_thickness, :float, @interior_finish_thickness_isdefaulted) unless @interior_finish_thickness.nil?
2173
2309
  end
2310
+ if (not @framing_factor.nil?) || (not @framing_size.nil?) || (not @framing_spacing.nil?)
2311
+ rafters = XMLHelper.add_element(roof, 'Rafters')
2312
+ XMLHelper.add_element(rafters, 'Size', @framing_size, :string) unless @framing_size.nil?
2313
+ XMLHelper.add_element(rafters, 'Spacing', @framing_spacing, :float) unless @framing_spacing.nil?
2314
+ XMLHelper.add_element(rafters, 'FramingFactor', @framing_factor, :float) unless @framing_factor.nil?
2315
+ end
2174
2316
  XMLHelper.add_element(roof, 'Pitch', @pitch, :float) unless @pitch.nil?
2175
2317
  XMLHelper.add_element(roof, 'RadiantBarrier', @radiant_barrier, :boolean, @radiant_barrier_isdefaulted) unless @radiant_barrier.nil?
2176
2318
  XMLHelper.add_element(roof, 'RadiantBarrierGrade', @radiant_barrier_grade, :integer, @radiant_barrier_grade_isdefaulted) unless @radiant_barrier_grade.nil?
@@ -2181,6 +2323,7 @@ class HPXML < Object
2181
2323
  else
2182
2324
  XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation')
2183
2325
  end
2326
+ XMLHelper.add_element(insulation, 'InsulationGrade', @insulation_grade, :integer) unless @insulation_grade.nil?
2184
2327
  XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', @insulation_assembly_r_value, :float) unless @insulation_assembly_r_value.nil?
2185
2328
  if not @insulation_cavity_r_value.nil?
2186
2329
  layer = XMLHelper.add_element(insulation, 'Layer')
@@ -2211,12 +2354,16 @@ class HPXML < Object
2211
2354
  @interior_finish_type = XMLHelper.get_value(interior_finish, 'Type', :string)
2212
2355
  @interior_finish_thickness = XMLHelper.get_value(interior_finish, 'Thickness', :float)
2213
2356
  end
2357
+ @framing_factor = XMLHelper.get_value(roof, 'Rafters/FramingFactor', :float)
2358
+ @framing_size = XMLHelper.get_value(roof, 'Rafters/Size', :string)
2359
+ @framing_spacing = XMLHelper.get_value(roof, 'Rafters/Spacing', :float)
2214
2360
  @pitch = XMLHelper.get_value(roof, 'Pitch', :float)
2215
2361
  @radiant_barrier = XMLHelper.get_value(roof, 'RadiantBarrier', :boolean)
2216
2362
  @radiant_barrier_grade = XMLHelper.get_value(roof, 'RadiantBarrierGrade', :integer)
2217
2363
  insulation = XMLHelper.get_element(roof, 'Insulation')
2218
2364
  if not insulation.nil?
2219
2365
  @insulation_id = HPXML::get_id(insulation)
2366
+ @insulation_grade = XMLHelper.get_value(insulation, 'InsulationGrade', :integer)
2220
2367
  @insulation_assembly_r_value = XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue', :float)
2221
2368
  @insulation_cavity_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue", :float)
2222
2369
  @insulation_continuous_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue", :float)
@@ -2241,7 +2388,7 @@ class HPXML < Object
2241
2388
  class RimJoist < BaseElement
2242
2389
  ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :area, :orientation, :azimuth, :siding,
2243
2390
  :color, :solar_absorptance, :emittance, :insulation_id, :insulation_assembly_r_value,
2244
- :insulation_cavity_r_value, :insulation_continuous_r_value]
2391
+ :insulation_cavity_r_value, :insulation_continuous_r_value, :framing_size]
2245
2392
  attr_accessor(*ATTRS)
2246
2393
 
2247
2394
  def is_exterior
@@ -2318,6 +2465,10 @@ class HPXML < Object
2318
2465
  XMLHelper.add_element(layer, 'InstallationType', 'continuous', :string)
2319
2466
  XMLHelper.add_element(layer, 'NominalRValue', @insulation_continuous_r_value, :float)
2320
2467
  end
2468
+ if not @framing_size.nil?
2469
+ floor_joists = XMLHelper.add_element(rim_joist, 'FloorJoists')
2470
+ XMLHelper.add_element(floor_joists, 'Size', @framing_size, :string) unless @framing_size.nil?
2471
+ end
2321
2472
  end
2322
2473
 
2323
2474
  def from_oga(rim_joist)
@@ -2340,6 +2491,7 @@ class HPXML < Object
2340
2491
  @insulation_cavity_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue", :float)
2341
2492
  @insulation_continuous_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue", :float)
2342
2493
  end
2494
+ @framing_size = XMLHelper.get_value(rim_joist, 'FloorJoists/Size', :string)
2343
2495
  end
2344
2496
  end
2345
2497
 
@@ -2361,7 +2513,8 @@ class HPXML < Object
2361
2513
  ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :wall_type, :optimum_value_engineering,
2362
2514
  :area, :orientation, :azimuth, :siding, :color, :solar_absorptance, :emittance, :insulation_id,
2363
2515
  :insulation_assembly_r_value, :insulation_cavity_r_value, :insulation_continuous_r_value,
2364
- :interior_finish_type, :interior_finish_thickness, :attic_wall_type]
2516
+ :interior_finish_type, :interior_finish_thickness, :attic_wall_type, :framing_factor,
2517
+ :framing_size, :framing_spacing, :insulation_grade]
2365
2518
  attr_accessor(*ATTRS)
2366
2519
 
2367
2520
  def windows
@@ -2455,6 +2608,12 @@ class HPXML < Object
2455
2608
  XMLHelper.add_element(wall, 'Area', @area, :float) unless @area.nil?
2456
2609
  XMLHelper.add_element(wall, 'Orientation', @orientation, :string, @orientation_isdefaulted) unless @orientation.nil?
2457
2610
  XMLHelper.add_element(wall, 'Azimuth', @azimuth, :integer, @azimuth_isdefaulted) unless @azimuth.nil?
2611
+ if (not @framing_factor.nil?) || (not @framing_size.nil?) || (not @framing_spacing.nil?)
2612
+ studs = XMLHelper.add_element(wall, 'Studs')
2613
+ XMLHelper.add_element(studs, 'Size', @framing_size, :string) unless @framing_size.nil?
2614
+ XMLHelper.add_element(studs, 'Spacing', @framing_spacing, :float) unless @framing_spacing.nil?
2615
+ XMLHelper.add_element(studs, 'FramingFactor', @framing_factor, :float) unless @framing_factor.nil?
2616
+ end
2458
2617
  XMLHelper.add_element(wall, 'Siding', @siding, :string, @siding_isdefaulted) unless @siding.nil?
2459
2618
  XMLHelper.add_element(wall, 'Color', @color, :string, @color_isdefaulted) unless @color.nil?
2460
2619
  XMLHelper.add_element(wall, 'SolarAbsorptance', @solar_absorptance, :float, @solar_absorptance_isdefaulted) unless @solar_absorptance.nil?
@@ -2471,6 +2630,7 @@ class HPXML < Object
2471
2630
  else
2472
2631
  XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation')
2473
2632
  end
2633
+ XMLHelper.add_element(insulation, 'InsulationGrade', @insulation_grade, :integer) unless @insulation_grade.nil?
2474
2634
  XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', @insulation_assembly_r_value, :float) unless @insulation_assembly_r_value.nil?
2475
2635
  if not @insulation_cavity_r_value.nil?
2476
2636
  layer = XMLHelper.add_element(insulation, 'Layer')
@@ -2498,6 +2658,9 @@ class HPXML < Object
2498
2658
  @area = XMLHelper.get_value(wall, 'Area', :float)
2499
2659
  @orientation = XMLHelper.get_value(wall, 'Orientation', :string)
2500
2660
  @azimuth = XMLHelper.get_value(wall, 'Azimuth', :integer)
2661
+ @framing_size = XMLHelper.get_value(wall, 'Studs/Size', :string)
2662
+ @framing_spacing = XMLHelper.get_value(wall, 'Studs/Spacing', :float)
2663
+ @framing_factor = XMLHelper.get_value(wall, 'Studs/FramingFactor', :float)
2501
2664
  @siding = XMLHelper.get_value(wall, 'Siding', :string)
2502
2665
  @color = XMLHelper.get_value(wall, 'Color', :string)
2503
2666
  @solar_absorptance = XMLHelper.get_value(wall, 'SolarAbsorptance', :float)
@@ -2510,6 +2673,7 @@ class HPXML < Object
2510
2673
  insulation = XMLHelper.get_element(wall, 'Insulation')
2511
2674
  if not insulation.nil?
2512
2675
  @insulation_id = HPXML::get_id(insulation)
2676
+ @insulation_grade = XMLHelper.get_value(insulation, 'InsulationGrade', :integer)
2513
2677
  @insulation_assembly_r_value = XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue', :float)
2514
2678
  @insulation_cavity_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue", :float)
2515
2679
  @insulation_continuous_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue", :float)
@@ -2707,7 +2871,8 @@ class HPXML < Object
2707
2871
  class Floor < BaseElement
2708
2872
  ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :floor_type, :area, :insulation_id,
2709
2873
  :insulation_assembly_r_value, :insulation_cavity_r_value, :insulation_continuous_r_value,
2710
- :floor_or_ceiling, :interior_finish_type, :interior_finish_thickness]
2874
+ :floor_or_ceiling, :interior_finish_type, :interior_finish_thickness, :insulation_grade,
2875
+ :framing_factor, :framing_size, :framing_spacing]
2711
2876
  attr_accessor(*ATTRS)
2712
2877
 
2713
2878
  def is_ceiling
@@ -2790,6 +2955,12 @@ class HPXML < Object
2790
2955
  floor_type_el = XMLHelper.add_element(floor, 'FloorType')
2791
2956
  XMLHelper.add_element(floor_type_el, @floor_type)
2792
2957
  end
2958
+ if (not @framing_factor.nil?) || (not @framing_size.nil?) || (not @framing_spacing.nil?)
2959
+ joists = XMLHelper.add_element(floor, 'FloorJoists')
2960
+ XMLHelper.add_element(joists, 'Size', @framing_size, :string) unless @framing_size.nil?
2961
+ XMLHelper.add_element(joists, 'Spacing', @framing_spacing, :float) unless @framing_spacing.nil?
2962
+ XMLHelper.add_element(joists, 'FramingFactor', @framing_factor, :float) unless @framing_factor.nil?
2963
+ end
2793
2964
  XMLHelper.add_element(floor, 'Area', @area, :float) unless @area.nil?
2794
2965
  if (not @interior_finish_type.nil?) || (not @interior_finish_thickness.nil?)
2795
2966
  interior_finish = XMLHelper.add_element(floor, 'InteriorFinish')
@@ -2803,6 +2974,7 @@ class HPXML < Object
2803
2974
  else
2804
2975
  XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation')
2805
2976
  end
2977
+ XMLHelper.add_element(insulation, 'InsulationGrade', @insulation_grade, :integer) unless @insulation_grade.nil?
2806
2978
  XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', @insulation_assembly_r_value, :float) unless @insulation_assembly_r_value.nil?
2807
2979
  if not @insulation_cavity_r_value.nil?
2808
2980
  layer = XMLHelper.add_element(insulation, 'Layer')
@@ -2824,6 +2996,9 @@ class HPXML < Object
2824
2996
  @interior_adjacent_to = XMLHelper.get_value(floor, 'InteriorAdjacentTo', :string)
2825
2997
  @floor_or_ceiling = XMLHelper.get_value(floor, 'FloorOrCeiling', :string)
2826
2998
  @floor_type = XMLHelper.get_child_name(floor, 'FloorType')
2999
+ @framing_size = XMLHelper.get_value(floor, 'FloorJoists/Size', :string)
3000
+ @framing_spacing = XMLHelper.get_value(floor, 'FloorJoists/Spacing', :float)
3001
+ @framing_factor = XMLHelper.get_value(floor, 'FloorJoists/FramingFactor', :float)
2827
3002
  @area = XMLHelper.get_value(floor, 'Area', :float)
2828
3003
  interior_finish = XMLHelper.get_element(floor, 'InteriorFinish')
2829
3004
  if not interior_finish.nil?
@@ -2833,6 +3008,7 @@ class HPXML < Object
2833
3008
  insulation = XMLHelper.get_element(floor, 'Insulation')
2834
3009
  if not insulation.nil?
2835
3010
  @insulation_id = HPXML::get_id(insulation)
3011
+ @insulation_grade = XMLHelper.get_value(insulation, 'InsulationGrade', :float)
2836
3012
  @insulation_assembly_r_value = XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue', :float)
2837
3013
  @insulation_cavity_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue", :float)
2838
3014
  @insulation_continuous_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue", :float)
@@ -3435,7 +3611,8 @@ class HPXML < Object
3435
3611
  :heating_efficiency_percent, :fraction_heat_load_served, :electric_auxiliary_energy,
3436
3612
  :third_party_certification, :htg_seed_id, :is_shared_system, :number_of_units_served,
3437
3613
  :shared_loop_watts, :shared_loop_motor_efficiency, :fan_coil_watts, :fan_watts_per_cfm,
3438
- :airflow_defect_ratio, :fan_watts, :heating_airflow_cfm, :location, :primary_system]
3614
+ :airflow_defect_ratio, :fan_watts, :heating_airflow_cfm, :location, :primary_system,
3615
+ :pilot_light, :pilot_light_btuh]
3439
3616
  attr_accessor(*ATTRS)
3440
3617
 
3441
3618
  def distribution_system
@@ -3471,14 +3648,19 @@ class HPXML < Object
3471
3648
  return
3472
3649
  end
3473
3650
 
3474
- def is_heat_pump_backup_system
3651
+ def primary_heat_pump
3652
+ # Returns the HP for which this heating system is backup
3475
3653
  @hpxml_object.heat_pumps.each do |heat_pump|
3476
3654
  next if heat_pump.backup_system_idref.nil?
3477
3655
  next if heat_pump.backup_system_idref != @id
3478
3656
 
3479
- return true
3657
+ return heat_pump
3480
3658
  end
3481
- return false
3659
+ return
3660
+ end
3661
+
3662
+ def is_heat_pump_backup_system
3663
+ return !primary_heat_pump.nil?
3482
3664
  end
3483
3665
 
3484
3666
  def delete
@@ -3504,7 +3686,7 @@ class HPXML < Object
3504
3686
  heating_system = XMLHelper.add_element(hvac_plant, 'HeatingSystem')
3505
3687
  sys_id = XMLHelper.add_element(heating_system, 'SystemIdentifier')
3506
3688
  XMLHelper.add_attribute(sys_id, 'id', @id)
3507
- XMLHelper.add_element(heating_system, 'UnitLocation', @location, :string) unless @location.nil?
3689
+ XMLHelper.add_element(heating_system, 'UnitLocation', @location, :string, @location_isdefaulted) unless @location.nil?
3508
3690
  XMLHelper.add_element(heating_system, 'YearInstalled', @year_installed, :integer) unless @year_installed.nil?
3509
3691
  XMLHelper.add_element(heating_system, 'ThirdPartyCertification', @third_party_certification, :string) unless @third_party_certification.nil?
3510
3692
  if not @distribution_system_idref.nil?
@@ -3515,7 +3697,18 @@ class HPXML < Object
3515
3697
  XMLHelper.add_element(heating_system, 'NumberofUnitsServed', @number_of_units_served, :integer) unless @number_of_units_served.nil?
3516
3698
  if not @heating_system_type.nil?
3517
3699
  heating_system_type_el = XMLHelper.add_element(heating_system, 'HeatingSystemType')
3518
- XMLHelper.add_element(heating_system_type_el, @heating_system_type)
3700
+ type_el = XMLHelper.add_element(heating_system_type_el, @heating_system_type)
3701
+ if [HPXML::HVACTypeFurnace,
3702
+ HPXML::HVACTypeWallFurnace,
3703
+ HPXML::HVACTypeFloorFurnace,
3704
+ HPXML::HVACTypeFireplace,
3705
+ HPXML::HVACTypeStove,
3706
+ HPXML::HVACTypeBoiler].include? @heating_system_type
3707
+ XMLHelper.add_element(type_el, 'PilotLight', @pilot_light, :boolean, @pilot_light_isdefaulted) unless @pilot_light.nil?
3708
+ if @pilot_light
3709
+ XMLHelper.add_extension(type_el, 'PilotLightBtuh', @pilot_light_btuh, :float, @pilot_light_btuh_isdefaulted) unless @pilot_light_btuh.nil?
3710
+ end
3711
+ end
3519
3712
  end
3520
3713
  XMLHelper.add_element(heating_system, 'HeatingSystemFuel', @heating_system_fuel, :string) unless @heating_system_fuel.nil?
3521
3714
  XMLHelper.add_element(heating_system, 'HeatingCapacity', @heating_capacity, :float, @heating_capacity_isdefaulted) unless @heating_capacity.nil?
@@ -3557,6 +3750,10 @@ class HPXML < Object
3557
3750
  @number_of_units_served = XMLHelper.get_value(heating_system, 'NumberofUnitsServed', :integer)
3558
3751
  @heating_system_type = XMLHelper.get_child_name(heating_system, 'HeatingSystemType')
3559
3752
  @heating_system_fuel = XMLHelper.get_value(heating_system, 'HeatingSystemFuel', :string)
3753
+ @pilot_light = XMLHelper.get_value(heating_system, "HeatingSystemType/#{@heating_system_type}/PilotLight", :boolean)
3754
+ if @pilot_light
3755
+ @pilot_light_btuh = XMLHelper.get_value(heating_system, "HeatingSystemType/#{@heating_system_type}/extension/PilotLightBtuh", :float)
3756
+ end
3560
3757
  @heating_capacity = XMLHelper.get_value(heating_system, 'HeatingCapacity', :float)
3561
3758
  @heating_efficiency_afue = XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='#{UnitsAFUE}']/Value", :float)
3562
3759
  @heating_efficiency_percent = XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='Percent']/Value", :float)
@@ -3607,9 +3804,9 @@ class HPXML < Object
3607
3804
  :cooling_efficiency_seer2, :cooling_efficiency_eer, :cooling_efficiency_ceer, :cooling_efficiency_kw_per_ton,
3608
3805
  :cooling_shr, :third_party_certification, :clg_seed_id, :is_shared_system, :number_of_units_served,
3609
3806
  :shared_loop_watts, :shared_loop_motor_efficiency, :fan_coil_watts, :airflow_defect_ratio,
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]
3807
+ :fan_watts_per_cfm, :charge_defect_ratio, :cooling_airflow_cfm, :location, :primary_system,
3808
+ :integrated_heating_system_fuel, :integrated_heating_system_capacity, :integrated_heating_system_efficiency_percent,
3809
+ :integrated_heating_system_fraction_heat_load_served, :integrated_heating_system_airflow_cfm, :htg_seed_id, :crankcase_heater_watts]
3613
3810
  attr_accessor(*ATTRS)
3614
3811
 
3615
3812
  def distribution_system
@@ -3665,7 +3862,7 @@ class HPXML < Object
3665
3862
  cooling_system = XMLHelper.add_element(hvac_plant, 'CoolingSystem')
3666
3863
  sys_id = XMLHelper.add_element(cooling_system, 'SystemIdentifier')
3667
3864
  XMLHelper.add_attribute(sys_id, 'id', @id)
3668
- XMLHelper.add_element(cooling_system, 'UnitLocation', @location, :string) unless @location.nil?
3865
+ XMLHelper.add_element(cooling_system, 'UnitLocation', @location, :string, @location_isdefaulted) unless @location.nil?
3669
3866
  XMLHelper.add_element(cooling_system, 'YearInstalled', @year_installed, :integer) unless @year_installed.nil?
3670
3867
  XMLHelper.add_element(cooling_system, 'ThirdPartyCertification', @third_party_certification, :string) unless @third_party_certification.nil?
3671
3868
  if not @distribution_system_idref.nil?
@@ -3721,7 +3918,9 @@ class HPXML < Object
3721
3918
  XMLHelper.add_extension(cooling_system, 'SharedLoopWatts', @shared_loop_watts, :float) unless @shared_loop_watts.nil?
3722
3919
  XMLHelper.add_extension(cooling_system, 'SharedLoopMotorEfficiency', @shared_loop_motor_efficiency, :float) unless @shared_loop_motor_efficiency.nil?
3723
3920
  XMLHelper.add_extension(cooling_system, 'FanCoilWatts', @fan_coil_watts, :float) unless @fan_coil_watts.nil?
3921
+ XMLHelper.add_extension(cooling_system, 'CrankcaseHeaterPowerWatts', @crankcase_heater_watts, :float, @crankcase_heater_watts_isdefaulted) unless @crankcase_heater_watts.nil?
3724
3922
  XMLHelper.add_extension(cooling_system, 'CoolingSeedId', @clg_seed_id, :string) unless @clg_seed_id.nil?
3923
+ XMLHelper.add_extension(cooling_system, 'HeatingSeedId', @htg_seed_id, :string) unless @htg_seed_id.nil?
3725
3924
  if @primary_system
3726
3925
  primary_cooling_system = XMLHelper.add_element(primary_systems, 'PrimaryCoolingSystem')
3727
3926
  XMLHelper.add_attribute(primary_cooling_system, 'idref', @id)
@@ -3761,7 +3960,9 @@ class HPXML < Object
3761
3960
  @shared_loop_watts = XMLHelper.get_value(cooling_system, 'extension/SharedLoopWatts', :float)
3762
3961
  @shared_loop_motor_efficiency = XMLHelper.get_value(cooling_system, 'extension/SharedLoopMotorEfficiency', :float)
3763
3962
  @fan_coil_watts = XMLHelper.get_value(cooling_system, 'extension/FanCoilWatts', :float)
3963
+ @crankcase_heater_watts = XMLHelper.get_value(cooling_system, 'extension/CrankcaseHeaterPowerWatts', :float)
3764
3964
  @clg_seed_id = XMLHelper.get_value(cooling_system, 'extension/CoolingSeedId', :string)
3965
+ @htg_seed_id = XMLHelper.get_value(cooling_system, 'extension/HeatingSeedId', :string)
3765
3966
  primary_cooling_system = HPXML::get_idref(XMLHelper.get_element(cooling_system, '../PrimarySystems/PrimaryCoolingSystem'))
3766
3967
  if primary_cooling_system == @id
3767
3968
  @primary_system = true
@@ -3795,7 +3996,7 @@ class HPXML < Object
3795
3996
 
3796
3997
  class HeatPump < BaseElement
3797
3998
  ATTRS = [:id, :distribution_system_idref, :year_installed, :heat_pump_type, :heat_pump_fuel,
3798
- :heating_capacity, :heating_capacity_17F, :cooling_capacity, :compressor_type,
3999
+ :heating_capacity, :heating_capacity_17F, :cooling_capacity, :compressor_type, :compressor_lockout_temp,
3799
4000
  :cooling_shr, :backup_type, :backup_system_idref, :backup_heating_fuel, :backup_heating_capacity,
3800
4001
  :backup_heating_efficiency_percent, :backup_heating_efficiency_afue, :backup_heating_lockout_temp,
3801
4002
  :backup_heating_switchover_temp, :fraction_heat_load_served, :fraction_cool_load_served, :cooling_efficiency_seer,
@@ -3803,7 +4004,8 @@ class HPXML < Object
3803
4004
  :heating_efficiency_hspf2, :heating_efficiency_cop, :third_party_certification, :htg_seed_id, :clg_seed_id,
3804
4005
  :pump_watts_per_ton, :fan_watts_per_cfm, :is_shared_system, :number_of_units_served, :shared_loop_watts,
3805
4006
  :shared_loop_motor_efficiency, :airflow_defect_ratio, :charge_defect_ratio,
3806
- :heating_airflow_cfm, :cooling_airflow_cfm, :location, :primary_heating_system, :primary_cooling_system]
4007
+ :heating_airflow_cfm, :cooling_airflow_cfm, :location, :primary_heating_system, :primary_cooling_system,
4008
+ :heating_capacity_retention_fraction, :heating_capacity_retention_temp, :crankcase_heater_watts]
3807
4009
  attr_accessor(*ATTRS)
3808
4010
 
3809
4011
  def distribution_system
@@ -3867,7 +4069,7 @@ class HPXML < Object
3867
4069
  heat_pump = XMLHelper.add_element(hvac_plant, 'HeatPump')
3868
4070
  sys_id = XMLHelper.add_element(heat_pump, 'SystemIdentifier')
3869
4071
  XMLHelper.add_attribute(sys_id, 'id', @id)
3870
- XMLHelper.add_element(heat_pump, 'UnitLocation', @location, :string) unless @location.nil?
4072
+ XMLHelper.add_element(heat_pump, 'UnitLocation', @location, :string, @location_isdefaulted) unless @location.nil?
3871
4073
  XMLHelper.add_element(heat_pump, 'YearInstalled', @year_installed, :integer) unless @year_installed.nil?
3872
4074
  XMLHelper.add_element(heat_pump, 'ThirdPartyCertification', @third_party_certification, :string) unless @third_party_certification.nil?
3873
4075
  if not @distribution_system_idref.nil?
@@ -3882,6 +4084,7 @@ class HPXML < Object
3882
4084
  XMLHelper.add_element(heat_pump, 'HeatingCapacity17F', @heating_capacity_17F, :float) unless @heating_capacity_17F.nil?
3883
4085
  XMLHelper.add_element(heat_pump, 'CoolingCapacity', @cooling_capacity, :float, @cooling_capacity_isdefaulted) unless @cooling_capacity.nil?
3884
4086
  XMLHelper.add_element(heat_pump, 'CompressorType', @compressor_type, :string, @compressor_type_isdefaulted) unless @compressor_type.nil?
4087
+ XMLHelper.add_element(heat_pump, 'CompressorLockoutTemperature', @compressor_lockout_temp, :float, @compressor_lockout_temp_isdefaulted) unless @compressor_lockout_temp.nil?
3885
4088
  XMLHelper.add_element(heat_pump, 'CoolingSensibleHeatFraction', @cooling_shr, :float, @cooling_shr_isdefaulted) unless @cooling_shr.nil?
3886
4089
  XMLHelper.add_element(heat_pump, 'BackupType', @backup_type, :string, @backup_type_isdefaulted) unless @backup_type.nil?
3887
4090
  if not @backup_system_idref.nil?
@@ -3947,6 +4150,12 @@ class HPXML < Object
3947
4150
  XMLHelper.add_extension(heat_pump, 'PumpPowerWattsPerTon', @pump_watts_per_ton, :float, @pump_watts_per_ton_isdefaulted) unless @pump_watts_per_ton.nil?
3948
4151
  XMLHelper.add_extension(heat_pump, 'SharedLoopWatts', @shared_loop_watts, :float) unless @shared_loop_watts.nil?
3949
4152
  XMLHelper.add_extension(heat_pump, 'SharedLoopMotorEfficiency', @shared_loop_motor_efficiency, :float) unless @shared_loop_motor_efficiency.nil?
4153
+ if (not @heating_capacity_retention_fraction.nil?) || (not @heating_capacity_retention_temp.nil?)
4154
+ htg_cap_retention = XMLHelper.add_extension(heat_pump, 'HeatingCapacityRetention')
4155
+ XMLHelper.add_element(htg_cap_retention, 'Fraction', @heating_capacity_retention_fraction, :float, @heating_capacity_retention_fraction_isdefaulted) unless @heating_capacity_retention_fraction.nil?
4156
+ XMLHelper.add_element(htg_cap_retention, 'Temperature', @heating_capacity_retention_temp, :float, @heating_capacity_retention_temp_isdefaulted) unless @heating_capacity_retention_temp.nil?
4157
+ end
4158
+ XMLHelper.add_extension(heat_pump, 'CrankcaseHeaterPowerWatts', @crankcase_heater_watts, :float, @crankcase_heater_watts_isdefaulted) unless @crankcase_heater_watts.nil?
3950
4159
  XMLHelper.add_extension(heat_pump, 'HeatingSeedId', @htg_seed_id, :string) unless @htg_seed_id.nil?
3951
4160
  XMLHelper.add_extension(heat_pump, 'CoolingSeedId', @clg_seed_id, :string) unless @clg_seed_id.nil?
3952
4161
  if @primary_heating_system
@@ -3975,6 +4184,7 @@ class HPXML < Object
3975
4184
  @heating_capacity_17F = XMLHelper.get_value(heat_pump, 'HeatingCapacity17F', :float)
3976
4185
  @cooling_capacity = XMLHelper.get_value(heat_pump, 'CoolingCapacity', :float)
3977
4186
  @compressor_type = XMLHelper.get_value(heat_pump, 'CompressorType', :string)
4187
+ @compressor_lockout_temp = XMLHelper.get_value(heat_pump, 'CompressorLockoutTemperature', :float)
3978
4188
  @cooling_shr = XMLHelper.get_value(heat_pump, 'CoolingSensibleHeatFraction', :float)
3979
4189
  @backup_type = XMLHelper.get_value(heat_pump, 'BackupType', :string)
3980
4190
  @backup_system_idref = HPXML::get_idref(XMLHelper.get_element(heat_pump, 'BackupSystem'))
@@ -4001,6 +4211,9 @@ class HPXML < Object
4001
4211
  @pump_watts_per_ton = XMLHelper.get_value(heat_pump, 'extension/PumpPowerWattsPerTon', :float)
4002
4212
  @shared_loop_watts = XMLHelper.get_value(heat_pump, 'extension/SharedLoopWatts', :float)
4003
4213
  @shared_loop_motor_efficiency = XMLHelper.get_value(heat_pump, 'extension/SharedLoopMotorEfficiency', :float)
4214
+ @heating_capacity_retention_fraction = XMLHelper.get_value(heat_pump, 'extension/HeatingCapacityRetention/Fraction', :float)
4215
+ @heating_capacity_retention_temp = XMLHelper.get_value(heat_pump, 'extension/HeatingCapacityRetention/Temperature', :float)
4216
+ @crankcase_heater_watts = XMLHelper.get_value(heat_pump, 'extension/CrankcaseHeaterPowerWatts', :float)
4004
4217
  @htg_seed_id = XMLHelper.get_value(heat_pump, 'extension/HeatingSeedId', :string)
4005
4218
  @clg_seed_id = XMLHelper.get_value(heat_pump, 'extension/CoolingSeedId', :string)
4006
4219
  primary_heating_system = HPXML::get_idref(XMLHelper.get_element(heat_pump, '../PrimarySystems/PrimaryHeatingSystem'))
@@ -4041,14 +4254,12 @@ class HPXML < Object
4041
4254
  cdl_sens_slabs: 'Slabs',
4042
4255
  cdl_sens_ceilings: 'Ceilings',
4043
4256
  cdl_sens_infilvent: 'InfilVent',
4044
- cdl_sens_intgains: 'InternalGains' }
4257
+ cdl_sens_intgains: 'InternalLoads' }
4045
4258
  CDL_LAT_ATTRS = { cdl_lat_total: 'Total',
4046
4259
  cdl_lat_ducts: 'Ducts',
4047
4260
  cdl_lat_infilvent: 'InfilVent',
4048
- cdl_lat_intgains: 'InternalGains' }
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
4261
+ cdl_lat_intgains: 'InternalLoads' }
4262
+ ATTRS = HDL_ATTRS.keys + CDL_SENS_ATTRS.keys + CDL_LAT_ATTRS.keys
4052
4263
  attr_accessor(*ATTRS)
4053
4264
 
4054
4265
  def check_for_errors
@@ -4060,13 +4271,6 @@ class HPXML < Object
4060
4271
  return if nil?
4061
4272
 
4062
4273
  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
4070
4274
  if not @hdl_total.nil?
4071
4275
  dl_extension = XMLHelper.create_elements_as_needed(hvac_plant, ['extension', 'DesignLoads'])
4072
4276
  XMLHelper.add_attribute(dl_extension, 'dataSource', 'software')
@@ -4091,9 +4295,6 @@ class HPXML < Object
4091
4295
  hvac_plant = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Systems/HVAC/HVACPlant')
4092
4296
  return if hvac_plant.nil?
4093
4297
 
4094
- TEMPERATURE_ATTRS.each do |attr, element_name|
4095
- send("#{attr}=", XMLHelper.get_value(hvac_plant, "extension/DesignTemperatures/#{element_name}", :float))
4096
- end
4097
4298
  HDL_ATTRS.each do |attr, element_name|
4098
4299
  send("#{attr}=", XMLHelper.get_value(hvac_plant, "extension/DesignLoads/Heating/#{element_name}", :float))
4099
4300
  end
@@ -4269,18 +4470,6 @@ class HPXML < Object
4269
4470
  return list
4270
4471
  end
4271
4472
 
4272
- def total_unconditioned_duct_areas
4273
- areas = { HPXML::DuctTypeSupply => 0,
4274
- HPXML::DuctTypeReturn => 0 }
4275
- @ducts.each do |duct|
4276
- next if HPXML::conditioned_locations.include? duct.duct_location
4277
- next if duct.duct_type.nil?
4278
-
4279
- areas[duct.duct_type] += duct.duct_surface_area
4280
- end
4281
- return areas
4282
- end
4283
-
4284
4473
  def delete
4285
4474
  @hpxml_object.hvac_distributions.delete(self)
4286
4475
  @hpxml_object.hvac_systems.each do |hvac_system|
@@ -4440,7 +4629,8 @@ class HPXML < Object
4440
4629
 
4441
4630
  class Duct < BaseElement
4442
4631
  ATTRS = [:id, :duct_type, :duct_insulation_r_value, :duct_insulation_material, :duct_location,
4443
- :duct_fraction_area, :duct_surface_area, :duct_surface_area_multiplier]
4632
+ :duct_fraction_area, :duct_surface_area, :duct_surface_area_multiplier,
4633
+ :duct_buried_insulation_level, :duct_effective_r_value]
4444
4634
  attr_accessor(*ATTRS)
4445
4635
 
4446
4636
  def delete
@@ -4466,6 +4656,8 @@ class HPXML < Object
4466
4656
  XMLHelper.add_element(ins_material_el, @duct_insulation_material)
4467
4657
  end
4468
4658
  XMLHelper.add_element(ducts_el, 'DuctInsulationRValue', @duct_insulation_r_value, :float) unless @duct_insulation_r_value.nil?
4659
+ XMLHelper.add_element(ducts_el, 'DuctBuriedInsulationLevel', @duct_buried_insulation_level, :string, @duct_buried_insulation_level_isdefaulted) unless @duct_buried_insulation_level.nil?
4660
+ XMLHelper.add_element(ducts_el, 'DuctEffectiveRValue', @duct_effective_r_value, :float, @duct_effective_r_value_isdefaulted) unless @duct_effective_r_value.nil?
4469
4661
  XMLHelper.add_element(ducts_el, 'DuctLocation', @duct_location, :string, @duct_location_isdefaulted) unless @duct_location.nil?
4470
4662
  XMLHelper.add_element(ducts_el, 'FractionDuctArea', @duct_fraction_area, :float, @duct_fraction_area_isdefaulted) unless @duct_fraction_area.nil?
4471
4663
  XMLHelper.add_element(ducts_el, 'DuctSurfaceArea', @duct_surface_area, :float, @duct_surface_area_isdefaulted) unless @duct_surface_area.nil?
@@ -4479,6 +4671,8 @@ class HPXML < Object
4479
4671
  @duct_type = XMLHelper.get_value(duct, 'DuctType', :string)
4480
4672
  @duct_insulation_material = XMLHelper.get_child_name(duct, 'DuctInsulationMaterial')
4481
4673
  @duct_insulation_r_value = XMLHelper.get_value(duct, 'DuctInsulationRValue', :float)
4674
+ @duct_buried_insulation_level = XMLHelper.get_value(duct, 'DuctBuriedInsulationLevel', :string)
4675
+ @duct_effective_r_value = XMLHelper.get_value(duct, 'DuctEffectiveRValue', :float)
4482
4676
  @duct_location = XMLHelper.get_value(duct, 'DuctLocation', :string)
4483
4677
  @duct_fraction_area = XMLHelper.get_value(duct, 'FractionDuctArea', :float)
4484
4678
  @duct_surface_area = XMLHelper.get_value(duct, 'DuctSurfaceArea', :float)
@@ -4505,7 +4699,7 @@ class HPXML < Object
4505
4699
  :used_for_whole_building_ventilation, :used_for_seasonal_cooling_load_reduction,
4506
4700
  :used_for_local_ventilation, :total_recovery_efficiency, :total_recovery_efficiency_adjusted,
4507
4701
  :sensible_recovery_efficiency, :sensible_recovery_efficiency_adjusted,
4508
- :fan_power, :fan_power_defaulted, :quantity, :fan_location, :distribution_system_idref, :start_hour,
4702
+ :fan_power, :fan_power_defaulted, :count, :fan_location, :distribution_system_idref, :start_hour,
4509
4703
  :is_shared_system, :in_unit_flow_rate, :fraction_recirculation, :used_for_garage_ventilation,
4510
4704
  :preheating_fuel, :preheating_efficiency_cop, :preheating_fraction_load_served, :precooling_fuel,
4511
4705
  :precooling_efficiency_cop, :precooling_fraction_load_served, :calculated_flow_rate,
@@ -4681,7 +4875,7 @@ class HPXML < Object
4681
4875
  ventilation_fan = XMLHelper.add_element(ventilation_fans, 'VentilationFan')
4682
4876
  sys_id = XMLHelper.add_element(ventilation_fan, 'SystemIdentifier')
4683
4877
  XMLHelper.add_attribute(sys_id, 'id', @id)
4684
- XMLHelper.add_element(ventilation_fan, 'Quantity', @quantity, :integer, @quantity_isdefaulted) unless @quantity.nil?
4878
+ XMLHelper.add_element(ventilation_fan, 'Count', @count, :integer, @count_isdefaulted) unless @count.nil?
4685
4879
  XMLHelper.add_element(ventilation_fan, 'FanType', @fan_type, :string) unless @fan_type.nil?
4686
4880
  if (not @cfis_addtl_runtime_operating_mode.nil?) || (not @cfis_supplemental_fan_idref.nil?)
4687
4881
  cfis_controls = XMLHelper.add_element(ventilation_fan, 'CFISControls')
@@ -4739,7 +4933,7 @@ class HPXML < Object
4739
4933
  return if ventilation_fan.nil?
4740
4934
 
4741
4935
  @id = HPXML::get_id(ventilation_fan)
4742
- @quantity = XMLHelper.get_value(ventilation_fan, 'Quantity', :integer)
4936
+ @count = XMLHelper.get_value(ventilation_fan, 'Count', :integer)
4743
4937
  @fan_type = XMLHelper.get_value(ventilation_fan, 'FanType', :string)
4744
4938
  @rated_flow_rate = XMLHelper.get_value(ventilation_fan, 'RatedFlowRate', :float)
4745
4939
  @calculated_flow_rate = XMLHelper.get_value(ventilation_fan, 'CalculatedFlowRate', :float)
@@ -4843,6 +5037,7 @@ class HPXML < Object
4843
5037
  XMLHelper.add_element(water_heating_system, 'HeatingCapacity', @heating_capacity, :float, @heating_capacity_isdefaulted) unless @heating_capacity.nil?
4844
5038
  XMLHelper.add_element(water_heating_system, 'EnergyFactor', @energy_factor, :float, @energy_factor_isdefaulted) unless @energy_factor.nil?
4845
5039
  XMLHelper.add_element(water_heating_system, 'UniformEnergyFactor', @uniform_energy_factor, :float) unless @uniform_energy_factor.nil?
5040
+ XMLHelper.add_element(water_heating_system, 'HPWHOperatingMode', @operating_mode, :string, @operating_mode_isdefaulted) unless @operating_mode.nil?
4846
5041
  XMLHelper.add_element(water_heating_system, 'FirstHourRating', @first_hour_rating, :float) unless @first_hour_rating.nil?
4847
5042
  XMLHelper.add_element(water_heating_system, 'UsageBin', @usage_bin, :string, @usage_bin_isdefaulted) unless @usage_bin.nil?
4848
5043
  XMLHelper.add_element(water_heating_system, 'RecoveryEfficiency', @recovery_efficiency, :float, @recovery_efficiency_isdefaulted) unless @recovery_efficiency.nil?
@@ -4862,10 +5057,9 @@ class HPXML < Object
4862
5057
  related_hvac_idref_el = XMLHelper.add_element(water_heating_system, 'RelatedHVACSystem')
4863
5058
  XMLHelper.add_attribute(related_hvac_idref_el, 'idref', @related_hvac_idref)
4864
5059
  end
4865
- if (not @tank_model_type.nil?) || (not @operating_mode.nil?)
5060
+ if not @tank_model_type.nil?
4866
5061
  extension = XMLHelper.create_elements_as_needed(water_heating_system, ['extension'])
4867
5062
  XMLHelper.add_element(extension, 'TankModelType', @tank_model_type, :string, @tank_model_type_isdefaulted) unless @tank_model_type.nil?
4868
- XMLHelper.add_element(extension, 'OperatingMode', @operating_mode, :string, @operating_mode_isdefaulted) unless @operating_mode.nil?
4869
5063
  end
4870
5064
  end
4871
5065
 
@@ -4886,6 +5080,7 @@ class HPXML < Object
4886
5080
  @heating_capacity = XMLHelper.get_value(water_heating_system, 'HeatingCapacity', :float)
4887
5081
  @energy_factor = XMLHelper.get_value(water_heating_system, 'EnergyFactor', :float)
4888
5082
  @uniform_energy_factor = XMLHelper.get_value(water_heating_system, 'UniformEnergyFactor', :float)
5083
+ @operating_mode = XMLHelper.get_value(water_heating_system, 'HPWHOperatingMode', :string)
4889
5084
  @first_hour_rating = XMLHelper.get_value(water_heating_system, 'FirstHourRating', :float)
4890
5085
  @usage_bin = XMLHelper.get_value(water_heating_system, 'UsageBin', :string)
4891
5086
  @recovery_efficiency = XMLHelper.get_value(water_heating_system, 'RecoveryEfficiency', :float)
@@ -4896,7 +5091,6 @@ class HPXML < Object
4896
5091
  @uses_desuperheater = XMLHelper.get_value(water_heating_system, 'UsesDesuperheater', :boolean)
4897
5092
  @related_hvac_idref = HPXML::get_idref(XMLHelper.get_element(water_heating_system, 'RelatedHVACSystem'))
4898
5093
  @tank_model_type = XMLHelper.get_value(water_heating_system, 'extension/TankModelType', :string)
4899
- @operating_mode = XMLHelper.get_value(water_heating_system, 'extension/OperatingMode', :string)
4900
5094
  end
4901
5095
  end
4902
5096
 
@@ -5181,16 +5375,28 @@ class HPXML < Object
5181
5375
 
5182
5376
  class PVSystem < BaseElement
5183
5377
  ATTRS = [:id, :location, :module_type, :tracking, :array_orientation, :array_azimuth, :array_tilt,
5184
- :max_power_output, :inverter_efficiency, :system_losses_fraction, :number_of_panels,
5378
+ :max_power_output, :inverter_idref, :system_losses_fraction, :number_of_panels,
5185
5379
  :year_modules_manufactured, :is_shared_system, :number_of_bedrooms_served]
5186
5380
  attr_accessor(*ATTRS)
5187
5381
 
5382
+ def inverter
5383
+ return if @inverter_idref.nil?
5384
+
5385
+ @hpxml_object.inverters.each do |inv|
5386
+ next unless inv.id == @inverter_idref
5387
+
5388
+ return inv
5389
+ end
5390
+ fail "Attached inverter '#{@inverter_idref}' not found for pv system '#{@id}'."
5391
+ end
5392
+
5188
5393
  def delete
5189
5394
  @hpxml_object.pv_systems.delete(self)
5190
5395
  end
5191
5396
 
5192
5397
  def check_for_errors
5193
5398
  errors = []
5399
+ begin; inverter; rescue StandardError => e; errors << e.message; end
5194
5400
  return errors
5195
5401
  end
5196
5402
 
@@ -5210,9 +5416,12 @@ class HPXML < Object
5210
5416
  XMLHelper.add_element(pv_system, 'ArrayTilt', @array_tilt, :float) unless @array_tilt.nil?
5211
5417
  XMLHelper.add_element(pv_system, 'MaxPowerOutput', @max_power_output, :float) unless @max_power_output.nil?
5212
5418
  XMLHelper.add_element(pv_system, 'NumberOfPanels', @number_of_panels, :integer) unless @number_of_panels.nil?
5213
- XMLHelper.add_element(pv_system, 'InverterEfficiency', @inverter_efficiency, :float, @inverter_efficiency_isdefaulted) unless @inverter_efficiency.nil?
5214
5419
  XMLHelper.add_element(pv_system, 'SystemLossesFraction', @system_losses_fraction, :float, @system_losses_fraction_isdefaulted) unless @system_losses_fraction.nil?
5215
5420
  XMLHelper.add_element(pv_system, 'YearModulesManufactured', @year_modules_manufactured, :integer) unless @year_modules_manufactured.nil?
5421
+ if not @inverter_idref.nil?
5422
+ attached_to_inverter = XMLHelper.add_element(pv_system, 'AttachedToInverter')
5423
+ XMLHelper.add_attribute(attached_to_inverter, 'idref', @inverter_idref)
5424
+ end
5216
5425
  XMLHelper.add_extension(pv_system, 'NumberofBedroomsServed', @number_of_bedrooms_served, :integer) unless @number_of_bedrooms_served.nil?
5217
5426
  end
5218
5427
 
@@ -5229,13 +5438,69 @@ class HPXML < Object
5229
5438
  @array_tilt = XMLHelper.get_value(pv_system, 'ArrayTilt', :float)
5230
5439
  @max_power_output = XMLHelper.get_value(pv_system, 'MaxPowerOutput', :float)
5231
5440
  @number_of_panels = XMLHelper.get_value(pv_system, 'NumberOfPanels', :integer)
5232
- @inverter_efficiency = XMLHelper.get_value(pv_system, 'InverterEfficiency', :float)
5233
5441
  @system_losses_fraction = XMLHelper.get_value(pv_system, 'SystemLossesFraction', :float)
5234
5442
  @year_modules_manufactured = XMLHelper.get_value(pv_system, 'YearModulesManufactured', :integer)
5443
+ @inverter_idref = HPXML::get_idref(XMLHelper.get_element(pv_system, 'AttachedToInverter'))
5235
5444
  @number_of_bedrooms_served = XMLHelper.get_value(pv_system, 'extension/NumberofBedroomsServed', :integer)
5236
5445
  end
5237
5446
  end
5238
5447
 
5448
+ class Inverters < BaseArrayElement
5449
+ def add(**kwargs)
5450
+ self << Inverter.new(@hpxml_object, **kwargs)
5451
+ end
5452
+
5453
+ def from_oga(hpxml)
5454
+ return if hpxml.nil?
5455
+
5456
+ XMLHelper.get_elements(hpxml, 'Building/BuildingDetails/Systems/Photovoltaics/Inverter').each do |inverter|
5457
+ self << Inverter.new(@hpxml_object, inverter)
5458
+ end
5459
+ end
5460
+ end
5461
+
5462
+ class Inverter < BaseElement
5463
+ ATTRS = [:id, :inverter_efficiency]
5464
+ attr_accessor(*ATTRS)
5465
+
5466
+ def pv_system
5467
+ return if @id.nil?
5468
+
5469
+ @hpxml_object.pv_systems.each do |pv|
5470
+ next unless @id == pv.inverter_idref
5471
+
5472
+ return pv
5473
+ end
5474
+ end
5475
+
5476
+ def delete
5477
+ @hpxml_object.inverters.delete(self)
5478
+ end
5479
+
5480
+ def check_for_errors
5481
+ errors = []
5482
+ begin; pv_system; rescue StandardError => e; errors << e.message; end
5483
+ return errors
5484
+ end
5485
+
5486
+ def to_oga(doc)
5487
+ return if nil?
5488
+
5489
+ photovoltaics = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'Photovoltaics'])
5490
+ inverter = XMLHelper.add_element(photovoltaics, 'Inverter')
5491
+ sys_id = XMLHelper.add_element(inverter, 'SystemIdentifier')
5492
+ XMLHelper.add_attribute(sys_id, 'id', @id)
5493
+ XMLHelper.add_element(inverter, 'InverterEfficiency', @inverter_efficiency, :float, @inverter_efficiency_isdefaulted) unless @inverter_efficiency.nil?
5494
+ end
5495
+
5496
+ def from_oga(inverter)
5497
+ return if inverter.nil?
5498
+
5499
+ @id = HPXML::get_id(inverter)
5500
+ @inverter_efficiency = XMLHelper.get_value(inverter, 'InverterEfficiency', :float)
5501
+ end
5502
+ end
5503
+
5239
5504
  class Generators < BaseArrayElement
5240
5505
  def add(**kwargs)
5241
5506
  self << Generator.new(@hpxml_object, **kwargs)
@@ -5387,7 +5652,7 @@ class HPXML < Object
5387
5652
  class ClothesWasher < BaseElement
5388
5653
  ATTRS = [:id, :location, :modified_energy_factor, :integrated_modified_energy_factor,
5389
5654
  :rated_annual_kwh, :label_electric_rate, :label_gas_rate, :label_annual_gas_cost,
5390
- :capacity, :label_usage, :usage_multiplier, :is_shared_appliance, :number_of_units,
5655
+ :capacity, :label_usage, :usage_multiplier, :is_shared_appliance, :count,
5391
5656
  :number_of_units_served, :water_heating_system_idref, :hot_water_distribution_idref,
5392
5657
  :weekday_fractions, :weekend_fractions, :monthly_multipliers]
5393
5658
 
@@ -5433,7 +5698,7 @@ class HPXML < Object
5433
5698
  clothes_washer = XMLHelper.add_element(appliances, 'ClothesWasher')
5434
5699
  sys_id = XMLHelper.add_element(clothes_washer, 'SystemIdentifier')
5435
5700
  XMLHelper.add_attribute(sys_id, 'id', @id)
5436
- XMLHelper.add_element(clothes_washer, 'NumberofUnits', @number_of_units, :integer) unless @number_of_units.nil?
5701
+ XMLHelper.add_element(clothes_washer, 'Count', @count, :integer) unless @count.nil?
5437
5702
  XMLHelper.add_element(clothes_washer, 'IsSharedAppliance', @is_shared_appliance, :boolean, @is_shared_appliance_isdefaulted) unless @is_shared_appliance.nil?
5438
5703
  XMLHelper.add_element(clothes_washer, 'NumberofUnitsServed', @number_of_units_served, :integer) unless @number_of_units_served.nil?
5439
5704
  if not @water_heating_system_idref.nil?
@@ -5462,7 +5727,7 @@ class HPXML < Object
5462
5727
  return if clothes_washer.nil?
5463
5728
 
5464
5729
  @id = HPXML::get_id(clothes_washer)
5465
- @number_of_units = XMLHelper.get_value(clothes_washer, 'NumberofUnits', :integer)
5730
+ @count = XMLHelper.get_value(clothes_washer, 'Count', :integer)
5466
5731
  @is_shared_appliance = XMLHelper.get_value(clothes_washer, 'IsSharedAppliance', :boolean)
5467
5732
  @number_of_units_served = XMLHelper.get_value(clothes_washer, 'NumberofUnitsServed', :integer)
5468
5733
  @water_heating_system_idref = HPXML::get_idref(XMLHelper.get_element(clothes_washer, 'AttachedToWaterHeatingSystem'))
@@ -5499,7 +5764,7 @@ class HPXML < Object
5499
5764
 
5500
5765
  class ClothesDryer < BaseElement
5501
5766
  ATTRS = [:id, :location, :fuel_type, :energy_factor, :combined_energy_factor, :control_type,
5502
- :usage_multiplier, :is_shared_appliance, :number_of_units, :number_of_units_served,
5767
+ :usage_multiplier, :is_shared_appliance, :count, :number_of_units_served,
5503
5768
  :is_vented, :vented_flow_rate, :weekday_fractions, :weekend_fractions,
5504
5769
  :monthly_multipliers]
5505
5770
  attr_accessor(*ATTRS)
@@ -5520,7 +5785,7 @@ class HPXML < Object
5520
5785
  clothes_dryer = XMLHelper.add_element(appliances, 'ClothesDryer')
5521
5786
  sys_id = XMLHelper.add_element(clothes_dryer, 'SystemIdentifier')
5522
5787
  XMLHelper.add_attribute(sys_id, 'id', @id)
5523
- XMLHelper.add_element(clothes_dryer, 'NumberofUnits', @number_of_units, :integer) unless @number_of_units.nil?
5788
+ XMLHelper.add_element(clothes_dryer, 'Count', @count, :integer) unless @count.nil?
5524
5789
  XMLHelper.add_element(clothes_dryer, 'IsSharedAppliance', @is_shared_appliance, :boolean, @is_shared_appliance_isdefaulted) unless @is_shared_appliance.nil?
5525
5790
  XMLHelper.add_element(clothes_dryer, 'NumberofUnitsServed', @number_of_units_served, :integer) unless @number_of_units_served.nil?
5526
5791
  XMLHelper.add_element(clothes_dryer, 'Location', @location, :string, @location_isdefaulted) unless @location.nil?
@@ -5540,7 +5805,7 @@ class HPXML < Object
5540
5805
  return if clothes_dryer.nil?
5541
5806
 
5542
5807
  @id = HPXML::get_id(clothes_dryer)
5543
- @number_of_units = XMLHelper.get_value(clothes_dryer, 'NumberofUnits', :integer)
5808
+ @count = XMLHelper.get_value(clothes_dryer, 'Count', :integer)
5544
5809
  @is_shared_appliance = XMLHelper.get_value(clothes_dryer, 'IsSharedAppliance', :boolean)
5545
5810
  @number_of_units_served = XMLHelper.get_value(clothes_dryer, 'NumberofUnitsServed', :integer)
5546
5811
  @location = XMLHelper.get_value(clothes_dryer, 'Location', :string)
@@ -5952,7 +6217,7 @@ class HPXML < Object
5952
6217
  end
5953
6218
 
5954
6219
  class LightingGroup < BaseElement
5955
- ATTRS = [:id, :location, :fraction_of_units_in_location, :lighting_type]
6220
+ ATTRS = [:id, :location, :fraction_of_units_in_location, :lighting_type, :kwh_per_year]
5956
6221
  attr_accessor(*ATTRS)
5957
6222
 
5958
6223
  def delete
@@ -5977,6 +6242,11 @@ class HPXML < Object
5977
6242
  lighting_type = XMLHelper.add_element(lighting_group, 'LightingType')
5978
6243
  XMLHelper.add_element(lighting_type, @lighting_type)
5979
6244
  end
6245
+ if not @kwh_per_year.nil?
6246
+ lighting_load = XMLHelper.add_element(lighting_group, 'Load')
6247
+ XMLHelper.add_element(lighting_load, 'Units', UnitsKwhPerYear, :string)
6248
+ XMLHelper.add_element(lighting_load, 'Value', @kwh_per_year, :float, @kwh_per_year_isdefaulted)
6249
+ end
5980
6250
  end
5981
6251
 
5982
6252
  def from_oga(lighting_group)
@@ -5986,6 +6256,7 @@ class HPXML < Object
5986
6256
  @location = XMLHelper.get_value(lighting_group, 'Location', :string)
5987
6257
  @fraction_of_units_in_location = XMLHelper.get_value(lighting_group, 'FractionofUnitsInLocation', :float)
5988
6258
  @lighting_type = XMLHelper.get_child_name(lighting_group, 'LightingType')
6259
+ @kwh_per_year = XMLHelper.get_value(lighting_group, "Load[Units='#{UnitsKwhPerYear}']/Value", :float)
5989
6260
  end
5990
6261
  end
5991
6262
 
@@ -6083,7 +6354,7 @@ class HPXML < Object
6083
6354
  end
6084
6355
 
6085
6356
  class CeilingFan < BaseElement
6086
- ATTRS = [:id, :efficiency, :quantity, :weekday_fractions, :weekend_fractions, :monthly_multipliers]
6357
+ ATTRS = [:id, :efficiency, :count, :weekday_fractions, :weekend_fractions, :monthly_multipliers]
6087
6358
  attr_accessor(*ATTRS)
6088
6359
 
6089
6360
  def delete
@@ -6107,7 +6378,7 @@ class HPXML < Object
6107
6378
  XMLHelper.add_element(airflow, 'FanSpeed', 'medium', :string)
6108
6379
  XMLHelper.add_element(airflow, 'Efficiency', @efficiency, :float, @efficiency_isdefaulted)
6109
6380
  end
6110
- XMLHelper.add_element(ceiling_fan, 'Quantity', @quantity, :integer, @quantity_isdefaulted) unless @quantity.nil?
6381
+ XMLHelper.add_element(ceiling_fan, 'Count', @count, :integer, @count_isdefaulted) unless @count.nil?
6111
6382
  XMLHelper.add_extension(ceiling_fan, 'WeekdayScheduleFractions', @weekday_fractions, :string, @weekday_fractions_isdefaulted) unless @weekday_fractions.nil?
6112
6383
  XMLHelper.add_extension(ceiling_fan, 'WeekendScheduleFractions', @weekend_fractions, :string, @weekend_fractions_isdefaulted) unless @weekend_fractions.nil?
6113
6384
  XMLHelper.add_extension(ceiling_fan, 'MonthlyScheduleMultipliers', @monthly_multipliers, :string, @monthly_multipliers_isdefaulted) unless @monthly_multipliers.nil?
@@ -6116,7 +6387,7 @@ class HPXML < Object
6116
6387
  def from_oga(ceiling_fan)
6117
6388
  @id = HPXML::get_id(ceiling_fan)
6118
6389
  @efficiency = XMLHelper.get_value(ceiling_fan, "Airflow[FanSpeed='medium']/Efficiency", :float)
6119
- @quantity = XMLHelper.get_value(ceiling_fan, 'Quantity', :integer)
6390
+ @count = XMLHelper.get_value(ceiling_fan, 'Count', :integer)
6120
6391
  @weekday_fractions = XMLHelper.get_value(ceiling_fan, 'extension/WeekdayScheduleFractions', :string)
6121
6392
  @weekend_fractions = XMLHelper.get_value(ceiling_fan, 'extension/WeekendScheduleFractions', :string)
6122
6393
  @monthly_multipliers = XMLHelper.get_value(ceiling_fan, 'extension/MonthlyScheduleMultipliers', :string)
@@ -6354,7 +6625,7 @@ class HPXML < Object
6354
6625
  end
6355
6626
 
6356
6627
  class PlugLoad < BaseElement
6357
- ATTRS = [:id, :plug_load_type, :kWh_per_year, :frac_sensible, :frac_latent, :usage_multiplier,
6628
+ ATTRS = [:id, :plug_load_type, :kwh_per_year, :frac_sensible, :frac_latent, :usage_multiplier,
6358
6629
  :weekday_fractions, :weekend_fractions, :monthly_multipliers]
6359
6630
  attr_accessor(*ATTRS)
6360
6631
 
@@ -6375,10 +6646,10 @@ class HPXML < Object
6375
6646
  sys_id = XMLHelper.add_element(plug_load, 'SystemIdentifier')
6376
6647
  XMLHelper.add_attribute(sys_id, 'id', @id)
6377
6648
  XMLHelper.add_element(plug_load, 'PlugLoadType', @plug_load_type, :string) unless @plug_load_type.nil?
6378
- if not @kWh_per_year.nil?
6649
+ if not @kwh_per_year.nil?
6379
6650
  load = XMLHelper.add_element(plug_load, 'Load')
6380
6651
  XMLHelper.add_element(load, 'Units', UnitsKwhPerYear, :string)
6381
- XMLHelper.add_element(load, 'Value', @kWh_per_year, :float, @kWh_per_year_isdefaulted)
6652
+ XMLHelper.add_element(load, 'Value', @kwh_per_year, :float, @kwh_per_year_isdefaulted)
6382
6653
  end
6383
6654
  XMLHelper.add_extension(plug_load, 'FracSensible', @frac_sensible, :float, @frac_sensible_isdefaulted) unless @frac_sensible.nil?
6384
6655
  XMLHelper.add_extension(plug_load, 'FracLatent', @frac_latent, :float, @frac_latent_isdefaulted) unless @frac_latent.nil?
@@ -6391,7 +6662,7 @@ class HPXML < Object
6391
6662
  def from_oga(plug_load)
6392
6663
  @id = HPXML::get_id(plug_load)
6393
6664
  @plug_load_type = XMLHelper.get_value(plug_load, 'PlugLoadType', :string)
6394
- @kWh_per_year = XMLHelper.get_value(plug_load, "Load[Units='#{UnitsKwhPerYear}']/Value", :float)
6665
+ @kwh_per_year = XMLHelper.get_value(plug_load, "Load[Units='#{UnitsKwhPerYear}']/Value", :float)
6395
6666
  @frac_sensible = XMLHelper.get_value(plug_load, 'extension/FracSensible', :float)
6396
6667
  @frac_latent = XMLHelper.get_value(plug_load, 'extension/FracLatent', :float)
6397
6668
  @usage_multiplier = XMLHelper.get_value(plug_load, 'extension/UsageMultiplier', :float)
@@ -6514,7 +6785,7 @@ class HPXML < Object
6514
6785
  surf.class::ATTRS.each do |attribute|
6515
6786
  next if attribute.to_s.end_with? '_isdefaulted'
6516
6787
  next if attrs_to_ignore.include? attribute
6517
- next if (surf_type == :foundation_walls) && (attribute == :azimuth) # Azimuth of foundation walls is irrelevant
6788
+ next if (surf_type == :foundation_walls) && ([:azimuth, :orientation].include? attribute) # Azimuth of foundation walls is irrelevant
6518
6789
  next if surf.send(attribute) == surf2.send(attribute)
6519
6790
 
6520
6791
  match = false
@@ -6552,14 +6823,6 @@ class HPXML < Object
6552
6823
  end
6553
6824
  end
6554
6825
 
6555
- def delete_tiny_surfaces()
6556
- (@rim_joists + @walls + @foundation_walls + @floors + @roofs + @windows + @skylights + @doors + @slabs).reverse_each do |surface|
6557
- next if surface.area.nil? || (surface.area > 1.0)
6558
-
6559
- surface.delete
6560
- end
6561
- end
6562
-
6563
6826
  def delete_adiabatic_subsurfaces()
6564
6827
  @doors.reverse_each do |door|
6565
6828
  next if door.wall.nil?