urbanopt-cli 0.4.1 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/CHANGELOG.md +59 -0
- data/CMakeLists.txt +17 -17
- data/FindOpenStudioSDK.cmake +12 -7
- data/Gemfile +8 -10
- data/LICENSE.md +11 -1
- data/README.md +1 -0
- data/Rakefile +16 -6
- data/example_files/Gemfile +25 -9
- data/example_files/example_project.json +35 -20
- data/example_files/example_project_combined.json +100 -5
- data/example_files/example_project_with_electric_network.json +2116 -0
- data/example_files/mappers/Baseline.rb +111 -51
- data/example_files/mappers/CreateBar.rb +19 -7
- data/example_files/mappers/EvCharging.rb +141 -0
- data/example_files/mappers/Floorspace.rb +29 -17
- data/example_files/mappers/HighEfficiency.rb +20 -8
- data/example_files/mappers/HighEfficiencyCreateBar.rb +19 -8
- data/example_files/mappers/HighEfficiencyFloorspace.rb +19 -8
- data/example_files/mappers/ThermalStorage.rb +16 -6
- data/example_files/mappers/base_workflow.osw +26 -1
- data/example_files/mappers/floorspace_workflow.osw +9 -0
- data/example_files/measures/BuildResidentialModel/measure.rb +249 -134
- data/example_files/reopt/base_assumptions.json +2 -2
- data/example_files/reopt/multiPV_assumptions.json +4 -3
- data/example_files/residential/clothes_dryer.tsv +7 -7
- data/example_files/residential/clothes_washer.tsv +2 -2
- data/example_files/residential/cooling_system.tsv +42 -22
- data/example_files/residential/dishwasher.tsv +1 -1
- data/example_files/residential/exhaust.tsv +3 -0
- data/example_files/residential/heat_pump.tsv +62 -40
- data/example_files/residential/water_heater.tsv +1 -1
- data/example_files/resources/hpxml-measures/.github/pull_request_template.md +14 -0
- data/example_files/resources/hpxml-measures/.github/workflows/config.yml +116 -0
- data/example_files/resources/hpxml-measures/.gitignore +1 -8
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1088 -1329
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +1819 -1383
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +0 -8
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +450 -362
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules.rb +165 -112
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.json +388 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.md +43 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_state_and_monthly_schedule_shift.csv +613 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_state_and_monthly_schedule_shift.csv +613 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-appliances-dehumidifier-ief.osw → base-appliances-dehumidifier-ief-portable.osw} +57 -83
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-appliances-dehumidifier-50percent.osw → base-appliances-dehumidifier-ief-whole-home.osw} +59 -85
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +61 -87
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-baseboard.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-fan-coil.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-mechvent-shared-preconditioning.osw → base-bldgtype-multifamily-shared-mechvent-preconditioning.osw} +70 -95
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-mechvent-shared.osw → base-bldgtype-multifamily-shared-mechvent.osw} +70 -95
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-pv.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-water-heater.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-single-family-attached.osw → base-bldgtype-single-family-attached.osw} +59 -85
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +57 -83
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-elec-uef.osw +338 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-uef.osw +338 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-uef.osw +338 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +56 -83
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-uef.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-uef.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +57 -83
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +57 -83
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +55 -81
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +55 -81
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +55 -81
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +55 -81
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +55 -81
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-heating-only.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +55 -81
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +55 -81
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +55 -81
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +55 -81
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +57 -83
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +57 -83
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-coal-only.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-cooling-only.osw +336 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-heating-only.osw +336 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +56 -84
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.osw +340 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.osw +340 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.osw +340 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-only.osw +338 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-ground-to-air-heat-pump.osw +338 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.osw +338 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-heat-pump-ducted.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.osw +338 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.osw +340 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +57 -83
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +57 -83
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +57 -83
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat-detailed.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +57 -83
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-AMY-2012.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +64 -90
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +69 -95
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-helena-mt.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-honolulu-hi.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-phoenix-az.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-portland-or.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +64 -92
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +57 -83
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust-rated-flow-rate.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +57 -83
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +60 -86
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +60 -86
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-shielding-of-home.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +52 -78
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +52 -78
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-vacancy-6-months.osw → base-schedules-stochastic-vacant.osw} +59 -85
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-user-specified.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +71 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-exterior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-eaves.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-single-exterior-front.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top-double-loaded-interior.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace.osw +341 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-gable.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-hip.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-flat.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-pv-shared.osw → extra-bldgtype-single-family-attached-double-exterior.osw} +62 -89
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-loaded-interior.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-dhw-shared-water-heater.osw → extra-bldgtype-single-family-attached-single-exterior-front.osw} +60 -86
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-middle.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-right.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-middle.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-right.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-multifamily.osw → extra-bldgtype-single-family-attached-unconditioned-basement.osw} +64 -91
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-middle.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-right.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-middle.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-right.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-gable.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-hip.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-atticroof-conditioned.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-windows-shading.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-hot-tub-heater-with-zero-kwh.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-pool-heater-with-zero-kwh.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-schedules-random-seed.osw +338 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heat-pump.osw +336 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heating-system.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heat-pump.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-second-heating-system-fireplace.osw → extra-second-heating-system-fireplace-to-heating-system.osw} +58 -84
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heat-pump.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-second-heating-system-portable-heater.osw → extra-second-heating-system-portable-heater-to-heating-system.osw} +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-clothes-washer-kwh.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-dishwasher-kwh.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-extra-refrigerator-kwh.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-freezer-kwh.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-refrigerator-kwh.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +59 -85
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-one-floor-above-grade.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/foundation-wall-insulation-greater-than-height.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +64 -89
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +64 -89
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +63 -88
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-hvac-programmable-thermostat.osw → invalid_files/multipliers-without-fuel-loads.osw} +54 -80
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-other-plug-loads.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-tv-plug-loads.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-dhw-uef.osw → invalid_files/multipliers-without-vehicle-plug-loads.osw} +58 -84
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-well-pump-plug-loads.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-but-no-primary-heating.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-total-heat-load.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +58 -84
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +58 -84
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-with-shared-system.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +59 -85
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +58 -84
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +56 -82
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/zero-number-of-bedrooms.osw +337 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/vacant.csv +8761 -0
- data/example_files/resources/hpxml-measures/Changelog.md +249 -0
- data/example_files/resources/hpxml-measures/Gemfile +2 -5
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +404 -1357
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +247 -171
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/BaseElements.xsd +11 -101
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +824 -301
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLDataTypes.xsd +18 -35
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLvalidator.xml +526 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +135 -207
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +14 -186
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +549 -93
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +12 -15
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/generator.rb +78 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +413 -15
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +48 -37
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +1627 -1227
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +1192 -434
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +1555 -1616
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +1436 -1479
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +3 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +22 -10
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +85 -19
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +4 -26
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +22 -46
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +22 -21
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +51 -14
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +24 -7
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +2 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +80 -19
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +9 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +106 -75
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +109 -34
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +22 -36
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +1565 -768
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +151 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +101 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +9 -18
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +316 -28
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +53 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +4 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +13 -11
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +4 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +5 -3
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +13 -11
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +102 -62
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +189 -35
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +26 -0
- data/example_files/resources/hpxml-measures/README.md +5 -5
- data/example_files/resources/hpxml-measures/Rakefile +2 -10
- data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +416 -299
- data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.xml +364 -481
- data/example_files/resources/hpxml-measures/SimulationOutputReport/resources/constants.rb +1 -2
- data/example_files/resources/hpxml-measures/SimulationOutputReport/tests/output_report_test.rb +327 -320
- data/example_files/resources/hpxml-measures/docs/source/build_residential_hpxml.rst +3 -3
- data/example_files/resources/hpxml-measures/docs/source/conf.py +11 -5
- data/example_files/resources/hpxml-measures/docs/source/getting_started.rst +6 -6
- data/example_files/resources/hpxml-measures/docs/source/index.rst +2 -2
- data/example_files/resources/hpxml-measures/docs/source/intro.rst +7 -109
- data/example_files/resources/hpxml-measures/docs/source/nstatic/stylesheet.css +13 -1
- data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +2482 -0
- data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +282 -0
- data/example_files/resources/hpxml-measures/tasks.rb +2494 -1248
- data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3-cache.csv +35 -0
- data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3.epw +8768 -0
- data/example_files/resources/hpxml-measures/weather/USA_CO_Denver.Intl.AP.725650_TMY3-cache.csv +10 -10
- data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3-cache.csv +35 -0
- data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3.epw +8768 -0
- data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3-cache.csv +35 -0
- data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3.epw +8768 -0
- data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3-cache.csv +35 -0
- data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3.epw +8768 -0
- data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +96 -21
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +558 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-appliances-dehumidifier-ief.xml → base-appliances-dehumidifier-ief-portable.xml} +8 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-appliances-dehumidifier-50percent.xml → base-appliances-dehumidifier-ief-whole-home.xml} +10 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +535 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +525 -524
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +558 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +564 -565
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +513 -513
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +558 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +558 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +558 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +565 -566
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +633 -634
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +531 -532
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +517 -518
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +565 -566
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-multifamily-buffer-space.xml → base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml} +34 -62
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +554 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-non-freezing-space.xml → base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml} +34 -62
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-heated-space.xml → base-bldgtype-multifamily-adjacent-to-other-heated-space.xml} +34 -62
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-housing-unit.xml → base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml} +34 -62
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +425 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +457 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +427 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +479 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +474 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +408 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +439 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +406 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +409 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +457 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +407 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +438 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +408 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +456 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +451 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +460 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +451 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +466 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-mechvent-shared-multiple.xml → base-bldgtype-multifamily-shared-mechvent-multiple.xml} +43 -415
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +489 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +473 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +465 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +458 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +451 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +448 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +619 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +516 -519
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +516 -519
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +550 -551
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +7 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +563 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +548 -549
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +550 -551
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +550 -551
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +567 -568
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +517 -520
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +517 -520
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +518 -521
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +525 -528
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +517 -520
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +567 -568
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +568 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +566 -567
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +522 -525
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +575 -578
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +497 -497
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +565 -566
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +565 -566
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +565 -566
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +565 -566
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +565 -566
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +577 -578
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +577 -578
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +577 -578
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +570 -571
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +577 -578
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +577 -578
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +563 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +564 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +563 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +565 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +563 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +561 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +564 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +569 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +576 -577
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +561 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +563 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +563 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +561 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +561 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +560 -561
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +561 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +568 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +575 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +560 -561
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +560 -561
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +661 -664
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +575 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +636 -639
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +565 -566
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +561 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +582 -578
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +590 -591
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +601 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +590 -591
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +517 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +2474 -2493
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2475 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +754 -755
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +504 -505
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-windows-interior-shading.xml → base-enclosure-windows-shading.xml} +23 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +498 -497
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +644 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +724 -729
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +685 -688
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +516 -517
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +609 -610
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +558 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +573 -574
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +573 -574
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +573 -574
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +576 -577
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +627 -628
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-autosize.xml → base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml} +8 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize-manual-s-oversize-allowances.xml → base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml} +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +561 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +561 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +561 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +553 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize.xml → base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml} +5 -6
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-manual-s-oversize-allowances.xml +561 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed.xml +558 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-air-to-air-heat-pump-2-speed-manual-s-oversize-allowances.xml} +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize.xml → base-hvac-autosize-air-to-air-heat-pump-2-speed.xml} +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-air-to-air-heat-pump-var-speed-manual-s-oversize-allowances.xml} +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize.xml → base-hvac-autosize-air-to-air-heat-pump-var-speed.xml} +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-elec-only-autosize.xml → base-hvac-autosize-boiler-elec-only.xml} +2 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-gas-central-ac-1-speed-autosize.xml → base-hvac-autosize-boiler-gas-central-ac-1-speed.xml} +4 -6
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-gas-only-autosize.xml → base-hvac-autosize-boiler-gas-only.xml} +2 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-only-1-speed-autosize.xml → base-hvac-autosize-central-ac-only-1-speed.xml} +547 -548
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-only-2-speed-autosize.xml → base-hvac-autosize-central-ac-only-2-speed.xml} +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-only-var-speed-autosize.xml → base-hvac-autosize-central-ac-only-var-speed.xml} +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-plus-air-to-air-heat-pump-heating-autosize.xml → base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml} +570 -571
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed.xml +559 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-dual-fuel-mini-split-heat-pump-ducted-autosize.xml → base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml} +557 -558
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-elec-resistance-only-autosize.xml → base-hvac-autosize-elec-resistance-only.xml} +2 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-evap-cooler-furnace-gas-autosize.xml → base-hvac-autosize-evap-cooler-furnace-gas.xml} +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-floor-furnace-propane-only-autosize.xml → base-hvac-autosize-floor-furnace-propane-only.xml} +5 -6
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-elec-only-autosize.xml → base-hvac-autosize-furnace-elec-only.xml} +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-central-ac-2-speed-autosize.xml → base-hvac-autosize-furnace-gas-central-ac-2-speed.xml} +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-central-ac-var-speed-autosize.xml → base-hvac-autosize-furnace-gas-central-ac-var-speed.xml} +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-only-autosize.xml → base-hvac-autosize-furnace-gas-only.xml} +4 -6
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-room-ac-autosize.xml → base-hvac-autosize-furnace-gas-room-ac.xml} +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +555 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +560 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-ground-to-air-heat-pump-manual-s-oversize-allowances.xml} +4 -6
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize.xml → base-hvac-autosize-ground-to-air-heat-pump.xml} +4 -6
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +547 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-cooling-only-autosize.xml → base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml} +551 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-heating-only-autosize.xml → base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml} +556 -557
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-manual-s-oversize-allowances.xml +560 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize.xml → base-hvac-autosize-mini-split-heat-pump-ducted.xml} +556 -557
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-room-ac-only-autosize.xml → base-hvac-autosize-room-ac-only.xml} +2 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-stove-oil-only-autosize.xml → base-hvac-autosize-stove-oil-only.xml} +5 -6
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-wall-furnace-elec-only-autosize.xml → base-hvac-autosize-wall-furnace-elec-only.xml} +5 -6
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-autosize.xml → base-hvac-autosize.xml} +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +518 -521
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +518 -521
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +571 -573
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +519 -522
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +518 -521
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +518 -521
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +518 -521
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +548 -549
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +548 -549
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +548 -549
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +575 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +532 -535
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +561 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +509 -512
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +555 -555
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +536 -528
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +503 -505
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +6 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +6 -57
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +6 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +549 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +548 -549
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +5 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +560 -561
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +548 -549
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +548 -549
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +548 -549
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +576 -579
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +557 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +7 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-flowrate.xml → base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.xml} +8 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/heat-pump-mixed-fixed-and-autosize-capacities2.xml → base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.xml} +13 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.xml +567 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.xml +567 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.xml +572 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.xml +572 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.xml +572 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-only.xml +553 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-ground-to-air-heat-pump.xml +566 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-air-conditioner-only-ducted-autosize.xml → base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.xml} +10 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize-manual-s-oversize-allowances.xml → base-hvac-install-quality-all-mini-split-heat-pump-ducted.xml} +13 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-blower-efficiency-furnace-gas-central-ac-1-speed.xml +569 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-misc-shelter-coefficient.xml → base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.xml} +9 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.xml +570 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +547 -548
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +508 -511
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +554 -555
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +560 -561
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +560 -561
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +515 -518
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +21 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +486 -489
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +6 -57
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat-detailed.xml +567 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +570 -571
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +508 -511
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +508 -511
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +6 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +6 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +565 -566
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +6 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +573 -574
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-detailed.xml +585 -586
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +488 -489
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +573 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +516 -517
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +573 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +517 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +516 -517
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +517 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +577 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +574 -575
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +590 -591
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +545 -548
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +549 -541
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +575 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +576 -577
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +576 -577
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +574 -575
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +574 -575
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +575 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +575 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +796 -795
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +574 -575
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +572 -573
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +478 -495
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +579 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +758 -833
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +749 -820
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +550 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +575 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-calendar-year.xml → base-misc-shielding-of-home.xml} +7 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +728 -725
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1657 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +6 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic-vacant.xml +564 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +6 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +6 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +563 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +569 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +565 -566
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +566 -567
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/boiler-invalid-afue.xml +519 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cfis-with-hydronic-distribution.xml +532 -535
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-fraction-served.xml +535 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-setpoints.xml +535 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +575 -578
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-uef.xml → invalid_files/dhw-invalid-ef-tank.xml} +7 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-uef-tank-heat-pump.xml +564 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-cfm25.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-percent.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +546 -547
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +543 -544
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +546 -545
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa2.xml +448 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +613 -616
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-roof-ceiling.xml +626 -629
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +610 -611
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +550 -551
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +472 -473
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +488 -534
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-fuel-load.xml +760 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-plug-load.xml +759 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-fuel-load.xml +761 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-plug-load.xml +759 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/furnace-invalid-afue.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-number-of-bedrooms-served.xml +460 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-output-greater-than-consumption.xml +579 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +559 -560
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +21 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +21 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml +528 -534
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +546 -549
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +546 -549
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +21 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-inconsistent-fan-powers.xml +569 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml +570 -571
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-shared-negative-seer-eq.xml +407 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-assembly-effective-rvalue.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-boolean.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-float.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-integer.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +569 -567
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-equipment.xml +466 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-surfaces.xml +644 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/{appliances-location-unconditioned-space.xml → invalid-foundation-wall-properties.xml} +39 -29
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id.xml +591 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id2.xml +591 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-infiltration-volume.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-input-parameters.xml +565 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +575 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-bedrooms-served.xml +465 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/{slab-zero-exposed-perimeter.xml → invalid-number-of-conditioned-floors.xml} +7 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-units-served.xml +451 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +550 -551
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml +517 -520
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +564 -565
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-schema-version.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-shared-vent-in-unit-flowrate.xml +473 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +582 -578
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +21 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +560 -561
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-surface.xml +575 -566
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-without-building-id.xml +1657 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-wrong-building-id.xml +1657 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-cooling-systems.xml +432 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-heating-systems.xml +434 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +590 -591
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/num-bedrooms-exceeds-limit.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +546 -547
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +568 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +568 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +563 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +526 -529
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-fraction-one.xml +571 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +531 -534
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +565 -566
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +531 -534
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +575 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +465 -827
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +465 -827
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +590 -591
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml +577 -578
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +562 -563
- data/example_files/resources/hpxml-measures/workflow/template.osw +5 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +6 -17
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +6 -19
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +6 -19
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +6 -19
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +6 -19
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +294 -0
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +27 -0
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +294 -0
- data/example_files/resources/hpxml-measures/workflow/tests/compare.rb +130 -0
- data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +522 -527
- data/example_files/{measures/BuildResidentialModel/resources → resources}/measure-info.json +0 -0
- data/example_files/{measures/BuildResidentialModel/resources → resources}/meta_measure.rb +53 -44
- data/example_files/validation_schema.yaml +149 -0
- data/example_files/visualization/input_visualization_feature.html +213 -56
- data/example_files/visualization/input_visualization_scenario.html +92 -30
- data/lib/uo_cli.rb +406 -128
- data/lib/uo_cli/version.rb +17 -7
- data/requirements.txt +2 -0
- data/scripts/setup-env-gitbash.sh +5 -5
- data/scripts/setup-env-unix.sh +4 -4
- data/scripts/setup-env.bat +14 -11
- data/scripts/setup-env.ps1 +13 -10
- data/uo_cli.gemspec +10 -8
- metadata +390 -130
- data/developer_nrel_key.rb +0 -31
- data/example_files/measures/ResidentialGeometryCreateMultifamily/measure.rb +0 -1005
- data/example_files/measures/ResidentialGeometryCreateMultifamily/measure.xml +0 -326
- data/example_files/measures/ResidentialGeometryCreateMultifamily/tests/create_residential_multifamily_geometry_test.rb +0 -477
- data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/measure.rb +0 -1039
- data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/measure.xml +0 -393
- data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/tests/create_residential_single_family_attached_geometry_test.rb +0 -456
- data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/measure.rb +0 -979
- data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/measure.xml +0 -388
- data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/tests/create_residential_single_family_detached_geometry_test.rb +0 -704
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/location.rb +0 -24
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.yml +0 -61
- data/example_files/resources/hpxml-measures/docs/source/hpxml_to_openstudio.rst +0 -1386
- data/example_files/resources/hpxml-measures/docs/source/simulation_output_report.rst +0 -252
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-laundry-room.xml +0 -828
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-water-heater-recirc.xml +0 -820
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-water-heater.xml +0 -813
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-attached-multifamily.xml +0 -810
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-common-surfaces.xml +0 -928
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ideal-air.xml +0 -501
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple2.xml +0 -838
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-baseboard.xml +0 -777
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-fan-coil-ducted.xml +0 -808
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-fan-coil.xml +0 -780
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-water-loop-heat-pump.xml +0 -820
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-cooling-tower-water-loop-heat-pump.xml +0 -815
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-baseboard.xml +0 -760
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil-ducted.xml +0 -790
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil-eae.xml +0 -759
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil.xml +0 -762
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-water-loop-heat-pump.xml +0 -796
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-baseboard.xml +0 -759
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-fan-coil-ducted.xml +0 -789
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-fan-coil.xml +0 -761
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-water-loop-heat-pump.xml +0 -796
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-cooling-tower-only-water-loop-heat-pump.xml +0 -791
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-ground-loop-ground-to-air-heat-pump.xml +0 -814
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared-preconditioning.xml +0 -851
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared.xml +0 -835
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-shared.xml +0 -827
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/coal-for-non-boiler-heating.xml +0 -514
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type.xml +0 -828
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-interior-shading.xml +0 -564
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative '../../HPXMLtoOpenStudio/resources/minitest_helper'
|
|
4
4
|
require 'openstudio'
|
|
5
|
-
require 'openstudio/ruleset/ShowRunnerOutput'
|
|
6
|
-
require 'minitest/autorun'
|
|
7
5
|
require 'fileutils'
|
|
6
|
+
require 'parallel'
|
|
8
7
|
require_relative '../../HPXMLtoOpenStudio/measure.rb'
|
|
9
8
|
require_relative '../../HPXMLtoOpenStudio/resources/constants'
|
|
10
9
|
require_relative '../../HPXMLtoOpenStudio/resources/meta_measure'
|
|
@@ -12,61 +11,74 @@ require_relative '../../HPXMLtoOpenStudio/resources/unit_conversions'
|
|
|
12
11
|
require_relative '../../HPXMLtoOpenStudio/resources/xmlhelper'
|
|
13
12
|
|
|
14
13
|
class HPXMLTest < MiniTest::Test
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
def setup
|
|
15
|
+
@this_dir = File.dirname(__FILE__)
|
|
16
|
+
@results_dir = File.join(@this_dir, 'results')
|
|
17
|
+
FileUtils.mkdir_p @results_dir
|
|
18
|
+
end
|
|
20
19
|
|
|
21
20
|
def test_simulations
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
results_out = File.join(@results_dir, 'results.csv')
|
|
22
|
+
File.delete(results_out) if File.exist? results_out
|
|
23
|
+
sizing_out = File.join(@results_dir, 'results_hvac_sizing.csv')
|
|
24
|
+
File.delete(sizing_out) if File.exist? sizing_out
|
|
25
|
+
|
|
26
|
+
xmls = []
|
|
27
|
+
sample_files_dir = File.absolute_path(File.join(@this_dir, '..', 'sample_files'))
|
|
28
|
+
Dir["#{sample_files_dir}/*.xml"].sort.each do |xml|
|
|
29
|
+
xmls << File.absolute_path(xml)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Test simulations
|
|
33
|
+
puts "Running #{xmls.size} HPXML files..."
|
|
34
|
+
all_results = {}
|
|
35
|
+
all_sizing_results = {}
|
|
36
|
+
Parallel.map(xmls, in_threads: Parallel.processor_count) do |xml|
|
|
37
|
+
xml_name = File.basename(xml)
|
|
38
|
+
all_results[xml_name], all_sizing_results[xml_name] = _run_xml(xml, Parallel.worker_number)
|
|
39
|
+
end
|
|
25
40
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
41
|
+
_write_summary_results(all_results.sort_by { |k, v| k.downcase }.to_h, results_out)
|
|
42
|
+
_write_hvac_sizing_results(all_sizing_results.sort_by { |k, v| k.downcase }.to_h, sizing_out)
|
|
43
|
+
end
|
|
29
44
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
45
|
+
def test_ashrae_140
|
|
46
|
+
ashrae140_out = File.join(@results_dir, 'results_ashrae_140.csv')
|
|
47
|
+
File.delete(ashrae140_out) if File.exist? ashrae140_out
|
|
33
48
|
|
|
34
49
|
xmls = []
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
end
|
|
50
|
+
ashrae_140_dir = File.absolute_path(File.join(@this_dir, 'ASHRAE_Standard_140'))
|
|
51
|
+
Dir["#{ashrae_140_dir}/*.xml"].sort.each do |xml|
|
|
52
|
+
xmls << File.absolute_path(xml)
|
|
39
53
|
end
|
|
40
54
|
|
|
41
55
|
# Test simulations
|
|
42
56
|
puts "Running #{xmls.size} HPXML files..."
|
|
43
57
|
all_results = {}
|
|
44
58
|
all_sizing_results = {}
|
|
45
|
-
xmls.
|
|
46
|
-
|
|
59
|
+
Parallel.map(xmls, in_threads: Parallel.processor_count) do |xml|
|
|
60
|
+
xml_name = File.basename(xml)
|
|
61
|
+
all_results[xml_name], all_sizing_results[xml_name] = _run_xml(xml, Parallel.worker_number)
|
|
47
62
|
end
|
|
48
63
|
|
|
49
|
-
|
|
50
|
-
_write_summary_results(results_dir, all_results)
|
|
51
|
-
_write_hvac_sizing_results(results_dir, all_sizing_results)
|
|
52
|
-
_write_and_check_ashrae_140_results(results_dir, all_results, ashrae_140_dir)
|
|
64
|
+
_write_ashrae_140_results(all_results.sort_by { |k, v| k.downcase }.to_h, ashrae140_out)
|
|
53
65
|
end
|
|
54
66
|
|
|
55
|
-
def
|
|
56
|
-
# Check that simulation
|
|
67
|
+
def test_run_simulation_json_output
|
|
68
|
+
# Check that the simulation produces JSON outputs (instead of CSV outputs) if requested
|
|
57
69
|
os_cli = OpenStudio.getOpenStudioCLI
|
|
58
70
|
rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
|
|
59
71
|
xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
|
|
60
|
-
command = "#{os_cli} #{rb_path} -x #{xml} --debug --hourly ALL"
|
|
72
|
+
command = "#{os_cli} #{rb_path} -x #{xml} --debug --hourly ALL --output-format json"
|
|
61
73
|
system(command, err: File::NULL)
|
|
62
74
|
|
|
63
75
|
# Check for output files
|
|
64
76
|
sql_path = File.join(File.dirname(xml), 'run', 'eplusout.sql')
|
|
65
77
|
assert(File.exist? sql_path)
|
|
66
|
-
|
|
67
|
-
assert(File.exist?
|
|
68
|
-
|
|
69
|
-
assert(File.exist?
|
|
78
|
+
json_output_path = File.join(File.dirname(xml), 'run', 'results_annual.json')
|
|
79
|
+
assert(File.exist? json_output_path)
|
|
80
|
+
json_output_path = File.join(File.dirname(xml), 'run', 'results_timeseries.json')
|
|
81
|
+
assert(File.exist? json_output_path)
|
|
70
82
|
|
|
71
83
|
# Check for debug files
|
|
72
84
|
osm_path = File.join(File.dirname(xml), 'run', 'in.osm')
|
|
@@ -75,6 +87,68 @@ class HPXMLTest < MiniTest::Test
|
|
|
75
87
|
assert(File.exist? hpxml_defaults_path)
|
|
76
88
|
end
|
|
77
89
|
|
|
90
|
+
def test_run_simulation_epjson_input
|
|
91
|
+
# Check that we can run a simulation using epJSON (instead of IDF) if requested
|
|
92
|
+
os_cli = OpenStudio.getOpenStudioCLI
|
|
93
|
+
rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
|
|
94
|
+
xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
|
|
95
|
+
command = "#{os_cli} #{rb_path} -x #{xml} --ep-input-format epjson"
|
|
96
|
+
system(command, err: File::NULL)
|
|
97
|
+
|
|
98
|
+
# Check for epjson file
|
|
99
|
+
epjson = File.join(File.dirname(xml), 'run', 'in.epJSON')
|
|
100
|
+
assert(File.exist? epjson)
|
|
101
|
+
|
|
102
|
+
# Check for output files
|
|
103
|
+
sql_path = File.join(File.dirname(xml), 'run', 'eplusout.sql')
|
|
104
|
+
assert(File.exist? sql_path)
|
|
105
|
+
csv_output_path = File.join(File.dirname(xml), 'run', 'results_annual.csv')
|
|
106
|
+
assert(File.exist? csv_output_path)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def test_run_simulation_idf_input
|
|
110
|
+
# Check that we can run a simulation using IDF (instead of epJSON) if requested
|
|
111
|
+
os_cli = OpenStudio.getOpenStudioCLI
|
|
112
|
+
rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
|
|
113
|
+
xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
|
|
114
|
+
command = "#{os_cli} #{rb_path} -x #{xml} --ep-input-format idf"
|
|
115
|
+
system(command, err: File::NULL)
|
|
116
|
+
|
|
117
|
+
# Check for idf file
|
|
118
|
+
idf = File.join(File.dirname(xml), 'run', 'in.idf')
|
|
119
|
+
assert(File.exist? idf)
|
|
120
|
+
|
|
121
|
+
# Check for output files
|
|
122
|
+
sql_path = File.join(File.dirname(xml), 'run', 'eplusout.sql')
|
|
123
|
+
assert(File.exist? sql_path)
|
|
124
|
+
csv_output_path = File.join(File.dirname(xml), 'run', 'results_annual.csv')
|
|
125
|
+
assert(File.exist? csv_output_path)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def test_run_simulation_faster_performance
|
|
129
|
+
# Run w/ --skip-validation and w/o --add-component-loads arguments
|
|
130
|
+
os_cli = OpenStudio.getOpenStudioCLI
|
|
131
|
+
rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
|
|
132
|
+
xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
|
|
133
|
+
command = "#{os_cli} #{rb_path} -x #{xml} --skip-validation"
|
|
134
|
+
system(command, err: File::NULL)
|
|
135
|
+
|
|
136
|
+
# Check for output files
|
|
137
|
+
sql_path = File.join(File.dirname(xml), 'run', 'eplusout.sql')
|
|
138
|
+
assert(File.exist? sql_path)
|
|
139
|
+
csv_output_path = File.join(File.dirname(xml), 'run', 'results_annual.csv')
|
|
140
|
+
assert(File.exist? csv_output_path)
|
|
141
|
+
|
|
142
|
+
# Check component loads don't exist
|
|
143
|
+
component_loads = {}
|
|
144
|
+
CSV.read(csv_output_path, headers: false).each do |data|
|
|
145
|
+
next unless data[0].to_s.start_with? 'Component Load'
|
|
146
|
+
|
|
147
|
+
component_loads[data[0]] = Float(data[1])
|
|
148
|
+
end
|
|
149
|
+
assert_equal(0, component_loads.size)
|
|
150
|
+
end
|
|
151
|
+
|
|
78
152
|
def test_template_osw
|
|
79
153
|
# Check that simulation works using template.osw
|
|
80
154
|
require 'json'
|
|
@@ -119,44 +193,52 @@ class HPXMLTest < MiniTest::Test
|
|
|
119
193
|
end
|
|
120
194
|
|
|
121
195
|
def test_weather_cache
|
|
122
|
-
|
|
123
|
-
cache_orig = File.join(this_dir, '..', '..', 'weather', 'USA_CO_Denver.Intl.AP.725650_TMY3-cache.csv')
|
|
196
|
+
cache_orig = File.join(@this_dir, '..', '..', 'weather', 'USA_CO_Denver.Intl.AP.725650_TMY3-cache.csv')
|
|
124
197
|
cache_bak = cache_orig + '.bak'
|
|
125
198
|
File.rename(cache_orig, cache_bak)
|
|
126
|
-
_run_xml(File.absolute_path(File.join(this_dir, '..', 'sample_files', 'base.xml'))
|
|
199
|
+
_run_xml(File.absolute_path(File.join(@this_dir, '..', 'sample_files', 'base.xml')))
|
|
127
200
|
File.rename(cache_bak, cache_orig) # Put original file back
|
|
128
201
|
end
|
|
129
202
|
|
|
130
203
|
def test_invalid
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
expected_error_msgs = { 'appliances-location-unconditioned-space.xml' => ['Expected 1 element(s) for xpath: /HPXML/Building/BuildingDetails/Appliances/ClothesWasher: [not(Location)] |',
|
|
135
|
-
'Expected 1 element(s) for xpath: /HPXML/Building/BuildingDetails/Appliances/ClothesDryer: [not(Location)] |',
|
|
136
|
-
'Expected 1 element(s) for xpath: /HPXML/Building/BuildingDetails/Appliances/Dishwasher: [not(Location)] |',
|
|
137
|
-
'Expected 1 element(s) for xpath: /HPXML/Building/BuildingDetails/Appliances/Refrigerator: [not(Location)] |',
|
|
138
|
-
'Expected 1 element(s) for xpath: /HPXML/Building/BuildingDetails/Appliances/CookingRange: [not(Location)] |'],
|
|
204
|
+
sample_files_dir = File.join(@this_dir, '..', 'sample_files')
|
|
205
|
+
|
|
206
|
+
expected_error_msgs = { 'boiler-invalid-afue.xml' => ['Expected AnnualHeatingEfficiency[Units="AFUE"]/Value to be less than or equal to 1'],
|
|
139
207
|
'cfis-with-hydronic-distribution.xml' => ["Attached HVAC distribution system 'HVACDistribution' cannot be hydronic for ventilation fan 'MechanicalVentilation'."],
|
|
140
|
-
'clothes-dryer-location.xml' => [
|
|
141
|
-
'clothes-washer-location.xml' => [
|
|
142
|
-
'
|
|
143
|
-
'
|
|
144
|
-
'
|
|
208
|
+
'clothes-dryer-location.xml' => ['A location is specified as "garage" but no surfaces were found adjacent to this space type.'],
|
|
209
|
+
'clothes-washer-location.xml' => ['A location is specified as "garage" but no surfaces were found adjacent to this space type.'],
|
|
210
|
+
'cooking-range-location.xml' => ['A location is specified as "garage" but no surfaces were found adjacent to this space type.'],
|
|
211
|
+
'dehumidifier-fraction-served.xml' => ['Expected FractionDehumidificationLoadServed to sum to <= 1, but calculated sum is 1.1.'],
|
|
212
|
+
'dehumidifier-setpoints.xml' => ['All dehumidifiers must have the same setpoint but multiple setpoints were specified.'],
|
|
213
|
+
'dishwasher-location.xml' => ['A location is specified as "garage" but no surfaces were found adjacent to this space type.'],
|
|
145
214
|
'dhw-frac-load-served.xml' => ['Expected FractionDHWLoadServed to sum to 1, but calculated sum is 1.15.'],
|
|
146
|
-
'
|
|
147
|
-
'
|
|
148
|
-
'
|
|
149
|
-
'
|
|
150
|
-
'
|
|
151
|
-
'
|
|
152
|
-
'
|
|
153
|
-
'enclosure-
|
|
154
|
-
'enclosure-
|
|
155
|
-
'enclosure-
|
|
156
|
-
'enclosure-
|
|
157
|
-
'enclosure-
|
|
158
|
-
'
|
|
159
|
-
'
|
|
215
|
+
'dhw-invalid-ef-tank.xml' => ['Expected EnergyFactor to be less than 1 [context: /HPXML/Building/BuildingDetails/Systems/WaterHeating/WaterHeatingSystem[WaterHeaterType="storage water heater"]]'],
|
|
216
|
+
'dhw-invalid-uef-tank-heat-pump.xml' => ['Expected UniformEnergyFactor to be greater than 1 [context: /HPXML/Building/BuildingDetails/Systems/WaterHeating/WaterHeatingSystem[WaterHeaterType="heat pump water heater"]]'],
|
|
217
|
+
'duct-leakage-cfm25.xml' => ['Expected Value to be greater than or equal to 0 [context: /HPXML/Building/BuildingDetails/Systems/HVAC/HVACDistribution/DistributionSystemType/AirDistribution/DuctLeakageMeasurement/DuctLeakage[Units="CFM25"]]'],
|
|
218
|
+
'duct-leakage-percent.xml' => ['Expected Value to be less than 1 [context: /HPXML/Building/BuildingDetails/Systems/HVAC/HVACDistribution/DistributionSystemType/AirDistribution/DuctLeakageMeasurement/DuctLeakage[Units="Percent"]]'],
|
|
219
|
+
'duct-location.xml' => ['A location is specified as "garage" but no surfaces were found adjacent to this space type.'],
|
|
220
|
+
'duct-location-unconditioned-space.xml' => ["Expected DuctLocation to be 'living space' or 'basement - conditioned' or 'basement - unconditioned' or 'crawlspace - vented' or 'crawlspace - unvented' or 'attic - vented' or 'attic - unvented' or 'garage' or 'exterior wall' or 'under slab' or 'roof deck' or 'outside' or 'other housing unit' or 'other heated space' or 'other multifamily buffer space' or 'other non-freezing space' [context: /HPXML/Building/BuildingDetails/Systems/HVAC/HVACDistribution/DistributionSystemType/AirDistribution/Ducts]"],
|
|
221
|
+
'duplicate-id.xml' => ["Duplicate SystemIdentifier IDs detected for 'WindowNorth'."],
|
|
222
|
+
'enclosure-attic-missing-roof.xml' => ['There must be at least one roof adjacent to "attic - unvented". [context: /HPXML/Building/BuildingDetails/Enclosure[*/*[InteriorAdjacentTo="attic - unvented" or ExteriorAdjacentTo="attic - unvented"]]]'],
|
|
223
|
+
'enclosure-basement-missing-exterior-foundation-wall.xml' => ['There must be at least one exterior foundation wall adjacent to "basement - unconditioned". [context: /HPXML/Building/BuildingDetails/Enclosure[*/*[InteriorAdjacentTo="basement - unconditioned" or ExteriorAdjacentTo="basement - unconditioned"]]]'],
|
|
224
|
+
'enclosure-basement-missing-slab.xml' => ['There must be at least one slab adjacent to "basement - unconditioned". [context: /HPXML/Building/BuildingDetails/Enclosure[*/*[InteriorAdjacentTo="basement - unconditioned" or ExteriorAdjacentTo="basement - unconditioned"]]]'],
|
|
225
|
+
'enclosure-floor-area-exceeds-cfa.xml' => ['Expected ConditionedFloorArea to be greater than or equal to the sum of conditioned slab/floor areas. [context: /HPXML/Building/BuildingDetails/BuildingSummary/BuildingConstruction]'],
|
|
226
|
+
'enclosure-floor-area-exceeds-cfa2.xml' => ['Expected ConditionedFloorArea to be greater than or equal to the sum of conditioned slab/floor areas. [context: /HPXML/Building/BuildingDetails/BuildingSummary/BuildingConstruction]'],
|
|
227
|
+
'enclosure-garage-missing-exterior-wall.xml' => ['There must be at least one exterior wall/foundation wall adjacent to "garage". [context: /HPXML/Building/BuildingDetails/Enclosure[*/*[InteriorAdjacentTo="garage" or ExteriorAdjacentTo="garage"]]]'],
|
|
228
|
+
'enclosure-garage-missing-roof-ceiling.xml' => ['There must be at least one roof/ceiling adjacent to "garage". [context: /HPXML/Building/BuildingDetails/Enclosure[*/*[InteriorAdjacentTo="garage" or ExteriorAdjacentTo="garage"]]]'],
|
|
229
|
+
'enclosure-garage-missing-slab.xml' => ['There must be at least one slab adjacent to "garage". [context: /HPXML/Building/BuildingDetails/Enclosure[*/*[InteriorAdjacentTo="garage" or ExteriorAdjacentTo="garage"]]]'],
|
|
230
|
+
'enclosure-living-missing-ceiling-roof.xml' => ['There must be at least one ceiling/roof adjacent to conditioned space. [context: /HPXML/Building/BuildingDetails/Enclosure[*/*[InteriorAdjacentTo="living space"]]]',
|
|
231
|
+
'There must be at least one floor adjacent to "attic - unvented". [context: /HPXML/Building/BuildingDetails/Enclosure[*/*[InteriorAdjacentTo="attic - unvented" or ExteriorAdjacentTo="attic - unvented"]]]'],
|
|
232
|
+
'enclosure-living-missing-exterior-wall.xml' => ['There must be at least one exterior wall adjacent to conditioned space. [context: /HPXML/Building/BuildingDetails/Enclosure[*/*[InteriorAdjacentTo="living space"]]]'],
|
|
233
|
+
'enclosure-living-missing-floor-slab.xml' => ['There must be at least one floor/slab adjacent to conditioned space. [context: /HPXML/Building/BuildingDetails/Enclosure[*/*[InteriorAdjacentTo="living space"]]]'],
|
|
234
|
+
'frac-sensible-plug-load.xml' => ['Expected extension/FracSensible to be greater than or equal to 0 [context: /HPXML/Building/BuildingDetails/MiscLoads/PlugLoad[PlugLoadType="other" or PlugLoadType="TV other" or PlugLoadType="electric vehicle charging" or PlugLoadType="well pump"]]'],
|
|
235
|
+
'frac-total-plug-load.xml' => ['Expected sum of extension/FracSensible and extension/FracLatent to be less than or equal to 1 [context: /HPXML/Building/BuildingDetails/MiscLoads/PlugLoad[PlugLoadType="other" or PlugLoadType="TV other" or PlugLoadType="electric vehicle charging" or PlugLoadType="well pump"]]'],
|
|
236
|
+
'frac-sensible-fuel-load.xml' => ['Expected extension/FracSensible to be greater than or equal to 0 [context: /HPXML/Building/BuildingDetails/MiscLoads/FuelLoad[FuelLoadType="grill" or FuelLoadType="lighting" or FuelLoadType="fireplace"]]'],
|
|
237
|
+
'frac-total-fuel-load.xml' => ['Expected sum of extension/FracSensible and extension/FracLatent to be less than or equal to 1 [context: /HPXML/Building/BuildingDetails/MiscLoads/FuelLoad[FuelLoadType="grill" or FuelLoadType="lighting" or FuelLoadType="fireplace"]]'],
|
|
238
|
+
'furnace-invalid-afue.xml' => ['Expected AnnualHeatingEfficiency[Units="AFUE"]/Value to be less than or equal to 1'],
|
|
239
|
+
'generator-output-greater-than-consumption.xml' => ['Expected AnnualConsumptionkBtu to be greater than AnnualOutputkWh*3412 [context: /HPXML/Building/BuildingDetails/Systems/extension/Generators/Generator]'],
|
|
240
|
+
'generator-number-of-bedrooms-served.xml' => ['Expected NumberofBedroomsServed to be greater than ../../../../BuildingSummary/BuildingConstruction/NumberofBedrooms [context: /HPXML/Building/BuildingDetails/Systems/extension/Generators/Generator[IsSharedSystem="true"]]'],
|
|
241
|
+
'heat-pump-mixed-fixed-and-autosize-capacities.xml' => ['Expected 0 or 2 element(s) for xpath: HeatingCapacity | BackupHeatingCapacity [context: /HPXML/Building/BuildingDetails/Systems/HVAC/HVACPlant/HeatPump[BackupSystemFuel]]'],
|
|
160
242
|
'hvac-invalid-distribution-system-type.xml' => ["Incorrect HVAC distribution system type for HVAC type: 'Furnace'. Should be one of: ["],
|
|
161
243
|
'hvac-distribution-multiple-attached-cooling.xml' => ["Multiple cooling systems found attached to distribution system 'HVACDistribution2'."],
|
|
162
244
|
'hvac-distribution-multiple-attached-heating.xml' => ["Multiple heating systems found attached to distribution system 'HVACDistribution'."],
|
|
@@ -164,43 +246,72 @@ class HPXMLTest < MiniTest::Test
|
|
|
164
246
|
'hvac-dse-multiple-attached-heating.xml' => ["Multiple heating systems found attached to distribution system 'HVACDistribution'."],
|
|
165
247
|
'hvac-frac-load-served.xml' => ['Expected FractionCoolLoadServed to sum to <= 1, but calculated sum is 1.2.',
|
|
166
248
|
'Expected FractionHeatLoadServed to sum to <= 1, but calculated sum is 1.1.'],
|
|
167
|
-
'hvac-distribution-return-duct-leakage-missing.xml' => [
|
|
168
|
-
'
|
|
249
|
+
'hvac-distribution-return-duct-leakage-missing.xml' => ['Expected 1 element(s) for xpath: DuctLeakageMeasurement[DuctType="return"]/DuctLeakage[(Units="CFM25" or Units="Percent") and TotalOrToOutside="to outside"] [context: /HPXML/Building/BuildingDetails/Systems/HVAC/HVACDistribution/DistributionSystemType/AirDistribution[AirDistributionType[text()="regular velocity" or text()="gravity"]]]'],
|
|
250
|
+
'hvac-inconsistent-fan-powers.xml' => ["Fan powers for heating system 'HeatingSystem' and cooling system 'CoolingSystem' are attached to a single distribution system and therefore must be the same."],
|
|
251
|
+
'hvac-shared-negative-seer-eq.xml' => ["Negative SEER equivalent calculated for cooling system 'CoolingSystem', double check inputs."],
|
|
252
|
+
'invalid-assembly-effective-rvalue.xml' => ['Expected Insulation/AssemblyEffectiveRValue to be greater than 0 [context: /HPXML/Building/BuildingDetails/Enclosure/Walls/Wall]'],
|
|
253
|
+
'invalid-datatype-boolean.xml' => ["Cannot convert 'FOOBAR' to boolean for Roof/RadiantBarrier."],
|
|
254
|
+
'invalid-datatype-integer.xml' => ["Cannot convert '2.5' to integer for BuildingConstruction/NumberofBedrooms."],
|
|
255
|
+
'invalid-datatype-float.xml' => ["Cannot convert 'FOOBAR' to float for Slab/extension/CarpetFraction."],
|
|
256
|
+
'invalid-daylight-saving.xml' => ['Daylight Saving End Day of Month (31) must be one of: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30.'],
|
|
169
257
|
'invalid-distribution-cfa-served.xml' => ['The total conditioned floor area served by the HVAC distribution system(s) for heating is larger than the conditioned floor area of the building.',
|
|
170
258
|
'The total conditioned floor area served by the HVAC distribution system(s) for cooling is larger than the conditioned floor area of the building.'],
|
|
171
259
|
'invalid-epw-filepath.xml' => ["foo.epw' could not be found."],
|
|
172
|
-
'invalid-facility-type.xml' => ['Expected 1 element(s) for xpath:
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
260
|
+
'invalid-facility-type-equipment.xml' => ['Expected 1 element(s) for xpath: ../../../BuildingSummary/BuildingConstruction[ResidentialFacilityType[text()="single-family attached" or text()="apartment unit"]] [context: /HPXML/Building/BuildingDetails/Systems/WaterHeating/WaterHeatingSystem[IsSharedSystem="true"]]',
|
|
261
|
+
'Expected 1 element(s) for xpath: ../../BuildingSummary/BuildingConstruction[ResidentialFacilityType[text()="single-family attached" or text()="apartment unit"]] [context: /HPXML/Building/BuildingDetails/Appliances/ClothesWasher[IsSharedAppliance="true"]]',
|
|
262
|
+
'Expected 1 element(s) for xpath: ../../BuildingSummary/BuildingConstruction[ResidentialFacilityType[text()="single-family attached" or text()="apartment unit"]] [context: /HPXML/Building/BuildingDetails/Appliances/ClothesDryer[IsSharedAppliance="true"]]',
|
|
263
|
+
'Expected 1 element(s) for xpath: ../../BuildingSummary/BuildingConstruction[ResidentialFacilityType[text()="single-family attached" or text()="apartment unit"]] [context: /HPXML/Building/BuildingDetails/Appliances/Dishwasher[IsSharedAppliance="true"]]'],
|
|
264
|
+
'invalid-facility-type-surfaces.xml' => ["The building is of type 'single-family detached' but the surface 'RimJoistOther' is adjacent to Attached/Multifamily space 'other housing unit'.",
|
|
265
|
+
"The building is of type 'single-family detached' but the surface 'WallOther' is adjacent to Attached/Multifamily space 'other housing unit'.",
|
|
266
|
+
"The building is of type 'single-family detached' but the surface 'FoundationWallOther' is adjacent to Attached/Multifamily space 'other housing unit'.",
|
|
267
|
+
"The building is of type 'single-family detached' but the surface 'FloorOther' is adjacent to Attached/Multifamily space 'other housing unit'.",
|
|
268
|
+
"The building is of type 'single-family detached' but the surface 'CeilingOther' is adjacent to Attached/Multifamily space 'other housing unit'."],
|
|
269
|
+
'invalid-foundation-wall-properties.xml' => ['Expected DepthBelowGrade to be less than or equal to Height [context: /HPXML/Building/BuildingDetails/Enclosure/FoundationWalls/FoundationWall]',
|
|
270
|
+
'Expected extension/DistanceToBottomOfInsulation to be greater than or equal to extension/DistanceToTopOfInsulation [context: /HPXML/Building/BuildingDetails/Enclosure/FoundationWalls/FoundationWall/Insulation/Layer[InstallationType="continuous - exterior" or InstallationType="continuous - interior"]]',
|
|
271
|
+
'Expected extension/DistanceToBottomOfInsulation to be less than or equal to ../../Height [context: /HPXML/Building/BuildingDetails/Enclosure/FoundationWalls/FoundationWall/Insulation/Layer[InstallationType="continuous - exterior" or InstallationType="continuous - interior"]]'],
|
|
272
|
+
'invalid-id.xml' => ["Empty SystemIdentifier ID ('') detected for skylights."],
|
|
273
|
+
'invalid-id2.xml' => ['Expected id attribute for SystemIdentifier [context: /HPXML/Building/BuildingDetails/Enclosure/Skylights/Skylight]'],
|
|
274
|
+
'invalid-infiltration-volume.xml' => ['Expected InfiltrationVolume to be greater than or equal to ../../../BuildingSummary/BuildingConstruction/ConditionedBuildingVolume [context: /HPXML/Building/BuildingDetails/Enclosure/AirInfiltration/AirInfiltrationMeasurement[BuildingAirLeakage/UnitofMeasure[text()="ACH" or text()="CFM"]]]'],
|
|
275
|
+
'invalid-input-parameters.xml' => ["Expected Transaction to be 'create' or 'update' [context: /HPXML/XMLTransactionHeaderInformation]",
|
|
276
|
+
"Expected SiteType to be 'rural' or 'suburban' or 'urban' [context: /HPXML/Building/BuildingDetails/BuildingSummary/Site]",
|
|
277
|
+
"Expected Year to be '2012' or '2009' or '2006' or '2003' [context: /HPXML/Building/BuildingDetails/ClimateandRiskZones/ClimateZoneIECC]",
|
|
278
|
+
'Expected Azimuth to be less than 360 [context: /HPXML/Building/BuildingDetails/Enclosure/Roofs/Roof]',
|
|
279
|
+
'Expected RadiantBarrierGrade to be less than or equal to 3 [context: /HPXML/Building/BuildingDetails/Enclosure/Roofs/Roof]',
|
|
280
|
+
'Expected EnergyFactor to be less than or equal to 5 [context: /HPXML/Building/BuildingDetails/Appliances/Dishwasher]'],
|
|
179
281
|
'invalid-neighbor-shading-azimuth.xml' => ['A neighbor building has an azimuth (145) not equal to the azimuth of any wall.'],
|
|
282
|
+
'invalid-number-of-bedrooms-served.xml' => ['Expected extension/NumberofBedroomsServed to be greater than ../../../BuildingSummary/BuildingConstruction/NumberofBedrooms [context: /HPXML/Building/BuildingDetails/Systems/Photovoltaics/PVSystem[IsSharedSystem="true"]]'],
|
|
283
|
+
'invalid-number-of-conditioned-floors.xml' => ['Expected NumberofConditionedFloors to be greater than or equal to NumberofConditionedFloorsAboveGrade [context: /HPXML/Building/BuildingDetails/BuildingSummary/BuildingConstruction]'],
|
|
284
|
+
'invalid-number-of-units-served.xml' => ['Expected NumberofUnitsServed to be greater than 1 [context: /HPXML/Building/BuildingDetails/Systems/WaterHeating/WaterHeatingSystem[IsSharedSystem="true"]]'],
|
|
180
285
|
'invalid-relatedhvac-dhw-indirect.xml' => ["RelatedHVACSystem 'HeatingSystem_bad' not found for water heating system 'WaterHeater'"],
|
|
181
286
|
'invalid-relatedhvac-desuperheater.xml' => ["RelatedHVACSystem 'CoolingSystem_bad' not found for water heating system 'WaterHeater'."],
|
|
287
|
+
'invalid-schema-version.xml' => ['HPXML version 3.0 is required.'],
|
|
288
|
+
'invalid-shared-vent-in-unit-flowrate.xml' => ['Expected extension/InUnitFlowRate to be less than RatedFlowRate [context: /HPXML/Building/BuildingDetails/Systems/MechanicalVentilation/VentilationFans/VentilationFan[UsedForWholeBuildingVentilation="true" and IsSharedSystem="true"]]'],
|
|
182
289
|
'invalid-timestep.xml' => ['Timestep (45) must be one of: 60, 30, 20, 15, 12, 10, 6, 5, 4, 3, 2, 1.'],
|
|
183
290
|
'invalid-runperiod.xml' => ['Run Period End Day of Month (31) must be one of: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30.'],
|
|
184
|
-
'invalid-window-height.xml' => [
|
|
185
|
-
'invalid-window-interior-shading.xml' => ["SummerShadingCoefficient (0.85) must be less than or equal to WinterShadingCoefficient (0.7) for window 'WindowNorth'."],
|
|
186
|
-
'invalid-daylight-saving.xml' => ['Daylight Saving End Day of Month (31) must be one of: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30.'],
|
|
291
|
+
'invalid-window-height.xml' => ['Expected DistanceToBottomOfWindow to be greater than DistanceToTopOfWindow [context: /HPXML/Building/BuildingDetails/Enclosure/Windows/Window/Overhangs]'],
|
|
187
292
|
'lighting-fractions.xml' => ['Sum of fractions of interior lighting (1.15) is greater than 1.'],
|
|
188
|
-
'
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
'missing-duct-location.xml' => ['Expected 0 or 2 element(s) for xpath: /HPXML/Building/BuildingDetails/Systems/HVAC/HVACDistribution/DistributionSystemType/AirDistribution/Ducts[DuctType="supply" or DuctType="return"]: DuctSurfaceArea | DuctLocation[text()='],
|
|
192
|
-
'missing-duct-location-and-surface-area.xml' => ['Error: The location and surface area of all ducts must be provided or blank.'],
|
|
293
|
+
'missing-elements.xml' => ['Expected 1 element(s) for xpath: NumberofConditionedFloors [context: /HPXML/Building/BuildingDetails/BuildingSummary/BuildingConstruction]',
|
|
294
|
+
'Expected 1 element(s) for xpath: ConditionedFloorArea [context: /HPXML/Building/BuildingDetails/BuildingSummary/BuildingConstruction]'],
|
|
295
|
+
'missing-duct-location.xml' => ['Expected 0 or 2 element(s) for xpath: DuctSurfaceArea | DuctLocation [context: /HPXML/Building/BuildingDetails/Systems/HVAC/HVACDistribution/DistributionSystemType/AirDistribution/Ducts]'],
|
|
193
296
|
'multifamily-reference-appliance.xml' => ["The building is of type 'single-family detached' but"],
|
|
194
297
|
'multifamily-reference-duct.xml' => ["The building is of type 'single-family detached' but"],
|
|
195
298
|
'multifamily-reference-surface.xml' => ["The building is of type 'single-family detached' but"],
|
|
196
299
|
'multifamily-reference-water-heater.xml' => ["The building is of type 'single-family detached' but"],
|
|
300
|
+
'multiple-buildings-without-building-id.xml' => ['Multiple Building elements defined in HPXML file; Building ID argument must be provided.'],
|
|
301
|
+
'multiple-buildings-wrong-building-id.xml' => ["Could not find Building element with ID 'MyFoo'."],
|
|
302
|
+
'multiple-shared-cooling-systems.xml' => ['More than one shared cooling system found.'],
|
|
303
|
+
'multiple-shared-heating-systems.xml' => ['More than one shared heating system found.'],
|
|
197
304
|
'net-area-negative-wall.xml' => ["Calculated a negative net surface area for surface 'Wall'."],
|
|
198
305
|
'net-area-negative-roof.xml' => ["Calculated a negative net surface area for surface 'Roof'."],
|
|
306
|
+
'num-bedrooms-exceeds-limit.xml' => ['Expected NumberofBedrooms to be less than or equal to (ConditionedFloorArea-120)/70 [context: /HPXML/Building/BuildingDetails/BuildingSummary/BuildingConstruction]'],
|
|
199
307
|
'orphaned-hvac-distribution.xml' => ["Distribution system 'HVACDistribution' found but no HVAC system attached to it."],
|
|
200
|
-
'refrigerator-location.xml' => [
|
|
308
|
+
'refrigerator-location.xml' => ['A location is specified as "garage" but no surfaces were found adjacent to this space type.'],
|
|
309
|
+
'refrigerators-multiple-primary.xml' => ['More than one refrigerator designated as the primary.'],
|
|
310
|
+
'refrigerators-no-primary.xml' => ['Could not find a primary refrigerator.'],
|
|
201
311
|
'repeated-relatedhvac-dhw-indirect.xml' => ["RelatedHVACSystem 'HeatingSystem' is attached to multiple water heating systems."],
|
|
202
312
|
'repeated-relatedhvac-desuperheater.xml' => ["RelatedHVACSystem 'CoolingSystem' is attached to multiple water heating systems."],
|
|
203
|
-
'slab-zero-exposed-perimeter.xml' => [
|
|
313
|
+
'slab-zero-exposed-perimeter.xml' => ['Expected ExposedPerimeter to be greater than 0 [context: /HPXML/Building/BuildingDetails/Enclosure/Slabs/Slab]'],
|
|
314
|
+
'solar-fraction-one.xml' => ['Expected SolarFraction to be less than 1 [context: /HPXML/Building/BuildingDetails/Systems/SolarThermal/SolarThermalSystem]'],
|
|
204
315
|
'solar-thermal-system-with-combi-tankless.xml' => ["Water heating system 'WaterHeater' connected to solar thermal system 'SolarThermalSystem' cannot be a space-heating boiler."],
|
|
205
316
|
'solar-thermal-system-with-desuperheater.xml' => ["Water heating system 'WaterHeater' connected to solar thermal system 'SolarThermalSystem' cannot be attached to a desuperheater."],
|
|
206
317
|
'solar-thermal-system-with-dhw-indirect.xml' => ["Water heating system 'WaterHeater' connected to solar thermal system 'SolarThermalSystem' cannot be a space-heating boiler."],
|
|
@@ -212,70 +323,56 @@ class HPXMLTest < MiniTest::Test
|
|
|
212
323
|
'unattached-shared-clothes-washer-water-heater.xml' => ["Attached water heating system 'foobar' not found for clothes washer"],
|
|
213
324
|
'unattached-shared-dishwasher-water-heater.xml' => ["Attached water heating system 'foobar' not found for dishwasher"],
|
|
214
325
|
'unattached-window.xml' => ["Attached wall 'foobar' not found for window 'WindowNorth'."],
|
|
215
|
-
'water-heater-location.xml' => [
|
|
216
|
-
'water-heater-location-other.xml' => [
|
|
217
|
-
'refrigerators-multiple-primary.xml' => ['More than one refrigerator designated as the primary.'],
|
|
218
|
-
'refrigerators-no-primary.xml' => ['Could not find a primary refrigerator.'] }
|
|
326
|
+
'water-heater-location.xml' => ['A location is specified as "crawlspace - vented" but no surfaces were found adjacent to this space type.'],
|
|
327
|
+
'water-heater-location-other.xml' => ["Expected Location to be 'living space' or 'basement - unconditioned' or 'basement - conditioned' or 'attic - unvented' or 'attic - vented' or 'garage' or 'crawlspace - unvented' or 'crawlspace - vented' or 'other exterior' or 'other housing unit' or 'other heated space' or 'other multifamily buffer space' or 'other non-freezing space' [context: /HPXML/Building/BuildingDetails/Systems/WaterHeating/WaterHeatingSystem]"] }
|
|
219
328
|
|
|
220
329
|
# Test simulations
|
|
221
|
-
Dir["#{sample_files_dir}/invalid_files/*.xml"].sort
|
|
222
|
-
|
|
330
|
+
xmls = Dir["#{sample_files_dir}/invalid_files/*.xml"].sort
|
|
331
|
+
Parallel.map(xmls, in_threads: Parallel.processor_count) do |xml|
|
|
332
|
+
_run_xml(File.absolute_path(xml), Parallel.worker_number, true, expected_error_msgs[File.basename(xml)])
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
def test_release_zips
|
|
337
|
+
# Check release zips successfully created
|
|
338
|
+
top_dir = File.join(@this_dir, '..', '..')
|
|
339
|
+
command = "#{OpenStudio.getOpenStudioCLI} #{File.join(top_dir, 'tasks.rb')} create_release_zips"
|
|
340
|
+
system(command)
|
|
341
|
+
assert_equal(2, Dir["#{top_dir}/*.zip"].size)
|
|
342
|
+
|
|
343
|
+
# Check successful running of simulation from release zips
|
|
344
|
+
Dir["#{top_dir}/OpenStudio-HPXML*.zip"].each do |zip|
|
|
345
|
+
unzip_file = OpenStudio::UnzipFile.new(zip)
|
|
346
|
+
unzip_file.extractAllFiles(OpenStudio::toPath(top_dir))
|
|
347
|
+
command = "#{OpenStudio.getOpenStudioCLI} OpenStudio-HPXML/workflow/run_simulation.rb -x OpenStudio-HPXML/workflow/sample_files/base.xml"
|
|
348
|
+
system(command)
|
|
349
|
+
assert(File.exist? 'OpenStudio-HPXML/workflow/sample_files/run/results_annual.csv')
|
|
350
|
+
File.delete(zip)
|
|
351
|
+
rm_path('OpenStudio-HPXML')
|
|
223
352
|
end
|
|
224
353
|
end
|
|
225
354
|
|
|
226
|
-
|
|
355
|
+
private
|
|
356
|
+
|
|
357
|
+
def _run_xml(xml, worker_num = nil, expect_error = false, expect_error_msgs = nil)
|
|
227
358
|
print "Testing #{File.basename(xml)}...\n"
|
|
228
|
-
rundir = File.join(this_dir,
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
update_args_hash(measures, measure_subdir, args)
|
|
241
|
-
|
|
242
|
-
# Add reporting measure to workflow
|
|
243
|
-
measure_subdir = 'SimulationOutputReport'
|
|
244
|
-
args = {}
|
|
245
|
-
args['timeseries_frequency'] = 'monthly'
|
|
246
|
-
args['include_timeseries_fuel_consumptions'] = true
|
|
247
|
-
args['include_timeseries_end_use_consumptions'] = true
|
|
248
|
-
args['include_timeseries_hot_water_uses'] = true
|
|
249
|
-
args['include_timeseries_total_loads'] = true
|
|
250
|
-
args['include_timeseries_component_loads'] = true
|
|
251
|
-
args['include_timeseries_zone_temperatures'] = true
|
|
252
|
-
args['include_timeseries_airflows'] = true
|
|
253
|
-
args['include_timeseries_weather'] = true
|
|
254
|
-
update_args_hash(measures, measure_subdir, args)
|
|
255
|
-
|
|
256
|
-
# Add output variables for combi system energy check and CFIS
|
|
257
|
-
output_vars = [['Water Heater Source Side Heat Transfer Energy', 'runperiod', '*'],
|
|
258
|
-
['Baseboard Total Heating Energy', 'runperiod', '*'],
|
|
259
|
-
['Boiler Heating Energy', 'runperiod', '*'],
|
|
260
|
-
['Fluid Heat Exchanger Heat Transfer Energy', 'runperiod', '*'],
|
|
261
|
-
['Fan Electric Power', 'runperiod', '*'],
|
|
262
|
-
['Fan Runtime Fraction', 'runperiod', '*'],
|
|
263
|
-
['Electric Equipment Electric Energy', 'runperiod', Constants.ObjectNameMechanicalVentilationHouseFanCFIS],
|
|
264
|
-
['Boiler Part Load Ratio', 'runperiod', Constants.ObjectNameBoiler],
|
|
265
|
-
['Pump Electric Power', 'runperiod', Constants.ObjectNameBoiler + ' hydronic pump'],
|
|
266
|
-
['Unitary System Part Load Ratio', 'runperiod', Constants.ObjectNameGroundSourceHeatPump + ' unitary system'],
|
|
267
|
-
['Pump Electric Power', 'runperiod', Constants.ObjectNameGroundSourceHeatPump + ' pump']]
|
|
268
|
-
# Run workflow
|
|
359
|
+
rundir = File.join(@this_dir, "test#{worker_num}")
|
|
360
|
+
|
|
361
|
+
# Uses 'monthly' to verify timeseries results match annual results via error-checking
|
|
362
|
+
# inside the SimulationOutputReport measure.
|
|
363
|
+
cli_path = OpenStudio.getOpenStudioCLI
|
|
364
|
+
building_id = ''
|
|
365
|
+
if xml.include? 'base-multiple-buildings.xml'
|
|
366
|
+
building_id = '--building-id MyBuilding'
|
|
367
|
+
elsif xml.include? 'multiple-buildings-wrong-building-id.xml'
|
|
368
|
+
building_id = '--building-id MyFoo'
|
|
369
|
+
end
|
|
370
|
+
command = "\"#{cli_path}\" \"#{File.join(File.dirname(__FILE__), '../run_simulation.rb')}\" -x #{xml} --add-component-loads -o #{rundir} --debug --monthly ALL #{building_id}"
|
|
269
371
|
workflow_start = Time.now
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
success = results[:success]
|
|
275
|
-
runner = results[:runner]
|
|
276
|
-
sim_time = results[:sim_time]
|
|
277
|
-
puts "Completed in #{workflow_time} seconds."
|
|
278
|
-
puts
|
|
372
|
+
success = system(command)
|
|
373
|
+
workflow_time = Time.now - workflow_start
|
|
374
|
+
|
|
375
|
+
rundir = File.join(rundir, 'run')
|
|
279
376
|
|
|
280
377
|
# Check results
|
|
281
378
|
if expect_error
|
|
@@ -285,22 +382,26 @@ class HPXMLTest < MiniTest::Test
|
|
|
285
382
|
flunk "No error message defined for #{File.basename(xml)}."
|
|
286
383
|
else
|
|
287
384
|
run_log = File.readlines(File.join(rundir, 'run.log')).map(&:strip)
|
|
288
|
-
|
|
385
|
+
n_errors = 0
|
|
386
|
+
expect_error_msgs.each_with_index do |error_msg, i|
|
|
289
387
|
found_error_msg = false
|
|
290
388
|
run_log.each do |run_line|
|
|
389
|
+
next unless run_line.start_with? 'Error: '
|
|
390
|
+
|
|
391
|
+
n_errors += 1 if i == 0
|
|
392
|
+
|
|
291
393
|
next unless run_line.include? error_msg
|
|
292
394
|
|
|
293
395
|
found_error_msg = true
|
|
294
|
-
break
|
|
295
396
|
end
|
|
296
397
|
assert(found_error_msg)
|
|
297
398
|
end
|
|
399
|
+
assert_equal(n_errors, expect_error_msgs.size)
|
|
298
400
|
end
|
|
299
401
|
|
|
300
402
|
return
|
|
301
403
|
end
|
|
302
404
|
|
|
303
|
-
show_output(runner.result) unless success
|
|
304
405
|
assert_equal(true, success)
|
|
305
406
|
|
|
306
407
|
# Check for output files
|
|
@@ -310,16 +411,26 @@ class HPXMLTest < MiniTest::Test
|
|
|
310
411
|
assert(File.exist? timeseries_csv_path)
|
|
311
412
|
|
|
312
413
|
# Get results
|
|
313
|
-
results =
|
|
314
|
-
sizing_results = _get_sizing_results(rundir)
|
|
414
|
+
results = _get_simulation_results(annual_csv_path, xml)
|
|
315
415
|
|
|
316
416
|
# Check outputs
|
|
317
|
-
|
|
417
|
+
hpxml_defaults_path = File.join(rundir, 'in.xml')
|
|
418
|
+
stron_paths = [File.join(File.dirname(__FILE__), '..', '..', 'HPXMLtoOpenStudio', 'resources', 'EPvalidator.xml')]
|
|
419
|
+
hpxml = HPXML.new(hpxml_path: hpxml_defaults_path, schematron_validators: stron_paths) # Validate in.xml to ensure it can be run back through OS-HPXML
|
|
420
|
+
if not hpxml.errors.empty?
|
|
421
|
+
puts 'ERRORS:'
|
|
422
|
+
hpxml.errors.each do |error|
|
|
423
|
+
puts error
|
|
424
|
+
end
|
|
425
|
+
flunk "EPvalidator.xml error in #{hpxml_defaults_path}."
|
|
426
|
+
end
|
|
427
|
+
sizing_results = _get_hvac_sizing_results(hpxml, xml)
|
|
428
|
+
_verify_outputs(rundir, xml, results, hpxml)
|
|
318
429
|
|
|
319
430
|
return results, sizing_results
|
|
320
431
|
end
|
|
321
432
|
|
|
322
|
-
def
|
|
433
|
+
def _get_simulation_results(annual_csv_path, xml)
|
|
323
434
|
# Grab all outputs from reporting measure CSV annual results
|
|
324
435
|
results = {}
|
|
325
436
|
CSV.foreach(annual_csv_path) do |row|
|
|
@@ -328,35 +439,6 @@ class HPXMLTest < MiniTest::Test
|
|
|
328
439
|
results[row[0]] = Float(row[1])
|
|
329
440
|
end
|
|
330
441
|
|
|
331
|
-
sql_path = File.join(rundir, 'eplusout.sql')
|
|
332
|
-
sqlFile = OpenStudio::SqlFile.new(sql_path, false)
|
|
333
|
-
|
|
334
|
-
# Obtain HVAC capacities
|
|
335
|
-
# TODO: Add to reporting measure?
|
|
336
|
-
htg_cap_w = 0
|
|
337
|
-
for spd in [4, 2]
|
|
338
|
-
# Get capacity of highest speed for multi-speed coil
|
|
339
|
-
query = "SELECT SUM(Value) FROM ComponentSizes WHERE CompType='Coil:Heating:DX:MultiSpeed' AND Description LIKE '%User-Specified Speed #{spd}%Capacity' AND Units='W'"
|
|
340
|
-
htg_cap_w += sqlFile.execAndReturnFirstDouble(query).get
|
|
341
|
-
break if htg_cap_w > 0
|
|
342
|
-
end
|
|
343
|
-
query = "SELECT SUM(Value) FROM ComponentSizes WHERE ((CompType LIKE 'Coil:Heating:%' OR CompType LIKE 'Boiler:%' OR CompType LIKE 'ZONEHVAC:BASEBOARD:%') AND CompType!='Coil:Heating:DX:MultiSpeed') AND Description LIKE '%User-Specified%Capacity' AND Units='W'"
|
|
344
|
-
htg_cap_w += sqlFile.execAndReturnFirstDouble(query).get
|
|
345
|
-
results['Capacity: Heating (W)'] = htg_cap_w
|
|
346
|
-
|
|
347
|
-
clg_cap_w = 0
|
|
348
|
-
for spd in [4, 2]
|
|
349
|
-
# Get capacity of highest speed for multi-speed coil
|
|
350
|
-
query = "SELECT SUM(Value) FROM ComponentSizes WHERE CompType='Coil:Cooling:DX:MultiSpeed' AND Description LIKE 'User-Specified Speed #{spd}%Total%Capacity' AND Units='W'"
|
|
351
|
-
clg_cap_w += sqlFile.execAndReturnFirstDouble(query).get
|
|
352
|
-
break if clg_cap_w > 0
|
|
353
|
-
end
|
|
354
|
-
query = "SELECT SUM(Value) FROM ComponentSizes WHERE CompType LIKE 'Coil:Cooling:%' AND CompType!='Coil:Cooling:DX:MultiSpeed' AND Description LIKE '%User-Specified%Total%Capacity' AND Units='W'"
|
|
355
|
-
clg_cap_w += sqlFile.execAndReturnFirstDouble(query).get
|
|
356
|
-
results['Capacity: Cooling (W)'] = clg_cap_w
|
|
357
|
-
|
|
358
|
-
sqlFile.close
|
|
359
|
-
|
|
360
442
|
# Check discrepancy between total load and sum of component loads
|
|
361
443
|
if not xml.include? 'ASHRAE_Standard_140'
|
|
362
444
|
sum_component_htg_loads = results.select { |k, v| k.start_with? 'Component Load: Heating:' }.map { |k, v| v }.sum(0.0)
|
|
@@ -367,38 +449,79 @@ class HPXMLTest < MiniTest::Test
|
|
|
367
449
|
assert_operator(residual_clg_load.abs, :<, 0.5)
|
|
368
450
|
end
|
|
369
451
|
|
|
370
|
-
results[@@simulation_runtime_key] = sim_time
|
|
371
|
-
results[@@workflow_runtime_key] = workflow_time
|
|
372
|
-
|
|
373
452
|
return results
|
|
374
453
|
end
|
|
375
454
|
|
|
376
|
-
def
|
|
455
|
+
def _get_hvac_sizing_results(hpxml, xml)
|
|
377
456
|
results = {}
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
results[
|
|
388
|
-
results[prop] += value
|
|
457
|
+
return if xml.include? 'ASHRAE_Standard_140'
|
|
458
|
+
|
|
459
|
+
# Heating design loads
|
|
460
|
+
hpxml.hvac_plant.class::HDL_ATTRS.each do |attr, element_name|
|
|
461
|
+
results["heating_load_#{attr.to_s.gsub('hdl_', '')} [Btuh]"] = hpxml.hvac_plant.send(attr.to_s)
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
# Cooling sensible design loads
|
|
465
|
+
hpxml.hvac_plant.class::CDL_SENS_ATTRS.each do |attr, element_name|
|
|
466
|
+
results["cooling_load_#{attr.to_s.gsub('cdl_', '')} [Btuh]"] = hpxml.hvac_plant.send(attr.to_s)
|
|
389
467
|
end
|
|
468
|
+
|
|
469
|
+
# Cooling latent design loads
|
|
470
|
+
hpxml.hvac_plant.class::CDL_LAT_ATTRS.each do |attr, element_name|
|
|
471
|
+
results["cooling_load_#{attr.to_s.gsub('cdl_', '')} [Btuh]"] = hpxml.hvac_plant.send(attr.to_s)
|
|
472
|
+
end
|
|
473
|
+
|
|
474
|
+
# Heating capacities/airflows
|
|
475
|
+
results['heating_capacity [Btuh]'] = 0.0
|
|
476
|
+
results['heating_backup_capacity [Btuh]'] = 0.0
|
|
477
|
+
results['heating_airflow [cfm]'] = 0.0
|
|
478
|
+
(hpxml.heating_systems + hpxml.heat_pumps).each do |htg_sys|
|
|
479
|
+
results['heating_capacity [Btuh]'] += htg_sys.heating_capacity
|
|
480
|
+
if htg_sys.respond_to? :backup_heating_capacity
|
|
481
|
+
results['heating_backup_capacity [Btuh]'] += htg_sys.backup_heating_capacity
|
|
482
|
+
end
|
|
483
|
+
results['heating_airflow [cfm]'] += htg_sys.heating_airflow_cfm
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
# Cooling capacity/airflows
|
|
487
|
+
results['cooling_capacity [Btuh]'] = 0.0
|
|
488
|
+
results['cooling_airflow [cfm]'] = 0.0
|
|
489
|
+
(hpxml.cooling_systems + hpxml.heat_pumps).each do |clg_sys|
|
|
490
|
+
results['cooling_capacity [Btuh]'] += clg_sys.cooling_capacity
|
|
491
|
+
results['cooling_airflow [cfm]'] += clg_sys.cooling_airflow_cfm
|
|
492
|
+
end
|
|
493
|
+
|
|
390
494
|
assert(!results.empty?)
|
|
495
|
+
|
|
496
|
+
if (hpxml.heating_systems + hpxml.heat_pumps).select { |h| h.fraction_heat_load_served.to_f > 0 }.empty?
|
|
497
|
+
# No heating equipment; check for zero heating capacities/airflows/duct loads
|
|
498
|
+
assert_equal(0.0, results['heating_capacity [Btuh]'])
|
|
499
|
+
assert_equal(0.0, results['heating_backup_capacity [Btuh]'])
|
|
500
|
+
assert_equal(0.0, results['heating_airflow [cfm]'])
|
|
501
|
+
assert_equal(0.0, results['heating_load_ducts [Btuh]'])
|
|
502
|
+
end
|
|
503
|
+
if (hpxml.cooling_systems + hpxml.heat_pumps).select { |c| c.fraction_cool_load_served.to_f > 0 }.empty?
|
|
504
|
+
# No cooling equipment; check for zero cooling capacities/airflows/duct loads
|
|
505
|
+
assert_equal(0.0, results['cooling_capacity [Btuh]'])
|
|
506
|
+
assert_equal(0.0, results['cooling_airflow [cfm]'])
|
|
507
|
+
assert_equal(0.0, results['cooling_load_sens_ducts [Btuh]'])
|
|
508
|
+
assert_equal(0.0, results['cooling_load_lat_ducts [Btuh]'])
|
|
509
|
+
end
|
|
510
|
+
if hpxml.hvac_distributions.map { |dist| dist.ducts.size }.empty?
|
|
511
|
+
# No ducts; check for zero duct loads
|
|
512
|
+
assert_equal(0.0, results['heating_load_ducts [Btuh]'])
|
|
513
|
+
assert_equal(0.0, results['cooling_load_sens_ducts [Btuh]'])
|
|
514
|
+
assert_equal(0.0, results['cooling_load_lat_ducts [Btuh]'])
|
|
515
|
+
end
|
|
516
|
+
|
|
391
517
|
return results
|
|
392
518
|
end
|
|
393
519
|
|
|
394
|
-
def _verify_outputs(
|
|
520
|
+
def _verify_outputs(rundir, hpxml_path, results, hpxml)
|
|
395
521
|
sql_path = File.join(rundir, 'eplusout.sql')
|
|
396
522
|
assert(File.exist? sql_path)
|
|
397
523
|
|
|
398
524
|
sqlFile = OpenStudio::SqlFile.new(sql_path, false)
|
|
399
|
-
hpxml_defaults_path = File.join(rundir, 'in.xml')
|
|
400
|
-
hpxml = HPXML.new(hpxml_path: hpxml_defaults_path)
|
|
401
|
-
HVAC.apply_shared_systems(hpxml)
|
|
402
525
|
|
|
403
526
|
# Collapse windows further using same logic as measure.rb
|
|
404
527
|
hpxml.windows.each do |window|
|
|
@@ -412,10 +535,11 @@ class HPXMLTest < MiniTest::Test
|
|
|
412
535
|
next if log_line.include? 'Warning: Could not load nokogiri, no HPXML validation performed.'
|
|
413
536
|
next if log_line.start_with? 'Info: '
|
|
414
537
|
next if log_line.start_with? 'Executing command'
|
|
415
|
-
next if (log_line.start_with?('Heat ') || log_line.start_with?('Cool ')) && log_line.include?('=')
|
|
416
538
|
next if log_line.include? "-cache.csv' could not be found; regenerating it."
|
|
417
|
-
next if log_line.include?('Warning: HVACDistribution') && log_line.include?('has ducts entirely within conditioned space but there is non-zero leakage to the outside.')
|
|
418
539
|
|
|
540
|
+
if hpxml_path.include? 'base-atticroof-conditioned.xml'
|
|
541
|
+
next if log_line.include?('Ducts are entirely within conditioned space but there is moderate leakage to the outside. Leakage to the outside is typically zero or near-zero in these situations, consider revising leakage values. Leakage will be modeled as heat lost to the ambient environment.')
|
|
542
|
+
end
|
|
419
543
|
if hpxml.clothes_washers.empty?
|
|
420
544
|
next if log_line.include? 'No clothes washer specified, the model will not include clothes washer energy use.'
|
|
421
545
|
end
|
|
@@ -432,13 +556,13 @@ class HPXMLTest < MiniTest::Test
|
|
|
432
556
|
next if log_line.include? 'No cooking range specified, the model will not include cooking range/oven energy use.'
|
|
433
557
|
end
|
|
434
558
|
if hpxml.water_heating_systems.empty?
|
|
435
|
-
next if log_line.include? 'No water
|
|
559
|
+
next if log_line.include? 'No water heating specified, the model will not include water heating energy use.'
|
|
436
560
|
end
|
|
437
561
|
if (hpxml.heating_systems + hpxml.heat_pumps).select { |h| h.fraction_heat_load_served.to_f > 0 }.empty?
|
|
438
|
-
next if log_line.include? 'No heating
|
|
562
|
+
next if log_line.include? 'No space heating specified, the model will not include space heating energy use.'
|
|
439
563
|
end
|
|
440
564
|
if (hpxml.cooling_systems + hpxml.heat_pumps).select { |c| c.fraction_cool_load_served.to_f > 0 }.empty?
|
|
441
|
-
next if log_line.include? 'No cooling
|
|
565
|
+
next if log_line.include? 'No space cooling specified, the model will not include space cooling energy use.'
|
|
442
566
|
end
|
|
443
567
|
if hpxml.plug_loads.select { |p| p.plug_load_type == HPXML::PlugLoadTypeOther }.empty?
|
|
444
568
|
next if log_line.include? "No '#{HPXML::PlugLoadTypeOther}' plug loads specified, the model will not include misc plug load energy use."
|
|
@@ -449,6 +573,9 @@ class HPXMLTest < MiniTest::Test
|
|
|
449
573
|
if hpxml.lighting_groups.empty?
|
|
450
574
|
next if log_line.include? 'No lighting specified, the model will not include lighting energy use.'
|
|
451
575
|
end
|
|
576
|
+
if hpxml.windows.empty?
|
|
577
|
+
next if log_line.include? 'No windows specified, the model will not include window heat transfer.'
|
|
578
|
+
end
|
|
452
579
|
|
|
453
580
|
flunk "Unexpected warning found in run.log: #{log_line}"
|
|
454
581
|
end
|
|
@@ -473,30 +600,31 @@ class HPXMLTest < MiniTest::Test
|
|
|
473
600
|
next if err_line.include?('CheckUsedConstructions') && err_line.include?('nominally unused constructions')
|
|
474
601
|
next if err_line.include?('WetBulb not converged after') && err_line.include?('iterations(PsyTwbFnTdbWPb)')
|
|
475
602
|
next if err_line.include? 'Inside surface heat balance did not converge with Max Temp Difference'
|
|
603
|
+
next if err_line.include? 'Missing temperature setpoint for LeavingSetpointModulated mode' # These warnings are fine, simulation continues with assigning plant loop setpoint to boiler, which is the expected one
|
|
604
|
+
next if err_line.include?('Glycol: Temperature') && err_line.include?('out of range (too low) for fluid')
|
|
605
|
+
next if err_line.include?('Glycol: Temperature') && err_line.include?('out of range (too high) for fluid')
|
|
606
|
+
next if err_line.include? 'Plant loop exceeding upper temperature limit'
|
|
607
|
+
next if err_line.include? 'Plant loop falling below lower temperature limit'
|
|
608
|
+
next if err_line.include?('Foundation:Kiva') && err_line.include?('wall surfaces with more than four vertices') # TODO: Check alternative approach
|
|
609
|
+
next if err_line.include? 'Temperature out of range [-100. to 200.] (PsyPsatFnTemp)'
|
|
610
|
+
next if err_line.include? 'Enthalpy out of range (PsyTsatFnHPb)'
|
|
611
|
+
next if err_line.include? 'Full load outlet air dry-bulb temperature < 2C. This indicates the possibility of coil frost/freeze.'
|
|
612
|
+
next if err_line.include? 'Full load outlet temperature indicates a possibility of frost/freeze error continues.'
|
|
613
|
+
next if err_line.include? 'Air-cooled condenser inlet dry-bulb temperature below 0 C.'
|
|
614
|
+
next if err_line.include? 'Low condenser dry-bulb temperature error continues.'
|
|
476
615
|
|
|
477
616
|
# HPWHs
|
|
478
617
|
if hpxml.water_heating_systems.select { |wh| wh.water_heater_type == HPXML::WaterHeaterTypeHeatPump }.size > 0
|
|
479
618
|
next if err_line.include? 'Recovery Efficiency and Energy Factor could not be calculated during the test for standard ratings'
|
|
480
619
|
next if err_line.include? 'SimHVAC: Maximum iterations (20) exceeded for all HVAC loops'
|
|
620
|
+
next if err_line.include? 'Rated air volume flow rate per watt of rated total water heating capacity is out of range'
|
|
621
|
+
next if err_line.include? 'For object = Coil:WaterHeating:AirToWaterHeatPump:Wrapped'
|
|
622
|
+
next if err_line.include? 'Enthalpy out of range (PsyTsatFnHPb)'
|
|
481
623
|
end
|
|
482
624
|
# HP defrost curves
|
|
483
625
|
if hpxml.heat_pumps.select { |hp| [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit].include? hp.heat_pump_type }.size > 0
|
|
484
626
|
next if err_line.include?('GetDXCoils: Coil:Heating:DX') && err_line.include?('curve values')
|
|
485
627
|
end
|
|
486
|
-
# FUTURE: Remove when https://github.com/NREL/EnergyPlus/pull/8073 is available
|
|
487
|
-
if hpxml_path.include? 'ASHRAE_Standard_140'
|
|
488
|
-
next if err_line.include?('SurfaceProperty:ExposedFoundationPerimeter') && err_line.include?('Total Exposed Perimeter is greater than the perimeter')
|
|
489
|
-
end
|
|
490
|
-
# FUTURE: Remove when https://github.com/NREL/EnergyPlus/issues/8163 is addressed
|
|
491
|
-
if (hpxml.solar_thermal_systems.size > 0) || (hpxml.water_heating_systems.select { |wh| wh.water_heater_type == HPXML::WaterHeaterTypeHeatPump }.size > 0)
|
|
492
|
-
next if err_line.include? 'More Additional Loss Coefficients were entered than the number of nodes; extra coefficients will not be used'
|
|
493
|
-
end
|
|
494
|
-
if hpxml_path.include?('base-dhw-tank-heat-pump-outside.xml') || hpxml_path.include?('base-hvac-flowrate.xml')
|
|
495
|
-
next if err_line.include? 'Full load outlet air dry-bulb temperature < 2C. This indicates the possibility of coil frost/freeze.'
|
|
496
|
-
next if err_line.include? 'Full load outlet temperature indicates a possibility of frost/freeze error continues.'
|
|
497
|
-
end
|
|
498
|
-
next if err_line.include? 'Missing temperature setpoint for LeavingSetpointModulated mode' # These warnings are fine, simulation continues with assigning plant loop setpoint to boiler, which is the expected one
|
|
499
|
-
|
|
500
628
|
if hpxml.cooling_systems.select { |c| c.cooling_system_type == HPXML::HVACTypeEvaporativeCooler }.size > 0
|
|
501
629
|
# Evap cooler model is not really using Controller:MechanicalVentilation object, so these warnings of ignoring some features are fine.
|
|
502
630
|
# OS requires a Controller:MechanicalVentilation to be attached to the oa controller, however it's not required by E+.
|
|
@@ -509,22 +637,16 @@ class HPXMLTest < MiniTest::Test
|
|
|
509
637
|
# input "Autosize" for Fixed Minimum Air Flow Rate is added by OS translation, now set it to 0 to skip potential sizing process, though no way to prevent this warning.
|
|
510
638
|
next if err_line.include? 'Since Zone Minimum Air Flow Input Method = CONSTANT, input for Fixed Minimum Air Flow Rate will be ignored'
|
|
511
639
|
end
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
next if err_line.include? 'Plant loop exceeding upper temperature limit'
|
|
515
|
-
|
|
516
|
-
if hpxml.cooling_systems.select { |c| c.cooling_system_type == HPXML::HVACTypeRoomAirConditioner }.size > 0
|
|
517
|
-
next if err_line.include? 'GetDXCoils: Coil:Cooling:DX:SingleSpeed="ROOM AC CLG COIL" curve values' # TODO: Double-check curves
|
|
640
|
+
if hpxml.hvac_distributions.select { |d| d.air_type.to_s == HPXML::AirTypeFanCoil }.size > 0
|
|
641
|
+
next if err_line.include? 'In calculating the design coil UA for Coil:Cooling:Water' # Warning for unused cooling coil for fan coil
|
|
518
642
|
end
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
if hpxml_path.include?('base-simcontrol-timestep-10-mins.xml') || hpxml_path.include?('ASHRAE_Standard_140')
|
|
522
|
-
next if err_line.include? 'Temperature out of range [-100. to 200.] (PsyPsatFnTemp)'
|
|
643
|
+
if hpxml_path.include?('ground-to-air-heat-pump-cooling-only.xml') || hpxml_path.include?('ground-to-air-heat-pump-heating-only.xml')
|
|
644
|
+
next if err_line.include? 'COIL:HEATING:WATERTOAIRHEATPUMP:EQUATIONFIT' # heating capacity is > 20% different than cooling capacity; safe to ignore
|
|
523
645
|
end
|
|
524
|
-
if
|
|
525
|
-
next if err_line.include? '
|
|
646
|
+
if hpxml.solar_thermal_systems.size > 0
|
|
647
|
+
next if err_line.include? 'Supply Side is storing excess heat the majority of the time.'
|
|
526
648
|
end
|
|
527
|
-
if hpxml_path.include?('base-schedules-stochastic.xml') || hpxml_path.include?('base-schedules-user-specified.xml')
|
|
649
|
+
if hpxml_path.include?('base-schedules-stochastic.xml') || hpxml_path.include?('base-schedules-stochastic-vacant.xml') || hpxml_path.include?('base-schedules-user-specified.xml')
|
|
528
650
|
next if err_line.include?('GetCurrentScheduleValue: Schedule=') && err_line.include?('is a Schedule:File')
|
|
529
651
|
end
|
|
530
652
|
|
|
@@ -545,10 +667,7 @@ class HPXMLTest < MiniTest::Test
|
|
|
545
667
|
hpxml_value = hpxml.building_construction.conditioned_floor_area
|
|
546
668
|
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='InputVerificationandResultsSummary' AND ReportForString='Entire Facility' AND TableName='Zone Summary' AND RowName='Conditioned Total' AND ColumnName='Area' AND Units='m2'"
|
|
547
669
|
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
548
|
-
|
|
549
|
-
query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='InputVerificationandResultsSummary' AND ReportForString='Entire Facility' AND TableName='Zone Summary' AND RowName LIKE '%RET AIR ZONE' AND ColumnName='Area' AND Units='m2'"
|
|
550
|
-
sql_value -= UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
551
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
670
|
+
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
552
671
|
end
|
|
553
672
|
|
|
554
673
|
# Enclosure Roofs
|
|
@@ -567,7 +686,7 @@ class HPXMLTest < MiniTest::Test
|
|
|
567
686
|
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='U-Factor with Film' AND Units='W/m2-K'"
|
|
568
687
|
end
|
|
569
688
|
sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
|
|
570
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
689
|
+
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
571
690
|
|
|
572
691
|
# Net area
|
|
573
692
|
hpxml_value = roof.area
|
|
@@ -579,7 +698,7 @@ class HPXMLTest < MiniTest::Test
|
|
|
579
698
|
query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='Net Area' AND Units='m2'"
|
|
580
699
|
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
581
700
|
assert_operator(sql_value, :>, 0.01)
|
|
582
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.
|
|
701
|
+
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
583
702
|
|
|
584
703
|
# Solar absorptance
|
|
585
704
|
hpxml_value = roof.solar_absorptance
|
|
@@ -614,26 +733,25 @@ class HPXMLTest < MiniTest::Test
|
|
|
614
733
|
num_kiva_instances += 1
|
|
615
734
|
end
|
|
616
735
|
|
|
617
|
-
num_expected_kiva_instances = { 'base-foundation-ambient.xml' => 0, # no foundation in contact w/ ground
|
|
618
|
-
'base-foundation-multiple.xml' => 2, # additional instance for 2nd foundation type
|
|
619
|
-
'base-enclosure-2stories-garage.xml' => 2, # additional instance for garage
|
|
620
|
-
'base-enclosure-garage.xml' => 2, # additional instance for garage
|
|
621
|
-
'base-enclosure-other-housing-unit.xml' => 0, # no foundation in contact w/ ground
|
|
622
|
-
'base-enclosure-other-heated-space.xml' => 0, # no foundation in contact w/ ground
|
|
623
|
-
'base-enclosure-other-non-freezing-space.xml' => 0, # no foundation in contact w/ ground
|
|
624
|
-
'base-enclosure-other-multifamily-buffer-space.xml' => 0, # no foundation in contact w/ ground
|
|
625
|
-
'base-enclosure-common-surfaces.xml' => 2, # additional instance for vented crawlspace
|
|
626
|
-
'base-foundation-walkout-basement.xml' => 4, # 3 foundation walls plus a no-wall exposed perimeter
|
|
627
|
-
'base-foundation-complex.xml' => 10,
|
|
628
|
-
'base-misc-loads-large-uncommon.xml' => 2,
|
|
629
|
-
'base-misc-loads-large-uncommon2.xml' => 2 }
|
|
630
|
-
|
|
631
736
|
if hpxml_path.include? 'ASHRAE_Standard_140'
|
|
632
737
|
# nop
|
|
633
|
-
elsif
|
|
634
|
-
assert_equal(
|
|
738
|
+
elsif hpxml_path.include? 'base-bldgtype-multifamily'
|
|
739
|
+
assert_equal(0, num_kiva_instances) # no foundation, above dwelling unit
|
|
635
740
|
else
|
|
636
|
-
|
|
741
|
+
num_expected_kiva_instances = { 'base-foundation-ambient.xml' => 0, # no foundation in contact w/ ground
|
|
742
|
+
'base-foundation-multiple.xml' => 2, # additional instance for 2nd foundation type
|
|
743
|
+
'base-enclosure-2stories-garage.xml' => 2, # additional instance for garage
|
|
744
|
+
'base-foundation-basement-garage.xml' => 2, # additional instance for garage
|
|
745
|
+
'base-enclosure-garage.xml' => 2, # additional instance for garage
|
|
746
|
+
'base-foundation-walkout-basement.xml' => 4, # 3 foundation walls plus a no-wall exposed perimeter
|
|
747
|
+
'base-foundation-complex.xml' => 10, # lots of foundations for testing
|
|
748
|
+
'base-enclosure-split-surfaces2.xml' => 81 } # lots of foundations for testing
|
|
749
|
+
|
|
750
|
+
if not num_expected_kiva_instances[File.basename(hpxml_path)].nil?
|
|
751
|
+
assert_equal(num_expected_kiva_instances[File.basename(hpxml_path)], num_kiva_instances)
|
|
752
|
+
else
|
|
753
|
+
assert_equal(1, num_kiva_instances)
|
|
754
|
+
end
|
|
637
755
|
end
|
|
638
756
|
|
|
639
757
|
# Enclosure Foundation Slabs
|
|
@@ -647,7 +765,7 @@ class HPXMLTest < MiniTest::Test
|
|
|
647
765
|
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND RowName='#{slab_id}' AND ColumnName='Gross Area' AND Units='m2'"
|
|
648
766
|
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
649
767
|
assert_operator(sql_value, :>, 0.01)
|
|
650
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.
|
|
768
|
+
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
651
769
|
|
|
652
770
|
# Tilt
|
|
653
771
|
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND RowName='#{slab_id}' AND ColumnName='Tilt' AND Units='deg'"
|
|
@@ -669,8 +787,11 @@ class HPXMLTest < MiniTest::Test
|
|
|
669
787
|
assert_equal(sql_value_base_surf_idx, sql_value_ext_bound_cond)
|
|
670
788
|
end
|
|
671
789
|
|
|
672
|
-
|
|
673
|
-
|
|
790
|
+
if wall.is_exterior
|
|
791
|
+
table_name = 'Opaque Exterior'
|
|
792
|
+
else
|
|
793
|
+
table_name = 'Opaque Interior'
|
|
794
|
+
end
|
|
674
795
|
|
|
675
796
|
# R-value
|
|
676
797
|
if (not wall.insulation_assembly_r_value.nil?) && (not hpxml_path.include? 'base-foundation-unconditioned-basement-assembly-r.xml') # This file uses Foundation:Kiva for insulation, so skip it
|
|
@@ -678,14 +799,23 @@ class HPXMLTest < MiniTest::Test
|
|
|
678
799
|
if hpxml_path.include? 'ASHRAE_Standard_140'
|
|
679
800
|
# Compare R-value w/o film
|
|
680
801
|
hpxml_value -= Material.AirFilmVerticalASHRAE140.rvalue
|
|
681
|
-
|
|
682
|
-
|
|
802
|
+
if wall.is_exterior
|
|
803
|
+
hpxml_value -= Material.AirFilmOutsideASHRAE140.rvalue
|
|
804
|
+
else
|
|
805
|
+
hpxml_value -= Material.AirFilmVerticalASHRAE140.rvalue
|
|
806
|
+
end
|
|
807
|
+
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
|
|
808
|
+
elsif wall.is_interior
|
|
809
|
+
# Compare R-value w/o film
|
|
810
|
+
hpxml_value -= Material.AirFilmVertical.rvalue
|
|
811
|
+
hpxml_value -= Material.AirFilmVertical.rvalue
|
|
812
|
+
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
|
|
683
813
|
else
|
|
684
814
|
# Compare R-value w/ film
|
|
685
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='
|
|
815
|
+
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='U-Factor with Film' AND Units='W/m2-K'"
|
|
686
816
|
end
|
|
687
817
|
sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
|
|
688
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.
|
|
818
|
+
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
689
819
|
end
|
|
690
820
|
|
|
691
821
|
# Net area
|
|
@@ -718,29 +848,37 @@ class HPXMLTest < MiniTest::Test
|
|
|
718
848
|
hpxml_value *= (slab_exposed_length / wall_total_length)
|
|
719
849
|
end
|
|
720
850
|
end
|
|
721
|
-
|
|
851
|
+
if (hpxml.foundation_walls.include? wall) && (not wall.is_exterior)
|
|
852
|
+
# interzonal foundation walls: only above-grade portion modeled
|
|
853
|
+
hpxml_value *= (wall.height - wall.depth_below_grade) / wall.height
|
|
854
|
+
end
|
|
855
|
+
if wall.is_exterior
|
|
856
|
+
query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%' OR RowName LIKE '#{wall_id} %') AND ColumnName='Net Area' AND Units='m2'"
|
|
857
|
+
else
|
|
858
|
+
query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='Net Area' AND Units='m2'"
|
|
859
|
+
end
|
|
722
860
|
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
723
861
|
assert_operator(sql_value, :>, 0.01)
|
|
724
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.
|
|
862
|
+
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
725
863
|
|
|
726
864
|
# Solar absorptance
|
|
727
865
|
if wall.respond_to? :solar_absorptance
|
|
728
866
|
hpxml_value = wall.solar_absorptance
|
|
729
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='
|
|
867
|
+
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='Reflectance'"
|
|
730
868
|
sql_value = 1.0 - sqlFile.execAndReturnFirstDouble(query).get
|
|
731
869
|
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
732
870
|
end
|
|
733
871
|
|
|
734
872
|
# Tilt
|
|
735
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='
|
|
873
|
+
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='Tilt' AND Units='deg'"
|
|
736
874
|
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
737
875
|
assert_in_epsilon(90.0, sql_value, 0.01)
|
|
738
876
|
|
|
739
877
|
# Azimuth
|
|
740
|
-
next
|
|
878
|
+
next if wall.azimuth.nil?
|
|
741
879
|
|
|
742
880
|
hpxml_value = wall.azimuth
|
|
743
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='
|
|
881
|
+
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='Azimuth' AND Units='deg'"
|
|
744
882
|
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
745
883
|
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
746
884
|
end
|
|
@@ -758,8 +896,11 @@ class HPXMLTest < MiniTest::Test
|
|
|
758
896
|
assert_equal(sql_value_base_surf_idx, sql_value_ext_bound_cond)
|
|
759
897
|
end
|
|
760
898
|
|
|
761
|
-
|
|
762
|
-
|
|
899
|
+
if frame_floor.is_exterior
|
|
900
|
+
table_name = 'Opaque Exterior'
|
|
901
|
+
else
|
|
902
|
+
table_name = 'Opaque Interior'
|
|
903
|
+
end
|
|
763
904
|
|
|
764
905
|
# R-value
|
|
765
906
|
hpxml_value = frame_floor.insulation_assembly_r_value
|
|
@@ -772,20 +913,30 @@ class HPXMLTest < MiniTest::Test
|
|
|
772
913
|
hpxml_value -= Material.AirFilmFloorASHRAE140.rvalue
|
|
773
914
|
hpxml_value -= Material.AirFilmFloorASHRAE140.rvalue
|
|
774
915
|
end
|
|
775
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='
|
|
916
|
+
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{frame_floor_id}' AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
|
|
917
|
+
elsif frame_floor.is_interior
|
|
918
|
+
# Compare R-value w/o film
|
|
919
|
+
if frame_floor.is_ceiling
|
|
920
|
+
hpxml_value -= Material.AirFilmFloorAverage.rvalue
|
|
921
|
+
hpxml_value -= Material.AirFilmFloorAverage.rvalue
|
|
922
|
+
else
|
|
923
|
+
hpxml_value -= Material.AirFilmFloorReduced.rvalue
|
|
924
|
+
hpxml_value -= Material.AirFilmFloorReduced.rvalue
|
|
925
|
+
end
|
|
926
|
+
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{frame_floor_id}' AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
|
|
776
927
|
else
|
|
777
928
|
# Compare R-value w/ film
|
|
778
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='
|
|
929
|
+
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{frame_floor_id}' AND ColumnName='U-Factor with Film' AND Units='W/m2-K'"
|
|
779
930
|
end
|
|
780
931
|
sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
|
|
781
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.
|
|
932
|
+
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
782
933
|
|
|
783
934
|
# Area
|
|
784
935
|
hpxml_value = frame_floor.area
|
|
785
|
-
query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='
|
|
936
|
+
query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{frame_floor_id}' AND ColumnName='Net Area' AND Units='m2'"
|
|
786
937
|
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
787
938
|
assert_operator(sql_value, :>, 0.01)
|
|
788
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.
|
|
939
|
+
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
789
940
|
|
|
790
941
|
# Tilt
|
|
791
942
|
if frame_floor.is_ceiling
|
|
@@ -793,45 +944,68 @@ class HPXMLTest < MiniTest::Test
|
|
|
793
944
|
else
|
|
794
945
|
hpxml_value = 180
|
|
795
946
|
end
|
|
796
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='
|
|
947
|
+
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{frame_floor_id}' AND ColumnName='Tilt' AND Units='deg'"
|
|
797
948
|
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
798
949
|
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
799
950
|
end
|
|
800
951
|
|
|
801
952
|
# Enclosure Windows/Skylights
|
|
802
953
|
(hpxml.windows + hpxml.skylights).each do |subsurface|
|
|
803
|
-
next unless subsurface.is_exterior
|
|
804
|
-
|
|
805
954
|
subsurface_id = subsurface.id.upcase
|
|
806
955
|
|
|
956
|
+
if subsurface.is_exterior
|
|
957
|
+
table_name = 'Exterior Fenestration'
|
|
958
|
+
else
|
|
959
|
+
table_name = 'Interior Door'
|
|
960
|
+
end
|
|
961
|
+
|
|
807
962
|
# Area
|
|
963
|
+
if subsurface.is_exterior
|
|
964
|
+
col_name = 'Area of Multiplied Openings'
|
|
965
|
+
else
|
|
966
|
+
col_name = 'Gross Area'
|
|
967
|
+
end
|
|
808
968
|
hpxml_value = subsurface.area
|
|
809
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='
|
|
969
|
+
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='#{col_name}' AND Units='m2'"
|
|
810
970
|
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
811
971
|
assert_operator(sql_value, :>, 0.01)
|
|
812
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.
|
|
972
|
+
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
813
973
|
|
|
814
974
|
# U-Factor
|
|
975
|
+
if subsurface.is_exterior
|
|
976
|
+
col_name = 'Glass U-Factor'
|
|
977
|
+
else
|
|
978
|
+
col_name = 'U-Factor no Film'
|
|
979
|
+
end
|
|
815
980
|
hpxml_value = subsurface.ufactor
|
|
816
|
-
|
|
981
|
+
if subsurface.is_interior
|
|
982
|
+
hpxml_value = 1.0 / (1.0 / hpxml_value - Material.AirFilmVertical.rvalue)
|
|
983
|
+
hpxml_value = 1.0 / (1.0 / hpxml_value - Material.AirFilmVertical.rvalue)
|
|
984
|
+
end
|
|
985
|
+
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='#{col_name}' AND Units='W/m2-K'"
|
|
817
986
|
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
|
|
818
987
|
if subsurface.is_a? HPXML::Skylight
|
|
819
988
|
sql_value *= 1.2 # Convert back from vertical position to NFRC 20-degree slope
|
|
820
989
|
end
|
|
821
990
|
assert_in_epsilon(hpxml_value, sql_value, 0.02)
|
|
822
991
|
|
|
992
|
+
next unless subsurface.is_exterior
|
|
993
|
+
|
|
823
994
|
# SHGC
|
|
824
|
-
|
|
995
|
+
hpxml_value = subsurface.shgc
|
|
996
|
+
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='Glass SHGC'"
|
|
997
|
+
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
998
|
+
assert_in_delta(hpxml_value, sql_value, 0.01)
|
|
825
999
|
|
|
826
1000
|
# Azimuth
|
|
827
1001
|
hpxml_value = subsurface.azimuth
|
|
828
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='
|
|
1002
|
+
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='Azimuth' AND Units='deg'"
|
|
829
1003
|
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
830
1004
|
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
831
1005
|
|
|
832
1006
|
# Tilt
|
|
833
1007
|
if subsurface.respond_to? :wall_idref
|
|
834
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='
|
|
1008
|
+
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='Tilt' AND Units='deg'"
|
|
835
1009
|
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
836
1010
|
assert_in_epsilon(90.0, sql_value, 0.01)
|
|
837
1011
|
elsif subsurface.respond_to? :roof_idref
|
|
@@ -841,7 +1015,7 @@ class HPXMLTest < MiniTest::Test
|
|
|
841
1015
|
|
|
842
1016
|
hpxml_value = UnitConversions.convert(Math.atan(roof.pitch / 12.0), 'rad', 'deg')
|
|
843
1017
|
end
|
|
844
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='
|
|
1018
|
+
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='Tilt' AND Units='deg'"
|
|
845
1019
|
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
846
1020
|
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
847
1021
|
else
|
|
@@ -851,193 +1025,49 @@ class HPXMLTest < MiniTest::Test
|
|
|
851
1025
|
|
|
852
1026
|
# Enclosure Doors
|
|
853
1027
|
hpxml.doors.each do |door|
|
|
854
|
-
next unless door.wall.is_exterior
|
|
855
|
-
|
|
856
1028
|
door_id = door.id.upcase
|
|
857
1029
|
|
|
1030
|
+
if door.wall.is_exterior
|
|
1031
|
+
table_name = 'Exterior Door'
|
|
1032
|
+
else
|
|
1033
|
+
table_name = 'Interior Door'
|
|
1034
|
+
end
|
|
1035
|
+
|
|
858
1036
|
# Area
|
|
859
1037
|
if not door.area.nil?
|
|
860
1038
|
hpxml_value = door.area
|
|
861
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='
|
|
1039
|
+
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{door_id}' AND ColumnName='Gross Area' AND Units='m2'"
|
|
862
1040
|
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
863
1041
|
assert_operator(sql_value, :>, 0.01)
|
|
864
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.
|
|
1042
|
+
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
865
1043
|
end
|
|
866
1044
|
|
|
867
1045
|
# R-Value
|
|
868
|
-
next
|
|
869
|
-
|
|
870
|
-
hpxml_value = door.r_value
|
|
871
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Exterior Door' AND RowName='#{door_id}' AND ColumnName='U-Factor with Film' AND Units='W/m2-K'"
|
|
872
|
-
sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
|
|
873
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.02)
|
|
874
|
-
end
|
|
875
|
-
|
|
876
|
-
# HVAC Heating Systems
|
|
877
|
-
num_htg_sys = hpxml.heating_systems.size
|
|
878
|
-
hpxml.heating_systems.each do |heating_system|
|
|
879
|
-
htg_sys_type = heating_system.heating_system_type
|
|
880
|
-
htg_sys_fuel = heating_system.heating_system_fuel
|
|
881
|
-
|
|
882
|
-
next unless heating_system.fraction_heat_load_served > 0
|
|
883
|
-
|
|
884
|
-
# Electric Auxiliary Energy
|
|
885
|
-
# For now, skip if multiple equipment
|
|
886
|
-
next unless (num_htg_sys == 1) && [HPXML::HVACTypeFurnace, HPXML::HVACTypeBoiler, HPXML::HVACTypeWallFurnace, HPXML::HVACTypeFloorFurnace, HPXML::HVACTypeStove].include?(htg_sys_type) && (htg_sys_fuel != HPXML::FuelTypeElectricity)
|
|
1046
|
+
next if door.r_value.nil?
|
|
887
1047
|
|
|
888
|
-
if
|
|
889
|
-
|
|
1048
|
+
if door.is_exterior
|
|
1049
|
+
col_name = 'U-Factor with Film'
|
|
890
1050
|
else
|
|
891
|
-
|
|
892
|
-
if htg_sys_type == HPXML::HVACTypeFurnace
|
|
893
|
-
furnace_capacity_kbtuh = UnitConversions.convert(results['Capacity: Heating (W)'], 'W', 'kBtu/hr')
|
|
894
|
-
end
|
|
895
|
-
hpxml_value = HVAC.get_electric_auxiliary_energy(heating_system, furnace_capacity_kbtuh) / 2.08
|
|
896
|
-
end
|
|
897
|
-
|
|
898
|
-
if htg_sys_type == HPXML::HVACTypeBoiler
|
|
899
|
-
next if hpxml.water_heating_systems.select { |wh| [HPXML::WaterHeaterTypeCombiStorage, HPXML::WaterHeaterTypeCombiTankless].include? wh.water_heater_type }.size > 0 # Skip combi systems
|
|
900
|
-
|
|
901
|
-
# Compare pump power from timeseries output
|
|
902
|
-
query = "SELECT VariableValue FROM ReportVariableData WHERE ReportVariableDataDictionaryIndex IN (SELECT ReportVariableDataDictionaryIndex FROM ReportVariableDataDictionary WHERE VariableType='Avg' AND VariableName='Boiler Part Load Ratio' AND ReportingFrequency='Run Period')"
|
|
903
|
-
avg_plr = sqlFile.execAndReturnFirstDouble(query).get
|
|
904
|
-
query = "SELECT VariableValue FROM ReportVariableData WHERE ReportVariableDataDictionaryIndex IN (SELECT ReportVariableDataDictionaryIndex FROM ReportVariableDataDictionary WHERE VariableType='Avg' AND VariableName='Pump Electric Power' AND ReportingFrequency='Run Period')"
|
|
905
|
-
avg_w = sqlFile.execAndReturnFirstDouble(query).get
|
|
906
|
-
sql_value = avg_w / avg_plr
|
|
907
|
-
assert_in_epsilon(sql_value, hpxml_value, 0.02)
|
|
908
|
-
else
|
|
909
|
-
next if hpxml.cooling_systems.size + hpxml.heat_pumps.size > 0 # Skip if other system types (which could result in A) multiple supply fans or B) different supply fan power consumption in the cooling season)
|
|
910
|
-
|
|
911
|
-
# Compare fan power from timeseries output
|
|
912
|
-
query = "SELECT VariableValue FROM ReportVariableData WHERE ReportVariableDataDictionaryIndex IN (SELECT ReportVariableDataDictionaryIndex FROM ReportVariableDataDictionary WHERE VariableType='Avg' AND VariableName='Fan Runtime Fraction' and KeyValue LIKE '% SUPPLY FAN' AND ReportingFrequency='Run Period')"
|
|
913
|
-
avg_rtf = sqlFile.execAndReturnFirstDouble(query).get
|
|
914
|
-
query = "SELECT VariableValue FROM ReportVariableData WHERE ReportVariableDataDictionaryIndex IN (SELECT ReportVariableDataDictionaryIndex FROM ReportVariableDataDictionary WHERE VariableType='Avg' AND VariableName='Fan Electric Power' and KeyValue LIKE '% SUPPLY FAN' AND ReportingFrequency='Run Period')"
|
|
915
|
-
avg_w = sqlFile.execAndReturnFirstDouble(query).get
|
|
916
|
-
sql_value = avg_w / avg_rtf
|
|
917
|
-
assert_in_epsilon(sql_value, hpxml_value, 0.02)
|
|
918
|
-
end
|
|
919
|
-
end
|
|
920
|
-
|
|
921
|
-
# HVAC Heat Pumps
|
|
922
|
-
num_hps = hpxml.heat_pumps.size
|
|
923
|
-
hpxml.heat_pumps.each do |heat_pump|
|
|
924
|
-
next unless heat_pump.fraction_heat_load_served > 0
|
|
925
|
-
next unless (num_hps == 1) && heat_pump.heat_pump_type == HPXML::HVACTypeHeatPumpGroundToAir
|
|
926
|
-
|
|
927
|
-
# Compare pump power from timeseries output
|
|
928
|
-
hpxml_value = heat_pump.pump_watts_per_ton * UnitConversions.convert(results['Capacity: Cooling (W)'], 'W', 'ton')
|
|
929
|
-
query = "SELECT VariableValue FROM ReportVariableData WHERE ReportVariableDataDictionaryIndex IN (SELECT ReportVariableDataDictionaryIndex FROM ReportVariableDataDictionary WHERE VariableType='Avg' AND VariableName='Unitary System Part Load Ratio' AND ReportingFrequency='Run Period')"
|
|
930
|
-
avg_plr = sqlFile.execAndReturnFirstDouble(query).get
|
|
931
|
-
query = "SELECT VariableValue FROM ReportVariableData WHERE ReportVariableDataDictionaryIndex IN (SELECT ReportVariableDataDictionaryIndex FROM ReportVariableDataDictionary WHERE VariableType='Avg' AND VariableName='Pump Electric Power' AND ReportingFrequency='Run Period')"
|
|
932
|
-
avg_w = sqlFile.execAndReturnFirstDouble(query).get
|
|
933
|
-
sql_value = avg_w / avg_plr
|
|
934
|
-
assert_in_epsilon(sql_value, hpxml_value, 0.02)
|
|
935
|
-
end
|
|
936
|
-
|
|
937
|
-
# HVAC Capacities
|
|
938
|
-
htg_cap = nil
|
|
939
|
-
clg_cap = nil
|
|
940
|
-
hpxml.heating_systems.each do |heating_system|
|
|
941
|
-
htg_sys_cap = heating_system.heating_capacity.to_f
|
|
942
|
-
if htg_sys_cap > 0
|
|
943
|
-
htg_cap = 0 if htg_cap.nil?
|
|
944
|
-
htg_cap += htg_sys_cap
|
|
945
|
-
end
|
|
946
|
-
end
|
|
947
|
-
hpxml.cooling_systems.each do |cooling_system|
|
|
948
|
-
clg_sys_cap = cooling_system.cooling_capacity.to_f
|
|
949
|
-
clg_cap_mult = 1.0
|
|
950
|
-
if cooling_system.cooling_system_type == HPXML::HVACTypeMiniSplitAirConditioner
|
|
951
|
-
# TODO: Generalize this
|
|
952
|
-
clg_cap_mult = 1.20
|
|
953
|
-
end
|
|
954
|
-
if clg_sys_cap > 0
|
|
955
|
-
clg_cap = 0 if clg_cap.nil?
|
|
956
|
-
clg_cap += (clg_sys_cap * clg_cap_mult)
|
|
957
|
-
end
|
|
958
|
-
end
|
|
959
|
-
hpxml.heat_pumps.each do |heat_pump|
|
|
960
|
-
hp_cap_clg = heat_pump.cooling_capacity.to_f
|
|
961
|
-
hp_cap_htg = heat_pump.heating_capacity.to_f
|
|
962
|
-
clg_cap_mult = 1.0
|
|
963
|
-
htg_cap_mult = 1.0
|
|
964
|
-
if heat_pump.heat_pump_type == HPXML::HVACTypeHeatPumpMiniSplit
|
|
965
|
-
# TODO: Generalize this
|
|
966
|
-
clg_cap_mult = 1.20
|
|
967
|
-
htg_cap_mult = 1.20
|
|
968
|
-
elsif (heat_pump.heat_pump_type == HPXML::HVACTypeHeatPumpAirToAir) && (heat_pump.cooling_efficiency_seer > 21)
|
|
969
|
-
# TODO: Generalize this
|
|
970
|
-
htg_cap_mult = 1.17
|
|
971
|
-
end
|
|
972
|
-
supp_hp_cap = heat_pump.backup_heating_capacity.to_f
|
|
973
|
-
if hp_cap_clg > 0
|
|
974
|
-
clg_cap = 0 if clg_cap.nil?
|
|
975
|
-
clg_cap += (hp_cap_clg * clg_cap_mult)
|
|
976
|
-
end
|
|
977
|
-
if hp_cap_htg > 0
|
|
978
|
-
htg_cap = 0 if htg_cap.nil?
|
|
979
|
-
htg_cap += (hp_cap_htg * htg_cap_mult)
|
|
980
|
-
end
|
|
981
|
-
if supp_hp_cap > 0
|
|
982
|
-
htg_cap = 0 if htg_cap.nil?
|
|
983
|
-
htg_cap += supp_hp_cap
|
|
984
|
-
end
|
|
985
|
-
end
|
|
986
|
-
if not clg_cap.nil?
|
|
987
|
-
sql_value = UnitConversions.convert(results['Capacity: Cooling (W)'], 'W', 'Btu/hr')
|
|
988
|
-
if clg_cap == 0
|
|
989
|
-
assert_operator(sql_value, :<, 1)
|
|
990
|
-
elsif clg_cap > 0
|
|
991
|
-
if hpxml.header.allow_increased_fixed_capacities
|
|
992
|
-
assert_operator(sql_value, :>=, clg_cap)
|
|
993
|
-
else
|
|
994
|
-
assert_in_epsilon(clg_cap, sql_value, 0.01)
|
|
995
|
-
end
|
|
996
|
-
else # autosized
|
|
997
|
-
assert_operator(sql_value, :>, 1)
|
|
1051
|
+
col_name = 'U-Factor no Film'
|
|
998
1052
|
end
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
assert_operator(sql_value, :<, 1)
|
|
1004
|
-
elsif htg_cap > 0
|
|
1005
|
-
if hpxml.header.allow_increased_fixed_capacities
|
|
1006
|
-
assert_operator(sql_value, :>=, htg_cap)
|
|
1007
|
-
else
|
|
1008
|
-
assert_in_epsilon(htg_cap, sql_value, 0.01)
|
|
1009
|
-
end
|
|
1010
|
-
else # autosized
|
|
1011
|
-
assert_operator(sql_value, :>, 1)
|
|
1053
|
+
hpxml_value = door.r_value
|
|
1054
|
+
if door.is_interior
|
|
1055
|
+
hpxml_value -= Material.AirFilmVertical.rvalue
|
|
1056
|
+
hpxml_value -= Material.AirFilmVertical.rvalue
|
|
1012
1057
|
end
|
|
1058
|
+
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{door_id}' AND ColumnName='#{col_name}' AND Units='W/m2-K'"
|
|
1059
|
+
sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
|
|
1060
|
+
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
1013
1061
|
end
|
|
1014
1062
|
|
|
1015
1063
|
# HVAC Load Fractions
|
|
1016
|
-
if not hpxml_path.include? 'location-miami'
|
|
1064
|
+
if (not hpxml_path.include? 'location-miami') && (not hpxml_path.include? 'location-honolulu') && (not hpxml_path.include? 'location-phoenix')
|
|
1017
1065
|
htg_energy = results.select { |k, v| (k.include?(': Heating (MBtu)') || k.include?(': Heating Fans/Pumps (MBtu)')) && !k.include?('Load') }.map { |k, v| v }.sum(0.0)
|
|
1018
1066
|
assert_equal(hpxml.total_fraction_heat_load_served > 0, htg_energy > 0)
|
|
1019
1067
|
end
|
|
1020
1068
|
clg_energy = results.select { |k, v| (k.include?(': Cooling (MBtu)') || k.include?(': Cooling Fans/Pumps (MBtu)')) && !k.include?('Load') }.map { |k, v| v }.sum(0.0)
|
|
1021
1069
|
assert_equal(hpxml.total_fraction_cool_load_served > 0, clg_energy > 0)
|
|
1022
1070
|
|
|
1023
|
-
# Water Heater
|
|
1024
|
-
if hpxml.water_heating_systems.select { |wh| [HPXML::WaterHeaterTypeCombiStorage, HPXML::WaterHeaterTypeCombiTankless].include? wh.water_heater_type }.size > 0
|
|
1025
|
-
query = "SELECT SUM(ABS(VariableValue)/1000000000) FROM ReportVariableData WHERE ReportVariableDataDictionaryIndex IN (SELECT ReportVariableDataDictionaryIndex FROM ReportVariableDataDictionary WHERE VariableType='Sum' AND VariableName='Fluid Heat Exchanger Heat Transfer Energy' AND ReportingFrequency='Run Period' AND VariableUnits='J')"
|
|
1026
|
-
combi_hx_load = sqlFile.execAndReturnFirstDouble(query).get.round(2)
|
|
1027
|
-
query = "SELECT SUM(ABS(VariableValue)/1000000000) FROM ReportVariableData WHERE ReportVariableDataDictionaryIndex IN (SELECT ReportVariableDataDictionaryIndex FROM ReportVariableDataDictionary WHERE VariableType='Sum' AND VariableName='Boiler Heating Energy' AND ReportingFrequency='Run Period' AND VariableUnits='J')"
|
|
1028
|
-
combi_htg_load = sqlFile.execAndReturnFirstDouble(query).get.round(2)
|
|
1029
|
-
|
|
1030
|
-
# Check combi system energy balance
|
|
1031
|
-
query = "SELECT SUM(ABS(VariableValue)/1000000000) FROM ReportVariableData WHERE ReportVariableDataDictionaryIndex IN (SELECT ReportVariableDataDictionaryIndex FROM ReportVariableDataDictionary WHERE VariableType='Sum' AND VariableName='Water Heater Source Side Heat Transfer Energy' AND VariableUnits='J')"
|
|
1032
|
-
combi_tank_source_load = sqlFile.execAndReturnFirstDouble(query).get.round(2)
|
|
1033
|
-
assert_in_epsilon(combi_hx_load, combi_tank_source_load, 0.02)
|
|
1034
|
-
|
|
1035
|
-
# Check boiler, hx, pump, heating coil energy balance
|
|
1036
|
-
query = "SELECT SUM(ABS(VariableValue)/1000000000) FROM ReportVariableData WHERE ReportVariableDataDictionaryIndex IN (SELECT ReportVariableDataDictionaryIndex FROM ReportVariableDataDictionary WHERE VariableType='Sum' AND VariableName='Baseboard Total Heating Energy' AND VariableUnits='J')"
|
|
1037
|
-
boiler_space_heating_load = sqlFile.execAndReturnFirstDouble(query).get.round(2)
|
|
1038
|
-
assert_in_epsilon(combi_hx_load + boiler_space_heating_load, combi_htg_load, 0.02)
|
|
1039
|
-
end
|
|
1040
|
-
|
|
1041
1071
|
# Mechanical Ventilation
|
|
1042
1072
|
fan_cfis = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_whole_building_ventilation && (vent_mech.fan_type == HPXML::MechVentTypeCFIS) }
|
|
1043
1073
|
fan_sup = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_whole_building_ventilation && (vent_mech.fan_type == HPXML::MechVentTypeSupply) }
|
|
@@ -1047,43 +1077,36 @@ class HPXMLTest < MiniTest::Test
|
|
|
1047
1077
|
vent_fan_bath = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_local_ventilation && (vent_mech.fan_location == HPXML::LocationBath) }
|
|
1048
1078
|
|
|
1049
1079
|
if not (fan_cfis + fan_sup + fan_exh + fan_bal + vent_fan_kitchen + vent_fan_bath).empty?
|
|
1050
|
-
mv_energy = UnitConversions.convert(results['Electricity: Mech Vent (MBtu)'], 'MBtu', 'GJ')
|
|
1080
|
+
mv_energy = UnitConversions.convert(results['End Use: Electricity: Mech Vent (MBtu)'], 'MBtu', 'GJ')
|
|
1051
1081
|
|
|
1052
1082
|
if not fan_cfis.empty?
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
if fan_gj > 0
|
|
1059
|
-
assert_operator(cfis_energy, :>, 0)
|
|
1060
|
-
assert_operator(cfis_energy, :<, fan_gj)
|
|
1061
|
-
else
|
|
1062
|
-
assert_equal(cfis_energy, 0.0)
|
|
1083
|
+
if (fan_sup + fan_exh + fan_bal + vent_fan_kitchen + vent_fan_bath).empty?
|
|
1084
|
+
# CFIS only, check for positive mech vent energy that is less than the energy if it had run 24/7
|
|
1085
|
+
fan_gj = fan_cfis.map { |vent_mech| UnitConversions.convert(vent_mech.unit_fan_power * vent_mech.hours_in_operation * 365.0, 'Wh', 'GJ') }.sum(0.0)
|
|
1086
|
+
assert_operator(mv_energy, :>, 0)
|
|
1087
|
+
assert_operator(mv_energy, :<, fan_gj)
|
|
1063
1088
|
end
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1089
|
+
else
|
|
1090
|
+
# Supply, exhaust, ERV, HRV, etc., check for appropriate mech vent energy
|
|
1091
|
+
fan_gj = 0
|
|
1092
|
+
if not fan_sup.empty?
|
|
1093
|
+
fan_gj += fan_sup.map { |vent_mech| UnitConversions.convert(vent_mech.unit_fan_power * vent_mech.hours_in_operation * 365.0, 'Wh', 'GJ') }.sum(0.0)
|
|
1094
|
+
end
|
|
1095
|
+
if not fan_exh.empty?
|
|
1096
|
+
fan_gj += fan_exh.map { |vent_mech| UnitConversions.convert(vent_mech.unit_fan_power * vent_mech.hours_in_operation * 365.0, 'Wh', 'GJ') }.sum(0.0)
|
|
1097
|
+
end
|
|
1098
|
+
if not fan_bal.empty?
|
|
1099
|
+
fan_gj += fan_bal.map { |vent_mech| UnitConversions.convert(vent_mech.unit_fan_power * vent_mech.hours_in_operation * 365.0, 'Wh', 'GJ') }.sum(0.0)
|
|
1100
|
+
end
|
|
1101
|
+
if not vent_fan_kitchen.empty?
|
|
1102
|
+
fan_gj += vent_fan_kitchen.map { |vent_kitchen| UnitConversions.convert(vent_kitchen.unit_fan_power * vent_kitchen.hours_in_operation * vent_kitchen.quantity * 365.0, 'Wh', 'GJ') }.sum(0.0)
|
|
1103
|
+
end
|
|
1104
|
+
if not vent_fan_bath.empty?
|
|
1105
|
+
fan_gj += vent_fan_bath.map { |vent_bath| UnitConversions.convert(vent_bath.unit_fan_power * vent_bath.hours_in_operation * vent_bath.quantity * 365.0, 'Wh', 'GJ') }.sum(0.0)
|
|
1106
|
+
end
|
|
1107
|
+
# Maximum error that can be caused by rounding
|
|
1108
|
+
assert_in_delta(mv_energy, fan_gj, 0.006)
|
|
1084
1109
|
end
|
|
1085
|
-
# Maximum error that can be caused by rounding
|
|
1086
|
-
assert_in_delta(mv_energy, fan_gj, 0.006)
|
|
1087
1110
|
end
|
|
1088
1111
|
|
|
1089
1112
|
# Clothes Washer
|
|
@@ -1147,8 +1170,10 @@ class HPXMLTest < MiniTest::Test
|
|
|
1147
1170
|
end
|
|
1148
1171
|
|
|
1149
1172
|
# Lighting
|
|
1150
|
-
ltg_energy = results.select { |k, v| k.include? 'Electricity: Lighting' }.map { |k, v| v }.sum(0.0)
|
|
1151
|
-
|
|
1173
|
+
ltg_energy = results.select { |k, v| k.include? 'End Use: Electricity: Lighting' }.map { |k, v| v }.sum(0.0)
|
|
1174
|
+
if hpxml.header.schedules_path.nil?
|
|
1175
|
+
assert_equal(hpxml.lighting_groups.size > 0, ltg_energy > 0)
|
|
1176
|
+
end
|
|
1152
1177
|
|
|
1153
1178
|
# Get fuels
|
|
1154
1179
|
htg_fuels = []
|
|
@@ -1178,11 +1203,11 @@ class HPXMLTest < MiniTest::Test
|
|
|
1178
1203
|
HPXML::FuelTypeCoal].each do |fuel|
|
|
1179
1204
|
fuel_name = fuel.split.map(&:capitalize).join(' ')
|
|
1180
1205
|
fuel_name += ' Cord' if fuel_name == 'Wood'
|
|
1181
|
-
energy_htg = results.fetch("#{fuel_name}: Heating (MBtu)", 0)
|
|
1182
|
-
energy_dhw = results.fetch("#{fuel_name}: Hot Water (MBtu)", 0)
|
|
1183
|
-
energy_cd = results.fetch("#{fuel_name}: Clothes Dryer (MBtu)", 0)
|
|
1184
|
-
energy_cr = results.fetch("#{fuel_name}: Range/Oven (MBtu)", 0)
|
|
1185
|
-
if htg_fuels.include?(fuel) && (not hpxml_path.include? 'location-miami')
|
|
1206
|
+
energy_htg = results.fetch("End Use: #{fuel_name}: Heating (MBtu)", 0)
|
|
1207
|
+
energy_dhw = results.fetch("End Use: #{fuel_name}: Hot Water (MBtu)", 0)
|
|
1208
|
+
energy_cd = results.fetch("End Use: #{fuel_name}: Clothes Dryer (MBtu)", 0)
|
|
1209
|
+
energy_cr = results.fetch("End Use: #{fuel_name}: Range/Oven (MBtu)", 0)
|
|
1210
|
+
if htg_fuels.include?(fuel) && (not hpxml_path.include? 'location-miami') && (not hpxml_path.include? 'location-honolulu') && (not hpxml_path.include? 'location-phoenix')
|
|
1186
1211
|
assert_operator(energy_htg, :>, 0)
|
|
1187
1212
|
else
|
|
1188
1213
|
assert_equal(0, energy_htg)
|
|
@@ -1204,12 +1229,22 @@ class HPXMLTest < MiniTest::Test
|
|
|
1204
1229
|
end
|
|
1205
1230
|
end
|
|
1206
1231
|
|
|
1232
|
+
# Check unmet loads
|
|
1233
|
+
unmet_htg_load = results.select { |k, v| k.include? 'Unmet Load: Heating' }.map { |k, v| v }.sum(0.0)
|
|
1234
|
+
unmet_clg_load = results.select { |k, v| k.include? 'Unmet Load: Cooling' }.map { |k, v| v }.sum(0.0)
|
|
1235
|
+
if hpxml_path.include? 'base-hvac-undersized.xml'
|
|
1236
|
+
assert_operator(unmet_htg_load, :>, 0.5)
|
|
1237
|
+
assert_operator(unmet_clg_load, :>, 0.5)
|
|
1238
|
+
else
|
|
1239
|
+
assert_operator(unmet_htg_load, :<, 0.5)
|
|
1240
|
+
assert_operator(unmet_clg_load, :<, 0.5)
|
|
1241
|
+
end
|
|
1242
|
+
|
|
1207
1243
|
sqlFile.close
|
|
1208
1244
|
end
|
|
1209
1245
|
|
|
1210
|
-
def _write_summary_results(
|
|
1246
|
+
def _write_summary_results(results, csv_out)
|
|
1211
1247
|
require 'csv'
|
|
1212
|
-
csv_out = File.join(results_dir, 'results.csv')
|
|
1213
1248
|
|
|
1214
1249
|
output_keys = []
|
|
1215
1250
|
results.each do |xml, xml_results|
|
|
@@ -1240,9 +1275,8 @@ class HPXMLTest < MiniTest::Test
|
|
|
1240
1275
|
puts "Wrote summary results to #{csv_out}."
|
|
1241
1276
|
end
|
|
1242
1277
|
|
|
1243
|
-
def _write_hvac_sizing_results(
|
|
1278
|
+
def _write_hvac_sizing_results(all_sizing_results, csv_out)
|
|
1244
1279
|
require 'csv'
|
|
1245
|
-
csv_out = File.join(results_dir, 'results_hvac_sizing.csv')
|
|
1246
1280
|
|
|
1247
1281
|
output_keys = nil
|
|
1248
1282
|
all_sizing_results.each do |xml, xml_results|
|
|
@@ -1265,16 +1299,14 @@ class HPXMLTest < MiniTest::Test
|
|
|
1265
1299
|
puts "Wrote HVAC sizing results to #{csv_out}."
|
|
1266
1300
|
end
|
|
1267
1301
|
|
|
1268
|
-
def
|
|
1302
|
+
def _write_ashrae_140_results(all_results, csv_out)
|
|
1269
1303
|
require 'csv'
|
|
1270
|
-
csv_out = File.join(results_dir, 'results_ashrae_140.csv')
|
|
1271
1304
|
|
|
1272
1305
|
htg_loads = {}
|
|
1273
1306
|
clg_loads = {}
|
|
1274
1307
|
CSV.open(csv_out, 'w') do |csv|
|
|
1275
1308
|
csv << ['Test Case', 'Annual Heating Load [MMBtu]', 'Annual Cooling Load [MMBtu]']
|
|
1276
1309
|
all_results.sort.each do |xml, xml_results|
|
|
1277
|
-
next unless xml.include? ashrae_140_dir
|
|
1278
1310
|
next unless xml.include? 'C.xml'
|
|
1279
1311
|
|
|
1280
1312
|
htg_load = xml_results['Load: Heating (MBtu)'].round(2)
|
|
@@ -1283,7 +1315,6 @@ class HPXMLTest < MiniTest::Test
|
|
|
1283
1315
|
htg_loads[test_name] = htg_load
|
|
1284
1316
|
end
|
|
1285
1317
|
all_results.sort.each do |xml, xml_results|
|
|
1286
|
-
next unless xml.include? ashrae_140_dir
|
|
1287
1318
|
next unless xml.include? 'L.xml'
|
|
1288
1319
|
|
|
1289
1320
|
clg_load = xml_results['Load: Cooling (MBtu)'].round(2)
|
|
@@ -1294,41 +1325,5 @@ class HPXMLTest < MiniTest::Test
|
|
|
1294
1325
|
end
|
|
1295
1326
|
|
|
1296
1327
|
puts "Wrote ASHRAE 140 results to #{csv_out}."
|
|
1297
|
-
|
|
1298
|
-
# TODO: Add updated HERS acceptance criteria once the E+ simple
|
|
1299
|
-
# window model bugfix is available.
|
|
1300
|
-
# FUTURE: Switch to stringent HERS acceptance criteria once it's based on
|
|
1301
|
-
# TMY3.
|
|
1302
1328
|
end
|
|
1303
|
-
|
|
1304
|
-
def _display_result_epsilon(xml, result1, result2, key)
|
|
1305
|
-
epsilon = (result1 - result2).abs / [result1, result2].min
|
|
1306
|
-
puts "#{xml}: epsilon=#{epsilon.round(5)} [#{key}]"
|
|
1307
|
-
end
|
|
1308
|
-
|
|
1309
|
-
def _display_result_delta(xml, result1, result2, key)
|
|
1310
|
-
delta = (result1 - result2).abs
|
|
1311
|
-
puts "#{xml}: delta=#{delta.round(5)} [#{key}]"
|
|
1312
|
-
end
|
|
1313
|
-
end
|
|
1314
|
-
|
|
1315
|
-
def components
|
|
1316
|
-
return { 'Total' => 'tot',
|
|
1317
|
-
'Roofs' => 'roofs',
|
|
1318
|
-
'Ceilings' => 'ceilings',
|
|
1319
|
-
'Walls' => 'walls',
|
|
1320
|
-
'Rim Joists' => 'rim_joists',
|
|
1321
|
-
'Foundation Walls' => 'foundation_walls',
|
|
1322
|
-
'Doors' => 'doors',
|
|
1323
|
-
'Windows' => 'windows',
|
|
1324
|
-
'Skylights' => 'skylights',
|
|
1325
|
-
'Floors' => 'floors',
|
|
1326
|
-
'Slabs' => 'slabs',
|
|
1327
|
-
'Internal Mass' => 'internal_mass',
|
|
1328
|
-
'Infiltration' => 'infil',
|
|
1329
|
-
'Natural Ventilation' => 'natvent',
|
|
1330
|
-
'Mechanical Ventilation' => 'mechvent',
|
|
1331
|
-
'Whole House Fan' => 'whf',
|
|
1332
|
-
'Ducts' => 'ducts',
|
|
1333
|
-
'Internal Gains' => 'intgains' }
|
|
1334
1329
|
end
|